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

Last change on this file since 8844 was 8844, 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 8844 2019-11-08 09:45:49Z 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
179  CODETYPEGALILEO_E1_A       = 0,
180  CODETYPEGALILEO_E1_B       = 1,
181  CODETYPEGALILEO_E1_C       = 2,
182  CODETYPEGALILEO_E1_BC      = 3,
183  CODETYPEGALILEO_E1_ABC     = 4,
184  CODETYPEGALILEO_E5A_I      = 5,
185  CODETYPEGALILEO_E5A_Q      = 6,
186  CODETYPEGALILEO_E5A_IQ     = 7,
187  CODETYPEGALILEO_E5B_I      = 8,
188  CODETYPEGALILEO_E5B_Q      = 9,
189  CODETYPEGALILEO_E5B_IQ     = 10,
190  CODETYPEGALILEO_E5_I       = 11,
191  CODETYPEGALILEO_E5_Q       = 12,
192  CODETYPEGALILEO_E5_IQ      = 13,
193  CODETYPEGALILEO_E6_A       = 14,
194  CODETYPEGALILEO_E6_B       = 15,
195  CODETYPEGALILEO_E6_C       = 16,
196  CODETYPEGALILEO_E6_BC      = 17,
197  CODETYPEGALILEO_E6_ABC     = 18,
198
199  CODETYPEQZSS_L1_CA         = 0,
200  CODETYPEQZSS_L1C_D         = 1,
201  CODETYPEQZSS_L1C_P         = 2,
202  CODETYPEQZSS_L2C_M         = 3,
203  CODETYPEQZSS_L2C_L         = 4,
204  CODETYPEQZSS_L2C_ML        = 5,
205  CODETYPEQZSS_L5_I          = 6,
206  CODETYPEQZSS_L5_Q          = 7,
207  CODETYPEQZSS_L5_IQ         = 8,
208  CODETYPEQZSS_L6_D          = 9,
209  CODETYPEQZSS_L6_P          = 10,
210  CODETYPEQZSS_L6_DP         = 11,
211  CODETYPEQZSS_L1C_DP        = 12,/*
212  CODETYPEQZSS_L1_S          = 13,
213  CODETYPEQZSS_L5_D          = 14,
214  CODETYPEQZSS_L5_P          = 15,
215  CODETYPEQZSS_L5_DP         = 16,
216  CODETYPEQZSS_L6_E          = 17,
217  CODETYPEQZSS_L6_DE         = 18,*/
218
219  CODETYPE_SBAS_L1_CA        = 0,
220  CODETYPE_SBAS_L5_I         = 1,
221  CODETYPE_SBAS_L5_Q         = 2,
222  CODETYPE_SBAS_L5_IQ        = 3,
223
224  CODETYPE_BDS_B1_I          = 0,
225  CODETYPE_BDS_B1_Q          = 1,
226  CODETYPE_BDS_B1_IQ         = 2,
227  CODETYPE_BDS_B3_I          = 3,
228  CODETYPE_BDS_B3_Q          = 4,
229  CODETYPE_BDS_B3_IQ         = 5,
230  CODETYPE_BDS_B2_I          = 6,
231  CODETYPE_BDS_B2_Q          = 7,
232  CODETYPE_BDS_B2_IQ         = 8,
233  CODETYPE_BDS_B2a_D         = 9,
234  CODETYPE_BDS_B2a_P         = 10,
235  CODETYPE_BDS_B2a_DP        = 11,
236  CODETYPE_BDS_B1C_D         = 12,
237  CODETYPE_BDS_B1C_P         = 13,
238  CODETYPE_BDS_B1C_DP        = 14,
239
240  CODETYPE_IRNSS_S_SPS       = 8,
241  CODETYPE_IRNSS_L5_SPS      = 22
242};
243
244#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
245
246/* satellite system data is stored with offset CLOCKORBIT_OFFSET...
247in the data structures. So first GLONASS satellite is at
248xxx->Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is
249xxx->Sat[CLOCKORBIT_OFFSETGPS]. */
250
251#ifdef COR_LEGACY
252/* old names */
253#define NumberOfGPSSat     NumberOfSat[CLOCKORBIT_SATGPS]
254#define NumberOfGLONASSSat NumberOfSat[CLOCKORBIT_SATGLONASS]
255#define GPSEpochTime       EpochTime[CLOCKORBIT_SATGPS] /* 0 .. 604799 s */
256#define GLONASSEpochTime   EpochTime[CLOCKORBIT_SATGLONASS] /* 0 .. 86399 s (86400 for leap second) */
257#define ClockDataSupplied  Supplied[COBOFS_CLOCK]
258#define HRDataSupplied     Supplied[COBOFS_HR]
259#define OrbitDataSupplied  Supplied[COBOFS_ORBIT]
260#define URADataSupplied    Supplied[COBOFS_URA]
261#define GetClockOrbitBias(a,b,c,d,e) GetSSR(a,b,0,0,c,d,e)
262#endif /* COR_LEGACY */
263
264/* latency check code, disabled by default */
265#ifdef COR_LATENCY
266#define COR_LATENCYCOUNT 100
267#endif
268
269struct ClockOrbit
270{
271  enum ClockOrbitType messageType;
272  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
273  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
274
275  unsigned int Supplied[COBOFS_NUM];           /* boolean */
276#ifdef COR_LATENCY
277  unsigned int epochGPS[COR_LATENCYCOUNT+1];   /* Weber, for latency */
278  unsigned int epochSize;                      /* Weber, for latency */
279#endif
280  unsigned int SSRIOD;
281  unsigned int SSRProviderID;
282  unsigned int SSRSolutionID;
283  unsigned int UpdateInterval;
284  enum SatelliteReferenceDatum SatRefDatum;
285  struct SatData {
286    unsigned int ID; /* all */
287    unsigned int IOD; /* all */
288    unsigned int toe; /* SBAS, BDS */
289    double UserRangeAccuracy; /* accuracy values in [m] */
290    double hrclock;
291    struct OrbitPart
292    {
293      double DeltaRadial;           /* m */
294      double DeltaAlongTrack;       /* m */
295      double DeltaCrossTrack;       /* m */
296      double DotDeltaRadial;        /* m/s */
297      double DotDeltaAlongTrack;    /* m/s */
298      double DotDeltaCrossTrack;    /* m/s */
299    } Orbit;
300    struct ClockPart
301    {
302      double DeltaA0;               /* m */
303      double DeltaA1;               /* m/s */
304      double DeltaA2;               /* m/ss */
305    } Clock;
306  } Sat[CLOCKORBIT_COUNTSAT];
307};
308
309struct CodeBias
310{
311  enum CodeBiasType messageType;
312  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
313  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
314  unsigned int UpdateInterval;
315  unsigned int SSRIOD;
316  unsigned int SSRProviderID;
317  unsigned int SSRSolutionID;
318  struct BiasSat
319  {
320    unsigned int ID; /* all */
321    unsigned int NumberOfCodeBiases;
322    struct CodeBiasEntry
323    {
324      enum CodeType Type;
325      float         Bias;           /* m */
326    } Biases[CLOCKORBIT_NUMBIAS];
327  } Sat[CLOCKORBIT_COUNTSAT];
328};
329
330struct PhaseBias
331{
332  enum PhaseBiasType messageType;
333  unsigned int EpochTime[CLOCKORBIT_SATNUM];   /* 0 .. system specific maximum */
334  unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
335  unsigned int UpdateInterval;
336  unsigned int SSRIOD;
337  unsigned int SSRProviderID;
338  unsigned int SSRSolutionID;
339  unsigned int DispersiveBiasConsistencyIndicator;
340  unsigned int MWConsistencyIndicator;
341  struct PhaseBiasSat
342  {
343    unsigned int ID; /* all */
344    unsigned int NumberOfPhaseBiases;
345    double YawAngle; /* radiant */
346    double YawRate;  /* radiant/s */
347    struct PhaseBiasEntry
348    {
349      enum CodeType Type;
350      unsigned int  SignalIntegerIndicator;
351      unsigned int  SignalsWideLaneIntegerIndicator;
352      unsigned int  SignalDiscontinuityCounter;
353      float         Bias;           /* m */
354    } Biases[CLOCKORBIT_NUMBIAS];
355  } Sat[CLOCKORBIT_COUNTSAT];
356};
357
358struct VTEC
359{
360  unsigned int EpochTime; /* GPS */
361  unsigned int UpdateInterval;
362  unsigned int SSRIOD;
363  unsigned int SSRProviderID;
364  unsigned int SSRSolutionID;
365  unsigned int NumLayers; /* 1-4 */
366  double Quality;
367  struct IonoLayers {
368    double       Height; /* m */
369    unsigned int Degree; /* 1-16 */
370    unsigned int Order; /* 1-16 */
371    double       Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
372    double       Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
373  } Layers[CLOCKORBIT_NUMIONOLAYERS];
374};
375
376/* return size of resulting data or 0 in case of an error */
377size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,
378       int moremessagesfollow, char *buffer, size_t size);
379size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,
380       int moremessagesfollow, char *buffer, size_t size);
381size_t MakePhaseBias(const struct PhaseBias *b, enum PhaseBiasType type,
382       int moremessagesfollow, char *buffer, size_t size);
383size_t MakeVTEC(const struct VTEC *b, int moremessagesfollow, char *buffer,
384       size_t size);
385
386enum GCOB_RETURN {
387  /* all well */
388  GCOBR_MESSAGEFOLLOWS = 1,
389  GCOBR_OK = 0,
390  /* unknown data, a warning */
391  GCOBR_UNKNOWNTYPE = -1,
392  GCOBR_UNKNOWNDATA = -2,
393  GCOBR_CRCMISMATCH = -3,
394  GCOBR_SHORTMESSAGE = -4,
395  /* failed to do the work */
396  GCOBR_NOCLOCKORBITPARAMETER = -10,
397  GCOBR_NOCODEBIASPARAMETER = -11,
398  GCOBR_NOPHASEBIASPARAMETER = -12,
399  GCOBR_NOVTECPARAMETER = -13,
400  /* data mismatch - data in storage does not match new data */
401  GCOBR_TIMEMISMATCH = -20,
402  GCOBR_DATAMISMATCH = -21,
403  /* not enough data - can decode the block completely */
404  GCOBR_SHORTBUFFER = -30,
405  GCOBR_MESSAGEEXCEEDSBUFFER = -31};
406
407/* 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
408function to have a clean state. */
409
410/* buffer should point to a RTCM3 block */
411enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
412       struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);
413
414#endif /* RTCM3_CLOCK_ORBIT_RTCM_H */
Note: See TracBrowser for help on using the repository browser.