1  #ifndef EPHEMERIS_H


2  #define EPHEMERIS_H


3 


4  #include <newmat.h>


5  #include <QtCore>


6  #include <stdio.h>


7  #include <string>


8  #include "bnctime.h"


9  #include "bncconst.h"


10  #include "t_prn.h"


11  #include "gnss.h"


12 


13 


14  class t_orbCorr;


15  class t_clkCorr;


16 


17  class t_eph {


18  public:


19  enum e_type {unknown, GPS, QZSS, GLONASS, Galileo, SBAS, BDS, IRNSS};


20  enum e_checkState {unchecked, ok, bad, outdated, unhealthy};


21 


22  t_eph();


23  virtual ~t_eph();


24 


25  virtual e_type type() const = 0;


26  virtual QString toString(double version) const = 0;


27  virtual unsigned int IOD() const = 0;


28  virtual unsigned int isUnhealthy() const = 0;


29  virtual int slotNum() const {return 0;}


30  bncTime TOC() const {return _TOC;}


31  bool isNewerThan(const t_eph* eph) const {return earlierTime(eph, this);}


32  e_checkState checkState() const {return _checkState;}


33  void setCheckState(e_checkState checkState) {_checkState = checkState;}


34  t_prn prn() const {return _prn;}


35  t_irc getCrd(const bncTime& tt, ColumnVector& xc, ColumnVector& vv, bool useCorr) const;


36  void setOrbCorr(const t_orbCorr* orbCorr);


37  void setClkCorr(const t_clkCorr* clkCorr);


38  const QDateTime& receptDateTime() const {return _receptDateTime;}


39  static QString rinexDateStr(const bncTime& tt, const t_prn& prn, double version);


40  static QString rinexDateStr(const bncTime& tt, const QString& prnStr, double version);


41  static bool earlierTime(const t_eph* eph1, const t_eph* eph2) {return eph1>_TOC < eph2>_TOC;}


42 


43  protected:


44  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const = 0;


45  t_prn _prn;


46  bncTime _TOC;


47  QDateTime _receptDateTime;


48  e_checkState _checkState;


49  t_orbCorr* _orbCorr;


50  t_clkCorr* _clkCorr;


51  };


52 


53 


54  class t_ephGPS : public t_eph {


55  friend class t_ephEncoder;


56  friend class RTCM3Decoder;


57  public:


58  t_ephGPS() {


59  _clock_bias = 0.0;


60  _clock_drift = 0.0;


61  _clock_driftrate = 0.0;


62  _IODE = 0.0;


63  _Crs = 0.0;


64  _Delta_n = 0.0;


65  _M0 = 0.0;


66  _Cuc = 0.0;


67  _e = 0.0;


68  _Cus = 0.0;


69  _sqrt_A = 0.0;


70  _TOEsec = 0.0;


71  _Cic = 0.0;


72  _OMEGA0 = 0.0;


73  _Cis = 0.0;


74  _i0 = 0.0;


75  _Crc = 0.0;


76  _omega = 0.0;


77  _OMEGADOT = 0.0;


78  _IDOT = 0.0;


79  _L2Codes = 0.0;


80  _TOEweek = 0.0;


81  _L2PFlag = 0.0;


82  _ura = 0.0;


83  _health = 0.0;


84  _TGD = 0.0;


85  _IODC = 0.0;


86  _TOT = 0.0;


87  _fitInterval = 0.0;


88  }


89  t_ephGPS(float rnxVersion, const QStringList& lines);


90  virtual ~t_ephGPS() {}


91 


92  virtual e_type type() const {


93  switch (_prn.system()) {


94  case 'J':


95  return t_eph::QZSS;


96  case 'I':


97  return t_eph::IRNSS;


98  };


99  return t_eph::GPS;


100  }


101  virtual QString toString(double version) const;


102  virtual unsigned int IOD() const { return static_cast<unsigned int>(_IODE); }


103  virtual unsigned int isUnhealthy() const { return static_cast<unsigned int>(_health); }


104  double TGD() const {return _TGD;} // Timing Group Delay (P1P2 DCB)


105 


106  private:


107  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;


108 


109  double _clock_bias; // [s]


110  double _clock_drift; // [s/s]


111  double _clock_driftrate; // [s/s^2]


112 


113  double _IODE; // IODEC in case of IRNSS


114  double _Crs; // [m]


115  double _Delta_n; // [rad/s]


116  double _M0; // [rad]


117 


118  double _Cuc; // [rad]


119  double _e; //


120  double _Cus; // [rad]


121  double _sqrt_A; // [m^0.5]


122 


123  double _TOEsec; // [s]


124  double _Cic; // [rad]


125  double _OMEGA0; // [rad]


126  double _Cis; // [rad]


127 


128  double _i0; // [rad]


129  double _Crc; // [m]


130  double _omega; // [rad]


131  double _OMEGADOT; // [rad/s]


132 


133  double _IDOT; // [rad/s]


134  double _L2Codes; // Codes on L2 channel (not valid for IRNSS)


135  double _TOEweek;


136  double _L2PFlag; // L2 P data flag (not valid for IRNSS)


137 


138  mutable double _ura; // SV accuracy


139  double _health; // SV health


140  double _TGD; // [s]


141  double _IODC; // (not valid for IRNSS)


142 


143  double _TOT; // Transmisstion time


144  double _fitInterval; // Fit interval (not valid for IRNSS)


145 


146  };


