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  static bool prnSort(const t_eph* eph1, const t_eph* eph2) {return eph1>prn() < eph2>prn();}


43 


44  protected:


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


46  t_prn _prn;


47  bncTime _TOC;


48  QDateTime _receptDateTime;


49  e_checkState _checkState;


50  t_orbCorr* _orbCorr;


51  t_clkCorr* _clkCorr;


52  };


53 


54 


55  class t_ephGPS : public t_eph {


56  friend class t_ephEncoder;


57  friend class RTCM3Decoder;


58  public:


59  t_ephGPS() {


60  _clock_bias = 0.0;


61  _clock_drift = 0.0;


62  _clock_driftrate = 0.0;


63  _IODE = 0.0;


64  _Crs = 0.0;


65  _Delta_n = 0.0;


66  _M0 = 0.0;


67  _Cuc = 0.0;


68  _e = 0.0;


69  _Cus = 0.0;


70  _sqrt_A = 0.0;


71  _TOEsec = 0.0;


72  _Cic = 0.0;


73  _OMEGA0 = 0.0;


74  _Cis = 0.0;


75  _i0 = 0.0;


76  _Crc = 0.0;


77  _omega = 0.0;


78  _OMEGADOT = 0.0;


79  _IDOT = 0.0;


80  _L2Codes = 0.0;


81  _TOEweek = 0.0;


82  _L2PFlag = 0.0;


83  _ura = 0.0;


84  _health = 0.0;


85  _TGD = 0.0;


86  _IODC = 0.0;


87  _TOT = 0.0;


88  _fitInterval = 0.0;


89  }


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


91  virtual ~t_ephGPS() {}


92 


93  virtual e_type type() const {


94  switch (_prn.system()) {


95  case 'J':


96  return t_eph::QZSS;


97  case 'I':


98  return t_eph::IRNSS;


99  };


100  return t_eph::GPS;


101  }


102  virtual QString toString(double version) const;


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


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


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


106 


107  private:


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


109 


110  double _clock_bias; // [s]


111  double _clock_drift; // [s/s]


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


113 


114  double _IODE; // IODEC in case of IRNSS


115  double _Crs; // [m]


116  double _Delta_n; // [rad/s]


117  double _M0; // [rad]


118 


119  double _Cuc; // [rad]


120  double _e; //


121  double _Cus; // [rad]


122  double _sqrt_A; // [m^0.5]


123 


124  double _TOEsec; // [s]


125  double _Cic; // [rad]


126  double _OMEGA0; // [rad]


127  double _Cis; // [rad]


128 


129  double _i0; // [rad]


130  double _Crc; // [m]


131  double _omega; // [rad]


132  double _OMEGADOT; // [rad/s]


133 


134  double _IDOT; // [rad/s]


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


136  double _TOEweek;


137  double _L2PFlag; // L2 P data flag (not valid for IRNSS and QZSS)


138 


139  mutable double _ura; // SV accuracy


140  double _health; // SV health


141  double _TGD; // [s]


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


143 


144  double _TOT; // Transmission time


145  double _fitInterval; // Fit interval in hours (not valid for IRNSS)


146 


147  };


148 


