@jbroll/nmea-simple
Version:
NMEA 0183 sentence parser and encoder
76 lines (64 loc) • 2.19 kB
text/typescript
/*
* === VTG - Track made good and ground speed ===
*
* ------------------------------------------------------------------------------
* 1 2 3 4 5 6 7 8 9 10
* | | | | | | | | | |
* $--VTG,xxx.x,T,xxx.x,M,x.x,N,x.x,K,m,*hh<CR><LF>
* ------------------------------------------------------------------------------
*
* Field Number:
*
* 1. Track Degrees
* 2. T = True
* 3. Track Degrees
* 4. M = Magnetic
* 5. Speed Knots
* 6. N = Knots
* 7. Speed Kilometers Per Hour
* 8. K = Kilometers Per Hour
* 9. FAA mode indicator (NMEA 2.3 and later)
* 10. Checksum
*/
import { createNmeaChecksumFooter, encodeDegrees, encodeFixed, parseFloatSafe } from "../helpers";
import { initStubFields, PacketStub } from "./PacketStub";
export const sentenceId: "VTG" = "VTG";
export const sentenceName = "Track made good and ground speed";
export interface VTGPacket extends PacketStub<typeof sentenceId> {
trackTrue: number;
trackMagnetic: number;
speedKnots: number;
speedKmph?: number;
faaMode?: string;
}
export function decodeSentence(stub: PacketStub, fields: string[]): VTGPacket {
return {
...initStubFields(stub, sentenceId, sentenceName),
trackTrue: parseFloatSafe(fields[1]),
trackMagnetic: parseFloatSafe(fields[3]),
speedKnots: parseFloatSafe(fields[5]),
speedKmph: parseFloatSafe(fields[7]),
faaMode: fields[9]
};
}
export function encodePacket(packet: VTGPacket, talker: string): string {
const result = ["$" + talker + sentenceId];
result.push(encodeDegrees(packet.trackTrue));
result.push("T");
result.push(encodeDegrees(packet.trackMagnetic));
result.push("M");
result.push(encodeFixed(packet.speedKnots, 2));
result.push("N");
if (packet.speedKmph) {
result.push(encodeFixed(packet.speedKmph, 2));
result.push("K");
} else {
result.push("");
result.push("");
}
if (packet.faaMode) {
result.push(packet.faaMode);
}
const resultWithoutChecksum = result.join(",");
return resultWithoutChecksum + createNmeaChecksumFooter(resultWithoutChecksum);
}