summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2018-08-17 15:59:08 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2018-08-17 14:03:59 +0000
commit8763466514a6c97fb63d95177726c2300e491f16 (patch)
tree3b6b2740d9cdf76b120a0a9b21b77c9bc47ca445
parent870ae42e3a6593e73b0999c45e2a7908c14dc6d1 (diff)
AN183: Add support for receiving routing system broadcast frames
Change-Id: I78ef9f283a1a8a1b503a78f62164fc4c0bd9b470 Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r--src/knx/netip/qknxnetiproutinginterface.cpp7
-rw-r--r--src/knx/netip/qknxnetiproutinginterface.h1
-rw-r--r--src/knx/netip/qknxnetiproutinginterface_p.cpp17
-rw-r--r--src/knx/netip/qknxnetiproutinginterface_p.h1
-rw-r--r--tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp60
5 files changed, 70 insertions, 16 deletions
diff --git a/src/knx/netip/qknxnetiproutinginterface.cpp b/src/knx/netip/qknxnetiproutinginterface.cpp
index 0f7b0a3..3da5e9b 100644
--- a/src/knx/netip/qknxnetiproutinginterface.cpp
+++ b/src/knx/netip/qknxnetiproutinginterface.cpp
@@ -242,6 +242,13 @@ QT_BEGIN_NAMESPACE
*/
/*!
+ \fn void QKnxNetIpRoutingInterface::routingSystemBroadcastReceived(QKnxNetIpFrame frame)
+
+ This signal is emitted when the KNXnet/IP router receives the routing system
+ broadcast \a frame.
+*/
+
+/*!
\fn void QKnxNetIpRoutingInterface::stateChanged(QKnxNetIpRoutingInterface::State state)
This signal is emitted when the KNXnet/IP router transitions to a different
diff --git a/src/knx/netip/qknxnetiproutinginterface.h b/src/knx/netip/qknxnetiproutinginterface.h
index 29365fc..9b1bc40 100644
--- a/src/knx/netip/qknxnetiproutinginterface.h
+++ b/src/knx/netip/qknxnetiproutinginterface.h
@@ -128,6 +128,7 @@ Q_SIGNALS:
void routingIndicationReceived(QKnxNetIpFrame frame, QKnxNetIpRoutingInterface::FilterAction action);
void routingBusyReceived(QKnxNetIpFrame frame);
void routingLostCountReceived(QKnxNetIpFrame frame);
+ void routingSystemBroadcastReceived(QKnxNetIpFrame frame);
void stateChanged(QKnxNetIpRoutingInterface::State state);
void errorOccurred(QKnxNetIpRoutingInterface::Error error, QString errorString);
diff --git a/src/knx/netip/qknxnetiproutinginterface_p.cpp b/src/knx/netip/qknxnetiproutinginterface_p.cpp
index 273f6d7..30f4dd8 100644
--- a/src/knx/netip/qknxnetiproutinginterface_p.cpp
+++ b/src/knx/netip/qknxnetiproutinginterface_p.cpp
@@ -32,6 +32,7 @@
#include "qknxnetiproutinginterface_p.h"
#include "qknxnetiproutinginterface.h"
#include "qknxnetiproutinglostmessage.h"
+#include "qknxnetiproutingsystembroadcast.h"
#ifdef QT_BUILD_INTERNAL
#include "qknxtestingrouter_p.h"
@@ -190,6 +191,9 @@ void QKnxNetIpRoutingInterfacePrivate::start()
case QKnxNetIp::ServiceType::RoutingLostMessage:
processRoutingLostMessage(QKnxNetIpFrame::fromBytes(data, 0));
break;
+ case QKnxNetIp::ServiceType::RoutingSystemBroadcast:
+ processRoutingSystemBroadcast(QKnxNetIpFrame::fromBytes(data, 0));
+ break;
default:
break;
}
@@ -310,6 +314,19 @@ void QKnxNetIpRoutingInterfacePrivate::processRoutingLostMessage(const QKnxNetIp
emit q->routingLostCountReceived(frame);
}
+void QKnxNetIpRoutingInterfacePrivate::processRoutingSystemBroadcast(const QKnxNetIpFrame &frame)
+{
+ QKnxNetIpRoutingSystemBroadcastProxy sbc(frame);
+ if (sbc.isValid()) {
+ Q_Q(QKnxNetIpRoutingInterface);
+ emit q->routingSystemBroadcastReceived(frame);
+ } else {
+ errorOccurred(QKnxNetIpRoutingInterface::Error::KnxRouting,
+ QKnxNetIpRoutingInterface::tr("QKnxNetIp Routing System Broadcast is not correctly "
+ "formed."));
+ }
+}
+
bool QKnxNetIpRoutingInterfacePrivate::sendFrame(const QKnxNetIpFrame &frame)
{
if (m_state != QKnxNetIpRoutingInterface::State::Routing)
diff --git a/src/knx/netip/qknxnetiproutinginterface_p.h b/src/knx/netip/qknxnetiproutinginterface_p.h
index 2b1648a..6bf9e9e 100644
--- a/src/knx/netip/qknxnetiproutinginterface_p.h
+++ b/src/knx/netip/qknxnetiproutinginterface_p.h
@@ -70,6 +70,7 @@ public:
void processRoutingIndication(const QKnxNetIpFrame &frame);
void processRoutingBusy(const QKnxNetIpFrame &frame);
void processRoutingLostMessage(const QKnxNetIpFrame &frame);
+ void processRoutingSystemBroadcast(const QKnxNetIpFrame &frame);
bool sendFrame(const QKnxNetIpFrame &frame);
diff --git a/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp b/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
index 548e3aa..420ae6f 100644
--- a/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
+++ b/tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp
@@ -68,6 +68,7 @@ private slots:
void test_routing_receives_busy();
void test_routing_busy_sent_packets_same_individual_address();
void test_routing_interface_sends_system_broadcast();
+ void test_routing_interface_receives_system_broadcast();
void test_routing_filter();
void test_routing_filter_data();
@@ -407,13 +408,8 @@ void tst_QKnxNetIpRoutingInterface::test_routing_busy_sent_packets_same_individu
QCOMPARE(m_routingInterface.state(), QKnxNetIpRoutingInterface::State::NeighborBusy);
}
-void tst_QKnxNetIpRoutingInterface::test_routing_interface_sends_system_broadcast()
+QKnxLinkLayerFrame generateDummySbcFrame()
{
- if (!runTests)
- return;
-
- m_routingInterface.start();
-
auto dst = QKnxAddress::createGroup(1, 1, 1);
auto tpdu = QKnxTpduFactory::Multicast::createGroupValueReadTpdu();
auto ctrl = QKnxControlField::builder()
@@ -427,15 +423,23 @@ void tst_QKnxNetIpRoutingInterface::test_routing_interface_sends_system_broadcas
.setHopCount(6)
.create();
- auto frame = QKnxLinkLayerFrame::builder()
- .setControlField(ctrl)
- .setExtendedControlField(extCtrl)
- .setTpdu(tpdu)
- .setDestinationAddress(dst)
- .setSourceAddress({ QKnxAddress::Type::Individual, 0 })
- .setMessageCode(QKnxLinkLayerFrame::MessageCode::DataIndication)
- .setMedium(QKnx::MediumType::NetIP)
- .createFrame();
+ return QKnxLinkLayerFrame::builder()
+ .setControlField(ctrl)
+ .setExtendedControlField(extCtrl)
+ .setTpdu(tpdu)
+ .setDestinationAddress(dst)
+ .setSourceAddress({ QKnxAddress::Type::Individual, 0 })
+ .setMessageCode(QKnxLinkLayerFrame::MessageCode::DataIndication)
+ .setMedium(QKnx::MediumType::NetIP)
+ .createFrame();
+}
+
+void tst_QKnxNetIpRoutingInterface::test_routing_interface_sends_system_broadcast()
+{
+ if (!runTests)
+ return;
+
+ m_routingInterface.start();
bool sbcSent = false;
QObject::connect(&m_routingInterface,
@@ -444,10 +448,34 @@ void tst_QKnxNetIpRoutingInterface::test_routing_interface_sends_system_broadcas
QKnxNetIpRoutingSystemBroadcastProxy sbc(frame);
QVERIFY(sbc.isValid());
});
- m_routingInterface.sendRoutingSystemBroadcast(frame);
+ m_routingInterface.sendRoutingSystemBroadcast(generateDummySbcFrame());
QVERIFY(sbcSent);
}
+void tst_QKnxNetIpRoutingInterface::test_routing_interface_receives_system_broadcast()
+{
+ if (!runTests)
+ return;
+
+ m_routingInterface.start();
+
+ bool sbcRcvEmitted = false;
+ QObject::connect(&m_routingInterface,
+ &QKnxNetIpRoutingInterface::routingSystemBroadcastReceived
+ , [&](QKnxNetIpFrame frame) {
+ sbcRcvEmitted = true;
+ QKnxNetIpRoutingSystemBroadcastProxy sbc(frame);
+ QVERIFY(sbc.isValid());
+ });
+
+ auto netIpFrame = QKnxNetIpRoutingSystemBroadcastProxy::builder()
+ .setCemi(generateDummySbcFrame())
+ .create();
+
+ simulateFramesReceived(netIpFrame);
+ QVERIFY(sbcRcvEmitted);
+}
+
void tst_QKnxNetIpRoutingInterface::test_routing_filter()
{
if (!runTests)