From e46cfdc4bd10bd7648ec27cee74cff5837e781ca Mon Sep 17 00:00:00 2001 From: peri4 Date: Thu, 27 Oct 2022 20:58:43 +0300 Subject: [PATCH] more precise using PIIODevice::reading_now flag, Warning! one should use it manually now small enum fix for pip_cmg --- CMakeLists.txt | 2 +- libs/cloud/picloudclient.cpp | 2 ++ libs/cloud/picloudserver.cpp | 2 ++ libs/main/io_devices/pican.cpp | 2 ++ libs/main/io_devices/piethernet.cpp | 10 ++++++++++ libs/main/io_devices/pifile.cpp | 5 ++++- libs/main/io_devices/piiodevice.cpp | 4 ---- libs/main/io_devices/piiodevice.h | 3 +++ libs/main/io_devices/piserial.cpp | 6 +++++- libs/usb/piusb.cpp | 9 ++++++--- utils/code_model_generator/main.cpp | 24 ++++++++++++++++-------- 11 files changed, 51 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb832128..697dcaf5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/libs/cloud/picloudclient.cpp b/libs/cloud/picloudclient.cpp index df32517f..a3388719 100644 --- a/libs/cloud/picloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -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; } diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index bb761dad..b3e61e79 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -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; } diff --git a/libs/main/io_devices/pican.cpp b/libs/main/io_devices/pican.cpp index 4bdbb260..66381091 100644 --- a/libs/main/io_devices/pican.cpp +++ b/libs/main/io_devices/pican.cpp @@ -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)); diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index 060c52d5..3ad67450 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -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"; diff --git a/libs/main/io_devices/pifile.cpp b/libs/main/io_devices/pifile.cpp index 3e246ffa..69bd4c44 100644 --- a/libs/main/io_devices/pifile.cpp +++ b/libs/main/io_devices/pifile.cpp @@ -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; } diff --git a/libs/main/io_devices/piiodevice.cpp b/libs/main/io_devices/piiodevice.cpp index 32ff817f..c132b702 100644 --- a/libs/main/io_devices/piiodevice.cpp +++ b/libs/main/io_devices/piiodevice.cpp @@ -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); } diff --git a/libs/main/io_devices/piiodevice.h b/libs/main/io_devices/piiodevice.h index 0102af80..b3af0987 100644 --- a/libs/main/io_devices/piiodevice.h +++ b/libs/main/io_devices/piiodevice.h @@ -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: diff --git a/libs/main/io_devices/piserial.cpp b/libs/main/io_devices/piserial.cpp index d4b8d38d..d781d52a 100644 --- a/libs/main/io_devices/piserial.cpp +++ b/libs/main/io_devices/piserial.cpp @@ -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; } diff --git a/libs/usb/piusb.cpp b/libs/usb/piusb.cpp index 9aa911ff..30618f27 100644 --- a/libs/usb/piusb.cpp +++ b/libs/usb/piusb.cpp @@ -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 diff --git a/utils/code_model_generator/main.cpp b/utils/code_model_generator/main.cpp index b064ee59..fd9444f2 100755 --- a/utils/code_model_generator/main.cpp +++ b/utils/code_model_generator/main.cpp @@ -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();