vbo-reader
Version:
A TypeScript library for parsing VBOX (.vbo) data files
119 lines (118 loc) • 4.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataParser = void 0;
const types_1 = require("../types");
const utils_1 = require("./utils");
class DataParser {
constructor(columnNames, options = {}) {
var _a, _b;
this.columnNames = columnNames;
this.options = {
convertCoordinates: (_a = options.convertCoordinates) !== null && _a !== void 0 ? _a : true,
rawData: (_b = options.rawData) !== null && _b !== void 0 ? _b : false,
};
}
/**
* Parses a single data row from the VBO file
* @param line Raw data line from the file
* @returns Parsed data row
*/
parseRow(line) {
const values = (0, utils_1.splitLine)(line);
if (values.length !== this.columnNames.length) {
throw new types_1.VBOParserError(`Data row has ${values.length} columns but expected ${this.columnNames.length}`, 'data');
}
const row = {
satellites: { count: 0, hasDGPS: false, brakeTrigger: false },
time: '',
latitude: 0,
longitude: 0,
velocity: 0,
heading: 0,
height: 0,
verticalVelocity: 0,
triggerEventTime: 0,
};
for (let i = 0; i < this.columnNames.length; i++) {
const columnName = this.columnNames[i].toLowerCase();
const value = values[i];
switch (columnName) {
case 'sats':
const satInfo = (0, utils_1.parseSatelliteInfo)(parseInt(value));
row.satellites = satInfo;
break;
case 'time':
row.time = this.options.rawData ? value : (0, utils_1.parseTime)(value);
break;
case 'lat':
if (this.options.convertCoordinates) {
row.latitude = (0, utils_1.convertCoordinate)(value.slice(1), value.startsWith('+'), true);
}
else {
row.latitude = parseFloat(value);
}
break;
case 'long':
case 'lng':
if (this.options.convertCoordinates) {
row.longitude = (0, utils_1.convertCoordinate)(value.slice(1), value.startsWith('+'), false);
}
else {
row.longitude = parseFloat(value);
}
break;
case 'velocity':
row.velocity = this.options.rawData ? value : parseFloat(value);
break;
case 'heading':
row.heading = this.options.rawData ? value : parseFloat(value);
break;
case 'height':
row.height = this.options.rawData ? value : parseFloat(value);
break;
case 'vertvel':
row.verticalVelocity = this.options.rawData ? value : parseFloat(value);
break;
case 'event1':
row.triggerEventTime = this.options.rawData ? value : parseInt(value);
break;
default:
// Handle additional input channels
if (value.includes('E')) {
row[columnName] = this.options.rawData ? value : (0, utils_1.parseInputChannel)(value);
}
else {
row[columnName] = this.options.rawData ? value : parseFloat(value);
}
}
}
return row;
}
/**
* Parses multiple data rows from the VBO file
* @param content Raw data content from the file
* @returns Array of parsed data rows
*/
parseData(content) {
const lines = content.split('\n');
const data = [];
for (const line of lines) {
const trimmedLine = line.trim();
if (trimmedLine && !trimmedLine.startsWith('[')) {
try {
const row = this.parseRow(trimmedLine);
data.push(row);
}
catch (error) {
if (error instanceof types_1.VBOParserError) {
throw error;
}
// Skip malformed rows in production, but log them
console.warn('Skipping malformed data row:', trimmedLine);
}
}
}
return data;
}
}
exports.DataParser = DataParser;