// ─── GSV mondatelemző ────────────────────────────────────────────────────── import 'package:nmea/nmea.dart'; import 'package:terepi_seged/models/satellite_info.dart'; /// GSV — GNSS Satellites in View /// /// Formátum (max 4 műhold/mondat): /// $GPGSV,3,1,11,01,70,042,45,03,55,218,48,07,22,085,35,10,35,315,40*73 /// │ │ │ │ │ │ │ /// │ │ │ PRN El Az SNR (×4 max) /// │ │ └── összes látható műhold száma /// │ └───── ezen mondat sorszáma (1-től) /// └─────── összes GSV mondat ebben a ciklusban /// /// Több mondat alkotja az epochot: /// GPGSV (GPS) + GLGSV (GLONASS) + GAGSV (Galileo) + GBGSV (BeiDou) class Gngsv extends TalkerSentence { static const String id = 'GNGSV'; Gngsv({required super.raw}); @override bool get valid => super.valid && fields.length >= 8; // min: típus + 3 fejléc + 1×4 műhold // ── Fejléc mezők ───────────────────────────────────────────────── /// Összes GSV mondat ezen rendszerhez ebben az epochban int get totalMessages => int.tryParse(fields[1]) ?? 1; /// Ezen mondat sorszáma (1-től indul) int get messageNumber => int.tryParse(fields[2]) ?? 1; /// Összes látható műhold száma (az epochban, nem csak ebben a mondatban) int get totalSatellitesInView => int.tryParse(fields[3]) ?? 0; /// Ez az utolsó mondat az adott rendszer GSV sorozatában? bool get isLastMessage => messageNumber == totalMessages; // ── Műholdak ebben a mondatban ─────────────────────────────────── /// A mondatban szereplő műholdak listája (max 4) List get satellites { final sats = []; final system = systemName; // Minden műhold 4 mezőt foglal: PRN, eleváció, azimut, SNR // fields[4]-től kezdődnek, fields[0] = mondattípus for (int i = 0; i < 4; i++) { final base = 4 + i * 4; // Ellenőrzés: van-e elég mező if (base + 3 >= fields.length) break; final prn = int.tryParse(fields[base] ?? ''); final elev = int.tryParse(fields[base + 1] ?? '') ?? 0; final az = int.tryParse(fields[base + 2] ?? '') ?? 0; // SNR az utolsó mezőben checksum lehet (*XX) final snrRaw = (fields[base + 3] ?? '').split('*').first; final snr = int.tryParse(snrRaw) ?? 0; if (prn != null && prn > 0) { sats.add(SatelliteInfo( prn: prn, elevation: elev, azimuth: az, snr: snr, system: system, )); } } return sats; } // ── Rendszer azonosítás ─────────────────────────────────────────── /// Talker azonosító a nyers mondatból String get talkerId => raw.length >= 3 ? raw.substring(1, 3) : 'GN'; /// Rendszer neve a talker azonosítóból String get systemName => switch (talkerId) { 'GP' => 'GPS', 'GL' => 'GLONASS', 'GA' => 'Galileo', 'GB' || 'BD' => 'BeiDou', 'GN' => 'Mixed', _ => 'Unknown', }; }