source: ntrip/trunk/BNC/src/ephemeris.h@ 9866

Last change on this file since 9866 was 9789, checked in by stuerze, 21 months ago

some more changes to consider RINEX Version 4 nav file (EPH key only)

File size: 18.2 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 enum e_navType {undefined, LNAV, FDMA, FNAV, INAF, D1, D2, SBASL1, CNAV, CNV1, CNV2, CNV3};
22
23 t_eph();
24 virtual ~t_eph();
25
26 virtual e_type type() const = 0;
27 virtual QString toString(double version) const = 0;
28 virtual unsigned int IOD() const = 0;
29 virtual unsigned int isUnhealthy() const = 0;
30 virtual int slotNum() const {return 0;}
31 bncTime TOC() const {return _TOC;}
32 bool isNewerThan(const t_eph* eph) const {return earlierTime(eph, this);}
33 void setCheckState(e_checkState checkState) {_checkState = checkState;}
34 e_checkState checkState() const {return _checkState;}
35 QString checkStateToString() {
36 switch (_checkState) {
37 case unchecked: return "unchecked";
38 case ok: return "ok";
39 case bad: return "bad";
40 case outdated: return "outdated";
41 case unhealthy: return "unhealthy";
42 default: return "unknown";
43 }
44 }
45 e_navType navType() const {return _navType;}
46 t_irc setNavType(QString navTypeStr);
47
48 t_prn prn() const {return _prn;}
49 t_irc getCrd(const bncTime& tt, ColumnVector& xc, ColumnVector& vv, bool useCorr) const;
50 void setOrbCorr(const t_orbCorr* orbCorr);
51 void setClkCorr(const t_clkCorr* clkCorr);
52 const QDateTime& receptDateTime() const {return _receptDateTime;}
53 const QString receptStaID() const {return _receptStaID;}
54 static QString rinexDateStr(const bncTime& tt, const t_prn& prn, double version);
55 static QString rinexDateStr(const bncTime& tt, const QString& prnStr, double version);
56 static QString navTypeString(e_navType navType, const t_prn& prn, double version);
57 static bool earlierTime(const t_eph* eph1, const t_eph* eph2) {return eph1->_TOC < eph2->_TOC;}
58 static bool prnSort(const t_eph* eph1, const t_eph* eph2) {return eph1->prn() < eph2->prn();}
59
60 protected:
61 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const = 0;
62 t_prn _prn;
63 bncTime _TOC;
64 QDateTime _receptDateTime;
65 QString _receptStaID;
66 e_checkState _checkState;
67 e_navType _navType; // defined in RINEX 4
68 t_orbCorr* _orbCorr;
69 t_clkCorr* _clkCorr;
70};
71
72class t_ephGPS : public t_eph {
73 friend class t_ephEncoder;
74 friend class RTCM3Decoder;
75 public:
76 t_ephGPS() {
77 _clock_bias = 0.0;
78 _clock_drift = 0.0;
79 _clock_driftrate = 0.0;
80 _IODE = 0.0;
81 _Crs = 0.0;
82 _Delta_n = 0.0;
83 _M0 = 0.0;
84 _Cuc = 0.0;
85 _e = 0.0;
86 _Cus = 0.0;
87 _sqrt_A = 0.0;
88 _TOEsec = 0.0;
89 _Cic = 0.0;
90 _OMEGA0 = 0.0;
91 _Cis = 0.0;
92 _i0 = 0.0;
93 _Crc = 0.0;
94 _omega = 0.0;
95 _OMEGADOT = 0.0;
96 _IDOT = 0.0;
97 _L2Codes = 0.0;
98 _TOEweek = 0.0;
99 _L2PFlag = 0.0;
100 _ura = 0.0;
101 _health = 0.0;
102 _TGD = 0.0;
103 _IODC = 0.0;
104 _TOT = 0.0;
105 _fitInterval = 0.0;
106 _ADOT = 0.0;
107 _top = 0.0;
108 _Delta_n_dot = 0.0;
109 _URAI_NED0 = 0.0;
110 _URAI_NED1 = 0.0;
111 _URAI_NED2 = 0.0;
112 _URAI_ED = 0.0;
113 _ISC_L1CA = 0.0;
114 _ISC_L2C = 0.0;
115 _ISC_L5I5 = 0.0;
116 _ISC_L5Q5 = 0.0;
117 _ISC_L1Cd = 0.0;
118 _ISC_L1Cp = 0.0;
119 _wnop = 0.0;
120 _receptStaID = "";
121 }
122 t_ephGPS(double rnxVersion, const QStringList& lines);
123 virtual ~t_ephGPS() {}
124
125 virtual e_type type() const {
126 switch (_prn.system()) {
127 case 'J':
128 return t_eph::QZSS;
129 case 'I':
130 return t_eph::IRNSS;
131 };
132 return t_eph::GPS;
133 }
134 virtual QString toString(double version) const;
135 virtual unsigned int IOD() const { return static_cast<unsigned int>(_IODE); }
136 virtual unsigned int isUnhealthy() const { return static_cast<unsigned int>(_health); }
137 double TGD() const {return _TGD;} // Timing Group Delay (P1-P2 DCB)
138
139 private:
140 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
141
142 double _clock_bias; // [s]
143 double _clock_drift; // [s/s]
144 double _clock_driftrate; // [s/s^2]
145
146 double _IODE; // IODEC in case of IRNSS
147 double _Crs; // [m]
148 double _Delta_n; // [rad/s]
149 double _M0; // [rad]
150
151 double _Cuc; // [rad]
152 double _e; // []
153 double _Cus; // [rad]
154 double _sqrt_A; // [m^0.5]
155
156 double _TOEsec; // [s of GPS week]
157 double _Cic; // [rad]
158 double _OMEGA0; // [rad]
159 double _Cis; // [rad]
160
161 double _i0; // [rad]
162 double _Crc; // [m]
163 double _omega; // [rad]
164 double _OMEGADOT; // [rad/s]
165
166 double _IDOT; // [rad/s]
167 double _L2Codes; // Codes on L2 channel (not valid for IRNSS)
168 double _TOEweek; // GPS week # to go with TOE, cont. number, not mode 1024
169 double _L2PFlag; // L2 P data flag (not valid for IRNSS and QZSS)
170
171 mutable double _ura; // SV accuracy [m]
172 double _health; // SV health
173 double _TGD; // [s]
174 double _IODC; // (not valid for IRNSS)
175
176 double _TOT; // Transmission time
177 double _fitInterval; // Fit interval in hours (not valid for IRNSS)
178
179 double _ADOT; // [m/s]
180 double _top; // [s]
181 double _Delta_n_dot; // [rad/s^2]
182
183 double _URAI_NED0; // []
184 double _URAI_NED1; // []
185 double _URAI_NED2; // []
186 double _URAI_ED; // []
187
188 double _ISC_L1CA; // [s]
189 double _ISC_L2C; // [s]
190 double _ISC_L5I5; // [s]
191 double _ISC_L5Q5; // [s]
192 double _ISC_L1Cd; // [s]
193 double _ISC_L1Cp; // [s]
194
195 double _wnop; // GPS continuous week number with the ambiguity resolved
196};
197
198class t_ephGlo : public t_eph {
199 friend class t_ephEncoder;
200 friend class RTCM3Decoder;
201 public:
202 t_ephGlo() {
203 _xv.ReSize(6); _xv = 0.0;
204 _gps_utc = 0.0;
205 _tau = 0.0;
206 _gamma = 0.0;
207 _tki = 0.0;
208 _x_pos = 0.0;
209 _x_velocity = 0.0;
210 _x_acceleration = 0.0;
211 _health = 0.0;
212 _y_pos = 0.0;
213 _y_velocity = 0.0;
214 _y_acceleration = 0.0;
215 _frequency_number = 0.0;
216 _z_pos = 0.0;
217 _z_velocity = 0.0;
218 _z_acceleration = 0.0;
219 _E = 0.0;
220 _almanac_health = 0.0;
221 _almanac_health_availablility_indicator = 0.0;
222 _additional_data_availability = 0.0;
223 _tauC = 0.0;
224 _P1 = 0.0;
225 _P2 = 0.0;
226 _P3 = 0.0;
227 _NA = 0.0;
228 _M_P = 0.0;
229 _M_l3 = 0.0;
230 _M_delta_tau = 0.0;
231 _M_P4 = 0.0;
232 _M_FT = 0.0;
233 _M_NT = 0.0;
234 _M_M = 0.0;
235 _M_N4 = 0.0;
236 _M_tau_GPS = 0.0;
237 _M_l5 = 0.0;
238 _receptStaID = "";
239 _flags_unknown = true;
240 }
241 t_ephGlo(double rnxVersion, const QStringList& lines);
242 virtual ~t_ephGlo() {}
243
244 virtual e_type type() const {return t_eph::GLONASS;}
245 virtual QString toString(double version) const;
246 virtual unsigned int IOD() const;
247 virtual unsigned int isUnhealthy() const;
248 virtual int slotNum() const {return int(_frequency_number);}
249
250 private:
251 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
252 static ColumnVector glo_deriv(double /* tt */, const ColumnVector& xv, double* acc);
253
254 mutable bncTime _tt; // time
255 mutable ColumnVector _xv; // status vector (position, velocity) at time _tt
256
257 double _gps_utc;
258 double _tau; // [s]
259 double _gamma; // [-]
260 mutable double _tki; // message frame time
261
262 double _x_pos; // [km]
263 double _x_velocity; // [km/s]
264 double _x_acceleration; // [km/s^2]
265 double _health; // 0 = O.K. MSB of Bn word
266
267 double _y_pos; // [km]
268 double _y_velocity; // [km/s]
269 double _y_acceleration; // [km/s^2]
270 double _frequency_number; // ICD-GLONASS data position
271
272 double _z_pos; // [km]
273 double _z_velocity; // [km/s]
274 double _z_acceleration; // [km/s^2]
275 double _E; // Age of Information [days]
276
277 double _almanac_health; // Cn word
278 double _almanac_health_availablility_indicator;
279
280 double _additional_data_availability; //
281 double _tauC; // GLONASS time scale correction to UTC(SU) time [sec]
282 double _P1; // flag of the immediate data updating [-]
283 double _P2; // flag of oddness or evenness of the value of tb for intervals 30 or 60 minutes [-]
284 double _P3; // flag indicating a number of satellites for which almanac is transmitted within given frame [-]
285 double _NA; // calendar day number within the 4-year period [days]
286
287 double _M_P; // control segment parameter that indicates the satellite operation mode with respect of time parameters
288 double _M_l3; // health flag
289 double _M_delta_tau; // [sec]
290 double _M_P4; // flag to show that ephemeris parameters are present [-]
291 double _M_FT; // Indicator for predicted satellite User Range Accuracy (URAI) [-]
292 double _M_NT; // current date, calendar number of day within 4-year interval [days]
293 double _M_M; // type of satellite transmitting navigation signal: 0 = GLONASS, 1 = GLONASS-M satellite [-]
294 double _M_N4; // 4-year interval number starting from 1996
295 double _M_tau_GPS; // correction to GPS time relative to GLONASS time [days]
296 double _M_l5; // health flag
297 bool _flags_unknown; // status and health flags are unknown (rnx version < 3.05) or known (rnx version >= 3.05)
298};
299
300class t_ephGal : public t_eph {
301 friend class t_ephEncoder;
302 friend class RTCM3Decoder;
303 public:
304 t_ephGal() {
305 _clock_bias = 0.0;
306 _clock_drift = 0.0;
307 _clock_driftrate = 0.0;
308 _IODnav = 0.0;
309 _Crs = 0.0;
310 _Delta_n = 0.0;
311 _M0 = 0.0;
312 _Cuc = 0.0;
313 _e = 0.0;
314 _Cus = 0.0;
315 _sqrt_A = 0.0;
316 _TOEsec = 0.0;
317 _Cic = 0.0;
318 _OMEGA0 = 0.0;
319 _Cis = 0.0;
320 _i0 = 0.0;
321 _Crc = 0.0;
322 _omega = 0.0;
323 _OMEGADOT = 0.0;
324 _IDOT = 0.0;
325 _TOEweek = 0.0;
326 _SISA = 0.0;
327 _E5aHS = 0.0;
328 _E5bHS = 0.0;
329 _E1_bHS = 0.0;
330 _BGD_1_5A = 0.0;
331 _BGD_1_5B = 0.0;
332 _TOT = 0.0;
333 _receptStaID = "";
334 };
335 t_ephGal(double rnxVersion, const QStringList& lines);
336 virtual ~t_ephGal() {}
337
338 virtual QString toString(double version) const;
339 virtual e_type type() const {return t_eph::Galileo;}
340 virtual unsigned int IOD() const { return static_cast<unsigned long>(_IODnav); }
341 virtual unsigned int isUnhealthy() const;
342
343 private:
344 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
345
346 double _clock_bias; // [s]
347 double _clock_drift; // [s/s]
348 double _clock_driftrate; // [s/s^2]
349
350 double _IODnav;
351 double _Crs; // [m]
352 double _Delta_n; // [rad/s]
353 double _M0; // [rad]
354
355 double _Cuc; // [rad]
356 double _e; //
357 double _Cus; // [rad]
358 double _sqrt_A; // [m^0.5]
359
360 double _TOEsec; // [s]
361 double _Cic; // [rad]
362 double _OMEGA0; // [rad]
363 double _Cis; // [rad]
364
365 double _i0; // [rad]
366 double _Crc; // [m]
367 double _omega; // [rad]
368 double _OMEGADOT; // [rad/s]
369
370 double _IDOT; // [rad/s]
371 double _TOEweek;
372 // spare
373
374 mutable double _SISA; // Signal In Space Accuracy
375 double _E5aHS; // [0..3] E5a Health Status
376 double _E5bHS; // [0..3] E5b Health Status
377 double _E1_bHS; // [0..3] E1-b Health Status
378 double _BGD_1_5A; // group delay [s]
379 double _BGD_1_5B; // group delay [s]
380
381 double _TOT; // [s]
382 /** Data comes from I/NAV when <code>true</code> */
383 bool _inav;
384 /** Data comes from F/NAV when <code>true</code> */
385 bool _fnav;
386 /** EE Data is not valid */
387 bool _e1DataInValid;
388 /** E5A Data is not valid */
389 bool _e5aDataInValid;
390 /** E5B Data is not valid */
391 bool _e5bDataInValid;
392};
393
394class t_ephSBAS : public t_eph {
395 friend class t_ephEncoder;
396 friend class RTCM3Decoder;
397 public:
398 t_ephSBAS() {
399 _IODN = 0;
400 _TOT = 0.0;
401 _agf0 = 0.0;
402 _agf1 = 0.0;
403 _x_pos = 0.0;
404 _x_velocity = 0.0;
405 _x_acceleration = 0.0;
406 _y_pos = 0.0;
407 _y_velocity = 0.0;
408 _y_acceleration = 0.0;
409 _z_pos = 0.0;
410 _z_velocity = 0.0;
411 _z_acceleration = 0.0;
412 _ura = 0.0;
413 _health = 0.0;
414 _receptStaID = "";
415 }
416 t_ephSBAS(double rnxVersion, const QStringList& lines);
417 virtual ~t_ephSBAS() {}
418
419 virtual e_type type() const {return t_eph::SBAS;}
420 virtual unsigned int IOD() const;
421 virtual unsigned int isUnhealthy() const;
422 virtual QString toString(double version) const;
423
424 private:
425 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
426
427 int _IODN;
428 double _TOT; // not used (set to 0.9999e9)
429 double _agf0; // [s] clock correction
430 double _agf1; // [s/s] clock correction drift
431
432 double _x_pos; // [m]
433 double _x_velocity; // [m/s]
434 double _x_acceleration; // [m/s^2]
435
436 double _y_pos; // [m]
437 double _y_velocity; // [m/s]
438 double _y_acceleration; // [m/s^2]
439
440 double _z_pos; // [m]
441 double _z_velocity; // [m/s]
442 double _z_acceleration; // [m/s^2]
443
444 mutable double _ura;
445 double _health;
446};
447
448class t_ephBDS : public t_eph {
449 friend class t_ephEncoder;
450 friend class RTCM3Decoder;
451 public:
452 t_ephBDS() {
453 _TOT = 0.0;
454 _AODE = 0;
455 _AODC = 0;
456 _URAI = 0;
457 _URA = 0.0;
458 _clock_bias = 0.0;
459 _clock_drift = 0.0;
460 _clock_driftrate = 0.0;
461 _Crs = 0.0;
462 _Delta_n = 0.0;
463 _M0 = 0.0;
464 _Cuc = 0.0;
465 _e = 0.0;
466 _Cus = 0.0;
467 _sqrt_A = 0.0;
468 _Cic = 0.0;
469 _OMEGA0 = 0.0;
470 _Cis = 0.0;
471 _i0 = 0.0;
472 _Crc = 0.0;
473 _omega = 0.0;
474 _OMEGADOT = 0.0;
475 _IDOT = 0.0;
476 _TOEsec = 0.0;
477 _BDTweek = 0.0;
478 _Delta_n_dot = 0.0;
479 _satType = 0.0;
480 _top = 0.0;
481 _SISAI_oe = 0.0;
482 _SISAI_ocb = 0.0;
483 _SISAI_oc1 = 0.0;
484 _SISAI_oc2 = 0.0;
485 _ISC_B1Cd = 0.0;
486 _ISC_B2ad = 0.0;
487 _TGD1 = 0.0;
488 _TGD2 = 0.0;
489 _TGD_B1Cp = 0.0;
490 _TGD_B2ap = 0.0;
491 _TGD_B2bI = 0.0;
492 _SISMAI = 0.0;
493 _SatH1 = 0;
494 _health = 0;
495 _INTEGRITYF_B1C = 0.0;
496 _INTEGRITYF_B2aB1C = 0.0;
497 _INTEGRITYF_B2b = 0.0;
498 _IODC = 0.0;
499 _IODE = 0.0;
500 _receptStaID = "";
501 }
502 t_ephBDS(double rnxVersion, const QStringList& lines);
503 virtual ~t_ephBDS() {}
504
505 virtual e_type type() const {return t_eph::BDS;}
506 virtual unsigned int IOD() const;
507 virtual unsigned int isUnhealthy() const;
508 virtual QString toString(double version) const;
509
510 private:
511 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
512
513 double _TOT; // [s] of BDT week
514 bncTime _TOE;
515 int _AODE;
516 int _AODC;
517 int _URAI; // [0..15] index from RTCM stream
518 mutable double _URA; // user range accuracy [m]
519 double _clock_bias; // [s]
520 double _clock_drift; // [s/s]
521 double _clock_driftrate; // [s/s^2]
522 double _Crs; // [m]
523 double _Delta_n; // [rad/s]
524 double _M0; // [rad]
525 double _Cuc; // [rad]
526 double _e; //
527 double _Cus; // [rad]
528 double _sqrt_A; // [m^0.5]
529 double _Cic; // [rad]
530 double _OMEGA0; // [rad]
531 double _Cis; // [rad]
532 double _i0; // [rad]
533 double _Crc; // [m]
534 double _omega; // [rad]
535 double _OMEGADOT; // [rad/s]
536 double _IDOT; // [rad/s]
537 double _TOEsec; // [s] of BDT week
538 double _BDTweek; // BDT week
539
540 double _Delta_n_dot; // [rad/s^2]
541 double _satType; // 0..reserved, 1..GEO, 2..IGSO, 3..MEO
542 double _top; // [s]
543
544 double _SISAI_oe; // []
545 double _SISAI_ocb; // []
546 double _SISAI_oc1; // []
547 double _SISAI_oc2; // []
548
549 double _ISC_B1Cd; // [s]
550 double _ISC_B2ad; // [s]
551
552 double _TGD1; // [s]
553 double _TGD2; // [s]
554 double _TGD_B1Cp; // [s]
555 double _TGD_B2ap; // [s]
556 double _TGD_B2bI; // [s]
557
558 double _SISMAI; // []
559
560 int _SatH1; //
561 int _health; //
562
563 double _INTEGRITYF_B1C; // 3 bits word from sf 3
564 double _INTEGRITYF_B2aB1C;// 6 bits word with integrity bits in msg 10-11, 30.34 or 40
565 double _INTEGRITYF_B2b; // 3 bits word from msg 10
566
567 double _IODC; // []
568 double _IODE; // [] IODE are the same as the 8 LSBs of IODC
569
570};
571#endif
Note: See TracBrowser for help on using the repository browser.