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

Last change on this file since 9029 was 9029, checked in by stuerze, 8 months ago

debug output for ssr is switched off

  • Property svn:executable set to *
File size: 35.0 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 DEBUG
694            fprintf(stderr, "\n");
695#endif
696            }
697      }
698      else {
699        continue;
700      }
701#ifdef 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.