diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2015-11-24 14:56:29 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@theqtcompany.com> | 2015-11-24 19:57:15 +0000 |
commit | 2715e92e13997cfce1d654718f0297b268251202 (patch) | |
tree | faf573d92aac3fba3f2101d7cd61bad66e357601 /src/serialbus/qmodbusrtuserialmaster_p.h | |
parent | 809f1af7ae7c540b197a2e10f4971cad109343b2 (diff) |
Move QModbusClient responseTimer into QModbusRtuSerialMaster
The TCP client doesn't use a queue system for requests and therefore
needs one timer per request. Therefore the abstraction offered by
QModbusClient is not suitable for the TCP client. As a consequence
we move the response timer into the RTU client implementation.
Change-Id: Ic30dfd730bcdae42ee7515be0fdf0eaff64af2fa
Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
Diffstat (limited to 'src/serialbus/qmodbusrtuserialmaster_p.h')
-rw-r--r-- | src/serialbus/qmodbusrtuserialmaster_p.h | 67 |
1 files changed, 49 insertions, 18 deletions
diff --git a/src/serialbus/qmodbusrtuserialmaster_p.h b/src/serialbus/qmodbusrtuserialmaster_p.h index 642d9dc..b5c4589 100644 --- a/src/serialbus/qmodbusrtuserialmaster_p.h +++ b/src/serialbus/qmodbusrtuserialmaster_p.h @@ -141,6 +141,54 @@ public: }); } + void startResponseTimer() + { + if (m_responseTimeoutDuration < 0) + return; + + Q_Q(QModbusRtuSerialMaster); + + if (!m_responseTimer) { + 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) << "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; + } + + elem.reply->setError(QModbusReply::TimeoutError, + QModbusClient::tr("Request timeout.")); + }); + + QObject::connect(q, &QModbusClient::timeoutChanged, q, [q, this]() { + m_responseTimer->setInterval(q->timeout()); + }); + } + + m_responseTimer->start(); + } + + void stopResponseTimer() + { + if (m_responseTimeoutDuration < 0) + return; + + if (!m_responseTimer) + return; + + if (m_responseTimer->isActive()) + m_responseTimer->stop(); + } + bool sendNextAdu(const QModbusRequest &request, int serverAddress) { Q_Q(QModbusRtuSerialMaster); @@ -229,24 +277,6 @@ public: return true; } - void handleResponseTimeout() Q_DECL_OVERRIDE - { - qCDebug(QT_MODBUS) << "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; - } - - elem.reply->setError(QModbusReply::TimeoutError, - QModbusClient::tr("Request timeout.")); - } - // TODO: Review once we have a transport layer in place. bool isOpen() const Q_DECL_OVERRIDE { @@ -258,6 +288,7 @@ public: QSerialPort *m_serialPort; QByteArray responseBuffer; QQueue<QueueElement> m_queue; + QTimer *m_responseTimer = Q_NULLPTR; }; QT_END_NAMESPACE |