//see: https://github.com/thesolarnomad/lora-serialization/blob/master/examples/ttn_decoder.js function Encoder(json, port) { return encode([json.delay, json.myFlags], [uint16, bitmap]); //delay = seconds, up to 65535 seconds = 18.204167 hours //{"delay": 60, "myFlags": [true, true, true, true, true, false, true, true]} minutes delay between readings } //based on: https://github.com/thesolarnomad/lora-serialization/blob/master/src/decoder.js var intToBytes = function(i, byteSize) { var buf = []; for (var x = 0; x < byteSize; x++) { buf[x] = i >> (x * 8) & 0xFF; } return buf; }; var uint8 = function(i) { if (isNaN(i) || i < 0 || i > 255) { throw new Error('int be in range 0..255'); } return intToBytes(i, uint8.BYTES); }; uint8.BYTES = 1; var uint16 = function(i) { if (isNaN(i) || i < 0 || i > 65535) { throw new Error('int be in range 0..65535'); } return intToBytes(i, uint16.BYTES); }; uint16.BYTES = 2; var bitmap = function(a, b, c, d, e, f, g, h) { // eslint-disable-line no-unused-vars var base = []; for(var i = 0; i < 8; i++) { var bit = arguments[i]; if (typeof bit === 'undefined') { base[i] = false; } else if (typeof bit !== 'boolean') { throw new TypeError('Arguments must be of type boolean'); } else { base[i] = bit; } } var bm = parseInt(base.map(Number).join(''), 2); return intToBytes(bm, bitmap.BYTES); }; bitmap.BYTES = 1; var encode = function(values, mask) { if (!Array.isArray(values)) { throw new TypeError('Values must be an array'); } if (!Array.isArray(mask)) { throw new TypeError('Mask must be an array'); } if (values.length > mask.length) { throw new Error('Mask length is ' + mask.length + ' whereas input is ' + values.length); } return values .reduce(function(acc, args, i) { return acc.concat(mask[i].apply(null, Array.isArray(args) ? args : [args])); }, []); }; if (typeof module === 'object' && typeof module.exports !== 'undefined') { module.exports = { uint8: uint8, uint16: uint16, bitmap: bitmap, encode: encode }; }