improve encapsulation of accociation table

This commit is contained in:
Thomas Kunze 2019-07-26 22:07:20 +02:00
parent b4c8671dbb
commit 8e9aef17ab
3 changed files with 26 additions and 12 deletions

View File

@ -22,8 +22,6 @@ void ApplicationLayer::transportLayer(TransportLayer& layer)
void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu) void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu)
{ {
uint16_t entries = _assocTable.entryCount();
uint8_t len = apdu.length(); uint8_t len = apdu.length();
uint8_t dataArray[len]; uint8_t dataArray[len];
uint8_t* data = dataArray; uint8_t* data = dataArray;
@ -39,12 +37,10 @@ void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priori
len -= 1; len -= 1;
} }
for (uint16_t i = 0; i < entries; i++) uint16_t startIdx = 0;
uint32_t asap = _assocTable.nextAsap(tsap, startIdx);
for (; asap != -1; asap = _assocTable.nextAsap(tsap, startIdx))
{ {
uint16_t entry = _assocTable[i];
if (highByte(entry) == tsap)
{
uint16_t asap = lowByte(entry);
switch (apdu.type()) switch (apdu.type())
{ {
case GroupValueRead: case GroupValueRead:
@ -57,7 +53,6 @@ void ApplicationLayer::dataGroupIndication(HopCountType hopType, Priority priori
_bau.groupValueWriteIndication(asap, priority, hopType, data, len); _bau.groupValueWriteIndication(asap, priority, hopType, data, len);
} }
} }
}
} }
void ApplicationLayer::dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status) void ApplicationLayer::dataGroupConfirm(AckType ack, HopCountType hopType, Priority priority, uint16_t tsap, APDU& apdu, bool status)

View File

@ -49,6 +49,7 @@ uint8_t* AssociationTableObject::restore(uint8_t* buffer)
return buffer; return buffer;
} }
// return type is int32 so that we can return uint16 and -1
int32_t AssociationTableObject::translateAsap(uint16_t asap) int32_t AssociationTableObject::translateAsap(uint16_t asap)
{ {
uint16_t entries = entryCount(); uint16_t entries = entryCount();
@ -61,6 +62,8 @@ int32_t AssociationTableObject::translateAsap(uint16_t asap)
return -1; return -1;
} }
void AssociationTableObject::beforeStateChange(LoadState& newState) void AssociationTableObject::beforeStateChange(LoadState& newState)
{ {
if (newState != LS_LOADED) if (newState != LS_LOADED)
@ -89,3 +92,17 @@ PropertyDescription* AssociationTableObject::propertyDescriptions()
{ {
return _propertyDescriptions; return _propertyDescriptions;
} }
int32_t AssociationTableObject::nextAsap(uint16_t tsap, uint16_t startIdx)
{
uint16_t entries = entryCount();
for (uint16_t i = startIdx; i < entries; i++)
{
uint16_t entry = operator[](i);
if (highByte(entry) == tsap)
{
return lowByte(entry);
}
}
return -1;
}

View File

@ -7,12 +7,12 @@ class AssociationTableObject : public TableObject
public: public:
AssociationTableObject(Platform& platform); AssociationTableObject(Platform& platform);
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data); void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
uint16_t entryCount();
uint16_t operator[](uint16_t idx);
uint8_t* save(uint8_t* buffer); uint8_t* save(uint8_t* buffer);
uint8_t* restore(uint8_t* buffer); uint8_t* restore(uint8_t* buffer);
int32_t translateAsap(uint16_t asap); int32_t translateAsap(uint16_t asap);
int32_t nextAsap(uint16_t tsap, uint16_t startIdx);
protected: protected:
void beforeStateChange(LoadState& newState); void beforeStateChange(LoadState& newState);
@ -20,5 +20,7 @@ class AssociationTableObject : public TableObject
PropertyDescription* propertyDescriptions(); PropertyDescription* propertyDescriptions();
private: private:
uint16_t entryCount();
uint16_t operator[](uint16_t idx);
uint16_t* _tableData = 0; uint16_t* _tableData = 0;
}; };