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

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

minor changes regarding igs ssr decoding

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