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

Last change on this file since 10533 was 10533, checked in by stuerze, 10 months ago

Service and RTCM CRS encoding and decoding as well as Helmert parameter decoding added + some re-organisation

  • Property svn:executable set to *
File size: 25.3 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 "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 setVtecType() = 0;
104 virtual void setCodeType() = 0;
105
106 typedef unsigned int SatelliteReferenceDatum;
107 SatelliteReferenceDatum DATUM_ITRF;
108 SatelliteReferenceDatum DATUM_LOCAL;
109
110 typedef unsigned int CorBase;
111 CorBase COBBASE_GPS;
112 CorBase COBBASE_GLONASS;
113 CorBase COBBASE_GALILEO;
114 CorBase COBBASE_QZSS;
115 CorBase COBBASE_BDS;
116 CorBase COBBASE_SBAS;
117 CorBase COBBASE_NUM;
118
119 typedef unsigned int CorOffset;
120 CorOffset COBOFS_ORBIT;
121 CorOffset COBOFS_CLOCK;
122 CorOffset COBOFS_COMBINED;
123 CorOffset COBOFS_HR;
124 CorOffset COBOFS_CBIAS;
125 CorOffset COBOFS_PBIAS;
126 CorOffset COBOFS_URA;
127 CorOffset COBOFS_NUM;
128
129 typedef unsigned int ClockOrbitType;
130 ClockOrbitType COTYPE_GPSORBIT;
131 ClockOrbitType COTYPE_GPSCLOCK;
132 ClockOrbitType COTYPE_GPSCOMBINED;
133 ClockOrbitType COTYPE_GPSHR;
134 ClockOrbitType COTYPE_GPSURA;
135
136 ClockOrbitType COTYPE_GLONASSORBIT;
137 ClockOrbitType COTYPE_GLONASSCLOCK;
138 ClockOrbitType COTYPE_GLONASSCOMBINED;
139 ClockOrbitType COTYPE_GLONASSHR;
140 ClockOrbitType COTYPE_GLONASSURA;
141
142 ClockOrbitType COTYPE_GALILEOORBIT;
143 ClockOrbitType COTYPE_GALILEOCLOCK;
144 ClockOrbitType COTYPE_GALILEOCOMBINED;
145 ClockOrbitType COTYPE_GALILEOHR;
146 ClockOrbitType COTYPE_GALILEOURA;
147
148 ClockOrbitType COTYPE_QZSSORBIT;
149 ClockOrbitType COTYPE_QZSSCLOCK;
150 ClockOrbitType COTYPE_QZSSCOMBINED;
151 ClockOrbitType COTYPE_QZSSHR;
152 ClockOrbitType COTYPE_QZSSURA;
153
154 ClockOrbitType COTYPE_SBASORBIT;
155 ClockOrbitType COTYPE_SBASCLOCK;
156 ClockOrbitType COTYPE_SBASCOMBINED;
157 ClockOrbitType COTYPE_SBASHR;
158 ClockOrbitType COTYPE_SBASURA;
159
160 ClockOrbitType COTYPE_BDSORBIT;
161 ClockOrbitType COTYPE_BDSCLOCK;
162 ClockOrbitType COTYPE_BDSCOMBINED;
163 ClockOrbitType COTYPE_BDSHR;
164 ClockOrbitType COTYPE_BDSURA;
165
166 ClockOrbitType COTYPE_AUTO;
167
168 typedef unsigned int CodeBiasType;
169 CodeBiasType CBTYPE_GPS;
170 CodeBiasType CBTYPE_GLONASS;
171 CodeBiasType CBTYPE_GALILEO;
172 CodeBiasType CBTYPE_QZSS;
173 CodeBiasType CBTYPE_SBAS;
174 CodeBiasType CBTYPE_BDS;
175 CodeBiasType CBTYPE_AUTO;
176
177 typedef unsigned int PhaseBiasType;
178 PhaseBiasType PBTYPE_BASE;
179 PhaseBiasType PBTYPE_GPS;
180 PhaseBiasType PBTYPE_GLONASS;
181 PhaseBiasType PBTYPE_GALILEO;
182 PhaseBiasType PBTYPE_QZSS;
183 PhaseBiasType PBTYPE_SBAS;
184 PhaseBiasType PBTYPE_BDS;
185 PhaseBiasType PBTYPE_AUTO;
186
187 typedef unsigned int VtecType;
188 VtecType VTEC_BASE;
189
190 typedef unsigned int CodeType;
191 CodeType RESERVED;
192 CodeType CODETYPE_GPS_L1_CA;
193 CodeType CODETYPE_GPS_L1_P;
194 CodeType CODETYPE_GPS_L1_Z;
195 CodeType CODETYPE_GPS_L1C_D;
196 CodeType CODETYPE_GPS_L1C_P;
197 CodeType CODETYPE_GPS_L1C_DP;
198 CodeType CODETYPE_GPS_L2_CA;
199 CodeType CODETYPE_GPS_SEMI_CODELESS;
200 CodeType CODETYPE_GPS_L2C_M;
201 CodeType CODETYPE_GPS_L2C_L;
202 CodeType CODETYPE_GPS_L2C_ML;
203 CodeType CODETYPE_GPS_L2_P;
204 CodeType CODETYPE_GPS_L2_Z;
205 CodeType CODETYPE_GPS_L5_I;
206 CodeType CODETYPE_GPS_L5_Q;
207 CodeType CODETYPE_GPS_L5_IQ;
208
209 CodeType CODETYPE_GLONASS_L1_CA;
210 CodeType CODETYPE_GLONASS_L1_P;
211 CodeType CODETYPE_GLONASS_L2_CA;
212 CodeType CODETYPE_GLONASS_L2_P;
213 CodeType CODETYPE_GLONASS_L1a_OCd;
214 CodeType CODETYPE_GLONASS_L1a_OCp;
215 CodeType CODETYPE_GLONASS_L1a_OCdp;
216 CodeType CODETYPE_GLONASS_L2a_CSI;
217 CodeType CODETYPE_GLONASS_L2a_OCp;
218 CodeType CODETYPE_GLONASS_L2a_CSIOCp;
219 CodeType CODETYPE_GLONASS_L3_I;
220 CodeType CODETYPE_GLONASS_L3_Q;
221 CodeType CODETYPE_GLONASS_L3_IQ;
222
223 CodeType CODETYPE_GALILEO_E1_A;
224 CodeType CODETYPE_GALILEO_E1_B;
225 CodeType CODETYPE_GALILEO_E1_C;
226 CodeType CODETYPE_GALILEO_E1_BC;
227 CodeType CODETYPE_GALILEO_E1_ABC;
228 CodeType CODETYPE_GALILEO_E5A_I;
229 CodeType CODETYPE_GALILEO_E5A_Q;
230 CodeType CODETYPE_GALILEO_E5A_IQ;
231 CodeType CODETYPE_GALILEO_E5B_I;
232 CodeType CODETYPE_GALILEO_E5B_Q;
233 CodeType CODETYPE_GALILEO_E5B_IQ;
234 CodeType CODETYPE_GALILEO_E5_I;
235 CodeType CODETYPE_GALILEO_E5_Q;
236 CodeType CODETYPE_GALILEO_E5_IQ;
237 CodeType CODETYPE_GALILEO_E6_A;
238 CodeType CODETYPE_GALILEO_E6_B;
239 CodeType CODETYPE_GALILEO_E6_C;
240 CodeType CODETYPE_GALILEO_E6_BC;
241 CodeType CODETYPE_GALILEO_E6_ABC;
242
243 CodeType CODETYPE_QZSS_L1_CA;
244 CodeType CODETYPE_QZSS_L1C_D;
245 CodeType CODETYPE_QZSS_L1C_P;
246 CodeType CODETYPE_QZSS_L2C_M;
247 CodeType CODETYPE_QZSS_L2C_L;
248 CodeType CODETYPE_QZSS_L2C_ML;
249 CodeType CODETYPE_QZSS_L5_I;
250 CodeType CODETYPE_QZSS_L5_Q;
251 CodeType CODETYPE_QZSS_L5_IQ;
252 CodeType CODETYPE_QZSS_L6_D;
253 CodeType CODETYPE_QZSS_L6_P;
254 CodeType CODETYPE_QZSS_L6_DP;
255 CodeType CODETYPE_QZSS_L1C_DP;
256 CodeType CODETYPE_QZSS_L1_S;
257 CodeType CODETYPE_QZSS_L5_D;
258 CodeType CODETYPE_QZSS_L5_P;
259 CodeType CODETYPE_QZSS_L5_DP;
260 CodeType CODETYPE_QZSS_L6_E;
261 CodeType CODETYPE_QZSS_L6_DE;
262
263 CodeType CODETYPE_SBAS_L1_CA;
264 CodeType CODETYPE_SBAS_L5_I;
265 CodeType CODETYPE_SBAS_L5_Q;
266 CodeType CODETYPE_SBAS_L5_IQ;
267
268 CodeType CODETYPE_BDS_B1_I;
269 CodeType CODETYPE_BDS_B1_Q;
270 CodeType CODETYPE_BDS_B1_IQ;
271 CodeType CODETYPE_BDS_B3_I;
272 CodeType CODETYPE_BDS_B3_Q;
273 CodeType CODETYPE_BDS_B3_IQ;
274 CodeType CODETYPE_BDS_B2_I;
275 CodeType CODETYPE_BDS_B2_Q;
276 CodeType CODETYPE_BDS_B2_IQ;
277 CodeType CODETYPE_BDS_B1a_D;
278 CodeType CODETYPE_BDS_B1a_P;
279 CodeType CODETYPE_BDS_B1a_DP;
280 CodeType CODETYPE_BDS_B2a_D;
281 CodeType CODETYPE_BDS_B2a_P;
282 CodeType CODETYPE_BDS_B2a_DP;
283 CodeType CODETYPE_BDS_B1_A;
284 CodeType CODETYPE_BDS_B3_A;
285
286 QList<CorBase> corbase;
287 QList<unsigned int> satoffset;
288
289
290#define SSR_MAXURA 5.5 /* > 5466.5mm in meter */
291#define COBOFS_MAXNUM 7
292
293 /* satellite system data is stored with offset CLOCKORBIT_OFFSET...
294 in the data structures. So first GLONASS satellite is at
295 xxx->Sat[CLOCKORBIT_OFFSETGLONASS], first GPS satellite is
296 xxx->Sat[CLOCKORBIT_OFFSETGPS]. */
297
298 struct ClockOrbit {
299 ClockOrbitType messageType;
300 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
301 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
302 unsigned int Supplied[COBOFS_MAXNUM]; /* boolean */
303 unsigned int SSRIOD;
304 unsigned int SSRProviderID;
305 unsigned int SSRSolutionID;
306 unsigned int UpdateInterval;
307 SatelliteReferenceDatum SatRefDatum;
308 struct SatData {
309 unsigned int ID; /* all */
310 unsigned int IOD; /* all */
311 unsigned int toe; /* SBAS, BDS */
312 double UserRangeAccuracy; /* accuracy values in [m] */
313 double hrclock;
314 struct OrbitPart {
315 double DeltaRadial; /* m */
316 double DeltaAlongTrack; /* m */
317 double DeltaCrossTrack; /* m */
318 double DotDeltaRadial; /* m/s */
319 double DotDeltaAlongTrack; /* m/s */
320 double DotDeltaCrossTrack; /* m/s */
321 } Orbit;
322 struct ClockPart {
323 double DeltaA0; /* m */
324 double DeltaA1; /* m/s */
325 double DeltaA2; /* m/ss */
326 } Clock;
327 } Sat[CLOCKORBIT_COUNTSAT];
328 };
329
330 struct CodeBias {
331 CodeBiasType messageType;
332 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
333 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
334 unsigned int UpdateInterval;
335 unsigned int SSRIOD;
336 unsigned int SSRProviderID;
337 unsigned int SSRSolutionID;
338 struct BiasSat {
339 unsigned int ID; /* all */
340 unsigned int NumberOfCodeBiases;
341 struct CodeBiasEntry {
342 CodeType Type;
343 float Bias; /* m */
344 } Biases[CLOCKORBIT_NUMBIAS];
345 } Sat[CLOCKORBIT_COUNTSAT];
346 };
347
348 struct PhaseBias {
349 PhaseBiasType messageType;
350 unsigned int EpochTime[CLOCKORBIT_SATNUM]; /* 0 .. system specific maximum */
351 unsigned int NumberOfSat[CLOCKORBIT_SATNUM]; /* 0 .. CLOCKORBIT_NUM... */
352 unsigned int UpdateInterval;
353 unsigned int SSRIOD;
354 unsigned int SSRProviderID;
355 unsigned int SSRSolutionID;
356 unsigned int DispersiveBiasConsistencyIndicator;
357 unsigned int MWConsistencyIndicator;
358 struct PhaseBiasSat {
359 unsigned int ID; /* all */
360 unsigned int NumberOfPhaseBiases;
361 double YawAngle; /* radiant */
362 double YawRate; /* radiant/s */
363 struct PhaseBiasEntry {
364 CodeType Type;
365 unsigned int SignalIntegerIndicator;
366 unsigned int SignalsWideLaneIntegerIndicator;
367 unsigned int SignalDiscontinuityCounter;
368 float Bias; /* m */
369 } Biases[CLOCKORBIT_NUMBIAS];
370 } Sat[CLOCKORBIT_COUNTSAT];
371 };
372
373 struct VTEC {
374 unsigned int EpochTime; /* GPS */
375 unsigned int UpdateInterval;
376 unsigned int SSRIOD;
377 unsigned int SSRProviderID;
378 unsigned int SSRSolutionID;
379 unsigned int NumLayers; /* 1-4 */
380 double Quality;
381 struct IonoLayers {
382 double Height; /* m */
383 unsigned int Degree; /* 1-16 */
384 unsigned int Order; /* 1-16 */
385 double Sinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
386 double Cosinus[CLOCKORBIT_MAXIONODEGREE][CLOCKORBIT_MAXIONOORDER];
387 } Layers[CLOCKORBIT_NUMIONOLAYERS];
388 };
389
390
391 /* return size of resulting data or 0 in case of an error */
392 virtual size_t MakeClockOrbit(const struct ClockOrbit *co, CodeType type,
393 int moremessagesfollow, char *buffer, size_t size) = 0;
394 virtual size_t MakeCodeBias(const struct CodeBias *b, CodeBiasType type,
395 int moremessagesfollow, char *buffer, size_t size) = 0;
396 virtual size_t MakePhaseBias(const struct PhaseBias *b, CodeBiasType type,
397 int moremessagesfollow, char *buffer, size_t size) = 0;
398 virtual size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow,
399 char *buffer, size_t size) = 0;
400
401 /* buffer should point to a RTCM3 block */
402 virtual enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *b,
403 struct VTEC *v, struct PhaseBias *pb, const char *buffer, size_t size,
404 int *bytesused) = 0;
405
406 virtual std::string codeTypeToRnxType(char system, CodeType type) = 0;
407 virtual CodeType rnxTypeToCodeType(char system, std::string type) = 0;
408
409#define STOREBITS \
410 while(numbits >= 8) { \
411 if(!size) return 0; \
412 *(buffer++) = bitbuffer>>(numbits-8); \
413 numbits -= 8; \
414 ++ressize; \
415 --size; \
416 }
417
418#define ADDBITS(a, b) { \
419 bitbuffer = (bitbuffer<<(a))|((b)&((1<<a)-1)); \
420 numbits += (a); \
421 STOREBITS \
422 }
423
424#define STARTDATA \
425 size_t ressize=0; \
426 char *blockstart=0; \
427 int numbits=0; \
428 uint64_t bitbuffer=0;
429
430#define INITBLOCK \
431 numbits = 0; \
432 blockstart = buffer; \
433 ADDBITS(8, 0xD3) \
434 ADDBITS(6, 0) \
435 ADDBITS(10, 0)
436
437#define ENDBLOCK \
438 if(numbits) { ADDBITS((8-numbits), 0) } { \
439 int len = buffer-blockstart-3; \
440 blockstart[1] |= len>>8; \
441 blockstart[2] = len; \
442 if(len > 1023) \
443 return 0; \
444 len = CRC24(len+3, (const unsigned char *) blockstart); \
445 ADDBITS(24, len) \
446 }
447
448#define SCALEADDBITS(a, b, c) ADDBITS(a, (int64_t)(c > 0 ? b*c+0.5 : b*c-0.5))
449
450#define MPI 3.141592653589793
451
452/* GNSS macros - Header part */
453#define T_RTCM_MESSAGE_NUMBER(a) ADDBITS(12, a) /* DF002 */
454#define T_IGS_SSR_VERSION(a) ADDBITS( 3, a) /* IDF001 */
455#define T_IGS_MESSAGE_NUMBER(a) ADDBITS( 8, a) /* IDF002 */
456#define T_SSR_EPOCH_TIME(a) ADDBITS(20, a) /* DF??? IDF003 */ //T_GPS_EPOCH_TIME(a)
457#define T_GLONASS_EPOCH_TIME(a) ADDBITS(17, a) /* DF */
458
459#define T_SSR_UPDATE_INTERVAL(a) ADDBITS( 4, a) /* DF391, IDF004 */
460#define T_MULTIPLE_MESSAGE_INDICATOR(a) ADDBITS( 1, a) /* DF388, IDF005 */
461#define T_SSR_IOD(a) ADDBITS( 4, a) /* DF413, IDF007 */
462#define T_SSR_PROVIDER_ID(a) ADDBITS(16, a) /* DF414, IDF008 */
463#define T_SSR_SOLUTION_ID(a) ADDBITS( 4, a) /* DF415, IDF009 */
464#define T_SATELLITE_REFERENCE_DATUM(a) ADDBITS( 1, a) /* DF375, IDF006 */
465#define T_NO_OF_SATELLITES(a) ADDBITS( 6, a) /* DF387, IDF010 */
466
467/* GNSS macros - Satellite specific part */
468#define T_GNSS_SATELLITE_ID(a) ADDBITS( 6, a) /* IDF011 */
469#define T_GPS_SATELLITE_ID(a) ADDBITS( 6, a) /* DF068 */
470#define T_QZSS_SATELLITE_ID(a) ADDBITS( 4, a) /* DF249 */
471#define T_GLONASS_SATELLITE_ID(a) ADDBITS( 5, a) /* DF */
472#define T_GNSS_IOD(a) ADDBITS( 8, a) /* IDF012 */
473#define T_GPS_IODE(a) ADDBITS( 8, a) /* DF071 */
474#define T_GLONASS_IOD(a) ADDBITS( 8, a) /* DF239 */
475#define T_GALILEO_IOD(a) ADDBITS(10, a) /* DF459 */
476#define T_SBAS_T0MOD(a) ADDBITS( 9, (a/16)) /* DF468 */
477#define T_SBAS_IODCRC(a) ADDBITS(24, a) /* DF469 */
478#define T_BDS_TOEMOD(a) ADDBITS(10, (a/8)) /* DF470 */
479#define T_BDS_IOD(a) ADDBITS( 8, a) /* DF471 */
480
481/* Orbit Corrections */
482#define T_DELTA_RADIAL(a) SCALEADDBITS(22, 10000.0, a) /* DF365, IDF013 */
483#define T_DELTA_ALONG_TRACK(a) SCALEADDBITS(20, 2500.0, a) /* DF366, IDF014 */
484#define T_DELTA_CROSS_TRACK(a) SCALEADDBITS(20, 2500.0, a) /* DF367, IDF015 */
485#define T_DELTA_DOT_RADIAL(a) SCALEADDBITS(21, 1000000.0, a) /* DF368, IDF016 */
486#define T_DELTA_DOT_ALONG_TRACK(a) SCALEADDBITS(19, 250000.0, a) /* DF369, IDF017 */
487#define T_DELTA_DOT_CROSS_TRACK(a) SCALEADDBITS(19, 250000.0, a) /* DF370, IDF018 */
488
489/* Clock Corrections */
490#define T_DELTA_CLOCK_C0(a) SCALEADDBITS(22, 10000.0, a) /* DF376, IDF019 */
491#define T_DELTA_CLOCK_C1(a) SCALEADDBITS(21, 1000000.0, a) /* DF377, IDF020 */
492#define T_DELTA_CLOCK_C2(a) SCALEADDBITS(27, 50000000.0, a) /* DF378, IDF021 */
493#define T_HR_CLOCK_CORRECTION(a) SCALEADDBITS(22, 10000.0, a) /* DF390, IDF022 */
494
495/* Biases */
496#define T_NO_OF_BIASES(a) ADDBITS(5, a) /* DF, DF IDF023 */ //_NO_OF_CODE_BIASES(a)T_NO_OF_PHASE_BIASES(a)
497
498#define T_GNSS_SIGNAL_IDENTIFIER(a) ADDBITS(5, a) /* DF IDF024 */
499#define T_CODE_BIAS(a) SCALEADDBITS(14, 100.0, a) /* DF383, IDF025 */
500#define T_YAW_ANGLE(a) SCALEADDBITS( 9, 256.0/MPI, a) /* DF480, IDF026 */
501#define T_YAW_RATE(a) SCALEADDBITS( 8, 8192.0/MPI, a) /* DF481, IDF027 */
502#define T_PHASE_BIAS(a) SCALEADDBITS(20, 10000.0, a) /* DF482, IDF028 */
503
504/* Phase specific part of GNSS phase bias message */
505#define T_INTEGER_INDICATOR(a) ADDBITS( 1, a) /* DF483, IDF029 */
506#define T_WIDE_LANE_INDICATOR(a) ADDBITS( 2, a) /* DF484, IDF030 */
507#define T_DISCONTINUITY_COUNTER(a) ADDBITS( 4, a) /* DF485, IDF031 */
508#define T_DISPERSIVE_BIAS_INDICATOR(a) ADDBITS( 1, a) /* DF486, IDF032 */
509#define T_MW_CONSISTENCY_INDICATOR(a) ADDBITS( 1, a) /* DF487, IDF033 */
510
511/* URA */
512#define T_SSR_URA(a) ADDBITS( 6, a) /* DF389, IDF034 */
513
514/* Ionosphere */
515#define T_NO_IONO_LAYERS(a) ADDBITS( 2, a-1) /* DF472, IDF035 */
516#define T_IONO_HEIGHT(a) SCALEADDBITS( 8, 1/10000.0, a) /* DF473, IDF036 */
517#define T_IONO_DEGREE(a) ADDBITS( 4, a-1) /* DF474, IDF037 */
518#define T_IONO_ORDER(a) ADDBITS( 4, a-1) /* DF475, IDF038 */
519#define T_IONO_COEFF_C(a) SCALEADDBITS(16, 200.0, a) /* DF476, IDF039 */
520#define T_IONO_COEFF_S(a) SCALEADDBITS(16, 200.0, a) /* DF477, IDF040 */
521#define T_VTEC_QUALITY_INDICATOR(a) SCALEADDBITS( 9, 20.0, a) /* DF478, IDF041 */
522
523static double URAToValue(int ura) {
524 int urac, urav;
525 urac = ura >> 3;
526 urav = ura & 7;
527 if (!ura)
528 return 0;
529 else if (ura == 63)
530 return SSR_MAXURA;
531 return (pow(3, urac) * (1.0 + urav / 4.0) - 1.0) / 1000.0;
532}
533
534static int ValueToURA(double val) {
535 int ura;
536 if (!val)
537 return 0;
538 else if (val > 5.4665)
539 return 63;
540 for (ura = 1; ura < 63 && val > URAToValue(ura); ++ura)
541 ;
542 return ura;
543}
544
545#define DECODESTART \
546 int numbits=0; \
547 uint64_t bitbuffer=0;
548
549#define LOADSSRBITS(a) { \
550 while((a) > numbits) { \
551 if(!size--) return GCOBR_SHORTMESSAGE; \
552 bitbuffer = (bitbuffer<<8)|((unsigned char)*(buffer++)); \
553 numbits += 8; \
554 } \
555}
556
557/* extract bits from data stream
558 b = variable to store result, a = number of bits */
559#define GETSSRBITS(b, a) { \
560 LOADSSRBITS(a) \
561 b = (bitbuffer<<(64-numbits))>>(64-(a)); \
562 numbits -= (a); \
563}
564
565/* extract bits from data stream
566 b = variable to store result, a = number of bits */
567#define GETSSRBITSFACTOR(b, a, c) { \
568 LOADSSRBITS(a) \
569 b = ((bitbuffer<<(64-numbits))>>(64-(a)))*(c); \
570 numbits -= (a); \
571}
572
573/* extract signed floating value from data stream
574 b = variable to store result, a = number of bits */
575#define GETSSRFLOATSIGN(b, a, c) { \
576 LOADSSRBITS(a) \
577 b = ((double)(((int64_t)(bitbuffer<<(64-numbits)))>>(64-(a))))*(c); \
578 numbits -= (a); \
579}
580
581/* extract floating value from data stream
582 b = variable to store result, a = number of bits, c = scale factor */
583#define GETSSRFLOAT(b, a, c) { \
584 LOADSSRBITS(a) \
585 b = ((double)((bitbuffer<<(sizeof(bitbuffer)*8-numbits))>>(sizeof(bitbuffer)*8-(a))))*(c); \
586 numbits -= (a); \
587}
588
589#define SKIPSSRBITS(b) { LOADSSRBITS(b) numbits -= (b); }
590
591/* GPS macros also used for other systems when matching! */
592#define G_HEADER(a) GETSSRBITS(a, 8)
593#define G_RESERVEDH(a) GETSSRBITS(a, 6)
594#define G_SIZE(a) GETSSRBITS(a, 10)
595
596/* GNSS macros - Header part */
597#define G_RTCM_MESSAGE_NUMBER(a) GETSSRBITS(a, 12) /* DF002 */
598
599#define G_IGS_SSR_VERSION(a) GETSSRBITS(a, 3) /* IDF001 */
600#define G_IGS_MESSAGE_NUMBER(a) GETSSRBITS(a, 8) /* IDF002 */
601#define G_SSR_EPOCH_TIME(a) GETSSRBITS(a, 20) /*DF IDF003 */
602#define G_SSR_EPOCH_TIME_CHECK(a, b) {unsigned int temp; GETSSRBITS(temp, 20) \
603 if(b && a != temp) return GCOBR_TIMEMISMATCH; a = temp;}
604#define G_GLONASS_EPOCH_TIME(a, b) {unsigned int temp; GETSSRBITS(temp, 17) \
605 if(b && a != temp) return GCOBR_TIMEMISMATCH; a = temp;}
606
607#define G_SSR_UPDATE_INTERVAL(a) GETSSRBITS(a, 4) /* DF391, IDF004 */
608#define G_MULTIPLE_MESSAGE_INDICATOR(a) GETSSRBITS(a, 1) /* DF388, IDF005 */
609#define G_SSR_IOD(a) GETSSRBITS(a, 4) /* DF413, IDF007 */
610#define G_SSR_PROVIDER_ID(a) GETSSRBITS(a, 16) /* DF414, IDF008 */
611#define G_SSR_SOLUTION_ID(a) GETSSRBITS(a, 4) /* DF415, IDF009 */
612#define G_SATELLITE_REFERENCE_DATUM(a) GETSSRBITS(a, 1) /* DF375, IDF006 */
613#define G_NO_OF_SATELLITES(a) GETSSRBITS(a, 6) /* DF387, IDF010 */
614
615/* GNSS macros - Satellite specific part */
616#define G_GNSS_SATELLITE_ID(a) GETSSRBITS(a, 6) /* DF068, IDF011 */
617#define G_GLONASS_SATELLITE_ID(a) GETSSRBITS(a, 5) /* DF */
618#define G_QZSS_SATELLITE_ID(a) GETSSRBITS(a, 4) /* DF249 */
619
620#define G_GNSS_IOD(a) GETSSRBITS(a, 8) /*DF071, DF237,DF471 IDF012 */
621#define G_GALILEO_IOD(a) GETSSRBITS(a, 10) /* DF459 */
622#define G_SBAS_T0MOD(a) GETSSRBITSFACTOR(a, 9, 16) /* DF468 */
623#define G_SBAS_IODCRC(a) GETSSRBITS(a, 24) /* DF469 */
624#define G_BDS_TOEMOD(a) GETSSRBITSFACTOR(a, 10, 8) /* DF470 */
625
626/* Orbit Corrections */
627#define G_DELTA_RADIAL(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF365, IDF013 */
628#define G_DELTA_ALONG_TRACK(a) GETSSRFLOATSIGN(a, 20, 1/2500.0) /* DF366, IDF014 */
629#define G_DELTA_CROSS_TRACK(a) GETSSRFLOATSIGN(a, 20, 1/2500.0) /* DF367, IDF015 */
630#define G_DELTA_DOT_RADIAL(a) GETSSRFLOATSIGN(a, 21, 1/1000000.0) /* DF368, IDF016 */
631#define G_DELTA_DOT_ALONG_TRACK(a) GETSSRFLOATSIGN(a, 19, 1/250000.0) /* DF369, IDF017 */
632#define G_DELTA_DOT_CROSS_TRACK(a) GETSSRFLOATSIGN(a, 19, 1/250000.0) /* DF370, IDF018 */
633
634/* Clock Corrections */
635#define G_DELTA_CLOCK_C0(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF376, IDF019 */
636#define G_DELTA_CLOCK_C1(a) GETSSRFLOATSIGN(a, 21, 1/1000000.0) /* DF377, IDF020 */
637#define G_DELTA_CLOCK_C2(a) GETSSRFLOATSIGN(a, 27, 1/50000000.0) /* DF378, IDF021 */
638#define G_HR_CLOCK_CORRECTION(a) GETSSRFLOATSIGN(a, 22, 1/10000.0) /* DF390, IDF022 */
639
640/* Biases */
641#define G_NO_OF_BIASES(a) GETSSRBITS(a, 5) /* DF, DF IDF023 */
642#define G_GNSS_SIGNAL_IDENTIFIER(a) GETSSRBITS(a, 5) /* DF IDF024 */
643#define G_CODE_BIAS(a) GETSSRFLOATSIGN(a, 14, 1/100.0) /* DF383, IDF025 */
644#define G_YAW_ANGLE(a) GETSSRFLOAT (a, 9, MPI/256.0) /* DF480, IDF026 */
645#define G_YAW_RATE(a) GETSSRFLOATSIGN(a, 8, MPI/8192.0) /* DF481, IDF027 */
646#define G_PHASE_BIAS(a) GETSSRFLOATSIGN(a, 20, 1/10000.) /* DF482, IDF028 */
647
648/* Phase specific part of GNSS phase bias message */
649#define G_INTEGER_INDICATOR(a) GETSSRBITS(a, 1) /* DF483, IDF029 */
650#define G_WIDE_LANE_INDICATOR(a) GETSSRBITS(a, 2) /* DF484, IDF030 */
651#define G_DISCONTINUITY_COUNTER(a) GETSSRBITS(a, 4) /* DF485, IDF031 */
652#define G_DISPERSIVE_BIAS_INDICATOR(a) GETSSRBITS(a, 1) /* DF486, IDF032 */
653#define G_MW_CONSISTENCY_INDICATOR(a) GETSSRBITS(a, 1) /* DF487, IDF033 */
654
655/* URA */
656#define G_SSR_URA(a) {int temp; GETSSRBITS(temp, 6) \
657 (a) = URAToValue(temp);} /* DF389, IDF034 */
658
659/* Ionosphere */
660#define G_NO_IONO_LAYERS(a) {unsigned int temp; GETSSRBITS(temp, 2) a = temp+1;} /* DF472, IDF035 */
661#define G_IONO_HEIGHT(a) GETSSRFLOAT(a, 8 , 10000.0) /* DF473, IDF036 */
662#define G_IONO_DEGREE(a) {unsigned int temp; GETSSRBITS(temp, 4) a = temp+1;} /* DF474, IDF037 */
663#define G_IONO_ORDER(a) {unsigned int temp; GETSSRBITS(temp, 4) a = temp+1;} /* DF475, IDF038 */
664#define G_IONO_COEFF_C(a) GETSSRFLOATSIGN(a, 16,1/200.0) /* DF476, IDF039 */
665#define G_IONO_COEFF_S(a) GETSSRFLOATSIGN(a, 16,1/200.0) /* DF477, IDF040 */
666#define G_VTEC_QUALITY_INDICATOR(a) GETSSRFLOAT (a, 9, 1/20.0) /* DF478, IDF041 */
667
668};
669
670#endif /* RTCM3_CLOCK_ORBIT_H */
Note: See TracBrowser for help on using the repository browser.