Minor changes for YModemReceive with timers and signals
This commit is contained in:
@@ -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"));
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user