source: ntrip/trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h @ 8972

Last change on this file since 8972 was 8972, checked in by stuerze, 2 months ago

minor changes regarding igs ssr decoding

  • Property svn:executable set to *
File size: 12.4 KB
Line 
1#ifndef RTCM3_CLOCK_ORBIT_IGS_H
2#define RTCM3_CLOCK_ORBIT_IGS_H
3
4/* Programheader
5
6        Name:           clock_orbit_igs.h
7        Project:        RTCM3
8        Version:        $Id: clock_orbit_igs.h 8966 2020-07-01 07:48:35Z stuerze $
9        Authors:        Dirk Stöcker, Andrea Stürze
10        Description:    state space approach: IGS
11*/
12
13#include <string.h>
14
15enum IGS_NUMBERS {
16 RTCM_MESSAGE_NUMBER_IGS = 4076,
17 IGS_SSR_VERSION         = 3
18};
19
20enum SatelliteReferenceDatum {
21  DATUM_ITRF  = 0,
22  DATUM_LOCAL = 1
23};
24
25enum COR_BASE {
26  COBBASE_GPS     =  21,
27  COBBASE_GLONASS =  41,
28  COBBASE_GALILEO =  61,
29  COBBASE_QZSS    =  81,
30  COBBASE_BDS     = 101,
31  COBBASE_SBAS    = 121,
32  COBBASE_NUM
33};
34
35enum COR_OFFSET {   // sub-type message, for example:
36  COBOFS_ORBIT = 0, // GPS: IM21
37  COBOFS_CLOCK,     // GPS: IM22
38  COBOFS_COMBINED,  // GPS: IM23
39  COBOFS_HR,        // GPS: IM24
40  COBOFS_CBIAS,     // GPS: IM25
41  COBOFS_PBIAS,     // GPS: IM26
42  COBOFS_URA,       // GPS: IM27
43  COBOFS_NUM
44};
45
46enum ClockOrbitType {
47  COTYPE_GPSORBIT        = COBBASE_GPS     + COBOFS_ORBIT,
48  COTYPE_GPSCLOCK,
49  COTYPE_GPSCOMBINED     = COBBASE_GPS     + COBOFS_COMBINED,
50  COTYPE_GPSHR,
51  COTYPE_GPSURA          = COBBASE_GPS     + COBOFS_URA,
52
53  COTYPE_GLONASSORBIT    = COBBASE_GLONASS + COBOFS_ORBIT,
54  COTYPE_GLONASSCLOCK,
55  COTYPE_GLONASSCOMBINED = COBBASE_GLONASS + COBOFS_COMBINED,
56  COTYPE_GLONASSHR,
57  COTYPE_GLONASSURA      = COBBASE_GLONASS + COBOFS_URA,
58
59  COTYPE_GALILEOORBIT    = COBBASE_GALILEO + COBOFS_ORBIT,
60  COTYPE_GALILEOCLOCK,
61  COTYPE_GALILEOCOMBINED = COBBASE_GALILEO + COBOFS_COMBINED,
62  COTYPE_GALILEOHR,
63  COTYPE_GALILEOURA      = COBBASE_GALILEO + COBOFS_URA,
64
65  COTYPE_QZSSORBIT       = COBBASE_QZSS    + COBOFS_ORBIT,
66  COTYPE_QZSSCLOCK,
67  COTYPE_QZSSCOMBINED    = COBBASE_QZSS    + COBOFS_COMBINED,
68  COTYPE_QZSSHR,
69  COTYPE_QZSSURA         = COBBASE_QZSS    + COBOFS_URA,
70
71  COTYPE_SBASORBIT       = COBBASE_SBAS    + COBOFS_ORBIT,
72  COTYPE_SBASCLOCK,
73  COTYPE_SBASCOMBINED    = COBBASE_SBAS    + COBOFS_COMBINED,
74  COTYPE_SBASHR,
75  COTYPE_SBASURA         = COBBASE_SBAS    + COBOFS_URA,
76
77  COTYPE_BDSORBIT        = COBBASE_BDS     + COBOFS_ORBIT,
78  COTYPE_BDSCLOCK,
79  COTYPE_BDSCOMBINED     = COBBASE_BDS     + COBOFS_COMBINED,
80  COTYPE_BDSHR,
81  COTYPE_BDSURA          = COBBASE_BDS     + COBOFS_URA,
82
83  COTYPE_AUTO = 0,
84};
85
86enum CodeBiasType {
87  CBTYPE_GPS     = COBBASE_GPS     + COBOFS_CBIAS,
88  CBTYPE_GLONASS = COBBASE_GLONASS + COBOFS_CBIAS,
89  CBTYPE_GALILEO = COBBASE_GALILEO + COBOFS_CBIAS,
90  CBTYPE_QZSS    = COBBASE_QZSS    + COBOFS_CBIAS,
91  CBTYPE_SBAS    = COBBASE_SBAS    + COBOFS_CBIAS,
92  CBTYPE_BDS     = COBBASE_BDS     + COBOFS_CBIAS,
93  CBTYPE_AUTO    = 0
94};
95
96enum PhaseBiasType {
97  PBTYPE_GPS     = COBBASE_GPS     + COBOFS_PBIAS,
98  PBTYPE_GLONASS = COBBASE_GLONASS + COBOFS_PBIAS,
99  PBTYPE_GALILEO = COBBASE_GALILEO + COBOFS_PBIAS,
100  PBTYPE_QZSS    = COBBASE_QZSS    + COBOFS_PBIAS,
101  PBTYPE_SBAS    = COBBASE_SBAS    + COBOFS_PBIAS,
102  PBTYPE_BDS     = COBBASE_BDS     + COBOFS_PBIAS,
103  PBTYPE_AUTO    = 0
104};
105
106enum VTECType {
107  VTEC_BASE = 201
108};
109
110/* if some systems aren't supported at all, change the following numbers to zero
111for these systems to save space */
112enum COR_CONSTANTS {
113  CLOCKORBIT_BUFFERSIZE    = 8192,
114  CLOCKORBIT_NUMGPS        =   32,
115  CLOCKORBIT_NUMGLONASS    =   26,
116  CLOCKORBIT_NUMGALILEO    =   36,
117  CLOCKORBIT_NUMQZSS       =   10,
118  CLOCKORBIT_NUMSBAS       =   38,
119  CLOCKORBIT_NUMBDS        =   65,
120  CLOCKORBIT_NUMBIAS       =  100,
121  CLOCKORBIT_NUMIONOLAYERS =    4,
122  CLOCKORBIT_MAXIONOORDER  =   16,
123  CLOCKORBIT_MAXIONODEGREE =   16
124};
125
126enum COR_SATSYSTEM {
127  CLOCKORBIT_SATGPS=0,
128  CLOCKORBIT_SATGLONASS,
129  CLOCKORBIT_SATGALILEO,
130  CLOCKORBIT_SATQZSS,
131  CLOCKORBIT_SATSBAS,
132  CLOCKORBIT_SATBDS,
133  CLOCKORBIT_SATNUM
134};
135
136enum COR_OFFSETS {
137  CLOCKORBIT_OFFSETGPS     = 0,
138  CLOCKORBIT_OFFSETGLONASS = CLOCKORBIT_NUMGPS,
139  CLOCKORBIT_OFFSETGALILEO = CLOCKORBIT_NUMGPS  + CLOCKORBIT_NUMGLONASS,
140  CLOCKORBIT_OFFSETQZSS    = CLOCKORBIT_NUMGPS  + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO,
141  CLOCKORBIT_OFFSETSBAS    = CLOCKORBIT_NUMGPS  + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
142                           + CLOCKORBIT_NUMQZSS,
143  CLOCKORBIT_OFFSETBDS     = CLOCKORBIT_NUMGPS  + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
144                           + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS,
145  CLOCKORBIT_COUNTSAT      = CLOCKORBIT_NUMGPS  + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
146                           + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS    + CLOCKORBIT_NUMBDS
147};
148
149enum CodeType {
150  CODETYPEGPS_L1_CA          = 0,
151  CODETYPEGPS_L1_P           = 1,
152  CODETYPEGPS_L1_Z           = 2,
153  CODETYPEGPS_L1C_D          = 3,
154  CODETYPEGPS_L1C_P          = 4,
155  CODETYPEGPS_L2_CA          = 5,
156  CODETYPEGPS_SEMI_CODELESS  = 6,
157  CODETYPEGPS_L2C_M          = 7,
158  CODETYPEGPS_L2C_L          = 8,
159  //RESERVED                 = 9,
160  CODETYPEGPS_L2_P           = 10,
161  CODETYPEGPS_L2_Z           = 11,
162  //RESERVED                 = 12,
163  //RESERVED                 = 13,
164  CODETYPEGPS_L5_I           = 14,
165  CODETYPEGPS_L5_Q           = 15,
166
167  CODETYPEGLONASS_L1_CA      = 0,
168  CODETYPEGLONASS_L1_P       = 1,
169  CODETYPEGLONASS_L2_CA      = 2,
170  CODETYPEGLONASS_L2_P       = 3,
171  CODETYPEGLONASS_L1a_OCd    = 4,
172  CODETYPEGLONASS_L1a_OCp    = 5,
173  CODETYPEGLONASS_L2a_CSI    = 6,
174  CODETYPEGLONASS_L2a_OCp    = 7,
175  CODETYPEGLONASS_L3_I       = 8,
176  CODETYPEGLONASS_L3_Q       = 9,
177
178  CODETYPEGALILEO_E1_A       = 0,
179  CODETYPEGALILEO_E1_B       = 1,
180  CODETYPEGALILEO_E1_C       = 2,
181  //RESERVED_E1_BC           = 3,
182  //RESERVED_E1_ABC          = 4,
183  CODETYPEGALILEO_E5A_I      = 5,
184  CODETYPEGALILEO_E5A_Q      = 6,
185  //RESERVED_E5A_IQ          = 7,
186  CODETYPEGALILEO_E5B_I      = 8,
187  CODETYPEGALILEO_E5B_Q      = 9,
188  //RESERVED_E5B_IQ          = 10,
189  //RESERVED_E5_I            = 11,
190  //RESERVED_E5_Q            = 12,
191  //RESERVED_E5_IQ           = 13,
192  CODETYPEGALILEO_E6_A       = 14,
193  CODETYPEGALILEO_E6_B       = 15,
194  CODETYPEGALILEO_E6_C       = 16,
195  //RESERVED_E6_BC           = 17,
196  //RESERVED_E6_ABC          = 18,
197
198  CODETYPEQZSS_L1_CA         = 0,
199  CODETYPEQZSS_L1C_D         = 1,
200  CODETYPEQZSS_L1C_P         = 2,
201  CODETYPEQZSS_L2C_M         = 3,
202  CODETYPEQZSS_L2C_L         = 4,
203  //RESEVED_L2C_ML           = 5,
204  CODETYPEQZSS_L5_I          = 6,
205  CODETYPEQZSS_L5_Q          = 7,
206  //RESERVED_L5_IQ           = 8,
207  CODETYPEQZSS_L6_D          = 9,
208  CODETYPEQZSS_L6_P          = 10,
209  //RESERVED_L6_DP           = 11,
210  //RESERVED_L1C_DP          = 12,
211  //RESERVED_L1_S            = 13,
212  //RESERVED_L5_D            = 14,
213  //RESERVED_L5_P            = 15,
214  //RESERVED_L5_DP           = 16,
215  CODETYPEQZSS_L6_E          = 17,
216  //RESERVED_L6_DE           = 18,
217
218  CODETYPE_BDS_B1_I          = 0,
219  CODETYPE_BDS_B1_Q          = 1,
220  //RESERVED_BDS_B1_IQ       = 2,
221  CODETYPE_BDS_B3_I          = 3,
222  CODETYPE_BDS_B3_Q          = 4,
223  //RESERVED_BDS_B3_IQ       = 5,
224  CODETYPE_BDS_B2_I          = 6,
225  CODETYPE_BDS_B2_Q          = 7,
226  //RESERVED_BDS_B2_IQ       = 8,
227  CODETYPE_BDS_B1a_D         = 9,
228  CODETYPE_BDS_B1a_P         = 10,
229  //RESERVED_BDS_B1a_DP      = 11,
230  CODETYPE_BDS_B2a_D         = 12,
231  CODETYPE_BDS_B2a_P         = 13,
232  //RESEVED_BDS_B2a_DP       = 14,
233  CODETYPE_BDS_B1_A          = 15,//NEW 1A
234  //RESERVED                 = 16,
235  //RESERVED                 = 17,
236  CODETYPE_BDS_B3_A          = 18,//NEW 6A
237
238  CODETYPE_SBAS_L1_CA        = 0,
239  CODETYPE_SBAS_L5_I         = 1,
240  CODETYPE_SBAS_L5_Q         = 2
241  //RESERVED_SBAS_L5_IQ      = 3
242
243};
244
245#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
246
247/* satellite system data is stored with offset CLOCKORBIT_OFFSET...
248in the data structures. So first GLONASS satellite is at
249xxx->Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is
250xxx->Sat[CLOCKORBIT_OFFSETGPS]. */
251
252struct ClockOrbit {
253  enum ClockOrbitType messageType;
254  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
255  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
256  unsigned int Supplied[COBOFS_NUM];           /* boolean */
257  unsigned int SSRIOD;
258  unsigned int SSRProviderID;
259  unsigned int SSRSolutionID;
260  unsigned int UpdateInterval;
261  enum SatelliteReferenceDatum SatRefDatum;
262  struct SatData {
263    unsigned int ID; /* all */
264    unsigned int IOD; /* all */
265    unsigned int toe; /* SBAS, BDS */
266    double UserRangeAccuracy; /* accuracy values in [m] */
267    double hrclock;
268    struct OrbitPart {
269      double DeltaRadial;           /* m */
270      double DeltaAlongTrack;       /* m */
271      double DeltaCrossTrack;       /* m */
272      double DotDeltaRadial;        /* m/s */
273      double DotDeltaAlongTrack;    /* m/s */
274      double DotDeltaCrossTrack;    /* m/s */
275    } Orbit;
276    struct ClockPart {
277      double DeltaA0;               /* m */
278      double DeltaA1;               /* m/s */
279      double DeltaA2;               /* m/ss */
280    } Clock;
281  } Sat[CLOCKORBIT_COUNTSAT];
282};
283
284struct CodeBias {
285  enum CodeBiasType messageType;
286  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
287  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
288  unsigned int UpdateInterval;
289  unsigned int SSRIOD;
290  unsigned int SSRProviderID;
291  unsigned int SSRSolutionID;
292  struct BiasSat {
293    unsigned int ID; /* all */
294    unsigned int NumberOfCodeBiases;
295    struct CodeBiasEntry {
296      enum CodeType Type;
297      float         Bias;           /* m */
298    } Biases[CLOCKORBIT_NUMBIAS];
299  } Sat[CLOCKORBIT_COUNTSAT];
300};
301
302struct PhaseBias {
303  enum PhaseBiasType messageType;
304  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
305  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
306  unsigned int UpdateInterval;
307  unsigned int SSRIOD;
308  unsigned int SSRProviderID;
309  unsigned int SSRSolutionID;
310  unsigned int DispersiveBiasConsistencyIndicator;
311  unsigned int MWConsistencyIndicator;
312  struct PhaseBiasSat {
313    unsigned int ID; /* all */
314    unsigned int NumberOfPhaseBiases;
315    double YawAngle; /* radiant */
316    double YawRate;  /* radiant/s */
317    struct PhaseBiasEntry {
318      enum CodeType Type;
319      unsigned int  SignalIntegerIndicator;
320      unsigned int  SignalsWideLaneIntegerIndicator;
321      unsigned int  SignalDiscontinuityCounter;
322      float         Bias;           /* m */
323    } Biases[CLOCKORBIT_NUMBIAS];
324  } Sat[CLOCKORBIT_COUNTSAT];
325};
326
327struct VTEC {
328  unsigned int EpochTime; /* GPS */
329  unsigned int UpdateInterval;
330  unsigned int SSRIOD;
331  unsigned int SSRProviderID;
332  unsigned int SSRSolutionID;
333  unsigned int NumLayers; /* 1-4 */
334  double Quality;
335  struct IonoLayers {
336    double       Height; /* m */
337    unsigned int Degree; /* 1-16 */
338    unsigned int Order; /* 1-16 */
339    double       Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
340    double       Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
341  } Layers[CLOCKORBIT_NUMIONOLAYERS];
342};
343
344/* return size of resulting data or 0 in case of an error */
345size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,
346       int moremessagesfollow, char *buffer, size_t size);
347size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,
348       int moremessagesfollow, char *buffer, size_t size);
349size_t MakePhaseBias(const struct PhaseBias *b, enum PhaseBiasType type,
350       int moremessagesfollow, char *buffer, size_t size);
351size_t MakeVTEC(const struct VTEC *b, int moremessagesfollow, char *buffer,
352       size_t size);
353
354enum GCOB_RETURN {
355  /* all well */
356  GCOBR_MESSAGEFOLLOWS        =  1,
357  GCOBR_OK                    =  0,
358  /* unknown data, a warning */
359  GCOBR_UNKNOWNTYPE           = -1,
360  GCOBR_UNKNOWNDATA           = -2,
361  GCOBR_CRCMISMATCH           = -3,
362  GCOBR_SHORTMESSAGE          = -4,
363  /* failed to do the work */
364  GCOBR_NOCLOCKORBITPARAMETER = -10,
365  GCOBR_NOCODEBIASPARAMETER   = -11,
366  GCOBR_NOPHASEBIASPARAMETER  = -12,
367  GCOBR_NOVTECPARAMETER       = -13,
368  /* data mismatch - data in storage does not match new data */
369  GCOBR_TIMEMISMATCH          = -20,
370  GCOBR_DATAMISMATCH          = -21,
371  /* not enough data - can decode the block completely */
372  GCOBR_SHORTBUFFER           = -30,
373  GCOBR_MESSAGEEXCEEDSBUFFER  = -31};
374
375/* NOTE: When an error message has been emitted, the output structures may have been modified. Make a copy of the previous variant before calling the
376function to have a clean state. */
377
378/* buffer should point to a RTCM3 block */
379enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
380       struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);
381
382#endif /* RTCM3_CLOCK_ORBIT_IGS_H */
Note: See TracBrowser for help on using the repository browser.