source: ntrip/trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp@ 9025

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

some modification to allow encoding and decoding of SSR corrections in RTCM-SSR and IGS-SSR formats

  • Property svn:executable set to *
File size: 35.1 KB
Line 
1/* Programheader
2
3 Name: clock_orbit_igs.c
4 Project: RTCM3
5 Version: $Id: clock_orbit_igs.c 8963 2020-06-29 12:46:25Z stuerze $
6 Authors: Dirk Stöcker, Andrea Stürze
7 Description: state space approach: IGS
8 */
9
10#include <math.h>
11#include <stdio.h>
12#include <string.h>
13#ifndef sparc
14#include <stdint.h>
15#else
16#include <sys/types.h>
17#endif
18#include <clock_orbit_igs.h>
19
20
21size_t SsrCorrIgs::MakeClockOrbit(const struct ClockOrbit *co, ClockOrbitType type,
22 int moremessagesfollow, char *buffer, size_t size) {
23
24 unsigned int status[CLOCKORBIT_SATNUM][COBOFS_NUM], i, s;
25
26 memset(status, 0, sizeof(status));
27
28 STARTDATA
29
30 for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
31 for (i = 0; i < COBOFS_NUM; ++i) {
32 if (co->NumberOfSat[s] && (type == COTYPE_AUTO || type == corbase[s] + i) &&
33 (co->Supplied[i] || (i <= COBOFS_CLOCK && co->Supplied[COBOFS_COMBINED]) ||
34 (i == COBOFS_COMBINED && co->Supplied[COBOFS_ORBIT] && co->Supplied[COBOFS_CLOCK]))) {
35 status[s][i] = 1;
36 if (i == COBOFS_COMBINED) {
37 status[s][COBOFS_ORBIT] = status[s][COBOFS_CLOCK] = 0;
38 } /* disable single blocks for combined type */
39 } /* check for data */
40 } /* iterate over sub-types */
41 } /* iterate over satellite systems */
42
43 for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
44 if (status[s][COBOFS_ORBIT]) {
45 INITBLOCK
46 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
47 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
48 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_ORBIT)
49 T_SSR_EPOCH_TIME(co->EpochTime[s])
50 T_SSR_UPDATE_INTERVAL(co->UpdateInterval)
51 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
52 T_SSR_IOD(co->SSRIOD)
53 T_SSR_PROVIDER_ID(co->SSRProviderID)
54 T_SSR_SOLUTION_ID(co->SSRSolutionID)
55 T_SATELLITE_REFERENCE_DATUM(co->SatRefDatum)
56 T_NO_OF_SATELLITES(co->NumberOfSat[s])
57 for (i = satoffset[s]; i < satoffset[s] + co->NumberOfSat[s]; ++i) {
58 T_GNSS_SATELLITE_ID(co->Sat[i].ID)
59 T_GNSS_IOD(co->Sat[i].IOD)
60 T_DELTA_RADIAL(co->Sat[i].Orbit.DeltaRadial)
61 T_DELTA_ALONG_TRACK(co->Sat[i].Orbit.DeltaAlongTrack)
62 T_DELTA_CROSS_TRACK(co->Sat[i].Orbit.DeltaCrossTrack)
63 T_DELTA_DOT_RADIAL(co->Sat[i].Orbit.DotDeltaRadial)
64 T_DELTA_DOT_ALONG_TRACK(co->Sat[i].Orbit.DotDeltaAlongTrack)
65 T_DELTA_DOT_CROSS_TRACK(co->Sat[i].Orbit.DotDeltaCrossTrack)
66 }
67 ENDBLOCK
68 }
69 if (status[s][COBOFS_CLOCK]) {
70 INITBLOCK
71 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
72 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
73 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_CLOCK)
74 T_SSR_EPOCH_TIME(co->EpochTime[s])
75 T_SSR_UPDATE_INTERVAL(co->UpdateInterval)
76 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
77 T_SSR_IOD(co->SSRIOD)
78 T_SSR_PROVIDER_ID(co->SSRProviderID)
79 T_SSR_SOLUTION_ID(co->SSRSolutionID)
80 T_NO_OF_SATELLITES(co->NumberOfSat[s])
81 for (i = satoffset[s]; i < satoffset[s] + co->NumberOfSat[s]; ++i) {
82 T_GNSS_SATELLITE_ID(co->Sat[i].ID)
83 T_DELTA_CLOCK_C0(co->Sat[i].Clock.DeltaA0)
84 T_DELTA_CLOCK_C1(co->Sat[i].Clock.DeltaA1)
85 T_DELTA_CLOCK_C2(co->Sat[i].Clock.DeltaA2)
86 }
87 ENDBLOCK
88 }
89 if (status[s][COBOFS_COMBINED]) {
90#ifdef SPLITBLOCK
91 int nums = co->NumberOfSat[s];
92 int left, start = satoffset[s];
93 if(nums > 28) {/* split block when more than 28 sats */
94 left = nums - 28;
95 nums = 28;
96 }
97 else {
98 left = 0;
99 }
100 while(nums) {
101#endif
102 INITBLOCK
103 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
104 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
105 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_COMBINED)
106 T_SSR_EPOCH_TIME(co->EpochTime[s])
107 T_SSR_UPDATE_INTERVAL(co->UpdateInterval)
108#ifdef SPLITBLOCK
109 T_MULTIPLE_MESSAGE_INDICATOR((moremessagesfollow || left) ? 1 : 0)
110#else
111 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
112#endif
113 T_SSR_IOD(co->SSRIOD)
114 T_SSR_PROVIDER_ID(co->SSRProviderID)
115 T_SSR_SOLUTION_ID(co->SSRSolutionID)
116 T_SATELLITE_REFERENCE_DATUM(co->SatRefDatum)
117#ifdef SPLITBLOCK
118 T_NO_OF_SATELLITES(nums)
119 for(i = start; i < start+nums; ++i) {
120#else
121 T_NO_OF_SATELLITES(co->NumberOfSat[s])
122 for (i = satoffset[s]; i < satoffset[s] + co->NumberOfSat[s]; ++i) {
123#endif
124 T_GNSS_SATELLITE_ID(co->Sat[i].ID)
125 T_GNSS_IOD(co->Sat[i].IOD)
126 T_DELTA_RADIAL(co->Sat[i].Orbit.DeltaRadial)
127 T_DELTA_ALONG_TRACK(co->Sat[i].Orbit.DeltaAlongTrack)
128 T_DELTA_CROSS_TRACK(co->Sat[i].Orbit.DeltaCrossTrack)
129 T_DELTA_DOT_RADIAL(co->Sat[i].Orbit.DotDeltaRadial)
130 T_DELTA_DOT_ALONG_TRACK(co->Sat[i].Orbit.DotDeltaAlongTrack)
131 T_DELTA_DOT_CROSS_TRACK(co->Sat[i].Orbit.DotDeltaCrossTrack)
132 T_DELTA_CLOCK_C0(co->Sat[i].Clock.DeltaA0)
133 T_DELTA_CLOCK_C1(co->Sat[i].Clock.DeltaA1)
134 T_DELTA_CLOCK_C2(co->Sat[i].Clock.DeltaA2)
135 }
136 ENDBLOCK
137#ifdef SPLITBLOCK
138 start += nums;
139 nums = left;
140 left = 0;
141 }
142#endif
143 }
144 if (status[s][COBOFS_HR]) {
145 INITBLOCK
146 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
147 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
148 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_HR)
149 T_SSR_EPOCH_TIME(co->EpochTime[s])
150 T_SSR_UPDATE_INTERVAL(co->UpdateInterval)
151 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
152 T_SSR_IOD(co->SSRIOD)
153 T_SSR_PROVIDER_ID(co->SSRProviderID)
154 T_SSR_SOLUTION_ID(co->SSRSolutionID)
155 T_NO_OF_SATELLITES(co->NumberOfSat[s])
156 for (i = satoffset[s]; i < satoffset[s] + co->NumberOfSat[s]; ++i) {
157 T_GNSS_SATELLITE_ID(co->Sat[i].ID)
158 T_HR_CLOCK_CORRECTION(co->Sat[i].hrclock)
159 }
160 ENDBLOCK
161 }
162 if (status[s][COBOFS_URA]) {
163 INITBLOCK
164 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
165 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
166 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_URA)
167 T_SSR_EPOCH_TIME(co->EpochTime[s])
168 T_SSR_UPDATE_INTERVAL(co->UpdateInterval)
169 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
170 T_SSR_IOD(co->SSRIOD)
171 T_SSR_PROVIDER_ID(co->SSRProviderID)
172 T_SSR_SOLUTION_ID(co->SSRSolutionID)
173 T_NO_OF_SATELLITES(co->NumberOfSat[s])
174 for (i = satoffset[s]; i < satoffset[s] + co->NumberOfSat[s]; ++i) {
175 T_GNSS_SATELLITE_ID(co->Sat[i].ID)
176 T_SSR_URA(ValueToURA(co->Sat[i].UserRangeAccuracy))
177 }
178 ENDBLOCK
179 }
180 }
181 return ressize;
182}
183
184size_t SsrCorrIgs::MakeCodeBias(const struct CodeBias *b, CodeBiasType type,
185 int moremessagesfollow, char *buffer, size_t size) {
186 unsigned int s, i, j;
187
188 STARTDATA
189
190 for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
191 if (b->NumberOfSat[s] && (type == CBTYPE_AUTO || type == corbase[s] + COBOFS_CBIAS)) {
192 INITBLOCK
193 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
194 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
195 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_CBIAS)
196 T_SSR_EPOCH_TIME(b->EpochTime[s])
197 T_SSR_UPDATE_INTERVAL(b->UpdateInterval)
198 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
199 T_SSR_IOD(b->SSRIOD)
200 T_SSR_PROVIDER_ID(b->SSRProviderID)
201 T_SSR_SOLUTION_ID(b->SSRSolutionID)
202 T_NO_OF_SATELLITES(b->NumberOfSat[s])
203 for (i = satoffset[s]; i < satoffset[s] + b->NumberOfSat[s]; ++i) {
204 T_GNSS_SATELLITE_ID(b->Sat[i].ID)
205 T_NO_OF_BIASES(b->Sat[i].NumberOfCodeBiases)
206 for (j = 0; j < b->Sat[i].NumberOfCodeBiases; ++j) {
207 T_GNSS_SIGNAL_IDENTIFIER(b->Sat[i].Biases[j].Type)
208 T_CODE_BIAS(b->Sat[i].Biases[j].Bias)
209 }
210 }
211 ENDBLOCK
212 }
213 }
214 return ressize;
215}
216
217size_t SsrCorrIgs::MakePhaseBias(const struct PhaseBias *b, PhaseBiasType type,
218 int moremessagesfollow, char *buffer, size_t size) {
219 unsigned int s, i, j;
220
221 STARTDATA
222
223 for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
224 if (b->NumberOfSat[s] && (type == PBTYPE_AUTO || type == corbase[s] + COBOFS_PBIAS)) {
225 INITBLOCK
226 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
227 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
228 T_IGS_MESSAGE_NUMBER(corbase[s] + COBOFS_PBIAS)
229 T_SSR_EPOCH_TIME(b->EpochTime[s])
230 T_SSR_UPDATE_INTERVAL(b->UpdateInterval)
231 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
232 T_SSR_IOD(b->SSRIOD)
233 T_SSR_PROVIDER_ID(b->SSRProviderID)
234 T_SSR_SOLUTION_ID(b->SSRSolutionID)
235 T_DISPERSIVE_BIAS_INDICATOR(b->DispersiveBiasConsistencyIndicator ? 1 : 0)
236 T_MW_CONSISTENCY_INDICATOR(b->MWConsistencyIndicator ? 1 : 0)
237 T_NO_OF_SATELLITES(b->NumberOfSat[s])
238 for (i = satoffset[s]; i < satoffset[s] + b->NumberOfSat[s]; ++i) {
239 T_GNSS_SATELLITE_ID(b->Sat[i].ID)
240 T_NO_OF_BIASES(b->Sat[i].NumberOfPhaseBiases)
241 T_YAW_ANGLE(b->Sat[i].YawAngle)
242 T_YAW_RATE(b->Sat[i].YawRate)
243 for (j = 0; j < b->Sat[i].NumberOfPhaseBiases; ++j) {
244 T_GNSS_SIGNAL_IDENTIFIER(b->Sat[i].Biases[j].Type)
245 T_INTEGER_INDICATOR(b->Sat[i].Biases[j].SignalIntegerIndicator ? 1 : 0)
246 T_WIDE_LANE_INDICATOR(b->Sat[i].Biases[j].SignalsWideLaneIntegerIndicator)
247 T_DISCONTINUITY_COUNTER(b->Sat[i].Biases[j].SignalDiscontinuityCounter)
248 T_PHASE_BIAS(b->Sat[i].Biases[j].Bias)
249 }
250 }
251 ENDBLOCK
252 }
253 }
254 return ressize;
255}
256
257size_t SsrCorrIgs::MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size) {
258 unsigned int l, o, d;
259
260 STARTDATA
261 INITBLOCK
262
263 T_RTCM_MESSAGE_NUMBER(RTCM_MESSAGE_NUMBER_IGS)
264 T_IGS_SSR_VERSION(IGS_SSR_VERSION)
265 T_IGS_MESSAGE_NUMBER(VTEC_BASE)
266 T_SSR_EPOCH_TIME(v->EpochTime)
267 T_SSR_UPDATE_INTERVAL(v->UpdateInterval)
268 T_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0)
269 T_SSR_IOD(v->SSRIOD)
270 T_SSR_PROVIDER_ID(v->SSRProviderID)
271 T_SSR_SOLUTION_ID(v->SSRSolutionID)
272 T_VTEC_QUALITY_INDICATOR(v->Quality)
273 T_NO_IONO_LAYERS(v->NumLayers)
274 for (l = 0; l < v->NumLayers; ++l) {
275 T_IONO_HEIGHT(v->Layers[l].Height)
276 T_IONO_DEGREE(v->Layers[l].Degree)
277 T_IONO_ORDER(v->Layers[l].Order)
278 for (o = 0; o <= v->Layers[l].Order; ++o) {
279 for (d = o; d <= v->Layers[l].Degree; ++d) {
280 T_IONO_COEFF_C(v->Layers[l].Cosinus[d][o])
281 }
282 }
283 for (o = 1; o <= v->Layers[l].Order; ++o) {
284 for (d = o; d <= v->Layers[l].Degree; ++d) {
285 T_IONO_COEFF_S(v->Layers[l].Sinus[d][o])
286 }
287 }
288 }
289 ENDBLOCK
290 return ressize;
291}
292
293enum GCOB_RETURN SsrCorrIgs::GetSSR(struct ClockOrbit *co, struct CodeBias *b,struct VTEC *v,
294 struct PhaseBias *pb, const char *buffer, size_t size, int *bytesused) {
295 int mmi = 0, h, rs;
296 unsigned int rtcmtype, igstype, pos, i, j, s, nums, id, version;
297 size_t sizeofrtcmblock;
298 const char *blockstart = buffer;
299 DECODESTART
300
301 if (size < 7)
302 return GCOBR_SHORTBUFFER;
303
304#ifdef BNC_DEBUG
305 fprintf(stderr, "GetSSR-IGS START: size %d, numbits %d\n",(int)size, numbits);
306#endif
307
308 G_HEADER(h)
309 G_RESERVEDH(rs)
310 G_SIZE(sizeofrtcmblock);
311
312 if ((unsigned char) h != 0xD3 || rs)
313 return GCOBR_UNKNOWNDATA;
314 if (size < sizeofrtcmblock + 3) /* 3 header bytes already removed */
315 return GCOBR_MESSAGEEXCEEDSBUFFER;
316 if (CRC24(sizeofrtcmblock + 3, (const unsigned char *) blockstart) !=
317 (uint32_t) ((((unsigned char) buffer[sizeofrtcmblock]) << 16) |
318 (((unsigned char) buffer[sizeofrtcmblock + 1]) << 8) |
319 (((unsigned char) buffer[sizeofrtcmblock + 2]))))
320 return GCOBR_CRCMISMATCH;
321 size = sizeofrtcmblock; /* reduce size, so overflows are detected */
322
323 G_RTCM_MESSAGE_NUMBER(rtcmtype)
324 G_IGS_SSR_VERSION(version)
325#ifdef BNC_DEBUG
326 fprintf(stderr, "rtcmType %d igsVersion %d ", rtcmtype, version);
327#endif
328 G_IGS_MESSAGE_NUMBER(igstype)
329 fprintf(stderr, "igsType IM%03d ", igstype);
330#ifdef BNC_DEBUG
331 fprintf(stderr, "igsType IM%d size %d\n", igstype,(int)sizeofrtcmblock);
332#endif
333 if (bytesused)
334 *bytesused = sizeofrtcmblock + 6;
335
336 if (igstype == VTEC_BASE) {
337 unsigned int l, o, d;
338 if (!v)
339 return GCOBR_NOVTECPARAMETER;
340 memset(v, 0, sizeof(*v));
341 G_SSR_EPOCH_TIME(v->EpochTime)
342 G_SSR_UPDATE_INTERVAL(v->UpdateInterval)
343 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
344 G_SSR_IOD(v->SSRIOD)
345 G_SSR_PROVIDER_ID(v->SSRProviderID)
346 G_SSR_SOLUTION_ID(v->SSRSolutionID)
347 G_VTEC_QUALITY_INDICATOR(v->Quality)
348 G_NO_IONO_LAYERS(v->NumLayers)
349#ifdef BNC_DEBUG
350 fprintf(stderr, "epochTime %d ui %d mmi %d ssrIod %d providerId %d solId %d vtecQ %8.3f numLay %d \n",
351 v->EpochTime, v->UpdateInterval, mmi,
352 v->SSRIOD, v->SSRProviderID, v->SSRSolutionID, v->Quality, v->NumLayers);
353#endif
354 for (l = 0; l < v->NumLayers; ++l) {
355 G_IONO_HEIGHT(v->Layers[l].Height)
356 G_IONO_DEGREE(v->Layers[l].Degree)
357 G_IONO_ORDER(v->Layers[l].Order)
358#ifdef BNC_DEBUG
359 fprintf(stderr, "h %8.3f deg %d ord %d \n",
360 v->Layers[l].Height, v->Layers[l].Degree, v->Layers[l].Order);
361#endif
362 for (o = 0; o <= v->Layers[l].Order; ++o) {
363 for (d = o; d <= v->Layers[l].Degree; ++d) {
364 G_IONO_COEFF_C(v->Layers[l].Cosinus[d][o])
365#ifdef BNC_DEBUG
366 fprintf(stderr, "C[%02d][%02d] %8.3f \n",
367 d, o, v->Layers[l].Cosinus[d][o]);
368#endif
369 }
370 }
371 for (o = 1; o <= v->Layers[l].Order; ++o) {
372 for (d = o; d <= v->Layers[l].Degree; ++d) {
373 G_IONO_COEFF_S(v->Layers[l].Sinus[d][o])
374#ifdef BNC_DEBUG
375 fprintf(stderr, "S[%02d][%02d] %8.3f \n",
376 d, o, v->Layers[l].Sinus[d][o]);
377#endif
378 }
379 }
380 }
381#ifdef BNC_DEBUG
382 for(igstype = 0; igstype < (unsigned int)size && (unsigned char)buffer[igstype] != 0xD3; ++igstype)
383 numbits += 8;
384 fprintf(stderr, "numbits left %d\n",numbits);
385#endif
386 return mmi ? GCOBR_MESSAGEFOLLOWS : GCOBR_OK;
387 }
388 for (s = CLOCKORBIT_SATNUM; s-- > 0;) {
389 if (igstype >= corbase[s]) {
390 unsigned int corrOffset = igstype - corbase[s]; fprintf(stderr, "corrOffset: %d ",corrOffset);
391 if (corrOffset == COBOFS_ORBIT) {
392 if (!co)
393 return GCOBR_NOCLOCKORBITPARAMETER;
394 co->messageType = igstype;
395 G_SSR_EPOCH_TIME_CHECK(co->EpochTime[s], co->NumberOfSat[s])
396 G_SSR_UPDATE_INTERVAL(co->UpdateInterval)
397 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
398 G_SSR_IOD(co->SSRIOD)
399 G_SSR_PROVIDER_ID(co->SSRProviderID)
400 G_SSR_SOLUTION_ID(co->SSRSolutionID)
401 G_SATELLITE_REFERENCE_DATUM(co->SatRefDatum)
402 G_NO_OF_SATELLITES(nums)
403 co->Supplied[COBOFS_ORBIT] |= 1;
404#ifdef BNC_DEBUG
405 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d rd %d ssrIod %d providerId %d solId %d\n",
406 co->EpochTime[s], co->UpdateInterval,mmi,co->NumberOfSat[s],nums,
407 co->SatRefDatum, co->SSRIOD, co->SSRProviderID, co->SSRSolutionID);
408#endif
409 for (i = 0; i < nums; ++i) {
410 G_GNSS_SATELLITE_ID(id)
411 for (pos = satoffset[s];
412 pos < satoffset[s] + co->NumberOfSat[s] && co->Sat[pos].ID != id;
413 ++pos)
414 ;
415 if (pos >= satoffset[s + 1])
416 return GCOBR_DATAMISMATCH;
417 else if (pos == co->NumberOfSat[s] + satoffset[s])
418 ++co->NumberOfSat[s];
419 co->Sat[pos].ID = id;
420 G_GNSS_IOD(co->Sat[pos].IOD)
421 G_DELTA_RADIAL(co->Sat[pos].Orbit.DeltaRadial)
422 G_DELTA_ALONG_TRACK(co->Sat[pos].Orbit.DeltaAlongTrack)
423 G_DELTA_CROSS_TRACK(co->Sat[pos].Orbit.DeltaCrossTrack)
424 G_DELTA_DOT_RADIAL(co->Sat[pos].Orbit.DotDeltaRadial)
425 G_DELTA_DOT_ALONG_TRACK(co->Sat[pos].Orbit.DotDeltaAlongTrack)
426 G_DELTA_DOT_CROSS_TRACK(co->Sat[pos].Orbit.DotDeltaCrossTrack)
427#ifdef BNC_DEBUG
428 fprintf(stderr, "id %2d iod %3d dr %8.4f da %8.4f dc %8.4f dr %8.3f da %8.3f dc %8.3f\n",
429 co->Sat[pos].ID,co->Sat[pos].IOD,co->Sat[pos].Orbit.DeltaRadial,
430 co->Sat[pos].Orbit.DeltaAlongTrack,co->Sat[pos].Orbit.DeltaCrossTrack,
431 co->Sat[pos].Orbit.DotDeltaRadial,
432 co->Sat[pos].Orbit.DotDeltaAlongTrack,
433 co->Sat[pos].Orbit.DotDeltaCrossTrack);
434#endif
435 }
436 }
437 else if (corrOffset == COBOFS_CLOCK) {
438 if (!co)
439 return GCOBR_NOCLOCKORBITPARAMETER;
440 co->messageType = igstype;
441 G_SSR_EPOCH_TIME_CHECK(co->EpochTime[s], co->NumberOfSat[s])
442 G_SSR_UPDATE_INTERVAL(co->UpdateInterval)
443 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
444 G_SSR_IOD(co->SSRIOD)
445 G_SSR_PROVIDER_ID(co->SSRProviderID)
446 G_SSR_SOLUTION_ID(co->SSRSolutionID)
447 G_NO_OF_SATELLITES(nums)
448 co->Supplied[COBOFS_CLOCK] |= 1;
449#ifdef BNC_DEBUG
450 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d\n",
451 co->EpochTime[s], co->UpdateInterval,mmi,co->NumberOfSat[s],nums,
452 co->SSRIOD, co->SSRProviderID, co->SSRSolutionID);
453#endif
454 for (i = 0; i < nums; ++i) {
455 G_GNSS_SATELLITE_ID(id)
456 for (pos = satoffset[s];
457 pos < satoffset[s] + co->NumberOfSat[s] && co->Sat[pos].ID != id;
458 ++pos)
459 ;
460 if (pos >= satoffset[s + 1])
461 return GCOBR_DATAMISMATCH;
462 else if (pos == co->NumberOfSat[s] + satoffset[s])
463 ++co->NumberOfSat[s];
464 co->Sat[pos].ID = id;
465 G_DELTA_CLOCK_C0(co->Sat[pos].Clock.DeltaA0)
466 G_DELTA_CLOCK_C1(co->Sat[pos].Clock.DeltaA1)
467 G_DELTA_CLOCK_C2(co->Sat[pos].Clock.DeltaA2)
468#ifdef BNC_DEBUG
469 fprintf(stderr, "id %2d c0 %8.3f c1 %8.3f c2 %8.3f\n",
470 co->Sat[pos].ID, co->Sat[pos].Clock.DeltaA0, co->Sat[pos].Clock.DeltaA1,
471 co->Sat[pos].Clock.DeltaA2);
472#endif
473 }
474 }
475 else if (corrOffset == COBOFS_COMBINED) {fprintf(stderr, "Combined\n");
476 if (!co)
477 return GCOBR_NOCLOCKORBITPARAMETER;
478 co->messageType = igstype;
479 G_SSR_EPOCH_TIME_CHECK(co->EpochTime[s], co->NumberOfSat[s])
480 G_SSR_UPDATE_INTERVAL(co->UpdateInterval)
481 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
482 G_SSR_IOD(co->SSRIOD)
483 G_SSR_PROVIDER_ID(co->SSRProviderID)
484 G_SSR_SOLUTION_ID(co->SSRSolutionID)
485 G_SATELLITE_REFERENCE_DATUM(co->SatRefDatum)
486 G_NO_OF_SATELLITES(nums)
487 co->Supplied[COBOFS_ORBIT] |= 1;
488 co->Supplied[COBOFS_CLOCK] |= 1;
489#ifdef BNC_DEBUG
490 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d rd %d ssrIod %d providerId %d solId %d\n",
491 co->EpochTime[s], co->UpdateInterval,mmi,co->NumberOfSat[s],nums,
492 co->SatRefDatum, co->SSRIOD, co->SSRProviderID, co->SSRSolutionID);
493#endif
494 for (i = 0; i < nums; ++i) {
495 G_GNSS_SATELLITE_ID(id)
496 for (pos = satoffset[s];
497 pos < satoffset[s] + co->NumberOfSat[s] && co->Sat[pos].ID != id;
498 ++pos)
499 ;
500 if (pos >= satoffset[s + 1])
501 return GCOBR_DATAMISMATCH;
502 else if (pos == co->NumberOfSat[s] + satoffset[s])
503 ++co->NumberOfSat[s];
504 co->Sat[pos].ID = id;
505 G_GNSS_IOD(co->Sat[pos].IOD)
506 G_DELTA_RADIAL(co->Sat[pos].Orbit.DeltaRadial)
507 G_DELTA_ALONG_TRACK(co->Sat[pos].Orbit.DeltaAlongTrack)
508 G_DELTA_CROSS_TRACK(co->Sat[pos].Orbit.DeltaCrossTrack)
509 G_DELTA_DOT_RADIAL(co->Sat[pos].Orbit.DotDeltaRadial)
510 G_DELTA_DOT_ALONG_TRACK(co->Sat[pos].Orbit.DotDeltaAlongTrack)
511 G_DELTA_DOT_CROSS_TRACK(co->Sat[pos].Orbit.DotDeltaCrossTrack)
512 G_DELTA_CLOCK_C0(co->Sat[pos].Clock.DeltaA0)
513 G_DELTA_CLOCK_C1(co->Sat[pos].Clock.DeltaA1)
514 G_DELTA_CLOCK_C2(co->Sat[pos].Clock.DeltaA2)
515#ifdef BNC_DEBUG
516 fprintf(stderr, "id %2d iod %3d dr %10.6f da %10.6f dc %10.6f dr %10.6f da %10.6f dc %10.6f c0 %10.6f c1 %10.6f c2 %10.6f\n",
517 co->Sat[pos].ID,co->Sat[pos].IOD,co->Sat[pos].Orbit.DeltaRadial,
518 co->Sat[pos].Orbit.DeltaAlongTrack,co->Sat[pos].Orbit.DeltaCrossTrack,
519 co->Sat[pos].Orbit.DotDeltaRadial, co->Sat[pos].Orbit.DotDeltaAlongTrack,
520 co->Sat[pos].Orbit.DotDeltaCrossTrack,
521 co->Sat[pos].Clock.DeltaA0, co->Sat[pos].Clock.DeltaA1, co->Sat[pos].Clock.DeltaA2);
522#endif
523 }
524 }
525 else if (corrOffset == COBOFS_URA) {
526 if (!co)
527 return GCOBR_NOCLOCKORBITPARAMETER;
528 co->messageType = igstype;
529 G_SSR_EPOCH_TIME_CHECK(co->EpochTime[s], co->NumberOfSat[s])
530 G_SSR_UPDATE_INTERVAL(co->UpdateInterval)
531 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
532 G_SSR_IOD(co->SSRIOD)
533 G_SSR_PROVIDER_ID(co->SSRProviderID)
534 G_SSR_SOLUTION_ID(co->SSRSolutionID)
535 G_NO_OF_SATELLITES(nums)
536 co->Supplied[COBOFS_URA] |= 1;
537#ifdef BNC_DEBUG
538 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d\n",
539 co->EpochTime[s], co->UpdateInterval,mmi,co->NumberOfSat[s],nums,
540 co->SSRIOD, co->SSRProviderID, co->SSRSolutionID);
541#endif
542 for (i = 0; i < nums; ++i) {
543 G_GNSS_SATELLITE_ID(id)
544 for (pos = satoffset[s];
545 pos < satoffset[s] + co->NumberOfSat[s] && co->Sat[pos].ID != id;
546 ++pos)
547 ;
548 if (pos >= satoffset[s + 1])
549 return GCOBR_DATAMISMATCH;
550 else if (pos == co->NumberOfSat[s] + satoffset[s])
551 ++co->NumberOfSat[s];
552 co->Sat[pos].ID = id;
553 G_SSR_URA(co->Sat[pos].UserRangeAccuracy)
554#ifdef BNC_DEBUG
555 fprintf(stderr, "id %2d ura %8.3f \n",
556 co->Sat[pos].ID, co->Sat[pos].UserRangeAccuracy);
557#endif
558 }
559 }
560 else if (corrOffset == COBOFS_HR) {
561 if (!co)
562 return GCOBR_NOCLOCKORBITPARAMETER;
563 co->messageType = igstype;
564 G_SSR_EPOCH_TIME_CHECK(co->EpochTime[s], co->NumberOfSat[s])
565 G_SSR_UPDATE_INTERVAL(co->UpdateInterval)
566 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
567 G_SSR_IOD(co->SSRIOD)
568 G_SSR_PROVIDER_ID(co->SSRProviderID)
569 G_SSR_SOLUTION_ID(co->SSRSolutionID)
570 G_NO_OF_SATELLITES(nums)
571 co->Supplied[COBOFS_HR] |= 1;
572#ifdef BNC_DEBUG
573 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d\n",
574 co->EpochTime[s], co->UpdateInterval,mmi,co->NumberOfSat[s],nums,
575 co->SSRIOD, co->SSRProviderID, co->SSRSolutionID);
576#endif
577 for (i = 0; i < nums; ++i) {
578 G_GNSS_SATELLITE_ID(id)
579 for (pos = satoffset[s];
580 pos < satoffset[s] + co->NumberOfSat[s] && co->Sat[pos].ID != id;
581 ++pos)
582 ;
583 if (pos >= satoffset[s + 1])
584 return GCOBR_DATAMISMATCH;
585 else if (pos == co->NumberOfSat[s] + satoffset[s])
586 ++co->NumberOfSat[s];
587 co->Sat[pos].ID = id;
588 G_HR_CLOCK_CORRECTION(co->Sat[pos].hrclock)
589#ifdef BNC_DEBUG
590 fprintf(stderr, "id %2d hrClock %8.3f \n",
591 co->Sat[pos].ID, co->Sat[pos].hrclock);
592#endif
593 }
594 }
595 else if (corrOffset == COBOFS_CBIAS) {fprintf(stderr, "Cbias\n");
596 if (!b)
597 return GCOBR_NOCODEBIASPARAMETER;
598 b->messageType = igstype;
599 G_SSR_EPOCH_TIME_CHECK(b->EpochTime[s], b->NumberOfSat[s])
600 G_SSR_UPDATE_INTERVAL(b->UpdateInterval)
601 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
602 G_SSR_IOD(b->SSRIOD)
603 G_SSR_PROVIDER_ID(b->SSRProviderID)
604 G_SSR_SOLUTION_ID(b->SSRSolutionID)
605 G_NO_OF_SATELLITES(nums)
606#ifdef BNC_DEBUG
607 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d\n",
608 b->EpochTime[s], b->UpdateInterval,mmi,b->NumberOfSat[s],nums,
609 b->SSRIOD, b->SSRProviderID, b->SSRSolutionID);
610#endif
611 for (i = 0; i < nums; ++i) {
612 G_GNSS_SATELLITE_ID(id)
613 for (pos = satoffset[s];
614 pos < satoffset[s] + b->NumberOfSat[s] && b->Sat[pos].ID != id;
615 ++pos)
616 ;
617 if (pos >= satoffset[s + 1])
618 return GCOBR_DATAMISMATCH;
619 else if (pos == b->NumberOfSat[s] + satoffset[s])
620 ++b->NumberOfSat[s];
621 b->Sat[pos].ID = id;
622 G_NO_OF_BIASES(b->Sat[pos].NumberOfCodeBiases)
623#ifdef BNC_DEBUG
624 fprintf(stderr, "id %2d #%d ",
625 b->Sat[pos].ID, b->Sat[pos].NumberOfCodeBiases);
626#endif
627 for (j = 0; j < b->Sat[pos].NumberOfCodeBiases; ++j) {
628 G_GNSS_SIGNAL_IDENTIFIER(b->Sat[pos].Biases[j].Type)
629 G_CODE_BIAS(b->Sat[pos].Biases[j].Bias)
630#ifdef BNC_DEBUG
631 fprintf(stderr, "t%02d b %8.2f ",
632 b->Sat[pos].Biases[j].Type, b->Sat[pos].Biases[j].Bias);
633#endif
634 }
635#ifdef BNC_DEBUG
636 fprintf(stderr, "\n");
637#endif
638 }
639 }
640 else if (corrOffset == COBOFS_PBIAS) { fprintf(stderr, "Pbias\n");
641 if (!pb)
642 return GCOBR_NOPHASEBIASPARAMETER;
643 pb->messageType = igstype;
644 G_SSR_EPOCH_TIME_CHECK(pb->EpochTime[s], pb->NumberOfSat[s])
645 G_SSR_UPDATE_INTERVAL(pb->UpdateInterval)
646 G_MULTIPLE_MESSAGE_INDICATOR(mmi)
647 G_SSR_IOD(pb->SSRIOD)
648 G_SSR_PROVIDER_ID(pb->SSRProviderID)
649 G_SSR_SOLUTION_ID(pb->SSRSolutionID)
650 G_DISPERSIVE_BIAS_INDICATOR(pb->DispersiveBiasConsistencyIndicator)
651 G_MW_CONSISTENCY_INDICATOR(pb->MWConsistencyIndicator)
652 G_NO_OF_SATELLITES(nums)
653#ifdef BNC_DEBUG
654 fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d dispInd %d mwInd %d\n",
655 pb->EpochTime[s], pb->UpdateInterval,mmi,pb->NumberOfSat[s],nums,
656 pb->SSRIOD, pb->SSRProviderID, pb->SSRSolutionID,
657 pb->DispersiveBiasConsistencyIndicator, pb->MWConsistencyIndicator);
658#endif
659 for (i = 0; i < nums; ++i) {
660 G_GNSS_SATELLITE_ID(id)
661 for (pos = satoffset[s];
662 pos < satoffset[s] + pb->NumberOfSat[s] && pb->Sat[pos].ID != id;
663 ++pos)
664 ;
665 if (pos >= satoffset[s + 1])
666 return GCOBR_DATAMISMATCH;
667 else if (pos == pb->NumberOfSat[s] + satoffset[s])
668 ++pb->NumberOfSat[s];
669 pb->Sat[pos].ID = id;
670 G_NO_OF_BIASES(pb->Sat[pos].NumberOfPhaseBiases)
671 G_YAW_ANGLE(pb->Sat[pos].YawAngle)
672 G_YAW_RATE(pb->Sat[pos].YawRate)
673#ifdef BNC_DEBUG
674 fprintf(stderr, "id %2d #%d y %10.6f yr %10.6f ",
675 pb->Sat[pos].ID, pb->Sat[pos].NumberOfPhaseBiases,
676 pb->Sat[pos].YawAngle/MPI, pb->Sat[pos].YawRate/MPI);
677#endif
678 for (j = 0; j < pb->Sat[pos].NumberOfPhaseBiases; ++j) {
679 G_GNSS_SIGNAL_IDENTIFIER(pb->Sat[pos].Biases[j].Type)
680 G_INTEGER_INDICATOR(pb->Sat[pos].Biases[j].SignalIntegerIndicator)
681 G_WIDE_LANE_INDICATOR(pb->Sat[pos].Biases[j].SignalsWideLaneIntegerIndicator)
682 G_DISCONTINUITY_COUNTER(pb->Sat[pos].Biases[j].SignalDiscontinuityCounter)
683 G_PHASE_BIAS(pb->Sat[pos].Biases[j].Bias)
684#ifdef BNC_DEBUG
685 fprintf(stderr, "t%02d int %d wl %d disc %02d b %8.4f ",
686 pb->Sat[pos].Biases[j].Type,
687 pb->Sat[pos].Biases[j].SignalIntegerIndicator,
688 pb->Sat[pos].Biases[j].SignalsWideLaneIntegerIndicator,
689 pb->Sat[pos].Biases[j].SignalDiscontinuityCounter,
690 pb->Sat[pos].Biases[j].Bias);
691#endif
692 }
693#ifdef BNC_DEBUG
694 fprintf(stderr, "\n");
695#endif
696 }
697 }
698 else {
699 continue;
700 }
701#ifdef BNC_DEBUG
702 for(igstype = 0; igstype < (unsigned int)size && (unsigned char)buffer[igstype] != 0xD3; ++igstype)
703 numbits += 8;
704 fprintf(stderr, "numbits left %d\n",numbits);
705#endif
706 return mmi ? GCOBR_MESSAGEFOLLOWS : GCOBR_OK;
707 }
708 }
709 return GCOBR_UNKNOWNTYPE;
710}
711
712//
713////////////////////////////////////////////////////////////////////////////
714std::string SsrCorrIgs::codeTypeToRnxType(char system, CodeType type) {
715 if (system == 'G') {
716 if (type == CODETYPE_GPS_L1_CA) return "1C";
717 if (type == CODETYPE_GPS_L1_P) return "1P";
718 if (type == CODETYPE_GPS_L1_Z) return "1W";
719
720 if (type == CODETYPE_GPS_SEMI_CODELESS) return "2D";
721 if (type == CODETYPE_GPS_L2_CA) return "2C";
722 if (type == CODETYPE_GPS_L2_P) return "2P";
723 if (type == CODETYPE_GPS_L2_Z) return "2W";
724 if (type == CODETYPE_GPS_L2C_M) return "2S";
725 if (type == CODETYPE_GPS_L2C_L) return "2L";
726
727 if (type == CODETYPE_GPS_L5_I) return "5I";
728 if (type == CODETYPE_GPS_L5_Q) return "5Q";
729
730 if (type == CODETYPE_GPS_L1C_D) return "1S";
731 if (type == CODETYPE_GPS_L1C_P) return "1L";
732 }
733 else if (system == 'R') {
734 if (type == CODETYPE_GLONASS_L1_CA) return "1C";
735 if (type == CODETYPE_GLONASS_L1_P) return "1P";
736
737 if (type == CODETYPE_GLONASS_L2_CA) return "2C";
738 if (type == CODETYPE_GLONASS_L2_P) return "2P";
739
740 if (type == CODETYPE_GLONASS_L1a_OCd) return "4A";
741 if (type == CODETYPE_GLONASS_L1a_OCp) return "4B";
742
743 if (type == CODETYPE_GLONASS_L2a_CSI) return "6A";
744 if (type == CODETYPE_GLONASS_L2a_OCp) return "6B";
745
746 if (type == CODETYPE_GLONASS_L3_I) return "3I";
747 if (type == CODETYPE_GLONASS_L3_Q) return "3Q";
748 }
749 else if (system == 'E') {
750 if (type == CODETYPE_GALILEO_E1_A) return "1A";
751 if (type == CODETYPE_GALILEO_E1_B) return "1B";
752 if (type == CODETYPE_GALILEO_E1_C) return "1C";
753
754 if (type == CODETYPE_GALILEO_E5A_I) return "5I";
755 if (type == CODETYPE_GALILEO_E5A_Q) return "5Q";
756
757 if (type == CODETYPE_GALILEO_E5B_I) return "7I";
758 if (type == CODETYPE_GALILEO_E5B_Q) return "7Q";
759
760 if (type == CODETYPE_GALILEO_E6_A) return "6A";
761 if (type == CODETYPE_GALILEO_E6_B) return "6B";
762 if (type == CODETYPE_GALILEO_E6_C) return "6C";
763 }
764 else if (system == 'J') {
765 if (type == CODETYPE_QZSS_L1_CA) return "1C";
766 if (type == CODETYPE_QZSS_L1C_D) return "1S";
767 if (type == CODETYPE_QZSS_L1C_P) return "1L";
768
769 if (type == CODETYPE_QZSS_L2C_M) return "2S";
770 if (type == CODETYPE_QZSS_L2C_L) return "2L";
771
772 if (type == CODETYPE_QZSS_L5_I) return "5I";
773 if (type == CODETYPE_QZSS_L5_Q) return "5Q";
774
775 if (type == CODETYPE_QZSS_L6_D) return "6S";
776 if (type == CODETYPE_QZSS_L6_P) return "6L";
777 if (type == CODETYPE_QZSS_L6_E) return "6E";
778 }
779 else if (system == 'C') {
780 if (type == CODETYPE_BDS_B1_I) return "2I";
781 if (type == CODETYPE_BDS_B1_Q) return "2Q";
782
783 if (type == CODETYPE_BDS_B3_I) return "6I";
784 if (type == CODETYPE_BDS_B3_Q) return "6Q";
785 if (type == CODETYPE_BDS_B3_A) return "6A";
786
787 if (type == CODETYPE_BDS_B2_I) return "7I";
788 if (type == CODETYPE_BDS_B2_Q) return "7Q";
789
790 if (type == CODETYPE_BDS_B1a_D) return "1D";
791 if (type == CODETYPE_BDS_B1a_P) return "1P";
792
793 if (type == CODETYPE_BDS_B2a_D) return "5D";
794 if (type == CODETYPE_BDS_B2a_P) return "5P";
795
796 if (type == CODETYPE_BDS_B1_A) return "1A";
797 }
798 else if (system == 'S') {
799 if (type == CODETYPE_SBAS_L1_CA) return "1C";
800
801 if (type == CODETYPE_SBAS_L5_I) return "5I";
802 if (type == CODETYPE_SBAS_L5_Q) return "5Q";
803 }
804 return "";
805}
806
807SsrCorr::CodeType SsrCorrIgs::rnxTypeToCodeType(char system, std::string type) {
808 if (system == 'G') {
809 if (type.compare("1C") == 0) {return CODETYPE_GPS_L1_CA;}
810 if (type.compare("1P") == 0) {return CODETYPE_GPS_L1_P;}
811 if (type.compare("1W") == 0) {return CODETYPE_GPS_L1_Z;}
812
813 if (type.compare("2D") == 0) {return CODETYPE_GPS_SEMI_CODELESS;}
814 if (type.compare("2C") == 0) {return CODETYPE_GPS_L2_CA;}
815 if (type.compare("2P") == 0) {return CODETYPE_GPS_L2_P;}
816 if (type.compare("2W") == 0) {return CODETYPE_GPS_L2_Z;}
817 if (type.compare("2S") == 0) {return CODETYPE_GPS_L2C_M;}
818 if (type.compare("2L") == 0) {return CODETYPE_GPS_L2C_L;}
819
820 if (type.compare("5I") == 0) {return CODETYPE_GPS_L5_I;}
821 if (type.compare("5Q") == 0) {return CODETYPE_GPS_L5_Q;}
822
823 if (type.compare("1S") == 0) {return CODETYPE_GPS_L1C_D;}
824 if (type.compare("1L") == 0) {return CODETYPE_GPS_L1C_P;}
825 }
826 else if (system == 'R') {
827 if (type.compare("1C") == 0) {return CODETYPE_GLONASS_L1_CA;}
828 if (type.compare("1P") == 0) {return CODETYPE_GLONASS_L1_P;}
829
830 if (type.compare("2C") == 0) {return CODETYPE_GLONASS_L2_CA;}
831 if (type.compare("2P") == 0) {return CODETYPE_GLONASS_L2_P;}
832
833 if (type.compare("4A") == 0) {return CODETYPE_GLONASS_L1a_OCd;}
834 if (type.compare("4B") == 0) {return CODETYPE_GLONASS_L1a_OCp;}
835
836 if (type.compare("6A") == 0) {return CODETYPE_GLONASS_L2a_CSI;}
837 if (type.compare("6B") == 0) {return CODETYPE_GLONASS_L2a_OCp;}
838
839 if (type.compare("3I") == 0) {return CODETYPE_GLONASS_L3_I;}
840 if (type.compare("3Q") == 0) {return CODETYPE_GLONASS_L3_Q;}
841 }
842 else if (system == 'E') {
843 if (type.compare("1A") == 0) {return CODETYPE_GALILEO_E1_A;}
844 if (type.compare("1B") == 0) {return CODETYPE_GALILEO_E1_B;}
845 if (type.compare("1C") == 0) {return CODETYPE_GALILEO_E1_C;}
846
847 if (type.compare("5I") == 0) {return CODETYPE_GALILEO_E5A_I;}
848 if (type.compare("5Q") == 0) {return CODETYPE_GALILEO_E5A_Q;}
849
850 if (type.compare("7I") == 0) {return CODETYPE_GALILEO_E5B_I;}
851 if (type.compare("7Q") == 0) {return CODETYPE_GALILEO_E5B_Q;}
852
853 if (type.compare("6A") == 0) {return CODETYPE_GALILEO_E6_A;}
854 if (type.compare("6B") == 0) {return CODETYPE_GALILEO_E6_B;}
855 if (type.compare("6C") == 0) {return CODETYPE_GALILEO_E6_C;}
856 }
857 else if (system == 'J') {
858 if (type.compare("1C") == 0) {return CODETYPE_QZSS_L1_CA;}
859 if (type.compare("1S") == 0) {return CODETYPE_QZSS_L1C_D;}
860 if (type.compare("1L") == 0) {return CODETYPE_QZSS_L1C_P;}
861
862 if (type.compare("2S") == 0) {return CODETYPE_QZSS_L2C_M;}
863 if (type.compare("2L") == 0) {return CODETYPE_QZSS_L2C_L;}
864
865 if (type.compare("5I") == 0) {return CODETYPE_QZSS_L5_I;}
866 if (type.compare("5Q") == 0) {return CODETYPE_QZSS_L5_Q;}
867
868 if (type.compare("6S") == 0) {return CODETYPE_QZSS_L6_D;}
869 if (type.compare("6L") == 0) {return CODETYPE_QZSS_L6_P;}
870 if (type.compare("6E") == 0) {return CODETYPE_QZSS_L6_E;}
871 }
872 else if (system == 'C') {
873 if (type.compare("2I") == 0) {return CODETYPE_BDS_B1_I;}
874 if (type.compare("2Q") == 0) {return CODETYPE_BDS_B1_Q;}
875
876 if (type.compare("6I") == 0) {return CODETYPE_BDS_B3_I;}
877 if (type.compare("6Q") == 0) {return CODETYPE_BDS_B3_Q;}
878 if (type.compare("6A") == 0) {return CODETYPE_BDS_B3_A;}
879
880 if (type.compare("7I") == 0) {return CODETYPE_BDS_B2_I;}
881 if (type.compare("7Q") == 0) {return CODETYPE_BDS_B2_Q;}
882
883 if (type.compare("1D") == 0) {return CODETYPE_BDS_B1a_D;}
884 if (type.compare("1P") == 0) {return CODETYPE_BDS_B1a_P;}
885
886 if (type.compare("5D") == 0) {return CODETYPE_BDS_B2a_D;}
887 if (type.compare("5P") == 0) {return CODETYPE_BDS_B2a_P;}
888
889 if (type.compare("1A") == 0) {return CODETYPE_BDS_B1_A;}
890 }
891 else if (system == 'S') {
892 if (type.compare("1C") == 0) {return CODETYPE_SBAS_L1_CA;}
893
894 if (type.compare("5I") == 0) {return CODETYPE_SBAS_L5_I;}
895 if (type.compare("5Q") == 0) {return CODETYPE_SBAS_L5_Q;}
896 }
897 return RESERVED;
898}
899
Note: See TracBrowser for help on using the repository browser.