mirror of
https://github.com/thelsing/knx.git
synced 2025-01-21 00:05:43 +01:00
refactore bau code
This commit is contained in:
parent
b0b6336899
commit
24150d155b
284
bau07B0.cpp
284
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t* Bau07B0::descriptor()
|
||||
{
|
||||
return _descriptor;
|
||||
}
|
||||
|
||||
DataLinkLayer& Bau07B0::dataLinkLayer()
|
||||
{
|
||||
return _dlLayer;
|
||||
}
|
||||
|
68
bau07B0.h
68
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];
|
||||
};
|
284
bau57B0.cpp
284
bau57B0.cpp
@ -2,284 +2,18 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
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;
|
||||
}
|
68
bau57B0.h
68
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];
|
||||
};
|
278
bau_systemB.cpp
Normal file
278
bau_systemB.cpp
Normal file
@ -0,0 +1,278 @@
|
||||
#include "bau_systemB.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
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);
|
||||
}
|
74
bau_systemB.h
Normal file
74
bau_systemB.h
Normal file
@ -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;
|
||||
};
|
Loading…
Reference in New Issue
Block a user