Skip to content

Commit 117db3f

Browse files
committed
applications: push: Fix ChirpStack decoder
Signed-off-by: Martin Hubáček <[email protected]>
1 parent 29793a2 commit 117db3f

File tree

1 file changed

+180
-0
lines changed

1 file changed

+180
-0
lines changed

applications/push/codec/cs-codec.js

+180
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
var cursor = 0;
2+
var buffer;
3+
4+
// Chirpstack v3
5+
function Decode(port, bytes, variables)
6+
{
7+
var data = {};
8+
buffer = bytes;
9+
10+
var header = u8();
11+
12+
if ((header & 0x01) !== 0) {
13+
data.voltage_rest = u16();
14+
data.voltage_load = u16();
15+
data.current_load = u8();
16+
17+
if (data.voltage_rest === 0xffff) {
18+
data.voltage_rest = null;
19+
} else {
20+
data.voltage_rest = data.voltage_rest / 1000;
21+
}
22+
23+
if (data.voltage_load === 0xffff) {
24+
data.voltage_load = null;
25+
} else {
26+
data.voltage_load = data.voltage_load / 1000;
27+
}
28+
29+
if (data.current_load === 0xff) {
30+
data.current_load = null;
31+
}
32+
}
33+
34+
if ((header & 0x02) !== 0) {
35+
data.orientation = u8();
36+
37+
if (data.orientation === 0xff) {
38+
data.orientation = null;
39+
}
40+
}
41+
42+
if ((header & 0x04) !== 0) {
43+
data.therm_temperature = s16();
44+
45+
if (data.therm_temperature === 0x7fff) {
46+
data.therm_temperature = null;
47+
} else {
48+
data.therm_temperature = data.therm_temperature / 100;
49+
}
50+
}
51+
52+
if ((header & 0x08) !== 0) {
53+
data.backup = {}
54+
55+
data.backup.line_voltage = u16();
56+
data.backup.battery_voltage = u16();
57+
data.backup.backup_state = u8() !== 0 ? "connected" : "disconnected";
58+
59+
if (data.backup.line_voltage === 0x7fff) {
60+
data.backup.line_voltage = null;
61+
} else {
62+
data.backup.line_voltage = data.backup.line_voltage / 1000;
63+
}
64+
65+
if (data.backup.battery_voltage === 0x7fff) {
66+
data.backup.battery_voltage = null;
67+
} else {
68+
data.backup.battery_voltage = data.backup.battery_voltage / 1000;
69+
}
70+
71+
data.button_x = {};
72+
data.button_x.press_count = u16();
73+
data.button_x.hold_count = u16();
74+
75+
data.button_1 = {};
76+
data.button_1.press_count = u16();
77+
data.button_1.hold_count = u16();
78+
79+
data.button_2 = {};
80+
data.button_2.press_count = u16();
81+
data.button_2.hold_count = u16();
82+
83+
data.button_3 = {};
84+
data.button_3.press_count = u16();
85+
data.button_3.hold_count = u16();
86+
87+
data.button_4 = {};
88+
data.button_4.press_count = u16();
89+
data.button_4.hold_count = u16();
90+
91+
var events = u16();
92+
data.button_x.press_event = (events & 0x0001) !== 0;
93+
data.button_x.hold_event = (events & 0x0002) !== 0;
94+
95+
data.button_1.press_event = (events & 0x0004) !== 0;
96+
data.button_1.hold_event = (events & 0x0008) !== 0;
97+
98+
data.button_2.press_event = (events & 0x0010) !== 0;
99+
data.button_2.hold_event = (events & 0x0020) !== 0;
100+
101+
data.button_3.press_event = (events & 0x0040) !== 0;
102+
data.button_3.hold_event = (events & 0x0080) !== 0;
103+
104+
data.button_4.press_event = (events & 0x0100) !== 0;
105+
data.button_4.hold_event = (events & 0x0200) !== 0;
106+
}
107+
108+
return data;
109+
}
110+
111+
// Chirpstack v4 compatibility wrapper
112+
function decodeUplink(input)
113+
{
114+
return {data : Decode(input.fPort, input.bytes, input.variables)};
115+
}
116+
117+
function s8()
118+
{
119+
var value = buffer.slice(cursor);
120+
value = value[0];
121+
if ((value & (1 << 7)) > 0) {
122+
value = (~value & 0xff) + 1;
123+
value = -value;
124+
}
125+
cursor = cursor + 1;
126+
return value;
127+
}
128+
129+
function u8()
130+
{
131+
var value = buffer.slice(cursor);
132+
value = value[0];
133+
cursor = cursor + 1;
134+
return value;
135+
}
136+
137+
function s16()
138+
{
139+
var value = buffer.slice(cursor);
140+
value = value[0] | value[1] << 8;
141+
if ((value & (1 << 15)) > 0) {
142+
value = (~value & 0xffff) + 1;
143+
value = -value;
144+
}
145+
cursor = cursor + 2;
146+
return value;
147+
}
148+
149+
function u16()
150+
{
151+
var value = buffer.slice(cursor);
152+
value = value[0] | value[1] << 8;
153+
cursor = cursor + 2;
154+
return value;
155+
}
156+
157+
function u32()
158+
{
159+
var value = buffer.slice(cursor);
160+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
161+
cursor = cursor + 4;
162+
return value;
163+
}
164+
165+
function s32()
166+
{
167+
var value = buffer.slice(cursor);
168+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
169+
if ((value & (1 << 31)) > 0) {
170+
value = (~value & 0xffffffff) + 1;
171+
value = -value;
172+
}
173+
cursor = cursor + 4;
174+
return value;
175+
}
176+
177+
if (true) {
178+
var buf = Buffer.from("D9sSXRIvASEH+EoaDQEAAAAAHAARABgACgAOAAQABgAEAAAA", 'base64')
179+
console.log(Decode(1, buf, 0));
180+
}

0 commit comments

Comments
 (0)