149  class t_ephGlo : public t_eph {


150  friend class t_ephEncoder;


151  friend class RTCM3Decoder;


152  public:


153  t_ephGlo() {


154  _xv.ReSize(6); _xv = 0.0;


155  _gps_utc = 0.0;


156  _tau = 0.0;


157  _gamma = 0.0;


158  _tki = 0.0;


159  _x_pos = 0.0;


160  _x_velocity = 0.0;


161  _x_acceleration = 0.0;


162  _health = 0.0;


163  _y_pos = 0.0;


164  _y_velocity = 0.0;


165  _y_acceleration = 0.0;


166  _frequency_number = 0.0;


167  _z_pos = 0.0;


168  _z_velocity = 0.0;


169  _z_acceleration = 0.0;


170  _E = 0.0;


171  _almanac_health = 0.0;


172  _almanac_health_availablility_indicator = 0.0;


173  _additional_data_availability = 0.0;


174  _tauC = 0.0;


175  _P1 = 0.0;


176  _P2 = 0.0;


177  _P3 = 0.0;


178  _NA = 0.0;


179  _M_P = 0.0;


180  _M_l3 = 0.0;


181  _M_delta_tau = 0.0;


182  _M_P4 = 0.0;


183  _M_FT = 0.0;


184  _M_NT = 0.0;


185  _M_M = 0.0;


186  _M_N4 = 0.0;


187  _M_tau_GPS = 0.0;


188  _M_l5 = 0.0;


189  }


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


191  virtual ~t_ephGlo() {}


192 


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


194  virtual QString toString(double version) const;


195  virtual unsigned int IOD() const;


196  virtual unsigned int isUnhealthy() const;


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


198 


199  private:


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


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


202 


203  mutable bncTime _tt; // time


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


205 


206  double _gps_utc;


207  double _tau; // [s]


208  double _gamma; // []


209  mutable double _tki; // message frame time


210 


211  double _x_pos; // [km]


212  double _x_velocity; // [km/s]


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


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


215 


216  double _y_pos; // [km]


217  double _y_velocity; // [km/s]


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


219  double _frequency_number; // ICDGLONASS data position


220 


221  double _z_pos; // [km]


222  double _z_velocity; // [km/s]


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


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


225 


226  double _almanac_health; // Cn word


227  double _almanac_health_availablility_indicator;


228 


229  double _additional_data_availability; //


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


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


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


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


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


235 


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


237  double _M_l3; // health flag


238  double _M_delta_tau; // [sec]


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


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


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


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


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


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


245  double _M_l5; // health flag


246  };


247 


248  class t_ephGal : public t_eph {


249  friend class t_ephEncoder;


250  friend class RTCM3Decoder;


251  public:


252  t_ephGal() {


253  _clock_bias = 0.0;


254  _clock_drift = 0.0;


255  _clock_driftrate = 0.0;


256  _IODnav = 0.0;


257  _Crs = 0.0;


258  _Delta_n = 0.0;


259  _M0 = 0.0;


260  _Cuc = 0.0;


261  _e = 0.0;


262  _Cus = 0.0;


263  _sqrt_A = 0.0;


264  _TOEsec = 0.0;


265  _Cic = 0.0;


266  _OMEGA0 = 0.0;


267  _Cis = 0.0;


268  _i0 = 0.0;


269  _Crc = 0.0;


270  _omega = 0.0;


271  _OMEGADOT = 0.0;


272  _IDOT = 0.0;


273  _TOEweek = 0.0;


274  _SISA = 0.0;


275  _E5aHS = 0.0;


276  _E5bHS = 0.0;


277  _E1_bHS = 0.0;


278  _BGD_1_5A = 0.0;


279  _BGD_1_5B = 0.0;


280  _TOT = 0.0;


281  };


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


283  virtual ~t_ephGal() {}


284 


285  virtual QString toString(double version) const;


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


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


288  virtual unsigned int isUnhealthy() const;


289 


290  private:


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


292 


293  double _clock_bias; // [s]


294  double _clock_drift; // [s/s]


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


296 


297  double _IODnav;


298  double _Crs; // [m]


299  double _Delta_n; // [rad/s]


300  double _M0; // [rad]


301 


302  double _Cuc; // [rad]


303  double _e; //


304  double _Cus; // [rad]


305  double _sqrt_A; // [m^0.5]


306 


307  double _TOEsec; // [s]


308  double _Cic; // [rad]


309  double _OMEGA0; // [rad]


310  double _Cis; // [rad]


311 


312  double _i0; // [rad]


313  double _Crc; // [m]


314  double _omega; // [rad]


315  double _OMEGADOT; // [rad/s]


316 


317  double _IDOT; // [rad/s]


318  double _TOEweek;


319  // spare


320 


321  mutable double _SISA; // Signal In Space Accuracy


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


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


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


325  double _BGD_1_5A; // group delay [s]


326  double _BGD_1_5B; // group delay [s]


327 


328  double _TOT; // [s]


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


330  bool _inav;


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


332  bool _fnav;


333  /** EE Data is not valid */


334  bool _e1DataInValid;


335  /** E5A Data is not valid */


336  bool _e5aDataInValid;


337  /** E5B Data is not valid */


338  bool _e5bDataInValid;


339  };


