diff options
author | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-12-18 13:36:25 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-12-18 14:08:13 +0000 |
commit | 05595c36d7faf5d50c325ab497893c287a115179 (patch) | |
tree | 82f43e79ed7589550161de88c93ced7121f2d05f /src/serialbus/qmodbusrtuserialmaster_p.h | |
parent | 432f8409f655d3c993fe3dce83567da62006639f (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.h | 29 |
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(); |