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, 13 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.