source: ntrip/trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h@ 10994

Last change on this file since 10994 was 10994, checked in by stuerze, 6 weeks ago

minor changes

  • Property svn:executable set to *
File size: 47.5 KB
Line 
1#ifndef RTCM3_CLOCK_ORBIT_H
2#define RTCM3_CLOCK_ORBIT_H
3
4/* Programheader
5
6 Name: clock_orbit.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
11 */
12
13#include <QList>
14#include <stdint.h>
15#include <string.h>
16#include <math.h>
17#include "t_prn.h"
18#include "bncutils.h"
19#include "RTCM3/bits.h"
20
21enum IGS_NUMBERS {
22 RTCM_MESSAGE_NUMBER_IGS = 4076,
23 IGS_SSR_VERSION = 3
24};
25
26/* if some systems aren't supported at all, change the following numbers to zero
27 for these systems to save space */
28enum COR_CONSTANTS {
29 CLOCKORBIT_BUFFERSIZE = 8192,
30 CLOCKORBIT_NUMGPS = t_prn::MAXPRN_GPS,
31 CLOCKORBIT_NUMGLONASS = t_prn::MAXPRN_GLONASS,
32 CLOCKORBIT_NUMGALILEO = t_prn::MAXPRN_GALILEO,
33 CLOCKORBIT_NUMQZSS = t_prn::MAXPRN_QZSS,
34 CLOCKORBIT_NUMSBAS = t_prn::MAXPRN_SBAS,
35 CLOCKORBIT_NUMBDS = t_prn::MAXPRN_BDS,
36 CLOCKORBIT_NUMBIAS = 150,
37 CLOCKORBIT_NUMIONOLAYERS = 4,
38 CLOCKORBIT_MAXIONOORDER = 16,
39 CLOCKORBIT_MAXIONODEGREE = 16
40};
41
42enum COR_SATSYSTEM {
43 CLOCKORBIT_SATGPS = 0,
44 CLOCKORBIT_SATGLONASS,
45 CLOCKORBIT_SATGALILEO,
46 CLOCKORBIT_SATQZSS,
47 CLOCKORBIT_SATSBAS,
48 CLOCKORBIT_SATBDS,
49 CLOCKORBIT_SATNUM
50};
51
52enum COR_OFFSETS {
53 CLOCKORBIT_OFFSETGPS = 0,
54 CLOCKORBIT_OFFSETGLONASS = CLOCKORBIT_NUMGPS,
55 CLOCKORBIT_OFFSETGALILEO = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS,
56 CLOCKORBIT_OFFSETQZSS = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
57 + CLOCKORBIT_NUMGALILEO,
58 CLOCKORBIT_OFFSETSBAS = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
59 + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS,
60 CLOCKORBIT_OFFSETBDS = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
61 + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
62 + CLOCKORBIT_NUMSBAS,
63 CLOCKORBIT_COUNTSAT = CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
64 + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
65 + CLOCKORBIT_NUMSBAS + CLOCKORBIT_NUMBDS
66};
67
68enum GCOB_RETURN {
69 /* all well */
70 GCOBR_MESSAGEFOLLOWS = 1,
71 GCOBR_OK = 0,
72 /* unknown data, a warning */
73 GCOBR_UNKNOWNTYPE = -1,
74 GCOBR_UNKNOWNDATA = -2,
75 GCOBR_CRCMISMATCH = -3,
76 GCOBR_SHORTMESSAGE = -4,
77 /* failed to do the work */
78 GCOBR_NOCLOCKORBITPARAMETER = -10,
79 GCOBR_NOCODEBIASPARAMETER = -11,
80 GCOBR_NOPHASEBIASPARAMETER = -12,
81 GCOBR_NOVTECPARAMETER = -13,
82 /* data mismatch - data in storage does not match new data */
83 GCOBR_TIMEMISMATCH = -20,
84 GCOBR_DATAMISMATCH = -21,
85 /* not enough data - can decode the block completely */
86 GCOBR_SHORTBUFFER = -30,
87 GCOBR_MESSAGEEXCEEDSBUFFER = -31
88/* NOTE: When an error message has been emitted, the output structures may have been modified.
89 * Make a copy of the previous variant before calling the
90 function to have a clean state. */
91};
92
93class SsrCorr {
94
95public:
96 SsrCorr();
97 virtual ~SsrCorr();
98 virtual void setCorBase() = 0;
99 virtual void setCorOffset() = 0;
100 virtual void setCoType() = 0;
101 virtual void setCbType() = 0;
102 virtual void setPbType() = 0;
103 virtual void setPbExtType() = 0;
104 virtual void setVtecType() = 0;
105 virtual void setCodeType() = 0;
106
107 typedef unsigned int SatelliteReferenceDatum;
108 SatelliteReferenceDatum DATUM_ITRF;
109 SatelliteReferenceDatum DATUM_LOCAL;
110
111 typedef unsigned int CorBase;
112 CorBase COBBASE_GPS;
113 CorBase COBBASE_GLONASS;
114 CorBase COBBASE_GALILEO;
115 CorBase COBBASE_QZSS;
116 CorBase COBBASE_BDS;
117 CorBase COBBASE_SBAS;
118 CorBase COBBASE_NUM;
119
120 typedef unsigned int CorOffset;
121 CorOffset COBOFS_ORBIT;
122 CorOffset COBOFS_CLOCK;
123 CorOffset COBOFS_COMBINED;
124 CorOffset COBOFS_HR;
125 CorOffset COBOFS_CBIAS;
126 CorOffset COBOFS_PBIAS;
127 CorOffset COBOFS_URA;
128 CorOffset COBOFS_NUM;
129
130 typedef unsigned int ClockOrbitType;
131 ClockOrbitType COTYPE_GPSORBIT;
132 ClockOrbitType COTYPE_GPSCLOCK;
133 ClockOrbitType COTYPE_GPSCOMBINED;
134 ClockOrbitType COTYPE_GPSHR;
135 ClockOrbitType COTYPE_GPSURA;
136
137 ClockOrbitType COTYPE_GLONASSORBIT;
138 ClockOrbitType COTYPE_GLONASSCLOCK;
139 ClockOrbitType COTYPE_GLONASSCOMBINED;
140 ClockOrbitType COTYPE_GLONASSHR;
141 ClockOrbitType COTYPE_GLONASSURA;
142
143 ClockOrbitType COTYPE_GALILEOORBIT;
144 ClockOrbitType COTYPE_GALILEOCLOCK;
145 ClockOrbitType COTYPE_GALILEOCOMBINED;
146 ClockOrbitType COTYPE_GALILEOHR;
147 ClockOrbitType COTYPE_GALILEOURA;
148
149 ClockOrbitType COTYPE_QZSSORBIT;
150 ClockOrbitType COTYPE_QZSSCLOCK;
151 ClockOrbitType COTYPE_QZSSCOMBINED;
152 ClockOrbitType COTYPE_QZSSHR;
153 ClockOrbitType COTYPE_QZSSURA;
154
155 ClockOrbitType COTYPE_SBASORBIT;
156 ClockOrbitType COTYPE_SBASCLOCK;
157 ClockOrbitType COTYPE_SBASCOMBINED;
158 ClockOrbitType COTYPE_SBASHR;
159 ClockOrbitType COTYPE_SBASURA;
160
161 ClockOrbitType COTYPE_BDSORBIT;
162 ClockOrbitType COTYPE_BDSCLOCK;
163 ClockOrbitType COTYPE_BDSCOMBINED;
164 ClockOrbitType COTYPE_BDSHR;
165 ClockOrbitType COTYPE_BDSURA;
166
167 ClockOrbitType COTYPE_AUTO;
168
169 typedef unsigned int CodeBiasType;
170 CodeBiasType CBTYPE_GPS;
171 CodeBiasType CBTYPE_GLONASS;
172 CodeBiasType CBTYPE_GALILEO;
173 CodeBiasType CBTYPE_QZSS;
174 CodeBiasType CBTYPE_SBAS;
175 CodeBiasType CBTYPE_BDS;
176 CodeBiasType CBTYPE_AUTO;
177
178 typedef unsigned int PhaseBiasType;
179 PhaseBiasType PBTYPE_BASE;
180 PhaseBiasType PBTYPE_GPS;
181 PhaseBiasType PBTYPE_GLONASS;
182 PhaseBiasType PBTYPE_GALILEO;
183 PhaseBiasType PBTYPE_QZSS;
184 PhaseBiasType PBTYPE_SBAS;
185 PhaseBiasType PBTYPE_BDS;
186 PhaseBiasType PBTYPE_RESERVED; // reserved for NavIC
187 PhaseBiasType PBTYPE_AUTO;
188
189 typedef unsigned int PhaseBiasExtType;
190 PhaseBiasExtType PBEXTTYPE_BASE;
191 PhaseBiasExtType PBEXTTYPE_GPS;
192 PhaseBiasExtType PBEXTTYPE_GLONASS;
193 PhaseBiasExtType PBEXTTYPE_GALILEO;
194 PhaseBiasExtType PBEXTTYPE_QZSS;
195 PhaseBiasExtType PBEXTTYPE_BDS;
196 PhaseBiasExtType PBEXTTYPE_RESERVED; // reserved for NavIC
197 PhaseBiasExtType PBEXTTYPE_AUTO;
198
199 typedef unsigned int VtecType;
200 VtecType VTEC_BASE;
201
202 typedef unsigned int SatAntennaType;
203 SatAntennaType SATANTTYPE_BASE;
204 SatAntennaType SATANTTYPE_GPS;
205 SatAntennaType SATANTTYPE_GLONASS;
206 SatAntennaType SATANTTYPE_GALILEO;
207 SatAntennaType SATANTTYPE_QZSS;
208 SatAntennaType SATANTTYPE_BDS;
209 SatAntennaType SATANTTYPE_RESEVED; // reserved for NavIC
210 SatAntennaType SATANTTYPE_AUTO;
211
212 typedef unsigned int GridDefinitionType;
213 GridDefinitionType GRID_BASE;
214
215 typedef unsigned int TropoType;
216 TropoType TROPOTYPE_BASE;
217
218 typedef unsigned int RegionalIonoType;
219 RegionalIonoType REGIONOTYPE_BASE;
220 RegionalIonoType REGIONOTYPE_GPS;
221 RegionalIonoType REGIONOTYPE_GLONASS;
222 RegionalIonoType REGIONOTYPE_GALILEO;
223 RegionalIonoType REGIONOTYPE_QZSS;
224 RegionalIonoType REGIONOTYPE_BDS;
225 RegionalIonoType REGIONOTYPE_AUTO;
226
227 typedef unsigned int MetadataType;
228 MetadataType METADATATYPE_BASE;
229
230 typedef unsigned int CodeType;
231 CodeType CODETYPE_RESERVED;
232 CodeType CODETYPE_GPS_L1_CA;
233 CodeType CODETYPE_GPS_L1_P;
234 CodeType CODETYPE_GPS_L1_Z;
235 CodeType CODETYPE_GPS_L1C_D;
236 CodeType CODETYPE_GPS_L1C_P;
237 CodeType CODETYPE_GPS_L1C_DP;
238 CodeType CODETYPE_GPS_L2_CA;
239 CodeType CODETYPE_GPS_SEMI_CODELESS;
240 CodeType CODETYPE_GPS_L2C_M;
241 CodeType CODETYPE_GPS_L2C_L;
242 CodeType CODETYPE_GPS_L2C_ML;
243 CodeType CODETYPE_GPS_L2_P;
244 CodeType CODETYPE_GPS_L2_Z;
245 CodeType CODETYPE_GPS_L5_I;
246 CodeType CODETYPE_GPS_L5_Q;
247 CodeType CODETYPE_GPS_L5_IQ;
248
249 CodeType CODETYPE_GLONASS_L1_CA;
250 CodeType CODETYPE_GLONASS_L1_P;
251 CodeType CODETYPE_GLONASS_L2_CA;
252 CodeType CODETYPE_GLONASS_L2_P;
253 CodeType CODETYPE_GLONASS_L1a_OCd;
254 CodeType CODETYPE_GLONASS_L1a_OCp;
255 CodeType CODETYPE_GLONASS_L1a_OCdp;
256 CodeType CODETYPE_GLONASS_L2a_CSI;
257 CodeType CODETYPE_GLONASS_L2a_OCp;
258 CodeType CODETYPE_GLONASS_L2a_CSIOCp;
259 CodeType CODETYPE_GLONASS_L3_I;
260 CodeType CODETYPE_GLONASS_L3_Q;
261 CodeType CODETYPE_GLONASS_L3_IQ;
262
263 CodeType CODETYPE_GALILEO_E1_A;
264 CodeType CODETYPE_GALILEO_E1_B;
265 CodeType CODETYPE_GALILEO_E1_C;
266 CodeType CODETYPE_GALILEO_E1_BC;
267 CodeType CODETYPE_GALILEO_E1_ABC;
268 CodeType CODETYPE_GALILEO_E5A_I;
269 CodeType CODETYPE_GALILEO_E5A_Q;
270 CodeType CODETYPE_GALILEO_E5A_IQ;
271 CodeType CODETYPE_GALILEO_E5B_I;
272 CodeType CODETYPE_GALILEO_E5B_Q;
273 CodeType CODETYPE_GALILEO_E5B_IQ;
274 CodeType CODETYPE_GALILEO_E5_I;
275 CodeType CODETYPE_GALILEO_E5_Q;
276 CodeType CODETYPE_GALILEO_E5_IQ;
277 CodeType CODETYPE_GALILEO_E6_A;
278 CodeType CODETYPE_GALILEO_E6_B;
279 CodeType CODETYPE_GALILEO_E6_C;
280 CodeType CODETYPE_GALILEO_E6_BC;
281 CodeType CODETYPE_GALILEO_E6_ABC;
282
283 CodeType CODETYPE_QZSS_L1_CA;
284 CodeType CODETYPE_QZSS_L1C_D;
285 CodeType CODETYPE_QZSS_L1C_P;
286 CodeType CODETYPE_QZSS_L2C_M;
287 CodeType CODETYPE_QZSS_L2C_L;
288 CodeType CODETYPE_QZSS_L2C_ML;
289 CodeType CODETYPE_QZSS_L5_I;
290 CodeType CODETYPE_QZSS_L5_Q;
291 CodeType CODETYPE_QZSS_L5_IQ;
292 CodeType CODETYPE_QZSS_L6_D;
293 CodeType CODETYPE_QZSS_L6_P;
294 CodeType CODETYPE_QZSS_L6_DP;
295 CodeType CODETYPE_QZSS_L1C_DP;
296 CodeType CODETYPE_QZSS_L1_S;
297 CodeType CODETYPE_QZSS_L5_D;
298 CodeType CODETYPE_QZSS_L5_P;
299 CodeType CODETYPE_QZSS_L5_DP;
300 CodeType CODETYPE_QZSS_L6_E;
301 CodeType CODETYPE_QZSS_L6_DE;
302
303 CodeType CODETYPE_SBAS_L1_CA;
304 CodeType CODETYPE_SBAS_L5_I;
305 CodeType CODETYPE_SBAS_L5_Q;
306 CodeType CODETYPE_SBAS_L5_IQ;
307
308 CodeType CODETYPE_BDS_B1_I;
309 CodeType CODETYPE_BDS_B1_Q;
310 CodeType CODETYPE_BDS_B1_IQ;
311 CodeType CODETYPE_BDS_B3_I;
312 CodeType CODETYPE_BDS_B3_Q;
313 CodeType CODETYPE_BDS_B3_IQ;
314 CodeType CODETYPE_BDS_B2_I;
315 CodeType CODETYPE_BDS_B2_Q;
316 CodeType CODETYPE_BDS_B2_IQ;
317 CodeType CODETYPE_BDS_B1a_D;
318 CodeType CODETYPE_BDS_B1a_P;
319 CodeType CODETYPE_BDS_B1a_DP;
320 CodeType CODETYPE_BDS_B1C_D;
321 CodeType CODETYPE_BDS_B1C_P;
322 CodeType CODETYPE_BDS_B1C_DP;
323 CodeType CODETYPE_BDS_B2a_D;
324 CodeType CODETYPE_BDS_B2a_P;
325 CodeType CODETYPE_BDS_B2a_DP;
326 CodeType CODETYPE_BDS_B2b_D;
327 CodeType CODETYPE_BDS_B1_A;
328 CodeType CODETYPE_BDS_B3_A;
329
330 QList<CorBase> corbase;
331 QList<unsigned int> satoffset;
332
333
334#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
335#define COBOFS_MAXNUM 7
336
337 /* satellite system data is stored with offset CLOCKORBIT_OFFSET...
338 in the data structures. So first GLONASS satellite is at
339 xxx->Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is
340 xxx->Sat[CLOCKORBIT_OFFSETGPS]. */
341
342 struct ClockOrbit {
343 ClockOrbitType messageType;
344 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
345 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
346 unsigned int Supplied[COBOFS_MAXNUM]; /* boolean */
347 unsigned int SSRIOD;
348 unsigned int SSRProviderID;
349 unsigned int SSRSolutionID;
350 unsigned int UpdateInterval;
351 SatelliteReferenceDatum SatRefDatum;
352 struct SatData {
353 unsigned int ID; /* all */
354 unsigned int IOD; /* all */
355 unsigned int toe; /* SBAS, BDS */
356 double UserRangeAccuracy; /* accuracy values in [m] */
357 double hrclock;
358 struct OrbitPart {
359 double DeltaRadial; /* m */
360 double DeltaAlongTrack; /* m */
361 double DeltaCrossTrack; /* m */
362 double DotDeltaRadial; /* m/s */
363 double DotDeltaAlongTrack; /* m/s */
364 double DotDeltaCrossTrack; /* m/s */
365 } Orbit;
366 struct ClockPart {
367 double DeltaA0; /* m */
368 double DeltaA1; /* m/s */
369 double DeltaA2; /* m/ss */
370 } Clock;
371 } Sat[CLOCKORBIT_COUNTSAT];
372 };
373
374 struct CodeBias {
375 CodeBiasType messageType;
376 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
377 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
378 unsigned int UpdateInterval;
379 unsigned int SSRIOD;
380 unsigned int SSRProviderID;
381 unsigned int SSRSolutionID;
382 struct BiasSat {
383 unsigned int ID; /* all */
384 unsigned int NumberOfCodeBiases;
385 struct CodeBiasEntry {
386 CodeType Type;
387 float Bias; /* m */
388 } Biases[CLOCKORBIT_NUMBIAS];
389 } Sat[CLOCKORBIT_COUNTSAT];
390 };
391
392 struct PhaseBias {
393 PhaseBiasType messageType;
394 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
395 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
396 unsigned int UpdateInterval;
397 unsigned int SSRIOD;
398 unsigned int SSRProviderID;
399 unsigned int SSRSolutionID;
400 /* IGS-SSR and old RTCM-SSR only*/
401 unsigned int DispersiveBiasConsistencyIndicator;
402 unsigned int MWConsistencyIndicator;
403 /* new RTCM-SSR only*/
404 unsigned int SatelliteYawInformationIndicator;
405 unsigned int ExtendedPhaseBiasPropertyID;
406 struct PhaseBiasSat {
407 unsigned int ID; /* all */
408 unsigned int NumberOfPhaseBiases;
409 double YawAngle; /* radiant */
410 double YawRate; /* radiant/s */
411 struct PhaseBiasEntry {
412 CodeType Type;
413 unsigned int IntegerIndicator;
414 unsigned int DiscontinuityCounter;
415 unsigned int WidelaneGroupIndicator;
416 float Bias; /* m */
417 } Biases[CLOCKORBIT_NUMBIAS];
418 } Sat[CLOCKORBIT_COUNTSAT];
419 };
420
421 struct VTEC {
422 unsigned int EpochTime; /* GPS */
423 unsigned int UpdateInterval;
424 unsigned int SSRIOD;
425 unsigned int SSRProviderID;
426 unsigned int SSRSolutionID;
427 unsigned int NumLayers; /* 1-4 */
428 double Quality;
429 struct IonoLayers {
430 double Height; /* m */
431 unsigned int Degree; /* 1-16 */
432 unsigned int Order; /* 1-16 */
433 double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
434 double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
435 } Layers[CLOCKORBIT_NUMIONOLAYERS];
436 };
437
438 /* return size of resulting data or 0 in case of an error */
439 virtual size_t MakeClockOrbit(const struct ClockOrbit *co, CodeType type, int moremessagesfollow, char *buffer, size_t size) = 0;
440 virtual size_t MakeCodeBias(const struct CodeBias *b, CodeBiasType type, int moremessagesfollow, char *buffer, size_t size) = 0;
441 virtual size_t MakePhaseBias(const struct PhaseBias *b, CodeBiasType type, int moremessagesfollow, char *buffer, size_t size) = 0;
442 virtual size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size) = 0;
443
444 /* buffer should point to a RTCM3 block */
445 virtual enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b, struct VTEC *v, struct PhaseBias *pb,
446 const char *buffer, size_t size, int *bytesused) = 0;
447 virtual std::string codeTypeToRnxType(char system, CodeType type) = 0;
448 virtual CodeType rnxTypeToCodeType(char system, std::string type) = 0;
449
450#define MPI 3.141592653589793
451
452/* GNSS macros - Header part */
453#define E_RTCM_MESSAGE_NUMBER(a) ADDBITS(12, a) /* DF002 */
454#define E_IGS_SSR_VERSION(a) ADDBITS( 3, a) /* IDF001 */
455#define E_IGS_MESSAGE_NUMBER(a) ADDBITS( 8, a) /* IDF002 */
456
457#define E_GPS_EPOCH_TIME(a) ADDBITS(20, a) /* IDF003 DF385 DF458 DF460 DF465*/
458#define E_GLONASS_EPOCH_TIME(a) ADDBITS(17, a) /* DF386 */
459#define E_SSR_UPDATE_INTERVAL(a) ADDBITS( 4, a) /* DF391, IDF004 */
460#define E_MULTIPLE_MESSAGE_INDICATOR(a) ADDBITS( 1, a) /* DF388, IDF005 */
461#define E_SSR_IOD(a) ADDBITS( 4, a) /* DF413, IDF007 */
462#define E_SSR_PROVIDER_ID(a) ADDBITS(16, a) /* DF414, IDF008 */
463#define E_SSR_SOLUTION_ID(a) ADDBITS( 4, a) /* DF415, IDF009 */
464#define E_SATELLITE_REFERENCE_DATUM(a) ADDBITS( 1, a) /* DF375, IDF006 */
465#define E_NO_OF_SATELLITES(a) ADDBITS( 6, a) /* DF387, IDF010 */
466
467/* GNSS macros - Satellite specific part */
468#define E_GPS_SATELLITE_ID(a) ADDBITS( 6, a) /* IDF011 DF068 DF488 */
469#define E_QZSS_SATELLITE_ID_OLD(a) ADDBITS( 4, a) /* DF249 (old RTCM)*/
470#define E_GLONASS_SATELLITE_ID_OLD(a) ADDBITS( 5, a) /* DF384 (old RTCM) */
471#define E_GPS_IODE(a) ADDBITS( 8, a) /* IDF012 DF071 */
472#define E_GLONASS_IOD(a) ADDBITS( 8, a) /* DF392 */
473#define E_GALILEO_IOD(a) ADDBITS(10, a) /* DF459 */
474#define E_SBAS_T0MOD(a) ADDBITS( 9, (a/16)) /* DF468 */
475#define E_SBAS_IODCRC(a) ADDBITS(24, a) /* DF469 */
476#define E_BDS_TOEMOD(a) ADDBITS(10, (a/8)) /* DF470 */
477#define E_BDS_IOD(a) ADDBITS( 8, a) /* DF471 */
478
479/* Orbit Corrections */
480#define E_DELTA_RADIAL(a) SCALEADDBITS(22, 10000.0, a) /* DF365, IDF013 */
481#define E_DELTA_ALONG_TRACK(a) SCALEADDBITS(20, 2500.0, a) /* DF366, IDF014 */
482#define E_DELTA_CROSS_TRACK(a) SCALEADDBITS(20, 2500.0, a) /* DF367, IDF015 */
483#define E_DOT_DELTA_RADIAL(a) SCALEADDBITS(21, 1000000.0, a) /* DF368, IDF016 */
484#define E_DOT_DELTA_ALONG_TRACK(a) SCALEADDBITS(19, 250000.0, a) /* DF369, IDF017 */
485#define E_DOT_DELTA_CROSS_TRACK(a) SCALEADDBITS(19, 250000.0, a) /* DF370, IDF018 */
486
487/* Clock Corrections */
488#define E_DELTA_CLOCK_C0(a) SCALEADDBITS(22, 10000.0, a) /* DF376, IDF019 */
489#define E_DELTA_CLOCK_C1(a) SCALEADDBITS(21, 1000000.0, a) /* DF377, IDF020 */
490#define E_DELTA_CLOCK_C2(a) SCALEADDBITS(27, 50000000.0, a) /* DF378, IDF021 */
491#define E_HR_CLOCK_CORRECTION(a) SCALEADDBITS(22, 10000.0, a) /* DF390, IDF022 */
492
493/* Biases */
494#define E_NO_OF_BIASES(a) ADDBITS(5, a) /* DF479, DF379, IDF023 */
495#define E_GNSS_SIGNAL_IDENTIFIER(a) ADDBITS(5, a) /* DF380, IDF024 */
496#define E_CODE_BIAS(a) SCALEADDBITS(14, 100.0, a) /* DF383, IDF025 */
497#define E_YAW_ANGLE(a) SCALEADDBITS( 9, 256.0/MPI, a) /* DF480, IDF026 */
498#define E_YAW_RATE(a) SCALEADDBITS( 8, 8192.0/MPI, a) /* DF481, IDF027 */
499#define E_PHASE_BIAS_CORRECTION(a) SCALEADDBITS(20, 10000.0, a) /* DF482, IDF028 */
500
501/* Phase specific part of GNSS phase bias message */
502#define E_INTEGER_INDICATOR(a) ADDBITS(1, a) /* DF483, IDF029 */
503#define E_WIDE_LANE_INDICATOR(a) ADDBITS(2, a) /* DF484, IDF030 */
504#define E_DISCONTINUITY_COUNTER(a) ADDBITS(4, a) /* DF485, IDF031 */
505#define E_DISPERSIVE_BIAS_INDICATOR(a) ADDBITS(1, a) /* DF486 (old RTCM), IDF032 */
506#define E_YAW_INFO_INDICATOR(a) ADDBITS(1, a) /* DF486 (new RTCM) */
507#define E_MW_CONSISTENCY_INDICATOR(a) ADDBITS(1, a) /* DF487 (old RTCM), IDF033 */
508#define E_EXTENDED_PHASE_BIAS_ID(a) ADDBITS(4, a) /* DF+002 (new RTCM) */
509
510#define E_GLONASS_SATELLITE_ID(a) ADDBITS(6, a) /* DF+003 (new RTCM) */
511
512/* URA */
513#define E_SSR_URA(a) ADDBITS(6, a) /* DF389, IDF034 */
514
515/* Ionosphere */
516#define E_NO_IONO_LAYERS(a) ADDBITS(2, a-1) /* DF472, IDF035 */
517#define E_IONO_HEIGHT(a) SCALEADDBITS( 8, 1/10000.0, a) /* DF473, IDF036 */
518#define E_IONO_DEGREE(a) ADDBITS(4, a-1) /* DF474, IDF037 */
519#define E_IONO_ORDER(a) ADDBITS(4, a-1) /* DF475, IDF038 */
520#define E_IONO_COEFF_C(a) SCALEADDBITS(16, 200.0, a) /* DF476, IDF039 */
521#define E_IONO_COEFF_S(a) SCALEADDBITS(16, 200.0, a) /* DF477, IDF040 */
522#define E_VTEC_QUALITY_INDICATOR(a) SCALEADDBITS( 9, 20.0, a) /* DF478, IDF041 */
523
524/* Antenna Information*/
525#define E_SATELLITE_ANTENNA_IOD(a) ADDBITS(6, a) /* DF+010 (new RTCM) */
526#define E_PHASE_CENTER_INFO_INDICATOR(a) ADDBITS(1, a) /* DF+011 (new RTCM) */
527#define E_GROUP_DELAY_INFO_INDICATOR(a) ADDBITS(1, a) /* DF+012 (new RTCM) */
528#define E_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a) ADDBITS(1, a) /* DF+013 (new RTCM) */
529#define E_MAXIMUM_OFF_NADIR_ANGLE(a) ADDBITS(5, a) /* DF+014 (new RTCM) */
530#define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4, a) /* DF+015 (new RTCM) to extend DF+021*/
531#define E_SATELLITE_SET_INDICATOR(a) ADDBITS(1, a) /* DF+016 (new RTCM) */
532#define E_FREQUENCY_SET_INDICATOR(a) ADDBITS(1, a) /* DF+017 (new RTCM) */
533#define E_GNSS_FREQUENCY_MASK(a) ADDBITS(6, a) /* DF+018 (new RTCM) */
534#define E_NADIR_CORR_INDICATOR(a) ADDBITS(1, a) /* DF+019 (new RTCM) */
535#define E_NADIR_CORRECTION(a) SCALEADDBITS(12, 1000.0, a) /* DF+020 (new RTCM) [m] => [mm] */
536#define E_NADIR_ANGLE_DEPENDENT_CORRECTION(a, nbits) SCALEADDBITS(3 + nbits, 1000.0, a) /* DF+021 (new RTCM) [m] => [mm] can be extended up to 15/18 Bits from DF+015*/
537/*
538//Encoding
539#define E_NEW_PAR(a, nbits) ADDBITS(nbits, a) //called as E_NEW_PAR(co->NewPar, co->NewParNumBits)
540#define E_NEW_PAR_SCALE(a, nbits) SCALEADDBITS(nbits, 10000.0, a) //called as E_NEW_PAR(co->NewPar, co->NewParNumBits)
541*/
542/* Grid Messages */
543#define E_GRID_ID(a) ADDBITS(10, a) /* DF+022 (new RTCM) */
544#define E_GRID_TYPE(a) ADDBITS(3 , a) /* DF+023 (new RTCM) */
545#define E_LATITUDE_OF_REFERENCE_POINT(a) SCALEADDBITS(18, 1000.0, a) /* DF+024 (new RTCM) */
546#define E_LONGITUDE_OF_REFERENCE_POINT(a) SCALEADDBITS(19, 1000.0, a) /* DF+025 (new RTCM) */
547#define E_ELLIPSOIDAL_HEIGHT_OF_REFERENCE_POINT(a) SCALEADDBITS(10, 1/12.5, a+1000.0) /* DF+026 (new RTCM) */
548#define E_NUMNBER_OF_RELATIVE_POINTS(a) ADDBITS(8, a) /* DF+027 (new RTCM) */
549#define E_RELATIVE_LATITUDE(a) SCALEADDBITS(13, 1000.0, a) /* DF+028 (new RTCM) */
550#define E_RELATIVE_LONGITUDE(a) SCALEADDBITS(14, 1000.0, a) /* DF+029 (new RTCM) */
551#define E_RELATIVE_HIGHT(a) SCALEADDBITS(9, 1/12.5, a) /* DF+030 (new RTCM) */
552#define E_NUMBER_OF_POINTS_IN_LATITIDE_DIRECTION(a) ADDBITS(6, a) /* DF+031 (new RTCM) */
553#define E_NUMBER_OF_POINTS_IN_LONGITUDE_DIRECTION(a) ADDBITS(6, a) /* DF+032 (new RTCM) */
554#define E_GRID_STEP_SIZE_IN_LATITIDE_DIRECTION(a) SCALEADDBITS(9, 100.0, a) /* DF+033 (new RTCM) */
555#define E_GRID_STEP_SIZE_IN_LONGITUDE_DIRECTION(a) SCALEADDBITS(10, 100.0, a) /* DF+034 (new RTCM) */
556#define E_GRID_MASK_AVAILABILITY_FLAG(a) ADDBITS(1, a) /* DF+035 (new RTCM) */
557#define E_GRID_MASK(a, nbits) ADDBITS(nbits, a) /* DF+036 (new RTCM) nbits from DF+031 or DF+032 */
558
559/* Troposphere Messages */
560#define E_HYDROSTATIC_MAPPING_FUNCTION_PAR_AH(a) SCALEADDBITS(11, 25000000.0, a - 0.00118, a) /* DF+038 (new RTCM) */
561#define E_HYDROSTATIC_MAPPING_FUNCTION_PAR_BH(a) SCALEADDBITS( 9, 5000000.0, a - 0.00298, a) /* DF+039 (new RTCM) */
562#define E_HYDROSTATIC_MAPPING_FUNCTION_PAR_CH(a) SCALEADDBITS( 9, 20000.0, a - 0.0682, a) /* DF+040 (new RTCM) */
563#define E_WET_MAPPING_FUNCTION_PAR_AW(a) SCALEADDBITS(13, 1000000.0, a - 0.000104, a) /* DF+041 (new RTCM) */
564#define E_WET_MAPPING_FUNCTION_PAR_BW(a) SCALEADDBITS( 6, 250000.0, a - 0.0015, a) /* DF+042 (new RTCM) */
565#define E_WET_MAPPING_FUNCTION_PAR_CW(a) SCALEADDBITS( 5, 2000.0, a - 0.0048, a) /* DF+043 (new RTCM) */
566#define E_HYDROSTATIC_OFFSET(a) SCALEADDBITS(13, 10000.0, a - 2.3, a) /* DF+044 (new RTCM) [m] -2.3 m => [0.1 mm] */
567#define E_HYDROSTATIC_GRADIENT_LATITUDE_DIRECTION(a) SCALEADDBITS(15, 100000.0, a) /* DF+045 (new RTCM) [m] => [0.01 mm] */
568#define E_HYDROSTATIC_GRADIENT_LONGITUDE_DIRECTION(a) SCALEADDBITS(15, 100000.0, a) /* DF+046 (new RTCM) [m] => [0.01 mm] */
569#define E_WET_OFFSET(a) SCALEADDBITS(13, 10000.0, a - 0.252) /* DF+047 (new RTCM) [m] - 0.252 m => [0.1 mm] */
570#define E_WET_GRADIENT_LATITUDE_DIRECTION(a) SCALEADDBITS(15, 100000.0, a) /* DF+048 (new RTCM) */
571#define E_WET_GRADIENT_LONGITUDE_DIRECTION(a) SCALEADDBITS(15, 100000.0, a) /* DF+049 (new RTCM) */
572#define E_HYDTOSTATIC_GRID_POINT_RESIDUAL_LENGTH(a) ADDBITS(4, a) /* DF+050 (new RTCM) */
573#define E_WET_GRID_POINT_RESIDUAL_LENGTH(a) ADDBITS(4. a) /* DF+051 (new RTCM) */
574#define E_HYDTOSTATIC_GRID_POINT_RESIDUAL(a, nbits) SCALEADDBITS(nbits, 10000.0, a) /* DF+052 (new RTCM) size depends on DF+050 */
575#define E_WET_GRID_POINT_RESIDUAL(a, nbits) SCALEADDBITS(nbits, 10000.0, a) /* DF+053 (new RTCM) size depends on DF+051 */
576
577#define E_SSR_EPOCH_TIME(a) ADDBITS(20, a) /* DF*055 (new RTCM) same definition as in IGS-SSR */
578
579/* Ionosphere Messages */
580#define E_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C00(a) SCALEADDBITS(17, 1000.0, a) /* DF+057 (new RTCM) */
581#define E_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C01(a) SCALEADDBITS(18, 10000.0, a) /* DF+058 (new RTCM) */
582#define E_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C10(a) SCALEADDBITS(18, 10000.0, a) /* DF+059 (new RTCM) */
583#define E_ZENITH_MAPPED_STEC_POLYNOMIAL_GRADIENT_INDICATOR(a) ADDBITS(1, a) /* DF+060 (new RTCM) */
584#define E_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL(a) ADDBITS(5, a) /* DF+061 (new RTCM) size required for DF+062 */
585#define E_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL_CORRECTION(a, nbits) ADDBITS(nbits, a) /* DF+062 (new RTCM) nbits depends on DF+061 */
586
587/* Metadata */
588#define E_NUMBER_OF_SSR_MODEL_CORRECTION_ENTRIES(a) ADDBITS(5, a) /* DF+063 (new RTCM) */
589#define E_MODEL_CORRECTION_TYPE_INDICATOR(a) ADDBITS(5, a) /* DF+064 (new RTCM) */
590#define E_MODEL_CORRECTION_APPLICATION_INDICATOR(a) ADDBITS(1, a) /* DF+065 (new RTCM) */
591#define E_NON_DEFAULT_MODEL_CORRECTION_INDICATOR(a) ADDBITS(1, a) /* DF+066 (new RTCM) */
592#define E_NON_DEFAULT_MODEL_CORRECTION_IDENTIFIER(a) ADDBITS(3, a) /* DF+067 (new RTCM) */
593#define E_MODEL_CORRECTION_DATA_IOD_INDICATOR(a) ADDBITS(1, a) /* DF+068 (new RTCM) */
594#define E_MODEL_CORRECTION_DATA_IOD(a) ADDBITS(6, a) /* DF+069 (new RTCM) */
595#define E_ADDITIONAL_MODEL_PARAMETER_INDICATOR(a) ADDBITS(1, a) /* DF+070 (new RTCM) */
596#define E_NUMBER_OF_ADDITIONAL_MODEL_PARAMETER_BITS(a) ADDBITS(8, a) /* DF+071 (new RTCM) */
597#define E_ADDITIONAL_MODEL_PARAMETER_DATA(a, nbits) ADDBITS(nbits, a) /* DF+072 (new RTCM) nbits from DF+071*/
598
599#define E_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL_RESOLUTION_SCALE_FACTOR_EXPONENT(a) GETSSRBITS(3, a) /* DF+073 (new RTCM) */
600
601#define E_QZSS_SATELLITE_ID(a) ADDBITS(6, a) /* DF+080 (new RTCM) */
602
603#define E_GRID_POINT_LATITUDE_MASK(a, nbits) ADDBITS(nbits, a) /* DF+090 (new RTCM) nbits corresponds to DF+031*/
604#define E_GRID_POINT_LONGIITUDE_MASK(a, nbits) ADDBITS(nbits, a) /* DF+091 (new RTCM) nbits corresponds to DF+032*/
605#define E_EXCLUDED_GRID_POINT_MASK(a, nbits) ADDBITS(nbits, a) /* DF+092 (new RTCM) nbits corresponds to DF+090 * DF091 */
606
607#define E_GRID_POINT_OFFSET(a) ADDBITS(12, a) /* DF+094 (new RTCM) */
608
609#define E_PLYNOMIAL_MODEL_INDICATOR(a) ADDBITS(1, a) /* DF+096 (new RTCM) */
610#define E_GNSS_IDENTIFIER(a) ADDBITS(4, a) /* DF+097 (new RTCM) */
611#define E_GNSS_BE_IDENTYFIER(a) ADDBITS(4, a) /* DF+098 (new RTCM) */
612#define E_RESIDUAL_MODEL_IDENTUICATOR(a) ADDBITS(1, a) /* DF+099 (new RTCM) */
613#define E_NUMBER_OF_GRID_POINTS(a) ADDBITS(1, a) /* DF+100 (new RTCM) */
614
615
616static double URAToValue(int ura) {
617 int urac, urav;
618 urac = ura >> 3;
619 urav = ura & 7;
620 if (!ura)
621 return 0;
622 else if (ura == 63)
623 return SSR_MAXURA;
624 return (pow(3, urac) * (1.0 + urav / 4.0) - 1.0) / 1000.0;
625}
626
627static int ValueToURA(double val) {
628 int ura;
629 if (!val)
630 return 0;
631 else if (val > 5.4665)
632 return 63;
633 for (ura = 1; ura < 63 && val > URAToValue(ura); ++ura)
634 ;
635 return ura;
636}
637
638#define DECODESTART \
639 int numbits=0; \
640 uint64_t bitbuffer=0;
641
642#define LOADSSRBITS(a) { \
643 while((a) > numbits) { \
644 if(!size--) return GCOBR_SHORTMESSAGE; \
645 bitbuffer = (bitbuffer<<8)|((unsigned char)*(buffer++)); \
646 numbits += 8; \
647 } \
648}
649
650/* extract bits from data stream
651 b = variable to store result, a = number of bits */
652#define GETSSRBITS(b, a) { \
653 LOADSSRBITS(a) \
654 b = (bitbuffer<<(64-numbits))>>(64-(a)); \
655 numbits -= (a); \
656}
657
658/* extract bits from data stream
659 b = variable to store result, a = number of bits */
660#define GETSSRBITSSIGN(b, a) { \
661 LOADBITS(a) \
662 b = ((int64_t)(bitfield<<(64-numbits)))>>(64-(a)); \
663 numbits -= (a); \
664}
665
666/* extract bits from data stream
667 b = variable to store result, a = number of bits */
668#define GETSSRBITSFACTOR(b, a, c) { \
669 LOADSSRBITS(a) \
670 b = ((bitbuffer<<(64-numbits))>>(64-(a)))*(c); \
671 numbits -= (a); \
672}
673
674/* extract signed floating value from data stream
675 b = variable to store result, a = number of bits */
676#define GETSSRFLOATSIGN(b, a, c) { \
677 LOADSSRBITS(a) \
678 b = ((double)(((int64_t)(bitbuffer<<(64-numbits)))>>(64-(a))))*(c); \
679 numbits -= (a); \
680}
681
682/* extract floating value from data stream
683 b = variable to store result, a = number of bits, c = scale factor */
684#define GETSSRFLOAT(b, a, c) { \
685 LOADSSRBITS(a) \
686 b = ((double)((bitbuffer<<(sizeof(bitbuffer)*8-numbits))>>(sizeof(bitbuffer)*8-(a))))*(c); \
687 numbits -= (a); \
688}
689
690#define SKIPSSRBITS(b) { LOADSSRBITS(b) numbits -= (b); }
691
692/* GPS macros also used for other systems when matching! */
693
694#define D_HEADER(a) GETSSRBITS(a, 8)
695#define D_RESERVEDH(a) GETSSRBITS(a, 6)
696#define D_SIZE(a) GETSSRBITS(a, 10)
697
698/* GNSS macros - Header part */
699#define D_RTCM_MESSAGE_NUMBER(a) GETSSRBITS(a, 12) /* DF002 */
700#define D_IGS_MESSAGE_NUMBER(a) GETSSRBITS(a, 8) /* IDF002 */
701#define D_IGS_SSR_VERSION(a) GETSSRBITS(a, 3) /* IDF001 */
702
703#define D_GPS_EPOCH_TIME(a) GETSSRBITS(a, 20) /* IDF003 DF385 DF458 DF460 DF465*/
704#define D_GLONASS_EPOCH_TIME(a) GETSSRBITS(a, 17) /* DF386 */
705#define D_GPS_EPOCH_TIME_CHECK(a, b) {unsigned int temp; GETSSRBITS(temp, 20) if(b && a != temp) return GCOBR_TIMEMISMATCH; a = temp;}
706#define D_GLONASS_EPOCH_TIME_CHECK(a, b) {unsigned int temp; GETSSRBITS(temp, 17) if(b && a != temp) return GCOBR_TIMEMISMATCH; a = temp;}
707
708#define D_SSR_UPDATE_INTERVAL(a) GETSSRBITS(a, 4) /* DF391, IDF004 */
709#define D_MULTIPLE_MESSAGE_INDICATOR(a) GETSSRBITS(a, 1) /* DF388, IDF005 */
710#define D_SSR_IOD(a) GETSSRBITS(a, 4) /* DF413, IDF007 */
711#define D_SSR_PROVIDER_ID(a) GETSSRBITS(a, 16) /* DF414, IDF008 */
712#define D_SSR_SOLUTION_ID(a) GETSSRBITS(a, 4) /* DF415, IDF009 */
713#define D_SATELLITE_REFERENCE_DATUM(a) GETSSRBITS(a, 1) /* DF375, IDF006 */
714#define D_NO_OF_SATELLITES(a) GETSSRBITS(a, 6) /* DF387, IDF010 */
715
716/* GNSS macros - Satellite specific part */
717#define D_GPS_SATELLITE_ID(a) GETSSRBITS(a, 6) /* IDF011 DF068 DF488 */
718#define D_GLONASS_SATELLITE_ID_OLD(a) GETSSRBITS(a, 5) /* DF384 (old RTCM)*/
719#define D_QZSS_SATELLITE_ID_OLD(a) GETSSRBITS(a, 4) /* DF249 */
720
721#define D_GPS_IODE(a) GETSSRBITS(a, 8) /* DF071, DF467, IDF012 */
722#define D_GLONASS_IOD(a) GETSSRBITS(a, 8) /* DF392 */
723#define D_GALILEO_IOD(a) GETSSRBITS(a, 10) /* DF459 */
724
725#define D_SBAS_T0MOD(a) GETSSRBITSFACTOR(a, 9, 16) /* DF468 */
726#define D_SBAS_IODCRC(a) GETSSRBITS(a, 24) /* DF469 */
727#define D_BDS_TOEMOD(a) GETSSRBITSFACTOR(a, 10, 8) /* DF470 */
728
729/* Orbit Corrections */
730#define D_DELTA_RADIAL(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF365, IDF013 */
731#define D_DELTA_ALONG_TRACK(a) GETSSRFLOATSIGN(a, 20, 1/2500.0) /* DF366, IDF014 */
732#define D_DELTA_CROSS_TRACK(a) GETSSRFLOATSIGN(a, 20, 1/2500.0) /* DF367, IDF015 */
733#define D_DOT_DELTA_RADIAL(a) GETSSRFLOATSIGN(a, 21, 1/1000000.0) /* DF368, IDF016 */
734#define D_DOT_DELTA_ALONG_TRACK(a) GETSSRFLOATSIGN(a, 19, 1/250000.0) /* DF369, IDF017 */
735#define D_DOT_DELTA_CROSS_TRACK(a) GETSSRFLOATSIGN(a, 19, 1/250000.0) /* DF370, IDF018 */
736
737/* Clock Corrections */
738#define D_DELTA_CLOCK_C0(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF376, IDF019 */
739#define D_DELTA_CLOCK_C1(a) GETSSRFLOATSIGN(a, 21, 1/1000000.0) /* DF377, IDF020 */
740#define D_DELTA_CLOCK_C2(a) GETSSRFLOATSIGN(a, 27, 1/50000000.0) /* DF378, IDF021 */
741#define D_HR_CLOCK_CORRECTION(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF390, IDF022 */
742
743/* Biases */
744#define D_NO_OF_BIASES(a) GETSSRBITS(a, 5) /* DF479 DF379 IDF023 */
745#define D_GNSS_SIGNAL_IDENTIFIER(a) GETSSRBITS(a, 5) /* DF460 IDF024 */
746#define D_CODE_BIAS(a) GETSSRFLOATSIGN(a, 14, 1/100.0) /* DF383, IDF025 */
747#define D_YAW_ANGLE(a) GETSSRFLOAT (a, 9, MPI/256.0) /* DF480, IDF026 */
748#define D_YAW_RATE(a) GETSSRFLOATSIGN(a, 8, MPI/8192.0) /* DF481, IDF027 */
749#define D_PHASE_BIAS_CORRECTION(a) GETSSRFLOATSIGN(a, 20, 1/10000.) /* DF482, IDF028 */
750
751/* Phase specific part of GNSS phase bias message */
752#define D_INTEGER_INDICATOR(a) GETSSRBITS(a, 1) /* DF483, IDF029 */
753#define D_WIDE_LANE_INDICATOR(a) GETSSRBITS(a, 2) /* DF484, IDF030 */
754#define D_DISCONTINUITY_COUNTER(a) GETSSRBITS(a, 4) /* DF485, IDF031 */
755#define D_DISPERSIVE_BIAS_INDICATOR(a) GETSSRBITS(a, 1) /* DF486 (old RTCM), IDF032 */
756#define D_YAW_INFO_INDICATOR(a) GETSSRBITS(a, 1) /* DF486 (new RTCM) */
757#define D_MW_CONSISTENCY_INDICATOR(a) GETSSRBITS(a, 1) /* DF487, IDF033 */
758
759#define D_EXTENDED_PHASE_BIAS_ID(a) GETSSRBITS(a, 4) /* DF+002 (new RTCM)*/
760
761#define D_GLONASS_SATELLITE_ID(a) GETSSRBITS(a, 6) /* DF+003 (new RTCM)*/
762
763/* URA */
764#define D_SSR_URA(a) {int temp; GETSSRBITS(temp, 6) a = URAToValue(temp);} /* DF389, IDF034 */
765
766/* Ionosphere */
767#define D_NO_IONO_LAYERS(a) {unsigned int temp; GETSSRBITS(temp, 2) a = temp+1;} /* DF472, IDF035 */
768#define D_IONO_HEIGHT(a) GETSSRFLOAT(a, 8, 10000.0) /* DF473, IDF036 */
769#define D_IONO_DEGREE(a) {unsigned int temp; GETSSRBITS(temp, 4) a = temp+1;} /* DF474, IDF037 */
770#define D_IONO_ORDER(a) {unsigned int temp; GETSSRBITS(temp, 4) a = temp+1;} /* DF475, IDF038 */
771#define D_IONO_COEFF_C(a) GETSSRFLOATSIGN(a, 16, 1/200.0) /* DF476, IDF039 */
772#define D_IONO_COEFF_S(a) GETSSRFLOATSIGN(a, 16, 1/200.0) /* DF477, IDF040 */
773#define D_VTEC_QUALITY_INDICATOR(a) GETSSRFLOAT(a, 9, 1/20.0) /* DF478, IDF041 */
774
775/* Antenna Information*/
776#define D_SATELLITE_ANTENNA_IOD(a) GETSSRBITS(a, 6) /* DF+010 (new RTCM) */
777#define D_PHASE_CENTER_INFO_INDICATORD(a) GETSSRBITS(a, 1) /* DF+011 (new RTCM) */
778#define D_GROUP_DELAY_INFO_INDICATOR(a) GETSSRBITS(a, 1) /* DF+012 (new RTCM) */
779#define D_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a) GETSSRBITS(a, 1) /* DF+013 (new RTCM) */
780#define D_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) GETSSRBITS(a, 4) /* DF+015 (new RTCM) required to extend DF+021*/
781#define D_SATELLITE_SET_INDICATOR(a) GETSSRBITS(a, 1) /* DF+016 (new RTCM) */
782#define D_FREQUENCY_SET_INDICATOR (a) GETSSRBITS(a, 1) /* DF+017 (new RTCM) */
783#define D_GNSS_FREQUENCY_MASK (a) GETSSRBITS(a, 6) /* DF+018 (new RTCM) */
784#define D_NADIR_CORR_INDICATOR(a) GETSSRBITS(a, 1) /* DF+019 (new RTCM) */
785#define D_NADIR_CORRECTION(a) GETSSRFLOATSIGN(a, 12, 1/1000.0) /* DF+020 (new RTCM) in [m] */
786#define D_NADIR_ANGLE_DEPENDENT_CORRECTION(a, nbits) GETSSRFLOATSIGN(a, 3 + nbits, 1/1000.0) /* DF+021 (new RTCM) in [m]; can be extended up to 15/18 Bits from DF+015*/
787/*
788//Decoding
789#define D_NEW_PAR(a, nbits) GETSSRBITS(a, nbits) //called as D_NEW_PAR(co->NewPar, co->NewParNumBits)
790#define D_NEW_PAR_SCALE(a, nbits) GETSSRFLOAT(a, nbits, 10000.0) //called as D_NEW_PAR(co->NewPar, co->NewParNumBits)
791*/
792/* Grid Messages */
793#define D_GRID_ID(a) GETSSRBITS(a, 10) /* DF+022 (new RTCM) */
794#define D_GRID_TYPE(a) GETSSRBITS(a, 3) /* DF+023 (new RTCM) */
795#define D_LATITUDE_OF_REFERENCE_POINT(a) GETSSRFLOATSIGN(a, 18, 1/1000.0) /* DF+024 (new RTCM) */
796#define D_LONGITUDE_OF_REFERENCE_POINT(a) GETSSRFLOATSIGN(a, 19, 1/1000.0) /* DF+025 (new RTCM) */
797#define D_ELLIPSOIDAL_HEIGHT_OF_REFERENCE_POINT(a) {unsigned int temp; GETSSRFLOAT(temp, 10, 12.5) a = temp - 1000.0;} /* DF+026 (new RTCM) */
798#define D_NUMNBER_OF_RELATIVE_POINTS(a) GETSSRBITS(a, 8) /* DF+027 (new RTCM) */
799#define D_RELATIVE_LATITUDE(a) GETSSRFLOATSIGN(a, 13, 1/1000.0) /* DF+028 (new RTCM) */
800#define D_RELATIVE_LONGITUDE(a) GETSSRFLOATSIGN(a, 14, 1/1000.0) /* DF+029 (new RTCM) */
801#define D_RELATIVE_HIGHT(a) GETSSRFLOATSIGN(a, 9, 12.5) /* DF+030 (new RTCM) */
802#define D_NUMBER_OF_POINTS_IN_LATITIDE_DIRECTION(a) GETSSRBITS(a, 6) /* DF+031 (new RTCM) */
803#define D_NUMBER_OF_POINTS_IN_LONGITUDE_DIRECTION(a) GETSSRBITS(a, 6) /* DF+032 (new RTCM) */
804#define D_GRID_STEP_SIZE_IN_LATITIDE_DIRECTION(a) GETSSRFLOAT(a, 9, 1/100.0) /* DF+033 (new RTCM) */
805#define D_GRID_STEP_SIZE_IN_LONGITUDE_DIRECTION(a) GETSSRFLOAT(a, 10, 1/100.0) /* DF+034 (new RTCM) */
806#define D_GRID_MASK_AVAILABILITY_FLAG(a) GETSSRBITS(a, 1) /* DF+035 (new RTCM) */
807#define D_GRID_MASK(a, nbits) GETSSRBITS(a, nbits) /* DF+036 (new RTCM) nbits from DF+031 or DF+032 */
808
809/* Troposphere Messages */
810#define D_HYDROSTATIC_MAPPING_FUNCTION_PAR_AH(a) {unsigned int dah; GETSSRFLOATSIGN(dah, 11, 2.5/10000000.0) a = dah + 0.00118;} /* DF+038 (new RTCM) */
811#define D_HYDROSTATIC_MAPPING_FUNCTION_PAR_BH(a) {unsigned int dbh; GETSSRFLOATSIGN(dbh, 9, 5/1000000.0) a = dbh + 0.00298;} /* DF+039 (new RTCM) */
812#define D_HYDROSTATIC_MAPPING_FUNCTION_PAR_CH(a) {unsigned int dch; GETSSRFLOATSIGN(dch, 9, 2/10000.0) a = dch + 0.0682;} /* DF+040 (new RTCM) */
813#define D_WET_MAPPING_FUNCTION_PAR_AW(a) {unsigned int daw; GETSSRFLOATSIGN(daw, 13, 1/1000000.0) a = daw + 0.000104;} /* DF+041 (new RTCM) */
814#define D_WET_MAPPING_FUNCTION_PAR_BW(a) {unsigned int dbw; GETSSRFLOATSIGN(dbw, 6, 2.5/100000.0) a = dbw + 0.0015;} /* DF+042 (new RTCM) */
815#define D_WET_MAPPING_FUNCTION_PAR_CW(a) {unsigned int dcw; GETSSRFLOATSIGN(dcw, 5, 2/1000.0 ) a = dcw + 0.0048;} /* DF+043 (new RTCM) */
816#define D_HYDROSTATIC_OFFSET(a) {unsigned int dho; GETSSRFLOATSIGN(dho, 13, 1/10000.0) a = dho + 2.3 } /* DF+044 (new RTCM) [0.1 mm] => [m] +2.3 m */
817#define D_HYDROSTATIC_GRADIENT_LATITUDE_DIRECTION(a) GETSSRFLOATSIGN(a, 15, 1/100000.0) /* DF+045 (new RTCM) [0.01 mm] => [m]*/
818#define D_HYDROSTATIC_GRADIENT_LONGITUDE_DIRECTION(a) GETSSRFLOATSIGN(a, 15, 1/100000.0) /* DF+046 (new RTCM) [0.01 mm] => [m]*/
819#define D_WET_OFFSET(a) {unsigned int dwo; GETSSRFLOATSIGN(dwo, 13, 1/10000.0) a = dwo + 0.252 }/* DF+047 (new RTCM) [0.1 mm] => [m] +0.252 m */
820#define D_WET_GRADIENT_LATITUDE_DIRECTION(a) GETSSRFLOATSIGN(a, 15, 1/100000.0) /* DF+048 (new RTCM) */
821#define D_WET_GRADIENT_LONGITUDE_DIRECTION(a) GETSSRFLOATSIGN(a, 15, 1/100000.0) /* DF+049 (new RTCM) */
822#define D_HYDTOSTATIC_GRID_POINT_RESIDUAL_LENGTH(a) GETSSRBITS(a, 4) /* DF+050 (new RTCM) */
823#define D_WET_GRID_POINT_RESIDUAL_LENGTH(a) GETSSRBITS(a, 4) /* DF+051 (new RTCM) */
824#define D_HYDTOSTATIC_GRID_POINT_RESIDUAL(a, nbits) GETSSRFLOATSIGN(a, nbits, 1/10000.0) /* DF+052 (new RTCM) size depends on DF+050 */
825#define D_WET_GRID_POINT_RESIDUAL(a, nbits) GETSSRFLOATSIGN(a, nbits, 1/10000.0) /* DF+053 (new RTCM) size depends on DF+051 */
826
827#define D_SSR_EPOCH_TIME(a) GETSSRBITS(a, 20) /* DF*055 (new RTCM) same definition as in IGS-SSR */
828
829/* Ionosphere Messages */
830#define D_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C00(a) GETSSRFLOATSIGN(a, 17, 1/1000.0) /* DF+057 (new RTCM) */
831#define D_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C01(a) GETSSRFLOATSIGN(a, 18, 1/10000.0) /* DF+058 (new RTCM) */
832#define D_ZENITH_MAPPED_STEC_POLYNOM_COEFF_C10(a) GETSSRFLOATSIGN(a, 18, 1/10000.0) /* DF+059 (new RTCM) */
833#define D_ZENITH_MAPPED_STEC_POLYNOMIAL_GRADIENT_INDICATOR(a) GETSSRBITS(a, 1) /* DF+060 (new RTCM) */
834#define D_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL(a) GETSSRBITS(a, 5) /* DF+061 (new RTCM) size required for DF+062 */
835#define D_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL_CORRECTION(a, nbits) GETSSRBITSSIGN(a, nbits) /* DF+062 (new RTCM) nbits depends on DF+061 */
836
837/* Metadata */
838#define D_NUMBER_OF_SSR_MODEL_CORRECTION_ENTRIES(a) GETSSRBITS(a, 5) /* DF+063 (new RTCM) */
839#define D_MODEL_CORRECTION_TYPE_INDICATOR(a) GETSSRBITS(a, 5) /* DF+064 (new RTCM) */
840#define D_MODEL_CORRECTION_APPLICATION_INDICATOR(a) GETSSRBITS(a, 1) /* DF+065 (new RTCM) */
841#define D_NON_DEFAULT_MODEL_CORRECTION_INDICATOR(a) GETSSRBITS(a, 1) /* DF+066 (new RTCM) */
842#define D_NON_DEFAULT_MODEL_CORRECTION_IDENTIFIER(a) GETSSRBITS(a, 3) /* DF+067 (new RTCM) */
843#define D_MODEL_CORRECTION_DATA_IOD_INDICATOR(a) GETSSRBITS(a, 1) /* DF+068 (new RTCM) */
844#define D_MODEL_CORRECTION_DATA_IOD(a) GETSSRBITS(a, 6) /* DF+069 (new RTCM) */
845#define D_ADDITIONAL_MODEL_PARAMETER_INDICATOR(a) GETSSRBITS(a, 1) /* DF+070 (new RTCM) */
846#define D_NUMBER_OF_ADDITIONAL_MODEL_PARAMETER_BITS(a) GETSSRBITS(a, 8) /* DF+071 (new RTCM) */
847#define D_ADDITIONAL_MODEL_PARAMETER_DATA(a, nbits) GETSSRBITS(a, nbits) /* DF+072 (new RTCM) nbits from DF+071*/
848
849#define D_ZENITH_MAPPED_STEC_GRID_POINT_RESIDUAL_RESOLUTION_SCALE_FACTOR_EXPONENT(a) GETSSRBITS(a, 3) /* DF+073 (new RTCM) */
850
851#define D_QZSS_SATELLITE_ID(a) GETSSRBITS(a, 6) /* DF+080 (new RTCM) */
852
853#define D_GRID_POINT_LATITUDE_MASK(a, nbits) GETSSRBITS(a, nbits) /* DF+090 (new RTCM) nbits corresponds to DF+031*/
854#define D_GRID_POINT_LONGIITUDE_MASK(a, nbits) GETSSRBITS(a, nbits) /* DF+091 (new RTCM) nbits corresponds to DF+032*/
855#define D_EXCLUDED_GRID_POINT_MASK(a, nbits) GETSSRBITS(a, nbits) /* DF+092 (new RTCM) nbits corresponds to DF+090 * DF091 */
856
857#define D_GRID_POINT_OFFSET(a) GETSSRBITS(a, 12) /* DF+094 (new RTCM) */
858
859#define D_PLYNOMIAL_MODEL_INDICATOR(a) GETSSRBITS(a, 1) /* DF+096 (new RTCM) */
860#define D_GNSS_IDENTIFIER(a) GETSSRBITS(a, 4) /* DF+097 (new RTCM) */
861#define D_GNSS_BE_IDENTYFIER(a) GETSSRBITS(a, 4) /* DF+098 (new RTCM) */
862#define D_RESIDUAL_MODEL_IDENTUICATOR(a) GETSSRBITS(a, 1) /* DF+099 (new RTCM) */
863#define D_NUMBER_OF_GRID_POINTS(a) GETSSRBITS(a, 1) /* DF+100 (new RTCM) */
864
865};
866
867#endif /* RTCM3_CLOCK_ORBIT_H */
Note: See TracBrowser for help on using the repository browser.