DataFeeder2
::DataFeeder2(QString useComPort,
QObject *parent,
int nSleepTime
) : QObject(parent
), sleepTime
(nSleepTime
), comPort
(useComPort
), waitingForReply
(false) {
//sleepTime = settings.value("Interval", QVariant(nSleepTime)).toInt()*60*1000; // in msec
sleepTime = 1000; // DEBUG only
serial.setPortName(comPort);
timer.setInterval(sleepTime);
errorTimer.setSingleShot(true);
connect(&serial, SIGNAL(readyRead()),
this, SLOT(readResponse()));
connect(&timer, SIGNAL(timeout()),
this, SLOT(acquireData()));
connect(&errorTimer, SIGNAL(timeout()),
this, SLOT(processTimeout()));
}
DataFeeder2::~DataFeeder2()
{
if(serial.isOpen())
{
serial.close();
}
}
bool DataFeeder2::start()
{
bool retval = true;
serial.setPortName(comPort);
qDebug() << "Trying to open " << comPort;
qDebug
() <<
QString("Can't open %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
if (!serial.setBaudRate(QSerialPort::Baud57600)) {
qDebug
() <<
QString("Can't set baud rate 9600 baud to port %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
if (!serial.setDataBits(QSerialPort::Data8)) {
qDebug
() <<
QString("Can't set 8 data bits to port %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
if (!serial.setParity(QSerialPort::NoParity)) {
qDebug
() <<
QString("Can't set no patity to port %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
if (!serial.setStopBits(QSerialPort::OneStop)) {
qDebug
() <<
QString("Can't set 1 stop bit to port %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
if (!serial.setFlowControl(QSerialPort::NoFlowControl)) {
qDebug
() <<
QString("Can't set no flow control to port %1, error code %2").
arg(comPort
).
arg(serial.
error());
retval = false;
}
qDebug() << comPort << " opened.";
waitingForReply = false;
timer.start();
return retval;
}
void DataFeeder2::stop()
{
timer.stop();
errorTimer.stop();
serial.close();
qDebug() << "DataFeeder2 stopped.";
}
void DataFeeder2::setSleepTime(int nSleepTime)
{
if(sleepTime != nSleepTime)
{
sleepTime = nSleepTime;
timer.setInterval(sleepTime);
emit sleepTimeChanged(sleepTime);
}
}
void DataFeeder2::processTimeout()
{
qDebug
() <<
"Timeout waiting to read serial port " << comPort <<
" - " <<
QDateTime::currentDateTimeUtc().
time().
toString();
qDebug() << "Error code: " << serial.error() << " String: " << serial.errorString();
qDebug() << "Bytes avail: " << serial.bytesAvailable();
emit feederError
(QString("<font color=\"#ff0000\">ERROR(%1)</font>").
arg(serial.
error()));
// DEBUG only
stop();
start();
// END DEBUG only
}
void DataFeeder2::acquireData()
{
if(!waitingForReply)
{
serial.
write(QString("d").
toLocal8Bit());
errorTimer.start(4000);
waitingForReply = true;
qDebug
() <<
"Sent at: " <<
QDateTime::currentDateTimeUtc().
time().
toString();
}
}
void DataFeeder2::readResponse()
{
qDebug
() <<
"In ReadResponse()" <<
QDateTime::currentDateTimeUtc().
time().
toString();
if(serial.canReadLine())
//if(serial.bytesAvailable()>10)
{
errorTimer.stop();
responseData = serial.readAll();
//responseData = serial.readLine();
data = data.fromLatin1(responseData).trimmed();
qDebug() << "Got:$" << data << "$";
waitingForReply = false;
}
}
DataFeeder2::DataFeeder2(QString useComPort, QObject *parent, int nSleepTime) :
QObject(parent), sleepTime(nSleepTime), comPort(useComPort), waitingForReply(false)
{
QSettings settings;
//sleepTime = settings.value("Interval", QVariant(nSleepTime)).toInt()*60*1000; // in msec
sleepTime = 1000; // DEBUG only
serial.setPortName(comPort);
timer.setInterval(sleepTime);
errorTimer.setSingleShot(true);
connect(&serial, SIGNAL(readyRead()),
this, SLOT(readResponse()));
connect(&timer, SIGNAL(timeout()),
this, SLOT(acquireData()));
connect(&errorTimer, SIGNAL(timeout()),
this, SLOT(processTimeout()));
}
DataFeeder2::~DataFeeder2()
{
if(serial.isOpen())
{
serial.close();
}
}
bool DataFeeder2::start()
{
bool retval = true;
serial.setPortName(comPort);
qDebug() << "Trying to open " << comPort;
if (!serial.open(QIODevice::ReadWrite)) {
qDebug() << QString("Can't open %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
if (!serial.setBaudRate(QSerialPort::Baud57600)) {
qDebug() << QString("Can't set baud rate 9600 baud to port %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
if (!serial.setDataBits(QSerialPort::Data8)) {
qDebug() << QString("Can't set 8 data bits to port %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
if (!serial.setParity(QSerialPort::NoParity)) {
qDebug() << QString("Can't set no patity to port %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
if (!serial.setStopBits(QSerialPort::OneStop)) {
qDebug() << QString("Can't set 1 stop bit to port %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
if (!serial.setFlowControl(QSerialPort::NoFlowControl)) {
qDebug() << QString("Can't set no flow control to port %1, error code %2").arg(comPort).arg(serial.error());
retval = false;
}
qDebug() << comPort << " opened.";
waitingForReply = false;
timer.start();
return retval;
}
void DataFeeder2::stop()
{
timer.stop();
errorTimer.stop();
serial.close();
qDebug() << "DataFeeder2 stopped.";
}
void DataFeeder2::setSleepTime(int nSleepTime)
{
if(sleepTime != nSleepTime)
{
sleepTime = nSleepTime;
timer.setInterval(sleepTime);
emit sleepTimeChanged(sleepTime);
}
}
void DataFeeder2::processTimeout()
{
qDebug() << "Timeout waiting to read serial port " << comPort << " - " << QDateTime::currentDateTimeUtc().time().toString();
qDebug() << "Error code: " << serial.error() << " String: " << serial.errorString();
qDebug() << "Bytes avail: " << serial.bytesAvailable();
emit feederError(QString("<font color=\"#ff0000\">ERROR(%1)</font>").arg(serial.error()));
// DEBUG only
stop();
start();
// END DEBUG only
}
void DataFeeder2::acquireData()
{
if(!waitingForReply)
{
serial.write(QString("d").toLocal8Bit());
errorTimer.start(4000);
waitingForReply = true;
qDebug() << "Sent at: " << QDateTime::currentDateTimeUtc().time().toString();
}
}
void DataFeeder2::readResponse()
{
qDebug() << "In ReadResponse()" << QDateTime::currentDateTimeUtc().time().toString();
if(serial.canReadLine())
//if(serial.bytesAvailable()>10)
{
errorTimer.stop();
responseData = serial.readAll();
//responseData = serial.readLine();
QString data;
data = data.fromLatin1(responseData).trimmed();
qDebug() << "Got:$" << data << "$";
waitingForReply = false;
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks