parseNMEA static method

GpsCoordinates? parseNMEA(
  1. 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;
  }
}