From 977e31f2ba8ee22183bdcbb02dae0f2948709d65 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 30 Jan 2022 22:04:06 +0100 Subject: [PATCH] Add support for floating point attribute parsing --- libnymea-zigbee/zigbeedatatype.cpp | 45 ++++++++++++++++++++++++++++++ libnymea-zigbee/zigbeedatatype.h | 3 ++ 2 files changed, 48 insertions(+) diff --git a/libnymea-zigbee/zigbeedatatype.cpp b/libnymea-zigbee/zigbeedatatype.cpp index 1276cca..59d2554 100644 --- a/libnymea-zigbee/zigbeedatatype.cpp +++ b/libnymea-zigbee/zigbeedatatype.cpp @@ -600,6 +600,51 @@ QString ZigbeeDataType::toString(bool *ok) const return value; } +float ZigbeeDataType::toFloat(bool *ok) const +{ + if (ok) *ok = true; + float value = 0; + if (m_dataType == Zigbee::FloatSemi && m_data.length() == 2) { + value = (m_data.at(0) & 0xFF) + | ((m_data.at(1) & 0xFF00) << 8); + } else if (m_dataType == Zigbee::FloatSingle && m_data.length() == 4) { + value = (m_data.at(0) & 0xFF) + | ((m_data.at(1) & 0xFF00) << 8) + | ((m_data.at(2) & 0xFF0000) << 16) + | ((m_data.at(3) & 0xFF000000) << 24); + } else { + if (ok) *ok = false; + } + return value; +} + +double ZigbeeDataType::toDouble(bool *ok) const +{ + if (ok) *ok = true; + double value = 0; + if (m_dataType == Zigbee::FloatSemi && m_data.length() == 2) { + value = (m_data.at(0) & 0xFF) + | ((m_data.at(1) & 0xFF00) << 8); + } else if (m_dataType == Zigbee::FloatSingle && m_data.length() == 4) { + value = (m_data.at(0) & 0xFF) + | ((m_data.at(1) & 0xFF00) << 8) + | ((m_data.at(2) & 0xFF0000) << 16) + | ((m_data.at(3) & 0xFF000000) << 24); + } else if (m_dataType == Zigbee::FloatDouble && m_data.length() == 8) { + value = (m_data.at(0) & 0xFF) + | ((m_data.at(1) & 0xFF00) << 8) + | ((m_data.at(2) & 0xFF0000) << 16) + | ((m_data.at(3) & 0xFF000000) << 24) + | ((m_data.at(4) & 0xFF00000000) << 32) + | ((m_data.at(5) & 0xFF0000000000) << 40) + | ((m_data.at(6) & 0xFF000000000000) << 48) + | ((m_data.at(7) & 0xFF00000000000000) << 56); + } else { + if (ok) *ok = false; + } + return value; +} + Zigbee::DataType ZigbeeDataType::dataType() const { return m_dataType; diff --git a/libnymea-zigbee/zigbeedatatype.h b/libnymea-zigbee/zigbeedatatype.h index b312916..f10ab2a 100644 --- a/libnymea-zigbee/zigbeedatatype.h +++ b/libnymea-zigbee/zigbeedatatype.h @@ -69,6 +69,9 @@ public: bool toBool(bool *ok = nullptr) const; QString toString(bool *ok = nullptr) const; + float toFloat(bool *ok = nullptr) const; + double toDouble(bool *ok = nullptr) const; + Zigbee::DataType dataType() const; QString name() const; QString className() const;