MobilApp/lib/gnss_sentences/gngsv.dart

93 lines
3.4 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ─── 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<SatelliteInfo> get satellites {
final sats = <SatelliteInfo>[];
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',
};
}