summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--examples/serialbus/modbus/adueditor/adueditor.pro1
-rw-r--r--examples/serialbus/modbus/master/mainwindow.cpp11
-rw-r--r--examples/serialbus/modbus/master/master.pro4
-rw-r--r--examples/serialbus/modbus/master/settingsdialog.cpp4
-rw-r--r--examples/serialbus/modbus/master/settingsdialog.h5
-rw-r--r--examples/serialbus/modbus/slave/mainwindow.cpp11
-rw-r--r--examples/serialbus/modbus/slave/settingsdialog.cpp5
-rw-r--r--examples/serialbus/modbus/slave/settingsdialog.h5
-rw-r--r--examples/serialbus/modbus/slave/slave.pro4
-rw-r--r--qtserialbus.pro2
-rw-r--r--src/plugins/canbus/canbus.pro5
-rw-r--r--src/serialbus/configure.json9
-rw-r--r--src/serialbus/qcanbus.h2
-rw-r--r--src/serialbus/qcanbusdeviceinfo.h2
-rw-r--r--src/serialbus/qcanbusfactory.h2
-rw-r--r--src/serialbus/qcanbusframe.h2
-rw-r--r--src/serialbus/qmodbuscommevent_p.h2
-rw-r--r--src/serialbus/qmodbusdevice.cpp4
-rw-r--r--src/serialbus/qmodbusdevice.h2
-rw-r--r--src/serialbus/qmodbusdevice_p.h4
-rw-r--r--src/serialbus/qmodbusdeviceidentification.h2
-rw-r--r--src/serialbus/qmodbuspdu.h2
-rw-r--r--src/serialbus/qmodbusreply.cpp4
-rw-r--r--src/serialbus/qmodbusrtuserialslave.cpp4
-rw-r--r--src/serialbus/qmodbusrtuserialslave_p.h4
-rw-r--r--src/serialbus/qmodbustcpserver.cpp64
-rw-r--r--src/serialbus/qmodbustcpserver.h14
-rw-r--r--src/serialbus/qmodbustcpserver_p.h16
-rw-r--r--src/serialbus/qtserialbusglobal.h (renamed from src/serialbus/qserialbusglobal.h)7
-rw-r--r--src/serialbus/serialbus.pro26
-rw-r--r--sync.profile5
-rw-r--r--tests/auto/auto.pro7
-rw-r--r--tests/auto/qmodbusserver/tst_qmodbusserver.cpp4
34 files changed, 211 insertions, 36 deletions
diff --git a/.qmake.conf b/.qmake.conf
index bc4bd37..ebb0ade 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -2,4 +2,4 @@ load(qt_build_config)
CONFIG += warning_clean
DEFINES += QT_NO_FOREACH
-MODULE_VERSION = 5.12.2
+MODULE_VERSION = 5.13.0
diff --git a/examples/serialbus/modbus/adueditor/adueditor.pro b/examples/serialbus/modbus/adueditor/adueditor.pro
index bba3c0d..facba76 100644
--- a/examples/serialbus/modbus/adueditor/adueditor.pro
+++ b/examples/serialbus/modbus/adueditor/adueditor.pro
@@ -5,6 +5,7 @@ TARGET = adueditor
QT += serialbus serialport widgets
QT += serialbus-private core-private
requires(qtConfig(combobox))
+requires(qtConfig(modbus-serialport))
FORMS += interface.ui
SOURCES += main.cpp mainwindow.cpp modbustcpclient.cpp
diff --git a/examples/serialbus/modbus/master/mainwindow.cpp b/examples/serialbus/modbus/master/mainwindow.cpp
index 18bba06..6600af8 100644
--- a/examples/serialbus/modbus/master/mainwindow.cpp
+++ b/examples/serialbus/modbus/master/mainwindow.cpp
@@ -90,8 +90,15 @@ MainWindow::MainWindow(QWidget *parent)
ui->writeTable->addItem(tr("Input Registers"), QModbusDataUnit::InputRegisters);
ui->writeTable->addItem(tr("Holding Registers"), QModbusDataUnit::HoldingRegisters);
+#if QT_CONFIG(modbus_serialport)
ui->connectType->setCurrentIndex(0);
on_connectType_currentIndexChanged(0);
+#else
+ // lock out the serial port option
+ ui->connectType->setCurrentIndex(1);
+ on_connectType_currentIndexChanged(1);
+ ui->connectType->setEnabled(false);
+#endif
auto model = new QStandardItemModel(10, 1, this);
for (int i = 0; i < 10; ++i)
@@ -154,7 +161,9 @@ void MainWindow::on_connectType_currentIndexChanged(int index)
auto type = static_cast<ModbusConnection> (index);
if (type == Serial) {
+#if QT_CONFIG(modbus_serialport)
modbusDevice = new QModbusRtuSerialMaster(this);
+#endif
} else if (type == Tcp) {
modbusDevice = new QModbusTcpClient(this);
if (ui->portEdit->text().isEmpty())
@@ -187,6 +196,7 @@ void MainWindow::on_connectButton_clicked()
if (static_cast<ModbusConnection> (ui->connectType->currentIndex()) == Serial) {
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
ui->portEdit->text());
+#if QT_CONFIG(modbus_serialport)
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
m_settingsDialog->settings().parity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
@@ -195,6 +205,7 @@ void MainWindow::on_connectButton_clicked()
m_settingsDialog->settings().dataBits);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
m_settingsDialog->settings().stopBits);
+#endif
} else {
const QUrl url = QUrl::fromUserInput(ui->portEdit->text());
modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());
diff --git a/examples/serialbus/modbus/master/master.pro b/examples/serialbus/modbus/master/master.pro
index 682ce82..188fbc1 100644
--- a/examples/serialbus/modbus/master/master.pro
+++ b/examples/serialbus/modbus/master/master.pro
@@ -1,6 +1,8 @@
-QT += serialbus serialport widgets
+QT += serialbus widgets
requires(qtConfig(combobox))
+qtConfig(modbus-serialport): QT += serialport
+
TARGET = modbusmaster
TEMPLATE = app
CONFIG += c++11
diff --git a/examples/serialbus/modbus/master/settingsdialog.cpp b/examples/serialbus/modbus/master/settingsdialog.cpp
index 8b2fce8..0a5eb43 100644
--- a/examples/serialbus/modbus/master/settingsdialog.cpp
+++ b/examples/serialbus/modbus/master/settingsdialog.cpp
@@ -58,19 +58,23 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
ui->setupUi(this);
ui->parityCombo->setCurrentIndex(1);
+#if QT_CONFIG(modbus_serialport)
ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits));
ui->stopBitsCombo->setCurrentText(QString::number(m_settings.stopBits));
+#endif
ui->timeoutSpinner->setValue(m_settings.responseTime);
ui->retriesSpinner->setValue(m_settings.numberOfRetries);
connect(ui->applyButton, &QPushButton::clicked, [this]() {
+#if QT_CONFIG(modbus_serialport)
m_settings.parity = ui->parityCombo->currentIndex();
if (m_settings.parity > 0)
m_settings.parity++;
m_settings.baud = ui->baudCombo->currentText().toInt();
m_settings.dataBits = ui->dataBitsCombo->currentText().toInt();
m_settings.stopBits = ui->stopBitsCombo->currentText().toInt();
+#endif
m_settings.responseTime = ui->timeoutSpinner->value();
m_settings.numberOfRetries = ui->retriesSpinner->value();
diff --git a/examples/serialbus/modbus/master/settingsdialog.h b/examples/serialbus/modbus/master/settingsdialog.h
index fa8550b..98ba946 100644
--- a/examples/serialbus/modbus/master/settingsdialog.h
+++ b/examples/serialbus/modbus/master/settingsdialog.h
@@ -51,8 +51,11 @@
#ifndef SETTINGSDIALOG_H
#define SETTINGSDIALOG_H
+#include <QtSerialBus/qtserialbusglobal.h>
#include <QDialog>
+#if QT_CONFIG(modbus_serialport)
#include <QSerialPort>
+#endif
QT_BEGIN_NAMESPACE
@@ -68,10 +71,12 @@ class SettingsDialog : public QDialog
public:
struct Settings {
+#if QT_CONFIG(modbus_serialport)
int parity = QSerialPort::EvenParity;
int baud = QSerialPort::Baud19200;
int dataBits = QSerialPort::Data8;
int stopBits = QSerialPort::OneStop;
+#endif
int responseTime = 1000;
int numberOfRetries = 3;
};
diff --git a/examples/serialbus/modbus/slave/mainwindow.cpp b/examples/serialbus/modbus/slave/mainwindow.cpp
index 1b7ad72..4a4c194 100644
--- a/examples/serialbus/modbus/slave/mainwindow.cpp
+++ b/examples/serialbus/modbus/slave/mainwindow.cpp
@@ -72,8 +72,15 @@ MainWindow::MainWindow(QWidget *parent)
ui->setupUi(this);
setupWidgetContainers();
+#if QT_CONFIG(modbus_serialport)
ui->connectType->setCurrentIndex(0);
on_connectType_currentIndexChanged(0);
+#else
+ // lock out the serial port option
+ ui->connectType->setCurrentIndex(1);
+ on_connectType_currentIndexChanged(1);
+ ui->connectType->setEnabled(false);
+#endif
m_settingsDialog = new SettingsDialog(this);
initActions();
@@ -114,7 +121,9 @@ void MainWindow::on_connectType_currentIndexChanged(int index)
ModbusConnection type = static_cast<ModbusConnection> (index);
if (type == Serial) {
+#if QT_CONFIG(modbus_serialport)
modbusDevice = new QModbusRtuSerialSlave(this);
+#endif
} else if (type == Tcp) {
modbusDevice = new QModbusTcpServer(this);
if (ui->portEdit->text().isEmpty())
@@ -177,6 +186,7 @@ void MainWindow::on_connectButton_clicked()
if (static_cast<ModbusConnection> (ui->connectType->currentIndex()) == Serial) {
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,
ui->portEdit->text());
+#if QT_CONFIG(modbus_serialport)
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter,
m_settingsDialog->settings().parity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter,
@@ -185,6 +195,7 @@ void MainWindow::on_connectButton_clicked()
m_settingsDialog->settings().dataBits);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter,
m_settingsDialog->settings().stopBits);
+#endif
} else {
const QUrl url = QUrl::fromUserInput(ui->portEdit->text());
modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, url.port());
diff --git a/examples/serialbus/modbus/slave/settingsdialog.cpp b/examples/serialbus/modbus/slave/settingsdialog.cpp
index c7f1e0c..77ec8af 100644
--- a/examples/serialbus/modbus/slave/settingsdialog.cpp
+++ b/examples/serialbus/modbus/slave/settingsdialog.cpp
@@ -58,18 +58,21 @@ SettingsDialog::SettingsDialog(QWidget *parent) :
ui->setupUi(this);
ui->parityCombo->setCurrentIndex(1);
+#if QT_CONFIG(modbus_serialport)
ui->baudCombo->setCurrentText(QString::number(m_settings.baud));
ui->dataBitsCombo->setCurrentText(QString::number(m_settings.dataBits));
ui->stopBitsCombo->setCurrentText(QString::number(m_settings.stopBits));
+#endif
connect(ui->applyButton, &QPushButton::clicked, [this]() {
+#if QT_CONFIG(modbus_serialport)
m_settings.parity = ui->parityCombo->currentIndex();
if (m_settings.parity > 0)
m_settings.parity++;
m_settings.baud = ui->baudCombo->currentText().toInt();
m_settings.dataBits = ui->dataBitsCombo->currentText().toInt();
m_settings.stopBits = ui->stopBitsCombo->currentText().toInt();
-
+#endif
hide();
});
}
diff --git a/examples/serialbus/modbus/slave/settingsdialog.h b/examples/serialbus/modbus/slave/settingsdialog.h
index bc352c3..dfe7b98 100644
--- a/examples/serialbus/modbus/slave/settingsdialog.h
+++ b/examples/serialbus/modbus/slave/settingsdialog.h
@@ -51,8 +51,11 @@
#ifndef SETTINGSDIALOG_H
#define SETTINGSDIALOG_H
+#include <QtSerialBus/qtserialbusglobal.h>
#include <QDialog>
+#if QT_CONFIG(modbus_serialport)
#include <QSerialPort>
+#endif
QT_BEGIN_NAMESPACE
@@ -68,10 +71,12 @@ class SettingsDialog : public QDialog
public:
struct Settings {
+#if QT_CONFIG(modbus_serialport)
int parity = QSerialPort::EvenParity;
int baud = QSerialPort::Baud19200;
int dataBits = QSerialPort::Data8;
int stopBits = QSerialPort::OneStop;
+#endif
};
explicit SettingsDialog(QWidget *parent = nullptr);
diff --git a/examples/serialbus/modbus/slave/slave.pro b/examples/serialbus/modbus/slave/slave.pro
index b803c5d..aadef07 100644
--- a/examples/serialbus/modbus/slave/slave.pro
+++ b/examples/serialbus/modbus/slave/slave.pro
@@ -1,6 +1,8 @@
-QT += serialbus serialport widgets
+QT += serialbus widgets
requires(qtConfig(combobox))
+qtConfig(modbus-serialport): QT += serialport
+
TARGET = modbusslave
TEMPLATE = app
CONFIG += c++11
diff --git a/qtserialbus.pro b/qtserialbus.pro
index 6261f9f..ebc35b3 100644
--- a/qtserialbus.pro
+++ b/qtserialbus.pro
@@ -1,4 +1,4 @@
-requires(qtHaveModule(serialport):!wasm)
+requires(!wasm)
lessThan(QT_MAJOR_VERSION, 5) {
message("Cannot build current QtSerialBus sources with Qt version $${QT_VERSION}.")
diff --git a/src/plugins/canbus/canbus.pro b/src/plugins/canbus/canbus.pro
index 4366027..ab9755c 100644
--- a/src/plugins/canbus/canbus.pro
+++ b/src/plugins/canbus/canbus.pro
@@ -11,5 +11,8 @@ qtConfig(socketcan) {
qtConfig(library) {
SUBDIRS += passthrucan peakcan tinycan
- win32:SUBDIRS += systeccan vectorcan
+ win32 {
+ SUBDIRS += systeccan
+ !winrt:SUBDIRS += vectorcan
+ }
}
diff --git a/src/serialbus/configure.json b/src/serialbus/configure.json
index d640f57..15d4863 100644
--- a/src/serialbus/configure.json
+++ b/src/serialbus/configure.json
@@ -25,6 +25,12 @@
"label": "Socket CAN FD",
"condition": "config.linux && features.socketcan && tests.socketcan_fd",
"output": [ "privateFeature"]
+ },
+ "modbus-serialport" : {
+ "label": "SerialPort Support",
+ "condition": "module.serialport",
+ "purpose": "Enables Serial-based Modbus Support",
+ "output": [ "publicFeature"]
}
},
@@ -46,7 +52,8 @@
"section": "Qt SerialBus",
"entries": [
"socketcan",
- "socketcan_fd"
+ "socketcan_fd",
+ "modbus-serialport"
]
}
]
diff --git a/src/serialbus/qcanbus.h b/src/serialbus/qcanbus.h
index 695d312..6170fcc 100644
--- a/src/serialbus/qcanbus.h
+++ b/src/serialbus/qcanbus.h
@@ -38,7 +38,7 @@
#define QCANBUS_H
#include <QtCore/qobject.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
#include <QtSerialBus/qcanbusdevice.h>
#include <QtSerialBus/qcanbusdeviceinfo.h>
diff --git a/src/serialbus/qcanbusdeviceinfo.h b/src/serialbus/qcanbusdeviceinfo.h
index fbe2c71..c46302d 100644
--- a/src/serialbus/qcanbusdeviceinfo.h
+++ b/src/serialbus/qcanbusdeviceinfo.h
@@ -39,7 +39,7 @@
#include <QtCore/qshareddata.h>
#include <QtCore/qstring.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/serialbus/qcanbusfactory.h b/src/serialbus/qcanbusfactory.h
index d74903c..cd7322b 100644
--- a/src/serialbus/qcanbusfactory.h
+++ b/src/serialbus/qcanbusfactory.h
@@ -38,7 +38,7 @@
#define QCANBUSFACTORY_H
#include <QtCore/qstringlist.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
#include <QtSerialBus/qcanbusdevice.h>
#include <QtSerialBus/qcanbusdeviceinfo.h>
diff --git a/src/serialbus/qcanbusframe.h b/src/serialbus/qcanbusframe.h
index d1f8857..69bde41 100644
--- a/src/serialbus/qcanbusframe.h
+++ b/src/serialbus/qcanbusframe.h
@@ -39,7 +39,7 @@
#include <QtCore/qmetatype.h>
#include <QtCore/qobject.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/serialbus/qmodbuscommevent_p.h b/src/serialbus/qmodbuscommevent_p.h
index 47967e7..087c060 100644
--- a/src/serialbus/qmodbuscommevent_p.h
+++ b/src/serialbus/qmodbuscommevent_p.h
@@ -37,7 +37,7 @@
#ifndef QMODBUSCOMMEVENT_P_H
#define QMODBUSCOMMEVENT_P_H
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
//
// W A R N I N G
diff --git a/src/serialbus/qmodbusdevice.cpp b/src/serialbus/qmodbusdevice.cpp
index aa1bddc..9891d16 100644
--- a/src/serialbus/qmodbusdevice.cpp
+++ b/src/serialbus/qmodbusdevice.cpp
@@ -124,6 +124,7 @@ QVariant QModbusDevice::connectionParameter(int parameter) const
{
Q_D(const QModbusDevice);
switch (parameter) {
+#if QT_CONFIG(modbus_serialport)
case SerialPortNameParameter:
return d->m_comPort;
case SerialDataBitsParameter:
@@ -134,6 +135,7 @@ QVariant QModbusDevice::connectionParameter(int parameter) const
return d->m_stopBits;
case SerialBaudRateParameter:
return d->m_baudRate;
+#endif
case NetworkPortParameter:
return d->m_networkPort;
case NetworkAddressParameter:
@@ -156,6 +158,7 @@ void QModbusDevice::setConnectionParameter(int parameter, const QVariant &value)
{
Q_D(QModbusDevice);
switch (parameter) {
+#if QT_CONFIG(modbus_serialport)
case SerialPortNameParameter:
d->m_comPort = value.toString();
break;
@@ -171,6 +174,7 @@ void QModbusDevice::setConnectionParameter(int parameter, const QVariant &value)
case SerialBaudRateParameter:
d->m_baudRate = QSerialPort::BaudRate(value.toInt());
break;
+#endif
case NetworkPortParameter:
d->m_networkPort = value.toInt();
break;
diff --git a/src/serialbus/qmodbusdevice.h b/src/serialbus/qmodbusdevice.h
index 20fa1b3..468fdf4 100644
--- a/src/serialbus/qmodbusdevice.h
+++ b/src/serialbus/qmodbusdevice.h
@@ -38,7 +38,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qiodevice.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/serialbus/qmodbusdevice_p.h b/src/serialbus/qmodbusdevice_p.h
index 52ace00..a845a89 100644
--- a/src/serialbus/qmodbusdevice_p.h
+++ b/src/serialbus/qmodbusdevice_p.h
@@ -39,7 +39,9 @@
#include <QtCore/qvariant.h>
#include <QtSerialBus/qmodbusdevice.h>
+#if QT_CONFIG(modbus_serialport)
#include <QtSerialPort/qserialport.h>
+#endif
#include <private/qobject_p.h>
@@ -65,11 +67,13 @@ public:
QModbusDevice::Error error = QModbusDevice::NoError;
QString errorString;
+#if QT_CONFIG(modbus_serialport)
QString m_comPort;
QSerialPort::DataBits m_dataBits = QSerialPort::Data8;
QSerialPort::Parity m_parity = QSerialPort::EvenParity;
QSerialPort::StopBits m_stopBits = QSerialPort::OneStop;
QSerialPort::BaudRate m_baudRate = QSerialPort::Baud19200;
+#endif
int m_networkPort = 502;
QString m_networkAddress = QStringLiteral("127.0.0.1");
diff --git a/src/serialbus/qmodbusdeviceidentification.h b/src/serialbus/qmodbusdeviceidentification.h
index 63d7ee3..9f08f55 100644
--- a/src/serialbus/qmodbusdeviceidentification.h
+++ b/src/serialbus/qmodbusdeviceidentification.h
@@ -39,7 +39,7 @@
#include <QtCore/qmap.h>
#include <QtCore/qmetatype.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/serialbus/qmodbuspdu.h b/src/serialbus/qmodbuspdu.h
index 28b1f8a..14cef59 100644
--- a/src/serialbus/qmodbuspdu.h
+++ b/src/serialbus/qmodbuspdu.h
@@ -39,7 +39,7 @@
#include <QtCore/qdatastream.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qvector.h>
-#include <QtSerialBus/qserialbusglobal.h>
+#include <QtSerialBus/qtserialbusglobal.h>
QT_BEGIN_NAMESPACE
diff --git a/src/serialbus/qmodbusreply.cpp b/src/serialbus/qmodbusreply.cpp
index 297724b..c8b328f 100644
--- a/src/serialbus/qmodbusreply.cpp
+++ b/src/serialbus/qmodbusreply.cpp
@@ -269,6 +269,6 @@ void QModbusReply::setRawResult(const QModbusResponse &response)
d->m_response = response;
}
-#include "moc_qmodbusreply.cpp"
-
QT_END_NAMESPACE
+
+#include "moc_qmodbusreply.cpp"
diff --git a/src/serialbus/qmodbusrtuserialslave.cpp b/src/serialbus/qmodbusrtuserialslave.cpp
index 899bd8d..36a845c 100644
--- a/src/serialbus/qmodbusrtuserialslave.cpp
+++ b/src/serialbus/qmodbusrtuserialslave.cpp
@@ -158,6 +158,6 @@ QModbusResponse QModbusRtuSerialSlave::processRequest(const QModbusPdu &request)
return QModbusServer::processRequest(request);
}
-#include "moc_qmodbusrtuserialslave.cpp"
-
QT_END_NAMESPACE
+
+#include "moc_qmodbusrtuserialslave.cpp"
diff --git a/src/serialbus/qmodbusrtuserialslave_p.h b/src/serialbus/qmodbusrtuserialslave_p.h
index be9cf10..70f28cd 100644
--- a/src/serialbus/qmodbusrtuserialslave_p.h
+++ b/src/serialbus/qmodbusrtuserialslave_p.h
@@ -90,7 +90,7 @@ public:
m_interFrameTimer.start();
- const int size = m_serialPort->size();
+ const qint64 size = m_serialPort->size();
m_requestBuffer += m_serialPort->read(size);
const QModbusSerialAdu adu(QModbusSerialAdu::Rtu, m_requestBuffer);
@@ -218,7 +218,7 @@ public:
return;
}
- int writtenBytes = m_serialPort->write(result);
+ qint64 writtenBytes = m_serialPort->write(result);
if ((writtenBytes == -1) || (writtenBytes < result.size())) {
qCDebug(QT_MODBUS) << "(RTU server) Cannot write requested response to serial port.";
q->setError(QModbusRtuSerialSlave::tr("Could not write response to client"),
diff --git a/src/serialbus/qmodbustcpserver.cpp b/src/serialbus/qmodbustcpserver.cpp
index 39aeda8..3a15e9e 100644
--- a/src/serialbus/qmodbustcpserver.cpp
+++ b/src/serialbus/qmodbustcpserver.cpp
@@ -110,7 +110,7 @@ bool QModbusTcpServer::open()
return false;
}
- if (d->m_tcpServer->listen(QHostAddress(url.host()), url.port()))
+ if (d->m_tcpServer->listen(QHostAddress(url.host()), quint16(url.port())))
setState(QModbusDevice::ConnectedState);
else
setError(d->m_tcpServer->errorString(), QModbusDevice::ConnectionError);
@@ -171,4 +171,66 @@ QModbusResponse QModbusTcpServer::processRequest(const QModbusPdu &request)
return QModbusServer::processRequest(request);
}
+/*!
+ Installs an \a observer that can be used to obtain notifications when a
+ new TCP client connects to this server instance. In addition, the \a observer
+ can be used to reject the incoming TCP connection.
+
+ QModbusTcpServer takes ownership of the given \a observer. Any previously set
+ observer will be deleted. The observer can be uninstalled by calling this
+ function with \c nullptr as parameter.
+
+ \sa QModbusTcpConnectionObserver
+ \since 5.13
+*/
+void QModbusTcpServer::installConnectionObserver(QModbusTcpConnectionObserver *observer)
+{
+ Q_D(QModbusTcpServer);
+
+ d->m_observer.reset(observer);
+}
+
+/*!
+ \class QModbusTcpConnectionObserver
+ \inmodule QtSerialBus
+ \since 5.13
+
+ \brief The QModbusTcpConnectionObserver class represents the interface for
+ objects that can be passed to \l QModbusTcpServer::installConnectionObserver.
+
+ The interface must be implemented by the developer to be able to monitor
+ every incoming TCP connection from another Modbus client.
+
+ \sa QModbusTcpServer::installConnectionObserver
+*/
+
+QModbusTcpConnectionObserver::~QModbusTcpConnectionObserver()
+{
+}
+
+/*!
+ \fn bool QModbusTcpConnectionObserver::acceptNewConnection(QTcpSocket *newClient)
+
+ This function is a callback for every incoming TCP connection. The user should
+ provide \a newClient to receive a notification when a new client connection
+ is established and to determine whether the connection is to be accepted.
+
+ The function should return \c true if the connection is to be accepted. Otherwise,
+ the socket is closed/rejected.
+*/
+
+/*!
+ \fn void QModbusTcpServer::modbusClientDisconnected(QTcpSocket *modbusClient)
+
+ This signal is emitted when a current TCP based \a modbusClient disconnects
+ from this Modbus TCP server. Note that there might be several TCP clients
+ connected at the same time.
+
+ Notifications on incoming new connections can be received by installing a
+ QModbusTcpConnectionObserver via \l installConnectionObserver().
+
+ \sa installConnectionObserver
+ \since 5.13
+*/
+
QT_END_NAMESPACE
diff --git a/src/serialbus/qmodbustcpserver.h b/src/serialbus/qmodbustcpserver.h
index 57276a5..cf24d42 100644
--- a/src/serialbus/qmodbustcpserver.h
+++ b/src/serialbus/qmodbustcpserver.h
@@ -43,6 +43,15 @@
QT_BEGIN_NAMESPACE
class QModbusTcpServerPrivate;
+class QTcpSocket;
+
+class Q_SERIALBUS_EXPORT QModbusTcpConnectionObserver
+{
+public:
+ virtual ~QModbusTcpConnectionObserver();
+
+ virtual bool acceptNewConnection(QTcpSocket *newClient) = 0;
+};
class Q_SERIALBUS_EXPORT QModbusTcpServer : public QModbusServer
{
@@ -53,6 +62,11 @@ public:
explicit QModbusTcpServer(QObject *parent = nullptr);
~QModbusTcpServer();
+ void installConnectionObserver(QModbusTcpConnectionObserver *observer);
+
+Q_SIGNALS:
+ void modbusClientDisconnected(QTcpSocket *modbusClient);
+
protected:
QModbusTcpServer(QModbusTcpServerPrivate &dd, QObject *parent = nullptr);
diff --git a/src/serialbus/qmodbustcpserver_p.h b/src/serialbus/qmodbustcpserver_p.h
index 90d1eaf..91e3bfe 100644
--- a/src/serialbus/qmodbustcpserver_p.h
+++ b/src/serialbus/qmodbustcpserver_p.h
@@ -48,6 +48,8 @@
#include <private/qmodbusserver_p.h>
+#include <memory>
+
//
// W A R N I N G
// -------------
@@ -123,6 +125,13 @@ public:
qCDebug(QT_MODBUS) << "(TCP server) Incoming socket from" << socket->peerAddress()
<< socket->peerName() << socket->peerPort();
+ if (m_observer && !m_observer->acceptNewConnection(socket)) {
+ qCDebug(QT_MODBUS) << "(TCP server) Connection rejected by observer";
+ socket->close();
+ socket->deleteLater();
+ return;
+ }
+
connections.append(socket);
auto buffer = new QByteArray();
@@ -133,6 +142,9 @@ public:
});
QObject::connect(socket, &QTcpSocket::disconnected, [socket, this]() {
connections.removeAll(socket);
+
+ Q_Q(QModbusTcpServer);
+ emit q->modbusClientDisconnected(socket);
socket->deleteLater();
});
QObject::connect(socket, &QTcpSocket::readyRead, [buffer, socket, this]() {
@@ -193,7 +205,7 @@ public:
return;
}
- int writtenBytes = socket->write(result);
+ qint64 writtenBytes = socket->write(result);
if (writtenBytes == -1 || writtenBytes < result.size()) {
qCDebug(QT_MODBUS) << "(TCP server) Cannot write requested response to socket.";
forwardError(QModbusTcpServer::tr("Could not write response to client"),
@@ -214,6 +226,8 @@ public:
QTcpServer *m_tcpServer;
QVector<QTcpSocket *> connections;
+ std::unique_ptr<QModbusTcpConnectionObserver> m_observer;
+
static const qint8 mbpaHeaderSize = 7;
static const qint16 maxBytesModbusADU = 260;
};
diff --git a/src/serialbus/qserialbusglobal.h b/src/serialbus/qtserialbusglobal.h
index 736c4a8..31c1f85 100644
--- a/src/serialbus/qserialbusglobal.h
+++ b/src/serialbus/qtserialbusglobal.h
@@ -34,10 +34,11 @@
**
****************************************************************************/
-#ifndef QSERIALBUSGLOBAL_H
-#define QSERIALBUSGLOBAL_H
+#ifndef QTSERIALBUSGLOBAL_H
+#define QTSERIALBUSGLOBAL_H
#include <QtCore/qglobal.h>
+#include <QtSerialBus/qtserialbus-config.h>
QT_BEGIN_NAMESPACE
@@ -53,4 +54,4 @@ QT_BEGIN_NAMESPACE
QT_END_NAMESPACE
-#endif // QSERIALBUSGLOBAL_H
+#endif // QTSERIALBUSGLOBAL_H
diff --git a/src/serialbus/serialbus.pro b/src/serialbus/serialbus.pro
index 14583bc..3abba31 100644
--- a/src/serialbus/serialbus.pro
+++ b/src/serialbus/serialbus.pro
@@ -1,7 +1,8 @@
TARGET = QtSerialBus
QT = core-private
-QT_FOR_PRIVATE = network serialport
+QT_FOR_PRIVATE = network
+
CONFIG += c++11
QMAKE_DOCS = $$PWD/doc/qtserialbus.qdocconf
@@ -12,16 +13,14 @@ PUBLIC_HEADERS += \
qcanbusfactory.h \
qcanbusframe.h \
qcanbus.h \
- qserialbusglobal.h \
+ qtserialbusglobal.h \
qmodbusserver.h \
qmodbusdevice.h \
qmodbusdataunit.h \
qmodbusclient.h \
qmodbusreply.h \
- qmodbusrtuserialmaster.h \
qmodbustcpclient.h \
qmodbustcpserver.h \
- qmodbusrtuserialslave.h \
qmodbuspdu.h \
qmodbusdeviceidentification.h
@@ -31,10 +30,8 @@ PRIVATE_HEADERS += \
qmodbusserver_p.h \
qmodbusclient_p.h \
qmodbusdevice_p.h \
- qmodbusrtuserialmaster_p.h \
qmodbustcpclient_p.h \
qmodbustcpserver_p.h \
- qmodbusrtuserialslave_p.h \
qmodbus_symbols_p.h \
qmodbuscommevent_p.h \
qmodbusadu_p.h \
@@ -50,13 +47,26 @@ SOURCES += \
qmodbusdataunit.cpp \
qmodbusclient.cpp \
qmodbusreply.cpp \
- qmodbusrtuserialmaster.cpp \
qmodbustcpclient.cpp \
qmodbustcpserver.cpp \
- qmodbusrtuserialslave.cpp \
qmodbuspdu.cpp \
qmodbusdeviceidentification.cpp
+qtConfig(modbus-serialport) {
+ QT_FOR_PRIVATE += serialport
+
+ PUBLIC_HEADERS += \
+ qmodbusrtuserialmaster.h \
+ qmodbusrtuserialslave.h
+
+ PRIVATE_HEADERS += \
+ qmodbusrtuserialmaster_p.h \
+ qmodbusrtuserialslave_p.h
+
+ SOURCES += \
+ qmodbusrtuserialmaster.cpp \
+ qmodbusrtuserialslave.cpp
+}
HEADERS += $$PUBLIC_HEADERS $$PRIVATE_HEADERS
MODULE_PLUGIN_TYPES = \
diff --git a/sync.profile b/sync.profile
index e7125c6..588f4e1 100644
--- a/sync.profile
+++ b/sync.profile
@@ -1,3 +1,8 @@
%modules = (
"QtSerialBus" => "$basedir/src/serialbus",
);
+%deprecatedheaders = (
+ "QtSerialBus" => {
+ "qserialbusglobal.h" => "QtSerialBus/qtserialbusglobal.h"
+ },
+);
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 2542d65..268fc74 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -11,8 +11,11 @@ SUBDIRS += cmake \
qmodbusserver \
qmodbuscommevent \
qmodbusadu \
- qmodbusdeviceidentification \
- qmodbusrtuserialmaster
+ qmodbusdeviceidentification
+
+QT_FOR_CONFIG += serialbus
+
+qtConfig(modbus-serialport): SUBDIRS += qmodbusrtuserialmaster
qcanbus.depends += plugins
qcanbusdevice.depends += plugins
diff --git a/tests/auto/qmodbusserver/tst_qmodbusserver.cpp b/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
index 6fe284d..ad33337 100644
--- a/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
+++ b/tests/auto/qmodbusserver/tst_qmodbusserver.cpp
@@ -35,7 +35,9 @@
****************************************************************************/
#include <QtSerialBus/qmodbusserver.h>
+#if QT_CONFIG(modbus_serialport)
#include <QtSerialBus/qmodbusrtuserialslave.h>
+#endif
#include <QtSerialBus/qmodbustcpserver.h>
#include <QtSerialBus/qmodbusdeviceidentification.h>
@@ -90,7 +92,9 @@ private slots:
void testServerAddress()
{
QCOMPARE(QModbusTcpServer().serverAddress(), 0xff);
+#if QT_CONFIG(modbus_serialport)
QCOMPARE(QModbusRtuSerialSlave().serverAddress(), 1);
+#endif
}
void testProcessRequestReadWriteSingleMultipleCoils()