340 


341  class t_ephSBAS : public t_eph {


342  friend class t_ephEncoder;


343  friend class RTCM3Decoder;


344  public:


345  t_ephSBAS() {


346  _IODN = 0;


347  _TOT = 0.0;


348  _agf0 = 0.0;


349  _agf1 = 0.0;


350  _x_pos = 0.0;


351  _x_velocity = 0.0;


352  _x_acceleration = 0.0;


353  _y_pos = 0.0;


354  _y_velocity = 0.0;


355  _y_acceleration = 0.0;


356  _z_pos = 0.0;


357  _z_velocity = 0.0;


358  _z_acceleration = 0.0;


359  _ura = 0.0;


360  _health = 0.0;


361  }


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


363  virtual ~t_ephSBAS() {}


364 


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


366  virtual unsigned int IOD() const;


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


368  virtual QString toString(double version) const;


369 


370  private:


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


372 


373  int _IODN;


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


375  double _agf0; // [s] clock correction


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


377 


378  double _x_pos; // [m]


379  double _x_velocity; // [m/s]


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


381 


382  double _y_pos; // [m]


383  double _y_velocity; // [m/s]


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


385 


386  double _z_pos; // [m]


387  double _z_velocity; // [m/s]


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


389 


390  mutable double _ura;


391  double _health;


392  };


393 


394  class t_ephBDS : public t_eph {


395  friend class t_ephEncoder;


396  friend class RTCM3Decoder;


397  public:


398  t_ephBDS() {


399  _TOT = 0.0;


400  _AODE = 0;


401  _AODC = 0;


402  _URAI = 0;


403  _URA = 0.0;


404  _clock_bias = 0.0;


405  _clock_drift = 0.0;


406  _clock_driftrate = 0.0;


407  _Crs = 0.0;


408  _Delta_n = 0.0;


409  _M0 = 0.0;


410  _Cuc = 0.0;


411  _e = 0.0;


412  _Cus = 0.0;


413  _sqrt_A = 0.0;


414  _Cic = 0.0;


415  _OMEGA0 = 0.0;


416  _Cis = 0.0;


417  _i0 = 0.0;


418  _Crc = 0.0;


419  _omega = 0.0;


420  _OMEGADOT = 0.0;


421  _IDOT = 0.0;


422  _TGD1 = 0.0;


423  _TGD2 = 0.0;


424  _SatH1 = 0.0;


425  _TOW = 0.0;


426  _TOEsec = 0.0;


427  _TOEweek =1.0;


428  }


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


430  virtual ~t_ephBDS() {}


431 


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


433  virtual unsigned int IOD() const;


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


435  virtual QString toString(double version) const;


436 


437  private:


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


439 


440  double _TOT;


441  bncTime _TOE;


442  int _AODE;


443  int _AODC;


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


445  mutable double _URA; // user range accuracy


446  double _clock_bias; // [s]


447  double _clock_drift; // [s/s]


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


449  double _Crs; // [m]


450  double _Delta_n; // [rad/s]


451  double _M0; // [rad]


452  double _Cuc; // [rad]


453  double _e; //


454  double _Cus; // [rad]


455  double _sqrt_A; // [m^0.5]


456  double _Cic; // [rad]


457  double _OMEGA0; // [rad]


458  double _Cis; // [rad]


459  double _i0; // [rad]


460  double _Crc; // [m]


461  double _omega; // [rad]


462  double _OMEGADOT; // [rad/s]


463  double _IDOT; // [rad/s]


464  double _TGD1; // [s]


465  double _TGD2; // [s]


466  int _SatH1; //


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


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


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


470  };


471 


472  #endif

