mirror of
https://github.com/thelsing/knx.git
synced 2024-10-20 20:07:45 +02: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;
|
using namespace std;
|
||||||
|
|
||||||
Bau07B0::Bau07B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference),
|
Bau07B0::Bau07B0(Platform& platform): BauSystemB(platform),
|
||||||
_assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference),
|
|
||||||
_platform(platform), _appLayer(_assocTable, *this),
|
|
||||||
_transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer),
|
|
||||||
_dlLayer(_deviceObj, _addrTable, _netLayer, _platform)
|
_dlLayer(_deviceObj, _addrTable, _netLayer, _platform)
|
||||||
{
|
{
|
||||||
_appLayer.transportLayer(_transLayer);
|
|
||||||
_transLayer.networkLayer(_netLayer);
|
|
||||||
_netLayer.dataLinkLayer(_dlLayer);
|
_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 };
|
uint8_t descriptor[] = { 0x07, 0xb0 };
|
||||||
|
_descriptor[0] = descriptor[0];
|
||||||
_appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor);
|
_descriptor[1] = descriptor[1];
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InterfaceObject* Bau07B0::getInterfaceObject(uint8_t idx)
|
InterfaceObject* Bau07B0::getInterfaceObject(uint8_t idx)
|
||||||
@ -300,4 +34,14 @@ InterfaceObject* Bau07B0::getInterfaceObject(uint8_t idx)
|
|||||||
default:
|
default:
|
||||||
return nullptr;
|
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
|
#pragma once
|
||||||
|
|
||||||
#include "bau.h"
|
#include "bau_systemB.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 "tpuart_data_link_layer.h"
|
||||||
#include "platform.h"
|
|
||||||
#include "memory.h"
|
|
||||||
|
|
||||||
class Bau07B0: protected BusAccessUnit
|
class Bau07B0: public BauSystemB
|
||||||
{
|
{
|
||||||
using BusAccessUnit::memoryReadIndication;
|
|
||||||
public:
|
public:
|
||||||
Bau07B0(Platform& platform);
|
Bau07B0(Platform& platform);
|
||||||
void loop();
|
|
||||||
DeviceObject& deviceObject();
|
|
||||||
GroupObjectTableObject& groupObjectTable();
|
|
||||||
ApplicationProgramObject& parameters();
|
|
||||||
bool configured();
|
|
||||||
bool enabled();
|
|
||||||
void enabled(bool value);
|
|
||||||
void readMemory();
|
|
||||||
protected:
|
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);
|
InterfaceObject* getInterfaceObject(uint8_t idx);
|
||||||
void sendNextGroupTelegram();
|
uint8_t* descriptor();
|
||||||
void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length);
|
DataLinkLayer& dataLinkLayer();
|
||||||
private:
|
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;
|
TpUartDataLinkLayer _dlLayer;
|
||||||
|
uint8_t _descriptor[2];
|
||||||
};
|
};
|
284
bau57B0.cpp
284
bau57B0.cpp
@ -2,284 +2,18 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
Bau57B0::Bau57B0(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference),
|
Bau57B0::Bau57B0(Platform& platform): BauSystemB(platform),
|
||||||
_assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference),
|
_ipParameters(_deviceObj, platform),
|
||||||
_ipParameters(_deviceObj, platform), _platform(platform), _appLayer(_assocTable, *this),
|
|
||||||
_transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer),
|
|
||||||
_dlLayer(_deviceObj, _addrTable, _ipParameters, _netLayer, _platform)
|
_dlLayer(_deviceObj, _addrTable, _ipParameters, _netLayer, _platform)
|
||||||
{
|
{
|
||||||
_appLayer.transportLayer(_transLayer);
|
|
||||||
_transLayer.networkLayer(_netLayer);
|
|
||||||
_netLayer.dataLinkLayer(_dlLayer);
|
_netLayer.dataLinkLayer(_dlLayer);
|
||||||
_memory.addSaveRestore(&_deviceObj);
|
|
||||||
_memory.addSaveRestore(&_ipParameters);
|
_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 };
|
uint8_t descriptor[] = { 0x57, 0xb0 };
|
||||||
|
_descriptor[0] = descriptor[0];
|
||||||
_appLayer.deviceDescriptorReadResponse(AckRequested, priority, hopType, asap, descriptorType, descriptor);
|
_descriptor[1] = descriptor[1];
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InterfaceObject* Bau57B0::getInterfaceObject(uint8_t idx)
|
InterfaceObject* Bau57B0::getInterfaceObject(uint8_t idx)
|
||||||
@ -303,4 +37,14 @@ InterfaceObject* Bau57B0::getInterfaceObject(uint8_t idx)
|
|||||||
default:
|
default:
|
||||||
return nullptr;
|
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
|
#pragma once
|
||||||
|
|
||||||
#include "bau.h"
|
#include "bau_systemB.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 "ip_parameter_object.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 "ip_data_link_layer.h"
|
||||||
#include "platform.h"
|
|
||||||
#include "memory.h"
|
|
||||||
|
|
||||||
class Bau57B0: protected BusAccessUnit
|
class Bau57B0: public BauSystemB
|
||||||
{
|
{
|
||||||
using BusAccessUnit::memoryReadIndication;
|
|
||||||
public:
|
public:
|
||||||
Bau57B0(Platform& platform);
|
Bau57B0(Platform& platform);
|
||||||
void loop();
|
|
||||||
DeviceObject& deviceObject();
|
|
||||||
GroupObjectTableObject& groupObjectTable();
|
|
||||||
ApplicationProgramObject& parameters();
|
|
||||||
bool configured();
|
|
||||||
bool enabled();
|
|
||||||
void enabled(bool value);
|
|
||||||
void readMemory();
|
|
||||||
protected:
|
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);
|
InterfaceObject* getInterfaceObject(uint8_t idx);
|
||||||
void sendNextGroupTelegram();
|
uint8_t* descriptor();
|
||||||
void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length);
|
DataLinkLayer& dataLinkLayer();
|
||||||
private:
|
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;
|
IpParameterObject _ipParameters;
|
||||||
Platform& _platform;
|
|
||||||
ApplicationLayer _appLayer;
|
|
||||||
TransportLayer _transLayer;
|
|
||||||
NetworkLayer _netLayer;
|
|
||||||
IpDataLinkLayer _dlLayer;
|
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