mesh-net-codec
Version:
Decoder for enless LoRaWAN data frames.
63 lines (53 loc) • 1.7 kB
JavaScript
const consts = require("./constants");
exports.hexToUInt = (hex, divider = 1) => {
return parseInt(hex, 16) / divider;
};
exports.hexToInt = (hex, divider = 1) => {
if (hex >= "8000" && hex <= "FFFF") {
return (parseInt(hex, 16) - consts.INT_MAX - 1) / divider;
} else {
return parseInt(hex, 16) / divider;
}
};
exports.hexToBin = (hex, numOfBytes = 2) => {
return parseInt(hex, 16)
.toString(2)
.padStart(numOfBytes * 4, "0");
};
exports.binToUInt = (bin) => {
return parseInt(bin, 2);
};
exports.hexToFwVerison = (hex) => {
const binNum = exports.hexToBin(hex);
return exports.binToUInt(binNum.substring(binNum.length - 3, binNum.length));
};
exports.hexToStatus = (hex, defs) => {
const status = {};
const binNum = exports.hexToBin(hex, 4);
defs.forEach((def) => {
const bitValue = +binNum[binNum.length - def.bit];
const textValue = def.values[bitValue];
if (status.hasOwnProperty(def.name)) {
status[def.name] = { ...status[def.name], ...textValue };
} else {
status[def.name] = textValue;
}
});
return status;
};
exports.hexToBatteryLvl = (hex, startBit = 3, endBit = 1) => {
const binNum = exports.hexToBin(hex, 4);
const batteryCode = binNum.substring(binNum.length - startBit, binNum.length - endBit);
switch (batteryCode) {
case "00":
return "100%";
case "01":
return "75%";
case "10":
return "50%";
case "11":
return "25%";
default:
return "unknown";
}
};