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:
2022-10-27 20:58:43 +03:00
parent 609ff8e9c8
commit e46cfdc4bd
11 changed files with 51 additions and 18 deletions

View File

@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(PIP) project(PIP)
set(PIP_MAJOR 3) set(PIP_MAJOR 3)
set(PIP_MINOR 4) set(PIP_MINOR 4)
set(PIP_REVISION 0) set(PIP_REVISION 1)
set(PIP_SUFFIX ) set(PIP_SUFFIX )
set(PIP_COMPANY SHS) set(PIP_COMPANY SHS)
set(PIP_DOMAIN org.SHS) set(PIP_DOMAIN org.SHS)

View File

@@ -107,6 +107,7 @@ bool PICloudClient::closeDevice() {
ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) { ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
if (is_deleted) return -1; if (is_deleted) return -1;
//piCoutObj << "readDevice"; //piCoutObj << "readDevice";
reading_now = true;
if (!is_connected && eth.isClosed()) openDevice(); if (!is_connected && eth.isClosed()) openDevice();
ssize_t sz = -1; ssize_t sz = -1;
mutex_buff.lock(); mutex_buff.lock();
@@ -118,6 +119,7 @@ ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
} }
mutex_buff.unlock(); mutex_buff.unlock();
if (!is_connected) opened_ = false; if (!is_connected) opened_ = false;
reading_now = false;
//piCoutObj << "readDevice done" << sz; //piCoutObj << "readDevice done" << sz;
return sz; return sz;
} }

View File

@@ -90,8 +90,10 @@ bool PICloudServer::closeDevice() {
ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) { ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) {
//piCoutObj << "readDevice"; //piCoutObj << "readDevice";
reading_now = true;
if (!opened_) openDevice(); if (!opened_) openDevice();
else piMSleep(eth.readTimeout()); else piMSleep(eth.readTimeout());
reading_now = false;
return -1; return -1;
} }

View File

@@ -103,7 +103,9 @@ ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
//piCout << "PICAN read"; //piCout << "PICAN read";
can_frame frame; can_frame frame;
ssize_t ret = 0; ssize_t ret = 0;
reading_now = true;
ret = ::read(sock, &frame, sizeof(can_frame)); ret = ::read(sock, &frame, sizeof(can_frame));
reading_now = false;
if (ret < 0) {/*piCoutObj << "Error while read CAN frame " << ret;*/ return -1;} if (ret < 0) {/*piCoutObj << "Error while read CAN frame " << ret;*/ return -1;}
//piCoutObj << "receive CAN frame Id =" << frame.can_id; //piCoutObj << "receive CAN frame Id =" << frame.can_id;
memcpy(read_to, frame.data, piMini(frame.can_dlc, max_size)); memcpy(read_to, frame.data, piMini(frame.can_dlc, max_size));

View File

