Látható és használt műholdak számának meghatározása és megjelenítése
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user