source: ntrip/trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h @ 8970

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

intial imprort for igs ssr encoding and decoding

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