summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorAndrew O'Doherty <andrew.odoherty@qt.io>2018-08-09 16:46:09 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2018-08-16 08:13:04 +0000
commit9b155d1df00ccd60d6c80d3b47a410e2b50df152 (patch)
tree3366a6b5e6dfb26a94338ce6121794f27bf0b52d /examples
parent789657bd1b038bcebc82df1aeafc7de66d5786cd (diff)
AN184: Implement TCP support as specified in KnxNet/IP Core v2
Change-Id: Id3139d106e43ee37824b5d555f652641e685f0d2 Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
Diffstat (limited to 'examples')
-rw-r--r--examples/knx/knxeditor/localdevicemanagement.cpp20
-rw-r--r--examples/knx/knxeditor/localdevicemanagement.h2
-rw-r--r--examples/knx/knxeditor/mainwindow.cpp16
-rw-r--r--examples/knx/knxeditor/mainwindow.h1
-rw-r--r--examples/knx/knxeditor/mainwindow.ui20
-rw-r--r--examples/knx/knxeditor/tunneling.cpp9
-rw-r--r--examples/knx/knxeditor/tunneling.h2
7 files changed, 62 insertions, 8 deletions
diff --git a/examples/knx/knxeditor/localdevicemanagement.cpp b/examples/knx/knxeditor/localdevicemanagement.cpp
index 9b82f48..803badf 100644
--- a/examples/knx/knxeditor/localdevicemanagement.cpp
+++ b/examples/knx/knxeditor/localdevicemanagement.cpp
@@ -82,7 +82,9 @@ LocalDeviceManagement::LocalDeviceManagement(QWidget* parent)
connect(ui->connectRequestDeviceManagement, &QPushButton::clicked, this, [&]() {
m_management.setLocalPort(0);
- m_management.connectToHost(m_server.controlEndpointAddress(), m_server.controlEndpointPort());
+ m_management.connectToHost(m_server.controlEndpointAddress(),
+ m_server.controlEndpointPort(),
+ m_proto);
});
connect(&m_management, &QKnxNetIpDeviceManagement::connected, this, [&] {
@@ -165,6 +167,11 @@ void LocalDeviceManagement::setKnxNetIpServer(const QKnxNetIpServerInfo &server)
ui->deviceManagementSendRequest->setEnabled(false);
}
+void LocalDeviceManagement::setTcpEnable(bool value)
+{
+ m_proto = (value ? QKnxNetIp::HostProtocol::TCP_IPv4 : QKnxNetIp::HostProtocol::UDP_IPv4);
+}
+
void LocalDeviceManagement::clearLogging()
{
ui->textOuputDeviceManagement->clear();
@@ -308,8 +315,17 @@ void LocalDeviceManagement::updatePropertyTypeCombobox(const QString &type)
void LocalDeviceManagement::handleIoListResponse(const QKnxDeviceManagementFrame &frame)
{
if (frame.objectType() != QKnxInterfaceObjectType::System::Device
- || frame.property() != QKnxInterfaceObjectProperty::Device::IoList)
+ || frame.property() != QKnxInterfaceObjectProperty::Device::IoList) {
+ return;
+ }
+
+ if (frame.isNegativeConfirmation()) {
+ auto metaEnum = QMetaEnum::fromType<QKnxNetIp::CemiServer::Error>();
+ ui->textOuputDeviceManagement->append(tr("Received negative confirmation. Error code: %1")
+ .arg(QString::fromLatin1(metaEnum.valueToKey(int(frame.error())))));
+ m_awaitIoListResponse = false;
return;
+ }
auto dataTypes = QKnxInterfaceObjectPropertyDataType::fromProperty(QKnxInterfaceObjectProperty
::Device::IoList);
diff --git a/examples/knx/knxeditor/localdevicemanagement.h b/examples/knx/knxeditor/localdevicemanagement.h
index 1dedc34..218ad95 100644
--- a/examples/knx/knxeditor/localdevicemanagement.h
+++ b/examples/knx/knxeditor/localdevicemanagement.h
@@ -77,6 +77,7 @@ public:
void setNatAware(bool isNatAware);
void setLocalAddress(const QHostAddress &address);
void setKnxNetIpServer(const QKnxNetIpServerInfo &server);
+ void setTcpEnable(bool value);
public slots:
void clearLogging();
@@ -108,6 +109,7 @@ private:
QKnxNetIpServerInfo m_server;
QKnxNetIpDeviceManagement m_management;
+ QKnxNetIp::HostProtocol m_proto { QKnxNetIp::HostProtocol::UDP_IPv4 };
};
#endif
diff --git a/examples/knx/knxeditor/mainwindow.cpp b/examples/knx/knxeditor/mainwindow.cpp
index ad4fa49..0640a2d 100644
--- a/examples/knx/knxeditor/mainwindow.cpp
+++ b/examples/knx/knxeditor/mainwindow.cpp
@@ -176,7 +176,7 @@ void MainWindow::newServerSelected(int serverBoxIndex)
return;
auto info = ui->serverBox->itemData(serverBoxIndex).value<QKnxNetIpServerInfo>();
-
+ bool version2Supported = false;
ui->serverDescription->setText(tr("<html><head><style> th { text-align: left; } td.padding { "
"padding-left: 10px; } </style></head> <body>"
" <table style=\"width:100%\">"
@@ -191,13 +191,15 @@ void MainWindow::newServerSelected(int serverBoxIndex)
"</body></html>")
.arg(info.individualAddress().toString())
.arg(info.controlEndpointAddress().toString()).arg(info.controlEndpointPort())
- .arg([&info]() -> QString {
+ .arg([&info, &version2Supported]() -> QString {
QString value;
const auto services = info.supportedServices();
for (const auto &service : services) {
value.append(tr("<tr><td class=\"padding\">%1</td></th>")
.arg(tr("KNXnet/IP %1, Version: %2").arg(familieToString(service.ServiceFamily))
.arg(service.ServiceFamilyVersion)));
+ if (service.ServiceFamilyVersion >= 2)
+ version2Supported = true;
}
return value;
}())
@@ -205,9 +207,6 @@ void MainWindow::newServerSelected(int serverBoxIndex)
const auto &hpai = info.endpoint();
const QKnxNetIpHpaiProxy endpoint(hpai);
- if (endpoint.hostProtocol() != QKnxNetIp::HostProtocol::UDP_IPv4)
- return;
-
if (endpoint.isValid() && m_server != info) {
m_server = info;
@@ -217,6 +216,7 @@ void MainWindow::newServerSelected(int serverBoxIndex)
ui->deviceManagement->setEnabled(true);
ui->deviceManagement->setKnxNetIpServer(m_server);
}
+ ui->radioButtonTCP->setEnabled(version2Supported);
}
void MainWindow::newIPAddressSelected(int localIpBoxIndex)
@@ -261,6 +261,12 @@ void MainWindow::showServerAndServices(const QKnxNetIpServerInfo &info)
.toString()).arg(info.controlEndpointPort()), QVariant::fromValue(info));
}
+void MainWindow::on_radioButtonTCP_toggled(bool checked)
+{
+ ui->tunneling->setTcpEnable(checked);
+ ui->deviceManagement->setTcpEnable(checked);
+}
+
void MainWindow::fillLocalIpBox()
{
auto firstItem = new QStandardItem(tr("Interface: IP address --Select One--"));
diff --git a/examples/knx/knxeditor/mainwindow.h b/examples/knx/knxeditor/mainwindow.h
index 9c6d955..8aa256f 100644
--- a/examples/knx/knxeditor/mainwindow.h
+++ b/examples/knx/knxeditor/mainwindow.h
@@ -73,6 +73,7 @@ private slots:
void newServerSelected(int serverBoxIndex);
void newIPAddressSelected(int localIpBoxIndex);
void showServerAndServices(const QKnxNetIpServerInfo &info);
+ void on_radioButtonTCP_toggled(bool checked);
private:
void fillLocalIpBox();
diff --git a/examples/knx/knxeditor/mainwindow.ui b/examples/knx/knxeditor/mainwindow.ui
index edbe82c..e981c61 100644
--- a/examples/knx/knxeditor/mainwindow.ui
+++ b/examples/knx/knxeditor/mainwindow.ui
@@ -99,6 +99,26 @@
</spacer>
</item>
<item>
+ <widget class="QRadioButton" name="radioButtonUDP">
+ <property name="text">
+ <string>Use UDP as transport layer protocol</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="radioButtonTCP">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Use TCP as transport layer protocol</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QCheckBox" name="checkboxNat">
<property name="text">
<string>Use NAT for KNXnet/IP communication</string>
diff --git a/examples/knx/knxeditor/tunneling.cpp b/examples/knx/knxeditor/tunneling.cpp
index 5684837..0d7486a 100644
--- a/examples/knx/knxeditor/tunneling.cpp
+++ b/examples/knx/knxeditor/tunneling.cpp
@@ -94,7 +94,9 @@ Tunneling::Tunneling(QWidget* parent)
connect(ui->connectTunneling, &QPushButton::clicked, this, [&]() {
m_tunnel.setLocalPort(0);
- m_tunnel.connectToHost(m_server.controlEndpointAddress(), m_server.controlEndpointPort());
+ m_tunnel.connectToHost(m_server.controlEndpointAddress(),
+ m_server.controlEndpointPort(),
+ m_proto);
});
connect(&m_tunnel, &QKnxNetIpTunnel::connected, this, [&] {
@@ -259,6 +261,11 @@ void Tunneling::setKnxNetIpServer(const QKnxNetIpServerInfo &server)
ui->tunnelingSendRequest->setEnabled(false);
}
+void Tunneling::setTcpEnable(bool value)
+{
+ m_proto = (value ? QKnxNetIp::HostProtocol::TCP_IPv4 : QKnxNetIp::HostProtocol::UDP_IPv4);
+}
+
void Tunneling::clearLogging()
{
ui->textOuputTunneling->clear();
diff --git a/examples/knx/knxeditor/tunneling.h b/examples/knx/knxeditor/tunneling.h
index 45458ca..4431223 100644
--- a/examples/knx/knxeditor/tunneling.h
+++ b/examples/knx/knxeditor/tunneling.h
@@ -93,6 +93,7 @@ public:
void setNatAware(bool isNatAware);
void setLocalAddress(const QHostAddress &address);
void setKnxNetIpServer(const QKnxNetIpServerInfo &server);
+ void setTcpEnable(bool value);
public slots:
void clearLogging();
@@ -117,6 +118,7 @@ private:
QKnxLinkLayerFrame m_frame;
QKnxNetIpTunnel m_tunnel;
QKnxNetIpServerInfo m_server;
+ QKnxNetIp::HostProtocol m_proto { QKnxNetIp::HostProtocol::UDP_IPv4 };
};
#endif