function signed(val, bits) {
// max positive value possible for signed int with bits:
var mx = Math.pow(2, bits-1);
if (val < mx) {
// is positive value, just return
return val;
} else {
// is negative value, convert to neg:
return val - (2 * mx);
}
}
function int16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return signed(bytes[0] << 8 | bytes[1] << 0, 2*8);
}
function uint16_BE(bytes, idx) {
bytes = bytes.slice(idx || 0);
return bytes[0] << 8 | bytes[1] << 0;
}
/**
* TTN decoder function.
*/
function Decoder(bytes, port) {
return Parse(bytes);
}
/**
* LoRaServer decoder function.
*/
function Decode(fPort, bytes) {
// wrap TTN Decoder:
return Decoder(bytes, fPort);
}
function Parse(input) {
var data = bytes(atob(input.data));
var port = input.fPort;
var fcnt = input.fCnt;
var vals = {};
if( port == 20 ){
if( (uint16_BE(databytes, 1)==7) && (uint16_BE(databytes, 3)==3)){
if( int16_BE(databytes, 5)/10 < 0){
vals["mH2O"] = "Err" // Most propably not under water
}
else{
vals["mH2O"] = int16_BE(databytes, 5)/1000;
}
}
else{
vals["mH2O"] = "Invalid configuration";
}
}
return vals;
}
/**
* TTN V3 Wrapper
*/
function decodeUplink(input) {
vals["port"] = port; return {
vals["data"] = data;
vals["fcnt"] = fcnt;
var lastFcnt = Device.getProperty("lastFcnt");
vals["reset"] = fcnt <= lastFcnt;
Device.setProperty("lastFcnt", fcnt);
return valsdata: {
values: Decoder(input.bytes, input.fPort)
},
warnings: [],
errors: []
};
}
/**
* LoRaServer decoder function.
*/
function Decode(fPort, bytes) {
// wrap TTN Decoder:
return Decoder(bytes, fPort);
}
/**
* Lobaro Platform decoder function.
*/
function Parse(input) {
var data = bytes(atob(input.data));
var port = input.fPort;
return Decoder(data, port);
} |