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

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