Skip to content

Commit ae46e12

Browse files
fyziktomhubmartin
authored andcommitted
application: current: Added ChirpStack decoder
1 parent d80f62d commit ae46e12

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed
+179
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
var cursor = 0;
2+
var buffer;
3+
4+
function decodeUplink(input) {
5+
var bytes = input.bytes;
6+
buffer = bytes;
7+
8+
var data = {};
9+
10+
var header = u16();
11+
12+
if ((header & 0x0001) !== 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 & 0x0002) !== 0) {
35+
data.orientation = u8();
36+
37+
if (data.orientation === 0xff) {
38+
data.orientation = null;
39+
}
40+
}
41+
42+
if ((header & 0x0004) !== 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 & 0x0008) !== 0) {
53+
data.w1_thermometers = [];
54+
55+
var count = u8();
56+
57+
for (var i = 0; i < count; i++) {
58+
var t = s16();
59+
60+
if (t === 0x7fff) {
61+
t = null;
62+
} else {
63+
t = t / 100;
64+
}
65+
66+
data.w1_thermometers.push(t);
67+
}
68+
}
69+
70+
if ((header & 0x0010) !== 0) {
71+
data.backup = {}
72+
73+
data.backup.line_voltage = u16();
74+
data.backup.battery_voltage = u16();
75+
data.backup.backup_state = u8() !== 0 ? "connected" : "disconnected";
76+
77+
if (data.backup.line_voltage === 0x7fff) {
78+
data.backup.line_voltage = null;
79+
} else {
80+
data.backup.line_voltage = data.backup.line_voltage / 1000;
81+
}
82+
83+
if (data.backup.battery_voltage === 0x7fff) {
84+
data.backup.battery_voltage = null;
85+
} else {
86+
data.backup.battery_voltage = data.backup.battery_voltage / 1000;
87+
}
88+
}
89+
90+
var analog_channels = [];
91+
92+
for (var i = 0; i < 4; i++) {
93+
if ((header & (0x0020 << i)) !== 0) {
94+
var channel = {};
95+
channel.channel = i + 1;
96+
97+
var mean_avg = s32();
98+
var rms_avg = s32();
99+
100+
channel.measurements = {};
101+
102+
if (mean_avg === 0x7fffffff) {
103+
channel.measurements.mean_avg = null;
104+
} else {
105+
channel.measurements.mean_avg = mean_avg / 1000;
106+
}
107+
108+
if (rms_avg === 0x7fffffff) {
109+
channel.measurements.rms_avg = null;
110+
} else {
111+
channel.measurements.rms_avg = rms_avg / 1000;
112+
}
113+
114+
analog_channels.push(channel);
115+
}
116+
}
117+
118+
if (analog_channels.length > 0) {
119+
data.analog_channels = analog_channels;
120+
}
121+
122+
return {
123+
data: data
124+
};
125+
}
126+
127+
function s8() {
128+
var value = buffer.slice(cursor);
129+
value = value[0];
130+
if ((value & (1 << 7)) > 0) {
131+
value = (~value & 0xff) + 1;
132+
value = -value;
133+
}
134+
cursor = cursor + 1;
135+
return value;
136+
}
137+
138+
function u8() {
139+
var value = buffer.slice(cursor);
140+
value = value[0];
141+
cursor = cursor + 1;
142+
return value;
143+
}
144+
145+
function s16() {
146+
var value = buffer.slice(cursor);
147+
value = value[0] | value[1] << 8;
148+
if ((value & (1 << 15)) > 0) {
149+
value = (~value & 0xffff) + 1;
150+
value = -value;
151+
}
152+
cursor = cursor + 2;
153+
return value;
154+
}
155+
156+
function u16() {
157+
var value = buffer.slice(cursor);
158+
value = value[0] | value[1] << 8;
159+
cursor = cursor + 2;
160+
return value;
161+
}
162+
163+
function u32() {
164+
var value = buffer.slice(cursor);
165+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
166+
cursor = cursor + 4;
167+
return value;
168+
}
169+
170+
function s32() {
171+
var value = buffer.slice(cursor);
172+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
173+
if ((value & (1 << 31)) > 0) {
174+
value = (~value & 0xffffffff) + 1;
175+
value = -value;
176+
}
177+
cursor = cursor + 4;
178+
return value;
179+
}

0 commit comments

Comments
 (0)