From 9a6d5cecf457273db1ff40faebf241af61cdbdbf Mon Sep 17 00:00:00 2001 From: Nanosonde <2073569+nanosonde@users.noreply.github.com> Date: Wed, 15 Jul 2020 17:50:54 +0200 Subject: [PATCH] save work --- examples/knx-linux/CMakeLists.txt | 2 - src/knx/bau_systemB_coupler.cpp | 5 +- src/knx/bau_systemB_coupler.h | 3 +- src/knx/router_object.cpp | 22 ------- src/knx/router_object.h | 2 - src/knx/router_object_filtertable.cpp | 84 ++++++++++++++------------- src/knx/router_object_filtertable.h | 6 +- 7 files changed, 51 insertions(+), 73 deletions(-) diff --git a/examples/knx-linux/CMakeLists.txt b/examples/knx-linux/CMakeLists.txt index a71fe6b..3400745 100644 --- a/examples/knx-linux/CMakeLists.txt +++ b/examples/knx-linux/CMakeLists.txt @@ -103,8 +103,6 @@ add_executable(knx-linux ../../src/knx/rf_medium_object.h ../../src/knx/rf_physical_layer.cpp ../../src/knx/rf_physical_layer.h - ../../src/knx/router_object.cpp - ../../src/knx/router_object.h ../../src/knx/router_object_filtertable.cpp ../../src/knx/router_object_filtertable.h ../../src/knx/secure_application_layer.cpp diff --git a/src/knx/bau_systemB_coupler.cpp b/src/knx/bau_systemB_coupler.cpp index 0aa005c..618ae02 100644 --- a/src/knx/bau_systemB_coupler.cpp +++ b/src/knx/bau_systemB_coupler.cpp @@ -6,14 +6,15 @@ BauSystemBCoupler::BauSystemBCoupler(Platform& platform) : BauSystemB(platform), _platform(platform), - _rtObjPrimary(), + _rtObjPrimary(memory()), _rtObjSecondary(memory()), #ifdef USE_DATASECURE _appLayer(_deviceObj, _secIfObj, *this), #else _appLayer(*this), #endif - _transLayer(_appLayer), _netLayer(_deviceObj, _transLayer) + _transLayer(_appLayer), + _netLayer(_deviceObj, _transLayer) { _appLayer.transportLayer(_transLayer); _transLayer.networkLayer(_netLayer); diff --git a/src/knx/bau_systemB_coupler.h b/src/knx/bau_systemB_coupler.h index 59a2278..5c3bef6 100644 --- a/src/knx/bau_systemB_coupler.h +++ b/src/knx/bau_systemB_coupler.h @@ -8,7 +8,6 @@ #include "group_object_table_object.h" #include "security_interface_object.h" #include "application_program_object.h" -#include "router_object.h" #include "router_object_filtertable.h" #include "application_layer.h" #include "secure_application_layer.h" @@ -32,7 +31,7 @@ class BauSystemBCoupler : public BauSystemB Platform& _platform; RouterObject _rtObjPrimary; - RouterObjectFilterTable _rtObjSecondary; + RouterObject _rtObjSecondary; #ifdef USE_DATASECURE SecureApplicationLayer _appLayer; diff --git a/src/knx/router_object.cpp b/src/knx/router_object.cpp index 6b35ec9..341a0f1 100644 --- a/src/knx/router_object.cpp +++ b/src/knx/router_object.cpp @@ -14,12 +14,6 @@ void RouterObject::initializeProperties(size_t propertiesSize, Property** proper { Property* ownProperties[] = { - new DataProperty( PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) OT_ROUTER ), - new DataProperty( PID_OBJECT_INDEX, false, PDT_UNSIGNED_CHAR, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx - new DataProperty( PID_MEDIUM_STATUS, false, PDT_GENERIC_01, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // For now: communication on medium is always possible - new DataProperty( PID_MAX_APDU_LENGTH_ROUTER, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 254 ), // For now: fixed size - new DataProperty( PID_HOP_COUNT, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 5), // TODO: Primary side: 5 for line coupler, 4 for backbone coupler, only exists if secondary is open medium without hop count - new DataProperty( PID_MEDIUM, false, PDT_ENUM8, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx }; uint8_t ownPropertiesCount = sizeof(ownProperties) / sizeof(Property*); @@ -43,19 +37,3 @@ void RouterObject::masterReset(EraseCode eraseCode, uint8_t channel) println("Factory reset of router object requested."); } } - -uint16_t RouterObject::getNumberOfElements(PropertyID propId) -{ - // Get number of entries for this property - uint16_t numElements = 0; - - uint8_t data[sizeof(uint16_t)]; // is sizeof(_currentElements) which is uint16_t - uint8_t count = property(propId)->read(0, 1, data); - - if (count > 0) - { - popWord(numElements, data); - } - - return numElements; -} diff --git a/src/knx/router_object.h b/src/knx/router_object.h index dd09ed7..e575c2c 100644 --- a/src/knx/router_object.h +++ b/src/knx/router_object.h @@ -15,6 +15,4 @@ public: protected: void initializeProperties(size_t propertiesSize, Property** properties) override; -private: - uint16_t getNumberOfElements(PropertyID propId); }; diff --git a/src/knx/router_object_filtertable.cpp b/src/knx/router_object_filtertable.cpp index beb9571..8a759d5 100644 --- a/src/knx/router_object_filtertable.cpp +++ b/src/knx/router_object_filtertable.cpp @@ -16,14 +16,20 @@ enum RouteTableServices SetGroupAddress = 0x04, // 4 bytes: start address and end address }; -RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory) +RouterObject::RouterObject(Memory& memory) : _memory(memory) { Property* properties[] = { - new CallbackProperty(this, PID_LOAD_STATE_CONTROL, true, PDT_CONTROL, 1, ReadLv3 | WriteLv3, + new DataProperty( PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) OT_ROUTER ), + new DataProperty( PID_OBJECT_INDEX, false, PDT_UNSIGNED_CHAR, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx + new DataProperty( PID_MEDIUM_STATUS, false, PDT_GENERIC_01, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // For now: communication on medium is always possible + new DataProperty( PID_MAX_APDU_LENGTH_ROUTER, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 254 ), // For now: fixed size + new DataProperty( PID_HOP_COUNT, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, (uint16_t) 5), // TODO: Primary side: 5 for line coupler, 4 for backbone coupler, only exists if secondary is open medium without hop count + new DataProperty( PID_MEDIUM, false, PDT_ENUM8, 1, ReadLv3 | WriteLv0 ), // Must be set by concrete BAUxxxx + new CallbackProperty(this, PID_LOAD_STATE_CONTROL, true, PDT_CONTROL, 1, ReadLv3 | WriteLv3, // ReadCallback of PID_LOAD_STATE_CONTROL - [](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { + [](RouterObject* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { if (start == 0) return 1; @@ -31,12 +37,12 @@ RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory) return 1; }, // WriteCallback of PID_LOAD_STATE_CONTROL - [](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, const uint8_t* data) -> uint8_t { + [](RouterObject* obj, uint16_t start, uint8_t count, const uint8_t* data) -> uint8_t { obj->loadEvent(data); return 1; }), - new CallbackProperty(this, PID_TABLE_REFERENCE, false, PDT_UNSIGNED_LONG, 1, ReadLv3 | WriteLv0, - [](RouterObjectFilterTable* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { + new CallbackProperty(this, PID_TABLE_REFERENCE, false, PDT_UNSIGNED_LONG, 1, ReadLv3 | WriteLv0, + [](RouterObject* obj, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t { if(start == 0) { uint16_t currentNoOfElements = 1; @@ -53,33 +59,33 @@ RouterObjectFilterTable::RouterObjectFilterTable(Memory& memory) new DataProperty( PID_MCB_TABLE, false, PDT_GENERIC_08, 1, ReadLv3 | WriteLv0), - new FunctionProperty(this, PID_ROUTETABLE_CONTROL, + new FunctionProperty(this, PID_ROUTETABLE_CONTROL, // Command Callback of PID_ROUTETABLE_CONTROL - [](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { + [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { obj->functionRouteTableControl(true, data, length, resultData, resultLength); }, // State Callback of PID_ROUTETABLE_CONTROL - [](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { + [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { obj->functionRouteTableControl(false, data, length, resultData, resultLength); }), new DataProperty( PID_FILTER_TABLE_USE, true, PDT_BINARY_INFORMATION, 1, ReadLv3 | WriteLv0, (uint16_t) 0 ), // default: invalid filter table, do not use - new FunctionProperty(this, PID_RF_ENABLE_SBC, + new FunctionProperty(this, PID_RF_ENABLE_SBC, // Command Callback of PID_RF_ENABLE_SBC - [](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { + [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { obj->functionRfEnableSbc(true, data, length, resultData, resultLength); }, // State Callback of PID_RF_ENABLE_SBC - [](RouterObjectFilterTable* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { + [](RouterObject* obj, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) -> void { obj->functionRfEnableSbc(false, data, length, resultData, resultLength); }), }; - RouterObject::initializeProperties(sizeof(properties), properties); + initializeProperties(sizeof(properties), properties); } -uint8_t* RouterObjectFilterTable::save(uint8_t* buffer) +uint8_t* RouterObject::save(uint8_t* buffer) { buffer = pushByte(_state, buffer); @@ -88,10 +94,10 @@ uint8_t* RouterObjectFilterTable::save(uint8_t* buffer) else buffer = pushInt(0, buffer); - return RouterObject::save(buffer); + return InterfaceObject::save(buffer); } -const uint8_t* RouterObjectFilterTable::restore(const uint8_t* buffer) +const uint8_t* RouterObject::restore(const uint8_t* buffer) { uint8_t state = 0; buffer = popByte(state, buffer); @@ -107,15 +113,15 @@ const uint8_t* RouterObjectFilterTable::restore(const uint8_t* buffer) _filterTableGroupAddresses = (uint16_t*)_data; - return RouterObject::restore(buffer); + return InterfaceObject::restore(buffer); } -uint16_t RouterObjectFilterTable::saveSize() +uint16_t RouterObject::saveSize() { - return 1 + 4 + RouterObject::saveSize(); + return 1 + 4 + InterfaceObject::saveSize(); } -void RouterObjectFilterTable::functionRouteTableControl(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) +void RouterObject::functionRouteTableControl(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) { bool isError = false; RouteTableServices srvId = (RouteTableServices) data[1]; @@ -159,7 +165,7 @@ void RouterObjectFilterTable::functionRouteTableControl(bool isCommand, uint8_t* } } -void RouterObjectFilterTable::functionRfEnableSbc(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) +void RouterObject::functionRfEnableSbc(bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) { if (isCommand) { @@ -171,17 +177,17 @@ void RouterObjectFilterTable::functionRfEnableSbc(bool isCommand, uint8_t* data, resultLength = 2; } -bool RouterObjectFilterTable::isRfSbcRoutingEnabled() +bool RouterObject::isRfSbcRoutingEnabled() { return _rfSbcRoutingEnabled; } -uint32_t RouterObjectFilterTable::tableReference() +uint32_t RouterObject::tableReference() { return (uint32_t)_memory.toRelative(_data); } -bool RouterObjectFilterTable::allocTable(uint32_t size, bool doFill, uint8_t fillByte) +bool RouterObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte) { if (_data) { @@ -202,17 +208,17 @@ bool RouterObjectFilterTable::allocTable(uint32_t size, bool doFill, uint8_t fil return true; } -bool RouterObjectFilterTable::isLoaded() +bool RouterObject::isLoaded() { return _state == LS_LOADED; } -LoadState RouterObjectFilterTable::loadState() +LoadState RouterObject::loadState() { return _state; } -void RouterObjectFilterTable::loadEvent(const uint8_t* data) +void RouterObject::loadEvent(const uint8_t* data) { switch (_state) { @@ -234,7 +240,7 @@ void RouterObjectFilterTable::loadEvent(const uint8_t* data) } } -void RouterObjectFilterTable::loadEventUnloaded(const uint8_t* data) +void RouterObject::loadEventUnloaded(const uint8_t* data) { uint8_t event = data[0]; switch (event) @@ -253,7 +259,7 @@ void RouterObjectFilterTable::loadEventUnloaded(const uint8_t* data) } } -void RouterObjectFilterTable::loadEventLoading(const uint8_t* data) +void RouterObject::loadEventLoading(const uint8_t* data) { uint8_t event = data[0]; switch (event) @@ -276,7 +282,7 @@ void RouterObjectFilterTable::loadEventLoading(const uint8_t* data) } } -void RouterObjectFilterTable::loadEventLoaded(const uint8_t* data) +void RouterObject::loadEventLoaded(const uint8_t* data) { uint8_t event = data[0]; switch (event) @@ -306,7 +312,7 @@ void RouterObjectFilterTable::loadEventLoaded(const uint8_t* data) } } -void RouterObjectFilterTable::loadEventError(const uint8_t* data) +void RouterObject::loadEventError(const uint8_t* data) { uint8_t event = data[0]; switch (event) @@ -325,7 +331,7 @@ void RouterObjectFilterTable::loadEventError(const uint8_t* data) } } -void RouterObjectFilterTable::additionalLoadControls(const uint8_t* data) +void RouterObject::additionalLoadControls(const uint8_t* data) { if (data[1] != 0x0B) // Data Relative Allocation { @@ -344,7 +350,7 @@ void RouterObjectFilterTable::additionalLoadControls(const uint8_t* data) } } -void RouterObjectFilterTable::loadState(LoadState newState) +void RouterObject::loadState(LoadState newState) { if (newState == _state) return; @@ -352,14 +358,14 @@ void RouterObjectFilterTable::loadState(LoadState newState) _state = newState; } -void RouterObjectFilterTable::errorCode(ErrorCode errorCode) +void RouterObject::errorCode(ErrorCode errorCode) { uint8_t data = errorCode; Property* prop = property(PID_ERROR_CODE); prop->write(data); } -void RouterObjectFilterTable::beforeStateChange(LoadState& newState) +void RouterObject::beforeStateChange(LoadState& newState) { if (newState != LS_LOADED) return; @@ -370,7 +376,7 @@ void RouterObjectFilterTable::beforeStateChange(LoadState& newState) _filterTableGroupAddresses = (uint16_t*)_data; } -void RouterObjectFilterTable::updateMcb() +void RouterObject::updateMcb() { uint8_t mcb[propertySize(PID_MCB_TABLE)]; @@ -385,10 +391,8 @@ void RouterObjectFilterTable::updateMcb() property(PID_MCB_TABLE)->write(mcb); } -void RouterObjectFilterTable::masterReset(EraseCode eraseCode, uint8_t channel) +void RouterObject::masterReset(EraseCode eraseCode, uint8_t channel) { - RouterObject::masterReset(eraseCode, channel); - if (eraseCode == FactoryReset) { // TODO handle different erase codes @@ -396,7 +400,7 @@ void RouterObjectFilterTable::masterReset(EraseCode eraseCode, uint8_t channel) } } -bool RouterObjectFilterTable::isGroupAddressInFilterTable(uint16_t groupAddress) +bool RouterObject::isGroupAddressInFilterTable(uint16_t groupAddress) { uint8_t filterTableUse = 0x00; if (property(PID_FILTER_TABLE_USE)->read(filterTableUse) == 0) diff --git a/src/knx/router_object_filtertable.h b/src/knx/router_object_filtertable.h index 5502f6a..39b480a 100644 --- a/src/knx/router_object_filtertable.h +++ b/src/knx/router_object_filtertable.h @@ -2,15 +2,15 @@ #include "config.h" -#include "router_object.h" +#include "interface_object.h" #include "knx_types.h" class Memory; -class RouterObjectFilterTable: public RouterObject +class RouterObject : public InterfaceObject { public: - RouterObjectFilterTable(Memory& memory); + RouterObject(Memory& memory); bool isGroupAddressInFilterTable(uint16_t groupAddress);