diff --git a/bau07B0.cpp b/bau07B0.cpp index 76c4b0c..6381b8e 100644 --- a/bau07B0.cpp +++ b/bau07B0.cpp @@ -5,280 +5,14 @@ using namespace std; -Bau07B0::Bau07B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference), - _assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference), - _platform(platform), _appLayer(_assocTable, *this), - _transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer), +Bau07B0::Bau07B0(Platform& platform): BauSystemB(platform), _dlLayer(_deviceObj, _addrTable, _netLayer, _platform) { - _appLayer.transportLayer(_transLayer); - _transLayer.networkLayer(_netLayer); _netLayer.dataLinkLayer(_dlLayer); - _memory.addSaveRestore(&_deviceObj); - _memory.addSaveRestore(&_appProgram); - _memory.addSaveRestore(&_addrTable); - _memory.addSaveRestore(&_assocTable); - _memory.addSaveRestore(&_groupObjTable); -} - -void Bau07B0::loop() -{ - _dlLayer.loop(); - _transLayer.loop(); - sendNextGroupTelegram(); -} - -void Bau07B0::sendNextGroupTelegram() -{ - static uint16_t startIdx = 1; - - GroupObjectTableObject& table = _groupObjTable; - uint16_t objCount = table.entryCount(); - - for (uint16_t asap = startIdx; asap < objCount; asap++) - { - GroupObject& go = table.get(asap); - - ComFlag flag = go.commFlag(); - if (flag != ReadRequest && flag != WriteRequest) - continue; - - if(!go.communicationEnable() || ! go.transmitEnable()) - continue; - - if (flag == WriteRequest) - { - uint8_t* data = go.valueRef(); - _appLayer.groupValueWriteRequest(AckRequested, asap, go.priority(), NetworkLayerParameter, data, - go.sizeInTelegram()); - } - else - { - _appLayer.groupValueReadRequest(AckRequested, asap, go.priority(), NetworkLayerParameter); - } - - go.commFlag(Transmitting); - - startIdx = asap + 1; - return; - } - - startIdx = 1; -} - -void Bau07B0::updateGroupObject(GroupObject & go, uint8_t * data, uint8_t length) -{ - uint8_t* goData = go.valueRef(); - if (length != go.valueSize()) - { - go.commFlag(Error); - return; - } - - memcpy(goData, data, length); - - go.commFlag(cfUpdate); - if (go.updateHandler) - go.updateHandler(go); -} - -void Bau07B0::readMemory() -{ - _memory.readMemory(); -} - -DeviceObject& Bau07B0::deviceObject() -{ - return _deviceObj; -} - -GroupObjectTableObject& Bau07B0::groupObjectTable() -{ - return _groupObjTable; -} - -ApplicationProgramObject& Bau07B0::parameters() -{ - return _appProgram; -} - -bool Bau07B0::configured() -{ - return _groupObjTable.loadState() == LS_LOADED - && _addrTable.loadState() == LS_LOADED - && _assocTable.loadState() == LS_LOADED - && _appProgram.loadState() == LS_LOADED; -} - -bool Bau07B0::enabled() -{ - return _dlLayer.enabled(); -} - -void Bau07B0::enabled(bool value) -{ - _dlLayer.enabled(value); -} - -void Bau07B0::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress, uint8_t * data) -{ - memcpy(_memoryReference + memoryAddress, data, number); - _memory.memoryModified(); - - if (_deviceObj.verifyMode()) - memoryReadIndication(priority, hopType, asap, number, memoryAddress); -} - -void Bau07B0::memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress) -{ - _appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, - _memoryReference + memoryAddress); -} - -void Bau07B0::deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType) -{ - if (descriptorType != 0) - descriptorType = 0x3f; uint8_t descriptor[] = { 0x07, 0xb0 }; - - _appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor); -} - -void Bau07B0::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap) -{ - // for platforms that don't really restart - _deviceObj.progMode(false); - - // Flush the EEPROM before resetting - _memory.writeMemory(); - _platform.restart(); -} - -void Bau07B0::authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key) -{ - _appLayer.authorizeResponse(AckRequested, priority, hopType, asap, 0); -} - -void Bau07B0::userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress) -{ - _appLayer.userMemoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, - _memoryReference + memoryAddress); -} - -void Bau07B0::userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress, uint8_t* data) -{ - memcpy(_memoryReference + memoryAddress, data, number); - _memory.memoryModified(); - - if (_deviceObj.verifyMode()) - userMemoryReadIndication(priority, hopType, asap, number, memoryAddress); -} - -void Bau07B0::propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t propertyIndex) -{ - uint8_t pid = propertyId; - bool writeEnable = false; - uint8_t type = 0; - uint16_t numberOfElements = 0; - uint8_t access = 0; - InterfaceObject* obj = getInterfaceObject(objectIndex); - if (obj) - obj->readPropertyDescription(pid, propertyIndex, writeEnable, type, numberOfElements, access); - - _appLayer.propertyDescriptionReadResponse(AckRequested, priority, hopType, asap, objectIndex, pid, propertyIndex, - writeEnable, type, numberOfElements, access); -} - -void Bau07B0::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) -{ - InterfaceObject* obj = getInterfaceObject(objectIndex); - if(obj) - obj->writeProperty((PropertyID)propertyId, startIndex, data, numberOfElements); - propertyValueReadIndication(priority, hopType, asap, objectIndex, propertyId, numberOfElements, startIndex); -} - -void Bau07B0::propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) -{ - uint8_t size = 0; - uint32_t elementCount = numberOfElements; - InterfaceObject* obj = getInterfaceObject(objectIndex); - if (obj) - { - uint8_t elementSize = obj->propertySize((PropertyID)propertyId); - size = elementSize * numberOfElements; - } - else - elementCount = 0; - - uint8_t data[size]; - if(obj) - obj->readProperty((PropertyID)propertyId, startIndex, elementCount, data); - _appLayer.propertyValueReadResponse(AckRequested, priority, hopType, asap, objectIndex, propertyId, elementCount, - startIndex, data, size); -} - -void Bau07B0::individualAddressReadIndication(HopCountType hopType) -{ - if (_deviceObj.progMode()) - _appLayer.individualAddressReadResponse(AckRequested, hopType); -} - -void Bau07B0::individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress) -{ - if (_deviceObj.progMode()) - _deviceObj.induvidualAddress(newaddress); -} - -void Bau07B0::groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength, bool status) -{ - GroupObject& go = _groupObjTable.get(asap); - if (status) - go.commFlag(Ok); - else - go.commFlag(Error); -} - -void Bau07B0::groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status) -{ - GroupObject& go = _groupObjTable.get(asap); - if (status) - go.commFlag(Ok); - else - go.commFlag(Error); -} - -void Bau07B0::groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType) -{ - GroupObject& go = _groupObjTable.get(asap); - uint8_t* data = go.valueRef(); - _appLayer.groupValueReadResponse(AckRequested, asap, priority, hopType, data, go.sizeInTelegram()); -} - -void Bau07B0::groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, uint8_t* data, - uint8_t dataLength) -{ - GroupObject& go = _groupObjTable.get(asap); - - if (!go.communicationEnable() || !go.responseUpdateEnable()) - return; - - updateGroupObject(go, data, dataLength); -} - -void Bau07B0::groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength) -{ - GroupObject& go = _groupObjTable.get(asap); - - if (!go.communicationEnable() || !go.writeEnable()) - return; - - updateGroupObject(go, data, dataLength); + _descriptor[0] = descriptor[0]; + _descriptor[1] = descriptor[1]; } InterfaceObject* Bau07B0::getInterfaceObject(uint8_t idx) @@ -300,4 +34,14 @@ InterfaceObject* Bau07B0::getInterfaceObject(uint8_t idx) default: return nullptr; } -} \ No newline at end of file +} + +uint8_t* Bau07B0::descriptor() +{ + return _descriptor; +} + +DataLinkLayer& Bau07B0::dataLinkLayer() +{ + return _dlLayer; +} diff --git a/bau07B0.h b/bau07B0.h index b9dd7b5..27588cd 100644 --- a/bau07B0.h +++ b/bau07B0.h @@ -1,75 +1,17 @@ #pragma once -#include "bau.h" -#include "device_object.h" -#include "address_table_object.h" -#include "association_table_object.h" -#include "group_object_table_object.h" -#include "application_program_object.h" -#include "application_layer.h" -#include "transport_layer.h" -#include "network_layer.h" +#include "bau_systemB.h" #include "tpuart_data_link_layer.h" -#include "platform.h" -#include "memory.h" -class Bau07B0: protected BusAccessUnit +class Bau07B0: public BauSystemB { - using BusAccessUnit::memoryReadIndication; public: Bau07B0(Platform& platform); - void loop(); - DeviceObject& deviceObject(); - GroupObjectTableObject& groupObjectTable(); - ApplicationProgramObject& parameters(); - bool configured(); - bool enabled(); - void enabled(bool value); - void readMemory(); protected: - void memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress, uint8_t* data) override; - void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress) override; - void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType); - void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap); - void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key); - void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress); - void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint32_t memoryAddress, uint8_t* memoryData); - void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t propertyIndex); - void 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); - void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex); - void individualAddressReadIndication(HopCountType hopType); - void individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress); - void groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength, bool status); - void groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status); - void groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType); - void groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength); - void groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength); - InterfaceObject* getInterfaceObject(uint8_t idx); - void sendNextGroupTelegram(); - void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length); + uint8_t* descriptor(); + DataLinkLayer& dataLinkLayer(); private: - DeviceObject _deviceObj; - // pointer to first private variable as reference to memory read/write commands - uint8_t* _memoryReference; - Memory _memory; - AddressTableObject _addrTable; - AssociationTableObject _assocTable; - GroupObjectTableObject _groupObjTable; - ApplicationProgramObject _appProgram; - Platform& _platform; - ApplicationLayer _appLayer; - TransportLayer _transLayer; - NetworkLayer _netLayer; TpUartDataLinkLayer _dlLayer; - + uint8_t _descriptor[2]; }; \ No newline at end of file diff --git a/bau57B0.cpp b/bau57B0.cpp index d31f280..c915959 100644 --- a/bau57B0.cpp +++ b/bau57B0.cpp @@ -2,284 +2,18 @@ #include #include - using namespace std; -Bau57B0::Bau57B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference), - _assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference), - _ipParameters(_deviceObj, platform), _platform(platform), _appLayer(_assocTable, *this), - _transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer), +Bau57B0::Bau57B0(Platform& platform): BauSystemB(platform), + _ipParameters(_deviceObj, platform), _dlLayer(_deviceObj, _addrTable, _ipParameters, _netLayer, _platform) { - _appLayer.transportLayer(_transLayer); - _transLayer.networkLayer(_netLayer); _netLayer.dataLinkLayer(_dlLayer); - _memory.addSaveRestore(&_deviceObj); _memory.addSaveRestore(&_ipParameters); - _memory.addSaveRestore(&_appProgram); - _memory.addSaveRestore(&_addrTable); - _memory.addSaveRestore(&_assocTable); - _memory.addSaveRestore(&_groupObjTable); -} - -void Bau57B0::loop() -{ - _dlLayer.loop(); - _transLayer.loop(); - sendNextGroupTelegram(); -} - -void Bau57B0::sendNextGroupTelegram() -{ - static uint16_t startIdx = 1; - - GroupObjectTableObject& table = _groupObjTable; - uint16_t objCount = table.entryCount(); - - for (uint16_t asap = startIdx; asap < objCount; asap++) - { - GroupObject& go = table.get(asap); - - ComFlag flag = go.commFlag(); - if (flag != ReadRequest && flag != WriteRequest) - continue; - - if(!go.communicationEnable() || ! go.transmitEnable()) - continue; - - if (flag == WriteRequest) - { - uint8_t* data = go.valueRef(); - _appLayer.groupValueWriteRequest(AckRequested, asap, go.priority(), NetworkLayerParameter, data, - go.sizeInTelegram()); - } - else - { - _appLayer.groupValueReadRequest(AckRequested, asap, go.priority(), NetworkLayerParameter); - } - - go.commFlag(Transmitting); - - startIdx = asap + 1; - return; - } - - startIdx = 1; -} - -void Bau57B0::updateGroupObject(GroupObject & go, uint8_t * data, uint8_t length) -{ - uint8_t* goData = go.valueRef(); - if (length != go.valueSize()) - { - go.commFlag(Error); - return; - } - - memcpy(goData, data, length); - - go.commFlag(cfUpdate); - if (go.updateHandler) - go.updateHandler(go); -} - -void Bau57B0::readMemory() -{ - _memory.readMemory(); -} - -DeviceObject& Bau57B0::deviceObject() -{ - return _deviceObj; -} - -GroupObjectTableObject& Bau57B0::groupObjectTable() -{ - return _groupObjTable; -} - -ApplicationProgramObject& Bau57B0::parameters() -{ - return _appProgram; -} - -bool Bau57B0::configured() -{ - return _groupObjTable.loadState() == LS_LOADED - && _addrTable.loadState() == LS_LOADED - && _assocTable.loadState() == LS_LOADED - && _appProgram.loadState() == LS_LOADED; -} - -bool Bau57B0::enabled() -{ - return _dlLayer.enabled(); -} - -void Bau57B0::enabled(bool value) -{ - _dlLayer.enabled(value); -} - -void Bau57B0::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress, uint8_t * data) -{ - memcpy(_memoryReference + memoryAddress, data, number); - _memory.memoryModified(); - - if (_deviceObj.verifyMode()) - memoryReadIndication(priority, hopType, asap, number, memoryAddress); -} - -void Bau57B0::memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress) -{ - _appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, - _memoryReference + memoryAddress); -} - -void Bau57B0::deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType) -{ - if (descriptorType != 0) - descriptorType = 0x3f; uint8_t descriptor[] = { 0x57, 0xb0 }; - - _appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor); -} - -void Bau57B0::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap) -{ - // for platforms that don't really restart - _deviceObj.progMode(false); - - // Flush the EEPROM before resetting - _memory.writeMemory(); - _platform.restart(); -} - -void Bau57B0::authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key) -{ - _appLayer.authorizeResponse(AckRequested, priority, hopType, asap, 0); -} - -void Bau57B0::userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress) -{ - _appLayer.userMemoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, - _memoryReference + memoryAddress); -} - -void Bau57B0::userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress, uint8_t* data) -{ - memcpy(_memoryReference + memoryAddress, data, number); - _memory.memoryModified(); - - if (_deviceObj.verifyMode()) - userMemoryReadIndication(priority, hopType, asap, number, memoryAddress); -} - -void Bau57B0::propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t propertyIndex) -{ - uint8_t pid = propertyId; - bool writeEnable = false; - uint8_t type = 0; - uint16_t numberOfElements = 0; - uint8_t access = 0; - InterfaceObject* obj = getInterfaceObject(objectIndex); - if (obj) - obj->readPropertyDescription(pid, propertyIndex, writeEnable, type, numberOfElements, access); - - _appLayer.propertyDescriptionReadResponse(AckRequested, priority, hopType, asap, objectIndex, pid, propertyIndex, - writeEnable, type, numberOfElements, access); -} - -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) -{ - InterfaceObject* obj = getInterfaceObject(objectIndex); - if(obj) - obj->writeProperty((PropertyID)propertyId, startIndex, data, numberOfElements); - propertyValueReadIndication(priority, hopType, asap, objectIndex, propertyId, numberOfElements, startIndex); -} - -void Bau57B0::propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) -{ - uint8_t size = 0; - uint32_t elementCount = numberOfElements; - InterfaceObject* obj = getInterfaceObject(objectIndex); - if (obj) - { - uint8_t elementSize = obj->propertySize((PropertyID)propertyId); - size = elementSize * numberOfElements; - } - else - elementCount = 0; - - uint8_t data[size]; - if(obj) - obj->readProperty((PropertyID)propertyId, startIndex, elementCount, data); - _appLayer.propertyValueReadResponse(AckRequested, priority, hopType, asap, objectIndex, propertyId, elementCount, - startIndex, data, size); -} - -void Bau57B0::individualAddressReadIndication(HopCountType hopType) -{ - if (_deviceObj.progMode()) - _appLayer.individualAddressReadResponse(AckRequested, hopType); -} - -void Bau57B0::individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress) -{ - if (_deviceObj.progMode()) - _deviceObj.induvidualAddress(newaddress); -} - -void Bau57B0::groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength, bool status) -{ - GroupObject& go = _groupObjTable.get(asap); - if (status) - go.commFlag(Ok); - else - go.commFlag(Error); -} - -void Bau57B0::groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status) -{ - GroupObject& go = _groupObjTable.get(asap); - if (status) - go.commFlag(Ok); - else - go.commFlag(Error); -} - -void Bau57B0::groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType) -{ - GroupObject& go = _groupObjTable.get(asap); - uint8_t* data = go.valueRef(); - _appLayer.groupValueReadResponse(AckRequested, asap, priority, hopType, data, go.sizeInTelegram()); -} - -void Bau57B0::groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, uint8_t* data, - uint8_t dataLength) -{ - GroupObject& go = _groupObjTable.get(asap); - - if (!go.communicationEnable() || !go.responseUpdateEnable()) - return; - - updateGroupObject(go, data, dataLength); -} - -void Bau57B0::groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength) -{ - GroupObject& go = _groupObjTable.get(asap); - - if (!go.communicationEnable() || !go.writeEnable()) - return; - - updateGroupObject(go, data, dataLength); + _descriptor[0] = descriptor[0]; + _descriptor[1] = descriptor[1]; } InterfaceObject* Bau57B0::getInterfaceObject(uint8_t idx) @@ -303,4 +37,14 @@ InterfaceObject* Bau57B0::getInterfaceObject(uint8_t idx) default: return nullptr; } +} + +uint8_t* Bau57B0::descriptor() +{ + return _descriptor; +} + +DataLinkLayer& Bau57B0::dataLinkLayer() +{ + return _dlLayer; } \ No newline at end of file diff --git a/bau57B0.h b/bau57B0.h index 58e02c1..59bfb15 100644 --- a/bau57B0.h +++ b/bau57B0.h @@ -1,77 +1,19 @@ #pragma once -#include "bau.h" -#include "device_object.h" -#include "address_table_object.h" -#include "association_table_object.h" -#include "group_object_table_object.h" -#include "application_program_object.h" +#include "bau_systemB.h" #include "ip_parameter_object.h" -#include "application_layer.h" -#include "transport_layer.h" -#include "network_layer.h" #include "ip_data_link_layer.h" -#include "platform.h" -#include "memory.h" -class Bau57B0: protected BusAccessUnit +class Bau57B0: public BauSystemB { - using BusAccessUnit::memoryReadIndication; public: Bau57B0(Platform& platform); - void loop(); - DeviceObject& deviceObject(); - GroupObjectTableObject& groupObjectTable(); - ApplicationProgramObject& parameters(); - bool configured(); - bool enabled(); - void enabled(bool value); - void readMemory(); protected: - void memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress, uint8_t* data) override; - void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint16_t memoryAddress) override; - void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType); - void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap); - void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key); - void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress); - void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, - uint32_t memoryAddress, uint8_t* memoryData); - void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t propertyIndex); - void 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); - void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, - uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex); - void individualAddressReadIndication(HopCountType hopType); - void individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress); - void groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength, bool status); - void groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status); - void groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType); - void groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength); - void groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, - uint8_t* data, uint8_t dataLength); - InterfaceObject* getInterfaceObject(uint8_t idx); - void sendNextGroupTelegram(); - void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length); + uint8_t* descriptor(); + DataLinkLayer& dataLinkLayer(); private: - DeviceObject _deviceObj; - // pointer to first private variable as reference to memory read/write commands - uint8_t* _memoryReference; - Memory _memory; - AddressTableObject _addrTable; - AssociationTableObject _assocTable; - GroupObjectTableObject _groupObjTable; - ApplicationProgramObject _appProgram; IpParameterObject _ipParameters; - Platform& _platform; - ApplicationLayer _appLayer; - TransportLayer _transLayer; - NetworkLayer _netLayer; IpDataLinkLayer _dlLayer; - + uint8_t _descriptor[2]; }; \ No newline at end of file diff --git a/bau_systemB.cpp b/bau_systemB.cpp new file mode 100644 index 0000000..d09820e --- /dev/null +++ b/bau_systemB.cpp @@ -0,0 +1,278 @@ +#include "bau_systemB.h" +#include +#include + + +using namespace std; + +BauSystemB::BauSystemB(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference), + _assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference), + _platform(platform), _appLayer(_assocTable, *this), + _transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer) +{ + _appLayer.transportLayer(_transLayer); + _transLayer.networkLayer(_netLayer); + _memory.addSaveRestore(&_deviceObj); + _memory.addSaveRestore(&_appProgram); + _memory.addSaveRestore(&_addrTable); + _memory.addSaveRestore(&_assocTable); + _memory.addSaveRestore(&_groupObjTable); +} + +void BauSystemB::loop() +{ + dataLinkLayer().loop(); + _transLayer.loop(); + sendNextGroupTelegram(); +} + +bool BauSystemB::enabled() +{ + return dataLinkLayer().enabled(); +} + +void BauSystemB::enabled(bool value) +{ + dataLinkLayer().enabled(value); +} + +void BauSystemB::sendNextGroupTelegram() +{ + static uint16_t startIdx = 1; + + GroupObjectTableObject& table = _groupObjTable; + uint16_t objCount = table.entryCount(); + + for (uint16_t asap = startIdx; asap < objCount; asap++) + { + GroupObject& go = table.get(asap); + + ComFlag flag = go.commFlag(); + if (flag != ReadRequest && flag != WriteRequest) + continue; + + if(!go.communicationEnable() || ! go.transmitEnable()) + continue; + + if (flag == WriteRequest) + { + uint8_t* data = go.valueRef(); + _appLayer.groupValueWriteRequest(AckRequested, asap, go.priority(), NetworkLayerParameter, data, + go.sizeInTelegram()); + } + else + { + _appLayer.groupValueReadRequest(AckRequested, asap, go.priority(), NetworkLayerParameter); + } + + go.commFlag(Transmitting); + + startIdx = asap + 1; + return; + } + + startIdx = 1; +} + +void BauSystemB::updateGroupObject(GroupObject & go, uint8_t * data, uint8_t length) +{ + uint8_t* goData = go.valueRef(); + if (length != go.valueSize()) + { + go.commFlag(Error); + return; + } + + memcpy(goData, data, length); + + go.commFlag(cfUpdate); + if (go.updateHandler) + go.updateHandler(go); +} + +void BauSystemB::readMemory() +{ + _memory.readMemory(); +} + +DeviceObject& BauSystemB::deviceObject() +{ + return _deviceObj; +} + +GroupObjectTableObject& BauSystemB::groupObjectTable() +{ + return _groupObjTable; +} + +ApplicationProgramObject& BauSystemB::parameters() +{ + return _appProgram; +} + +bool BauSystemB::configured() +{ + return _groupObjTable.loadState() == LS_LOADED + && _addrTable.loadState() == LS_LOADED + && _assocTable.loadState() == LS_LOADED + && _appProgram.loadState() == LS_LOADED; +} + +void BauSystemB::deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType) +{ + if (descriptorType != 0) + descriptorType = 0x3f; + + _appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor()); +} + +void BauSystemB::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, + uint16_t memoryAddress, uint8_t * data) +{ + memcpy(_memoryReference + memoryAddress, data, number); + _memory.memoryModified(); + + if (_deviceObj.verifyMode()) + memoryReadIndication(priority, hopType, asap, number, memoryAddress); +} + +void BauSystemB::memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, + uint16_t memoryAddress) +{ + _appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, + _memoryReference + memoryAddress); +} + +void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap) +{ + // for platforms that don't really restart + _deviceObj.progMode(false); + + // Flush the EEPROM before resetting + _memory.writeMemory(); + _platform.restart(); +} + +void BauSystemB::authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key) +{ + _appLayer.authorizeResponse(AckRequested, priority, hopType, asap, 0); +} + +void BauSystemB::userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress) +{ + _appLayer.userMemoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress, + _memoryReference + memoryAddress); +} + +void BauSystemB::userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress, uint8_t* data) +{ + memcpy(_memoryReference + memoryAddress, data, number); + _memory.memoryModified(); + + if (_deviceObj.verifyMode()) + userMemoryReadIndication(priority, hopType, asap, number, memoryAddress); +} + +void BauSystemB::propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, + uint8_t propertyId, uint8_t propertyIndex) +{ + uint8_t pid = propertyId; + bool writeEnable = false; + uint8_t type = 0; + uint16_t numberOfElements = 0; + uint8_t access = 0; + InterfaceObject* obj = getInterfaceObject(objectIndex); + if (obj) + obj->readPropertyDescription(pid, propertyIndex, writeEnable, type, numberOfElements, access); + + _appLayer.propertyDescriptionReadResponse(AckRequested, priority, hopType, asap, objectIndex, pid, propertyIndex, + writeEnable, type, numberOfElements, access); +} + +void BauSystemB::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) +{ + InterfaceObject* obj = getInterfaceObject(objectIndex); + if(obj) + obj->writeProperty((PropertyID)propertyId, startIndex, data, numberOfElements); + propertyValueReadIndication(priority, hopType, asap, objectIndex, propertyId, numberOfElements, startIndex); +} + +void BauSystemB::propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, + uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) +{ + uint8_t size = 0; + uint32_t elementCount = numberOfElements; + InterfaceObject* obj = getInterfaceObject(objectIndex); + if (obj) + { + uint8_t elementSize = obj->propertySize((PropertyID)propertyId); + size = elementSize * numberOfElements; + } + else + elementCount = 0; + + uint8_t data[size]; + if(obj) + obj->readProperty((PropertyID)propertyId, startIndex, elementCount, data); + _appLayer.propertyValueReadResponse(AckRequested, priority, hopType, asap, objectIndex, propertyId, elementCount, + startIndex, data, size); +} + +void BauSystemB::individualAddressReadIndication(HopCountType hopType) +{ + if (_deviceObj.progMode()) + _appLayer.individualAddressReadResponse(AckRequested, hopType); +} + +void BauSystemB::individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress) +{ + if (_deviceObj.progMode()) + _deviceObj.induvidualAddress(newaddress); +} + +void BauSystemB::groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength, bool status) +{ + GroupObject& go = _groupObjTable.get(asap); + if (status) + go.commFlag(Ok); + else + go.commFlag(Error); +} + +void BauSystemB::groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status) +{ + GroupObject& go = _groupObjTable.get(asap); + if (status) + go.commFlag(Ok); + else + go.commFlag(Error); +} + +void BauSystemB::groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType) +{ + GroupObject& go = _groupObjTable.get(asap); + uint8_t* data = go.valueRef(); + _appLayer.groupValueReadResponse(AckRequested, asap, priority, hopType, data, go.sizeInTelegram()); +} + +void BauSystemB::groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, uint8_t* data, + uint8_t dataLength) +{ + GroupObject& go = _groupObjTable.get(asap); + + if (!go.communicationEnable() || !go.responseUpdateEnable()) + return; + + updateGroupObject(go, data, dataLength); +} + +void BauSystemB::groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, uint8_t * data, uint8_t dataLength) +{ + GroupObject& go = _groupObjTable.get(asap); + + if (!go.communicationEnable() || !go.writeEnable()) + return; + + updateGroupObject(go, data, dataLength); +} \ No newline at end of file diff --git a/bau_systemB.h b/bau_systemB.h new file mode 100644 index 0000000..75c7694 --- /dev/null +++ b/bau_systemB.h @@ -0,0 +1,74 @@ +#pragma once + +#include "bau.h" +#include "device_object.h" +#include "address_table_object.h" +#include "association_table_object.h" +#include "group_object_table_object.h" +#include "application_program_object.h" +#include "application_layer.h" +#include "transport_layer.h" +#include "network_layer.h" +#include "tpuart_data_link_layer.h" +#include "platform.h" +#include "memory.h" + +class BauSystemB: protected BusAccessUnit +{ +public: + BauSystemB(Platform& platform); + virtual void loop(); + DeviceObject& deviceObject(); + GroupObjectTableObject& groupObjectTable(); + ApplicationProgramObject& parameters(); + bool configured(); + bool enabled(); + void enabled(bool value); + void readMemory(); +protected: + virtual DataLinkLayer& dataLinkLayer() = 0; + virtual uint8_t* descriptor() = 0; + void memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, + uint16_t memoryAddress, uint8_t* data) override; + void memoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, + uint16_t memoryAddress) override; + void deviceDescriptorReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t descriptorType); + void restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap); + void authorizeIndication(Priority priority, HopCountType hopType, uint16_t asap, uint32_t key); + void userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress); + void userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, + uint32_t memoryAddress, uint8_t* memoryData); + void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, + uint8_t propertyId, uint8_t propertyIndex); + void 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); + void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t objectIndex, + uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex); + void individualAddressReadIndication(HopCountType hopType); + void individualAddressWriteIndication(HopCountType hopType, uint16_t newaddress); + void groupValueWriteLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, + uint8_t* data, uint8_t dataLength, bool status); + void groupValueReadLocalConfirm(AckType ack, uint16_t asap, Priority priority, HopCountType hopType, bool status); + void groupValueReadIndication(uint16_t asap, Priority priority, HopCountType hopType); + void groupValueReadAppLayerConfirm(uint16_t asap, Priority priority, HopCountType hopType, + uint8_t* data, uint8_t dataLength); + void groupValueWriteIndication(uint16_t asap, Priority priority, HopCountType hopType, + uint8_t* data, uint8_t dataLength); + + virtual InterfaceObject* getInterfaceObject(uint8_t idx) = 0; + void sendNextGroupTelegram(); + void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length); + + DeviceObject _deviceObj; + // pointer to first private variable as reference to memory read/write commands + uint8_t* _memoryReference; + Memory _memory; + AddressTableObject _addrTable; + AssociationTableObject _assocTable; + GroupObjectTableObject _groupObjTable; + ApplicationProgramObject _appProgram; + Platform& _platform; + ApplicationLayer _appLayer; + TransportLayer _transLayer; + NetworkLayer _netLayer; +}; \ No newline at end of file