source: ntrip/branches/BNC_2.12/src/ephemeris.h @ 8216

Last change on this file since 8216 was 8216, checked in by stuerze, 19 months ago

unhealthy satellites are reported within log file but are remainig in stream and file output

File size: 14.9 KB
Line 
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
14class t_orbCorr;
15class t_clkCorr;
16
17class 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
54class 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 (P1-P2 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
148class 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; // ICD-GLONASS 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 4-year 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 4-year interval [days]
241  double _M_M;                // type of satellite transmitting navigation signal: 0 = GLONASS, 1 = GLONASS-M satellite [-]
242  double _M_N4;               // 4-year 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
247class 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] E1-b 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
340class t_ephSBAS : public t_eph {
341 friend class t_ephEncoder;
342 friend class RTCM3Decoder;
343 public:
344  t_ephSBAS() {
345    _IODN           = 0;
346    _TOW            = 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 _TOW;            // 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
393class 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
Note: See TracBrowser for help on using the repository browser.