From 51e83c821059a82663e6e6556fc4d8b5c380cf84 Mon Sep 17 00:00:00 2001 From: Mike <45664417+thewhobox@users.noreply.github.com> Date: Mon, 3 Apr 2023 15:57:31 +0200 Subject: [PATCH] added adc response --- src/knx/application_layer.cpp | 24 ++++++++++++++++++++++++ src/knx/application_layer.h | 2 ++ src/knx/knx_types.h | 2 ++ 3 files changed, 28 insertions(+) diff --git a/src/knx/application_layer.cpp b/src/knx/application_layer.cpp index 861f4a6..f1b44ab 100644 --- a/src/knx/application_layer.cpp +++ b/src/knx/application_layer.cpp @@ -623,6 +623,25 @@ void ApplicationLayer::propertyValueWriteRequest(AckType ack, Priority priority, 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, uint8_t objectIndex, uint8_t propertyId, uint8_t* resultData, uint8_t resultLength) { @@ -1128,6 +1147,11 @@ void ApplicationLayer::individualIndication(HopCountType hopType, Priority prior case KeyResponse: _bau.keyWriteAppLayerConfirm(priority, hopType, tsap, secCtrl, data[1]); break; + case ADCRead: + //Since we don't have an adc for bus voltage, we just send zero as readCount + uint8_t channelNr = tsap & 0b111111; + this->adcReadResponse(AckRequested, priority, hopType, tsap, secCtrl, channelNr, 0, 0); + break; default: print("Individual-indication: unhandled APDU-Type: "); println(apdu.type()); diff --git a/src/knx/application_layer.h b/src/knx/application_layer.h index 327aed1..56b0f60 100644 --- a/src/knx/application_layer.h +++ b/src/knx/application_layer.h @@ -114,6 +114,8 @@ class ApplicationLayer 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, 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, 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, diff --git a/src/knx/knx_types.h b/src/knx/knx_types.h index a97fca9..b0a2a95 100644 --- a/src/knx/knx_types.h +++ b/src/knx/knx_types.h @@ -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 Connectionless Communication Mode (either optional or mandatory) + ADCRead = 0x0180, + ADCResponse = 0x01C0, PropertyValueExtRead = 0x1CC, PropertyValueExtResponse = 0x1CD, PropertyValueExtWriteCon = 0x1CE,