Add PropertyValueExt* AL services. Handle master reset in AL service RESTART.

This commit is contained in:
Nanosonde 2020-06-30 19:45:31 +02:00
parent 2463e6ffaf
commit 780001bd59
8 changed files with 209 additions and 18 deletions

View File

@ -467,6 +467,20 @@ void ApplicationLayer::restartRequest(AckType ack, Priority priority, HopCountTy
individualSend(ack, hopType, priority, _connectedTsap, apdu, secCtrl); individualSend(ack, hopType, priority, _connectedTsap, apdu, secCtrl);
} }
void ApplicationLayer::restartResponse(AckType ack, Priority priority, HopCountType hopType, const SecurityControl& secCtrl, uint8_t errorCode, uint16_t processTime)
{
CemiFrame frame(3);
APDU& apdu = frame.apdu();
apdu.type(Restart);
uint8_t* data = apdu.data();
data[0] |= (1 << 5) | 1; // Set response bit and a restart type of "master reset". Only the master reset sends a response.
data[1] = errorCode;
data[2] = processTime >> 8;
data[3] = processTime & 0xFF;
individualSend(ack, hopType, priority, _connectedTsap, apdu, secCtrl);
}
//TODO: ApplicationLayer::systemNetworkParameterReadRequest() //TODO: ApplicationLayer::systemNetworkParameterReadRequest()
void ApplicationLayer::systemNetworkParameterReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, void ApplicationLayer::systemNetworkParameterReadResponse(Priority priority, HopCountType hopType, const SecurityControl &secCtrl,
uint16_t objectType, uint16_t propertyId, uint16_t objectType, uint16_t propertyId,
@ -549,6 +563,21 @@ void ApplicationLayer::propertyValueReadResponse(AckType ack, Priority priority,
startIndex, data, length); startIndex, data, length);
} }
void ApplicationLayer::propertyValueExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
{
propertyExtDataSend(PropertyValueExtResponse, ack, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, numberOfElements,
startIndex, data, length);
}
void ApplicationLayer::propertyValueExtWriteConResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t returnCode)
{
uint8_t noOfElem = (returnCode != ReturnCodes::Success) ? 0 : numberOfElements;
propertyExtDataSend(PropertyValueExtWriteConResponse, ack, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, noOfElem,
startIndex, &returnCode, 1);
}
void ApplicationLayer::propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, void ApplicationLayer::propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t * data, uint8_t length) uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t * data, uint8_t length)
{ {
@ -761,6 +790,33 @@ void ApplicationLayer::propertyDataSend(ApduType type, AckType ack, Priority pri
dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl); dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
} }
void ApplicationLayer::propertyExtDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length)
{
CemiFrame frame(9 + length);
APDU& apdu = frame.apdu();
apdu.type(type);
uint8_t* apduData = apdu.data();
apduData += 1;
apduData[0] = ((uint16_t)objectType) >> 8;
apduData[1] = ((uint16_t)objectType) & 0xFF;
apduData[2] = objectInstance >> 4;
apduData[3] = ((objectInstance&0x0F) << 4) | (propertyId >> 8);
apduData[4] = (propertyId & 0xFF);
apduData[5] = numberOfElements;
apduData[6] = (startIndex & 0x0FFF)>> 8;
apduData[7] = startIndex & 0xFF;
if (length > 0)
memcpy(apduData+8, data, length);
if (asap == _connectedTsap)
dataConnectedRequest(asap, priority, apdu, secCtrl);
else
dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
}
void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl, void ApplicationLayer::groupValueSend(ApduType type, AckType ack, uint16_t asap, Priority priority, HopCountType hopType, const SecurityControl &secCtrl,
uint8_t* data, uint8_t& dataLength) uint8_t* data, uint8_t& dataLength)
{ {
@ -827,6 +883,11 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior
break; break;
case Restart: case Restart:
{ {
// These reserved bits must be 0
uint8_t reservedBits = *data & 0x1e;
if (reservedBits != 0)
return;
// handle erase code for factory reset (setting FDSK again as toolkey, etc.) // handle erase code for factory reset (setting FDSK again as toolkey, etc.)
RestartType restartType = (RestartType) (*data & 0x3f); RestartType restartType = (RestartType) (*data & 0x3f);
EraseCode eraseCode = EraseCode::Void; EraseCode eraseCode = EraseCode::Void;
@ -865,6 +926,29 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior
startIndex, data + 5, apdu.length() - 5); startIndex, data + 5, apdu.length() - 5);
break; break;
} }
case PropertyValueExtRead:
{
ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
uint8_t numberOfElements = data[6];
uint16_t startIndex = ((data[7] & 0xf) << 8) | (data[8] & 0xff);
_bau.propertyValueExtReadIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, numberOfElements, startIndex);
break;
}
case PropertyValueExtWriteCon:
case PropertyValueExtWriteUnCon:
{
ObjectType objectType = (ObjectType)(((data[1] & 0xff) << 8) | (data[2] & 0xff));
uint8_t objectInstance = ((data[3] & 0xff) << 4) | ((data[4] & 0xff) >> 4);
uint16_t propertyId = ((data[4] & 0xf) << 8) | (data[5] & 0xff);
uint8_t numberOfElements = data[6];
uint16_t startIndex = ((data[7] & 0xf) << 8) | (data[8] & 0xff);
bool confirmed = (apdu.type() == PropertyValueExtWriteCon);
_bau.propertyValueExtWriteIndication(priority, hopType, tsap, secCtrl, objectType, objectInstance, propertyId, numberOfElements, startIndex,
data + 9, apdu.length() - 9, confirmed);
break;
}
case FunctionPropertyCommand: case FunctionPropertyCommand:
_bau.functionPropertyCommandIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 4); //TODO: check length _bau.functionPropertyCommandIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 4); //TODO: check length
break; break;

