import 'dart:math' as math; // ─── SatelliteInfo modell ────────────────────────────────────────────────── /// Egyetlen látható műhold adatai — a skyplot és az SNR diagram alapja. class SatelliteInfo { /// Műhold PRN/SVID azonosítója final int prn; /// Eleváció fokban (0–90°, 90 = zenit) final int elevation; /// Azimut fokban (0–359°, 0/360 = É, 90 = K) final int azimuth; /// Jelerősség dB-Hz-ben (0–99, 0 = nem tracking) final int snr; /// Rendszer neve: GPS, GLONASS, Galileo, BeiDou, Mixed final String system; const SatelliteInfo({ required this.prn, required this.elevation, required this.azimuth, required this.snr, required this.system, }); // ── 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; /// Gyenge de látható jel bool get isWeak => snr > 0 && snr < 30; /// Egyáltalán látható-e (snr > 0) bool get isVisible => snr > 0; // ── Polár koordináta számítás a skyplot CustomPainter-hez ──────── /// Normalizált sugár (0.0 = zenit, 1.0 = horizont) double get polarRadius => 1.0 - (elevation / 90.0); /// Szög radiánban a polár koordinátához /// (azimut → matematikai szög: É=felső, K=jobb) double get polarAngleRad => (azimuth - 90) * math.pi / 180.0; /// Polár koordináta pixel pozíciójának kiszámítása /// [center] a kör középpontja, [radius] a horizont kör sugara ({double dx, double dy}) toOffset( double centerX, double centerY, double radius) { return ( dx: centerX + radius * polarRadius * math.cos(polarAngleRad), dy: centerY + radius * polarRadius * math.sin(polarAngleRad), ); } @override String toString() => 'SatelliteInfo($system PRN$prn elev=$elevation° az=$azimuth° snr=$snr)'; }