diff --git a/src/esp32_platform.cpp b/src/esp32_platform.cpp index ada8fd3d..a8c985ba 100644 --- a/src/esp32_platform.cpp +++ b/src/esp32_platform.cpp @@ -10,17 +10,42 @@ #define KNX_SERIAL Serial1 #endif +#ifndef KNX_UART_RX_PIN +#define KNX_UART_RX_PIN -1 +#endif + +#ifndef KNX_UART_TX_PIN +#define KNX_UART_TX_PIN -1 +#endif + Esp32Platform::Esp32Platform() #ifndef KNX_NO_DEFAULT_UART : ArduinoPlatform(&KNX_SERIAL) #endif { +#ifndef KNX_NO_DEFAULT_UART + knxUartPins(KNX_UART_RX_PIN, KNX_UART_TX_PIN); +#endif } Esp32Platform::Esp32Platform(HardwareSerial* s) : ArduinoPlatform(s) { } +void Esp32Platform::knxUartPins(int8_t rxPin, int8_t txPin) +{ + _rxPin = rxPin; + _txPin = txPin; +} + +// ESP specific uart handling with pins +void Esp32Platform::setupUart() +{ + _knxSerial->begin(19200, SERIAL_8E1, _rxPin, _txPin); + while (!_knxSerial) + ; +} + uint32_t Esp32Platform::currentIpAddress() { return WiFi.localIP(); diff --git a/src/esp32_platform.h b/src/esp32_platform.h index 0193efe4..318291cb 100644 --- a/src/esp32_platform.h +++ b/src/esp32_platform.h @@ -10,6 +10,10 @@ class Esp32Platform : public ArduinoPlatform Esp32Platform(); Esp32Platform(HardwareSerial* s); + // uart + void knxUartPins(int8_t rxPin, int8_t txPin); + void setupUart() override; + // ip stuff uint32_t currentIpAddress() override; uint32_t currentSubnetMask() override; @@ -36,6 +40,8 @@ class Esp32Platform : public ArduinoPlatform void commitToEeprom(); private: WiFiUDP _udp; + int8_t _rxPin = -1; + int8_t _txPin = -1; }; #endif diff --git a/src/knx/application_layer.cpp b/src/knx/application_layer.cpp index 7e9fe346..656be008 100644 --- a/src/knx/application_layer.cpp +++ b/src/knx/application_layer.cpp @@ -551,7 +551,7 @@ void ApplicationLayer::systemNetworkParameterReadResponse(Priority priority, Hop void ApplicationLayer::domainAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t* rfDoA, const uint8_t* knxSerialNumber) { - CemiFrame frame(11); + CemiFrame frame(13); APDU& apdu = frame.apdu(); apdu.type(DomainAddressSerialNumberResponse); @@ -567,19 +567,19 @@ void ApplicationLayer::domainAddressSerialNumberReadResponse(Priority priority, //TODO: ApplicationLayer::IndividualAddressSerialNumberWriteRequest() //TODO: ApplicationLayer::IndividualAddressSerialNumberReadRequest() -void ApplicationLayer::IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t* rfDoA, +void ApplicationLayer::IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t* domainAddress, const uint8_t* knxSerialNumber) { - CemiFrame frame(13); + CemiFrame frame(11); APDU& apdu = frame.apdu(); apdu.type(IndividualAddressSerialNumberResponse); uint8_t* data = apdu.data() + 1; memcpy(data, knxSerialNumber, 6); - memcpy(data + 6, rfDoA, 6); + memcpy(data + 6, domainAddress, 2); - //apdu.printPDU(); + //apdu.printPDU(); dataBroadcastRequest(AckDontCare, hopType, SystemPriority, apdu, secCtrl); } diff --git a/src/knx/application_layer.h b/src/knx/application_layer.h index 047befed..eac948af 100644 --- a/src/knx/application_layer.h +++ b/src/knx/application_layer.h @@ -158,7 +158,7 @@ class ApplicationLayer uint8_t* testResult, uint16_t testResultLength); void domainAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl& secCtrl, const uint8_t* rfDoA, const uint8_t* knxSerialNumber); - void IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl& secCtrl, const uint8_t* rfDoA, + void IndividualAddressSerialNumberReadResponse(Priority priority, HopCountType hopType, const SecurityControl& secCtrl, const uint8_t* domainAddress, const uint8_t* knxSerialNumber); #pragma endregion diff --git a/src/knx/bau07B0.cpp b/src/knx/bau07B0.cpp index 24057776..7a92028d 100644 --- a/src/knx/bau07B0.cpp +++ b/src/knx/bau07B0.cpp @@ -10,7 +10,8 @@ using namespace std; Bau07B0::Bau07B0(Platform& platform) : BauSystemBDevice(platform), - _dlLayer(_deviceObj, _netLayer.getInterface(), _platform, (ITpUartCallBacks&) *this) + _dlLayer(_deviceObj, _netLayer.getInterface(), _platform, (ITpUartCallBacks&) *this, (DataLinkLayerCallbacks*) this), + DataLinkLayerCallbacks() #ifdef USE_CEMI_SERVER , _cemiServer(*this) #endif diff --git a/src/knx/bau07B0.h b/src/knx/bau07B0.h index 5bdbad99..e37df3e4 100644 --- a/src/knx/bau07B0.h +++ b/src/knx/bau07B0.h @@ -8,7 +8,7 @@ #include "cemi_server.h" #include "cemi_server_object.h" -class Bau07B0 : public BauSystemBDevice, public ITpUartCallBacks +class Bau07B0 : public BauSystemBDevice, public ITpUartCallBacks, public DataLinkLayerCallbacks { public: Bau07B0(Platform& platform); diff --git a/src/knx/bau091A.cpp b/src/knx/bau091A.cpp index 53db8bb5..6ded1691 100644 --- a/src/knx/bau091A.cpp +++ b/src/knx/bau091A.cpp @@ -17,8 +17,9 @@ Bau091A::Bau091A(Platform& platform) : BauSystemBCoupler(platform), _routerObj(memory(), 0x200, 0x2000), // the Filtertable of 0x091A IP Routers is fixed at 0x200 and 0x2000 long _ipParameters(_deviceObj, platform), - _dlLayerPrimary(_deviceObj, _ipParameters, _netLayer.getPrimaryInterface(), _platform), - _dlLayerSecondary(_deviceObj, _netLayer.getSecondaryInterface(), platform, (ITpUartCallBacks&) *this) + _dlLayerPrimary(_deviceObj, _ipParameters, _netLayer.getPrimaryInterface(), _platform, (DataLinkLayerCallbacks*) this), + _dlLayerSecondary(_deviceObj, _netLayer.getSecondaryInterface(), platform, (ITpUartCallBacks&) *this, (DataLinkLayerCallbacks*) this), + DataLinkLayerCallbacks() #ifdef USE_CEMI_SERVER , _cemiServer(*this) diff --git a/src/knx/bau091A.h b/src/knx/bau091A.h index 56524e84..a48e1645 100644 --- a/src/knx/bau091A.h +++ b/src/knx/bau091A.h @@ -10,7 +10,7 @@ #include "tpuart_data_link_layer.h" #include "cemi_server_object.h" -class Bau091A : public BauSystemBCoupler, public ITpUartCallBacks +class Bau091A : public BauSystemBCoupler, public ITpUartCallBacks, public DataLinkLayerCallbacks { public: Bau091A(Platform& platform); diff --git a/src/knx/bau27B0.cpp b/src/knx/bau27B0.cpp index 9b119f9b..6180539a 100644 --- a/src/knx/bau27B0.cpp +++ b/src/knx/bau27B0.cpp @@ -169,10 +169,7 @@ void Bau27B0::domainAddressSerialNumberReadIndication(Priority priority, HopCoun void Bau27B0::individualAddressSerialNumberReadIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint8_t* knxSerialNumber) { - // If the received serial number matches our serial number - // then send a response with the current RF domain address stored in the RF medium object and the serial number - if (!memcmp(knxSerialNumber, _deviceObj.propertyData(PID_SERIAL_NUMBER), 6)) - _appLayer.IndividualAddressSerialNumberReadResponse(priority, hopType, secCtrl, _rfMediumObj.rfDomainAddress(), knxSerialNumber); + #pragma warning "individualAddressSerialNumberReadIndication is not available for rf" } void Bau27B0::domainAddressSerialNumberWriteLocalConfirm(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, const uint8_t* rfDoA, diff --git a/src/knx/bau57B0.cpp b/src/knx/bau57B0.cpp index c9b3827b..75522aa1 100644 --- a/src/knx/bau57B0.cpp +++ b/src/knx/bau57B0.cpp @@ -11,7 +11,8 @@ using namespace std; Bau57B0::Bau57B0(Platform& platform) : BauSystemBDevice(platform), _ipParameters(_deviceObj, platform), - _dlLayer(_deviceObj, _ipParameters, _netLayer.getInterface(), _platform) + _dlLayer(_deviceObj, _ipParameters, _netLayer.getInterface(), _platform, (DataLinkLayerCallbacks*) this), + DataLinkLayerCallbacks() #ifdef USE_CEMI_SERVER , _cemiServer(*this) diff --git a/src/knx/bau57B0.h b/src/knx/bau57B0.h index a381ebb4..f6309f93 100644 --- a/src/knx/bau57B0.h +++ b/src/knx/bau57B0.h @@ -8,7 +8,7 @@ #include "ip_data_link_layer.h" #include "cemi_server_object.h" -class Bau57B0 : public BauSystemBDevice +class Bau57B0 : public BauSystemBDevice, public DataLinkLayerCallbacks { public: Bau57B0(Platform& platform); diff --git a/src/knx/bau_systemB.cpp b/src/knx/bau_systemB.cpp index ca89a4a1..895ab577 100644 --- a/src/knx/bau_systemB.cpp +++ b/src/knx/bau_systemB.cpp @@ -549,7 +549,7 @@ void BauSystemB::individualAddressSerialNumberReadIndication(Priority priority, // An open medium BAU has to override this method and provide a proper domain address. if (!memcmp(knxSerialNumber, _deviceObj.propertyData(PID_SERIAL_NUMBER), 6)) { - uint8_t emptyDomainAddress[6] = {0x00}; + uint8_t emptyDomainAddress[2] = {0x00}; applicationLayer().IndividualAddressSerialNumberReadResponse(priority, hopType, secCtrl, emptyDomainAddress, knxSerialNumber); } } diff --git a/src/knx/data_link_layer.cpp b/src/knx/data_link_layer.cpp index 7cb72769..e20016e4 100644 --- a/src/knx/data_link_layer.cpp +++ b/src/knx/data_link_layer.cpp @@ -6,6 +6,18 @@ #include "cemi_server.h" #include "cemi_frame.h" + +void DataLinkLayerCallbacks::activity(uint8_t info) +{ + if(_activityCallback) + _activityCallback(info); +} + +void DataLinkLayerCallbacks::setActivityCallback(ActivityCallback activityCallback) +{ + _activityCallback = activityCallback; +} + DataLinkLayer::DataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity, Platform& platform) : _deviceObject(devObj), _networkLayerEntity(netLayerEntity), _platform(platform) { diff --git a/src/knx/data_link_layer.h b/src/knx/data_link_layer.h index 151128ec..554c98ce 100644 --- a/src/knx/data_link_layer.h +++ b/src/knx/data_link_layer.h @@ -10,6 +10,18 @@ class Platform; +typedef void (*ActivityCallback)(uint8_t info); + +class DataLinkLayerCallbacks +{ +protected: + ActivityCallback _activityCallback = nullptr; +public: + virtual ~DataLinkLayerCallbacks() = default; + virtual void activity(uint8_t info); + virtual void setActivityCallback(ActivityCallback activityCallback); +}; + class DataLinkLayer { public: diff --git a/src/knx/ip_data_link_layer.cpp b/src/knx/ip_data_link_layer.cpp index 9287971f..1b4142c6 100644 --- a/src/knx/ip_data_link_layer.cpp +++ b/src/knx/ip_data_link_layer.cpp @@ -33,7 +33,7 @@ #define MIN_LEN_CEMI 10 IpDataLinkLayer::IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam, - NetworkLayerEntity &netLayerEntity, Platform& platform) : DataLinkLayer(devObj, netLayerEntity, platform), _ipParameters(ipParam) + NetworkLayerEntity &netLayerEntity, Platform& platform, DataLinkLayerCallbacks* dllcb) : DataLinkLayer(devObj, netLayerEntity, platform), _ipParameters(ipParam), _dllcb(dllcb) { } @@ -45,7 +45,8 @@ bool IpDataLinkLayer::sendFrame(CemiFrame& frame) return false; bool success = sendBytes(packet.data(), packet.totalLength()); #ifdef KNX_ACTIVITYCALLBACK - knx.Activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR)); + if(_dllcb) + _dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR)); #endif dataConReceived(frame, success); return success; @@ -261,7 +262,8 @@ void IpDataLinkLayer::loop() return; #ifdef KNX_ACTIVITYCALLBACK - knx.Activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR)); + if(_dllcb) + _dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR)); #endif uint16_t code; @@ -282,18 +284,17 @@ void IpDataLinkLayer::loop() auto hpai = searchRequest.hpai(); #ifdef KNX_ACTIVITYCALLBACK - knx.Activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR) | (KNX_ACTIVITYCALLBACK_IPUNICAST)); + if(_dllcb) + _dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR) | (KNX_ACTIVITYCALLBACK_IPUNICAST)); #endif _platform.sendBytesUniCast(hpai.ipAddress(), hpai.ipPortNumber(), searchResponse.data(), searchResponse.totalLength()); break; } - case SearchRequestExt: { // FIXME, implement (not needed atm) break; } - #ifdef KNX_TUNNELING case ConnectRequest: { @@ -346,10 +347,8 @@ void IpDataLinkLayer::loop() } #endif default: -#if defined(KNX_LOG_TUNNELING) || defined(KNX_LOG_IP) print("Unhandled service identifier: "); println(code, HEX); -#endif break; } } diff --git a/src/knx/ip_data_link_layer.h b/src/knx/ip_data_link_layer.h index ef72b6de..20396615 100644 --- a/src/knx/ip_data_link_layer.h +++ b/src/knx/ip_data_link_layer.h @@ -14,7 +14,7 @@ class IpDataLinkLayer : public DataLinkLayer public: IpDataLinkLayer(DeviceObject& devObj, IpParameterObject& ipParam, NetworkLayerEntity& netLayerEntity, - Platform& platform); + Platform& platform, DataLinkLayerCallbacks* dllcb = nullptr); void loop(); void enabled(bool value); @@ -45,7 +45,7 @@ class IpDataLinkLayer : public DataLinkLayer bool isSendLimitReached(); IpParameterObject& _ipParameters; - + DataLinkLayerCallbacks* _dllcb; #ifdef KNX_TUNNELING KnxIpTunnelConnection tunnels[KNX_TUNNELING]; uint8_t _lastChannelId = 1; diff --git a/src/knx/tpuart_data_link_layer.cpp b/src/knx/tpuart_data_link_layer.cpp index d951a910..9aeaf5e7 100644 --- a/src/knx/tpuart_data_link_layer.cpp +++ b/src/knx/tpuart_data_link_layer.cpp @@ -553,9 +553,11 @@ void TpUartDataLinkLayer::setFrameRepetition(uint8_t nack, uint8_t busy) TpUartDataLinkLayer::TpUartDataLinkLayer(DeviceObject& devObj, NetworkLayerEntity &netLayerEntity, Platform& platform, - ITpUartCallBacks& cb) + ITpUartCallBacks& cb, + DataLinkLayerCallbacks* dllcb) : DataLinkLayer(devObj, netLayerEntity, platform), - _cb(cb) + _cb(cb), + _dllcb(dllcb) { } @@ -563,7 +565,8 @@ void TpUartDataLinkLayer::frameBytesReceived(uint8_t* buffer, uint16_t length) { //printHex("=>", buffer, length); #ifdef KNX_ACTIVITYCALLBACK - knx.Activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR)); + if(_dllcb) + _dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_RECV << KNX_ACTIVITYCALLBACK_DIR)); #endif CemiFrame frame(buffer, length); frameReceived(frame); @@ -672,7 +675,8 @@ bool TpUartDataLinkLayer::sendSingleFrameByte() { _TxByteCnt = 0; #ifdef KNX_ACTIVITYCALLBACK - knx.Activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR)); + if(_dllcb) + _dllcb->activity((_netIndex << KNX_ACTIVITYCALLBACK_NET) | (KNX_ACTIVITYCALLBACK_DIR_SEND << KNX_ACTIVITYCALLBACK_DIR)); #endif return false; } diff --git a/src/knx/tpuart_data_link_layer.h b/src/knx/tpuart_data_link_layer.h index eae6d286..8070f4fc 100644 --- a/src/knx/tpuart_data_link_layer.h +++ b/src/knx/tpuart_data_link_layer.h @@ -22,7 +22,9 @@ class TpUartDataLinkLayer : public DataLinkLayer public: TpUartDataLinkLayer(DeviceObject& devObj, NetworkLayerEntity& netLayerEntity, - Platform& platform, ITpUartCallBacks& cb); + Platform& platform, ITpUartCallBacks& cb, DataLinkLayerCallbacks* dllcb = nullptr); + + void loop(); void enabled(bool value); @@ -77,5 +79,6 @@ class TpUartDataLinkLayer : public DataLinkLayer void stopChip(); ITpUartCallBacks& _cb; + DataLinkLayerCallbacks* _dllcb; }; #endif diff --git a/src/knx_facade.h b/src/knx_facade.h index 75d8fdb3..84c7feaa 100644 --- a/src/knx_facade.h +++ b/src/knx_facade.h @@ -189,22 +189,6 @@ template class KnxFacade : private SaveRestore { _progLedOnCallback = progLedOnCallback; } - -#ifdef KNX_ACTIVITYCALLBACK - /// @brief sets the Callback Function indicating sent or received telegrams - /// @param activityCallback - /// @details the info parameter - void setActivityCallback(ActivityCallback activityCallback) - { - _activityCallback = activityCallback; - } - - void Activity(uint8_t info) - { - if(_activityCallback) - _activityCallback(info); - } -#endif int32_t buttonPin() { diff --git a/src/rp2040_arduino_platform.cpp b/src/rp2040_arduino_platform.cpp index 747b6549..b6da92d2 100644 --- a/src/rp2040_arduino_platform.cpp +++ b/src/rp2040_arduino_platform.cpp @@ -54,6 +54,15 @@ extern Wiznet5500lwIP KNX_NETIF; #elif defined(KNX_IP_WIFI) #elif defined(KNX_IP_GENERIC) + +#endif + +#ifndef KNX_UART_RX_PIN +#define KNX_UART_RX_PIN UART_PIN_NOT_DEFINED +#endif + +#ifndef KNX_UART_TX_PIN +#define KNX_UART_TX_PIN UART_PIN_NOT_DEFINED #endif RP2040ArduinoPlatform::RP2040ArduinoPlatform() @@ -61,6 +70,9 @@ RP2040ArduinoPlatform::RP2040ArduinoPlatform() : ArduinoPlatform(&KNX_SERIAL) #endif { + #ifndef KNX_NO_DEFAULT_UART + knxUartPins(KNX_UART_RX_PIN, KNX_UART_TX_PIN); + #endif #ifndef USE_RP2040_EEPROM_EMULATION _memoryType = Flash; #endif @@ -73,6 +85,18 @@ RP2040ArduinoPlatform::RP2040ArduinoPlatform( HardwareSerial* s) : ArduinoPlatfo #endif } +void RP2040ArduinoPlatform::knxUartPins(pin_size_t rxPin, pin_size_t txPin) +{ + SerialUART* serial = dynamic_cast(_knxSerial); + if(serial) + { + if (rxPin != UART_PIN_NOT_DEFINED) + serial->setRX(rxPin); + if (txPin != UART_PIN_NOT_DEFINED) + serial->setTX(txPin); + } +} + void RP2040ArduinoPlatform::setupUart() { SerialUART* serial = dynamic_cast(_knxSerial); @@ -245,7 +269,6 @@ void RP2040ArduinoPlatform::writeBufferedEraseBlock() #if defined(KNX_NETIF) uint32_t RP2040ArduinoPlatform::currentIpAddress() { - return KNX_NETIF.localIP(); } uint32_t RP2040ArduinoPlatform::currentSubnetMask() @@ -281,14 +304,12 @@ void RP2040ArduinoPlatform::setupMultiCast(uint32_t addr, uint16_t port) // _unicast_socket_setup = UDP_UNICAST.begin(3671); #endif -#ifdef KNX_LOG_IP - print("Setup Mcast addr: "); - print(mcastaddr.toString().c_str()); - print(" on port: "); - print(port); - print(" result "); - println(result); -#endif + // print("Setup Mcast addr: "); + // print(mcastaddr.toString().c_str()); + // print(" on port: "); + // print(port); + // print(" result "); + // println(result); } void RP2040ArduinoPlatform::closeMultiCast() @@ -298,10 +319,9 @@ void RP2040ArduinoPlatform::closeMultiCast() bool RP2040ArduinoPlatform::sendBytesMultiCast(uint8_t* buffer, uint16_t len) { -#ifdef KNX_LOG_IP - printHex("<- ",buffer, len); -#endif - //ToDo: check if Ethernet is able to receive + // printHex("<- ",buffer, len); + //ToDo: check if Ethernet is able to receive, return false if not + _udp.beginPacket(mcastaddr, _port); _udp.write(buffer, len); _udp.endPacket(); @@ -324,12 +344,11 @@ int RP2040ArduinoPlatform::readBytesMultiCast(uint8_t* buffer, uint16_t maxLen) } _udp.read(buffer, len); -#ifdef KNX_LOG_IP - print("Remote IP: "); - print(_udp.remoteIP().toString().c_str()); - printHex("-> ", buffer, len); -#endif + // print("Remote IP: "); + // print(_udp.remoteIP().toString().c_str()); + // printHex("-> ", buffer, len); + return len; } @@ -338,10 +357,8 @@ bool RP2040ArduinoPlatform::sendBytesUniCast(uint32_t addr, uint16_t port, uint8 { IPAddress ucastaddr(htonl(addr)); -#ifdef KNX_LOG_IP - print("sendBytesUniCast to:"); - println(ucastaddr.toString().c_str()); -#endif + // print("sendBytesUniCast to:"); + // println(ucastaddr.toString().c_str()); #ifdef KNX_IP_GENERIC if(!_unicast_socket_setup) diff --git a/src/rp2040_arduino_platform.h b/src/rp2040_arduino_platform.h index e6df5466..b71b3b4d 100644 --- a/src/rp2040_arduino_platform.h +++ b/src/rp2040_arduino_platform.h @@ -65,6 +65,8 @@ class RP2040ArduinoPlatform : public ArduinoPlatform RP2040ArduinoPlatform(); RP2040ArduinoPlatform( HardwareSerial* s); + // uart + void knxUartPins(pin_size_t rxPin, pin_size_t txPin); void setupUart(); // unique serial number