From a2670a441d8c6d546f8c8502024b3145ff442353 Mon Sep 17 00:00:00 2001 From: Jaro Date: Thu, 26 Aug 2021 11:18:04 +0200 Subject: [PATCH] Minor changes for YModemReceive with timers and signals --- TimeoutSerial.cpp | 10 +-- TimeoutSerial.h | 7 ++- YmodemFileReceive.cpp | 61 +++++++++++-------- YmodemFileReceive.h | 16 ++--- ...on => index-2021-08-26T09-17-06-0267.json} | 0 5 files changed, 53 insertions(+), 41 deletions(-) rename build/.cmake/api/v1/reply/{index-2021-08-24T22-34-28-0932.json => index-2021-08-26T09-17-06-0267.json} (100%) diff --git a/TimeoutSerial.cpp b/TimeoutSerial.cpp index d793cdf..405b061 100755 --- a/TimeoutSerial.cpp +++ b/TimeoutSerial.cpp @@ -73,9 +73,9 @@ void TimeoutSerial::setTimeout(const boost::posix_time::time_duration& t) timeout=t; } -void TimeoutSerial::write(const char *data, size_t size) +size_t TimeoutSerial::write(const char *data, size_t size) { - asio::write(port,asio::buffer(data,size)); + return asio::write(port,asio::buffer(data,size)); } void TimeoutSerial::write(const std::vector& data) @@ -88,7 +88,7 @@ void TimeoutSerial::writeString(const std::string& s) asio::write(port,asio::buffer(s.c_str(),s.size())); } -void TimeoutSerial::read(char *data, size_t size) +size_t TimeoutSerial::read(char *data, size_t size) { if(readData.size()>0)//If there is some data from a previous read { @@ -97,7 +97,7 @@ void TimeoutSerial::read(char *data, size_t size) is.read(data,toRead); data+=toRead; size-=toRead; - if(size==0) return;//If read data was enough, just return + if(size==0) return 0;//If read data was enough, just return } setupParameters=ReadSetupParameters(data,size); @@ -120,7 +120,7 @@ void TimeoutSerial::read(char *data, size_t size) { case resultSuccess: timer.cancel(); - return; + return this->bytesTransferred; case resultTimeoutExpired: port.cancel(); throw(timeout_exception("Timeout expired")); diff --git a/TimeoutSerial.h b/TimeoutSerial.h index 52b7264..598126a 100755 --- a/TimeoutSerial.h +++ b/TimeoutSerial.h @@ -101,7 +101,7 @@ public: * \param size array size * \throws boost::system::system_error if any error */ - void write(const char *data, size_t size); + size_t write(const char *data, size_t size); /** * Write data @@ -126,7 +126,7 @@ public: * \throws boost::system::system_error if any error * \throws timeout_exception in case of timeout */ - void read(char *data, size_t size); + size_t read(char *data, size_t size); /** * Read some data, blocking @@ -162,7 +162,7 @@ public: */ std::string readStringUntil(const std::string& delim="\n"); int readChar(int delay); - + void setRTS(bool enabled); void setDTR(bool enabled); @@ -227,6 +227,7 @@ private: boost::asio::io_service io; ///< Io service object boost::asio::serial_port port; ///< Serial port object boost::asio::deadline_timer timer; ///< Timer for timeout + boost::posix_time::time_duration timeout; ///< Read/write timeout boost::asio::streambuf readData; ///< Holds eventual read but not consumed enum ReadResult result; ///< Used by read with timeout diff --git a/YmodemFileReceive.cpp b/YmodemFileReceive.cpp index 8252fab..3c439dc 100644 --- a/YmodemFileReceive.cpp +++ b/YmodemFileReceive.cpp @@ -14,21 +14,22 @@ using namespace boost; #define WRITE_TIME_OUT (100) YmodemFileReceive::YmodemFileReceive() : + io(), readTimer(io), writeTimer(io) { setTimeDivide(499); setTimeMax(5); setErrorMax(999); - //connect(readTimer, SIGNAL(timeout()), this, SLOT(readTimeOut())); - //connect(writeTimer, SIGNAL(timeout()), this, SLOT(writeTimeOut())); + readTimer.async_wait(readTimeOut); + writeTimer.async_wait(writeTimeOut); } YmodemFileReceive::~YmodemFileReceive() { - delete file; - delete readTimer; - delete writeTimer; - delete serialPort; + // delete file; + // delete readTimer; + // delete writeTimer; + // delete serialPort; } void YmodemFileReceive::setFilePath(const string &path) @@ -51,13 +52,13 @@ bool YmodemFileReceive::startReceive() progress = 0; status = StatusEstablish; - serialPort->setTimeout(posix_time::seconds(10)); + serialPort->setTimeout(posix_time::seconds(0)); return true; } void YmodemFileReceive::stopReceive() { - file->close(); + file.close(); abort(); status = StatusAbort; } @@ -72,26 +73,27 @@ Ymodem::Status YmodemFileReceive::getReceiveStatus() return status; } -/* -void YmodemFileReceive::readTimeOut() + +void YmodemFileReceive::readTimeOut(const boost::system::error_code& e) { - readTimer->stop(); + readTimer.cancel(); receive(); if((status == StatusEstablish) || (status == StatusTransmit)) { - readTimer->start(READ_TIME_OUT); + readTimer.expires_from_now(boost::posix_time::millisec(READ_TIME_OUT)); + readTimer.async_wait(readTimeOut); } } -void YmodemFileReceive::writeTimeOut() +void YmodemFileReceive::writeTimeOut(const boost::system::error_code& e) { - writeTimer->stop(); + writeTimer.cancel(); serialPort->close(); receiveStatus(status); } -*/ + Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t *len) { switch(status) @@ -136,7 +138,8 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t { YmodemFileReceive::status = StatusError; - writeTimer->start(WRITE_TIME_OUT); + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeCan; } @@ -145,7 +148,8 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t { YmodemFileReceive::status = StatusError; - writeTimer->start(WRITE_TIME_OUT); + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeCan; } @@ -155,13 +159,13 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t { if((fileSize - fileCount) > *len) { - file->write((char *)buff, *len); + file.write((char *)buff, *len); fileCount += *len; } else { - file->write((char *)buff, fileSize - fileCount); + file.write((char *)buff, fileSize - fileCount); fileCount += fileSize - fileCount; } @@ -178,22 +182,25 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t case StatusFinish: { - file->close(); + file.close(); YmodemFileReceive::status = StatusFinish; - writeTimer->start(WRITE_TIME_OUT); + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeAck; } case StatusAbort: { - file->close(); + file.close(); YmodemFileReceive::status = StatusAbort; - writeTimer->start(WRITE_TIME_OUT); + + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeCan; } @@ -202,18 +209,20 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t { YmodemFileReceive::status = StatusTimeout; - writeTimer->start(WRITE_TIME_OUT); + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeCan; } default: { - file->close(); + file.close(); YmodemFileReceive::status = StatusError; - writeTimer->start(WRITE_TIME_OUT); + writeTimer.expires_from_now(boost::posix_time::millisec(WRITE_TIME_OUT)); + writeTimer.async_wait(writeTimeOut); return CodeCan; } diff --git a/YmodemFileReceive.h b/YmodemFileReceive.h index f216dcb..8c7d656 100644 --- a/YmodemFileReceive.h +++ b/YmodemFileReceive.h @@ -4,6 +4,8 @@ #include "TimeoutSerial.h" #include "Ymodem.h" #include +#include +#include #include #include #include @@ -30,11 +32,10 @@ public: boost::signals2::signal receiveProgress; boost::signals2::signal receiveStatus; -/* -private slots: - void readTimeOut(); - void writeTimeOut(); -*/ + + void readTimeOut(const boost::system::error_code& e); + void writeTimeOut(const boost::system::error_code& e); + private: Code callback(Status status, uint8_t *buff, uint32_t *len); @@ -42,8 +43,9 @@ private: uint32_t write(uint8_t *buff, uint32_t len); ofstream file; - QTimer *readTimer; - QTimer *writeTimer; + boost::asio::io_service io; ///< Io service object + boost::asio::deadline_timer readTimer; ///< Timer for timeout + boost::asio::deadline_timer writeTimer; ///< Timer for timeout TimeoutSerial *serialPort; int progress; diff --git a/build/.cmake/api/v1/reply/index-2021-08-24T22-34-28-0932.json b/build/.cmake/api/v1/reply/index-2021-08-26T09-17-06-0267.json similarity index 100% rename from build/.cmake/api/v1/reply/index-2021-08-24T22-34-28-0932.json rename to build/.cmake/api/v1/reply/index-2021-08-26T09-17-06-0267.json