diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-08-17 15:59:08 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2018-08-17 14:03:59 +0000 |
commit | 8763466514a6c97fb63d95177726c2300e491f16 (patch) | |
tree | 3b6b2740d9cdf76b120a0a9b21b77c9bc47ca445 | |
parent | 870ae42e3a6593e73b0999c45e2a7908c14dc6d1 (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.cpp | 7 | ||||
-rw-r--r-- | src/knx/netip/qknxnetiproutinginterface.h | 1 | ||||
-rw-r--r-- | src/knx/netip/qknxnetiproutinginterface_p.cpp | 17 | ||||
-rw-r--r-- | src/knx/netip/qknxnetiproutinginterface_p.h | 1 | ||||
-rw-r--r-- | tests/auto/qknxnetiproutinginterface/tst_qknxnetiproutinginterface.cpp | 60 |
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) |