From 53888c9dcb1cdff72da184fc0ab76ca002724e07 Mon Sep 17 00:00:00 2001 From: "torok.istvan" Date: Tue, 19 May 2026 00:37:18 +0200 Subject: [PATCH] =?UTF-8?q?GGA,=20GST=20=C3=A9s=20RMC=20nmea=20mondat=20?= =?UTF-8?q?=C3=A9rtelemz=C5=91=20refraktor=C3=A1l=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/gnss_sentences/gngga.dart | 62 ++++++++++++++++++--------- lib/gnss_sentences/gngst.dart | 39 ++++++++++++----- lib/gnss_sentences/gnrmc.dart | 81 ++++++++++++++++++++++++----------- 3 files changed, 127 insertions(+), 55 deletions(-) diff --git a/lib/gnss_sentences/gngga.dart b/lib/gnss_sentences/gngga.dart index f266140..c969b2b 100644 --- a/lib/gnss_sentences/gngga.dart +++ b/lib/gnss_sentences/gngga.dart @@ -1,35 +1,55 @@ import 'package:nmea/nmea.dart'; class Gngga extends TalkerSentence { - static const String id = "GNGGA"; + static const String id = "GxGGA"; Gngga({required super.raw}); @override - bool get valid => super.valid && fields.length == 15; + bool get valid => super.valid && fields.length >= 15; - String get utcOfPositionFix => fields[1]; - int get gpsQualityIndicator => int.parse(fields[6]); - double get latitude => _getCoordinateFromGpsLatitude(fields[2]); - String get latitudeDirection => fields[3]; - double get longitude => _getCoordinateFromGpsLongitude(fields[4]); - String get longitudeDirection => fields[5]; - int get numberOfSvsInUse => int.parse(fields[7]); - double get hdop => double.parse(fields[8]); - double get altitudeAboveMeanSeaLevel => double.parse(fields[9]); - double get geoidSeparation => double.parse(fields[11]); + String get utcOfPositionFix => _field(1); + int get gpsQualityIndicator => _parseInt(_field(6), fallback: 0); + String get latitudeDirection => _field(3).toUpperCase(); + double get latitude => _parseLatitude(_field(2), latitudeDirection) ?? 0.0; + String get longitudeDirection => _field(5).toUpperCase(); + double get longitude => _parseLongitude(_field(4), longitudeDirection) ?? 0.0; + int get numberOfSvsInUse => _parseInt(_field(7), fallback: 0); + double get hdop => _parseDouble(_field(8), fallback: 0.0); + double get altitudeAboveMeanSeaLevel => + _parseDouble(_field(9), fallback: 0.0); + double get geoidSeparation => _parseDouble(_field(11), fallback: 0.0); - double _getCoordinateFromGpsLongitude(String coordinate) { - double result = - double.parse("${coordinate[0]}${coordinate[1]}${coordinate[2]}") + - double.parse(coordinate.substring(3)) / 60; + String _field(int index) { + if (index < 0 || index >= fields.length) return ''; - return result; + return fields[index].trim(); } - double _getCoordinateFromGpsLatitude(String coordinate) { - double result = double.parse("${coordinate[0]}${coordinate[1]}") + - double.parse(coordinate.substring(2)) / 60; + int _parseInt(String value, {required int fallback}) { + return int.tryParse(value) ?? fallback; + } - return result; + double _parseDouble(String value, {required double fallback}) { + return double.tryParse(value) ?? fallback; + } + + double? _parseLatitude(String value, String direction) { + if (value.length < 4) return null; // ddmm.mmmm + final deg = double.tryParse(value.substring(0, 2)); + final min = double.tryParse(value.substring(2)); + if (deg == null || min == null) return null; + + final result = deg + (min / 60.0); + return direction == 'S' ? -result : result; + } + + double? _parseLongitude(String value, String direction) { + if (value.length < 5) return null; // dddmm.mmmm + final deg = double.tryParse(value.substring(0, 3)); + final min = double.tryParse(value.substring(3)); + if (deg == null || min == null) return null; + + final result = deg + (min / 60.0); + return direction == 'W' ? -result : result; } } diff --git a/lib/gnss_sentences/gngst.dart b/lib/gnss_sentences/gngst.dart index 1ba9de6..08a4550 100644 --- a/lib/gnss_sentences/gngst.dart +++ b/lib/gnss_sentences/gngst.dart @@ -1,18 +1,37 @@ import 'package:nmea/nmea.dart'; class Gngst extends TalkerSentence { - static const String id = "GNGST"; + static const String id = 'GxGST'; + Gngst({required super.raw}); @override - bool get valid => super.valid && fields.length == 9; + bool get valid => super.valid && fields.length >= 9; - String get utcOfPositionFix => fields[1]; - double get rms => double.parse(fields[2]); - double get errorEllipseSemiMajorAxis => double.parse(fields[3]); - double get errorEllipseSemiMinorAxis => double.parse(fields[4]); - double get errorEllipseOrientation => double.parse(fields[5]); - double get longitudeError => double.parse(fields[6]); - double get latitudeError => double.parse(fields[7]); - double get heightError => double.parse(fields[8]); + String get utcOfPositionFix => _field(1); + + double get rms => _parseDouble(_field(2), fallback: 0.0); + + double get errorEllipseSemiMajorAxis => + _parseDouble(_field(3), fallback: 0.0); + + double get errorEllipseSemiMinorAxis => + _parseDouble(_field(4), fallback: 0.0); + + double get errorEllipseOrientation => _parseDouble(_field(5), fallback: 0.0); + + double get longitudeError => _parseDouble(_field(6), fallback: 0.0); + + double get latitudeError => _parseDouble(_field(7), fallback: 0.0); + + double get heightError => _parseDouble(_field(8), fallback: 0.0); + + String _field(int index) { + if (index < 0 || index >= fields.length) return ''; + return fields[index].trim(); + } + + double _parseDouble(String value, {required double fallback}) { + return double.tryParse(value) ?? fallback; + } } diff --git a/lib/gnss_sentences/gnrmc.dart b/lib/gnss_sentences/gnrmc.dart index 2a6e40f..b297e8a 100644 --- a/lib/gnss_sentences/gnrmc.dart +++ b/lib/gnss_sentences/gnrmc.dart @@ -1,38 +1,71 @@ import 'package:nmea/nmea.dart'; class Gnrmc extends TalkerSentence { - static const String id = "GNRMC"; + static const String id = 'GxRMC'; + Gnrmc({required super.raw}); @override - bool get valid => super.valid && fields.length == 14; + bool get valid => super.valid && fields.length >= 10; - String get messageId => fields[0]; - String get utcOfPositionFix => fields[1]; - String get Status => fields[2]; - double get latitude => _getCoordinateFromGpsLatitude(fields[3]); - String get latitudeDirection => fields[4]; - double get longitude => _getCoordinateFromGpsLongitude(fields[5]); - String get longitudeDirection => fields[6]; - double get speedOverGroundKnots => double.parse(fields[7]); - double get courseOverGround => double.parse(fields[8]); - String get date => fields[9]; - double get magneticVariation => double.parse(fields[10]); - String get magneticVariationDirection => fields[11]; - String get positioningSystemModeIndicator => fields[12]; + String get messageId => _field(0); - double _getCoordinateFromGpsLongitude(String coordinate) { - double result = - double.parse("${coordinate[0]}${coordinate[1]}${coordinate[2]}") + - double.parse(coordinate.substring(3)) / 60; + String get utcOfPositionFix => _field(1); - return result; + String get status => _field(2).toUpperCase(); + + String get latitudeDirection => _field(4).toUpperCase(); + + double get latitude => _parseLatitude(_field(3), latitudeDirection) ?? 0.0; + + String get longitudeDirection => _field(6).toUpperCase(); + + double get longitude => _parseLongitude(_field(5), longitudeDirection) ?? 0.0; + + double get speedOverGroundKnots => _parseDouble(_field(7), fallback: 0.0); + + double get courseOverGround => _parseDouble(_field(8), fallback: 0.0); + + String get date => _field(9); + + // Opcionális mezők -> nullable getterek + double? get magneticVariation => _parseDoubleOrNull(_field(10)); + + String get magneticVariationDirection => _field(11).toUpperCase(); + + String get positioningSystemModeIndicator => _field(12).toUpperCase(); + + String _field(int index) { + if (index < 0 || index >= fields.length) return ''; + return fields[index].trim(); } - double _getCoordinateFromGpsLatitude(String coordinate) { - double result = double.parse("${coordinate[0]}${coordinate[1]}") + - double.parse(coordinate.substring(2)) / 60; + double _parseDouble(String value, {required double fallback}) { + return double.tryParse(value) ?? fallback; + } - return result; + double? _parseDoubleOrNull(String value) { + if (value.isEmpty) return null; + return double.tryParse(value); + } + + double? _parseLatitude(String value, String direction) { + if (value.length < 4) return null; // ddmm.mmmm + final deg = double.tryParse(value.substring(0, 2)); + final min = double.tryParse(value.substring(2)); + if (deg == null || min == null) return null; + + final result = deg + (min / 60.0); + return direction == 'S' ? -result : result; + } + + double? _parseLongitude(String value, String direction) { + if (value.length < 5) return null; // dddmm.mmmm + final deg = double.tryParse(value.substring(0, 3)); + final min = double.tryParse(value.substring(3)); + if (deg == null || min == null) return null; + + final result = deg + (min / 60.0); + return direction == 'W' ? -result : result; } }