19 static constexpr uint16_t kFilterTableSize = 65536 / 8;
30 :
TableObject(memory, staticTableAdr, staticTableSize)
47 bool useHopCount =
false;
64 uint8_t fixedPropertiesCount =
sizeof(fixedProperties) /
sizeof(
Property*);
75 uint8_t model1xPropertiesCount =
sizeof(model1xProperties) /
sizeof(
Property*);
84 uint8_t model20PropertiesCount =
sizeof(model20Properties) /
sizeof(
Property*);
90 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void {
91 obj->functionRouteTableControl(
true,
data, length, resultData, resultLength);
94 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void {
95 obj->functionRouteTableControl(
false,
data, length, resultData, resultLength);
105 uint8_t tablePropertiesCount =
sizeof(tableProperties) /
sizeof(
Property*);
106 uint8_t tableProperties20Count =
sizeof(tableProperties20) /
sizeof(
Property*);
108 size_t allPropertiesCount = fixedPropertiesCount;
109 allPropertiesCount += (model ==
CouplerModel::Model_1x) ? model1xPropertiesCount : model20PropertiesCount;
110 allPropertiesCount += useHopCount ? 1 : 0;
111 allPropertiesCount += useTable ? tablePropertiesCount : 0;
115 Property* allProperties[allPropertiesCount];
117 memcpy(&allProperties[0], &fixedProperties[0],
sizeof(fixedProperties));
119 uint8_t i = fixedPropertiesCount;
123 memcpy(&allProperties[i], model1xProperties,
sizeof(model1xProperties));
124 i += model1xPropertiesCount;
128 memcpy(&allProperties[i], model20Properties,
sizeof(model20Properties));
129 i += model20PropertiesCount;
141 memcpy(&allProperties[i], tableProperties,
sizeof(tableProperties));
142 i += tablePropertiesCount;
146 memcpy(&allProperties[i], tableProperties20,
sizeof(tableProperties20));
147 i += tableProperties20Count;
155 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void
157 obj->functionRfEnableSbc(
true,
data, length, resultData, resultLength);
160 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void
162 obj->functionRfEnableSbc(
false,
data, length, resultData, resultLength);
169 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void
171 obj->functionIpEnableSbc(
true,
data, length, resultData, resultLength);
174 [](
RouterObject * obj, uint8_t*
data, uint8_t length, uint8_t* resultData, uint8_t& resultLength) ->
void
176 obj->functionIpEnableSbc(
false,
data, length, resultData, resultLength);
191 void RouterObject::commandClearSetRoutingTable(
bool bitIsSet)
193 uint8_t fillbyte = bitIsSet ? 0xFF : 0x00;
195 #ifdef KNX_LOG_COUPLER
196 print(
"RouterObject::commandClearSetRoutingTable ");
202 for (uint16_t i = 0; i < kFilterTableSize; i++)
208 bool RouterObject::statusClearSetRoutingTable(
bool bitIsSet)
210 #ifdef KNX_LOG_COUPLER
211 print(
"RouterObject::statusClearSetRoutingTable ");
215 for (uint16_t i = 0; i < kFilterTableSize; i++)
217 if (
data()[i] != (bitIsSet ? 0xFF : 0x00))
224 void RouterObject::commandClearSetGroupAddress(uint16_t startAddress, uint16_t endAddress,
bool bitIsSet)
226 #ifdef KNX_LOG_COUPLER
227 print(
"RouterObject::commandClearSetGroupAddress ");
235 uint16_t startOctet = startAddress / 8;
236 uint8_t startBitPosition = startAddress % 8;
237 uint16_t endOctet = endAddress / 8;
238 uint8_t endBitPosition = endAddress % 8;
240 if (startOctet == endOctet)
243 uint8_t octetData = 0;
246 for (uint8_t bitPos = startBitPosition; bitPos <= endBitPosition; bitPos++)
249 octetData |= 1 << bitPos;
251 octetData &= ~(1 << bitPos);
258 for (uint16_t i = startOctet; i <= endOctet; i++)
261 uint8_t octetData = 0;
266 for (uint8_t bitPos = startBitPosition; bitPos <= 7; bitPos++)
269 octetData |= 1 << bitPos;
271 octetData &= ~(1 << bitPos);
274 else if (i == endOctet)
276 for (uint8_t bitPos = 0; bitPos <= endBitPosition; bitPos++)
279 octetData |= 1 << bitPos;
281 octetData &= ~(1 << bitPos);
296 bool RouterObject::statusClearSetGroupAddress(uint16_t startAddress, uint16_t endAddress,
bool bitIsSet)
298 #ifdef KNX_LOG_COUPLER
299 print(
"RouterObject::statusClearSetGroupAddress ");
307 uint16_t startOctet = startAddress / 8;
308 uint8_t startBitPosition = startAddress % 8;
309 uint16_t endOctet = endAddress / 8;
310 uint8_t endBitPosition = endAddress % 8;
312 if (startOctet == endOctet)
314 for (uint8_t bitPos = startBitPosition; bitPos <= endBitPosition; bitPos++)
318 if ((
data()[startOctet] & (1 << bitPos)) == 0)
323 if ((
data()[startOctet] & (1 << bitPos)) != 0)
331 for (uint16_t i = startOctet; i <= endOctet; i++)
335 for (uint8_t bitPos = startBitPosition; bitPos <= 7; bitPos++)
339 if ((
data()[i] & (1 << bitPos)) == 0)
344 if ((
data()[i] & (1 << bitPos)) != 0)
349 else if (i == endOctet)
351 for (uint8_t bitPos = 0; bitPos <= endBitPosition; bitPos++)
355 if ((
data()[i] & (1 << bitPos)) == 0)
360 if ((
data()[i] & (1 << bitPos)) != 0)
367 if (
data()[i] != (bitIsSet ? 0xFF : 0x00))
375 void RouterObject::functionRouteTableControl(
bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength)
377 #ifdef KNX_LOG_COUPLER
378 print(
"RouterObject::functionRouteTableControl ");
390 println(
"access violation. filter table can only be modified in LS_LOADING");
392 resultData[1] = srvId;
400 commandClearSetRoutingTable(
false);
402 resultData[1] = srvId;
407 commandClearSetRoutingTable(
true);
409 resultData[1] = srvId;
415 uint16_t startAddress;
419 commandClearSetGroupAddress(startAddress, endAddress,
false);
421 resultData[1] = srvId;
422 pushWord(startAddress, &resultData[2]);
423 pushWord(endAddress, &resultData[4]);
430 uint16_t startAddress;
434 commandClearSetGroupAddress(startAddress, endAddress,
true);
436 resultData[1] = srvId;
437 pushWord(startAddress, &resultData[2]);
438 pushWord(endAddress, &resultData[4]);
450 resultData[1] = srvId;
456 resultData[1] = srvId;
462 uint16_t startAddress;
467 resultData[1] = srvId;
468 pushWord(startAddress, &resultData[2]);
469 pushWord(endAddress, &resultData[4]);
476 uint16_t startAddress;
481 resultData[1] = srvId;
482 pushWord(startAddress, &resultData[2]);
483 pushWord(endAddress, &resultData[4]);
492 resultData[1] = srvId;
496 void RouterObject::functionRfEnableSbc(
bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength)
500 _rfSbcRoutingEnabled = (
data[0] == 1) ?
true :
false;
504 resultData[1] = _rfSbcRoutingEnabled ? 1 : 0;
510 #ifdef KNX_LOG_COUPLER
511 print(
"RouterObject::isRfSbcRoutingEnabled ");
514 return _rfSbcRoutingEnabled;
518 void RouterObject::functionIpEnableSbc(
bool isCommand, uint8_t* data, uint8_t length, uint8_t* resultData, uint8_t& resultLength)
520 #ifdef KNX_LOG_COUPLER
521 print(
"RouterObject::functionIpEnableSbc ");
528 _ipSbcRoutingEnabled = (
data[0] == 1) ?
true :
false;
532 resultData[1] = _ipSbcRoutingEnabled ? 1 : 0;
539 #ifdef KNX_LOG_COUPLER
540 print(
"RouterObject::isIpSbcRoutingEnabled ");
543 return _ipSbcRoutingEnabled;
548 #ifdef KNX_LOG_COUPLER
549 println(
"RouterObject::beforeStateChange");
558 #ifdef KNX_LOG_COUPLER
559 print(
"RouterObject::masterReset ");
568 println(
"Factory reset of router object with filter table requested.");
577 uint8_t filterTableUse = 0x01;
580 if (propFilterTableUse)
581 if (propFilterTableUse->
read(filterTableUse) == 0)
584 if ((filterTableUse & 0x01) == 1)
586 uint8_t* filterTable =
data();
589 uint16_t octetAddress = groupAddress / 8;
590 uint8_t bitPosition = groupAddress % 8;
594 return (filterTable[octetAddress] & (1 << bitPosition)) == (1 << bitPosition);
597 println(
"RouterObject::isGroupAddressInFilterTable filterTable is NULL");
void printHex(const char *suffix, const uint8_t *data, size_t length, bool newline)
uint8_t * pushWord(uint16_t w, uint8_t *data)
const uint8_t * popWord(uint16_t &w, const uint8_t *data)
virtual void initializeProperties(size_t propertiesSize, Property **properties)
Intializes the Property-array the the supplied values.
Property * property(PropertyID id)
Gets property with PropertyID id if it exists and nullptr otherwise.
uint32_t toRelative(uint8_t *absoluteAddress)
virtual uint8_t read(uint16_t start, uint8_t count, uint8_t *data) const =0
void masterReset(EraseCode eraseCode, uint8_t channel) override
void beforeStateChange(LoadState &newState) override
This method is called before the interface object enters a new LoadState.
bool isGroupAddressInFilterTable(uint16_t groupAddress)
bool isRfSbcRoutingEnabled()
void initialize1x(DptMedium mediumType, uint16_t maxApduSize)
const uint8_t * restore(const uint8_t *buffer) override
This method is called when the object should restore its state from the buffer.
RouterObject(Memory &memory, uint32_t staticTableAdr=0, uint32_t staticTableSize=0)
bool isIpSbcRoutingEnabled()
void initialize20(uint8_t objIndex, DptMedium mediumType, RouterObjectType rtType, uint16_t maxApduSize)
void initialize(CouplerModel model, uint8_t objIndex, DptMedium mediumType, RouterObjectType rtType, uint16_t maxApduSize)
This class provides common functionality for interface objects that are configured by ETS with MemorW...
void initializeProperties(size_t propertiesSize, Property **properties) override
Intializes the Property-array the the supplied values.
LoadState loadState()
This method returns the LoadState of the interface object.
uint8_t * data()
returns the internal data of the interface object.
const uint8_t * restore(const uint8_t *buffer) override
This method is called when the object should restore its state from the buffer.
@ OT_ROUTER
Router Object.
@ PID_OBJECT_TYPE
Interface Object Type independent Properties.
@ PID_MAX_APDU_LENGTH_ROUTER
@ PID_MEDIUM_STATUS
Router Object.
@ PID_COUPLER_SERVICES_CONTROL
@ PDT_BINARY_INFORMATION
length: 3
@ PDT_UNSIGNED_INT
length: 2
@ PDT_UNSIGNED_CHAR
length: 1
@ PDT_GENERIC_01
length: 1