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
+172 -13
View File
@@ -1,5 +1,17 @@
import 'dart:math' as math;
enum GnssConstellation {
gps,
glonass,
galileo,
beidou,
qzss,
sbas,
navic,
mixed,
unknown,
}
// ─── SatelliteInfo modell ──────────────────────────────────────────────────
/// Egyetlen látható műhold adatai — a skyplot és az SNR diagram alapja.
@@ -16,24 +28,49 @@ class SatelliteInfo {
/// Jelerősség dB-Hz-ben (099, 0 = nem tracking)
final int snr;
/// Rendszer neve: GPS, GLONASS, Galileo, BeiDou, Mixed
final String system;
/// A műhold konstellációja
final GnssConstellation constellation;
const SatelliteInfo({
required this.prn,
required this.elevation,
required this.azimuth,
required this.snr,
required this.system,
});
// Opcionális: NMEA signal ID (pl. L1/L2/E1/...)
final int? signalId;
const SatelliteInfo(
{required this.prn,
required this.elevation,
required this.azimuth,
required this.snr,
required this.constellation,
this.signalId});
String get system => 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',
};
/// Egyedi kulcs ugyanazon konstellacio azonos muholdjahoz
String get satelliteKey => '${constellation.name}:$prn';
/// Egyedi kulcs ugyanazon signal streamhez
String get signalKey => '${constellation.name}:$prn:${signalId ?? -1}';
/// Human-readable sav/frekvencia becsles signalId alapjan
String get bandLabel => _bandLabel(constellation, signalId);
// ── Minősítési segédek ────────────────────────────────────────────
/// Erős jel — fixben megbízhatóan részt vesz
bool get isStrong => snr >= 40;
/// Használható jel — fixben részt vesz
bool get isUsed => snr >= 30;
/// Jelszint alapjan varhatoan hasznalhato jel.
/// A valodi "used in fix" allapotot a GSA mondatok alapjan allapitsuk meg.
bool get hasUsableSignal => snr >= 30;
/// Gyenge de látható jel
bool get isWeak => snr > 0 && snr < 30;
@@ -61,6 +98,128 @@ class SatelliteInfo {
}
@override
String toString() =>
'SatelliteInfo($system PRN$prn elev=$elevation° az=$azimuth° snr=$snr)';
String toString() {
final signal = signalId == null ? '-' : signalId.toString();
return 'SatelliteInfo($system PRN$prn elev=$elevation az=$azimuth snr=$snr signal=$signal band=$bandLabel)';
}
static GnssConstellation constellationFromTalker(String talkerId) {
switch (talkerId) {
case 'GP':
return GnssConstellation.gps;
case 'GL':
return GnssConstellation.glonass;
case 'GA':
return GnssConstellation.galileo;
case 'GB':
case 'BD':
return GnssConstellation.beidou;
case 'GQ':
case 'QZ':
return GnssConstellation.qzss;
case 'GI':
case 'IN':
return GnssConstellation.navic;
case 'GN':
return GnssConstellation.mixed;
default:
return GnssConstellation.unknown;
}
}
static String _bandLabel(GnssConstellation constellation, int? signalId) {
if (signalId == null) return 'Unknown';
switch (constellation) {
case GnssConstellation.gps:
switch (signalId) {
case 1:
return 'L1 C/A';
case 5:
return 'L2C';
case 6:
return 'L5';
default:
return 'GPS sig $signalId';
}
case GnssConstellation.glonass:
switch (signalId) {
case 1:
return 'G1';
case 3:
return 'G2';
default:
return 'GLO sig $signalId';
}
case GnssConstellation.galileo:
switch (signalId) {
case 1:
return 'E1';
case 6:
return 'E5a';
case 7:
return 'E5b';
case 8:
return 'E5 AltBOC';
default:
return 'GAL sig $signalId';
}
case GnssConstellation.beidou:
switch (signalId) {
case 1:
return 'B1I';
case 3:
return 'B2I';
case 5:
return 'B1C';
case 7:
return 'B2a';
default:
return 'BDS sig $signalId';
}
case GnssConstellation.qzss:
switch (signalId) {
case 1:
return 'L1 C/A';
case 4:
return 'L1S';
case 5:
return 'L2C';
case 6:
return 'L5';
default:
return 'QZSS sig $signalId';
}
case GnssConstellation.sbas:
switch (signalId) {
case 1:
return 'L1';
case 6:
return 'L5';
default:
return 'SBAS sig $signalId';
}
case GnssConstellation.navic:
switch (signalId) {
case 1:
return 'L5';
case 2:
return 'S';
default:
return 'NavIC sig $signalId';
}
case GnssConstellation.mixed:
return 'Mixed sig $signalId';
case GnssConstellation.unknown:
return 'Unknown';
}
}
}