147 


148  class t_ephGlo : public t_eph {


149  friend class t_ephEncoder;


150  friend class RTCM3Decoder;


151  public:


152  t_ephGlo() {


153  _xv.ReSize(6);


154  _gps_utc = 0.0;


155  _tau = 0.0;


156  _gamma = 0.0;


157  _tki = 0.0;


158  _x_pos = 0.0;


159  _x_velocity = 0.0;


160  _x_acceleration = 0.0;


161  _health = 0.0;


162  _y_pos = 0.0;


163  _y_velocity = 0.0;


164  _y_acceleration = 0.0;


165  _frequency_number = 0.0;


166  _z_pos = 0.0;


167  _z_velocity = 0.0;


168  _z_acceleration = 0.0;


169  _E = 0.0;


170  _almanac_health = 0.0;


171  _almanac_health_availablility_indicator = 0.0;


172  _additional_data_availability = 0.0;


173  _tauC = 0.0;


174  _P1 = 0.0;


175  _P2 = 0.0;


176  _P3 = 0.0;


177  _NA = 0.0;


178  _M_P = 0.0;


179  _M_l3 = 0.0;


180  _M_delta_tau = 0.0;


181  _M_P4 = 0.0;


182  _M_FT = 0.0;


183  _M_NT = 0.0;


184  _M_M = 0.0;


185  _M_N4 = 0.0;


186  _M_tau_GPS = 0.0;


187  _M_l5 = 0.0;


188  }


189  t_ephGlo(float rnxVersion, const QStringList& lines);


190  virtual ~t_ephGlo() {}


191 


192  virtual e_type type() const {return t_eph::GLONASS;}


193  virtual QString toString(double version) const;


194  virtual unsigned int IOD() const;


195  virtual unsigned int isUnhealthy() const;


196  virtual int slotNum() const {return int(_frequency_number);}


197 


198  private:


199  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;


200  static ColumnVector glo_deriv(double /* tt */, const ColumnVector& xv, double* acc);


201 


202  mutable bncTime _tt; // time


203  mutable ColumnVector _xv; // status vector (position, velocity) at time _tt


204 


205  double _gps_utc;


206  double _tau; // [s]


207  double _gamma; // []


208  mutable double _tki; // message frame time


209 


210  double _x_pos; // [km]


211  double _x_velocity; // [km/s]


212  double _x_acceleration; // [km/s^2]


213  double _health; // 0 = O.K. MSB of Bn word


214 


215  double _y_pos; // [km]


216  double _y_velocity; // [km/s]


217  double _y_acceleration; // [km/s^2]


218  double _frequency_number; // ICDGLONASS data position


219 


220  double _z_pos; // [km]


221  double _z_velocity; // [km/s]


222  double _z_acceleration; // [km/s^2]


223  double _E; // Age of Information [days]


224 


225  double _almanac_health; // Cn word


226  double _almanac_health_availablility_indicator;


227 


228  double _additional_data_availability; //


229  double _tauC; // GLONASS time scale correction to UTC(SU) time [sec]


230  double _P1; // flag of the immediate data updating []


231  double _P2; // flag of oddness or evenness of the value of tb for intervals 30 or 60 minutes []


232  double _P3; // flag indicating a number of satellites for which almanac is transmitted within given frame []


233  double _NA; // calendar day number within the 4year period [days]


234 


235  double _M_P; // control segment parameter that indicates the satellite operation mode with respect of time parameters


236  double _M_l3; // health flag


237  double _M_delta_tau; // [sec]


238  double _M_P4; // flag to show that ephemeris parameters are present []


239  double _M_FT; // indicator for predicted satellite user range accuracy []


240  double _M_NT; // current date, calendar number of day within 4year interval [days]


241  double _M_M; // type of satellite transmitting navigation signal: 0 = GLONASS, 1 = GLONASSM satellite []


242  double _M_N4; // 4year interval number starting from 1996


243  double _M_tau_GPS; // correction to GPS time relative to GLONASS time [days]


244  double _M_l5; // health flag


245  };


