From bb94e6351ffc18925c158e90a04b2d29d35e60e6 Mon Sep 17 00:00:00 2001 From: Mike <45664417+thewhobox@users.noreply.github.com> Date: Mon, 12 Feb 2024 12:32:47 +0100 Subject: [PATCH] added ack for tunneling --- src/knx/bau091A.cpp | 17 +++++------------ src/knx/ip_data_link_layer.cpp | 16 ++++++++++++++++ src/knx/ip_data_link_layer.h | 1 + 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/knx/bau091A.cpp b/src/knx/bau091A.cpp index 60ed7a79..ccbafa7a 100644 --- a/src/knx/bau091A.cpp +++ b/src/knx/bau091A.cpp @@ -183,6 +183,9 @@ TPAckType Bau091A::isAckRequired(uint16_t address, bool isGrpAddr) else // all are ACKED ack = TPAckType::AckReqAck; + + if(_dlLayerPrimary.isAckRequired(address, isGrpAddr)) + ack = TPAckType::AckReqAck; } else { @@ -197,18 +200,8 @@ TPAckType Bau091A::isAckRequired(uint16_t address, bool isGrpAddr) ack = TPAckType::AckReqNone; #ifdef KNX_TUNNELING - const uint8_t *addresses = _ipParameters.propertyData(PID_ADDITIONAL_INDIVIDUAL_ADDRESSES); - for(int i = 0; i < KNX_TUNNELING; i++) - { - uint16_t pa = 0; - popWord(pa, addresses + (i*2)); - - if(address == pa) - { - ack = TPAckType::AckReqAck; - break; - } - } + if(_dlLayerPrimary.isAckRequired(address, isGrpAddr)) + ack = TPAckType::AckReqAck; #endif } diff --git a/src/knx/ip_data_link_layer.cpp b/src/knx/ip_data_link_layer.cpp index cea80096..035c197b 100644 --- a/src/knx/ip_data_link_layer.cpp +++ b/src/knx/ip_data_link_layer.cpp @@ -227,6 +227,22 @@ bool IpDataLinkLayer::isTunnelAddress(uint16_t addr) return false; } + +bool IpDataLinkLayer::isAckRequired(uint16_t address, bool isGrpAddr) +{ + if(isGrpAddr) + { + for(int i = 0; i < KNX_TUNNELING; i++) + if(tunnels[i].ChannelId != 0) + return true; + return false; + } else { + for(int i = 0; i < KNX_TUNNELING; i++) + if(tunnels[i].ChannelId != 0 && tunnels[i].IndividualAddress == address) + return true; + return false; + } +} #endif void IpDataLinkLayer::loop() diff --git a/src/knx/ip_data_link_layer.h b/src/knx/ip_data_link_layer.h index efd465c2..1bb5fabc 100644 --- a/src/knx/ip_data_link_layer.h +++ b/src/knx/ip_data_link_layer.h @@ -25,6 +25,7 @@ class IpDataLinkLayer : public DataLinkLayer void dataConfirmationToTunnel(CemiFrame& frame) override; void dataIndicationToTunnel(CemiFrame& frame) override; bool isTunnelAddress(uint16_t addr) override; + bool isAckRequired(uint16_t address, bool isGrpAddr); #endif private: