source: ntrip/branches/BNC_2.12/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h @ 8843

Last change on this file since 8843 was 8843, checked in by stuerze, 9 months ago

Harmonization of RTCM3 Signal ID Mapping and RTCM SSR Signal and Tracking Mode Identifiers

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