View File

@ -100,10 +100,15 @@ class ApplicationLayer
void disconnectRequest(Priority priority); void disconnectRequest(Priority priority);
bool isConnected(); bool isConnected();
void restartRequest(AckType ack, Priority priority, HopCountType hopType, const SecurityControl& secCtrl); void restartRequest(AckType ack, Priority priority, HopCountType hopType, const SecurityControl& secCtrl);
void restartResponse(AckType ack, Priority priority, HopCountType hopType, const SecurityControl& secCtrl, uint8_t errorCode, uint16_t processTime);
void propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, void propertyValueReadRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex); uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex);
void propertyValueReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t objectIndex, void propertyValueReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length);
void propertyValueExtReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length);
void propertyValueExtWriteConResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t returnCode);
void propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t objectIndex, void propertyValueWriteRequest(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length);
void functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, void functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
@ -179,6 +184,8 @@ class ApplicationLayer
void propertyDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, void propertyDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data,
uint8_t length); uint8_t length);
void propertyExtDataSend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length);
void memorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number, void memorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, uint8_t number,
uint16_t memoryAddress, uint8_t* memoryData); uint16_t memoryAddress, uint8_t* memoryData);
void userMemorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl, void userMemorySend(ApduType type, AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,

View File

@ -106,6 +106,11 @@ void BusAccessUnit::propertyValueReadIndication(Priority priority, HopCountType
{ {
} }
void BusAccessUnit::propertyValueExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
{
}
void BusAccessUnit::functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t* data, uint8_t length) void BusAccessUnit::functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t* data, uint8_t length)
{ {
} }
@ -138,6 +143,10 @@ void BusAccessUnit::propertyValueWriteIndication(Priority priority, HopCountType
{ {
} }
void BusAccessUnit::propertyValueExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool confirmed)
{
}
void BusAccessUnit::propertyDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool status) void BusAccessUnit::propertyDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool status)
{ {
} }

View File

@ -48,6 +48,8 @@ class BusAccessUnit
uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, bool status); uint8_t objectIndex, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, bool status);
virtual void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, virtual void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex); uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex);
virtual void propertyValueExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex);
virtual void functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, virtual void functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t* data, uint8_t length);
virtual void functionPropertyStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, virtual void functionPropertyStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
@ -64,6 +66,8 @@ class BusAccessUnit
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool status); uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool status);
virtual void propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, virtual void propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length);
virtual void propertyValueExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool confirmed);
virtual void propertyDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, virtual void propertyDescriptionReadLocalConfirm(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,
uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool status); uint8_t objectIndex, uint8_t propertyId, uint8_t propertyIndex, bool status);
virtual void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, virtual void propertyDescriptionReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl,

