save work

This commit is contained in:
Nanosonde 2020-07-15 17:50:54 +02:00
parent bc09622a77
commit 9a6d5cecf4
7 changed files with 51 additions and 73 deletions

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -15,6 +15,4 @@ public:
protected:
void initializeProperties(size_t propertiesSize, Property** properties) override;
private:
uint16_t getNumberOfElements(PropertyID propId);
};

View File

@ -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)

View File

@ -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);