GGA, GST és RMC nmea mondat értelemző refraktorálás
This commit is contained in:
parent
20a8078f3c
commit
53888c9dcb
@ -1,35 +1,55 @@
|
|||||||
import 'package:nmea/nmea.dart';
|
import 'package:nmea/nmea.dart';
|
||||||
|
|
||||||
class Gngga extends TalkerSentence {
|
class Gngga extends TalkerSentence {
|
||||||
static const String id = "GNGGA";
|
static const String id = "GxGGA";
|
||||||
Gngga({required super.raw});
|
Gngga({required super.raw});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get valid => super.valid && fields.length == 15;
|
bool get valid => super.valid && fields.length >= 15;
|
||||||
|
|
||||||
String get utcOfPositionFix => fields[1];
|
String get utcOfPositionFix => _field(1);
|
||||||
int get gpsQualityIndicator => int.parse(fields[6]);
|
int get gpsQualityIndicator => _parseInt(_field(6), fallback: 0);
|
||||||
double get latitude => _getCoordinateFromGpsLatitude(fields[2]);
|
String get latitudeDirection => _field(3).toUpperCase();
|
||||||
String get latitudeDirection => fields[3];
|
double get latitude => _parseLatitude(_field(2), latitudeDirection) ?? 0.0;
|
||||||
double get longitude => _getCoordinateFromGpsLongitude(fields[4]);
|
String get longitudeDirection => _field(5).toUpperCase();
|
||||||
String get longitudeDirection => fields[5];
|
double get longitude => _parseLongitude(_field(4), longitudeDirection) ?? 0.0;
|
||||||
int get numberOfSvsInUse => int.parse(fields[7]);
|
int get numberOfSvsInUse => _parseInt(_field(7), fallback: 0);
|
||||||
double get hdop => double.parse(fields[8]);
|
double get hdop => _parseDouble(_field(8), fallback: 0.0);
|
||||||
double get altitudeAboveMeanSeaLevel => double.parse(fields[9]);
|
double get altitudeAboveMeanSeaLevel =>
|
||||||
double get geoidSeparation => double.parse(fields[11]);
|
_parseDouble(_field(9), fallback: 0.0);
|
||||||
|
double get geoidSeparation => _parseDouble(_field(11), fallback: 0.0);
|
||||||
|
|
||||||
double _getCoordinateFromGpsLongitude(String coordinate) {
|
String _field(int index) {
|
||||||
double result =
|
if (index < 0 || index >= fields.length) return '';
|
||||||
double.parse("${coordinate[0]}${coordinate[1]}${coordinate[2]}") +
|
|
||||||
double.parse(coordinate.substring(3)) / 60;
|
|
||||||
|
|
||||||
return result;
|
return fields[index].trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
double _getCoordinateFromGpsLatitude(String coordinate) {
|
int _parseInt(String value, {required int fallback}) {
|
||||||
double result = double.parse("${coordinate[0]}${coordinate[1]}") +
|
return int.tryParse(value) ?? fallback;
|
||||||
double.parse(coordinate.substring(2)) / 60;
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,18 +1,37 @@
|
|||||||
import 'package:nmea/nmea.dart';
|
import 'package:nmea/nmea.dart';
|
||||||
|
|
||||||
class Gngst extends TalkerSentence {
|
class Gngst extends TalkerSentence {
|
||||||
static const String id = "GNGST";
|
static const String id = 'GxGST';
|
||||||
|
|
||||||
Gngst({required super.raw});
|
Gngst({required super.raw});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get valid => super.valid && fields.length == 9;
|
bool get valid => super.valid && fields.length >= 9;
|
||||||
|
|
||||||
String get utcOfPositionFix => fields[1];
|
String get utcOfPositionFix => _field(1);
|
||||||
double get rms => double.parse(fields[2]);
|
|
||||||
double get errorEllipseSemiMajorAxis => double.parse(fields[3]);
|
double get rms => _parseDouble(_field(2), fallback: 0.0);
|
||||||
double get errorEllipseSemiMinorAxis => double.parse(fields[4]);
|
|
||||||
double get errorEllipseOrientation => double.parse(fields[5]);
|
double get errorEllipseSemiMajorAxis =>
|
||||||
double get longitudeError => double.parse(fields[6]);
|
_parseDouble(_field(3), fallback: 0.0);
|
||||||
double get latitudeError => double.parse(fields[7]);
|
|
||||||
double get heightError => double.parse(fields[8]);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,38 +1,71 @@
|
|||||||
import 'package:nmea/nmea.dart';
|
import 'package:nmea/nmea.dart';
|
||||||
|
|
||||||
class Gnrmc extends TalkerSentence {
|
class Gnrmc extends TalkerSentence {
|
||||||
static const String id = "GNRMC";
|
static const String id = 'GxRMC';
|
||||||
|
|
||||||
Gnrmc({required super.raw});
|
Gnrmc({required super.raw});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get valid => super.valid && fields.length == 14;
|
bool get valid => super.valid && fields.length >= 10;
|
||||||
|
|
||||||
String get messageId => fields[0];
|
String get messageId => _field(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];
|
|
||||||
|
|
||||||
double _getCoordinateFromGpsLongitude(String coordinate) {
|
String get utcOfPositionFix => _field(1);
|
||||||
double result =
|
|
||||||
double.parse("${coordinate[0]}${coordinate[1]}${coordinate[2]}") +
|
|
||||||
double.parse(coordinate.substring(3)) / 60;
|
|
||||||
|
|
||||||
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 _parseDouble(String value, {required double fallback}) {
|
||||||
double result = double.parse("${coordinate[0]}${coordinate[1]}") +
|
return double.tryParse(value) ?? fallback;
|
||||||
double.parse(coordinate.substring(2)) / 60;
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user