View File

@ -12,6 +12,7 @@ enum NmReadSerialNumberType
}; };
static constexpr auto kFunctionPropertyResultBufferMaxSize = 64; static constexpr auto kFunctionPropertyResultBufferMaxSize = 64;
static constexpr auto kRestartProcessTime = 3;
BauSystemB::BauSystemB(Platform& platform): _memory(platform, _deviceObj), _addrTable(_memory), BauSystemB::BauSystemB(Platform& platform): _memory(platform, _deviceObj), _addrTable(_memory),
_assocTable(_memory), _groupObjTable(_memory), _appProgram(_memory), _assocTable(_memory), _groupObjTable(_memory), _appProgram(_memory),
@ -158,18 +159,47 @@ bool BauSystemB::configured()
return _configured; return _configured;
} }
void BauSystemB::masterReset(EraseCode eraseCode, uint8_t channel) uint8_t BauSystemB::masterReset(EraseCode eraseCode, uint8_t channel)
{ {
static constexpr uint8_t successCode = 0x00; // Where does this come from? It is the code for "success".
static constexpr uint8_t invalidEraseCode = 0x02; // Where does this come from? It is the error code for "unspported erase code".
switch (eraseCode) switch (eraseCode)
{ {
case EraseCode::ConfimrmedRestart: case EraseCode::ConfirmedRestart:
{ {
println("Confirmed restart requested."); println("Confirmed restart requested.");
break; return successCode;
}
case EraseCode::ResetAP:
{
// TODO: increase download counter except for confirmed restart (PID_DOWNLOAD_COUNTER)
println("ResetAP requested.");
return successCode;
}
case EraseCode::ResetIA:
{
// TODO: increase download counter except for confirmed restart (PID_DOWNLOAD_COUNTER)
println("ResetAP requested.");
return successCode;
}
case EraseCode::ResetLinks:
{
// TODO: increase download counter except for confirmed restart (PID_DOWNLOAD_COUNTER)
println("ResetLinks requested.");
return successCode;
}
case EraseCode::ResetParam:
{
// TODO: increase download counter except for confirmed restart (PID_DOWNLOAD_COUNTER)
println("ResetParam requested.");
return successCode;
} }
case EraseCode::FactoryReset: case EraseCode::FactoryReset:
case EraseCode::FactoryResetWithoutIA: case EraseCode::FactoryResetWithoutIA:
{ {
// TODO: increase download counter except for confirmed restart (PID_DOWNLOAD_COUNTER)
#ifdef USE_DATASECURE #ifdef USE_DATASECURE
print("Factory reset requested. type: "); print("Factory reset requested. type: ");
println(eraseCode == EraseCode::FactoryReset ? "FactoryReset with IA" : "FactoryReset without IA"); println(eraseCode == EraseCode::FactoryReset ? "FactoryReset with IA" : "FactoryReset without IA");
@ -177,13 +207,13 @@ void BauSystemB::masterReset(EraseCode eraseCode, uint8_t channel)
// and disable security mode // and disable security mode
_secIfObj.factoryReset(); _secIfObj.factoryReset();
#endif #endif
break; return successCode;
} }
default: default:
{ {
print("Unhandled erase code: "); print("Unhandled erase code: ");
println(eraseCode, HEX); println(eraseCode, HEX);
break; return invalidEraseCode;
} }
} }
} }
@ -222,12 +252,12 @@ void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopTyp
} }
else if (restartType == RestartType::MasterReset) else if (restartType == RestartType::MasterReset)
{ {
masterReset(eraseCode, channel); uint8_t errorCode = masterReset(eraseCode, channel);
_appLayer.restartResponse(AckRequested, priority, hopType, secCtrl, errorCode, (errorCode == 0) ? kRestartProcessTime : 0);
} }
else else
{ {
println("Unhandled restart type"); // Cannot happen as restartType is just one bit
return;
} }
// Flush the EEPROM before resetting // Flush the EEPROM before resetting
@ -279,6 +309,23 @@ void BauSystemB::propertyValueWriteIndication(Priority priority, HopCountType ho
propertyValueReadIndication(priority, hopType, asap, secCtrl, objectIndex, propertyId, numberOfElements, startIndex); propertyValueReadIndication(priority, hopType, asap, secCtrl, objectIndex, propertyId, numberOfElements, startIndex);
} }
void BauSystemB::propertyValueExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool confirmed)
{
uint8_t returnCode = ReturnCodes::Success;
InterfaceObject* obj = getInterfaceObject(objectType, objectInstance);
if(obj)
obj->writeProperty((PropertyID)propertyId, startIndex, data, numberOfElements);
else
returnCode = ReturnCodes::AddressVoid;
if (confirmed)
{
_appLayer.propertyValueExtWriteConResponse(AckRequested, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, numberOfElements, startIndex, returnCode);
}
}
void BauSystemB::propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void BauSystemB::propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
{ {
@ -304,6 +351,31 @@ void BauSystemB::propertyValueReadIndication(Priority priority, HopCountType hop
startIndex, data, size); startIndex, data, size);
} }
void BauSystemB::propertyValueExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex)
{
uint8_t size = 0;
uint8_t elementCount = numberOfElements;
InterfaceObject* obj = getInterfaceObject(objectType, objectInstance);
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);
if (elementCount == 0)
size = 0;
_appLayer.propertyValueExtReadResponse(AckRequested, priority, hopType, asap, secCtrl, objectType, objectInstance, propertyId, elementCount,
startIndex, data, size);
}
void BauSystemB::functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void BauSystemB::functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t* data, uint8_t length) uint8_t propertyId, uint8_t* data, uint8_t length)
{ {
@ -444,11 +516,12 @@ void BauSystemB::addSaveRestore(SaveRestore* obj)
_memory.addSaveRestore(obj); _memory.addSaveRestore(obj);
} }
bool BauSystemB::restartRequest(uint16_t asap, const SecurityControl &secCtrl) bool BauSystemB::restartRequest(uint16_t asap, const SecurityControl secCtrl)
{ {
if (_appLayer.isConnected()) if (_appLayer.isConnected())
return false; return false;
_restartState = Connecting; // order important, has to be set BEFORE connectRequest _restartState = Connecting; // order important, has to be set BEFORE connectRequest
_restartSecurity = secCtrl;
_appLayer.connectRequest(asap, SystemPriority); _appLayer.connectRequest(asap, SystemPriority);
_appLayer.deviceDescriptorReadRequest(AckRequested, SystemPriority, NetworkLayerParameter, asap, secCtrl, 0); _appLayer.deviceDescriptorReadRequest(AckRequested, SystemPriority, NetworkLayerParameter, asap, secCtrl, 0);
return true; return true;
@ -486,7 +559,7 @@ void BauSystemB::nextRestartState()
/* connection confirmed, we send restartRequest, but we wait a moment (sending ACK etc)... */ /* connection confirmed, we send restartRequest, but we wait a moment (sending ACK etc)... */
if (millis() - _restartDelay > 30) if (millis() - _restartDelay > 30)
{ {
_appLayer.restartRequest(AckRequested, SystemPriority, NetworkLayerParameter, secCtrl); _appLayer.restartRequest(AckRequested, SystemPriority, NetworkLayerParameter, _restartSecurity);
_restartState = Restarted; _restartState = Restarted;
_restartDelay = millis(); _restartDelay = millis();
} }

View File

@ -31,8 +31,8 @@ class BauSystemB : protected BusAccessUnit
void readMemory(); void readMemory();
void writeMemory(); void writeMemory();
void addSaveRestore(SaveRestore* obj); void addSaveRestore(SaveRestore* obj);
bool restartRequest(uint16_t asap, const SecurityControl &secCtrl); bool restartRequest(uint16_t asap, const SecurityControl secCtrl);
void masterReset(EraseCode eraseCode, uint8_t channel); uint8_t masterReset(EraseCode eraseCode, uint8_t channel);
void propertyValueRead(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId, void propertyValueRead(ObjectType objectType, uint8_t objectInstance, uint8_t propertyId,
uint8_t& numberOfElements, uint16_t startIndex, uint8_t& numberOfElements, uint16_t startIndex,
@ -57,16 +57,20 @@ class BauSystemB : protected BusAccessUnit
uint8_t propertyId, uint8_t propertyIndex) override; uint8_t propertyId, uint8_t propertyIndex) override;
void propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void propertyValueWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length) override; uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length) override;
void propertyValueExtWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t* data, uint8_t length, bool confirmed);
void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void propertyValueReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) override; uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) override;
void propertyValueExtReadIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex) override;
void functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void functionPropertyCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t* data, uint8_t length) override;
void functionPropertyStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex, void functionPropertyStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, uint8_t objectIndex,
uint8_t propertyId, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t* data, uint8_t length) override;
void functionPropertyExtCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, void functionPropertyExtCommandIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t* data, uint8_t length) override;
void functionPropertyExtStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance, void functionPropertyExtStateIndication(Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl &secCtrl, ObjectType objectType, uint8_t objectInstance,
uint8_t propertyId, uint8_t* data, uint8_t length); uint8_t propertyId, uint8_t* data, uint8_t length) override;
void individualAddressReadIndication(HopCountType hopType, const SecurityControl &secCtrl) override; void individualAddressReadIndication(HopCountType hopType, const SecurityControl &secCtrl) override;
void individualAddressWriteIndication(HopCountType hopType, const SecurityControl &secCtrl, uint16_t newaddress) override; void individualAddressWriteIndication(HopCountType hopType, const SecurityControl &secCtrl, uint16_t newaddress) override;
void individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t newIndividualAddress, void individualAddressSerialNumberWriteIndication(Priority priority, HopCountType hopType, const SecurityControl &secCtrl, uint16_t newIndividualAddress,
@ -117,5 +121,6 @@ class BauSystemB : protected BusAccessUnit
NetworkLayer _netLayer; NetworkLayer _netLayer;
bool _configured = true; bool _configured = true;
RestartState _restartState = Idle; RestartState _restartState = Idle;
SecurityControl _restartSecurity;
uint32_t _restartDelay = 0; uint32_t _restartDelay = 0;
}; };

