agn-utils/binary-package-parser/agn-parser.js

74 lines
2.7 KiB
JavaScript

'use strict';
const assert = require('assert');
/* Agnav Tracking binary protocol
trk_pos_type = Record {40 bytes}
{Header}
trk_Header1 : byte {0xFB}
trk_Header2 : byte {0xFB}
trk_DataID : byte {0xF7}
trk_ACID : LongInt; {4 bytes signed Integer}
trk_Time : LongInt // Number of seconds since 1970, 1, 1 to current UTC time
trk_Lat : float; {4 byte floating point}
trk_Lon : float; {4 byte floating point}
trk_Alt : integer; {GPS alt, m, 2 byte signed integer}
trk_SprayStat: byte; {0: off, 1: on, unsigned char}
trk_Speed : word; {dm/s, speed * 10 2 bytes signed integer}
trk_Heading : integer; { 0 - 359}
trk_Temp : byte; {C deg, offset by 100, unsigned char}
trk_Humid : byte; {0 - 100%, unsigned char}
trk_AppRate : integer {Application rate L/Ha * 10}
trk_Wspd : integer; {Windspeed * 10 dm/s}
trk_Whdg : integer; {Wind heading, 0-359}
trk_Res : byte; {reserved = 0, unsigned char}
trk_Chksum : word; {Sum of all bytes start from FB}
trk_End : word; {end of record, 0x0D 0x0A}
End;
** NOTES:
byte : 1-byte unsigned integer
word : 2-byte unsigned int
integer : 2-byte signed int
LongInt : 4-byte signed int
float : 4-byte floating number
*/
class RAPParser {
/**
* Parse AgNav Tracking binary response package
* @param {*} agnPkg The package data in Buffer. Structure: <Cmd><Data>, Cmd = 0xF7
* @returns a GPS data object
*/
parse(agnPkg) {
assert.ok(Buffer.isBuffer(agnPkg), 'agnPkg argument must be an instance of Buffer'); // prettier-ignore
assert.ok(agnPkg.length == 38, 'agnPkg must have 40 bytes'); // prettier-ignore
let record, offset;
record = {};
offset = 5; // Skip the first Cmd byte (F7) + 4 bytes Aircraft Id
record.gdt = new Date(agnPkg.readInt32LE(offset) * 1000); offset += 4;
record.lat = agnPkg.readFloatLE(offset); offset += 4;
record.lon = agnPkg.readFloatLE(offset); offset += 4;
record.alt = agnPkg.readInt16LE(offset); offset += 2;
record.inputs = agnPkg.readUInt8(offset); offset += 1;
record.speed = agnPkg.readInt16LE(offset); offset += 2;
if (record.speed > 0)
record.speed = record.speed * 0.36; // dm/s to km/h
record.head = agnPkg.readInt16LE(offset); offset += 2;
record.temp = agnPkg.readUInt8(offset) - 100; offset += 1;
record.humid = agnPkg.readUInt8(offset); offset += 1;
record.appRate = agnPkg.readInt16LE(offset) * 1e-1; offset += 2;
record.windSpd = agnPkg.readInt16LE(offset); offset += 2;
record.windHdg = agnPkg.readInt16LE(offset); offset += 2;
agnPkg = null;
return record;
}
}
module.exports = RAPParser;