246 


247  class t_ephGal : public t_eph {


248  friend class t_ephEncoder;


249  friend class RTCM3Decoder;


250  public:


251  t_ephGal() {


252  _clock_bias = 0.0;


253  _clock_drift = 0.0;


254  _clock_driftrate = 0.0;


255  _IODnav = 0.0;


256  _Crs = 0.0;


257  _Delta_n = 0.0;


258  _M0 = 0.0;


259  _Cuc = 0.0;


260  _e = 0.0;


261  _Cus = 0.0;


262  _sqrt_A = 0.0;


263  _TOEsec = 0.0;


264  _Cic = 0.0;


265  _OMEGA0 = 0.0;


266  _Cis = 0.0;


267  _i0 = 0.0;


268  _Crc = 0.0;


269  _omega = 0.0;


270  _OMEGADOT = 0.0;


271  _IDOT = 0.0;


272  _TOEweek = 0.0;


273  _SISA = 0.0;


274  _E5aHS = 0.0;


275  _E5bHS = 0.0;


276  _E1_bHS = 0.0;


277  _BGD_1_5A = 0.0;


278  _BGD_1_5B = 0.0;


279  _TOT = 0.0;


280  };


281  t_ephGal(float rnxVersion, const QStringList& lines);


282  virtual ~t_ephGal() {}


283 


284  virtual QString toString(double version) const;


285  virtual e_type type() const {return t_eph::Galileo;}


286  virtual unsigned int IOD() const { return static_cast<unsigned long>(_IODnav); }


287  virtual unsigned int isUnhealthy() const;


288 


289  private:


290  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;


291 


292  double _clock_bias; // [s]


293  double _clock_drift; // [s/s]


294  double _clock_driftrate; // [s/s^2]


295 


296  double _IODnav;


297  double _Crs; // [m]


298  double _Delta_n; // [rad/s]


299  double _M0; // [rad]


300 


301  double _Cuc; // [rad]


302  double _e; //


303  double _Cus; // [rad]


304  double _sqrt_A; // [m^0.5]


305 


306  double _TOEsec; // [s]


307  double _Cic; // [rad]


308  double _OMEGA0; // [rad]


309  double _Cis; // [rad]


310 


311  double _i0; // [rad]


312  double _Crc; // [m]


313  double _omega; // [rad]


314  double _OMEGADOT; // [rad/s]


315 


316  double _IDOT; // [rad/s]


317  double _TOEweek;


318  // spare


319 


320  mutable double _SISA; // Signal In Space Accuracy


321  double _E5aHS; // [0..3] E5a Health Status


322  double _E5bHS; // [0..3] E5b Health Status


323  double _E1_bHS; // [0..3] E1b Health Status


324  double _BGD_1_5A; // group delay [s]


325  double _BGD_1_5B; // group delay [s]


326 


327  double _TOT; // [s]


328  /** Data comes from I/NAV when <code>true</code> */


329  bool _inav;


330  /** Data comes from F/NAV when <code>true</code> */


331  bool _fnav;


332  /** EE Data is not valid */


333  bool _e1DataInValid;


334  /** E5A Data is not valid */


335  bool _e5aDataInValid;


336  /** E5B Data is not valid */


337  bool _e5bDataInValid;


338  };


339 


