@jbroll/nmea-simple
Version:
NMEA 0183 sentence parser and encoder
72 lines (63 loc) • 2.3 kB
text/typescript
/*
* === GSA - Active satellites and dilution of precision ===
*
* ------------------------------------------------------------------------------
* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
* | | | | | | | | | | | | | | | | | |
* $--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,x.x,x.x,x.x*hh<CR><LF>
* ------------------------------------------------------------------------------
*
* Field Number:
*
* 1. Selection of 2D or 3D fix
* A - Automatic
* M - Manual, forced to operate in 2D or 3D
* 2. 3D fix
* 1 - no fix
* 2 - 2D fix
* 3 - 3D fix
* 3. PRN of satellite used for fix (may be blank)
* ...
* 14. PRN of satellite used for fix (may be blank)
* 15. Dilution of precision
* 16. Horizontal dilution of precision
* 17. Vertical dilution of precision
* 18. System ID - uBlox extension
* 18. Checksum
*/
import { parseFloatSafe, parseIntSafe } from "../helpers";
import { adjustPRN } from "../prn-utils";
import { initStubFields, PacketStub } from "./PacketStub";
export const sentenceId: "GSA" = "GSA";
export const sentenceName = "Active satellites and dilution of precision";
export type ThreeDFixType = "unknown" | "none" | "2D" | "3D";
const ThreeDFixTypes: ThreeDFixType[] = [ "unknown", "none", "2D", "3D" ];
export interface GSAPacket extends PacketStub<typeof sentenceId> {
selectionMode: "automatic" | "manual";
fixMode: ThreeDFixType;
satellites: number[];
PDOP: number;
HDOP: number;
VDOP: number;
}
export function decodeSentence(stub: PacketStub, fields: string[]): GSAPacket {
const sats: number[] = [];
const systemId = fields.length > 18 ? parseIntSafe(fields[18]) : 0;
for (let i = 3; i < 15; i++) {
if (fields[i]) {
const rawPrn = parseIntSafe(fields[i]);
if (rawPrn > 0) {
sats.push(adjustPRN(rawPrn, systemId));
}
}
}
return {
...initStubFields(stub, sentenceId, sentenceName),
selectionMode: fields[1] === "A" ? "automatic" : "manual",
fixMode: ThreeDFixTypes[parseIntSafe(fields[2])],
satellites: sats,
PDOP: parseFloatSafe(fields[15]),
HDOP: parseFloatSafe(fields[16]),
VDOP: parseFloatSafe(fields[17])
};
}