summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbusrtuserialmaster_p.h
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-12-18 13:36:25 +0100
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-12-18 14:08:13 +0000
commit05595c36d7faf5d50c325ab497893c287a115179 (patch)
tree82f43e79ed7589550161de88c93ced7121f2d05f /src/serialbus/qmodbusrtuserialmaster_p.h
parent432f8409f655d3c993fe3dce83567da62006639f (diff)
Implement number of retries before a request fails.
Change-Id: If3d1f50b431793dcb9209cfd20f077aa98675431 Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
Diffstat (limited to 'src/serialbus/qmodbusrtuserialmaster_p.h')
-rw-r--r--src/serialbus/qmodbusrtuserialmaster_p.h29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/serialbus/qmodbusrtuserialmaster_p.h b/src/serialbus/qmodbusrtuserialmaster_p.h
index 28b9cf6..e360331 100644
--- a/src/serialbus/qmodbusrtuserialmaster_p.h
+++ b/src/serialbus/qmodbusrtuserialmaster_p.h
@@ -151,28 +151,29 @@ public:
if (m_responseTimeoutDuration < 0)
return;
- Q_Q(QModbusRtuSerialMaster);
-
if (!m_responseTimer) {
+ Q_Q(QModbusRtuSerialMaster);
m_responseTimer = new QTimer(q);
m_responseTimer->setSingleShot(true);
m_responseTimer->setInterval(m_responseTimeoutDuration);
QObject::connect(m_responseTimer, &QTimer::timeout, q, [this]() {
- qCDebug(QT_MODBUS) << "(RTU client) Timeout of last request";
-
if (m_queue.isEmpty())
return;
- QueueElement elem = m_queue.dequeue();
- if (elem.reply.isNull()) {
- // reply deleted while waiting for response which timed out
- // nothing really to do here
- return;
+ QueueElement elem = m_queue.head();
+ if (elem.reply.isNull() || elem.numberOfRetries <= 0) {
+ elem = m_queue.dequeue();
+ if (elem.numberOfRetries <= 0) {
+ elem.reply->setError(QModbusReply::TimeoutError,
+ QModbusClient::tr("Request timeout."));
+ qCDebug(QT_MODBUS) << "(RTU client) Timeout of request" << elem.requestPdu;
+ }
+ } else {
+ m_queue[0].numberOfRetries--;
+ qCDebug(QT_MODBUS) << "(RTU client) Resend request:" << elem.requestPdu;
}
-
- elem.reply->setError(QModbusReply::TimeoutError,
- QModbusClient::tr("Request timeout."));
- sendNextRequest(); // go to next request
+ // go to next request or send request again
+ QTimer::singleShot(0, [this]() { sendNextRequest(); });
});
QObject::connect(q, &QModbusClient::timeoutChanged, q, [q, this]() {
@@ -259,7 +260,7 @@ public:
Q_Q(QModbusRtuSerialMaster);
QModbusReply *reply = new QModbusReply(type, slaveAddress, q);
- m_queue.enqueue(QueueElement{ reply, request, unit });
+ m_queue.enqueue(QueueElement{ reply, request, unit, m_numberOfRetries });
if (!m_responseTimer || (!m_responseTimer->isActive()))
sendNextRequest();