mirror of
https://github.com/thelsing/knx.git
synced 2024-12-18 19:08:18 +01:00
Added FunctionProperty Callback (#238)
* add commitNonVolatileMemory overload to batch write chars n times to flash * added functionproperty callback * added function property state * fixed function data length * removed ifdef and fixed missing references * added adc response * fix * fixed ADCResponse --------- Co-authored-by: Ing-Dom <dom@ing-dom.de>
This commit is contained in:
parent
5007462c70
commit
0d140a5182
@ -623,10 +623,29 @@ void ApplicationLayer::propertyValueWriteRequest(AckType ack, Priority priority,
|
|||||||
startIndex, data, length);
|
startIndex, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ApplicationLayer::adcReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
||||||
|
uint8_t channelNr, uint8_t readCount, int16_t value)
|
||||||
|
{
|
||||||
|
CemiFrame frame(4);
|
||||||
|
APDU& apdu = frame.apdu();
|
||||||
|
apdu.type(ADCResponse);
|
||||||
|
uint8_t* data = apdu.data();
|
||||||
|
|
||||||
|
data[0] |= (channelNr & 0b111111);
|
||||||
|
data[1] = readCount;
|
||||||
|
data[2] = value >> 8;
|
||||||
|
data[3] = value & 0xFF;
|
||||||
|
|
||||||
|
if (asap == _connectedTsap)
|
||||||
|
dataConnectedRequest(asap, priority, apdu, secCtrl);
|
||||||
|
else
|
||||||
|
dataIndividualRequest(ack, hopType, priority, asap, apdu, secCtrl);
|
||||||
|
}
|
||||||
|
|
||||||
void ApplicationLayer::functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
void ApplicationLayer::functionPropertyStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
||||||
uint8_t objectIndex, uint8_t propertyId, uint8_t* resultData, uint8_t resultLength)
|
uint8_t objectIndex, uint8_t propertyId, uint8_t* resultData, uint8_t resultLength)
|
||||||
{
|
{
|
||||||
CemiFrame frame(3 + resultLength + 1);
|
CemiFrame frame(3 + resultLength);
|
||||||
APDU& apdu = frame.apdu();
|
APDU& apdu = frame.apdu();
|
||||||
apdu.type(FunctionPropertyStateResponse);
|
apdu.type(FunctionPropertyStateResponse);
|
||||||
uint8_t* data = apdu.data() + 1;
|
uint8_t* data = apdu.data() + 1;
|
||||||
@ -1033,10 +1052,10 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior
|
|||||||
break;
|
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() - 3); //TODO: check length
|
||||||
break;
|
break;
|
||||||
case FunctionPropertyState:
|
case FunctionPropertyState:
|
||||||
_bau.functionPropertyStateIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 4); //TODO: check length
|
_bau.functionPropertyStateIndication(priority, hopType, tsap, secCtrl, data[1], data[2], &data[3], apdu.length() - 3); //TODO: check length
|
||||||
break;
|
break;
|
||||||
case FunctionPropertyExtCommand:
|
case FunctionPropertyExtCommand:
|
||||||
{
|
{
|
||||||
@ -1128,6 +1147,13 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior
|
|||||||
case KeyResponse:
|
case KeyResponse:
|
||||||
_bau.keyWriteAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1]);
|
_bau.keyWriteAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1]);
|
||||||
break;
|
break;
|
||||||
|
case ADCRead:
|
||||||
|
{
|
||||||
|
//Since we don't have an adc for bus voltage, we just send zero as readCount
|
||||||
|
uint8_t channelNr = data[0] & 0b111111;
|
||||||
|
this->adcReadResponse(AckRequested, priority, hopType, tsap, secCtrl, channelNr, 0, 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
print("Individual-indication: unhandled APDU-Type: ");
|
print("Individual-indication: unhandled APDU-Type: ");
|
||||||
println(apdu.type());
|
println(apdu.type());
|
||||||
|
@ -114,6 +114,8 @@ class ApplicationLayer
|
|||||||
uint16_t objectType, uint8_t objectInstance, uint8_t propertyId, uint8_t numberOfElements, uint16_t startIndex, uint8_t returnCode);
|
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 adcReadResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
||||||
|
uint8_t channelNr, uint8_t readCount, int16_t value);
|
||||||
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,
|
||||||
uint8_t objectIndex, uint8_t propertyId, uint8_t *resultData, uint8_t resultLength);
|
uint8_t objectIndex, uint8_t propertyId, uint8_t *resultData, uint8_t resultLength);
|
||||||
void functionPropertyExtStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
void functionPropertyExtStateResponse(AckType ack, Priority priority, HopCountType hopType, uint16_t asap, const SecurityControl& secCtrl,
|
||||||
|
@ -347,3 +347,21 @@ BeforeRestartCallback BusAccessUnit::beforeRestartCallback()
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BusAccessUnit::functionPropertyCallback(FunctionPropertyCallback func)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPropertyCallback BusAccessUnit::functionPropertyCallback()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BusAccessUnit::functionPropertyStateCallback(FunctionPropertyCallback func)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPropertyCallback BusAccessUnit::functionPropertyStateCallback()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
@ -4,6 +4,7 @@
|
|||||||
#include "interface_object.h"
|
#include "interface_object.h"
|
||||||
|
|
||||||
typedef void (*BeforeRestartCallback)(void);
|
typedef void (*BeforeRestartCallback)(void);
|
||||||
|
typedef void (*FunctionPropertyCallback)(uint8_t objectIndex, uint8_t propertyId, uint8_t length, uint8_t *data, uint8_t *resultData, uint8_t &resultLength);
|
||||||
|
|
||||||
class BusAccessUnit
|
class BusAccessUnit
|
||||||
{
|
{
|
||||||
@ -165,4 +166,8 @@ class BusAccessUnit
|
|||||||
uint8_t* data, uint32_t length);
|
uint8_t* data, uint32_t length);
|
||||||
virtual void beforeRestartCallback(BeforeRestartCallback func);
|
virtual void beforeRestartCallback(BeforeRestartCallback func);
|
||||||
virtual BeforeRestartCallback beforeRestartCallback();
|
virtual BeforeRestartCallback beforeRestartCallback();
|
||||||
|
virtual void functionPropertyCallback(FunctionPropertyCallback func);
|
||||||
|
virtual FunctionPropertyCallback functionPropertyCallback();
|
||||||
|
virtual void functionPropertyStateCallback(FunctionPropertyCallback func);
|
||||||
|
virtual FunctionPropertyCallback functionPropertyStateCallback();
|
||||||
};
|
};
|
||||||
|
@ -312,7 +312,10 @@ void BauSystemB::functionPropertyCommandIndication(Priority priority, HopCountTy
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resultLength = 0; // We must not send a return code or any data fields
|
if(_functionProperty != 0)
|
||||||
|
_functionProperty(objectIndex, propertyId, length, data, resultData, resultLength);
|
||||||
|
else
|
||||||
|
resultLength = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +337,10 @@ void BauSystemB::functionPropertyStateIndication(Priority priority, HopCountType
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resultLength = 0; // We must not send a return code or any data fields
|
if(_functionPropertyState != 0)
|
||||||
|
_functionPropertyState(objectIndex, propertyId, length, data, resultData, resultLength);
|
||||||
|
else
|
||||||
|
resultLength = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -638,3 +644,22 @@ BeforeRestartCallback BauSystemB::beforeRestartCallback()
|
|||||||
{
|
{
|
||||||
return _beforeRestart;
|
return _beforeRestart;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BauSystemB::functionPropertyCallback(FunctionPropertyCallback func)
|
||||||
|
{
|
||||||
|
_functionProperty = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPropertyCallback BauSystemB::functionPropertyCallback()
|
||||||
|
{
|
||||||
|
return _functionProperty;
|
||||||
|
}
|
||||||
|
void BauSystemB::functionPropertyStateCallback(FunctionPropertyCallback func)
|
||||||
|
{
|
||||||
|
_functionPropertyState = func;
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionPropertyCallback BauSystemB::functionPropertyStateCallback()
|
||||||
|
{
|
||||||
|
return _functionPropertyState;
|
||||||
|
}
|
@ -43,6 +43,10 @@ class BauSystemB : protected BusAccessUnit
|
|||||||
VersionCheckCallback versionCheckCallback();
|
VersionCheckCallback versionCheckCallback();
|
||||||
void beforeRestartCallback(BeforeRestartCallback func);
|
void beforeRestartCallback(BeforeRestartCallback func);
|
||||||
BeforeRestartCallback beforeRestartCallback();
|
BeforeRestartCallback beforeRestartCallback();
|
||||||
|
void functionPropertyCallback(FunctionPropertyCallback func);
|
||||||
|
FunctionPropertyCallback functionPropertyCallback();
|
||||||
|
void functionPropertyStateCallback(FunctionPropertyCallback func);
|
||||||
|
FunctionPropertyCallback functionPropertyStateCallback();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ApplicationLayer& applicationLayer() = 0;
|
virtual ApplicationLayer& applicationLayer() = 0;
|
||||||
@ -113,4 +117,6 @@ class BauSystemB : protected BusAccessUnit
|
|||||||
SecurityControl _restartSecurity;
|
SecurityControl _restartSecurity;
|
||||||
uint32_t _restartDelay = 0;
|
uint32_t _restartDelay = 0;
|
||||||
BeforeRestartCallback _beforeRestart = 0;
|
BeforeRestartCallback _beforeRestart = 0;
|
||||||
|
FunctionPropertyCallback _functionProperty = 0;
|
||||||
|
FunctionPropertyCallback _functionPropertyState = 0;
|
||||||
};
|
};
|
||||||
|
@ -159,6 +159,8 @@ 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)
|
||||||
|
ADCRead = 0x0180,
|
||||||
|
ADCResponse = 0x01C0,
|
||||||
PropertyValueExtRead = 0x1CC,
|
PropertyValueExtRead = 0x1CC,
|
||||||
PropertyValueExtResponse = 0x1CD,
|
PropertyValueExtResponse = 0x1CD,
|
||||||
PropertyValueExtWriteCon = 0x1CE,
|
PropertyValueExtWriteCon = 0x1CE,
|
||||||
|
Loading…
Reference in New Issue
Block a user