summaryrefslogtreecommitdiffstats
path: root/src/serialbus/qmodbusrtuserialmaster_p.h
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@theqtcompany.com>2015-11-24 14:56:29 +0100
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2015-11-24 19:57:15 +0000
commit2715e92e13997cfce1d654718f0297b268251202 (patch)
treefaf573d92aac3fba3f2101d7cd61bad66e357601 /src/serialbus/qmodbusrtuserialmaster_p.h
parent809f1af7ae7c540b197a2e10f4971cad109343b2 (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.h67
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