74 lines
2.7 KiB
Plaintext
74 lines
2.7 KiB
Plaintext
'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; |