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

Last change on this file since 8822 was 8822, checked in by stuerze, 5 years ago

minor changes

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 12.3 KB
RevLine 
[956]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
[3495]8 Version: $Id: clock_orbit_rtcm.h 8822 2019-10-01 09:24:09Z stuerze $
[956]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 };
[5664]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
[1581]36enum ClockOrbitType {
[5664]37 COTYPE_GPSORBIT = COBBASE_GPS + COBOFS_ORBIT,
38 COTYPE_GPSCLOCK,
39 COTYPE_GPSCOMBINED = COBBASE_GPS + COBOFS_COMBINED,
40 COTYPE_GPSURA,
41 COTYPE_GPSHR,
[1581]42
[5664]43 COTYPE_GLONASSORBIT = COBBASE_GLONASS + COBOFS_ORBIT,
44 COTYPE_GLONASSCLOCK,
45 COTYPE_GLONASSCOMBINED = COBBASE_GLONASS + COBOFS_COMBINED,
46 COTYPE_GLONASSURA,
47 COTYPE_GLONASSHR,
[1581]48
[5664]49 COTYPE_GALILEOORBIT = COBBASE_GALILEO + COBOFS_ORBIT,
50 COTYPE_GALILEOCLOCK,
51 COTYPE_GALILEOCOMBINED = COBBASE_GALILEO + COBOFS_COMBINED,
52 COTYPE_GALILEOURA,
53 COTYPE_GALILEOHR,
[956]54
[5664]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,
[6811]63 COTYPE_SBASCOMBINED = COBBASE_SBAS + COBOFS_COMBINED,
[5664]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,
[6810]81 BTYPE_SBAS = COBBASE_SBAS + COBOFS_BIAS,
[5664]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 */
[956]103enum COR_CONSTANTS {
[8179]104 CLOCKORBIT_BUFFERSIZE=8192,
[956]105 CLOCKORBIT_NUMGPS=32,
[6324]106 CLOCKORBIT_NUMGLONASS=26,
[5664]107 CLOCKORBIT_NUMGALILEO=36,
108 CLOCKORBIT_NUMQZSS=10,
109 CLOCKORBIT_NUMSBAS=38,
[8821]110 CLOCKORBIT_NUMBDS=65,
[8760]111 CLOCKORBIT_NUMBIAS=100,
[5664]112 CLOCKORBIT_NUMIONOLAYERS=4,
[7898]113 CLOCKORBIT_MAXIONOORDER=16,
114 CLOCKORBIT_MAXIONODEGREE=16
[956]115};
116
[5664]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
[956]142enum CodeType {
143 CODETYPEGPS_L1_CA = 0,
144 CODETYPEGPS_L1_P = 1,
145 CODETYPEGPS_L1_Z = 2,
[8409]146 CODETYPEGPS_L1_Y = 3,
147 CODETYPEGPS_L1_M = 4,
[4241]148 CODETYPEGPS_L2_CA = 5,
[2432]149 CODETYPEGPS_SEMI_CODELESS = 6,
[8409]150 CODETYPEGPS_L2C_M = 7,
151 CODETYPEGPS_L2C_L = 8,
152 CODETYPEGPS_L2C_ML = 9,
[2432]153 CODETYPEGPS_L2_P = 10,
154 CODETYPEGPS_L2_Z = 11,
[8409]155 CODETYPEGPS_L2_Y = 12,
156 CODETYPEGPS_L2_M = 13,
[4241]157 CODETYPEGPS_L5_I = 14,
158 CODETYPEGPS_L5_Q = 15,
[6845]159 CODETYPEGPS_L5_IQ = 16,
[8004]160 CODETYPEGPS_L1C_D = 17,
161 CODETYPEGPS_L1C_P = 18,
162 CODETYPEGPS_L1C_DP = 19,
[956]163
164 CODETYPEGLONASS_L1_CA = 0,
165 CODETYPEGLONASS_L1_P = 1,
166 CODETYPEGLONASS_L2_CA = 2,
167 CODETYPEGLONASS_L2_P = 3,
[8409]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,
[5664]177
[8409]178
[5664]179 CODETYPEGALILEO_E1_A = 0,
180 CODETYPEGALILEO_E1_B = 1,
181 CODETYPEGALILEO_E1_C = 2,
[7940]182 CODETYPEGALILEO_E1_BC = 3,
183 CODETYPEGALILEO_E1_ABC = 4,
[5664]184 CODETYPEGALILEO_E5A_I = 5,
185 CODETYPEGALILEO_E5A_Q = 6,
[7940]186 CODETYPEGALILEO_E5A_IQ = 7,
[5664]187 CODETYPEGALILEO_E5B_I = 8,
188 CODETYPEGALILEO_E5B_Q = 9,
[7940]189 CODETYPEGALILEO_E5B_IQ = 10,
[5664]190 CODETYPEGALILEO_E5_I = 11,
191 CODETYPEGALILEO_E5_Q = 12,
[7940]192 CODETYPEGALILEO_E5_IQ = 13,
[5664]193 CODETYPEGALILEO_E6_A = 14,
194 CODETYPEGALILEO_E6_B = 15,
195 CODETYPEGALILEO_E6_C = 16,
[7940]196 CODETYPEGALILEO_E6_BC = 17,
197 CODETYPEGALILEO_E6_ABC = 18,
[5664]198
199 CODETYPEQZSS_L1_CA = 0,
200 CODETYPEQZSS_L1C_D = 1,
201 CODETYPEQZSS_L1C_P = 2,
[7940]202 CODETYPEQZSS_L2C_M = 3,
203 CODETYPEQZSS_L2C_L = 4,
204 CODETYPEQZSS_L2C_ML = 5,
[5664]205 CODETYPEQZSS_L5_I = 6,
206 CODETYPEQZSS_L5_Q = 7,
207 CODETYPEQZSS_L5_IQ = 8,
[8409]208 CODETYPEQZSS_L6_D = 9,
209 CODETYPEQZSS_L6_P = 10,
210 CODETYPEQZSS_L6_DP = 11,
[5664]211 CODETYPEQZSS_L1C_DP = 12,
[8629]212 CODETYPEQZSS_L1_S = 13,
[8409]213 CODETYPEQZSS_L5_D = 14,
214 CODETYPEQZSS_L5_P = 15,
215 CODETYPEQZSS_L5_DP = 16,
[8629]216 CODETYPEQZSS_L6_E = 17,
[8409]217 CODETYPEQZSS_L6_DE = 18,
[5664]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,
[8409]233 CODETYPE_BDS_B1a_D = 9,
234 CODETYPE_BDS_B1a_P = 10,
235 CODETYPE_BDS_B1a_DP = 11,
236 CODETYPE_BDS_B2a_D = 12,
237 CODETYPE_BDS_B2a_P = 13,
[8801]238 CODETYPE_BDS_B2a_DP = 14,
239
240 CODETYPE_IRNSS_S_SPS = 8,
241 CODETYPE_IRNSS_L5_SPS = 22
[956]242};
243
[2421]244#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
245
[6845]246/* satellite system data is stored with offset CLOCKORBIT_OFFSET...
[5664]247in the data structures. So first GLONASS satellite is at
248xxx->Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is
249xxx->Sat[CLOCKORBIT_OFFSETGPS]. */
[956]250
[5664]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
[956]269struct ClockOrbit
270{
[2323]271 enum ClockOrbitType messageType;
[5664]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;
[956]284 enum SatelliteReferenceDatum SatRefDatum;
285 struct SatData {
[5664]286 unsigned int ID; /* all */
287 unsigned int IOD; /* all */
288 unsigned int toe; /* SBAS, BDS */
[2421]289 double UserRangeAccuracy; /* accuracy values in [m] */
[1581]290 double hrclock;
[956]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;
[5664]306 } Sat[CLOCKORBIT_COUNTSAT];
[956]307};
308
[5664]309struct CodeBias
[956]310{
[5664]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;
[956]318 struct BiasSat
319 {
[5664]320 unsigned int ID; /* all */
321 unsigned int NumberOfCodeBiases;
322 struct CodeBiasEntry
[956]323 {
324 enum CodeType Type;
325 float Bias; /* m */
326 } Biases[CLOCKORBIT_NUMBIAS];
[5664]327 } Sat[CLOCKORBIT_COUNTSAT];
[956]328};
329
[5664]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 */
[7903]369 unsigned int Degree; /* 1-16 */
370 unsigned int Order; /* 1-16 */
[5664]371 double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
372 double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
373 } Layers[CLOCKORBIT_NUMIONOLAYERS];
374};
375
[956]376/* return size of resulting data or 0 in case of an error */
[8822]377size_t MakeClockOrbit(const struct ClockOrbit *co, enum ClockOrbitType type,
[956]378 int moremessagesfollow, char *buffer, size_t size);
[5664]379size_t MakeCodeBias(const struct CodeBias *b, enum CodeBiasType type,
[956]380 int moremessagesfollow, char *buffer, size_t size);
[5664]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);
[956]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,
[1842]394 GCOBR_SHORTMESSAGE = -4,
[956]395 /* failed to do the work */
396 GCOBR_NOCLOCKORBITPARAMETER = -10,
[5664]397 GCOBR_NOCODEBIASPARAMETER = -11,
398 GCOBR_NOPHASEBIASPARAMETER = -12,
399 GCOBR_NOVTECPARAMETER = -13,
[956]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,
[1842]405 GCOBR_MESSAGEEXCEEDSBUFFER = -31};
[956]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 */
[5664]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);
[956]413
414#endif /* RTCM3_CLOCK_ORBIT_RTCM_H */
Note: See TracBrowser for help on using the repository browser.