parseNMEA static method
- String nmeaSentence
Parses an NMEA sentence into a GpsCoordinates
object.
See https://shadyelectronics.com/gps-nmea-sentence-structure.
Implementation
static GpsCoordinates? parseNMEA(String nmeaSentence) {
final parts = nmeaSentence.split(",");
final tag = parts.first;
if (tag.endsWith("GGA")) {
var latitude = _nmeaToDecimal(double.tryParse(parts[2]) ?? 0);
var longitude = _nmeaToDecimal(double.tryParse(parts[4]) ?? 0);
if (parts[3] == "S") {
latitude *= -1;
}
if (parts[5] == "W") {
longitude *= -1;
}
final quality = int.tryParse(parts[6]);
final rtkMode = switch (quality) {
4 => RTKMode.RTK_FIXED,
5 => RTKMode.RTK_FLOAT,
_ => RTKMode.RTK_NONE,
};
return GpsCoordinates(
latitude: latitude,
longitude: longitude,
altitude: double.tryParse(parts[9]) ?? 0.0,
rtkMode: rtkMode,
);
} else if (tag.endsWith("RMC")) {
var latitude = _nmeaToDecimal(double.tryParse(parts[3]) ?? 0.0);
if (parts[4] == "S") {
latitude *= -1;
}
var longitude = _nmeaToDecimal(double.tryParse(parts[5]) ?? 0.0);
if (parts[6] == "W") {
longitude *= -1;
}
final posMode = parts[12];
final rtkMode = switch (posMode) {
"F" => RTKMode.RTK_FLOAT,
"R" => RTKMode.RTK_FIXED,
_ => RTKMode.RTK_NONE,
};
return GpsCoordinates(
latitude: latitude,
longitude: longitude,
rtkMode: rtkMode,
);
} else if (tag.endsWith("GLL")) {
var latitude = _nmeaToDecimal(double.tryParse(parts[1]) ?? 0.0);
if (parts[2] == "S") {
latitude *= -1;
}
var longitude = _nmeaToDecimal(double.tryParse(parts[3]) ?? 0.0);
if (parts[4] == "W") {
longitude *= -1;
}
return GpsCoordinates(
latitude: latitude,
longitude: longitude,
);
} else {
return null;
}
}