#pragma once #include "SatelliteData.h" #include #include #include #include #include class RinexNavigation : public QObject { Q_OBJECT public: explicit RinexNavigation(QObject *parent = nullptr); void refresh(); [[nodiscard]] bool isLoading() const { return m_loading; } static QVector parseGpsNavigation( const QByteArray &rinex, const QDateTime &whenUtc, QString *error = nullptr); signals: void satellitesUpdated(const QVector &satellites); void satelliteMotionUpdated(const QVector ¤t, const QVector &next, int durationMs); void statusChanged(const QString &status, bool error); void loadingChanged(bool loading); private: struct Ephemeris { QString prn; QDateTime toc; double crs = 0.0; double deltaN = 0.0; double m0 = 0.0; double cuc = 0.0; double eccentricity = 0.0; double cus = 0.0; double sqrtA = 0.0; double toe = 0.0; double cic = 0.0; double omega0 = 0.0; double cis = 0.0; double i0 = 0.0; double crc = 0.0; double omega = 0.0; double omegaDot = 0.0; double idot = 0.0; int gpsWeek = 0; bool healthy = true; }; void requestDay(const QDate &date, int fallbackIndex); void handleDownload(const QByteArray &compressed, const QDate &date, int fallbackIndex); bool loadCache(); QString cachePath() const; void updateCurrentPositions(); void publishCurrentMotion(); void setLoading(bool loading); static QVector parseEphemerides( const QByteArray &rinex, QString *error = nullptr); static QVector selectEphemerides( const QVector &ephemerides, const QDateTime &whenUtc); static QVector propagateEphemerides( const QVector &ephemerides, const QDateTime &whenUtc); static SatellitePosition propagate(const Ephemeris &eph, const QDateTime &whenUtc); QNetworkAccessManager m_network; QTimer m_positionTimer; QVector m_ephemerides; bool m_loading = false; };