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

Last change on this file since 6813 was 6812, checked in by stoecker, 10 years ago

integrate RTCM3 parsing into BNC and directly fill target structures, add doxygen documentation

File size: 9.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:
[6602]18 enum e_type {unknown, GPS, QZSS, GLONASS, Galileo, SBAS, BDS};
[6521]19 enum e_checkState {unchecked, ok, bad};
[4005]20
[5749]21 t_eph();
[4018]22 virtual ~t_eph() {};
23
[6109]24 virtual e_type type() const = 0;
[4013]25 virtual QString toString(double version) const = 0;
[6109]26 virtual int IOD() const = 0;
27 virtual int slotNum() const {return 0;}
[4018]28 bncTime TOC() const {return _TOC;}
[6109]29 bool isNewerThan(const t_eph* eph) const {return earlierTime(eph, this);}
[6518]30 e_checkState checkState() const {return _checkState;}
[6519]31 void setCheckState(e_checkState checkState) {_checkState = checkState;}
[6109]32 t_prn prn() const {return _prn;}
33 t_irc getCrd(const bncTime& tt, ColumnVector& xc, ColumnVector& vv, bool useCorr) const;
[6141]34 void setOrbCorr(const t_orbCorr* orbCorr);
35 void setClkCorr(const t_clkCorr* clkCorr);
[3174]36 const QDateTime& receptDateTime() const {return _receptDateTime;}
[6109]37 static QString rinexDateStr(const bncTime& tt, const t_prn& prn, double version);
38 static QString rinexDateStr(const bncTime& tt, const QString& prnStr, double version);
39 static bool earlierTime(const t_eph* eph1, const t_eph* eph2) {return eph1->_TOC < eph2->_TOC;}
[1025]40
[4022]41 protected:
[6213]42 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const = 0;
[6518]43 t_prn _prn;
44 bncTime _TOC;
45 QDateTime _receptDateTime;
46 e_checkState _checkState;
47 t_orbCorr* _orbCorr;
48 t_clkCorr* _clkCorr;
[1025]49};
50
51
52class t_ephGPS : public t_eph {
[5852]53 friend class t_ephEncoder;
[6812]54 friend class RTCM3Decoder;
[1025]55 public:
56 t_ephGPS() { }
[3659]57 t_ephGPS(float rnxVersion, const QStringList& lines);
[2221]58 virtual ~t_ephGPS() {}
[4005]59
[6373]60 virtual e_type type() const {return (_prn.system() == 'J' ? t_eph::QZSS : t_eph::GPS); }
[4013]61 virtual QString toString(double version) const;
[6109]62 virtual int IOD() const { return static_cast<int>(_IODC); }
[4366]63 double TGD() const {return _TGD;} // Timing Group Delay (P1-P2 DCB)
64
[1025]65 private:
[6213]66 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
[6109]67
[4018]68 double _clock_bias; // [s]
69 double _clock_drift; // [s/s]
70 double _clock_driftrate; // [s/s^2]
[1025]71
[4018]72 double _IODE;
73 double _Crs; // [m]
74 double _Delta_n; // [rad/s]
75 double _M0; // [rad]
[1025]76
[4018]77 double _Cuc; // [rad]
78 double _e; //
79 double _Cus; // [rad]
80 double _sqrt_A; // [m^0.5]
[1025]81
[4018]82 double _TOEsec; // [s]
83 double _Cic; // [rad]
84 double _OMEGA0; // [rad]
85 double _Cis; // [rad]
86
87 double _i0; // [rad]
88 double _Crc; // [m]
89 double _omega; // [rad]
90 double _OMEGADOT; // [rad/s]
91
92 double _IDOT; // [rad/s]
93 double _L2Codes; // Codes on L2 channel
94 double _TOEweek;
95 double _L2PFlag; // L2 P data flag
96
[6798]97 mutable double _ura; // SV accuracy
[4018]98 double _health; // SV health
99 double _TGD; // [s]
100 double _IODC;
101
102 double _TOT; // Transmisstion time
103 double _fitInterval; // Fit interval
[1025]104};
105
[2221]106class t_ephGlo : public t_eph {
[5853]107 friend class t_ephEncoder;
[6812]108 friend class RTCM3Decoder;
[2221]109 public:
[2257]110 t_ephGlo() { _xv.ReSize(6); }
[3659]111 t_ephGlo(float rnxVersion, const QStringList& lines);
[2221]112 virtual ~t_ephGlo() {}
113
[4005]114 virtual e_type type() const {return t_eph::GLONASS;}
[4013]115 virtual QString toString(double version) const;
[2221]116 virtual int IOD() const;
[6109]117 virtual int slotNum() const {return int(_frequency_number);}
[2221]118
119 private:
[6213]120 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
[6109]121 static ColumnVector glo_deriv(double /* tt */, const ColumnVector& xv, double* acc);
[2221]122
[4018]123 mutable bncTime _tt; // time
[2221]124 mutable ColumnVector _xv; // status vector (position, velocity) at time _tt
125
[3255]126 double _gps_utc;
[2221]127 double _tau; // [s]
128 double _gamma; //
[5853]129 mutable double _tki; // message frame time
[4018]130
[2221]131 double _x_pos; // [km]
132 double _x_velocity; // [km/s]
133 double _x_acceleration; // [km/s^2]
[4018]134 double _health; // 0 = O.K.
135
[2221]136 double _y_pos; // [km]
137 double _y_velocity; // [km/s]
138 double _y_acceleration; // [km/s^2]
[4018]139 double _frequency_number; // ICD-GLONASS data position
140
[2221]141 double _z_pos; // [km]
142 double _z_velocity; // [km/s]
143 double _z_acceleration; // [km/s^2]
[4018]144 double _E; // Age of Information [days]
[2221]145};
146
[2770]147class t_ephGal : public t_eph {
[5853]148 friend class t_ephEncoder;
[6812]149 friend class RTCM3Decoder;
[2770]150 public:
[6812]151 t_ephGal() { };
[3659]152 t_ephGal(float rnxVersion, const QStringList& lines);
[2770]153 virtual ~t_ephGal() {}
[4005]154
[4013]155 virtual QString toString(double version) const;
[4005]156 virtual e_type type() const {return t_eph::Galileo;}
[6109]157 virtual int IOD() const { return static_cast<int>(_IODnav); }
[2770]158
[6109]159 private:
[6213]160 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
[2770]161
162 double _clock_bias; // [s]
163 double _clock_drift; // [s/s]
164 double _clock_driftrate; // [s/s^2]
[4018]165
[6812]166 double _IODnav;
[2770]167 double _Crs; // [m]
168 double _Delta_n; // [rad/s]
169 double _M0; // [rad]
[4018]170
[2770]171 double _Cuc; // [rad]
172 double _e; //
173 double _Cus; // [rad]
174 double _sqrt_A; // [m^0.5]
[4018]175
176 double _TOEsec; // [s]
[2770]177 double _Cic; // [rad]
178 double _OMEGA0; // [rad]
179 double _Cis; // [rad]
[4018]180
[2770]181 double _i0; // [rad]
182 double _Crc; // [m]
183 double _omega; // [rad]
184 double _OMEGADOT; // [rad/s]
[4018]185
[2770]186 double _IDOT; // [rad/s]
[6809]187 double _TOEweek;
[4018]188 // spare
189
[6798]190 mutable double _SISA; // Signal In Space Accuracy
[6794]191 double _E5aHS; // [0..3] E5a Health Status
192 double _E5bHS; // [0..3] E5b Health Status
193 double _E1_bHS; // [0..3] E1-b Health Status
[2770]194 double _BGD_1_5A; // group delay [s]
[3255]195 double _BGD_1_5B; // group delay [s]
[2770]196
[6809]197 double _TOT; // [s]
[6812]198 /** Data comes from I/NAV when <code>true</code> */
199 bool _inav;
200 /** Data comes from F/NAV when <code>true</code> */
201 bool _fnav;
202 /** EE Data is not valid */
203 bool _e1DataInValid;
204 /** E5A Data is not valid */
205 bool _e5aDataInValid;
206 /** E5B Data is not valid */
207 bool _e5bDataInValid;
[2770]208};
209
[6380]210class t_ephSBAS : public t_eph {
211 friend class t_ephEncoder;
[6812]212 friend class RTCM3Decoder;
[6380]213 public:
[6382]214 t_ephSBAS() {}
[6380]215 t_ephSBAS(float rnxVersion, const QStringList& lines);
216 virtual ~t_ephSBAS() {}
217
218 virtual e_type type() const {return t_eph::SBAS;}
219 virtual int IOD() const {return _IODN;}
220 virtual QString toString(double version) const;
221
222 private:
[6381]223 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
[6380]224
[6536]225 int _IODN;
[6390]226 double _TOW; // not used (set to 0.9999e9)
[6380]227 double _agf0; // [s] clock correction
228 double _agf1; // [s/s] clock correction drift
229
[6387]230 double _x_pos; // [m]
231 double _x_velocity; // [m/s]
232 double _x_acceleration; // [m/s^2]
[6380]233
[6387]234 double _y_pos; // [m]
235 double _y_velocity; // [m/s]
236 double _y_acceleration; // [m/s^2]
[6380]237
[6387]238 double _z_pos; // [m]
239 double _z_velocity; // [m/s]
240 double _z_acceleration; // [m/s^2]
[6380]241
[6798]242 mutable double _ura;
[6390]243 double _health;
[6380]244};
245
[6600]246class t_ephBDS : public t_eph {
[6400]247 friend class t_ephEncoder;
[6812]248 friend class RTCM3Decoder;
[6400]249 public:
[6600]250 t_ephBDS() {}
251 t_ephBDS(float rnxVersion, const QStringList& lines);
252 virtual ~t_ephBDS() {}
[6400]253
[6602]254 virtual e_type type() const {return t_eph::BDS;}
[6400]255 virtual int IOD() const {return _AODC;}
256 virtual QString toString(double version) const;
257
258 private:
259 virtual t_irc position(int GPSweek, double GPSweeks, double* xc, double* vv) const;
260
[6812]261 double _TOT;
[6400]262 bncTime _TOE;
263 int _AODE;
264 int _AODC;
[6812]265 int _URAI; // [0..15] index from RTCM stream
[6798]266 mutable double _URA; // user range accuracy
[6400]267 double _clock_bias; // [s]
268 double _clock_drift; // [s/s]
269 double _clock_driftrate; // [s/s^2]
270 double _Crs; // [m]
271 double _Delta_n; // [rad/s]
272 double _M0; // [rad]
273 double _Cuc; // [rad]
274 double _e; //
275 double _Cus; // [rad]
276 double _sqrt_A; // [m^0.5]
277 double _Cic; // [rad]
278 double _OMEGA0; // [rad]
279 double _Cis; // [rad]
280 double _i0; // [rad]
281 double _Crc; // [m]
282 double _omega; // [rad]
283 double _OMEGADOT; // [rad/s]
284 double _IDOT; // [rad/s]
285 double _TGD1; // [s]
286 double _TGD2; // [s]
287 int _SatH1; //
[6812]288 double _TOW; // [s] of BDT week; RINEX file entry
289 double _TOEsec; // [s] of BDT week; RINEX file entry
290 double _TOEweek;
[6400]291};
292
[1025]293#endif
Note: See TracBrowser for help on using the repository browser.