Merge pull request #1 from nanosonde/for_upstream

Improve property description handling
This commit is contained in:
thelsing 2018-04-26 00:19:12 +02:00 committed by GitHub
commit d710ec327b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 70 additions and 44 deletions

View File

@ -35,7 +35,7 @@ uint16_t AddressTableObject::getGa(uint16_t tsap)
{ {
if (loadState() != LS_LOADED || tsap > entryCount() ) if (loadState() != LS_LOADED || tsap > entryCount() )
return 0; return 0;
return ntohs(_groupAddresses[tsap]); return ntohs(_groupAddresses[tsap]);
} }
@ -58,9 +58,9 @@ uint8_t* AddressTableObject::save(uint8_t* buffer)
uint8_t* AddressTableObject::restore(uint8_t* buffer) uint8_t* AddressTableObject::restore(uint8_t* buffer)
{ {
buffer = TableObject::restore(buffer); buffer = TableObject::restore(buffer);
_groupAddresses = (uint16_t*)_data; _groupAddresses = (uint16_t*)_data;
return buffer; return buffer;
} }
@ -84,7 +84,10 @@ void AddressTableObject::beforeStateChange(LoadState& newState)
_groupAddresses = (uint16_t*)_data; _groupAddresses = (uint16_t*)_data;
} }
static PropertyDescription _propertyDescriptions[] = { }; static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 }
};
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);
uint8_t AddressTableObject::propertyCount() uint8_t AddressTableObject::propertyCount()

View File

@ -43,10 +43,11 @@ uint8_t ApplicationProgramObject::propertySize(PropertyID id)
{ {
switch (id) switch (id)
{ {
case PID_OBJECT_TYPE:
case PID_PEI_TYPE: case PID_PEI_TYPE:
return 1; return 1;
case PID_PROG_VERSION: case PID_OBJECT_TYPE:
return 2;
case PID_PROG_VERSION:
return 5; return 5;
} }
return TableObject::propertySize(id); return TableObject::propertySize(id);
@ -75,7 +76,7 @@ uint32_t ApplicationProgramObject::getInt(uint32_t addr)
uint8_t* ApplicationProgramObject::save(uint8_t* buffer) uint8_t* ApplicationProgramObject::save(uint8_t* buffer)
{ {
buffer = pushByteArray(_programVersion, 5, buffer); buffer = pushByteArray(_programVersion, 5, buffer);
return TableObject::save(buffer); return TableObject::save(buffer);
} }
@ -86,7 +87,10 @@ uint8_t* ApplicationProgramObject::restore(uint8_t* buffer)
return TableObject::restore(buffer); return TableObject::restore(buffer);
} }
static PropertyDescription _propertyDescriptions[] = {}; static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 }
};
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);
uint8_t ApplicationProgramObject::propertyCount() uint8_t ApplicationProgramObject::propertyCount()

View File

@ -68,9 +68,10 @@ void AssociationTableObject::beforeStateChange(LoadState& newState)
_tableData = (uint16_t*)_data; _tableData = (uint16_t*)_data;
} }
static PropertyDescription _propertyDescriptions[] = static PropertyDescription _propertyDescriptions[] =
{ {
{ PID_TABLE, false, PDT_GENERIC_02, 254, ReadLv3 | WriteLv0 }, { PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 },
{ PID_TABLE, false, PDT_GENERIC_02, 254, ReadLv3 | WriteLv0 }
}; };
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);

View File

