Skip to content

Commit

Permalink
[LoRa/TTN] Add decoder for the packet header
Browse files Browse the repository at this point in the history
Makes the rest of the decoder.js a lot simpler.
Also changed the GPS lat/long into 3 bytes again, saving 2 bytes in the packet length.
GPS outputs now 7 values  using 18 bytes (incl. header)
  • Loading branch information
TD-er committed Aug 15, 2019
1 parent 2a30651 commit 4bda90b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 18 deletions.
4 changes: 2 additions & 2 deletions misc/TTN/packed_converter.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ function Converter(decoded, port) {
var name = "";

if (port === 1) {
if ('plugin_id' in converted) {
switch (converted.plugin_id) {
if ('header' in converted) {
switch (converted.header.plugin_id) {
case 1:
converted.name = "Switch";
converted.v1 = converted.val_1;
Expand Down
42 changes: 30 additions & 12 deletions misc/TTN/packed_decoder.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,31 @@ function Decoder(bytes, port) {
case 26:
// SysInfo
return decode(bytes,
[pluginid, uint16, uint8, uint8,
uint24, uint24, int8, vcc, pct_8, uint8, uint8, uint8, uint8, uint24, uint16],
['plugin_id', 'IDX', 'samplesetcount', 'valuecount',
'uptime', 'freeheap', 'rssi', 'vcc', 'load', 'ip1', 'ip2', 'ip3', 'ip4', 'web', 'freestack']);
[header, uint24, uint24, int8, vcc, pct_8, uint8, uint8, uint8, uint8, uint24, uint16],
['header', 'uptime', 'freeheap', 'rssi', 'vcc', 'load', 'ip1', 'ip2', 'ip3', 'ip4', 'web', 'freestack']);

case 82:
// GPS
return decode(bytes, [pluginid, uint16, uint8, uint8, latLng, latLng, altitude, uint16_1e2, hdop, uint8, uint8],
['plugin_id', 'IDX', 'samplesetcount', 'valuecount', 'latitude', 'longitude', 'altitude', 'speed', 'hdop', 'max_snr', 'sat_tracked']);
return decode(bytes, [header, latLng, latLng, altitude, uint16_1e2, hdop, uint8, uint8],
['header', 'latitude', 'longitude', 'altitude', 'speed', 'hdop', 'max_snr', 'sat_tracked']);

}


if (bytes.length === 9) {
return decode(bytes, [pluginid, uint16, uint8, uint8, int32_1e4], ['plugin_id', 'IDX', 'samplesetcount', 'valuecount', 'val_1']);
return decode(bytes, [header, int32_1e4], ['header', 'val_1']);
}
// Dual value
if (bytes.length === 13) {
return decode(bytes, [pluginid, uint16, uint8, uint8, int32_1e4, int32_1e4], ['plugin_id', 'IDX', 'samplesetcount', 'valuecount', 'val_1', 'val_2']);
return decode(bytes, [header, int32_1e4, int32_1e4], ['header', 'val_1', 'val_2']);
}
// Triple value
if (bytes.length === 17) {
return decode(bytes, [pluginid, uint16, uint8, uint8, int32_1e4, int32_1e4, int32_1e4], ['plugin_id', 'IDX', 'samplesetcount', 'valuecount', 'val_1', 'val_2', 'val_3']);
return decode(bytes, [header, int32_1e4, int32_1e4, int32_1e4], ['header', 'val_1', 'val_2', 'val_3']);
}
// Quad value
if (bytes.length === 21) {
return decode(bytes, [pluginid, uint16, uint8, uint8, int32_1e4, int32_1e4, int32_1e4, int32_1e4], ['plugin_id', 'IDX', 'samplesetcount', 'valuecount', 'val_1', 'val_2', 'val_3', 'val_4']);
return decode(bytes, [header, int32_1e4, int32_1e4, int32_1e4, int32_1e4], ['header', 'val_1', 'val_2', 'val_3', 'val_4']);
}
}

Expand Down Expand Up @@ -215,9 +213,9 @@ pluginid.BYTES = uint8.BYTES;

var latLng = function (bytes) {
// 2^23 / 180 = 46603...
return +(int32(bytes) / 46600);
return +(int24(bytes) / 46600);
};
latLng.BYTES = int32.BYTES;
latLng.BYTES = int24.BYTES;

var hdop = function (bytes) {
return +(uint8(bytes) / 10).toFixed(2);
Expand Down Expand Up @@ -271,6 +269,25 @@ var bitmap2 = function (byte) {
};
bitmap2.BYTES = 1;

var header = function (byte) {
if (byte.length !== header.BYTES) {
throw new Error('header must have exactly 5 bytes');
}
var values = [ 0, 0, 0, 0 ];
values[0] = bytesToInt(byte.slice(0,1));
values[1] = bytesToInt(byte.slice(1,3));
values[2] = bytesToInt(byte.slice(3,4));
values[3] = bytesToInt(byte.slice(4,5));

return ['plugin_id', 'IDX', 'samplesetcount', 'valuecount']
.reduce(function (obj, pos, index) {
obj[pos] = +values[index];
return obj;
}, {});
};
header.BYTES = 5;


var decode = function (bytes, mask, names) {

var maskLength = mask.reduce(function (prev, cur) {
Expand Down Expand Up @@ -351,6 +368,7 @@ if (typeof module === 'object' && typeof module.exports !== 'undefined') {
pct_8: pct_8,
bitmap1: bitmap1,
bitmap2: bitmap2,
header: header,
version: version,
decode: decode
};
Expand Down
8 changes: 4 additions & 4 deletions src/ESPEasy-Globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -2547,11 +2547,11 @@ static uint8_t getPackedDataTypeSize(PackedData_enum dtype, float& factor, float
case PackedData_int32_1e2: factor = 1e2; return 4;
case PackedData_int32_1e1: factor = 1e1; return 4;
case PackedData_pluginid: factor = 1; return 1;
case PackedData_latLng: factor = 46600; return 4; // 2^23 / 180
case PackedData_latLng: factor = 46600; return 3; // 2^23 / 180
case PackedData_hdop: factor = 10; return 1;
case PackedData_altitude: factor = 4; offset = 1000; return 2; // -1000 .. 15383.75 meter
case PackedData_vcc: factor = 41.83; offset = 1; return 1; // -1 .. 5.12V
case PackedData_pct_8: factor = 2.56; return 2; // 0 .. 100%
case PackedData_altitude: factor = 4; offset = 1000; return 2; // -1000 .. 15383.75 meter
case PackedData_vcc: factor = 41.83; offset = 1; return 1; // -1 .. 5.12V
case PackedData_pct_8: factor = 2.56; return 1; // 0 .. 100%
}

// Unknown type
Expand Down

0 comments on commit 4bda90b

Please sign in to comment.