nimcodec
Version:
Encoder/decoder for satellite IoT using Non-IP Messages
54 lines (50 loc) • 2.03 kB
JavaScript
/**
* Signed integer field of user-definable size (payload bits).
*
* For example latitude and longitude could be represented by 24- and 25-bit
* integers as 0.001 minutes providing a resolution of approximately 1 meter.
* @namespace field.int
*/
const { appendBits, int2bits, extractBits, isInt } = require('../../../bitman');
const { calcDecode, calcEncode } = require('./calc');
const Types = require('../types');
/** @type {Types.Field} */
/**
* Decode a signed integer field
* @memberof field.int
* @private
* @param {Field} field The field definition
* @param {number} field.size The number of bits used for transport
* @param {string} [field.calc] Optional calculation expression
* @param {Buffer} buffer The raw payload buffer
* @param {number} offset The start bit of the field in the buffer
* @returns The value and bit offset for the next read operation
*/
function decode(field, buffer, offset) {
let value = extractBits(buffer, offset, field.size, false, true);
if (Object.hasOwn(field, 'decalc'))
value = calcDecode(field.decalc, value);
return { value: value, offset: offset + field.size };
}
/**
* Endoce a signed integer field
* @memberof field.int
* @private
* @param {Field} field The field definition
* @param {number} field.size The number of bits used for transport
* @param {string} [field.calc] Optional calculation expression
* @param {number} value The value to encode
* @param {Buffer} buffer The buffer to append to
* @param {number} offset The bit offset within the buffer to append at
* @returns The encoded buffer and the offset for the next field within it
*/
function encode(field, value, buffer, offset) {
if (Object.hasOwn(field, 'encalc'))
value = calcEncode(field.encalc, value);
if (!isInt(value) ||
value < -(2**field.size / 2) || value > (2**field.size / 2 - 1)) {
throw new Error('Invalid signed integer value for size');
}
return appendBits(int2bits(value, field.size), buffer, offset);
}
module.exports = { decode, encode };