@ -5,10 +5,10 @@
using namespace std; using namespace std;
Bau57B0::Bau57B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference), Bau57B0::Bau57B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference),
_assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference), _assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference),
_ipParameters(_deviceObj, platform), _platform(platform), _appLayer(_assocTable, *this), _ipParameters(_deviceObj, platform), _platform(platform), _appLayer(_assocTable, *this),
_transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer), _transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer),
_dlLayer(_deviceObj, _addrTable, _ipParameters, _netLayer, _platform) _dlLayer(_deviceObj, _addrTable, _ipParameters, _netLayer, _platform)
{ {
_appLayer.transportLayer(_transLayer); _appLayer.transportLayer(_transLayer);
@ -50,7 +50,7 @@ void Bau57B0::sendNextGroupTelegram()
if (flag == WriteRequest) if (flag == WriteRequest)
{ {
uint8_t* data = go.valueRef(); uint8_t* data = go.valueRef();
_appLayer.groupValueWriteRequest(AckRequested, asap, go.priority(), NetworkLayerParameter, data, _appLayer.groupValueWriteRequest(AckRequested, asap, go.priority(), NetworkLayerParameter, data,
go.sizeInTelegram()); go.sizeInTelegram());
} }
else else
@ -121,7 +121,7 @@ void Bau57B0::enabled(bool value)
_dlLayer.enabled(value); _dlLayer.enabled(value);
} }
void Bau57B0::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, void Bau57B0::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number,
uint16_t memoryAddress, uint8_t * data) uint16_t memoryAddress, uint8_t * data)
{ {
memcpy(_memoryReference + memoryAddress, data, number); memcpy(_memoryReference + memoryAddress, data, number);
@ -131,7 +131,7 @@ void Bau57B0::memoryWriteIndication(Priority priority, HopCountType hopType, uin
memoryReadIndication(priority, hopType, asap, number, memoryAddress); memoryReadIndication(priority, hopType, asap, number, memoryAddress);
} }
void Bau57B0::memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, void Bau57B0::memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number,
uint16_t memoryAddress) uint16_t memoryAddress)
{ {
_appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, _appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress,
@ -142,7 +142,7 @@ void Bau57B0::deviceDescriptorReadIndication(Priority priority, HopCountType hop
{ {
if (descriptorType != 0) if (descriptorType != 0)
descriptorType = 0x3f; descriptorType = 0x3f;
uint8_t descriptor[] = { 0x57, 0xb0 }; uint8_t descriptor[] = { 0x57, 0xb0 };
_appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor); _appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor);
@ -178,22 +178,23 @@ void Bau57B0::userMemoryWriteIndication(Priority priority, HopCountType hopType,
userMemoryReadIndication(priority, hopType, asap, number, memoryAddress); userMemoryReadIndication(priority, hopType, asap, number, memoryAddress);
} }
void Bau57B0::propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, void Bau57B0::propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex,
uint8_t propertyId, uint8_t propertyIndex) uint8_t propertyId, uint8_t propertyIndex)
{ {
uint8_t pid = propertyId;
bool writeEnable = false; bool writeEnable = false;
uint8_t type = 0; uint8_t type = 0;
uint16_t numberOfElements = 0; uint16_t numberOfElements = 0;
uint8_t access = 0; uint8_t access = 0;
InterfaceObject* obj = getInterfaceObject(objectIndex); InterfaceObject* obj = getInterfaceObject(objectIndex);
if (obj) if (obj)
obj->readPropertyDescription(propertyId, propertyIndex, writeEnable, type, numberOfElements, access); obj->readPropertyDescription(pid, propertyIndex, writeEnable, type, numberOfElements, access);
_appLayer.propertyDescriptionReadResponse(AckRequested, priority, hopType, asap, objectIndex, propertyId, propertyIndex, _appLayer.propertyDescriptionReadResponse(AckRequested, priority, hopType, asap, objectIndex, pid, propertyIndex,
writeEnable, type, numberOfElements, access); writeEnable, type, numberOfElements, access);
} }
void Bau57B0::propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, void Bau57B0::propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length) uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
{ {
InterfaceObject* obj = getInterfaceObject(objectIndex); InterfaceObject* obj = getInterfaceObject(objectIndex);
@ -215,7 +216,7 @@ void Bau57B0::propertyValueReadIndication(Priority priority, HopCountType hopTyp
} }
else else
elementCount = 0; elementCount = 0;
uint8_t data[size]; uint8_t data[size];
if(obj) if(obj)
obj->readProperty((PropertyID)propertyId, startIndex, elementCount, data); obj->readProperty((PropertyID)propertyId, startIndex, elementCount, data);
@ -260,11 +261,11 @@ void Bau57B0::groupValueReadIndication(uint16_t asap, Priority priority, HopCoun
_appLayer.groupValueReadResponse(AckRequested, asap, priority, hopType, data, go.sizeInTelegram()); _appLayer.groupValueReadResponse(AckRequested, asap, priority, hopType, data, go.sizeInTelegram());
} }
void Bau57B0::groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, uint8_t* data, void Bau57B0::groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, uint8_t* data,
uint8_t dataLength) uint8_t dataLength)
{ {
GroupObject& go = _groupObjTable.get(asap); GroupObject& go = _groupObjTable.get(asap);
if (!go.communicationEnable() || !go.responseUpdateEnable()) if (!go.communicationEnable() || !go.responseUpdateEnable())
return; return;

View File

@ -48,10 +48,10 @@ void DeviceObject::readProperty(PropertyID propertyId, uint32_t start, uint32_t&
uint32_t ifObjs[] = { uint32_t ifObjs[] = {
6, // length 6, // length
OT_DEVICE, OT_ADDR_TABLE, OT_ASSOC_TABLE, OT_GRP_OBJ_TABLE, OT_APPLICATION_PROG, OT_IP_PARAMETER}; OT_DEVICE, OT_ADDR_TABLE, OT_ASSOC_TABLE, OT_GRP_OBJ_TABLE, OT_APPLICATION_PROG, OT_IP_PARAMETER};
for (uint32_t i = start; i < (ifObjs[0] + 1) && i < count; i++) for (uint32_t i = start; i < (ifObjs[0] + 1) && i < count; i++)
pushInt(ifObjs[i], data); pushInt(ifObjs[i], data);
break; break;
} }
case PID_DEVICE_DESCRIPTOR: case PID_DEVICE_DESCRIPTOR:
@ -83,13 +83,13 @@ uint8_t DeviceObject::propertySize(PropertyID id)
{ {
switch (id) switch (id)
{ {
case PID_OBJECT_TYPE:
case PID_DEVICE_CONTROL: case PID_DEVICE_CONTROL:
case PID_ROUTING_COUNT: case PID_ROUTING_COUNT:
case PID_PROG_MODE: case PID_PROG_MODE:
case PID_SUBNET_ADDR: case PID_SUBNET_ADDR:
case PID_DEVICE_ADDR: case PID_DEVICE_ADDR:
return 1; return 1;
case PID_OBJECT_TYPE:
case PID_MANUFACTURER_ID: case PID_MANUFACTURER_ID:
case PID_VERSION: case PID_VERSION:
case PID_DEVICE_DESCRIPTOR: case PID_DEVICE_DESCRIPTOR:
@ -254,7 +254,11 @@ void DeviceObject::version(uint16_t value)
_version = value; _version = value;
} }
static PropertyDescription _propertyDescriptions[] = {}; static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 },
{ PID_SERIAL_NUMBER, false, PDT_GENERIC_06, 1, ReadLv3 | WriteLv0 }
};
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);
uint8_t DeviceObject::propertyCount() uint8_t DeviceObject::propertyCount()

