1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QMODBUSDEVICE_P_H
5#define QMODBUSDEVICE_P_H
6
7#include <QtCore/qvariant.h>
8#include <QtSerialBus/qmodbusdevice.h>
9#if QT_CONFIG(modbus_serialport)
10#include <QtSerialPort/qserialport.h>
11#endif
12
13#include <private/qobject_p.h>
14
15//
16// W A R N I N G
17// -------------
18//
19// This file is not part of the Qt API. It exists purely as an
20// implementation detail. This header file may change from version to
21// version without notice, or even be removed.
22//
23// We mean it.
24//
25
26QT_BEGIN_NAMESPACE
27
28class QModbusDevicePrivate : public QObjectPrivate
29{
30 Q_DECLARE_PUBLIC(QModbusDevice)
31
32public:
33 QModbusDevice::State state = QModbusDevice::UnconnectedState;
34 QModbusDevice::Error error = QModbusDevice::NoError;
35 QString errorString;
36
37#if QT_CONFIG(modbus_serialport)
38 QString m_comPort;
39 QSerialPort::DataBits m_dataBits = QSerialPort::Data8;
40 QSerialPort::Parity m_parity = QSerialPort::EvenParity;
41 QSerialPort::StopBits m_stopBits = QSerialPort::OneStop;
42 QSerialPort::BaudRate m_baudRate = QSerialPort::Baud19200;
43
44 /*!
45 According to the Modbus specification, in RTU mode message frames
46 are separated by a silent interval of at least 3.5 character times.
47 Calculate the timeout if we are less than 19200 baud, use a fixed
48 timeout for everything equal or greater than 19200 baud.
49 If the user set the timeout to be longer than the calculated one,
50 we'll keep the user defined.
51 */
52 void calculateInterFrameDelay()
53 {
54 // The spec recommends a timeout value of 1.750 msec. Without such
55 // precise single-shot timers use a approximated value of 1.750 msec.
56 int delayMilliSeconds = RecommendedDelay;
57 if (m_baudRate < 19200) {
58 // Example: 9600 baud, 11 bit per packet -> 872 char/sec so:
59 // 1000 ms / 872 char = 1.147 ms/char * 3.5 character = 4.0145 ms
60 // Always round up because the spec requests at least 3.5 char.
61 delayMilliSeconds = qCeil(v: 3500. / (qreal(m_baudRate) / 11.));
62 }
63 m_interFrameDelayMilliseconds = qMax(a: m_interFrameDelayMilliseconds, b: delayMilliSeconds);
64 }
65 static constexpr int RecommendedDelay = 2; // A approximated value of 1.750 msec.
66 int m_interFrameDelayMilliseconds = RecommendedDelay;
67#endif
68
69 int m_networkPort = 502;
70 QString m_networkAddress = QStringLiteral("127.0.0.1");
71
72 virtual QIODevice *device() const { return nullptr; }
73};
74
75QT_END_NAMESPACE
76
77#endif // QMODBUSDEVICE_P_H
78

source code of qtserialbus/src/serialbus/qmodbusdevice_p.h