|
@@ -376,12 +376,14 @@ class ModbusNG : public QObject
|
376
|
376
|
void sendNextMessage();
|
377
|
377
|
void timeout();
|
378
|
378
|
void dataAvailable();
|
|
379
|
+ void rateLimitTimeout();
|
379
|
380
|
private:
|
380
|
381
|
quint16 calculateCRC(QByteArray data);
|
381
|
382
|
QextSerialPort *port;
|
382
|
383
|
int delayTime;
|
383
|
384
|
QTimer *messageDelayTimer;
|
384
|
385
|
QTimer *commTimeout;
|
|
386
|
+ QTimer *rateLimiter;
|
385
|
387
|
int scanPosition;
|
386
|
388
|
bool waiting;
|
387
|
389
|
QByteArray responseBuffer;
|
|
@@ -400,7 +402,7 @@ sub-tree. In this design, child nodes establish a scan list.
|
400
|
402
|
@<ModbusNG implementation@>=
|
401
|
403
|
ModbusNG::ModbusNG(DeviceTreeModel *model, const QModelIndex &index) :
|
402
|
404
|
QObject(NULL), messageDelayTimer(new QTimer), commTimeout(new QTimer),
|
403
|
|
- scanPosition(0), waiting(false)
|
|
405
|
+ rateLimiter(new QTimer), scanPosition(0), waiting(false)
|
404
|
406
|
{
|
405
|
407
|
QDomElement portReferenceElement =
|
406
|
408
|
model->referenceElement(model->data(index, Qt::UserRole).toString());
|
|
@@ -422,9 +424,12 @@ ModbusNG::ModbusNG(DeviceTreeModel *model, const QModelIndex &index) :
|
422
|
424
|
delayTime = (int)(((double)(1)/(double)(attributes.value("baud").toInt())) * 144000.0);
|
423
|
425
|
messageDelayTimer->setSingleShot(true);
|
424
|
426
|
commTimeout->setSingleShot(true);
|
|
427
|
+ rateLimiter->setSingleShot(true);
|
|
428
|
+ rateLimiter->setInterval(0);
|
425
|
429
|
connect(messageDelayTimer, SIGNAL(timeout()), this, SLOT(sendNextMessage()));
|
426
|
430
|
connect(commTimeout, SIGNAL(timeout()), this, SLOT(timeout()));
|
427
|
431
|
connect(port, SIGNAL(readyRead()), this, SLOT(dataAvailable()));
|
|
432
|
+ connect(rateLimiter, SIGNAL(timeout()), this, SLOT(rateLimitTimeout()));
|
428
|
433
|
if(!port->open(QIODevice::ReadWrite))
|
429
|
434
|
{
|
430
|
435
|
qDebug() << "Failed to open serial port";
|
|
@@ -527,6 +532,11 @@ void ModbusNG::timeout()
|
527
|
532
|
messageDelayTimer->start();
|
528
|
533
|
}
|
529
|
534
|
|
|
535
|
+void ModbusNG::rateLimitTimeout()
|
|
536
|
+{
|
|
537
|
+ messageDelayTimer->start();
|
|
538
|
+}
|
|
539
|
+
|
530
|
540
|
void ModbusNG::dataAvailable()
|
531
|
541
|
{
|
532
|
542
|
if(messageDelayTimer->isActive())
|
|
@@ -605,7 +615,14 @@ void ModbusNG::dataAvailable()
|
605
|
615
|
}
|
606
|
616
|
responseBuffer.clear();
|
607
|
617
|
waiting = false;
|
608
|
|
- messageDelayTimer->start(delayTime);
|
|
618
|
+ if(scanPosition == 0)
|
|
619
|
+ {
|
|
620
|
+ rateLimiter->start();
|
|
621
|
+ }
|
|
622
|
+ else
|
|
623
|
+ {
|
|
624
|
+ messageDelayTimer->start(delayTime);
|
|
625
|
+ }
|
609
|
626
|
}
|
610
|
627
|
|
611
|
628
|
quint16 ModbusNG::calculateCRC(QByteArray data)
|