@iotize/tap
Version:
IoTize Device client for Javascript
158 lines • 11.1 kB
JavaScript
import { ConverterError } from '../error';
export class NumberConverter {
constructor(options) {
this.options = options;
}
/**
* Number as unsigned 8 bits converter
* @param lsb true for least significant bit first
*/
static uint8(lsb = false) {
return new NumberConverter({
signed: false,
sizeOf: 8,
leastSignificantBitFirst: lsb,
});
}
/**
* Number as unsigned 16 bits converter
* @param lsb true for least significant bit first
*/
static uint16(lsb = false) {
return new NumberConverter({
signed: false,
sizeOf: 16,
leastSignificantBitFirst: lsb,
});
}
/**
* Number as unsigned 32 bits converter
* @param lsb true for least significant bit first
*/
static uint32(lsb = false) {
return new NumberConverter({
signed: false,
sizeOf: 32,
leastSignificantBitFirst: lsb,
});
}
/**
* Number as signed 8 bits converter
* @param lsb true for least significant bit first
*/
static int8(lsb = false) {
return new NumberConverter({
signed: true,
sizeOf: 8,
leastSignificantBitFirst: lsb,
});
}
/**
* Number as signed 16 bits converter
* @param lsb true for least significant bit first
*/
static int16(lsb = false) {
return new NumberConverter({
signed: true,
sizeOf: 16,
leastSignificantBitFirst: lsb,
});
}
/**
* Number as signed 32 bits converter
* @param lsb true for least significant bit first
*/
static int32(lsb = false) {
return new NumberConverter({
signed: true,
sizeOf: 32,
leastSignificantBitFirst: lsb,
});
}
decode(body) {
if (body.length * 8 < this.options.sizeOf) {
throw ConverterError.unexpectedBufferSize(this.options.sizeOf / 8, body);
}
return NumberConverter.fromBytes(body, this.options.sizeOf / 8, this.options.signed, this.options.leastSignificantBitFirst);
}
encode(value) {
const maxValue = Math.pow(2, this.options.sizeOf) - 1;
if (value > maxValue) {
throw ConverterError.valueTooBigError(value, maxValue);
}
const result = new Uint8Array(this.options.sizeOf >> 3);
for (var i = 0; i < result.length; i++) {
const decalage = (result.length - i - 1) * 8;
result[i] = (value >> decalage) & 0xff;
}
if (this.options.leastSignificantBitFirst) {
result.reverse();
}
return result;
}
static toOpaqueMsb(input, sizeOf) {
const maxValue = Math.pow(2, sizeOf) - 1;
if (input > maxValue) {
throw ConverterError.valueTooBigError(input, maxValue);
}
if (sizeOf === 8) {
return new Uint8Array([input & 0xff]);
}
else if (sizeOf === 16) {
return new Uint8Array([(input >> 8) & 0xff, input & 0xff]);
}
else if (sizeOf === 32) {
return new Uint8Array([
(input >> 24) & 0xff,
(input >> 16) & 0xff,
(input >> 8) & 0xff,
input & 0xff,
]);
}
else {
throw new Error(`Invalid size ${sizeOf}. Must be 8, 16 or 32`);
}
}
static fromOpaqueMsb(data, sizeOf) {
if (!sizeOf) {
sizeOf = data.length * 8;
}
if (sizeOf === 8) {
return data[0] & 0xff;
}
if (sizeOf === 16) {
return (data[1] & 0xff) + ((data[0] & 0xff) << 8);
}
if (sizeOf === 32) {
return ((data[3] & 0xff) +
((data[2] & 0xff) << 8) +
((data[1] & 0xff) << 16) +
((data[0] & 0xff) << 24));
}
throw new Error(`Invalid size ${sizeOf}. Must be 8, 16 or 32`);
}
/**
* @param size size in bytes
*/
static fromBytes(data, size, signed, lsb) {
if (lsb) {
data = data.reverse();
}
var result = 0;
var last = 0;
var decalage;
for (var i = 0; i < size; i++) {
decalage = (size - i - 1) * 8;
result += ((data[i] & 0xff) << decalage) >>> 0;
if (last > result && !signed) {
throw new Error('Overflow. Last value: ' + last + ' but new is ' + result);
}
last = result;
}
if (signed && (data[0] & 0x80) === 0x80) {
result = -(Math.pow(2, 8 * size) - result);
}
return result;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLWNvbnZlcnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2NsaWVudC9pbXBsL3NyYy9saWIvY29udmVydGVyL2JvZHkvbnVtYmVyLWNvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBZTFDLE1BQU0sT0FBTyxlQUFlO0lBSzFCLFlBQVksT0FBNkI7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUs7UUFDN0IsT0FBTyxJQUFJLGVBQWUsQ0FBQztZQUN6QixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSxDQUFDO1lBQ1Qsd0JBQXdCLEVBQUUsR0FBRztTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSztRQUM5QixPQUFPLElBQUksZUFBZSxDQUFDO1lBQ3pCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsTUFBTSxFQUFFLEVBQUU7WUFDVix3QkFBd0IsRUFBRSxHQUFHO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxLQUFLO1FBQzlCLE9BQU8sSUFBSSxlQUFlLENBQUM7WUFDekIsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsRUFBRTtZQUNWLHdCQUF3QixFQUFFLEdBQUc7U0FDOUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUs7UUFDckIsT0FBTyxJQUFJLGVBQWUsQ0FBQztZQUN6QixNQUFNLEVBQUUsSUFB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