diff --git a/src/arduino_platform.cpp b/src/arduino_platform.cpp index b603a95..44651cb 100644 --- a/src/arduino_platform.cpp +++ b/src/arduino_platform.cpp @@ -1,5 +1,5 @@ #include "arduino_platform.h" -#include +#include "knx/bits.h" #include #include diff --git a/src/knx/application_program_object.cpp b/src/knx/application_program_object.cpp index 4f3993d..d2887f9 100644 --- a/src/knx/application_program_object.cpp +++ b/src/knx/application_program_object.cpp @@ -2,6 +2,7 @@ #include "bits.h" #include "data_property.h" #include "callback_property.h" +#include "dptconvert.h" #include ApplicationProgramObject::ApplicationProgramObject(Memory& memory) @@ -47,3 +48,23 @@ uint32_t ApplicationProgramObject::getInt(uint32_t addr) { return ::getInt(TableObject::data() + addr); } + +double ApplicationProgramObject::getFloat(uint32_t addr, ParameterFloatEncodings encoding) +{ + uint8_t buffer[8]; + switch (encoding) + { + case Float_Enc_DPT9: + return float16FromPayload(TableObject::data() + addr, 0); + break; + case Float_Enc_IEEE754Single: + return float32FromPayload(TableObject::data() + addr, 0); + break; + case Float_Enc_IEEE754Double: + return float64FromPayload(TableObject::data() + addr, 0); + break; + default: + return 0; + break; + } +} diff --git a/src/knx/application_program_object.h b/src/knx/application_program_object.h index 071166a..4c691d2 100644 --- a/src/knx/application_program_object.h +++ b/src/knx/application_program_object.h @@ -1,7 +1,14 @@ #pragma once #include "table_object.h" +#include "bits.h" +enum ParameterFloatEncodings +{ + Float_Enc_DPT9 = 0, // 2 Byte. See Chapter 3.7.2 section 3.10 (Datapoint Types 2-Octet Float Value) + Float_Enc_IEEE754Single = 1, // 4 Byte. C++ float + Float_Enc_IEEE754Double = 2, // 8 Byte. C++ double +}; class ApplicationProgramObject : public TableObject { public: @@ -10,4 +17,5 @@ class ApplicationProgramObject : public TableObject uint8_t getByte(uint32_t addr); uint16_t getWord(uint32_t addr); uint32_t getInt(uint32_t addr); -}; \ No newline at end of file + double getFloat(uint32_t addr, ParameterFloatEncodings encoding); +}; diff --git a/src/knx/config.h b/src/knx/config.h index 21063a9..2ef1b85 100644 --- a/src/knx/config.h +++ b/src/knx/config.h @@ -62,6 +62,6 @@ #endif #if !defined(MASK_VERSION) -#error MASK_VERSION must be defined! See config.j for possible values! +#error MASK_VERSION must be defined! See config.h for possible values! #endif diff --git a/src/knx/dptconvert.cpp b/src/knx/dptconvert.cpp index 84c4f94..ea55d73 100644 --- a/src/knx/dptconvert.cpp +++ b/src/knx/dptconvert.cpp @@ -1713,6 +1713,17 @@ int32_t signed32FromPayload(const uint8_t* payload, int index) { return (int32_t)unsigned32FromPayload(payload, index); } +uint64_t unsigned64FromPayload(const uint8_t* payload, int index) +{ + return ((((uint64_t)payload[index]) << 56) & 0xFF00000000000000) | + ((((uint64_t)payload[index + 1]) << 48) & 0x00FF000000000000) | + ((((uint64_t)payload[index + 2]) << 40) & 0x0000FF0000000000) | + ((((uint64_t)payload[index + 3]) << 32) & 0x000000FF00000000) | + ((((uint64_t)payload[index + 4]) << 24) & 0x00000000FF000000) | + ((((uint64_t)payload[index + 5]) << 16) & 0x0000000000FF0000) | + ((((uint64_t)payload[index + 6]) << 8) & 0x000000000000FF00) | + (((uint64_t)payload[index + 7]) & 0x00000000000000FF); +} double float16FromPayload(const uint8_t* payload, int index) { uint16_t mantissa = unsigned16FromPayload(payload, index) & 0x87FF; @@ -1725,6 +1736,12 @@ float float32FromPayload(const uint8_t* payload, int index) { union { float f; uint32_t i; } area; area.i = unsigned32FromPayload(payload, index); + return area.f; +} +double float64FromPayload(const uint8_t* payload, int index) +{ + union { double f; uint64_t i; } area; + area.i = unsigned64FromPayload(payload, index); return area.f; } int64_t signed64FromPayload(const uint8_t* payload, int index) diff --git a/src/knx/dptconvert.h b/src/knx/dptconvert.h index c7bb308..9256b51 100644 --- a/src/knx/dptconvert.h +++ b/src/knx/dptconvert.h @@ -127,8 +127,10 @@ uint16_t unsigned16FromPayload(const uint8_t* payload, int index); int16_t signed16FromPayload(const uint8_t* payload, int index); uint32_t unsigned32FromPayload(const uint8_t* payload, int index); int32_t signed32FromPayload(const uint8_t* payload, int index); +uint64_t unsigned64FromPayload(const uint8_t* payload, int index); double float16FromPayload(const uint8_t* payload, int index); float float32FromPayload(const uint8_t* payload, int index); +double float64FromPayload(const uint8_t* payload, int index); int64_t signed64FromPayload(const uint8_t* payload, int index); uint8_t bcdFromPayload(const uint8_t* payload, int index); @@ -142,4 +144,4 @@ void signed32ToPayload(uint8_t* payload, size_t payload_length, int index, int32 void float16ToPayload(uint8_t* payload, size_t payload_length, int index, double value, uint16_t mask); //mask = 0xFFFF void float32ToPayload(uint8_t* payload, size_t payload_length, int index, double value, uint32_t mask); //mask = 0xFFFFFFFF void signed64ToPayload(uint8_t* payload, size_t payload_length, int index, int64_t value, uint64_t mask); //mask = UINT64_C(0xFFFFFFFFFFFFFFFF) -void bcdToPayload(uint8_t* payload, size_t payload_length, int index, uint8_t value); \ No newline at end of file +void bcdToPayload(uint8_t* payload, size_t payload_length, int index, uint8_t value); diff --git a/src/knx_facade.cpp b/src/knx_facade.cpp index 272256f..78c8fc8 100644 --- a/src/knx_facade.cpp +++ b/src/knx_facade.cpp @@ -14,7 +14,7 @@ #error Mask version not supported on ARDUINO_ARCH_SAMD #endif -#elif ARDUINO_ARCH_ESP8266 +#elif defined(ARDUINO_ARCH_ESP8266) // predefined global instance for IP only #if MASK_VERSION == 0x57B0 KnxFacade knx; @@ -22,7 +22,7 @@ #error Mask version not supported on ARDUINO_ARCH_ESP8266 #endif -#elif ARDUINO_ARCH_ESP32 +#elif defined(ARDUINO_ARCH_ESP32) // predefined global instance for TP or IP or TP/IP coupler #if MASK_VERSION == 0x07B0 KnxFacade knx; @@ -34,7 +34,7 @@ #error Mask version not supported on ARDUINO_ARCH_ESP8266 #endif -#elif ARDUINO_ARCH_STM32 +#elif defined(ARDUINO_ARCH_STM32) #if MASK_VERSION == 0x07B0 KnxFacade knx; #else diff --git a/src/knx_facade.h b/src/knx_facade.h index 232d37a..b271afc 100644 --- a/src/knx_facade.h +++ b/src/knx_facade.h @@ -9,18 +9,18 @@ #include "knx/bau27B0.h" #include "knx/bau2920.h" void buttonUp(); -#elif ARDUINO_ARCH_ESP8266 +#elif defined(ARDUINO_ARCH_ESP8266) #include "esp_platform.h" #include "knx/bau57B0.h" void buttonUp(); -#elif ARDUINO_ARCH_ESP32 +#elif defined(ARDUINO_ARCH_ESP32) #define LED_BUILTIN 13 #include "esp32_platform.h" #include "knx/bau07B0.h" #include "knx/bau57B0.h" #include "knx/bau091A.h" void buttonUp(); -#elif ARDUINO_ARCH_STM32 +#elif defined(ARDUINO_ARCH_STM32) #include "stm32_platform.h" #include "knx/bau07B0.h" void buttonUp(); @@ -279,6 +279,14 @@ template class KnxFacade : private SaveRestore return _bau.parameters().getInt(addr); } + double paramFloat(uint32_t addr, ParameterFloatEncodings enc) + { + if (!_bau.configured()) + return 0; + + return _bau.parameters().getFloat(addr, enc); + } + #if (MASK_VERSION == 0x07B0) || (MASK_VERSION == 0x27B0) || (MASK_VERSION == 0x57B0) GroupObject& getGroupObject(uint16_t goNr) { @@ -343,14 +351,14 @@ template class KnxFacade : private SaveRestore #else #error "Mask version not supported on ARDUINO_ARCH_SAMD" #endif -#elif ARDUINO_ARCH_ESP8266 +#elif defined(ARDUINO_ARCH_ESP8266) // predefined global instance for IP only #if MASK_VERSION == 0x57B0 extern KnxFacade knx; #else #error "Mask version not supported on ARDUINO_ARCH_ESP8266" #endif -#elif ARDUINO_ARCH_ESP32 +#elif defined(ARDUINO_ARCH_ESP32) // predefined global instance for TP or IP or TP/IP coupler #if MASK_VERSION == 0x07B0 extern KnxFacade knx; @@ -361,7 +369,7 @@ template class KnxFacade : private SaveRestore #else #error "Mask version not supported on ARDUINO_ARCH_ESP32" #endif -#elif ARDUINO_ARCH_STM32 +#elif defined(ARDUINO_ARCH_STM32) // predefined global instance for TP only #if MASK_VERSION == 0x07B0 extern KnxFacade knx;