@@ -685,14 +685,18 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
// piCoutObj << "read from " << ip_ << ":" << port_; // piCoutObj << "read from " << ip_ << ":" << port_;
switch (type()) { switch (type()) {
case TCP_SingleTCP: case TCP_SingleTCP:
reading_now = true;
::listen(sock, 64); ::listen(sock, 64);
reading_now = false;
s = accept(sock, (sockaddr * )&client_addr, &slen); s = accept(sock, (sockaddr * )&client_addr, &slen);
if (s == -1) { if (s == -1) {
//piCoutObj << "Can`t accept new connection, " << ethErrorString(); //piCoutObj << "Can`t accept new connection, " << ethErrorString();
piMinSleep(); piMinSleep();
return -1; return -1;
} }
reading_now = true;
rs = ethRecv(s, read_to, max_size); rs = ethRecv(s, read_to, max_size);
reading_now = false;
closeSocket(s); closeSocket(s);
return rs; return rs;
case TCP_Client: 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_); PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
#endif #endif
//piCout << "connect to " << path() << "..."; //piCout << "connect to " << path() << "...";
reading_now = true;
connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0); connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0);
reading_now = false;
//piCout << "connect to " << path() << connected_; //piCout << "connect to " << path() << connected_;
if (!connected_) if (!connected_)
piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); 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; if (!connected_) return -1;
errorClear(); errorClear();
reading_now = true;
rs = ethRecv(sock, read_to, max_size); rs = ethRecv(sock, read_to, max_size);
reading_now = false;
//piCoutObj << "readed" << rs; //piCoutObj << "readed" << rs;
if (rs <= 0) { if (rs <= 0) {
lerr = ethErrorCore(); lerr = ethErrorCore();
@@ -757,7 +765,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
return rs; return rs;
case UDP: case UDP:
memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_)); memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_));
reading_now = true;
rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&PRIVATE->raddr_); rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&PRIVATE->raddr_);
reading_now = false;
if (rs > 0) { if (rs > 0) {
addr_lr.set(uint(PRIVATE->raddr_.sin_addr.s_addr), ntohs(PRIVATE->raddr_.sin_port)); addr_lr.set(uint(PRIVATE->raddr_.sin_addr.s_addr), ntohs(PRIVATE->raddr_.sin_port));
//piCoutObj << "read from" << ip_r << ":" << port_r << rs << "bytes"; //piCoutObj << "read from" << ip_r << ":" << port_r << rs << "bytes";

View File

@@ -439,7 +439,10 @@ PIByteArray PIFile::get() {
ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) { ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) {
if (!canRead() || PRIVATE->fd == 0) return -1; 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;
} }

View File

@@ -270,9 +270,7 @@ void PIIODevice::stop() {
ssize_t PIIODevice::read(void * read_to, ssize_t max_size) { ssize_t PIIODevice::read(void * read_to, ssize_t max_size) {
reading_now = true;
ssize_t ret = readDevice(read_to, max_size); ssize_t ret = readDevice(read_to, max_size);
reading_now = false;
return ret; return ret;
} }
@@ -285,9 +283,7 @@ ssize_t PIIODevice::read(PIMemoryBlock mb) {
PIByteArray PIIODevice::read(ssize_t max_size) { PIByteArray PIIODevice::read(ssize_t max_size) {
if (max_size <= 0) return PIByteArray(); if (max_size <= 0) return PIByteArray();
buffer_in.resize(max_size); buffer_in.resize(max_size);
reading_now = true;
ssize_t ret = readDevice(buffer_in.data(), max_size); ssize_t ret = readDevice(buffer_in.data(), max_size);
reading_now = false;
if (ret < 0) return PIByteArray(); if (ret < 0) return PIByteArray();
return buffer_in.resized(ret); return buffer_in.resized(ret);
} }

View File

@@ -536,6 +536,9 @@ protected:
ReadRetFunc func_read = nullptr; ReadRetFunc func_read = nullptr;
bool opened_ = false; bool opened_ = false;
void * ret_data_ = nullptr; void * ret_data_ = nullptr;
//! \~english Set this flag while blocking operations
//! \~russian Устанавливайте этот флаг во время блокирующих операций
std::atomic_bool reading_now; std::atomic_bool reading_now;
private: private:

View File

@@ -798,7 +798,9 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
if (sending) return -1; if (sending) return -1;
// piCoutObj << "com event ..."; // piCoutObj << "com event ...";
//piCoutObj << "read ..." << PRIVATE->hCom; //piCoutObj << "read ..." << PRIVATE->hCom;
reading_now = true;
ReadFile(PRIVATE->hCom, read_to, max_size, &PRIVATE->readed, 0); ReadFile(PRIVATE->hCom, read_to, max_size, &PRIVATE->readed, 0);
reading_now = false;
DWORD err = GetLastError(); DWORD err = GetLastError();
//piCout << err; //piCout << err;
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) { 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; return PRIVATE->readed;
#else #else
if (!canRead()) return -1; if (!canRead()) return -1;
reading_now = true;
ssize_t ret = ::read(fd, read_to, max_size); ssize_t ret = ::read(fd, read_to, max_size);
reading_now = false;
if (ret < 0) { if (ret < 0) {
int err = errno; int err = errno;
if (err == EBADF || err == EFAULT || err == EINVAL || err == EIO) { if (err == EBADF || err == EFAULT || err == EINVAL || err == EIO) {
PIThread::stop(false); softStopThreadedRead();
close(); close();
return 0; return 0;
} }

View File

@@ -322,15 +322,18 @@ bool PIUSB::closeDevice() {
ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) { ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
#ifdef PIP_USB #ifdef PIP_USB
if (isClosed() || ep_read.isNull()) return -1; if (isClosed() || ep_read.isNull()) return -1;
ssize_t ret = -1;
reading_now = true;
switch (ep_read.transfer_type) { switch (ep_read.transfer_type) {
case Endpoint::Bulk: case Endpoint::Bulk:
/*piCoutObj << "bulk read" << max_size;*/ /*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: 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; default: break;
} }
return -1; reading_now = false;
return ret;
#else #else
return -1; return -1;
#endif #endif

View File

@@ -298,16 +298,24 @@ void writeClassStreamMembersIn(PIIOTextStream & ts, const PICodeParser::Entity *
if (m.meta.contains("id")) if (m.meta.contains("id"))
cnt = m.meta.value("id").toInt(); cnt = m.meta.value("id").toInt();
if (m.dims.isEmpty()) { if (m.dims.isEmpty()) {
bool is_enum = parser.isEnum(m.type);
if (simple) { if (simple) {
ts << "\ts >> "; ts << "\t";
if (parser.isEnum(m.type)) if (is_enum) ts << "{int i; ";
ts << "(int&)"; ts << "s >> ";
ts << "v." << m.name << ";\n"; if (is_enum) ts << "i;";
else ts << "v." << m.name << ";";
if (is_enum) ts << " v." << m.name << " = (" << m.type << ")i;}";
ts << "\n";
} else { } else {
ts << "\t\tcase " << cnt << ": cs.get("; ts << "\t\tcase " << cnt << ":";
if (parser.isEnum(m.type)) if (is_enum) ts << " {int i;";
ts << "(int&)"; ts << " cs.get(";
ts << "v." << m.name << "); break;\n"; 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 { } else {
PIString ptype = m.type.left(m.type.find('[')).trim(); PIString ptype = m.type.left(m.type.find('[')).trim();