diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 53ae657..eb69d23 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -56,6 +56,8 @@ set(SOURCES ./knx/group_object/dpt/dpt8.h ./knx/group_object/dpt/dpt9.cpp ./knx/group_object/dpt/dpt9.h +./knx/group_object/dpt/dpt10.cpp +./knx/group_object/dpt/dpt10.h ./knx/group_object/dpt/dptconvert.cpp ./knx/group_object/dpt/dptconvert.h ./knx/group_object/group_object.cpp diff --git a/src/knx/group_object/dpt/dpt.h b/src/knx/group_object/dpt/dpt.h index 9aa84ce..d222715 100644 --- a/src/knx/group_object/dpt/dpt.h +++ b/src/knx/group_object/dpt/dpt.h @@ -3,7 +3,6 @@ #include "../group_object.h" namespace Knx { -#define DPT_TimeOfDay Dpt(10, 1, 1) #define DPT_Date Dpt(11, 1) #define DPT_Value_4_Ucount Dpt(12, 1) #define DPT_Value_4_Count Dpt(13, 1) diff --git a/src/knx/group_object/dpt/dpt10.cpp b/src/knx/group_object/dpt/dpt10.cpp new file mode 100644 index 0000000..30a6771 --- /dev/null +++ b/src/knx/group_object/dpt/dpt10.cpp @@ -0,0 +1,84 @@ +#include "dpt10.h" + +#include "dptconvert.h" + +Knx::Go_SizeCode Knx::DPT_TimeOfDay::size() const +{ + return Go_3_Octets; +} + +void Knx::DPT_TimeOfDay::encode(uint8_t* data) const +{ + unsigned8ToPayload(data, 0, (uint8_t)_dow << 5, 0xE0); + unsigned8ToPayload(data, 0, _hours, 0x1F); + unsigned8ToPayload(data, 1, _minutes, 0x3F); + unsigned8ToPayload(data, 2, _seconds, 0x3F); +} + +bool Knx::DPT_TimeOfDay::decode(uint8_t* data) +{ + _dow = (DayOfWeekValue) ((unsigned8FromPayload(data, 0) & 0xE0) >> 5); + _hours = unsigned8FromPayload(data, 0) & 0x1F; + _minutes = unsigned8FromPayload(data, 1) & 0x3F; + _seconds = unsigned8FromPayload(data, 2) & 0x3F; + + if (_hours > 23 || _minutes > 59 || _seconds > 59) + { + _hours = 0; + _minutes = 0; + _seconds = 0; + _dow = NoDay; + return false; + } + + return true; +} + +Knx::DPT_TimeOfDay::DayOfWeekValue Knx::DPT_TimeOfDay::day() const +{ + return _dow; +} + +void Knx::DPT_TimeOfDay::day(DayOfWeekValue value) +{ + _dow = value; +} + +uint8_t Knx::DPT_TimeOfDay::hours() const +{ + return _hours; +} + +void Knx::DPT_TimeOfDay::hours(uint8_t value) +{ + if (value > 23) + return; + + _hours = value; +} + +uint8_t Knx::DPT_TimeOfDay::minutes() const +{ + return _minutes; +} + +void Knx::DPT_TimeOfDay::minutes(uint8_t value) +{ + if (value > 59) + return; + + _minutes = value; +} + +uint8_t Knx::DPT_TimeOfDay::seconds() const +{ + return _seconds; +} + +void Knx::DPT_TimeOfDay::seconds(uint8_t value) +{ + if (value > 59) + return; + + _seconds = value; +} diff --git a/src/knx/group_object/dpt/dpt10.h b/src/knx/group_object/dpt/dpt10.h new file mode 100644 index 0000000..ff7d0a0 --- /dev/null +++ b/src/knx/group_object/dpt/dpt10.h @@ -0,0 +1,45 @@ +#pragma once +#include "dpt.h" +namespace Knx +{ + class DPT_TimeOfDay: public Dpt + { + public: + enum DayOfWeekValue + { + NoDay = 0, + Monday = 1, + Tuesday = 2, + Wednesday = 3, + Thursday = 4, + Friday = 5, + Saturday = 6, + Sunday = 7 + }; + + + Go_SizeCode size() const override; + + void encode(uint8_t* data) const override; + bool decode(uint8_t* data) override; + + DayOfWeekValue day() const; + void day(DayOfWeekValue value); + + uint8_t hours() const; + void hours(uint8_t value); + + uint8_t minutes() const; + void minutes(uint8_t value); + + uint8_t seconds() const; + void seconds(uint8_t value); + private: + DayOfWeekValue _dow; + uint8_t _hours; + uint8_t _minutes; + uint8_t _seconds; + }; + + +} \ No newline at end of file diff --git a/src/knx/group_object/dpt/dptconvert.cpp b/src/knx/group_object/dpt/dptconvert.cpp index 9b7558b..a6c027d 100644 --- a/src/knx/group_object/dpt/dptconvert.cpp +++ b/src/knx/group_object/dpt/dptconvert.cpp @@ -18,18 +18,6 @@ namespace Knx { if (payload_length > 0) { - // DPT 8.001/8.010/8.011 - Signed 16 Bit Integer - if (datatype.mainGroup == 8 && (datatype.subGroup == 1 || datatype.subGroup == 10 || datatype.subGroup == 11) && !datatype.index) - return busValueToSigned16(payload, payload_length, datatype, value); - - // DPT 8.002-DPT 8.007 - Time Delta - if (datatype.mainGroup == 8 && datatype.subGroup >= 2 && datatype.subGroup <= 7 && !datatype.index) - return busValueToTimeDelta(payload, payload_length, datatype, value); - - // DPT 10.* - Time and Weekday - if (datatype.mainGroup == 10 && datatype.subGroup == 1 && datatype.index <= 1) - return busValueToTime(payload, payload_length, datatype, value); - // DPT 11.* - Date if (datatype.mainGroup == 11 && datatype.subGroup == 1 && !datatype.index) return busValueToDate(payload, payload_length, datatype, value); @@ -140,18 +128,6 @@ namespace Knx int KNX_Encode_Value(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype) { - // DPT 8.001/8.010/8.011 - Signed 16 Bit Integer - if (datatype.mainGroup == 8 && (datatype.subGroup == 1 || datatype.subGroup == 10 || datatype.subGroup == 11) && !datatype.index) - return valueToBusValueSigned16(value, payload, payload_length, datatype); - - // DPT 8.002-DPT 8.007 - Time Delta - if (datatype.mainGroup == 8 && datatype.subGroup >= 2 && datatype.subGroup <= 7 && !datatype.index) - return valueToBusValueTimeDelta(value, payload, payload_length, datatype); - - // DPT 10.* - Time and Weekday - if (datatype.mainGroup == 10 && datatype.subGroup == 1 && datatype.index <= 1) - return valueToBusValueTime(value, payload, payload_length, datatype); - // DPT 11.* - Date if (datatype.mainGroup == 11 && datatype.subGroup == 1 && !datatype.index) return valueToBusValueDate(value, payload, payload_length, datatype); @@ -259,63 +235,6 @@ namespace Knx return false; } - int busValueToSigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) - { - ASSERT_PAYLOAD(2); - - if (datatype.subGroup == 10) - { - value = signed16FromPayload(payload, 0) / 100.0; - return true; - } - - value = signed16FromPayload(payload, 0); - return true; - } - - int busValueToTimeDelta(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) - { - ASSERT_PAYLOAD(2); - - int64_t duration = signed16FromPayload(payload, 0); - value = duration; - return true; - } - - - int busValueToTime(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) - { - ASSERT_PAYLOAD(3); - - switch (datatype.index) - { - case 0: - value = (uint8_t)((unsigned8FromPayload(payload, 0) >> 5) & 0x07); - return true; - - case 1: - { - unsigned char hours = unsigned8FromPayload(payload, 0) & 0x1F; - unsigned char weekDay = (unsigned8FromPayload(payload, 0) & 0xE0) >> 5; - unsigned char minutes = unsigned8FromPayload(payload, 1) & 0x3F; - unsigned char seconds = unsigned8FromPayload(payload, 2) & 0x3F; - - if (hours > 23 || minutes > 59 || seconds > 59) - return false; - - struct tm tmp = {0}; - tmp.tm_hour = hours; - tmp.tm_wday = weekDay; - tmp.tm_min = minutes; - tmp.tm_sec = seconds; - value = tmp; - return true; - } - } - - return false; - } - int busValueToDate(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) { ASSERT_PAYLOAD(3); @@ -797,68 +716,6 @@ namespace Knx //------------------------------------------------------------------------------------------------------------------------------------- - int valueToBusValueSigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype) - { - if ((int64_t)value < INT64_C(-32768) || (int64_t)value > INT64_C(32767)) - return false; - - if (datatype.subGroup == 10) - { - if ((double)value < -327.68 || (double)value > 327.67) - return false; - - signed16ToPayload(payload, 0, (int16_t)((double)value * 100.0), 0xFFFF); - } - else - signed16ToPayload(payload, 0, (uint64_t)value, 0xffff); - - return true; - } - - int valueToBusValueTimeDelta(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype) - { - struct tm tmp = value; - time_t timeSinceEpoch = mktime(&tmp); - - if (timeSinceEpoch < INT64_C(-32768) || timeSinceEpoch > INT64_C(32767)) - return false; - - signed16ToPayload(payload, 0, timeSinceEpoch, 0xFFFF); - return true; - } - - - - int valueToBusValueTime(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype) - { - switch (datatype.index) - { - case 0: - { - if ((int64_t)value < INT64_C(0) || (int64_t)value > INT64_C(7)) - return false; - - ENSURE_PAYLOAD(3); - unsigned8ToPayload(payload, 0, (uint64_t)value << 5, 0xE0); - break; - } - - case 1: - { - struct tm tmp = value; - unsigned8ToPayload(payload, 0, tmp.tm_hour, 0x1F); - unsigned8ToPayload(payload, 1, tmp.tm_min, 0x3F); - unsigned8ToPayload(payload, 2, tmp.tm_sec, 0x3F); - break; - } - - default: - return false; - } - - return true; - } - int valueToBusValueDate(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype) { struct tm tmp = value; diff --git a/src/knx/group_object/dpt/dptconvert.h b/src/knx/group_object/dpt/dptconvert.h index 2358fd6..92b8f02 100644 --- a/src/knx/group_object/dpt/dptconvert.h +++ b/src/knx/group_object/dpt/dptconvert.h @@ -47,11 +47,6 @@ namespace Knx int KNX_Encode_Value(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); //KNX to internal - int busValueToUnsigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); - int busValueToTimePeriod(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); - int busValueToSigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); - int busValueToTimeDelta(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); - int busValueToTime(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); int busValueToDate(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); int busValueToUnsigned32(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); int busValueToSigned32(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); @@ -78,11 +73,6 @@ namespace Knx int busValueToActiveEnergy(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value); //Internal to KNX - int valueToBusValueUnsigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); - int valueToBusValueTimePeriod(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); - int valueToBusValueSigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); - int valueToBusValueTimeDelta(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); - int valueToBusValueTime(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); int valueToBusValueDate(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); int valueToBusValueUnsigned32(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype); int valueToBusValueSigned32(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);