source: ntrip/trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h@ 8970

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

intial imprort for igs ssr encoding and decoding

  • Property svn:executable set to *
File size: 12.5 KB
Line 
1#ifndef RTCM3_CLOCK_ORBIT_IGS_H
2#define RTCM3_CLOCK_ORBIT_IGS_H
3
4/* Programheader
5
6 Name: clock_orbit_igs.h
7 Project: RTCM3
8 Version: $Id: clock_orbit_igs.h 8966 2020-07-01 07:48:35Z stuerze $
9 Authors: Dirk Stöcker, Andrea Stürze
10 Description: state space approach: IGS
11*/
12
13#include <string.h>
14
15enum SatelliteReferenceDatum {
16 DATUM_ITRF = 0,
17 DATUM_LOCAL = 1
18};
19
20enum IGS_NUMBERS {
21 RTCM_MESSAGE_NUMBER_IGS = 4076,
22 IGS_SSR_VERSION = 3
23};
24
25enum COR_BASE {// Orbit Correction
26 COBBASE_GPS = 21,
27 COBBASE_GLONASS = 41,
28 COBBASE_GALILEO = 61,
29 COBBASE_QZSS = 81,
30 COBBASE_BDS = 101,
31 COBBASE_SBAS = 121,
32 COBBASE_NUM
33};
34
35enum COR_OFFSET { // sub-type message, for example:
36 COBOFS_ORBIT = 0, // GPS: IM21
37 COBOFS_CLOCK, // GPS: IM22
38 COBOFS_COMBINED, // GPS: IM23
39 COBOFS_HR, // GPS: IM24
40 COBOFS_CBIAS, // GPS: IM25
41 COBOFS_PBIAS, // GPS: IM26
42 COBOFS_URA, // GPS: IM27
43 COBOFS_NUM
44};
45
46enum ClockOrbitType {
47 COTYPE_GPSORBIT = COBBASE_GPS + COBOFS_ORBIT,
48 COTYPE_GPSCLOCK,
49 COTYPE_GPSCOMBINED = COBBASE_GPS + COBOFS_COMBINED,
50 COTYPE_GPSHR,
51 COTYPE_GPSURA = COBBASE_GPS + COBOFS_URA,
52
53 COTYPE_GLONASSORBIT = COBBASE_GLONASS + COBOFS_ORBIT,
54 COTYPE_GLONASSCLOCK,
55 COTYPE_GLONASSCOMBINED = COBBASE_GLONASS + COBOFS_COMBINED,
56 COTYPE_GLONASSHR,
57 COTYPE_GLONASSURA = COBBASE_GLONASS + COBOFS_URA,
58
59 COTYPE_GALILEOORBIT = COBBASE_GALILEO + COBOFS_ORBIT,
60 COTYPE_GALILEOCLOCK,
61 COTYPE_GALILEOCOMBINED = COBBASE_GALILEO + COBOFS_COMBINED,
62 COTYPE_GALILEOHR,
63 COTYPE_GALILEOURA = COBBASE_GALILEO + COBOFS_URA,
64
65 COTYPE_QZSSORBIT = COBBASE_QZSS + COBOFS_ORBIT,
66 COTYPE_QZSSCLOCK,
67 COTYPE_QZSSCOMBINED = COBBASE_QZSS + COBOFS_COMBINED,
68 COTYPE_QZSSHR,
69 COTYPE_QZSSURA = COBBASE_QZSS + COBOFS_URA,
70
71 COTYPE_BDSORBIT = COBBASE_BDS + COBOFS_ORBIT,
72 COTYPE_BDSCLOCK,
73 COTYPE_BDSCOMBINED = COBBASE_BDS + COBOFS_COMBINED,
74 COTYPE_BDSHR,
75 COTYPE_BDSURA = COBBASE_BDS + COBOFS_URA,
76
77 COTYPE_SBASORBIT = COBBASE_SBAS + COBOFS_ORBIT,
78 COTYPE_SBASCLOCK,
79 COTYPE_SBASCOMBINED = COBBASE_SBAS + COBOFS_COMBINED,
80 COTYPE_SBASHR,
81 COTYPE_SBASURA = COBBASE_SBAS + COBOFS_URA,
82
83 COTYPE_AUTO = 0,
84};
85
86enum CodeBiasType {
87 CBTYPE_GPS = COBBASE_GPS + COBOFS_CBIAS,
88 CBTYPE_GLONASS = COBBASE_GLONASS + COBOFS_CBIAS,
89 CBTYPE_GALILEO = COBBASE_GALILEO + COBOFS_CBIAS,
90 CBTYPE_QZSS = COBBASE_QZSS + COBOFS_CBIAS,
91 CBTYPE_BDS = COBBASE_BDS + COBOFS_CBIAS,
92 CBTYPE_SBAS = COBBASE_SBAS + COBOFS_CBIAS,
93 CBTYPE_AUTO = 0
94};
95
96enum PhaseBiasType {
97 PBTYPE_GPS = COBBASE_GPS + COBOFS_PBIAS,
98 PBTYPE_GLONASS = COBBASE_GLONASS + COBOFS_PBIAS,
99 PBTYPE_GALILEO = COBBASE_GALILEO + COBOFS_PBIAS,
100 PBTYPE_QZSS = COBBASE_QZSS + COBOFS_PBIAS,
101 PBTYPE_BDS = COBBASE_BDS + COBOFS_PBIAS,
102 PBTYPE_SBAS = COBBASE_SBAS + COBOFS_PBIAS,
103 PBTYPE_AUTO = 0
104};
105
106enum VTECType {
107 VTEC_BASE = 201
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_NUMBDS = 65,
119 CLOCKORBIT_NUMSBAS = 38,
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_SATBDS,
132 CLOCKORBIT_SATSBAS,
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_OFFSETBDS = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
142 + CLOCKORBIT_NUMQZSS,
143 CLOCKORBIT_OFFSETSBAS = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
144 + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMBDS,
145 CLOCKORBIT_COUNTSAT = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
146 + CLOCKORBIT_NUMSBAS + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMBDS
147};
148
149enum CodeType {
150 CODETYPEGPS_L1_CA = 0,
151 CODETYPEGPS_L1_P = 1,
152 CODETYPEGPS_L1_Z = 2,
153 CODETYPEGPS_L1C_D = 3,
154 CODETYPEGPS_L1C_P = 4,
155 CODETYPEGPS_L2_CA = 5,
156 CODETYPEGPS_SEMI_CODELESS = 6,
157 CODETYPEGPS_L2C_M = 7,
158 CODETYPEGPS_L2C_L = 8,
159 //RESERVED = 9,
160 CODETYPEGPS_L2_P = 10,
161 CODETYPEGPS_L2_Z = 11,
162 //RESERVED = 12,
163 //RESERVED = 13,
164 CODETYPEGPS_L5_I = 14,
165 CODETYPEGPS_L5_Q = 15,
166
167 CODETYPEGLONASS_L1_CA = 0,
168 CODETYPEGLONASS_L1_P = 1,
169 CODETYPEGLONASS_L2_CA = 2,
170 CODETYPEGLONASS_L2_P = 3,
171 CODETYPEGLONASS_L1a_OCd = 4,
172 CODETYPEGLONASS_L1a_OCp = 5,
173 CODETYPEGLONASS_L2a_CSI = 6,
174 CODETYPEGLONASS_L2a_OCp = 7,
175 CODETYPEGLONASS_L3_I = 8,
176 CODETYPEGLONASS_L3_Q = 9,
177
178 CODETYPEGALILEO_E1_A = 0,
179 CODETYPEGALILEO_E1_B = 1,
180 CODETYPEGALILEO_E1_C = 2,
181 //RESERVED_E1_BC = 3,
182 //RESERVED_E1_ABC = 4,
183 CODETYPEGALILEO_E5A_I = 5,
184 CODETYPEGALILEO_E5A_Q = 6,
185 //RESERVED_E5A_IQ = 7,
186 CODETYPEGALILEO_E5B_I = 8,
187 CODETYPEGALILEO_E5B_Q = 9,
188 //RESERVED_E5B_IQ = 10,
189 //RESERVED_E5_I = 11,
190 //RESERVED_E5_Q = 12,
191 //RESERVED_E5_IQ = 13,
192 CODETYPEGALILEO_E6_A = 14,
193 CODETYPEGALILEO_E6_B = 15,
194 CODETYPEGALILEO_E6_C = 16,
195 //RESERVED_E6_BC = 17,
196 //RESERVED_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 //RESEVED_L2C_ML = 5,
204 CODETYPEQZSS_L5_I = 6,
205 CODETYPEQZSS_L5_Q = 7,
206 //RESERVED_L5_IQ = 8,
207 CODETYPEQZSS_L6_D = 9,
208 CODETYPEQZSS_L6_P = 10,
209 //RESERVED_L6_DP = 11,
210 //RESERVED_L1C_DP = 12,
211 //RESERVED_L1_S = 13,
212 //RESERVED_L5_D = 14,
213 //RESERVED_L5_P = 15,
214 //RESERVED_L5_DP = 16,
215 CODETYPEQZSS_L6_E = 17,
216 //RESERVED_L6_DE = 18,
217
218 CODETYPE_BDS_B1_I = 0,
219 CODETYPE_BDS_B1_Q = 1,
220 //RESERVED_BDS_B1_IQ = 2,
221 CODETYPE_BDS_B3_I = 3,
222 CODETYPE_BDS_B3_Q = 4,
223 //RESERVED_BDS_B3_IQ = 5,
224 CODETYPE_BDS_B2_I = 6,
225 CODETYPE_BDS_B2_Q = 7,
226 //RESERVED_BDS_B2_IQ = 8,
227 CODETYPE_BDS_B1a_D = 9,
228 CODETYPE_BDS_B1a_P = 10,
229 //RESERVED_BDS_B1a_DP = 11,
230 CODETYPE_BDS_B2a_D = 12,
231 CODETYPE_BDS_B2a_P = 13,
232 //RESEVED_BDS_B2a_DP = 14,
233 CODETYPE_BDS_B1_A = 15,//NEW 1A
234 //RESERVED = 16,
235 //RESERVED = 17,
236 CODETYPE_BDS_B3_A = 18,//NEW 6A
237
238 CODETYPE_SBAS_L1_CA = 0,
239 CODETYPE_SBAS_L5_I = 1,
240 CODETYPE_SBAS_L5_Q = 2
241 //RESERVED_SBAS_L5_IQ = 3
242
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
252struct ClockOrbit {
253 enum ClockOrbitType messageType;
254 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
255 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
256 unsigned int Supplied[COBOFS_NUM]; /* boolean */
257 unsigned int SSRIOD;
258 unsigned int SSRProviderID;
259 unsigned int SSRSolutionID;
260 unsigned int UpdateInterval;
261 enum SatelliteReferenceDatum SatRefDatum;
262 struct SatData {
263 unsigned int ID; /* all */
264 unsigned int IOD; /* all */
265 unsigned int toe; /* SBAS, BDS */
266 double UserRangeAccuracy; /* accuracy values in [m] */
267 double hrclock;
268 struct OrbitPart {
269 double DeltaRadial; /* m */
270 double DeltaAlongTrack; /* m */
271 double DeltaCrossTrack; /* m */
272 double DotDeltaRadial; /* m/s */
273 double DotDeltaAlongTrack; /* m/s */
274 double DotDeltaCrossTrack; /* m/s */
275 } Orbit;
276 struct ClockPart {
277 double DeltaA0; /* m */
278 double DeltaA1; /* m/s */
279 double DeltaA2; /* m/ss */
280 } Clock;
281 } Sat[CLOCKORBIT_COUNTSAT];
282};
283
284struct CodeBias {
285 enum CodeBiasType messageType;
286 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
287 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
288 unsigned int UpdateInterval;
289 unsigned int SSRIOD;
290 unsigned int SSRProviderID;
291 unsigned int SSRSolutionID;
292 struct BiasSat {
293 unsigned int ID; /* all */
294 unsigned int NumberOfCodeBiases;
295 struct CodeBiasEntry {
296 enum CodeType Type;
297 float Bias; /* m */
298 } Biases[CLOCKORBIT_NUMBIAS];
299 } Sat[CLOCKORBIT_COUNTSAT];
300};
301
302struct PhaseBias {
303 enum PhaseBiasType messageType;
304 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
305 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
306 unsigned int UpdateInterval;
307 unsigned int SSRIOD;
308 unsigned int SSRProviderID;
309 unsigned int SSRSolutionID;
310 unsigned int DispersiveBiasConsistencyIndicator;
311 unsigned int MWConsistencyIndicator;
312 struct PhaseBiasSat {
313 unsigned int ID; /* all */
314 unsigned int NumberOfPhaseBiases;
315 double YawAngle; /* radiant */
316 double YawRate; /* radiant/s */
317 struct PhaseBiasEntry {
318 enum CodeType Type;
319 unsigned int SignalIntegerIndicator;
320 unsigned int SignalsWideLaneIntegerIndicator;
321 unsigned int SignalDiscontinuityCounter;
322 float Bias; /* m */
323 } Biases[CLOCKORBIT_NUMBIAS];
324 } Sat[CLOCKORBIT_COUNTSAT];
325};
326
327struct VTEC {
328 unsigned int EpochTime; /* GPS */
329 unsigned int UpdateInterval;
330 unsigned int SSRIOD;
331 unsigned int SSRProviderID;
332 unsigned int SSRSolutionID;
333 unsigned int NumLayers; /* 1-4 */
334 double Quality;
335 struct IonoLayers {
336 double Height; /* m */
337 unsigned int Degree; /* 1-16 */
338 unsigned int Order; /* 1-16 */
339 double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
340 double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
341 } Layers[CLOCKORBIT_NUMIONOLAYERS];
342};
343
344/* return size of resulting data or 0 in case of an error */
345size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,
346 int moremessagesfollow, char *buffer, size_t size);
347size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,
348 int moremessagesfollow, char *buffer, size_t size);
349size_t MakePhaseBias(const struct PhaseBias *b, enum PhaseBiasType type,
350 int moremessagesfollow, char *buffer, size_t size);
351size_t MakeVTEC(const struct VTEC *b, int moremessagesfollow, char *buffer,
352 size_t size);
353
354enum GCOB_RETURN {
355 /* all well */
356 GCOBR_MESSAGEFOLLOWS = 1,
357 GCOBR_OK = 0,
358 /* unknown data, a warning */
359 GCOBR_UNKNOWNTYPE = -1,
360 GCOBR_UNKNOWNDATA = -2,
361 GCOBR_CRCMISMATCH = -3,
362 GCOBR_SHORTMESSAGE = -4,
363 /* failed to do the work */
364 GCOBR_NOCLOCKORBITPARAMETER = -10,
365 GCOBR_NOCODEBIASPARAMETER = -11,
366 GCOBR_NOPHASEBIASPARAMETER = -12,
367 GCOBR_NOVTECPARAMETER = -13,
368 /* data mismatch - data in storage does not match new data */
369 GCOBR_TIMEMISMATCH = -20,
370 GCOBR_DATAMISMATCH = -21,
371 /* not enough data - can decode the block completely */
372 GCOBR_SHORTBUFFER = -30,
373 GCOBR_MESSAGEEXCEEDSBUFFER = -31};
374
375/* 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
376function to have a clean state. */
377
378/* buffer should point to a RTCM3 block */
379enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v,
380 struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused);
381
382#endif /* RTCM3_CLOCK_ORBIT_IGS_H */
Note: See TracBrowser for help on using the repository browser.