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

Last change on this file since 8967 was 8967, checked in by stuerze, 4 years ago

minor changes in rtcm ssr to be compatible with future igs ssr

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 12.7 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 8967 2020-07-02 11:56:59Z stuerze $
9 Authors: Dirk Stöcker
10 Description: state space approach for RTCM3
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_SBAS_L1_CA = 0,
221 CODETYPE_SBAS_L5_I = 1,
222 CODETYPE_SBAS_L5_Q = 2,
223 CODETYPE_SBAS_L5_IQ = 3,
224
225 CODETYPE_BDS_B1_I = 0,
226 CODETYPE_BDS_B1_Q = 1,
227 CODETYPE_BDS_B1_IQ = 2,
228 CODETYPE_BDS_B3_I = 3,
229 CODETYPE_BDS_B3_Q = 4,
230 CODETYPE_BDS_B3_IQ = 5,
231 CODETYPE_BDS_B2_I = 6,
232 CODETYPE_BDS_B2_Q = 7,
233 CODETYPE_BDS_B2_IQ = 8,
234 CODETYPE_BDS_B1a_D = 9,
235 CODETYPE_BDS_B1a_P = 10,
236 CODETYPE_BDS_B1a_DP = 11,
237 CODETYPE_BDS_B2a_D = 12,
238 CODETYPE_BDS_B2a_P = 13,
239 CODETYPE_BDS_B2a_DP = 14,
240
241 CODETYPE_IRNSS_S_SPS = 8,
242 CODETYPE_IRNSS_L5_SPS = 22
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
252#ifdef COR_LEGACY
253/* old names */
254#define NumberOfGPSSat NumberOfSat[CLOCKORBIT_SATGPS]
255#define NumberOfGLONASSSat NumberOfSat[CLOCKORBIT_SATGLONASS]
256#define GPSEpochTime EpochTime[CLOCKORBIT_SATGPS] /* 0 .. 604799 s */
257#define GLONASSEpochTime EpochTime[CLOCKORBIT_SATGLONASS] /* 0 .. 86399 s (86400 for leap second) */
258#define ClockDataSupplied Supplied[COBOFS_CLOCK]
259#define HRDataSupplied Supplied[COBOFS_HR]
260#define OrbitDataSupplied Supplied[COBOFS_ORBIT]
261#define URADataSupplied Supplied[COBOFS_URA]
262#define GetClockOrbitBias(a,b,c,d,e) GetSSR(a,b,0,0,c,d,e)
263#endif /* COR_LEGACY */
264
265/* latency check code, disabled by default */
266#ifdef COR_LATENCY
267#define COR_LATENCYCOUNT 100
268#endif
269
270struct ClockOrbit {
271 enum ClockOrbitType messageType;
272 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
273 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
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 double DeltaRadial; /* m */
292 double DeltaAlongTrack; /* m */
293 double DeltaCrossTrack; /* m */
294 double DotDeltaRadial; /* m/s */
295 double DotDeltaAlongTrack; /* m/s */
296 double DotDeltaCrossTrack; /* m/s */
297 } Orbit;
298 struct ClockPart {
299 double DeltaA0; /* m */
300 double DeltaA1; /* m/s */
301 double DeltaA2; /* m/ss */
302 } Clock;
303 } Sat[CLOCKORBIT_COUNTSAT];
304};
305
306struct CodeBias {
307 enum CodeBiasType messageType;
308 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
309 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
310 unsigned int UpdateInterval;
311 unsigned int SSRIOD;
312 unsigned int SSRProviderID;
313 unsigned int SSRSolutionID;
314 struct BiasSat {
315 unsigned int ID; /* all */
316 unsigned int NumberOfCodeBiases;
317 struct CodeBiasEntry {
318 enum CodeType Type;
319 float Bias; /* m */
320 } Biases[CLOCKORBIT_NUMBIAS];
321 } Sat[CLOCKORBIT_COUNTSAT];
322};
323
324struct PhaseBias {
325 enum PhaseBiasType messageType;
326 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
327 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
328 unsigned int UpdateInterval;
329 unsigned int SSRIOD;
330 unsigned int SSRProviderID;
331 unsigned int SSRSolutionID;
332 unsigned int DispersiveBiasConsistencyIndicator;
333 unsigned int MWConsistencyIndicator;
334 struct PhaseBiasSat {
335 unsigned int ID; /* all */
336 unsigned int NumberOfPhaseBiases;
337 double YawAngle; /* radiant */
338 double YawRate; /* radiant/s */
339 struct PhaseBiasEntry {
340 enum CodeType Type;
341 unsigned int SignalIntegerIndicator;
342 unsigned int SignalsWideLaneIntegerIndicator;
343 unsigned int SignalDiscontinuityCounter;
344 float Bias; /* m */
345 } Biases[CLOCKORBIT_NUMBIAS];
346 } Sat[CLOCKORBIT_COUNTSAT];
347};
348
349struct VTEC {
350 unsigned int EpochTime; /* GPS */
351 unsigned int UpdateInterval;
352 unsigned int SSRIOD;
353 unsigned int SSRProviderID;
354 unsigned int SSRSolutionID;
355 unsigned int NumLayers; /* 1-4 */
356 double Quality;
357 struct IonoLayers {
358 double Height; /* m */
359 unsigned int Degree; /* 1-16 */
360 unsigned int Order; /* 1-16 */
361 double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
362 double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
363 } Layers[CLOCKORBIT_NUMIONOLAYERS];
364};
365
366/* return size of resulting data or 0 in case of an error */
367size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,
368 int moremessagesfollow, char *buffer, size_t size);
369size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,
370 int moremessagesfollow, char *buffer, size_t size);
371size_t MakePhaseBias(const struct PhaseBias *b, enum PhaseBiasType type,
372 int moremessagesfollow, char *buffer, size_t size);
373size_t MakeVTEC(const struct VTEC *b, int moremessagesfollow, char *buffer,
374 size_t size);
375
376enum GCOB_RETURN {
377 /* all well */
378 GCOBR_MESSAGEFOLLOWS = 1,
379 GCOBR_OK = 0,
380 /* unknown data, a warning */
381 GCOBR_UNKNOWNTYPE = -1,
382 GCOBR_UNKNOWNDATA = -2,
383 GCOBR_CRCMISMATCH = -3,
384 GCOBR_SHORTMESSAGE = -4,
385 /* failed to do the work */
386 GCOBR_NOCLOCKORBITPARAMETER = -10,
387 GCOBR_NOCODEBIASPARAMETER = -11,
388 GCOBR_NOPHASEBIASPARAMETER = -12,
389 GCOBR_NOVTECPARAMETER = -13,
390 /* data mismatch - data in storage does not match new data */
391 GCOBR_TIMEMISMATCH = -20,
392 GCOBR_DATAMISMATCH = -21,
393 /* not enough data - can decode the block completely */
394 GCOBR_SHORTBUFFER = -30,
395 GCOBR_MESSAGEEXCEEDSBUFFER = -31};
396
397/* 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
398function to have a clean state. */
399
400/* buffer should point to a RTCM3 block */
401enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
402 struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);
403
404#endif /* RTCM3_CLOCK_ORBIT_RTCM_H */
Note: See TracBrowser for help on using the repository browser.