Minor changes for YModemReceive with timers and signals

This commit is contained in:
2021-08-26 11:18:04 +02:00
parent bc701ae833
commit a2670a441d
5 changed files with 53 additions and 41 deletions

View File

@@ -73,9 +73,9 @@ void TimeoutSerial::setTimeout(const boost::posix_time::time_duration& t)
timeout=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<char>& data) void TimeoutSerial::write(const std::vector<char>& data)
@@ -88,7 +88,7 @@ void TimeoutSerial::writeString(const std::string& s)
asio::write(port,asio::buffer(s.c_str(),s.size())); 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 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); is.read(data,toRead);
data+=toRead; data+=toRead;
size-=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); setupParameters=ReadSetupParameters(data,size);
@@ -120,7 +120,7 @@ void TimeoutSerial::read(char *data, size_t size)
{ {
case resultSuccess: case resultSuccess:
timer.cancel(); timer.cancel();
return; return this->bytesTransferred;
case resultTimeoutExpired: case resultTimeoutExpired:
port.cancel(); port.cancel();
throw(timeout_exception("Timeout expired")); throw(timeout_exception("Timeout expired"));

View File

@@ -101,7 +101,7 @@ public:
* \param size array size * \param size array size
* \throws boost::system::system_error if any error * \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 * Write data
@@ -126,7 +126,7 @@ public:
* \throws boost::system::system_error if any error * \throws boost::system::system_error if any error
* \throws timeout_exception in case of timeout * \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 * Read some data, blocking
@@ -162,7 +162,7 @@ public:
*/ */
std::string readStringUntil(const std::string& delim="\n"); std::string readStringUntil(const std::string& delim="\n");
int readChar(int delay); int readChar(int delay);
void setRTS(bool enabled); void setRTS(bool enabled);
void setDTR(bool enabled); void setDTR(bool enabled);
@@ -227,6 +227,7 @@ private:
boost::asio::io_service io; ///< Io service object boost::asio::io_service io; ///< Io service object
boost::asio::serial_port port; ///< Serial port object boost::asio::serial_port port; ///< Serial port object
boost::asio::deadline_timer timer; ///< Timer for timeout boost::asio::deadline_timer timer; ///< Timer for timeout
boost::posix_time::time_duration timeout; ///< Read/write timeout boost::posix_time::time_duration timeout; ///< Read/write timeout
boost::asio::streambuf readData; ///< Holds eventual read but not consumed boost::asio::streambuf readData; ///< Holds eventual read but not consumed
enum ReadResult result; ///< Used by read with timeout enum ReadResult result; ///< Used by read with timeout

View File

@@ -14,21 +14,22 @@ using namespace boost;
#define WRITE_TIME_OUT (100) #define WRITE_TIME_OUT (100)
YmodemFileReceive::YmodemFileReceive() : YmodemFileReceive::YmodemFileReceive() :
io(), readTimer(io), writeTimer(io)
{ {
setTimeDivide(499); setTimeDivide(499);
setTimeMax(5); setTimeMax(5);
setErrorMax(999); setErrorMax(999);
//connect(readTimer, SIGNAL(timeout()), this, SLOT(readTimeOut())); readTimer.async_wait(readTimeOut);
//connect(writeTimer, SIGNAL(timeout()), this, SLOT(writeTimeOut())); writeTimer.async_wait(writeTimeOut);
} }
YmodemFileReceive::~YmodemFileReceive() YmodemFileReceive::~YmodemFileReceive()
{ {
delete file; // delete file;
delete readTimer; // delete readTimer;
delete writeTimer; // delete writeTimer;
delete serialPort; // delete serialPort;
} }
void YmodemFileReceive::setFilePath(const string &path) void YmodemFileReceive::setFilePath(const string &path)
@@ -51,13 +52,13 @@ bool YmodemFileReceive::startReceive()
progress = 0; progress = 0;
status = StatusEstablish; status = StatusEstablish;
serialPort->setTimeout(posix_time::seconds(10)); serialPort->setTimeout(posix_time::seconds(0));
return true; return true;
} }
void YmodemFileReceive::stopReceive() void YmodemFileReceive::stopReceive()
{ {
file->close(); file.close();
abort(); abort();
status = StatusAbort; status = StatusAbort;
} }
@@ -72,26 +73,27 @@ Ymodem::Status YmodemFileReceive::getReceiveStatus()
return status; return status;
} }
/*
void YmodemFileReceive::readTimeOut() void YmodemFileReceive::readTimeOut(const boost::system::error_code& e)
{ {
readTimer->stop(); readTimer.cancel();
receive(); receive();
if((status == StatusEstablish) || (status == StatusTransmit)) 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(); serialPort->close();
receiveStatus(status); receiveStatus(status);
} }
*/
Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t *len) Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t *len)
{ {
switch(status) switch(status)
@@ -136,7 +138,8 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t
{ {
YmodemFileReceive::status = StatusError; 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; return CodeCan;
} }
@@ -145,7 +148,8 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t
{ {
YmodemFileReceive::status = StatusError; 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; return CodeCan;
} }
@@ -155,13 +159,13 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t
{ {
if((fileSize - fileCount) > *len) if((fileSize - fileCount) > *len)
{ {
file->write((char *)buff, *len); file.write((char *)buff, *len);
fileCount += *len; fileCount += *len;
} }
else else
{ {
file->write((char *)buff, fileSize - fileCount); file.write((char *)buff, fileSize - fileCount);
fileCount += fileSize - fileCount; fileCount += fileSize - fileCount;
} }
@@ -178,22 +182,25 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t
case StatusFinish: case StatusFinish:
{ {
file->close(); file.close();
YmodemFileReceive::status = StatusFinish; 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; return CodeAck;
} }
case StatusAbort: case StatusAbort:
{ {
file->close(); file.close();
YmodemFileReceive::status = StatusAbort; 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; return CodeCan;
} }
@@ -202,18 +209,20 @@ Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t
{ {
YmodemFileReceive::status = StatusTimeout; 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; return CodeCan;
} }
default: default:
{ {
file->close(); file.close();
YmodemFileReceive::status = StatusError; 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; return CodeCan;
} }

View File

@@ -4,6 +4,8 @@
#include "TimeoutSerial.h" #include "TimeoutSerial.h"
#include "Ymodem.h" #include "Ymodem.h"
#include <boost/signals2.hpp> #include <boost/signals2.hpp>
#include <boost/utility.hpp>
#include <boost/asio.hpp>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <string> #include <string>
@@ -30,11 +32,10 @@ public:
boost::signals2::signal<void (int)> receiveProgress; boost::signals2::signal<void (int)> receiveProgress;
boost::signals2::signal<void (YmodemFileReceive::Status status)> receiveStatus; boost::signals2::signal<void (YmodemFileReceive::Status status)> receiveStatus;
/*
private slots: void readTimeOut(const boost::system::error_code& e);
void readTimeOut(); void writeTimeOut(const boost::system::error_code& e);
void writeTimeOut();
*/
private: private:
Code callback(Status status, uint8_t *buff, uint32_t *len); Code callback(Status status, uint8_t *buff, uint32_t *len);
@@ -42,8 +43,9 @@ private:
uint32_t write(uint8_t *buff, uint32_t len); uint32_t write(uint8_t *buff, uint32_t len);
ofstream file; ofstream file;
QTimer *readTimer; boost::asio::io_service io; ///< Io service object
QTimer *writeTimer; boost::asio::deadline_timer readTimer; ///< Timer for timeout
boost::asio::deadline_timer writeTimer; ///< Timer for timeout
TimeoutSerial *serialPort; TimeoutSerial *serialPort;
int progress; int progress;