Repository navigation
Expand file tree
/
Copy pathZ21Packet.cpp
More file actions
116 lines (101 loc) · 3.2 KB
/
Copy pathZ21Packet.cpp
File metadata and controls
116 lines (101 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
** This is Public Domain Software.
**
** The author disclaims copyright to this source code.
** In place of a legal notice, here is a blessing:
**
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
**/
#include "Z21.h"
#include "Z21Const.h"
void Z21Packet::setHeader(uint16_t len, uint16_t header) {
length = len;
data[0] = (len & 0xFF);
data[1] = ((len >> 8) & 0xFF);
data[2] = (header & 0xFF);
data[3] = ((header >> 8) & 0xFF);
}
void Z21Packet::setXPacket(uint8_t xHeader) {
setHeader(6, Z21_LAN::X);
data[4] = (xHeader & 0xFF);
data[5] = (xHeader & 0xFF);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0) {
setHeader(7, Z21_LAN::X);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xHeader ^ xd0);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0, uint8_t xd1) {
setHeader(8, Z21_LAN::X);
data[4] = (xHeader & 0xFF);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xd1);
setByte(7, xHeader ^ xd0 ^ xd1);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0, uint8_t xd1, uint8_t xd2) {
setHeader(9, Z21_LAN::X);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xd1);
setByte(7, xd2);
setByte(8, xHeader ^ xd0 ^ xd1 ^ xd2);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0, uint8_t xd1, uint8_t xd2, uint8_t xd3) {
setHeader(10, Z21_LAN::X);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xd1);
setByte(7, xd2);
setByte(8, xd3);
setByte(9, xHeader ^ xd0 ^ xd1 ^ xd2 ^ xd3);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0, uint8_t xd1, uint8_t xd2, uint8_t xd3, uint8_t xd4) {
setHeader(11, Z21_LAN::X);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xd1);
setByte(7, xd2);
setByte(8, xd3);
setByte(9, xd4);
setByte(10, xHeader ^ xd0 ^ xd1 ^ xd2 ^ xd3 ^ xd4);
}
void Z21Packet::setXPacket(uint8_t xHeader, uint8_t xd0, uint8_t xd1, uint8_t xd2, uint8_t xd3, uint8_t xd4, uint8_t xd5) {
setHeader(12, Z21_LAN::X);
setByte(4, xHeader);
setByte(5, xd0);
setByte(6, xd1);
setByte(7, xd2);
setByte(8, xd3);
setByte(9, xd4);
setByte(10, xd5);
setByte(11, xHeader ^ xd0 ^ xd1 ^ xd2 ^ xd3 ^ xd4 ^ xd5);
}
void Z21Packet::setLEuint16(uint8_t pos, uint16_t value) {
setByte(pos, value);
setByte(pos + 1, value >> 8);
}
void Z21Packet::setLEuint32(uint8_t pos, uint32_t value) {
setByte(pos, value);
setByte(pos + 1, value >> 8);
setByte(pos + 2, value >> 16);
setByte(pos + 3, value >> 24);
}
void Z21Packet::setBEuint16(uint8_t pos, uint16_t value) {
setByte(pos, value >> 8);
setByte(pos + 1, value);
}
void Z21Packet::setBEuint32(uint8_t pos, uint32_t value) {
setByte(pos, value >> 24);
setByte(pos + 1, value >> 16);
setByte(pos + 2, value >> 8);
setByte(pos + 3, value);
}
uint8_t Z21Packet::LSBAccessoryPosition(uint16_t address, uint8_t pos) {
if (pos == Z21_Accessory_Pos::ALL)
return ((address & 0x3C) << 2);
return ((address & 0x3C) << 2) | 0x08 | ((address & 0x3) << 1) | (pos == Z21_Accessory_Pos::P1 ? 0x1 : 0);
}