View File

@ -47,10 +47,10 @@ uint8_t* GroupObjectTableObject::save(uint8_t* buffer)
uint8_t* GroupObjectTableObject::restore(uint8_t* buffer) uint8_t* GroupObjectTableObject::restore(uint8_t* buffer)
{ {
buffer = TableObject::restore(buffer); buffer = TableObject::restore(buffer);
_tableData = (uint16_t*)_data; _tableData = (uint16_t*)_data;
initGroupObjects(); initGroupObjects();
return buffer; return buffer;
} }
@ -116,11 +116,14 @@ bool GroupObjectTableObject::initGroupObjects()
if (go._dataLength != go.goSize()) if (go._dataLength != go.goSize())
return false; return false;
} }
return true; return true;
} }
static PropertyDescription _propertyDescriptions[] = { }; static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 }
};
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);
uint8_t GroupObjectTableObject::propertyCount() uint8_t GroupObjectTableObject::propertyCount()

View File

@ -1,20 +1,22 @@
#include "interface_object.h" #include "interface_object.h"
void InterfaceObject::readPropertyDescription(uint8_t propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access) void InterfaceObject::readPropertyDescription(uint8_t& propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access)
{ {
PropertyDescription* descriptions = propertyDescriptions(); PropertyDescription* descriptions = propertyDescriptions();
uint8_t count = propertyCount(); uint8_t count = propertyCount();
PropertyDescription* desc = nullptr; PropertyDescription* desc = nullptr;
// from KNX spec. 03.03.07 Application Layer (page 56) - 3.4.3.3 A_PropertyDescription_Read-service
// Summary: either propertyId OR propertyIndex, but not both at the same time
if (propertyId != 0) if (propertyId != 0)
{ {
for (uint8_t i = 0; i < count; i++) for (uint8_t i = 0; i < count; i++)
{ {
PropertyDescription d = descriptions[propertyIndex]; PropertyDescription d = descriptions[i];
if (d.Id != propertyId) if (d.Id != propertyId)
continue; continue;
desc = &d; desc = &d;
propertyIndex = i; propertyIndex = i;
break; break;
@ -22,17 +24,20 @@ void InterfaceObject::readPropertyDescription(uint8_t propertyId, uint8_t& prope
} }
else else
{ {
if (propertyIndex > 0 && propertyIndex < count) // If propertyId is zero, propertyIndex shall be used.
// Response: propertyIndex of received A_PropertyDescription_Read
if (propertyIndex < count)
{ {
desc = &descriptions[propertyIndex]; desc = &descriptions[propertyIndex];
} }
} }
if (desc != nullptr) if (desc != nullptr)
{ {
propertyId = desc->Id;
writeEnable = desc->WriteEnable; writeEnable = desc->WriteEnable;
type = desc->Type; type = desc->Type;
numberOfElements = desc->MaxElements; numberOfElements = desc->MaxElements;
access = desc->Access; access = desc->Access;
} }
} }

View File

@ -57,7 +57,7 @@ public:
virtual void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data) = 0; virtual void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data) = 0;
virtual void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count) = 0; virtual void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count) = 0;
virtual uint8_t propertySize(PropertyID id) = 0; virtual uint8_t propertySize(PropertyID id) = 0;
void readPropertyDescription(uint8_t propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access); void readPropertyDescription(uint8_t& propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access);
protected: protected:
virtual uint8_t propertyCount() = 0; virtual uint8_t propertyCount() = 0;
virtual PropertyDescription* propertyDescriptions() = 0; virtual PropertyDescription* propertyDescriptions() = 0;

