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

Last change on this file since 10554 was 10533, checked in by stuerze, 3 months ago

Service and RTCM CRS encoding and decoding as well as Helmert parameter decoding added + some re-organisation

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