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, 2 days 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.