'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 = 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;