mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	save work
This commit is contained in:
		
							parent
							
								
									bc09622a77
								
							
						
					
					
						commit
						9a6d5cecf4
					
				| @ -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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
| @ -15,6 +15,4 @@ public: | ||||
| protected: | ||||
|   void initializeProperties(size_t propertiesSize, Property** properties) override; | ||||
| 
 | ||||
| private: | ||||
|   uint16_t getNumberOfElements(PropertyID propId); | ||||
| }; | ||||
|  | ||||
| @ -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<RouterObjectFilterTable>(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<RouterObject>(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<RouterObjectFilterTable>(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<RouterObject>(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<RouterObjectFilterTable>(this, PID_ROUTETABLE_CONTROL, | ||||
|         new FunctionProperty<RouterObject>(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<RouterObjectFilterTable>(this, PID_RF_ENABLE_SBC, | ||||
|         new FunctionProperty<RouterObject>(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) | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user