From d3166f8fa56cbe2cde56b0432cf7abc393290cba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=8B=D1=87=D0=BA=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Wed, 23 Nov 2016 07:23:37 +0000 Subject: [PATCH] PISerial now can configure blocking write and blocking read options from path git-svn-id: svn://db.shs.com.ru/pip@281 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src/io/piserial.cpp | 46 ++++++++++++++++++++++++++++++++++++--------- src/io/piserial.h | 13 ++++++++----- src/piversion.h | 4 ++-- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/src/io/piserial.cpp b/src/io/piserial.cpp index f94d60d0..13f4ab5c 100755 --- a/src/io/piserial.cpp +++ b/src/io/piserial.cpp @@ -612,6 +612,11 @@ void PISerial::setReadIsBlocking(bool yes) { if (isOpened()) setTimeouts(); } +void PISerial::setWriteIsBlocking(bool yes) { + block_write = yes; + if (isOpened()) setTimeouts(); +} + /** \brief Basic read function * \details Read to pointer "read_to" no more than "max_size". If read is @@ -635,18 +640,18 @@ int PISerial::read(void * read_to, int max_size) { } -int PISerial::write(const void * data, int max_size, bool wait) { +int PISerial::write(const void * data, int max_size) { if (fd == -1 || !canWrite()) { //piCoutObj << "Can`t write to uninitialized COM"; return -1; } #ifdef WINDOWS - if (block_write != wait) { - block_write = wait; +// if (block_write != wait) { +// block_write = wait; // piCoutObj << "set timeout ..."; - setReadIsBlocking(block_read); +// setReadIsBlocking(block_read); // piCoutObj << "set timeout ok"; - } +// } DWORD wrote; // piCoutObj << "send ...";// << max_size;// << ": " << PIString((char*)data, max_size); sending = true; @@ -656,7 +661,7 @@ int PISerial::write(const void * data, int max_size, bool wait) { #else int wrote; wrote = ::write(fd, data, max_size); - if (wait) tcdrain(fd); + if (block_write) tcdrain(fd); #endif return (int)wrote; //piCoutObj << "Error while sending"; @@ -685,6 +690,9 @@ PIString PISerial::constructFullPath() const { } else ret << ":N"; if (parameters()[TwoStopBits]) ret << ":2"; else ret << ":1"; + ret << ":block"; + if (block_read) ret << "R"; + if (block_write) ret << "W"; return ret; } @@ -694,17 +702,37 @@ void PISerial::configureFromFullPath(const PIString & full_path) { for (int i = 0; i < pl.size_s(); ++i) { PIString p(pl[i]); switch (i) { - case 0: setPath(p); break; - case 1: setSpeed((Speed)(p.toInt())); break; - case 2: setDataBitsCount(p.toInt()); break; + case 0: setProperty(PIStringAscii("path"), p); break; + case 1: setProperty("outSpeed", p.toInt()); setProperty("inSpeed", p.toInt()); break; + case 2: setProperty("dataBitsCount", p.toInt()); break; case 3: p = p.toLowerCase(); if (p != "n") setParameter(ParityControl); if (p == "o") setParameter(ParityOdd); break; case 4: if (p.toInt() == 2) setParameter(TwoStopBits); break; + case 5: + p = p.toLowerCase(); + PIString bs = "block"; + if (bs == p.mid(0, bs.length())) { + block_write = false; + block_read = false; + p = p.mid(bs.length()); + if (p == "r") { + block_read = true; + } + if (p == "w") { + block_write = true; + } + if (p == "rw" || p == "wr") { + block_read = true; + block_write = true; + } + } + break; } } + applySettings(); } diff --git a/src/io/piserial.h b/src/io/piserial.h index 37cb2841..eb8a7c03 100755 --- a/src/io/piserial.h +++ b/src/io/piserial.h @@ -139,9 +139,12 @@ public: void setVTime(int t) {vtime = t; applySettings();} - //! Set read is blocking for function read(void * read_to, int max_size) + //! Set read is blocking for function \a read void setReadIsBlocking(bool yes); + //! Set write is blocking for functions \a write and \a send + void setWriteIsBlocking(bool yes); + //! Returns device name PIString device() const {return path();} @@ -167,11 +170,11 @@ public: //! \brief Write to device data "data" with maximum size "max_size" and wait for data written if "wait" is \b true. //! \returns sended bytes count - int write(const void * data, int max_size, bool wait = false); + int write(const void * data, int max_size); //! \brief Write to device data "data" with maximum size "size" and wait for data written if "wait" is \b true. //! \returns \b true if sended bytes count = "size" - bool send(const void * data, int size, bool wait = false) {return (write(data, size, wait) == size);} + bool send(const void * data, int size) {return (write(data, size) == size);} /// NOTE: no reason to use this function, use PIString::toUtf8() or PIString::dataAscii(),lengthAscii() instead // //! \brief Write to device string "data" and wait for data written if "wait" is \b true. @@ -180,7 +183,7 @@ public: //! \brief Write to device byte array "data" and wait for data written if "wait" is \b true. //! \returns \b true if sended bytes count = size of string - bool send(const PIByteArray & data, bool wait = false) {return (write(data.data(), data.size_s(), wait) == data.size_s());} + bool send(const PIByteArray & data) {return (write(data.data(), data.size_s()) == data.size_s());} PIString constructFullPath() const; @@ -218,7 +221,7 @@ protected: PIString fullPathPrefix() const {return "ser";} void configureFromFullPath(const PIString & full_path); bool configureDevice(const void * e_main, const void * e_parent = 0); - int write(const void * data, int max_size) {return write(data, max_size, true);} +// int write(const void * data, int max_size) {return write(data, max_size);} //! Executes when any read function was successful. Default implementation does nothing virtual void received(const void * data, int size) {;} diff --git a/src/piversion.h b/src/piversion.h index 0563d59f..18535a93 100644 --- a/src/piversion.h +++ b/src/piversion.h @@ -3,8 +3,8 @@ #define PIVERSION_H #define PIP_VERSION_MAJOR 0 -#define PIP_VERSION_MINOR 5 -#define PIP_VERSION_REVISION 7 +#define PIP_VERSION_MINOR 6 +#define PIP_VERSION_REVISION 0 #define PIP_VERSION_SUFFIX "" #endif // PIVERSION_H