Látható és használt műholdak számának meghatározása és megjelenítése

This commit is contained in:
2026-06-06 23:16:03 +02:00
parent 9347e22843
commit 497821bb41
6 changed files with 442 additions and 47 deletions
+32
View File
@@ -1,4 +1,5 @@
import 'package:nmea/nmea.dart';
import 'package:terepi_seged/models/satellite_info.dart';
/// GSA — GNSS DOP és aktív műholdak
///
@@ -67,6 +68,37 @@ class Gngsa extends TalkerSentence {
_ => 'Unknown',
};
int? get systemId {
if (fields.length <= 18) return null;
final rawSys = fields[18].split('*').first.trim();
if (rawSys.isEmpty) return null;
return int.tryParse(rawSys);
}
GnssConstellation get constellation {
switch (systemId) {
case 1:
return GnssConstellation.gps;
case 2:
return GnssConstellation.glonass;
case 3:
return GnssConstellation.galileo;
case 4:
return GnssConstellation.beidou;
case 5:
return GnssConstellation.qzss;
default:
return SatelliteInfo.constellationFromTalker(talkerId);
}
}
String get constellationKey => constellation.name;
List<String> get activeSatelliteKeys =>
activeSatellitePrns.map((prn) => '$constellationKey:$prn').toList();
int get usedSatelliteCount => activeSatellitePrns.length;
double _parseDouble(String? s) {
if (s == null || s.isEmpty) return 0.0;
return double.tryParse(s) ?? 0.0;
+49 -25
View File
@@ -29,21 +29,57 @@ class Gngsv extends TalkerSentence {
/// Összes GSV mondat ezen rendszerhez ebben az epochban
int get totalMessages => int.tryParse(fields[1]) ?? 1;
/// Ezen mondat sorszáma (1-től indul)
/// Az aktuális mondat sorszáma
int get messageNumber => int.tryParse(fields[2]) ?? 1;
/// Összes látható műhold száma (az epochban, nem csak ebben a mondatban)
/// Összes látható műhold száma az adott stream-ben
int get totalSatellitesInView => int.tryParse(fields[3]) ?? 0;
/// Ez az utolsó mondat az adott rendszer GSV sorozatában?
bool get isLastMessage => messageNumber == totalMessages;
String get talkerId => raw.length >= 3 ? raw.substring(1, 3) : 'GN';
GnssConstellation get constellation =>
SatelliteInfo.constellationFromTalker(talkerId);
String get systemName => switch (constellation) {
GnssConstellation.gps => 'GPS',
GnssConstellation.glonass => 'GLONASS',
GnssConstellation.galileo => 'Galileo',
GnssConstellation.beidou => 'BeiDou',
GnssConstellation.qzss => 'QZSS',
GnssConstellation.sbas => 'SBAS',
GnssConstellation.navic => 'NavIC',
GnssConstellation.mixed => 'Mixed',
GnssConstellation.unknown => 'Unknown',
};
/// Opcionális NMEA Signal ID
///
/// Header: 4 mezo
/// Minden muhold: 4 mezo
/// Ha marad +1 mezo, az a signalId
int? get signalId {
final payloadCount = fields.length - 4;
if (payloadCount <= 0) return null;
final hasSignalId = payloadCount % 4 == 1;
if (!hasSignalId) return null;
final rawSignal = fields.last.split('*').first.trim();
if (rawSignal.isEmpty) return null;
return int.tryParse(rawSignal);
}
/// Egy stream kulcsa: ugyanazon talker, ugyanazon signal
String get streamKey => '$talkerId:${signalId ?? -1}';
// ── 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
@@ -53,13 +89,10 @@ class Gngsv extends TalkerSentence {
// 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;
final prn = int.tryParse(_field(base));
final elev = int.tryParse(_field(base + 1)) ?? 0;
final az = int.tryParse(_field(base + 2)) ?? 0;
final snr = int.tryParse(_field(base + 3).split('*').first) ?? 0;
if (prn != null && prn > 0) {
sats.add(SatelliteInfo(
@@ -67,7 +100,8 @@ class Gngsv extends TalkerSentence {
elevation: elev,
azimuth: az,
snr: snr,
system: system,
constellation: constellation,
signalId: signalId,
));
}
}
@@ -75,18 +109,8 @@ class Gngsv extends TalkerSentence {
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',
};
String _field(int index) {
if (index < 0 || index >= fields.length) return '';
return fields[index].trim();
}
}