{
Q_OBJECT
public:
Layer() : lower(0), upper(0) {}
protected:
Layer *lower;
Layer *upper;
};
PresentationLayer : public Layer
{
Q_OBJECT
signals:
void timeout();
public:
PresentationLayer() : process(false) {
lower = new SerialPort();
connect(lower, SIGNAL(readyRead()), this, SLOT(onFromLower());
timer
= new QTimer(100);
// 100 msec waiting timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), this, SLOT(onWaitPacketTimeOut());
}
protected:
virtual quint64 readData() {
return data.size();
}
private slots:
void onFromLower() {
if (!process)
timer->start();
queue.append(lower->readAll());
while (queue.size() > 0) {
char start = queue.at(0);
if (start != START_CONSTANT) {
queue.removeFirst();
continue;
}
char length = queue.at(1);
if (queue.size() < (1 + 1 + length + 1)) // start + length + data + end
// not the whole package was received.
break;
char end = queue.at(1 + length);
if (end != END_CONSTANT) {
queue.removeFirst();
continue;
}
// ok, all checks success, packed received,
// need take data and transfer to upper Level
timer->stop();
queue.removeFirst(); // remove start field
queue.removeFirst(); // remove length field
queue.removeLast(); // remove end field
// done
data = queue.toQByteArray();
queue.clear();
emit readyRead();
}
}
void onWaitPacketTimeOut() {
process = false;
queue.clear();
emit timeout();
}
QQueue<char> queue;
bool process;
}
class Layer : public QIODevice
{
Q_OBJECT
public:
Layer() : lower(0), upper(0) {}
protected:
Layer *lower;
Layer *upper;
};
PresentationLayer : public Layer
{
Q_OBJECT
signals:
void timeout();
public:
PresentationLayer() : process(false) {
lower = new SerialPort();
connect(lower, SIGNAL(readyRead()), this, SLOT(onFromLower());
timer = new QTimer(100); // 100 msec waiting
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), this, SLOT(onWaitPacketTimeOut());
}
protected:
virtual quint64 readData() {
return data.size();
}
private slots:
void onFromLower() {
if (!process)
timer->start();
queue.append(lower->readAll());
while (queue.size() > 0) {
char start = queue.at(0);
if (start != START_CONSTANT) {
queue.removeFirst();
continue;
}
char length = queue.at(1);
if (queue.size() < (1 + 1 + length + 1)) // start + length + data + end
// not the whole package was received.
break;
char end = queue.at(1 + length);
if (end != END_CONSTANT) {
queue.removeFirst();
continue;
}
// ok, all checks success, packed received,
// need take data and transfer to upper Level
timer->stop();
queue.removeFirst(); // remove start field
queue.removeFirst(); // remove length field
queue.removeLast(); // remove end field
// done
data = queue.toQByteArray();
queue.clear();
emit readyRead();
}
}
void onWaitPacketTimeOut() {
process = false;
queue.clear();
emit timeout();
}
QQueue<char> queue;
QTimer *timer;
bool process;
QByteArray data;
}
To copy to clipboard, switch view to plain text mode
Bookmarks