View File

@ -155,6 +155,13 @@ enum ApduType
// Application Layer Services on Point-to-point Connection-Oriented Communication Mode (mandatory) // Application Layer Services on Point-to-point Connection-Oriented Communication Mode (mandatory)
// Application Layer Services on Point-to-point Connectionless Communication Mode (either optional or mandatory) // Application Layer Services on Point-to-point Connectionless Communication Mode (either optional or mandatory)
PropertyValueExtRead = 0x1CC,
PropertyValueExtResponse = 0x1CD,
PropertyValueExtWriteCon = 0x1CE,
PropertyValueExtWriteConResponse = 0x1CF,
PropertyValueExtWriteUnCon = 0x1D0,
PropertyExtDescriptionRead = 0x1D2,
PropertyExtDescriptionResponse = 0x1D3,
FunctionPropertyExtCommand = 0x1D4, FunctionPropertyExtCommand = 0x1D4,
FunctionPropertyExtState = 0x1D5, FunctionPropertyExtState = 0x1D5,
FunctionPropertyExtStateResponse = 0x1D6, FunctionPropertyExtStateResponse = 0x1D6,
@ -208,7 +215,7 @@ enum RestartType
enum EraseCode enum EraseCode
{ {
Void = 0x00, Void = 0x00,
ConfimrmedRestart = 0x01, ConfirmedRestart = 0x01,
FactoryReset = 0x02, FactoryReset = 0x02,
ResetIA = 0x03, ResetIA = 0x03,
ResetAP = 0x04, ResetAP = 0x04,

View File

@ -86,6 +86,8 @@ enum PropertyID
PID_VERSION = 25, PID_VERSION = 25,
PID_MCB_TABLE = 27, PID_MCB_TABLE = 27,
PID_ERROR_CODE = 28, PID_ERROR_CODE = 28,
PID_OBJECT_INDEX = 29,
PID_DOWNLOAD_COUNTER = 30,
/** Properties in the Device Object */ /** Properties in the Device Object */
PID_ROUTING_COUNT = 51, PID_ROUTING_COUNT = 51,