Skip to content

Commit ebb3899

Browse files
author
José Mendes
committed
applications: clime: add ctr_ble_tag support
Signed-off-by: José Mendes <[email protected]>
1 parent ca90513 commit ebb3899

12 files changed

+560
-114
lines changed

applications/clime/codec/cbor-decoder.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,9 @@
133133
- active
134134
- soil_sensors:
135135
- moisture:
136+
- ble_tags:
137+
- addr:
138+
- rssi:
139+
- voltage:
140+
- div: 100
141+
- fpp: 2

applications/clime/codec/cs-decoder.js

+148-113
Original file line numberDiff line numberDiff line change
@@ -4,167 +4,202 @@ var buffer;
44
// Uncomment for ChirpStack:
55
function Decode(port, bytes, variables) {
66

7-
// Uncomment for The Things Network:
8-
// function Decoder(port, bytes) {
7+
// Uncomment for The Things Network:
8+
// function Decoder(port, bytes) {
99

10-
buffer = bytes;
10+
buffer = bytes;
1111

12-
var data = {};
12+
var data = {};
1313

14-
var header = u8();
14+
var header = u8();
1515

16-
if ((header & 0x01) !== 0) {
17-
data.voltage_rest = u16();
18-
data.voltage_load = u16();
19-
data.current_load = u8();
16+
if (header & 0x80) {
17+
var header_higher = u8() << 8;
18+
header = header_higher + header;
19+
}
2020

21-
if (data.voltage_rest === 0xffff) {
22-
data.voltage_rest = null;
23-
} else {
24-
data.voltage_rest = data.voltage_rest / 1000;
25-
}
21+
if ((header & 0x01) !== 0) {
22+
data.voltage_rest = u16();
23+
data.voltage_load = u16();
24+
data.current_load = u8();
2625

27-
if (data.voltage_load === 0xffff) {
28-
data.voltage_load = null;
29-
} else {
30-
data.voltage_load = data.voltage_load / 1000;
31-
}
26+
if (data.voltage_rest === 0xffff) {
27+
data.voltage_rest = null;
28+
} else {
29+
data.voltage_rest = data.voltage_rest / 1000;
30+
}
31+
32+
if (data.voltage_load === 0xffff) {
33+
data.voltage_load = null;
34+
} else {
35+
data.voltage_load = data.voltage_load / 1000;
36+
}
3237

33-
if (data.current_load === 0xff) {
34-
data.current_load = null;
35-
}
38+
if (data.current_load === 0xff) {
39+
data.current_load = null;
3640
}
41+
}
3742

38-
if ((header & 0x02) !== 0) {
39-
data.orientation = u8();
43+
if ((header & 0x02) !== 0) {
44+
data.orientation = u8();
4045

41-
if (data.orientation === 0xff) {
42-
data.orientation = null;
43-
}
46+
if (data.orientation === 0xff) {
47+
data.orientation = null;
4448
}
49+
}
4550

46-
if ((header & 0x04) !== 0) {
47-
data.therm_temperature = s16();
51+
if ((header & 0x04) !== 0) {
52+
data.therm_temperature = s16();
4853

49-
if (data.therm_temperature === 0x7fff) {
50-
data.therm_temperature = null;
51-
} else {
52-
data.therm_temperature = data.therm_temperature / 100;
53-
}
54+
if (data.therm_temperature === 0x7fff) {
55+
data.therm_temperature = null;
56+
} else {
57+
data.therm_temperature = data.therm_temperature / 100;
5458
}
59+
}
60+
61+
if ((header & 0x10) !== 0) {
62+
data.hygro_temperature = s16();
63+
data.hygro_humidity = u8();
64+
65+
if (data.hygro_temperature === 0x7fff) {
66+
data.hygro_temperature = null;
67+
} else {
68+
data.hygro_temperature = data.hygro_temperature / 100;
69+
}
70+
71+
if (data.hygro_humidity === 0xff) {
72+
data.hygro_humidity = null;
73+
} else {
74+
data.hygro_humidity = data.hygro_humidity / 2;
75+
}
76+
}
77+
78+
if ((header & 0x20) !== 0) {
79+
data.w1_thermometers = [];
5580

56-
if ((header & 0x10) !== 0) {
57-
data.hygro_temperature = s16();
58-
data.hygro_humidity = u8();
59-
60-
if (data.hygro_temperature === 0x7fff) {
61-
data.hygro_temperature = null;
62-
} else {
63-
data.hygro_temperature = data.hygro_temperature / 100;
64-
}
65-
66-
if (data.hygro_humidity === 0xff) {
67-
data.hygro_humidity = null;
68-
} else {
69-
data.hygro_humidity = data.hygro_humidity / 2;
70-
}
81+
var count = u8();
82+
83+
for (var i = 0; i < count; i++) {
84+
var t = s16();
85+
86+
if (t === 0x7fff) {
87+
t = null;
88+
} else {
89+
t = t / 100;
90+
}
91+
92+
data.w1_thermometers.push(t);
7193
}
94+
}
7295

73-
if ((header & 0x20) !== 0) {
74-
data.w1_thermometers = [];
96+
if ((header & 0x40) !== 0) {
97+
data.rtd_thermometers = [];
7598

76-
var count = u8();
99+
var count = u8();
77100

78-
for (var i = 0; i < count; i++) {
79-
var t = s16();
101+
for (var i = 0; i < count; i++) {
102+
var t = s16();
80103

81-
if (t === 0x7fff) {
82-
t = null;
83-
} else {
84-
t = t / 100;
85-
}
104+
if (t === 0x7fff) {
105+
t = null;
106+
} else {
107+
t = t / 100;
108+
}
86109

87-
data.w1_thermometers.push(t);
88-
}
110+
data.rtd_thermometers.push(t);
89111
}
112+
}
113+
114+
if ((header & 0x0100) !== 0) {
115+
data.ble_tags = [];
116+
117+
var count = u8();
90118

91-
if ((header & 0x40) !== 0) {
92-
data.rtd_thermometers = [];
119+
for (var i = 0; i < count; i++) {
120+
var tag = {};
93121

94-
var count = u8();
122+
var t = s16();
123+
var h = u8();
95124

96-
for (var i = 0; i < count; i++) {
97-
var t = s16();
125+
if (t === 0x7fff) {
126+
t = null;
127+
} else {
128+
t = t / 100;
129+
}
98130

99-
if (t === 0x7fff) {
100-
t = null;
101-
} else {
102-
t = t / 100;
103-
}
131+
if (h === 0xff) {
132+
h = null;
133+
} else {
134+
h = h / 2;
135+
}
104136

105-
data.rtd_thermometers.push(t);
106-
}
137+
tag.temperature = t;
138+
tag.humidity = h;
139+
140+
data.ble_tags.push(tag);
107141
}
142+
}
108143

109-
return data;
144+
return data;
110145
}
111146

112147
function s8() {
113-
var value = buffer.slice(cursor);
114-
value = value[0];
115-
if ((value & (1 << 7)) > 0) {
116-
value = (~value & 0xff) + 1;
117-
value = -value;
118-
}
119-
cursor = cursor + 1;
120-
return value;
148+
var value = buffer.slice(cursor);
149+
value = value[0];
150+
if ((value & (1 << 7)) > 0) {
151+
value = (~value & 0xff) + 1;
152+
value = -value;
153+
}
154+
cursor = cursor + 1;
155+
return value;
121156
}
122157

123158
function u8() {
124-
var value = buffer.slice(cursor);
125-
value = value[0];
126-
cursor = cursor + 1;
127-
return value;
159+
var value = buffer.slice(cursor);
160+
value = value[0];
161+
cursor = cursor + 1;
162+
return value;
128163
}
129164

130165
function s16() {
131-
var value = buffer.slice(cursor);
132-
value = value[0] | value[1] << 8;
133-
if ((value & (1 << 15)) > 0) {
134-
value = (~value & 0xffff) + 1;
135-
value = -value;
136-
}
137-
cursor = cursor + 2;
138-
return value;
166+
var value = buffer.slice(cursor);
167+
value = value[0] | value[1] << 8;
168+
if ((value & (1 << 15)) > 0) {
169+
value = (~value & 0xffff) + 1;
170+
value = -value;
171+
}
172+
cursor = cursor + 2;
173+
return value;
139174
}
140175

141176
function u16() {
142-
var value = buffer.slice(cursor);
143-
value = value[0] | value[1] << 8;
144-
cursor = cursor + 2;
145-
return value;
177+
var value = buffer.slice(cursor);
178+
value = value[0] | value[1] << 8;
179+
cursor = cursor + 2;
180+
return value;
146181
}
147182

148183
function u32() {
149-
var value = buffer.slice(cursor);
150-
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
151-
cursor = cursor + 4;
152-
return value;
184+
var value = buffer.slice(cursor);
185+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
186+
cursor = cursor + 4;
187+
return value;
153188
}
154189

155190
function s32() {
156-
var value = buffer.slice(cursor);
157-
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
158-
if ((value & (1 << 31)) > 0) {
159-
value = (~value & 0xffffffff) + 1;
160-
value = -value;
161-
}
162-
cursor = cursor + 4;
163-
return value;
191+
var value = buffer.slice(cursor);
192+
value = value[0] | value[1] << 8 | value[2] << 16 | value[3] << 24;
193+
if ((value & (1 << 31)) > 0) {
194+
value = (~value & 0xffffffff) + 1;
195+
value = -value;
196+
}
197+
cursor = cursor + 4;
198+
return value;
164199
}
165200

166201
if (false) {
167-
var hex = "00000020026609ff7fff97260200e712691298b700000000000000000000000000000000000000000000"
168-
var buf = Buffer.from(hex, 'hex')
169-
console.log(JSON.stringify(Decode(1, buf, 0)));
202+
var hex = "00000020026609ff7fff97260200e712691298b700000000000000000000000000000000000000000000"
203+
var buf = Buffer.from(hex, 'hex')
204+
console.log(JSON.stringify(Decode(1, buf, 0)));
170205
}

applications/clime/codec/nr-decoder.js

+36
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ function decode(buffer) {
1616
let header = buffer.readUInt8(0);
1717
offset += 1;
1818

19+
if (header & 0x80) {
20+
let header_higher = u8() << 8;
21+
header = header_higher + header;
22+
offset += 1;
23+
}
24+
1925
if ((header & 0x01) !== 0) {
2026
data.voltage_rest = buffer.readUInt16LE(offset);
2127
offset += 2;
@@ -130,5 +136,35 @@ function decode(buffer) {
130136
data.dc_line = (line != 0);
131137
}
132138

139+
if ((header & 0x0100) !== 0) {
140+
data.ble_tags = [];
141+
142+
let count = u8();
143+
144+
for (var i = 0; i < count; i++) {
145+
let tag = {};
146+
147+
let t = s16();
148+
let h = u8();
149+
150+
if (t === 0x7fff) {
151+
t = null;
152+
} else {
153+
t = t / 100;
154+
}
155+
156+
if (h === 0xff) {
157+
h = null;
158+
} else {
159+
h = h / 2;
160+
}
161+
162+
tag.temperature = t;
163+
tag.humidity = h;
164+
165+
data.ble_tags.push(tag);
166+
}
167+
}
168+
133169
return data;
134170
}

applications/clime/prj.conf

+3
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
CONFIG_ADC_NRFX_SAADC=n
88
CONFIG_ADC_SHELL=n
99
CONFIG_APP_TAMPER=n
10+
CONFIG_BT_FILTER_ACCEPT_LIST=y
11+
CONFIG_BT_OBSERVER=y
1012
CONFIG_CTR_ACCEL=y
1113
CONFIG_CTR_BATT=y
1214
CONFIG_CTR_BUTTON=y
1315
CONFIG_CTR_BLE=y
16+
CONFIG_CTR_BLE_TAG=y
1417
CONFIG_CTR_BUF=y
1518
CONFIG_CTR_DEFAULTS=y
1619
CONFIG_CTR_INFO=y

0 commit comments

Comments
 (0)