@robotical/ricjs
Version:
Javascript/TS library for Robotical RIC
165 lines • 7.1 kB
JavaScript
"use strict";
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RICJS
// Communications Library
//
// Rob Dobson & Chris Greening 2020-2022
// (C) 2020-2022
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Object.defineProperty(exports, "__esModule", { value: true });
exports.RICDataExtractor = exports.RICDataExtractorDef = exports.RICDataExtractorVarDef = exports.RICDataExtractorCalcs = exports.RICDataExtractorRetVal = exports.RICDataExtractorVarType = void 0;
var RICDataExtractorVarType;
(function (RICDataExtractorVarType) {
RICDataExtractorVarType[RICDataExtractorVarType["VAR_BOOL"] = 0] = "VAR_BOOL";
RICDataExtractorVarType[RICDataExtractorVarType["VAR_SIGNED"] = 1] = "VAR_SIGNED";
RICDataExtractorVarType[RICDataExtractorVarType["VAR_UNSIGNED"] = 2] = "VAR_UNSIGNED";
RICDataExtractorVarType[RICDataExtractorVarType["VAR_FLOAT"] = 3] = "VAR_FLOAT";
RICDataExtractorVarType[RICDataExtractorVarType["VAR_DOUBLE"] = 4] = "VAR_DOUBLE";
RICDataExtractorVarType[RICDataExtractorVarType["VAR_FIXED_LEN_STRING"] = 5] = "VAR_FIXED_LEN_STRING";
})(RICDataExtractorVarType = exports.RICDataExtractorVarType || (exports.RICDataExtractorVarType = {}));
class RICDataExtractorRetVal {
}
exports.RICDataExtractorRetVal = RICDataExtractorRetVal;
class RICDataExtractorCalcs {
constructor() {
//varName = '';
this.bytePos = 0;
this.bitMask = 1;
this.numBytes = 0;
this.postMult = 1;
this.postAdd = 0;
this.littleEndian = false;
}
}
exports.RICDataExtractorCalcs = RICDataExtractorCalcs;
class RICDataExtractorVarDef {
constructor() {
this.suffix = '';
this.atBit = 0;
this.bits = 1;
this.type = RICDataExtractorVarType.VAR_BOOL;
this.postMult = 1;
this.postAdd = 0;
this.littleEndian = false;
this.calcs = null;
}
}
exports.RICDataExtractorVarDef = RICDataExtractorVarDef;
class RICDataExtractorDef {
constructor() {
this.fields = new Array();
}
}
exports.RICDataExtractorDef = RICDataExtractorDef;
class RICDataExtractor {
constructor(varNameBase, formatDef) {
this._formatDef = new RICDataExtractorDef();
this._varNameBase = '';
this._formatDef = formatDef;
this._varNameBase = varNameBase;
this.preCalcs();
}
preCalcs() {
// Perform pre-calculations to speed-up processing
for (const fmt of this._formatDef.fields) {
const calcs = new RICDataExtractorCalcs();
//calcs.varName = this._varNameBase + fmt.suffix;
calcs.bytePos = Math.floor(fmt.atBit / 8);
calcs.bitMask =
(0x80000000 >> (fmt.bits - 1)) >>> (32 - fmt.bits - (fmt.atBit % 8));
calcs.numBytes = Math.ceil(fmt.bits / 8);
calcs.postMult = fmt.postMult === undefined ? 1 : fmt.postMult;
calcs.postAdd = fmt.postAdd === undefined ? 0 : fmt.postAdd;
calcs.littleEndian =
fmt.littleEndian === undefined ? false : fmt.littleEndian;
fmt.calcs = calcs;
}
}
extractData(data) {
const retVals = new RICDataExtractorRetVal();
for (const fmt of this._formatDef.fields) {
if ((fmt.calcs === null) || (fmt.calcs === undefined))
continue;
const calcs = fmt.calcs;
const varName = this._varNameBase + fmt.suffix;
switch (fmt.type) {
case RICDataExtractorVarType.VAR_BOOL: {
// Check read length is valid
if (calcs.bytePos >= data.length)
continue;
// Extract the bitfield
const val = data[calcs.bytePos] & calcs.bitMask;
retVals[varName] = val != 0;
break;
}
case RICDataExtractorVarType.VAR_SIGNED:
case RICDataExtractorVarType.VAR_UNSIGNED: {
// Check read length is valid
if (calcs.bytePos + calcs.numBytes > data.length)
continue;
// Extract the value
let val = 0;
if (calcs.littleEndian) {
for (let i = calcs.numBytes - 1; i >= 0; i--) {
val = (val << 8) | data[calcs.bytePos + i];
}
}
else {
for (let i = 0; i < calcs.numBytes; i++) {
val = (val << 8) | data[calcs.bytePos + i];
}
}
val = val & calcs.bitMask;
if (fmt.type == RICDataExtractorVarType.VAR_SIGNED &&
val & (1 << (fmt.bits - 1))) {
val = val - (1 << fmt.bits);
}
// Store the value with post-processing
retVals[varName] = val * calcs.postMult + calcs.postAdd;
break;
}
case RICDataExtractorVarType.VAR_FLOAT: {
// Check read length is valid
if (calcs.bytePos + 4 > data.length)
continue;
const dv = new DataView(data);
const val = dv.getFloat32(calcs.bytePos, calcs.littleEndian);
// Store the value with post-processing
retVals[varName] = val * calcs.postMult + calcs.postAdd;
break;
}
case RICDataExtractorVarType.VAR_DOUBLE: {
// Check read length is valid
if (calcs.bytePos + 8 > data.length)
continue;
const dv = new DataView(data);
const val = dv.getFloat64(calcs.bytePos, calcs.littleEndian);
// Store the value with post-processing
retVals[varName] = val * calcs.postMult + calcs.postAdd;
break;
}
case RICDataExtractorVarType.VAR_FIXED_LEN_STRING: {
// Check read length is valid
if (calcs.bytePos + calcs.numBytes > data.length)
continue;
// Extract the value
let val = '';
for (let i = 0; i < calcs.numBytes; i++) {
const ch = data[calcs.bytePos + i];
if (ch === 0)
break;
val += String.fromCharCode(ch);
}
// Store the value
retVals[varName] = val;
break;
}
}
}
return retVals;
}
}
exports.RICDataExtractor = RICDataExtractor;
//# sourceMappingURL=RICDataExtractor.js.map