Új nmea mondatok: gsa, gsv, műhold info osztály
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import 'package:nmea/nmea.dart';
|
||||
|
||||
/// GSA — GNSS DOP és aktív műholdak
|
||||
///
|
||||
/// Formátum:
|
||||
/// $GNGSA,A,3,01,02,03,04,05,06,07,08,09,10,11,12,2.1,1.2,1.7*XX
|
||||
/// │ │ └─────────── 12 db PRN ────────┘ │ │ │
|
||||
/// │ └── Fix típus: 1=nincs, 2=2D, 3=3D │ │ └─ VDOP
|
||||
/// └──── Mód: M=kézi, A=auto │ └───── HDOP
|
||||
/// └───────── PDOP
|
||||
///
|
||||
/// NMEA 4.1+: opcionális rendszer azonosító (fields[18])
|
||||
/// Minden rendszerhez érkezik egy-egy GSA mondat.
|
||||
class Gngsa extends TalkerSentence {
|
||||
static const String id = 'GNGSA';
|
||||
|
||||
Gngsa({required super.raw});
|
||||
|
||||
@override
|
||||
bool get valid => super.valid && fields.length >= 18;
|
||||
|
||||
/// Módválasztás: 'M' = kézi, 'A' = automatikus
|
||||
String get selectionMode => fields[1];
|
||||
|
||||
/// Fix típus: 1 = nincs, 2 = 2D, 3 = 3D
|
||||
int get fixType => int.tryParse(fields[2]) ?? 1;
|
||||
|
||||
/// Fixben használt műholdak PRN számai (max 12, üres mezők kihagyva)
|
||||
List<int> get activeSatellitePrns {
|
||||
final prns = <int>[];
|
||||
for (int i = 3; i <= 14; i++) {
|
||||
if (i >= fields.length) break;
|
||||
final prn = int.tryParse(fields[i]);
|
||||
if (prn != null && prn > 0) prns.add(prn);
|
||||
}
|
||||
return prns;
|
||||
}
|
||||
|
||||
/// PDOP — 3D pozíció pontossági szorzó
|
||||
double get pdop => _parseDouble(fields[15]);
|
||||
|
||||
/// HDOP — vízszintes pontossági szorzó
|
||||
double get hdop => _parseDouble(fields[16]);
|
||||
|
||||
/// VDOP — függőleges pontossági szorzó
|
||||
/// Az utolsó mező checksum előtti részét veszi
|
||||
double get vdop {
|
||||
if (fields.length <= 17) return 0.0;
|
||||
return _parseDouble(fields[17].split('*').first);
|
||||
}
|
||||
|
||||
/// GDOP számítása: √(PDOP² + TDOP²)
|
||||
/// Közelítés TDOP nélkül: GDOP ≈ PDOP * 1.1
|
||||
double get gdopApprox => pdop * 1.1;
|
||||
|
||||
/// Talker azonosító — rendszer meghatározásához
|
||||
/// GP=GPS, GL=GLONASS, GA=Galileo, GB/BD=BeiDou, GN=vegyes
|
||||
String get talkerId => raw.length >= 3 ? raw.substring(1, 3) : 'GN';
|
||||
|
||||
/// Rendszer neve a talker alapján
|
||||
String get systemName => switch (talkerId) {
|
||||
'GP' => 'GPS',
|
||||
'GL' => 'GLONASS',
|
||||
'GA' => 'Galileo',
|
||||
'GB' || 'BD' => 'BeiDou',
|
||||
'GN' => 'Mixed',
|
||||
_ => 'Unknown',
|
||||
};
|
||||
|
||||
double _parseDouble(String? s) {
|
||||
if (s == null || s.isEmpty) return 0.0;
|
||||
return double.tryParse(s) ?? 0.0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user