340  class t_ephSBAS : public t_eph {


341  friend class t_ephEncoder;


342  friend class RTCM3Decoder;


343  public:


344  t_ephSBAS() {


345  _IODN = 0;


346  _TOT = 0.0;


347  _agf0 = 0.0;


348  _agf1 = 0.0;


349  _x_pos = 0.0;


350  _x_velocity = 0.0;


351  _x_acceleration = 0.0;


352  _y_pos = 0.0;


353  _y_velocity = 0.0;


354  _y_acceleration = 0.0;


355  _z_pos = 0.0;


356  _z_velocity = 0.0;


357  _z_acceleration = 0.0;


358  _ura = 0.0;


359  _health = 0.0;


360  }


361  t_ephSBAS(float rnxVersion, const QStringList& lines);


362  virtual ~t_ephSBAS() {}


363 


364  virtual e_type type() const {return t_eph::SBAS;}


365  virtual unsigned int IOD() const;


366  virtual unsigned int isUnhealthy() const { return static_cast<unsigned int>(_health); }


367  virtual QString toString(double version) const;


368 


369  private:


370  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;


371 


372  int _IODN;


373  double _TOT; // not used (set to 0.9999e9)


374  double _agf0; // [s] clock correction


375  double _agf1; // [s/s] clock correction drift


376 


377  double _x_pos; // [m]


378  double _x_velocity; // [m/s]


379  double _x_acceleration; // [m/s^2]


380 


381  double _y_pos; // [m]


382  double _y_velocity; // [m/s]


383  double _y_acceleration; // [m/s^2]


384 


385  double _z_pos; // [m]


386  double _z_velocity; // [m/s]


387  double _z_acceleration; // [m/s^2]


388 


389  mutable double _ura;


390  double _health;


391  };


392 


393  class t_ephBDS : public t_eph {


394  friend class t_ephEncoder;


395  friend class RTCM3Decoder;


396  public:


397  t_ephBDS() : _TOEweek(1.0) {


398  _TOT = 0.0;


399  _AODE = 0;


400  _AODC = 0;


401  _URAI = 0;


402  _URA = 0.0;


403  _clock_bias = 0.0;


404  _clock_drift = 0.0;


405  _clock_driftrate = 0.0;


406  _Crs = 0.0;


407  _Delta_n = 0.0;


408  _M0 = 0.0;


409  _Cuc = 0.0;


410  _e = 0.0;


411  _Cus = 0.0;


412  _sqrt_A = 0.0;


413  _Cic = 0.0;


414  _OMEGA0 = 0.0;


415  _Cis = 0.0;


416  _i0 = 0.0;


417  _Crc = 0.0;


418  _omega = 0.0;


419  _OMEGADOT = 0.0;


420  _IDOT = 0.0;


421  _TGD1 = 0.0;


422  _TGD2 = 0.0;


423  _SatH1 = 0.0;


424  _TOW = 0.0;


425  _TOEsec = 0.0;


426  _TOEweek = 0.0;


427  }


428  t_ephBDS(float rnxVersion, const QStringList& lines);


429  virtual ~t_ephBDS() {}


430 


431  virtual e_type type() const {return t_eph::BDS;}


432  virtual unsigned int IOD() const;


433  virtual unsigned int isUnhealthy() const { return static_cast<unsigned int>(_SatH1); }


434  virtual QString toString(double version) const;


435 


436  private:


437  virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;


438 


439  double _TOT;


440  bncTime _TOE;


441  int _AODE;


442  int _AODC;


443  int _URAI; // [0..15] index from RTCM stream


444  mutable double _URA; // user range accuracy


445  double _clock_bias; // [s]


446  double _clock_drift; // [s/s]


447  double _clock_driftrate; // [s/s^2]


448  double _Crs; // [m]


449  double _Delta_n; // [rad/s]


450  double _M0; // [rad]


451  double _Cuc; // [rad]


452  double _e; //


453  double _Cus; // [rad]


454  double _sqrt_A; // [m^0.5]


455  double _Cic; // [rad]


456  double _OMEGA0; // [rad]


457  double _Cis; // [rad]


458  double _i0; // [rad]


459  double _Crc; // [m]


460  double _omega; // [rad]


461  double _OMEGADOT; // [rad/s]


462  double _IDOT; // [rad/s]


463  double _TGD1; // [s]


464  double _TGD2; // [s]


465  int _SatH1; //


466  double _TOW; // [s] of BDT week


467  double _TOEsec; // [s] of BDT week


468  double _TOEweek; // BDT week will be set only in case of RINEX file input


469  };


470 


471  #endif

