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;
}
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)
@@ -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"));

View File

@@ -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

View File

@@ -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;
}

View File

@@ -4,6 +4,8 @@
#include "TimeoutSerial.h"
#include "Ymodem.h"
#include <boost/signals2.hpp>
#include <boost/utility.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include <fstream>
#include <string>
@@ -30,11 +32,10 @@ public:
boost::signals2::signal<void (int)> receiveProgress;
boost::signals2::signal<void (YmodemFileReceive::Status status)> 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;