diff --git a/src/knx/bau091A.cpp b/src/knx/bau091A.cpp index b36ac9c..8eee0db 100644 --- a/src/knx/bau091A.cpp +++ b/src/knx/bau091A.cpp @@ -33,6 +33,9 @@ Bau091A::Bau091A(Platform& platform) _memory.addSaveRestore(&_cemiServerObject); #endif + _memory.addSaveRestore(&_rtObjPrimary); + _memory.addSaveRestore(&_rtObjSecondary); + _memory.addSaveRestore(&_ipParameters); // Set Mask Version in Device Object depending on the BAU diff --git a/src/knx/router_object_filtertable.cpp b/src/knx/router_object_filtertable.cpp index 274522a..7e9d892 100644 --- a/src/knx/router_object_filtertable.cpp +++ b/src/knx/router_object_filtertable.cpp @@ -51,7 +51,7 @@ RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory) return 1; }), - new DataProperty( PID_MCB_TABLE, false, PDT_GENERIC_08, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // TODO + new DataProperty( PID_MCB_TABLE, false, PDT_GENERIC_08, 1, ReadLv3 | WriteLv0), new FunctionProperty(this, PID_ROUTETABLE_CONTROL, // Command Callback of PID_ROUTETABLE_CONTROL @@ -105,6 +105,8 @@ const uint8_t* RouterObjectFilterTable::restore(const uint8_t* buffer) else _data = 0; + _filterTableGroupAddresses = (uint16_t*)_data; + return RouterObject::restore(buffer); } @@ -357,6 +359,32 @@ void RouterObjectFilterTable::errorCode(ErrorCode errorCode) prop->write(data); } +void RouterObjectFilterTable::beforeStateChange(LoadState& newState) +{ + if (newState != LS_LOADED) + return; + + // calculate crc16-ccitt for PID_MCB_TABLE + updateMcb(); + + _filterTableGroupAddresses = (uint16_t*)_data; +} + +void RouterObjectFilterTable::updateMcb() +{ + uint8_t mcb[propertySize(PID_MCB_TABLE)]; + + static constexpr uint32_t segmentSize = 8192; + uint16_t crc16 = crc16Ccitt(_data, segmentSize); + + pushInt(segmentSize, &mcb[0]); // Segment size + pushByte(0x00, &mcb[4]); // CRC control byte -> 0: always valid -> according to coupler spec. it shall always be a valid CRC + pushByte(0xFF, &mcb[5]); // Read access 4 bits + Write access 4 bits (unknown: value taken from real coupler device) + pushWord(crc16, &mcb[6]); // CRC-16 CCITT of filter table + + property(PID_MCB_TABLE)->write(mcb); +} + void RouterObjectFilterTable::masterReset(EraseCode eraseCode, uint8_t channel) { RouterObject::masterReset(eraseCode, channel); diff --git a/src/knx/router_object_filtertable.h b/src/knx/router_object_filtertable.h index 29d3b07..b3e3b72 100644 --- a/src/knx/router_object_filtertable.h +++ b/src/knx/router_object_filtertable.h @@ -23,11 +23,14 @@ public: const uint8_t* restore(const uint8_t* buffer) override; uint16_t saveSize() override; + private: // Function properties void functionRouteTableControl(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength); void functionRfEnableSbc(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength); + void updateMcb(); + uint32_t tableReference(); bool allocTable(uint32_t size, bool doFill, uint8_t fillByte); void errorCode(ErrorCode errorCode); @@ -38,6 +41,7 @@ private: void loadEventLoaded(const uint8_t* data); void loadEventError(const uint8_t* data); void additionalLoadControls(const uint8_t* data); + void beforeStateChange(LoadState& newState); void loadState(LoadState newState); LoadState _state = LS_UNLOADED; @@ -45,4 +49,5 @@ private: Memory& _memory; uint8_t *_data = 0; bool _rfSbcRoutingEnabled = false; + uint16_t* _filterTableGroupAddresses = 0; };