more precise using PIIODevice::reading_now flag, Warning! one should use it manually now
small enum fix for pip_cmg
This commit is contained in:
@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
||||
project(PIP)
|
||||
set(PIP_MAJOR 3)
|
||||
set(PIP_MINOR 4)
|
||||
set(PIP_REVISION 0)
|
||||
set(PIP_REVISION 1)
|
||||
set(PIP_SUFFIX )
|
||||
set(PIP_COMPANY SHS)
|
||||
set(PIP_DOMAIN org.SHS)
|
||||
|
||||
@@ -107,6 +107,7 @@ bool PICloudClient::closeDevice() {
|
||||
ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (is_deleted) return -1;
|
||||
//piCoutObj << "readDevice";
|
||||
reading_now = true;
|
||||
if (!is_connected && eth.isClosed()) openDevice();
|
||||
ssize_t sz = -1;
|
||||
mutex_buff.lock();
|
||||
@@ -118,6 +119,7 @@ ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
|
||||
}
|
||||
mutex_buff.unlock();
|
||||
if (!is_connected) opened_ = false;
|
||||
reading_now = false;
|
||||
//piCoutObj << "readDevice done" << sz;
|
||||
return sz;
|
||||
}
|
||||
|
||||
@@ -90,8 +90,10 @@ bool PICloudServer::closeDevice() {
|
||||
|
||||
ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) {
|
||||
//piCoutObj << "readDevice";
|
||||
reading_now = true;
|
||||
if (!opened_) openDevice();
|
||||
else piMSleep(eth.readTimeout());
|
||||
reading_now = false;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,9 @@ ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
|
||||
//piCout << "PICAN read";
|
||||
can_frame frame;
|
||||
ssize_t ret = 0;
|
||||
reading_now = true;
|
||||
ret = ::read(sock, &frame, sizeof(can_frame));
|
||||
reading_now = false;
|
||||
if (ret < 0) {/*piCoutObj << "Error while read CAN frame " << ret;*/ return -1;}
|
||||
//piCoutObj << "receive CAN frame Id =" << frame.can_id;
|
||||
memcpy(read_to, frame.data, piMini(frame.can_dlc, max_size));
|
||||
|
||||
@@ -685,14 +685,18 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
||||
// piCoutObj << "read from " << ip_ << ":" << port_;
|
||||
switch (type()) {
|
||||
case TCP_SingleTCP:
|
||||
reading_now = true;
|
||||
::listen(sock, 64);
|
||||
reading_now = false;
|
||||
s = accept(sock, (sockaddr * )&client_addr, &slen);
|
||||
if (s == -1) {
|
||||
//piCoutObj << "Can`t accept new connection, " << ethErrorString();
|
||||
piMinSleep();
|
||||
return -1;
|
||||
}
|
||||
reading_now = true;
|
||||
rs = ethRecv(s, read_to, max_size);
|
||||
reading_now = false;
|
||||
closeSocket(s);
|
||||
return rs;
|
||||
case TCP_Client:
|
||||
@@ -714,7 +718,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||
#endif
|
||||
//piCout << "connect to " << path() << "...";
|
||||
reading_now = true;
|
||||
connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0);
|
||||
reading_now = false;
|
||||
//piCout << "connect to " << path() << connected_;
|
||||
if (!connected_)
|
||||
piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString();
|
||||
@@ -728,7 +734,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
||||
}
|
||||
if (!connected_) return -1;
|
||||
errorClear();
|
||||
reading_now = true;
|
||||
rs = ethRecv(sock, read_to, max_size);
|
||||
reading_now = false;
|
||||
//piCoutObj << "readed" << rs;
|
||||
if (rs <= 0) {
|
||||
lerr = ethErrorCore();
|
||||
@@ -757,7 +765,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
||||
return rs;
|
||||
case UDP:
|
||||
memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_));
|
||||
reading_now = true;
|
||||
rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&PRIVATE->raddr_);
|
||||
reading_now = false;
|
||||
if (rs > 0) {
|
||||
addr_lr.set(uint(PRIVATE->raddr_.sin_addr.s_addr), ntohs(PRIVATE->raddr_.sin_port));
|
||||
//piCoutObj << "read from" << ip_r << ":" << port_r << rs << "bytes";
|
||||
|
||||
@@ -439,7 +439,10 @@ PIByteArray PIFile::get() {
|
||||
|
||||
ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (!canRead() || PRIVATE->fd == 0) return -1;
|
||||
return fread(read_to, 1, max_size, PRIVATE->fd);
|
||||
reading_now = true;
|
||||
ssize_t ret = fread(read_to, 1, max_size, PRIVATE->fd);
|
||||
reading_now = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -270,9 +270,7 @@ void PIIODevice::stop() {
|
||||
|
||||
|
||||
ssize_t PIIODevice::read(void * read_to, ssize_t max_size) {
|
||||
reading_now = true;
|
||||
ssize_t ret = readDevice(read_to, max_size);
|
||||
reading_now = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -285,9 +283,7 @@ ssize_t PIIODevice::read(PIMemoryBlock mb) {
|
||||
PIByteArray PIIODevice::read(ssize_t max_size) {
|
||||
if (max_size <= 0) return PIByteArray();
|
||||
buffer_in.resize(max_size);
|
||||
reading_now = true;
|
||||
ssize_t ret = readDevice(buffer_in.data(), max_size);
|
||||
reading_now = false;
|
||||
if (ret < 0) return PIByteArray();
|
||||
return buffer_in.resized(ret);
|
||||
}
|
||||
|
||||
@@ -536,6 +536,9 @@ protected:
|
||||
ReadRetFunc func_read = nullptr;
|
||||
bool opened_ = false;
|
||||
void * ret_data_ = nullptr;
|
||||
|
||||
//! \~english Set this flag while blocking operations
|
||||
//! \~russian Устанавливайте этот флаг во время блокирующих операций
|
||||
std::atomic_bool reading_now;
|
||||
|
||||
private:
|
||||
|
||||
@@ -798,7 +798,9 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (sending) return -1;
|
||||
// piCoutObj << "com event ...";
|
||||
//piCoutObj << "read ..." << PRIVATE->hCom;
|
||||
reading_now = true;
|
||||
ReadFile(PRIVATE->hCom, read_to, max_size, &PRIVATE->readed, 0);
|
||||
reading_now = false;
|
||||
DWORD err = GetLastError();
|
||||
//piCout << err;
|
||||
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) {
|
||||
@@ -810,11 +812,13 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
|
||||
return PRIVATE->readed;
|
||||
#else
|
||||
if (!canRead()) return -1;
|
||||
reading_now = true;
|
||||
ssize_t ret = ::read(fd, read_to, max_size);
|
||||
reading_now = false;
|
||||
if (ret < 0) {
|
||||
int err = errno;
|
||||
if (err == EBADF || err == EFAULT || err == EINVAL || err == EIO) {
|
||||
PIThread::stop(false);
|
||||
softStopThreadedRead();
|
||||
close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -322,15 +322,18 @@ bool PIUSB::closeDevice() {
|
||||
ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
|
||||
#ifdef PIP_USB
|
||||
if (isClosed() || ep_read.isNull()) return -1;
|
||||
ssize_t ret = -1;
|
||||
reading_now = true;
|
||||
switch (ep_read.transfer_type) {
|
||||
case Endpoint::Bulk:
|
||||
/*piCoutObj << "bulk read" << max_size;*/
|
||||
return usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||
ret = usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||
case Endpoint::Interrupt:
|
||||
return usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||
ret = usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||
default: break;
|
||||
}
|
||||
return -1;
|
||||
reading_now = false;
|
||||
return ret;
|
||||
#else
|
||||
return -1;
|
||||
#endif
|
||||
|
||||
@@ -298,16 +298,24 @@ void writeClassStreamMembersIn(PIIOTextStream & ts, const PICodeParser::Entity *
|
||||
if (m.meta.contains("id"))
|
||||
cnt = m.meta.value("id").toInt();
|
||||
if (m.dims.isEmpty()) {
|
||||
bool is_enum = parser.isEnum(m.type);
|
||||
if (simple) {
|
||||
ts << "\ts >> ";
|
||||
if (parser.isEnum(m.type))
|
||||
ts << "(int&)";
|
||||
ts << "v." << m.name << ";\n";
|
||||
ts << "\t";
|
||||
if (is_enum) ts << "{int i; ";
|
||||
ts << "s >> ";
|
||||
if (is_enum) ts << "i;";
|
||||
else ts << "v." << m.name << ";";
|
||||
if (is_enum) ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
ts << "\n";
|
||||
} else {
|
||||
ts << "\t\tcase " << cnt << ": cs.get(";
|
||||
if (parser.isEnum(m.type))
|
||||
ts << "(int&)";
|
||||
ts << "v." << m.name << "); break;\n";
|
||||
ts << "\t\tcase " << cnt << ":";
|
||||
if (is_enum) ts << " {int i;";
|
||||
ts << " cs.get(";
|
||||
if (is_enum) ts << "i";
|
||||
else ts << "v." << m.name;
|
||||
ts << ");";
|
||||
if (is_enum) ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||
ts << " break;\n";
|
||||
}
|
||||
} else {
|
||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||
|
||||
Reference in New Issue
Block a user