decode method

List<NmeaMessage> decode(
  1. String nmeaString
)

Implementation

List<NmeaMessage> decode(String nmeaString) {
  if (nmeaString.isEmpty || !nmeaString.startsWith('\$')) {
    return [];
  }

  // ... (此处省略,直接粘贴你提供的完整 NmeaDecoder 类代码) ...
  // ... 例如:
  final parts = nmeaString.split('*');
  if (parts.length != 2) return [];

  final dataPart = parts[0];
  final rawChecksum = parts[1];

  final calculatedChecksum = _calculateChecksum(dataPart.substring(1));
  if (calculatedChecksum.toUpperCase() != rawChecksum.trim().toUpperCase()) {
    print('Checksum mismatch for: $nmeaString');
    return [];
  }

  final fields = dataPart.substring(1).split(',');
  if (fields.isEmpty) return [];

  final talkerIdAndSentenceType = fields[0];
  String talkerId = '';
  String sentenceType = '';

  if (talkerIdAndSentenceType.length >= 5) {
    talkerId = talkerIdAndSentenceType.substring(0, 2);
    sentenceType = talkerIdAndSentenceType.substring(2, 5);
  } else {
    return [];
  }

  List<NmeaMessage> decodedMessages = [];

  switch ('$talkerId$sentenceType') {
    case 'GNGSA':
    case 'GPGSA':
    case 'GLGSA':
    case 'GBGSA':
      final gsaMessage = _parseGsaMessage(fields);
      if (gsaMessage != null) decodedMessages.add(gsaMessage);
      break;
    case 'GPGGA':
    case 'GNGGA':
      final ggaMessage = _parseGgaMessage(fields);
      if (ggaMessage != null) decodedMessages.add(ggaMessage);
      break;
    case 'GPGSV':
    case 'GLGSV':
    case 'GBGSV':
      final gsvMessage = _parseGsvMessage(fields);
      if (gsvMessage != null) decodedMessages.add(gsvMessage);
      break;
    default:
    // print('Unsupported NMEA sentence: $talkerIdAndSentenceType');
      break;
  }

  return decodedMessages;
}