From a745f803b34a64a70fe1abd228c03812217276f7 Mon Sep 17 00:00:00 2001 From: peri4 Date: Wed, 10 Apr 2024 20:49:27 +0300 Subject: [PATCH] version 3.17.1 add PINonTriviallyCopyable struct add PISerial check for error on Windows on every read() --- CMakeLists.txt | 2 +- libs/main/core/pibase.h | 14 ++++++++++++++ libs/main/io_devices/piserial.cpp | 10 ++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 225a8279..b8cff99f 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 17) -set(PIP_REVISION 0) +set(PIP_REVISION 1) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) set(PIP_DOMAIN org.SHS) diff --git a/libs/main/core/pibase.h b/libs/main/core/pibase.h index 9a41ff7a..c2e94594 100644 --- a/libs/main/core/pibase.h +++ b/libs/main/core/pibase.h @@ -668,4 +668,18 @@ private: }; +//! \~\brief +//! \~english Inherit from this class to make your class non-trivially copyable. +//! \~russian Наследуйтесь от этого класса чтобы сделать свой класс нетривиально копируемым. +struct PIP_EXPORT PINonTriviallyCopyable { + PINonTriviallyCopyable() noexcept = default; + PINonTriviallyCopyable(const PINonTriviallyCopyable &) noexcept = default; + PINonTriviallyCopyable(PINonTriviallyCopyable &&) noexcept; + PINonTriviallyCopyable & operator=(const PINonTriviallyCopyable &) noexcept = default; + PINonTriviallyCopyable & operator=(PINonTriviallyCopyable &&) noexcept = default; + ~PINonTriviallyCopyable() = default; +}; +inline PINonTriviallyCopyable::PINonTriviallyCopyable(PINonTriviallyCopyable &&) noexcept = default; + + #endif // PIBASE_H diff --git a/libs/main/io_devices/piserial.cpp b/libs/main/io_devices/piserial.cpp index cee0b931..694d0649 100644 --- a/libs/main/io_devices/piserial.cpp +++ b/libs/main/io_devices/piserial.cpp @@ -868,6 +868,13 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) { if (!canRead()) return -1; if (sending) return -1; // piCoutObj << "read ..." << PRIVATE->hCom << max_size; + DWORD mask = 0; + if (GetCommMask(PRIVATE->hCom, &mask) == FALSE) { + piCoutObj << "read error" << errorString(); + stop(); + close(); + return 0; + } memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap)); PRIVATE->overlap.hEvent = PRIVATE->event.getEvent(); PRIVATE->readed = 0; @@ -885,8 +892,7 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) { GetOverlappedResult(PRIVATE->hCom, &(PRIVATE->overlap), &(PRIVATE->readed), FALSE); } else return -1; - // piCoutObj << "read done" << PRIVATE->readed; - // piCoutObj << "read" << (PRIVATE->readed) << errorString(); + // piCoutObj << "read" << (PRIVATE->readed) << errorString(); return PRIVATE->readed; #else if (!canRead()) return -1;