QT port
This commit is contained in:
231
YmodemFileReceive.cpp
Normal file
231
YmodemFileReceive.cpp
Normal file
@@ -0,0 +1,231 @@
|
||||
#include "YmodemFileReceive.h"
|
||||
#include <iostream>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
#include <boost/thread/thread.hpp>
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include <boost/algorithm/string/split.hpp>
|
||||
#include "TimeoutSerial.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
#define READ_TIME_OUT (10)
|
||||
#define WRITE_TIME_OUT (100)
|
||||
|
||||
YmodemFileReceive::YmodemFileReceive() :
|
||||
{
|
||||
setTimeDivide(499);
|
||||
setTimeMax(5);
|
||||
setErrorMax(999);
|
||||
|
||||
//connect(readTimer, SIGNAL(timeout()), this, SLOT(readTimeOut()));
|
||||
//connect(writeTimer, SIGNAL(timeout()), this, SLOT(writeTimeOut()));
|
||||
}
|
||||
|
||||
YmodemFileReceive::~YmodemFileReceive()
|
||||
{
|
||||
delete file;
|
||||
delete readTimer;
|
||||
delete writeTimer;
|
||||
delete serialPort;
|
||||
}
|
||||
|
||||
void YmodemFileReceive::setFilePath(const string &path)
|
||||
{
|
||||
filePath = path + "/";
|
||||
}
|
||||
|
||||
void YmodemFileReceive::setSerialPort(TimeoutSerial *port)
|
||||
{
|
||||
serialPort = port;
|
||||
}
|
||||
|
||||
TimeoutSerial *YmodemFileReceive::getSerialPort()
|
||||
{
|
||||
return serialPort;
|
||||
}
|
||||
|
||||
bool YmodemFileReceive::startReceive()
|
||||
{
|
||||
progress = 0;
|
||||
status = StatusEstablish;
|
||||
|
||||
serialPort->setTimeout(posix_time::seconds(10));
|
||||
return true;
|
||||
}
|
||||
|
||||
void YmodemFileReceive::stopReceive()
|
||||
{
|
||||
file->close();
|
||||
abort();
|
||||
status = StatusAbort;
|
||||
}
|
||||
|
||||
int YmodemFileReceive::getReceiveProgress()
|
||||
{
|
||||
return progress;
|
||||
}
|
||||
|
||||
Ymodem::Status YmodemFileReceive::getReceiveStatus()
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
void YmodemFileReceive::readTimeOut()
|
||||
{
|
||||
readTimer->stop();
|
||||
|
||||
receive();
|
||||
|
||||
if((status == StatusEstablish) || (status == StatusTransmit))
|
||||
{
|
||||
readTimer->start(READ_TIME_OUT);
|
||||
}
|
||||
}
|
||||
|
||||
void YmodemFileReceive::writeTimeOut()
|
||||
{
|
||||
writeTimer->stop();
|
||||
serialPort->close();
|
||||
receiveStatus(status);
|
||||
}
|
||||
*/
|
||||
Ymodem::Code YmodemFileReceive::callback(Status status, uint8_t *buff, uint32_t *len)
|
||||
{
|
||||
switch(status)
|
||||
{
|
||||
case StatusEstablish:
|
||||
{
|
||||
if(buff[0] != 0)
|
||||
{
|
||||
int i = 0;
|
||||
char name[128] = {0};
|
||||
char size[128] = {0};
|
||||
|
||||
for(int j = 0; buff[i] != 0; i++, j++)
|
||||
{
|
||||
name[j] = buff[i];
|
||||
}
|
||||
|
||||
i++;
|
||||
|
||||
for(int j = 0; buff[i] != 0; i++, j++)
|
||||
{
|
||||
size[j] = buff[i];
|
||||
}
|
||||
|
||||
fileName = name;
|
||||
string file_desc(size);
|
||||
string sizeStr = file_desc.substr(0,file_desc.find_first_of(' '));
|
||||
fileSize = stol(sizeStr);
|
||||
fileCount = 0;
|
||||
|
||||
file.open(filePath + fileName, ios::out | ios::binary);
|
||||
|
||||
if(file.is_open() == true)
|
||||
{
|
||||
YmodemFileReceive::status = StatusEstablish;
|
||||
|
||||
receiveStatus(StatusEstablish);
|
||||
|
||||
return CodeAck;
|
||||
}
|
||||
else
|
||||
{
|
||||
YmodemFileReceive::status = StatusError;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeCan;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
YmodemFileReceive::status = StatusError;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeCan;
|
||||
}
|
||||
}
|
||||
|
||||
case StatusTransmit:
|
||||
{
|
||||
if((fileSize - fileCount) > *len)
|
||||
{
|
||||
file->write((char *)buff, *len);
|
||||
|
||||
fileCount += *len;
|
||||
}
|
||||
else
|
||||
{
|
||||
file->write((char *)buff, fileSize - fileCount);
|
||||
|
||||
fileCount += fileSize - fileCount;
|
||||
}
|
||||
|
||||
progress = (int)(fileCount * 100 / fileSize);
|
||||
|
||||
YmodemFileReceive::status = StatusTransmit;
|
||||
|
||||
receiveProgress(progress);
|
||||
receiveStatus(StatusTransmit);
|
||||
|
||||
return CodeAck;
|
||||
}
|
||||
|
||||
case StatusFinish:
|
||||
{
|
||||
file->close();
|
||||
|
||||
YmodemFileReceive::status = StatusFinish;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeAck;
|
||||
}
|
||||
|
||||
case StatusAbort:
|
||||
{
|
||||
file->close();
|
||||
|
||||
YmodemFileReceive::status = StatusAbort;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeCan;
|
||||
}
|
||||
|
||||
case StatusTimeout:
|
||||
{
|
||||
YmodemFileReceive::status = StatusTimeout;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeCan;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
file->close();
|
||||
|
||||
YmodemFileReceive::status = StatusError;
|
||||
|
||||
writeTimer->start(WRITE_TIME_OUT);
|
||||
|
||||
return CodeCan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t YmodemFileReceive::read(uint8_t *buff, uint32_t len)
|
||||
{
|
||||
return serialPort->read((char *)buff, len);
|
||||
}
|
||||
|
||||
uint32_t YmodemFileReceive::write(uint8_t *buff, uint32_t len)
|
||||
{
|
||||
return serialPort->write((char *)buff, len);
|
||||
}
|
||||
Reference in New Issue
Block a user