Skip to content

Commit 02b0736

Browse files
committed
reimplement dpt10
1 parent 27473ff commit 02b0736

File tree

6 files changed

+131
-154
lines changed

6 files changed

+131
-154
lines changed

src/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ set(SOURCES
5656
./knx/group_object/dpt/dpt8.h
5757
./knx/group_object/dpt/dpt9.cpp
5858
./knx/group_object/dpt/dpt9.h
59+
./knx/group_object/dpt/dpt10.cpp
60+
./knx/group_object/dpt/dpt10.h
5961
./knx/group_object/dpt/dptconvert.cpp
6062
./knx/group_object/dpt/dptconvert.h
6163
./knx/group_object/group_object.cpp

src/knx/group_object/dpt/dpt.h

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#include "../group_object.h"
44
namespace Knx
55
{
6-
#define DPT_TimeOfDay Dpt(10, 1, 1)
76
#define DPT_Date Dpt(11, 1)
87
#define DPT_Value_4_Ucount Dpt(12, 1)
98
#define DPT_Value_4_Count Dpt(13, 1)

src/knx/group_object/dpt/dpt10.cpp

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
#include "dpt10.h"
2+
3+
#include "dptconvert.h"
4+
5+
Knx::Go_SizeCode Knx::DPT_TimeOfDay::size() const
6+
{
7+
return Go_3_Octets;
8+
}
9+
10+
void Knx::DPT_TimeOfDay::encode(uint8_t* data) const
11+
{
12+
unsigned8ToPayload(data, 0, (uint8_t)_dow << 5, 0xE0);
13+
unsigned8ToPayload(data, 0, _hours, 0x1F);
14+
unsigned8ToPayload(data, 1, _minutes, 0x3F);
15+
unsigned8ToPayload(data, 2, _seconds, 0x3F);
16+
}
17+
18+
bool Knx::DPT_TimeOfDay::decode(uint8_t* data)
19+
{
20+
_dow = (DayOfWeekValue) ((unsigned8FromPayload(data, 0) & 0xE0) >> 5);
21+
_hours = unsigned8FromPayload(data, 0) & 0x1F;
22+
_minutes = unsigned8FromPayload(data, 1) & 0x3F;
23+
_seconds = unsigned8FromPayload(data, 2) & 0x3F;
24+
25+
if (_hours > 23 || _minutes > 59 || _seconds > 59)
26+
{
27+
_hours = 0;
28+
_minutes = 0;
29+
_seconds = 0;
30+
_dow = NoDay;
31+
return false;
32+
}
33+
34+
return true;
35+
}
36+
37+
Knx::DPT_TimeOfDay::DayOfWeekValue Knx::DPT_TimeOfDay::day() const
38+
{
39+
return _dow;
40+
}
41+
42+
void Knx::DPT_TimeOfDay::day(DayOfWeekValue value)
43+
{
44+
_dow = value;
45+
}
46+
47+
uint8_t Knx::DPT_TimeOfDay::hours() const
48+
{
49+
return _hours;
50+
}
51+
52+
void Knx::DPT_TimeOfDay::hours(uint8_t value)
53+
{
54+
if (value > 23)
55+
return;
56+
57+
_hours = value;
58+
}
59+
60+
uint8_t Knx::DPT_TimeOfDay::minutes() const
61+
{
62+
return _minutes;
63+
}
64+
65+
void Knx::DPT_TimeOfDay::minutes(uint8_t value)
66+
{
67+
if (value > 59)
68+
return;
69+
70+
_minutes = value;
71+
}
72+
73+
uint8_t Knx::DPT_TimeOfDay::seconds() const
74+
{
75+
return _seconds;
76+
}
77+
78+
void Knx::DPT_TimeOfDay::seconds(uint8_t value)
79+
{
80+
if (value > 59)
81+
return;
82+
83+
_seconds = value;
84+
}

src/knx/group_object/dpt/dpt10.h

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#pragma once
2+
#include "dpt.h"
3+
namespace Knx
4+
{
5+
class DPT_TimeOfDay: public Dpt
6+
{
7+
public:
8+
enum DayOfWeekValue
9+
{
10+
NoDay = 0,
11+
Monday = 1,
12+
Tuesday = 2,
13+
Wednesday = 3,
14+
Thursday = 4,
15+
Friday = 5,
16+
Saturday = 6,
17+
Sunday = 7
18+
};
19+
20+
21+
Go_SizeCode size() const override;
22+
23+
void encode(uint8_t* data) const override;
24+
bool decode(uint8_t* data) override;
25+
26+
DayOfWeekValue day() const;
27+
void day(DayOfWeekValue value);
28+
29+
uint8_t hours() const;
30+
void hours(uint8_t value);
31+
32+
uint8_t minutes() const;
33+
void minutes(uint8_t value);
34+
35+
uint8_t seconds() const;
36+
void seconds(uint8_t value);
37+
private:
38+
DayOfWeekValue _dow;
39+
uint8_t _hours;
40+
uint8_t _minutes;
41+
uint8_t _seconds;
42+
};
43+
44+
45+
}

src/knx/group_object/dpt/dptconvert.cpp

-143
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@ namespace Knx
1818
{
1919
if (payload_length > 0)
2020
{
21-
// DPT 8.001/8.010/8.011 - Signed 16 Bit Integer
22-
if (datatype.mainGroup == 8 && (datatype.subGroup == 1 || datatype.subGroup == 10 || datatype.subGroup == 11) && !datatype.index)
23-
return busValueToSigned16(payload, payload_length, datatype, value);
24-
25-
// DPT 8.002-DPT 8.007 - Time Delta
26-
if (datatype.mainGroup == 8 && datatype.subGroup >= 2 && datatype.subGroup <= 7 && !datatype.index)
27-
return busValueToTimeDelta(payload, payload_length, datatype, value);
28-
29-
// DPT 10.* - Time and Weekday
30-
if (datatype.mainGroup == 10 && datatype.subGroup == 1 && datatype.index <= 1)
31-
return busValueToTime(payload, payload_length, datatype, value);
32-
3321
// DPT 11.* - Date
3422
if (datatype.mainGroup == 11 && datatype.subGroup == 1 && !datatype.index)
3523
return busValueToDate(payload, payload_length, datatype, value);
@@ -140,18 +128,6 @@ namespace Knx
140128

141129
int KNX_Encode_Value(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype)
142130
{
143-
// DPT 8.001/8.010/8.011 - Signed 16 Bit Integer
144-
if (datatype.mainGroup == 8 && (datatype.subGroup == 1 || datatype.subGroup == 10 || datatype.subGroup == 11) && !datatype.index)
145-
return valueToBusValueSigned16(value, payload, payload_length, datatype);
146-
147-
// DPT 8.002-DPT 8.007 - Time Delta
148-
if (datatype.mainGroup == 8 && datatype.subGroup >= 2 && datatype.subGroup <= 7 && !datatype.index)
149-
return valueToBusValueTimeDelta(value, payload, payload_length, datatype);
150-
151-
// DPT 10.* - Time and Weekday
152-
if (datatype.mainGroup == 10 && datatype.subGroup == 1 && datatype.index <= 1)
153-
return valueToBusValueTime(value, payload, payload_length, datatype);
154-
155131
// DPT 11.* - Date
156132
if (datatype.mainGroup == 11 && datatype.subGroup == 1 && !datatype.index)
157133
return valueToBusValueDate(value, payload, payload_length, datatype);
@@ -259,63 +235,6 @@ namespace Knx
259235
return false;
260236
}
261237

262-
int busValueToSigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
263-
{
264-
ASSERT_PAYLOAD(2);
265-
266-
if (datatype.subGroup == 10)
267-
{
268-
value = signed16FromPayload(payload, 0) / 100.0;
269-
return true;
270-
}
271-
272-
value = signed16FromPayload(payload, 0);
273-
return true;
274-
}
275-
276-
int busValueToTimeDelta(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
277-
{
278-
ASSERT_PAYLOAD(2);
279-
280-
int64_t duration = signed16FromPayload(payload, 0);
281-
value = duration;
282-
return true;
283-
}
284-
285-
286-
int busValueToTime(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
287-
{
288-
ASSERT_PAYLOAD(3);
289-
290-
switch (datatype.index)
291-
{
292-
case 0:
293-
value = (uint8_t)((unsigned8FromPayload(payload, 0) >> 5) & 0x07);
294-
return true;
295-
296-
case 1:
297-
{
298-
unsigned char hours = unsigned8FromPayload(payload, 0) & 0x1F;
299-
unsigned char weekDay = (unsigned8FromPayload(payload, 0) & 0xE0) >> 5;
300-
unsigned char minutes = unsigned8FromPayload(payload, 1) & 0x3F;
301-
unsigned char seconds = unsigned8FromPayload(payload, 2) & 0x3F;
302-
303-
if (hours > 23 || minutes > 59 || seconds > 59)
304-
return false;
305-
306-
struct tm tmp = {0};
307-
tmp.tm_hour = hours;
308-
tmp.tm_wday = weekDay;
309-
tmp.tm_min = minutes;
310-
tmp.tm_sec = seconds;
311-
value = tmp;
312-
return true;
313-
}
314-
}
315-
316-
return false;
317-
}
318-
319238
int busValueToDate(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
320239
{
321240
ASSERT_PAYLOAD(3);
@@ -797,68 +716,6 @@ namespace Knx
797716

798717
//-------------------------------------------------------------------------------------------------------------------------------------
799718

800-
int valueToBusValueSigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype)
801-
{
802-
if ((int64_t)value < INT64_C(-32768) || (int64_t)value > INT64_C(32767))
803-
return false;
804-
805-
if (datatype.subGroup == 10)
806-
{
807-
if ((double)value < -327.68 || (double)value > 327.67)
808-
return false;
809-
810-
signed16ToPayload(payload, 0, (int16_t)((double)value * 100.0), 0xFFFF);
811-
}
812-
else
813-
signed16ToPayload(payload, 0, (uint64_t)value, 0xffff);
814-
815-
return true;
816-
}
817-
818-
int valueToBusValueTimeDelta(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype)
819-
{
820-
struct tm tmp = value;
821-
time_t timeSinceEpoch = mktime(&tmp);
822-
823-
if (timeSinceEpoch < INT64_C(-32768) || timeSinceEpoch > INT64_C(32767))
824-
return false;
825-
826-
signed16ToPayload(payload, 0, timeSinceEpoch, 0xFFFF);
827-
return true;
828-
}
829-
830-
831-
832-
int valueToBusValueTime(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype)
833-
{
834-
switch (datatype.index)
835-
{
836-
case 0:
837-
{
838-
if ((int64_t)value < INT64_C(0) || (int64_t)value > INT64_C(7))
839-
return false;
840-
841-
ENSURE_PAYLOAD(3);
842-
unsigned8ToPayload(payload, 0, (uint64_t)value << 5, 0xE0);
843-
break;
844-
}
845-
846-
case 1:
847-
{
848-
struct tm tmp = value;
849-
unsigned8ToPayload(payload, 0, tmp.tm_hour, 0x1F);
850-
unsigned8ToPayload(payload, 1, tmp.tm_min, 0x3F);
851-
unsigned8ToPayload(payload, 2, tmp.tm_sec, 0x3F);
852-
break;
853-
}
854-
855-
default:
856-
return false;
857-
}
858-
859-
return true;
860-
}
861-
862719
int valueToBusValueDate(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype)
863720
{
864721
struct tm tmp = value;

src/knx/group_object/dpt/dptconvert.h

-10
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ namespace Knx
4747
int KNX_Encode_Value(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
4848

4949
//KNX to internal
50-
int busValueToUnsigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
51-
int busValueToTimePeriod(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
52-
int busValueToSigned16(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
53-
int busValueToTimeDelta(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
54-
int busValueToTime(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
5550
int busValueToDate(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
5651
int busValueToUnsigned32(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
5752
int busValueToSigned32(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
@@ -78,11 +73,6 @@ namespace Knx
7873
int busValueToActiveEnergy(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value);
7974

8075
//Internal to KNX
81-
int valueToBusValueUnsigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
82-
int valueToBusValueTimePeriod(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
83-
int valueToBusValueSigned16(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
84-
int valueToBusValueTimeDelta(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
85-
int valueToBusValueTime(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
8676
int valueToBusValueDate(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
8777
int valueToBusValueUnsigned32(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);
8878
int valueToBusValueSigned32(const KNXValue& value, uint8_t* payload, size_t payload_length, const Dpt& datatype);

0 commit comments

Comments
 (0)