decode method
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;
}