View File

@ -181,7 +181,7 @@ uint32_t IpParameterObject::multicastAddress() const
{ {
if (_multicastAddress == 0) if (_multicastAddress == 0)
return DEFAULT_MULTICAST_ADDR; return DEFAULT_MULTICAST_ADDR;
return _multicastAddress; return _multicastAddress;
} }
@ -304,7 +304,10 @@ void IpParameterObject::additionalLoadControls(uint8_t* data)
return; return;
} }
static PropertyDescription _propertyDescriptions[] = { }; static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 }
};
static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription); static uint8_t _propertyCount = sizeof(_propertyDescriptions) / sizeof(PropertyDescription);
uint8_t IpParameterObject::propertyCount() uint8_t IpParameterObject::propertyCount()

View File

@ -52,6 +52,8 @@ uint8_t TableObject::propertySize(PropertyID id)
return 4; return 4;
case PID_ERROR_CODE: case PID_ERROR_CODE:
return 1; return 1;
case PID_OBJECT_TYPE:
return 2;
} }
return 0; return 0;
} }
@ -82,7 +84,7 @@ uint8_t* TableObject::save(uint8_t* buffer)
buffer = pushByte(_errorCode, buffer); buffer = pushByte(_errorCode, buffer);
buffer = pushInt(_size, buffer); buffer = pushInt(_size, buffer);
buffer = pushByteArray(_data, _size, buffer); buffer = pushByteArray(_data, _size, buffer);
return buffer; return buffer;
} }