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

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

minor changes

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