diff --git a/src/arduino_platform.h b/src/arduino_platform.h index 3b44101..82432a9 100644 --- a/src/arduino_platform.h +++ b/src/arduino_platform.h @@ -1,3 +1,5 @@ +#pragma once + #include "knx/platform.h" #include "Arduino.h" diff --git a/src/esp32_platform.cpp b/src/esp32_platform.cpp index d3e0620..70fc9c0 100644 --- a/src/esp32_platform.cpp +++ b/src/esp32_platform.cpp @@ -8,6 +8,15 @@ #ifndef KNX_SERIAL #define KNX_SERIAL Serial1 + #pragma warn "KNX_SERIAL not defined, using Serial1" +#endif + +#ifdef KNX_IP_LAN + #include "ETH.h" + #define KNX_NETIF ETH +#else // KNX_IP_WIFI + #include + #define KNX_NETIF WiFi #endif Esp32Platform::Esp32Platform() @@ -44,22 +53,22 @@ void Esp32Platform::setupUart() uint32_t Esp32Platform::currentIpAddress() { - return WiFi.localIP(); + return KNX_NETIF.localIP(); } uint32_t Esp32Platform::currentSubnetMask() { - return WiFi.subnetMask(); + return KNX_NETIF.subnetMask(); } uint32_t Esp32Platform::currentDefaultGateway() { - return WiFi.gatewayIP(); + return KNX_NETIF.gatewayIP(); } void Esp32Platform::macAddress(uint8_t* addr) { - esp_wifi_get_mac(WIFI_IF_STA, addr); + KNX_NETIF.macAddress(addr); } uint32_t Esp32Platform::uniqueSerialNumber() @@ -81,7 +90,7 @@ void Esp32Platform::setupMultiCast(uint32_t addr, uint16_t port) IPAddress mcastaddr(htonl(addr)); KNX_DEBUG_SERIAL.printf("setup multicast addr: %s port: %d ip: %s\n", mcastaddr.toString().c_str(), port, - WiFi.localIP().toString().c_str()); + KNX_NETIF.localIP().toString().c_str()); uint8_t result = _udp.beginMulticast(mcastaddr, port); KNX_DEBUG_SERIAL.printf("result %d\n", result); } diff --git a/src/esp32_platform.h b/src/esp32_platform.h index 4f8fb8f..3ace355 100644 --- a/src/esp32_platform.h +++ b/src/esp32_platform.h @@ -1,9 +1,10 @@ #ifdef ARDUINO_ARCH_ESP32 #include "arduino_platform.h" -#include -#include + +#include + class Esp32Platform : public ArduinoPlatform { public: diff --git a/src/knx/bau091A.cpp b/src/knx/bau091A.cpp index 331cbbe..d468ef7 100644 --- a/src/knx/bau091A.cpp +++ b/src/knx/bau091A.cpp @@ -188,19 +188,25 @@ TPAckType Bau091A::isAckRequired(uint16_t address, bool isGrpAddr) { // ACK for broadcasts if (address == 0) + { ack = TPAckType::AckReqAck; - - if (lcconfig & LCCONFIG::GROUP_IACK_ROUT) - - // is group address in filter table? ACK if yes, No if not - if (_netLayer.isRoutedGroupAddress(address, 1)) - ack = TPAckType::AckReqAck; - else - ack = TPAckType::AckReqNone; + } else - // all are ACKED - ack = TPAckType::AckReqAck; - + { + if(lcconfig & LCCONFIG::GROUP_IACK_ROUT) + { + // is group address in filter table? ACK if yes, No if not + if(_netLayer.isRoutedGroupAddress(address, 1)) + ack = TPAckType::AckReqAck; + else + ack = TPAckType::AckReqNone; + } + else + { + // all are ACKED + ack = TPAckType::AckReqAck; + } + } #ifdef KNX_TUNNELING if (_dlLayerPrimary.isSentToTunnel(address, isGrpAddr)) @@ -226,7 +232,6 @@ TPAckType Bau091A::isAckRequired(uint16_t address, bool isGrpAddr) #endif } - return ack; } diff --git a/src/knx/device_object.h b/src/knx/device_object.h index 8bfd2d2..fb3fd74 100644 --- a/src/knx/device_object.h +++ b/src/knx/device_object.h @@ -6,15 +6,15 @@ class DeviceObject: public InterfaceObject { - public: - // increase this version anytime DeviceObject-API changes - // the following value represents the serialized representation of DeviceObject. - const uint16_t apiVersion = 1; - - DeviceObject(); - uint8_t* save(uint8_t* buffer) override; - const uint8_t* restore(const uint8_t* buffer) override; - uint16_t saveSize() override; +public: + // increase this version anytime DeviceObject-API changes + // the following value represents the serialized representation of DeviceObject. + const uint16_t apiVersion = 2; + + DeviceObject(); + uint8_t* save(uint8_t* buffer) override; + const uint8_t* restore(const uint8_t* buffer) override; + uint16_t saveSize() override; uint16_t individualAddress(); void individualAddress(uint16_t value); diff --git a/src/knx/group_object.cpp b/src/knx/group_object.cpp index dcec322..a37fa1f 100644 --- a/src/knx/group_object.cpp +++ b/src/knx/group_object.cpp @@ -312,6 +312,7 @@ bool GroupObject::valueNoSend(const KNXValue& value, const Dpt& type) commFlag(Ok); return encodingDone; + return encodingDone; } bool GroupObject::valueNoSendCompare(const KNXValue& value, const Dpt& type) diff --git a/src/knx/ip_data_link_layer.cpp b/src/knx/ip_data_link_layer.cpp index 5f853b7..461350c 100644 --- a/src/knx/ip_data_link_layer.cpp +++ b/src/knx/ip_data_link_layer.cpp @@ -504,9 +504,8 @@ void IpDataLinkLayer::loopHandleSearchRequestExtended(uint8_t* buffer, uint16_t if (searchRequest.srpRequestDIBs) { - println("srpRequestDIBs"); - - if (searchRequest.requestedDIB(IP_CONFIG)) + //println("srpRequestDIBs"); + if(searchRequest.requestedDIB(IP_CONFIG)) dibLength += LEN_IP_CONFIG_DIB; //16 if (searchRequest.requestedDIB(IP_CUR_CONFIG)) @@ -556,9 +555,9 @@ void IpDataLinkLayer::loopHandleSearchRequestExtended(uint8_t* buffer, uint16_t searchResponse.setTunnelingInfo(_ipParameters, _deviceObject, tunnels); } - if (searchResponse.totalLength() > 150) + if(searchResponse.totalLength() > 500) { - println("skipped response cause length is not plausible"); + printf("skipped response length > 500. Length: %d bytes\n", searchResponse.totalLength()); return; } @@ -715,8 +714,7 @@ void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length, tunnelResOptions[i] = (*(tunCtrlBytes + i) & 0x60) >> 5; } - - if (tunnelResActive[i]) // tunnel reserve feature active for this tunnel + if(resTunActive && tunnelResActive[i]) // tunnel reserve feature active for this tunnel { #ifdef KNX_LOG_TUNNELING print("tunnel reserve feature active for this tunnel: "); @@ -834,8 +832,9 @@ void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length, tun = nullptr; break; } + if(tun) + tun->IndividualAddress = tunPa; - tun->IndividualAddress = tunPa; } if (tun == nullptr) @@ -869,8 +868,8 @@ void IpDataLinkLayer::loopHandleConnectRequest(uint8_t* buffer, uint16_t length, _lastChannelId = 0; tun->IpAddress = srcIP; - tun->PortData = srcPort; - tun->PortCtrl = connRequest.hpaiCtrl().ipPortNumber() ? connRequest.hpaiCtrl().ipPortNumber() : srcPort; + tun->PortData = connRequest.hpaiData().ipPortNumber()?connRequest.hpaiData().ipPortNumber():srcPort; + tun->PortCtrl = connRequest.hpaiCtrl().ipPortNumber()?connRequest.hpaiCtrl().ipPortNumber():srcPort; print("New Tunnel-Connection["); print(tunIdx); diff --git a/src/knx/ip_data_link_layer.h b/src/knx/ip_data_link_layer.h index 56827ca..d8e7227 100644 --- a/src/knx/ip_data_link_layer.h +++ b/src/knx/ip_data_link_layer.h @@ -52,8 +52,8 @@ class IpDataLinkLayer : public DataLinkLayer IpParameterObject& _ipParameters; DataLinkLayerCallbacks* _dllcb; #ifdef KNX_TUNNELING - KnxIpTunnelConnection tunnels[KNX_TUNNELING]; - uint8_t _lastChannelId = 1; + KnxIpTunnelConnection tunnels[KNX_TUNNELING]; + uint8_t _lastChannelId = 0; #endif }; #endif \ No newline at end of file diff --git a/src/knx/knx_ip_connect_response.cpp b/src/knx/knx_ip_connect_response.cpp index 2706341..0d59293 100644 --- a/src/knx/knx_ip_connect_response.cpp +++ b/src/knx/knx_ip_connect_response.cpp @@ -17,7 +17,8 @@ KnxIpConnectResponse::KnxIpConnectResponse(IpParameterObject& parameters, uint16 _crd.length((type == 4) ? 4 : 2); //TunnelConnectionResponse length = 4; ConfigConnectionResponse length = 2; _crd.type(type); - _crd.address(address); + if(type == 4) // only fill address when it is a TunnelConnectionResponse + _crd.address(address); } KnxIpConnectResponse::KnxIpConnectResponse(uint8_t channel, uint8_t errorCode) diff --git a/src/knx/knx_ip_search_response_extended.cpp b/src/knx/knx_ip_search_response_extended.cpp index c624532..1bd2acd 100644 --- a/src/knx/knx_ip_search_response_extended.cpp +++ b/src/knx/knx_ip_search_response_extended.cpp @@ -34,7 +34,7 @@ KnxIpSearchResponseExtended::KnxIpSearchResponseExtended(IpParameterObject& para void KnxIpSearchResponseExtended::setDeviceInfo(IpParameterObject& parameters, DeviceObject& deviceObject) { - println("setDeviceInfo"); + //setDeviceInfo"); KnxIpDeviceInformationDIB _deviceInfo(_data + currentPos); _deviceInfo.length(LEN_DEVICE_INFORMATION_DIB); _deviceInfo.code(DEVICE_INFO); @@ -65,7 +65,7 @@ void KnxIpSearchResponseExtended::setDeviceInfo(IpParameterObject& parameters, D void KnxIpSearchResponseExtended::setSupportedServices() { - println("setSupportedServices"); + //println("setSupportedServices"); KnxIpSupportedServiceDIB _supportedServices(_data + currentPos); _supportedServices.length(LEN_SERVICE_DIB); _supportedServices.code(SUPP_SVC_FAMILIES); @@ -82,7 +82,7 @@ void KnxIpSearchResponseExtended::setSupportedServices() void KnxIpSearchResponseExtended::setIpConfig(IpParameterObject& parameters) { - println("setIpConfig"); + //println("setIpConfig"); KnxIpConfigDIB _ipConfig(_data + currentPos); _ipConfig.length(LEN_IP_CONFIG_DIB); _ipConfig.code(IP_CONFIG); @@ -97,14 +97,14 @@ void KnxIpSearchResponseExtended::setIpConfig(IpParameterObject& parameters) void KnxIpSearchResponseExtended::setIpCurrentConfig(IpParameterObject& parameters) { - println("setIpCurrentConfig"); + //println("setIpCurrentConfig"); KnxIpConfigDIB _ipCurConfig(_data + currentPos, true); _ipCurConfig.length(LEN_IP_CURRENT_CONFIG_DIB); _ipCurConfig.code(IP_CUR_CONFIG); _ipCurConfig.address(parameters.propertyValue(PID_CURRENT_IP_ADDRESS)); _ipCurConfig.subnet(parameters.propertyValue(PID_CURRENT_SUBNET_MASK)); _ipCurConfig.gateway(parameters.propertyValue(PID_CURRENT_DEFAULT_GATEWAY)); - _ipCurConfig.dhcp(parameters.propertyValue(PID_DHCP_BOOTP_SERVER)); + _ipCurConfig.dhcp(0); _ipCurConfig.info1(parameters.propertyValue(PID_CURRENT_IP_ASSIGNMENT_METHOD)); _ipCurConfig.info2(0x00); //Reserved @@ -113,7 +113,7 @@ void KnxIpSearchResponseExtended::setIpCurrentConfig(IpParameterObject& paramete void KnxIpSearchResponseExtended::setKnxAddresses(IpParameterObject& parameters, DeviceObject& deviceObject) { - println("setKnxAddresses"); + //println("setKnxAddresses"); KnxIpKnxAddressesDIB _knxAddresses(_data + currentPos); _knxAddresses.length(4); //minimum _knxAddresses.code(KNX_ADDRESSES); @@ -136,7 +136,7 @@ void KnxIpSearchResponseExtended::setKnxAddresses(IpParameterObject& parameters, void KnxIpSearchResponseExtended::setTunnelingInfo(IpParameterObject& parameters, DeviceObject& deviceObject, KnxIpTunnelConnection tunnels[]) { - println("setTunnelingInfo"); + //println("setTunnelingInfo"); KnxIpTunnelingInfoDIB _tunnelInfo(_data + currentPos); _tunnelInfo.length(4); //minlength _tunnelInfo.code(TUNNELING_INFO); @@ -202,7 +202,7 @@ void KnxIpSearchResponseExtended::setTunnelingInfo(IpParameterObject& parameters void KnxIpSearchResponseExtended::setExtendedDeviceInfo() { - println("setExtendedDeviceInfo"); + //println("setExtendedDeviceInfo"); KnxIpExtendedDeviceInformationDIB _extended(_data + currentPos); _extended.length(LEN_EXTENDED_DEVICE_INFORMATION_DIB); _extended.code(EXTENDED_DEVICE_INFO); diff --git a/src/knx/knx_ip_tunnel_connection.cpp b/src/knx/knx_ip_tunnel_connection.cpp index 9d4fe2a..06a04a8 100644 --- a/src/knx/knx_ip_tunnel_connection.cpp +++ b/src/knx/knx_ip_tunnel_connection.cpp @@ -7,6 +7,11 @@ KnxIpTunnelConnection::KnxIpTunnelConnection() void KnxIpTunnelConnection::Reset() { + print("Close Tunnel-Connection["); + print("?"); + print("], Channel: 0x"); + println(ChannelId, 16); + ChannelId = 0; IpAddress = 0; PortData = 0; diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index ed1012a..b5f15b7 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -656,6 +656,24 @@ void TpUartDataLinkLayer::requestConfig() if (markerMode()) _platform.writeUart(U_CONFIGURE_REQ | U_CONFIGURE_MARKER_REQ); +#endif + + // Set Address for AutoACK Unicast + const uint16_t address = _deviceObject.individualAddress(); + _platform.writeUart(U_SET_ADDRESS_REQ); + _platform.writeUart((address >> 8) & 0xFF); + _platform.writeUart(address & 0xFF); +#ifdef NCN5120 + _platform.writeUart(0xFF); // Dummy Byte needed by NCN only +#endif + + // Set Address for AutoACK Unicast + const uint16_t address = _deviceObject.individualAddress(); + _platform.writeUart(U_SET_ADDRESS_REQ); + _platform.writeUart((address >> 8) & 0xFF); + _platform.writeUart(address & 0xFF); +#ifdef NCN5120 + _platform.writeUart(0xFF); // Dummy Byte needed by NCN only #endif // Deviating Config diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index 44ae730..1145a37 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -470,12 +470,7 @@ uint32_t RP2040ArduinoPlatform::currentDefaultGateway() } void RP2040ArduinoPlatform::macAddress(uint8_t* addr) { -#if defined(KNX_IP_LAN) - addr = KNX_NETIF.getNetIf()->hwaddr; -#else - uint8_t macaddr[6] = {0, 0, 0, 0, 0, 0}; - addr = KNX_NETIF.macAddress(macaddr); -#endif + KNX_NETIF.macAddress(addr); } // multicast