UNPKG

@robotical/ricjs

Version:

Javascript/TS library for Robotical RIC

165 lines 7.1 kB
"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