source: ntrip/trunk/BNC/src/RTCM3/RTCM3Decoder.cpp @ 8971

Last change on this file since 8971 was 8971, checked in by stuerze, 2 months ago

minor changes regarding igs ssr decoding

File size: 57.4 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class:      RTCM3Decoder
30 *
31 * Purpose:    RTCM3 Decoder
32 *
33 * Author:     L. Mervart
34 *
35 * Created:    24-Aug-2006
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42#include <iomanip>
43#include <sstream>
44#include <math.h>
45#include <string.h>
46
47#include "bits.h"
48#include "gnss.h"
49#include "RTCM3Decoder.h"
50#include "rtcm_utils.h"
51#include "bncconst.h"
52#include "bnccore.h"
53#include "bncutils.h"
54#include "bncsettings.h"
55
56using namespace std;
57
58// Error Handling
59////////////////////////////////////////////////////////////////////////////
60void RTCM3Error(const char*, ...) {
61}
62
63// Constructor
64////////////////////////////////////////////////////////////////////////////
65RTCM3Decoder::RTCM3Decoder(const QString& staID, bncRawFile* rawFile) :
66    GPSDecoder() {
67
68  _staID = staID;
69  _rawFile = rawFile;
70
71  connect(this, SIGNAL(newGPSEph(t_ephGPS)), BNC_CORE,
72      SLOT(slotNewGPSEph(t_ephGPS)));
73  connect(this, SIGNAL(newGlonassEph(t_ephGlo)), BNC_CORE,
74      SLOT(slotNewGlonassEph(t_ephGlo)));
75  connect(this, SIGNAL(newGalileoEph(t_ephGal)), BNC_CORE,
76      SLOT(slotNewGalileoEph(t_ephGal)));
77  connect(this, SIGNAL(newSBASEph(t_ephSBAS)), BNC_CORE,
78      SLOT(slotNewSBASEph(t_ephSBAS)));
79  connect(this, SIGNAL(newBDSEph(t_ephBDS)), BNC_CORE,
80      SLOT(slotNewBDSEph(t_ephBDS)));
81
82  _MessageSize = _SkipBytes = _BlockSize = _NeedBytes = 0;
83}
84
85// Destructor
86////////////////////////////////////////////////////////////////////////////
87RTCM3Decoder::~RTCM3Decoder() {
88  QMapIterator<QByteArray, RTCM3coDecoder*> it(_coDecoders);
89  while (it.hasNext())
90  {
91    it.next();
92    delete it.value();
93  }
94}
95
96//
97////////////////////////////////////////////////////////////////////////////
98bool RTCM3Decoder::DecodeRTCM3GPS(unsigned char* data, int size) {
99  bool decoded = false;
100  bncTime CurrentObsTime;
101  int i, numsats, syncf, type;
102  uint64_t numbits = 0, bitfield = 0;
103
104  data += 3; /* header */
105  size -= 6; /* header + crc */
106
107  GETBITS(type, 12)
108  SKIPBITS(12)
109  /* id */
110  GETBITS(i, 30)
111
112  CurrentObsTime.set(i);
113  if (_CurrentTime.valid() && CurrentObsTime != _CurrentTime) {
114    decoded = true;
115    _obsList.append(_CurrentObsList);
116    _CurrentObsList.clear();
117  }
118
119  _CurrentTime = CurrentObsTime;
120
121  GETBITS(syncf, 1)
122  /* sync */
123  GETBITS(numsats, 5)
124  SKIPBITS(4)
125  /* smind, smint */
126
127  while (numsats--) {
128    int sv, code, l1range, amb = 0;
129    t_satObs CurrentObs;
130    CurrentObs._time = CurrentObsTime;
131
132    GETBITS(sv, 6)
133    if (sv < 40)
134      CurrentObs._prn.set('G', sv);
135    else
136      CurrentObs._prn.set('S', sv - 20);
137
138    t_frqObs *frqObs = new t_frqObs;
139    /* L1 */
140    GETBITS(code, 1);
141    (code) ?
142        frqObs->_rnxType2ch.assign("1W") : frqObs->_rnxType2ch.assign("1C");
143    GETBITS(l1range, 24);
144    GETBITSSIGN(i, 20);
145    if ((i & ((1 << 20) - 1)) != 0x80000) {
146      frqObs->_code = l1range * 0.02;
147      frqObs->_phase = (l1range * 0.02 + i * 0.0005) / GPS_WAVELENGTH_L1;
148      frqObs->_codeValid = frqObs->_phaseValid = true;
149    }
150    GETBITS(i, 7);
151    frqObs->_lockTime = lti2sec(type,i);
152    frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);
153    frqObs->_slipCounter = i;
154    if (type == 1002 || type == 1004) {
155      GETBITS(amb, 8);
156      if (amb) {
157        frqObs->_code += amb * 299792.458;
158        frqObs->_phase += (amb * 299792.458) / GPS_WAVELENGTH_L1;
159      }
160      GETBITS(i, 8);
161      if (i) {
162        frqObs->_snr = i * 0.25;
163        frqObs->_snrValid = true;
164      }
165    }
166    CurrentObs._obs.push_back(frqObs);
167    if (type == 1003 || type == 1004) {
168      frqObs = new t_frqObs;
169      /* L2 */
170      GETBITS(code, 2);
171      switch (code) {
172        case 3:
173          frqObs->_rnxType2ch.assign("2W"); /* or "2Y"? */
174          break;
175        case 2:
176          frqObs->_rnxType2ch.assign("2W");
177          break;
178        case 1:
179          frqObs->_rnxType2ch.assign("2P");
180          break;
181        case 0:
182          frqObs->_rnxType2ch.assign("2X"); /* or "2S" or "2L"? */
183          break;
184      }
185      GETBITSSIGN(i, 14);
186      if ((i & ((1 << 14) - 1)) != 0x2000) {
187        frqObs->_code = l1range * 0.02 + i * 0.02 + amb * 299792.458;
188        frqObs->_codeValid = true;
189      }
190      GETBITSSIGN(i, 20);
191      if ((i & ((1 << 20) - 1)) != 0x80000) {
192        frqObs->_phase = (l1range * 0.02 + i * 0.0005 + amb * 299792.458)
193            / GPS_WAVELENGTH_L2;
194        frqObs->_phaseValid = true;
195      }
196      GETBITS(i, 7);
197      frqObs->_lockTime = lti2sec(type,i);
198      frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);
199      frqObs->_slipCounter = i;
200      if (type == 1004) {
201        GETBITS(i, 8);
202        if (i) {
203          frqObs->_snr = i * 0.25;
204          frqObs->_snrValid = true;
205        }
206      }
207      CurrentObs._obs.push_back(frqObs);
208    }
209    _CurrentObsList.push_back(CurrentObs);
210  }
211
212  if (!syncf) {
213    decoded = true;
214    _obsList.append(_CurrentObsList);
215    _CurrentTime.reset();
216    _CurrentObsList.clear();
217  }
218  return decoded;
219}
220
221#define RTCM3_MSM_NUMSIG      32
222#define RTCM3_MSM_NUMSAT      64
223#define RTCM3_MSM_NUMCELLS    96 /* arbitrary limit */
224
225/**
226 * Frequency numbers of GLONASS with an offset of 100 to detect unset values.
227 * Gets filled by ephemeris and data blocks and shared between different streams.
228 */
229static int GLOFreq[RTCM3_MSM_NUMSAT];
230
231/*
232 * Storage structure to store frequency and RINEX ID assignment for MSM
233 * message */
234struct CodeData {
235  double wl;
236  const char *code; /* currently unused */
237};
238
239/** MSM signal types for GPS and SBAS */
240static struct CodeData gps[RTCM3_MSM_NUMSIG] = {
241        {0.0, 0},
242        {GPS_WAVELENGTH_L1, "1C"},
243        {GPS_WAVELENGTH_L1, "1P"},
244        {GPS_WAVELENGTH_L1, "1W"},
245        {0.0, 0},
246        {0.0, 0},
247        {0.0, 0},
248        {GPS_WAVELENGTH_L2, "2C"},
249        {GPS_WAVELENGTH_L2, "2P"},
250        {GPS_WAVELENGTH_L2, "2W"},
251        {0.0, 0},
252        {0.0, 0},
253        {0.0, 0},
254        {0.0, 0},
255        {GPS_WAVELENGTH_L2, "2S"},
256        {GPS_WAVELENGTH_L2, "2L"},
257        {GPS_WAVELENGTH_L2, "2X"},
258        {0.0, 0},
259        {0.0, 0},
260        {0.0, 0},
261        {0.0, 0},
262        {GPS_WAVELENGTH_L5, "5I"},
263        {GPS_WAVELENGTH_L5, "5Q"},
264        {GPS_WAVELENGTH_L5, "5X"},
265        {0.0, 0},
266        {0.0, 0},
267        {0.0, 0},
268        {0.0, 0},
269        {0.0, 0},
270        {GPS_WAVELENGTH_L1, "1S"},
271        {GPS_WAVELENGTH_L1, "1L"},
272        {GPS_WAVELENGTH_L1, "1X"}
273    };
274
275/**
276 * MSM signal types for GLONASS
277 *
278 * NOTE: Uses 0.0, 1.0 for wavelength as sat index dependence is done later!
279 */
280static struct CodeData glo[RTCM3_MSM_NUMSIG] = {
281        {0.0, 0},
282        {0.0, "1C"},
283        {0.0, "1P"},
284        {0.0, 0},
285        {0.0, 0},
286        {0.0, 0},
287        {0.0, 0},
288        {1.0, "2C"},
289        {1.0, "2P"},
290        {GLO_WAVELENGTH_L1a, "4A"},
291        {GLO_WAVELENGTH_L1a, "4B"},
292        {GLO_WAVELENGTH_L1a, "4X"},
293        {GLO_WAVELENGTH_L2a, "6A"},
294        {GLO_WAVELENGTH_L2a, "6B"},
295        {GLO_WAVELENGTH_L2a, "6X"},
296        {GLO_WAVELENGTH_L3,  "3I"},
297        {GLO_WAVELENGTH_L3,  "3Q"},
298        {GLO_WAVELENGTH_L3,  "3X"},
299        {0.0, 0},
300        {0.0, 0},
301        {0.0, 0},
302        {0.0, 0},
303        {0.0, 0},
304        {0.0, 0},
305        {0.0, 0},
306        {0.0, 0},
307        {0.0, 0},
308        {0.0, 0},
309        {0.0, 0},
310        {0.0, 0},
311        {0.0, 0},
312        {0.0, 0}
313    };
314
315/** MSM signal types for Galileo */
316static struct CodeData gal[RTCM3_MSM_NUMSIG] = {
317        {0.0, 0},
318        {GAL_WAVELENGTH_E1,  "1C"},
319        {GAL_WAVELENGTH_E1,  "1A"},
320        {GAL_WAVELENGTH_E1,  "1B"},
321        {GAL_WAVELENGTH_E1,  "1X"},
322        {GAL_WAVELENGTH_E1,  "1Z"},
323        {0.0, 0},
324        {GAL_WAVELENGTH_E6,  "6C"},
325        {GAL_WAVELENGTH_E6,  "6A"},
326        {GAL_WAVELENGTH_E6,  "6B"},
327        {GAL_WAVELENGTH_E6,  "6X"},
328        {GAL_WAVELENGTH_E6,  "6Z"},
329        {0.0, 0},
330        {GAL_WAVELENGTH_E5B, "7I"},
331        {GAL_WAVELENGTH_E5B, "7Q"},
332        {GAL_WAVELENGTH_E5B, "7X"},
333        {0.0, 0},
334        {GAL_WAVELENGTH_E5AB,"8I"},
335        {GAL_WAVELENGTH_E5AB,"8Q"},
336        {GAL_WAVELENGTH_E5AB,"8X"},
337        {0.0, 0},
338        {GAL_WAVELENGTH_E5A, "5I"},
339        {GAL_WAVELENGTH_E5A, "5Q"},
340        {GAL_WAVELENGTH_E5A, "5X"},
341        {0.0, 0},
342        {0.0, 0},
343        {0.0, 0},
344        {0.0, 0},
345        {0.0, 0},
346        {0.0, 0},
347        {0.0, 0},
348        {0.0, 0}
349    };
350
351/** MSM signal types for QZSS */
352static struct CodeData qzss[RTCM3_MSM_NUMSIG] = {
353        {0.0, 0},
354        {GPS_WAVELENGTH_L1, "1C"},
355        {0.0, 0},
356        {0.0, 0},
357        {0.0, 0},
358        {0.0, 0},
359        {0.0, 0},
360        {0.0, 0},
361        {QZSS_WAVELENGTH_L6, "6S"},
362        {QZSS_WAVELENGTH_L6, "6L"},
363        {QZSS_WAVELENGTH_L6, "6X"},
364        {0.0, 0},
365        {0.0, 0},
366        {0.0, 0},
367        {GPS_WAVELENGTH_L2, "2S"},
368        {GPS_WAVELENGTH_L2, "2L"},
369        {GPS_WAVELENGTH_L2, "2X"},
370        {0.0, 0},
371        {0.0, 0},
372        {0.0, 0},
373        {0.0, 0},
374        {GPS_WAVELENGTH_L5, "5I"},
375        {GPS_WAVELENGTH_L5, "5Q"},
376        {GPS_WAVELENGTH_L5, "5X"},
377        {0.0, 0},
378        {0.0, 0},
379        {0.0, 0},
380        {0.0, 0},
381        {0.0, 0},
382        {GPS_WAVELENGTH_L1, "1S"},
383        {GPS_WAVELENGTH_L1, "1L"},
384        {GPS_WAVELENGTH_L1, "1X"}
385    };
386
387/** MSM signal types for Beidou/BDS */
388static struct CodeData bds[RTCM3_MSM_NUMSIG] = {
389        {0.0, 0},
390        {BDS_WAVELENGTH_B1, "2I"},
391        {BDS_WAVELENGTH_B1, "2Q"},
392        {BDS_WAVELENGTH_B1, "2X"},
393        {0.0, 0},
394        {0.0, 0},
395        {0.0, 0},
396        {BDS_WAVELENGTH_B3, "6I"},
397        {BDS_WAVELENGTH_B3, "6Q"},
398        {BDS_WAVELENGTH_B3, "6X"},
399        {0.0, 0},
400        {0.0, 0},
401        {0.0, 0},
402        {BDS_WAVELENGTH_B2, "7I"},
403        {BDS_WAVELENGTH_B2, "7Q"},
404        {BDS_WAVELENGTH_B2, "7X"},
405        {0.0, 0},
406        {0.0, 0},
407        {0.0, 0},
408        {0.0, 0},
409        {0.0, 0},
410        {BDS_WAVELENGTH_B2a, "5D"},
411        {BDS_WAVELENGTH_B2a, "5P"},
412        {BDS_WAVELENGTH_B2a, "5X"},
413        {0.0, 0},
414        {0.0, 0},
415        {0.0, 0},
416        {0.0, 0},
417        {0.0, 0},
418        {BDS_WAVELENGTH_B1C, "1D"},
419        {BDS_WAVELENGTH_B1C, "1P"},
420        {BDS_WAVELENGTH_B1C, "1X"}
421    };
422
423/** MSM signal types for IRNSS */
424static struct CodeData irn[RTCM3_MSM_NUMSIG] = {
425        {0.0, 0},
426        {0.0, 0},
427        {0.0, 0},
428        {0.0, 0},
429        {0.0, 0},
430        {0.0, 0},
431        {0.0, 0},
432        {IRNSS_WAVELENGTH_S, "9A"},
433        {0.0, 0},
434        {0.0, 0},
435        {0.0, 0},
436        {0.0, 0},
437        {0.0, 0},
438        {0.0, 0},
439        {0.0, 0},
440        {0.0, 0},
441        {0.0, 0},
442        {0.0, 0},
443        {0.0, 0},
444        {0.0, 0},
445        {0.0, 0},
446        {IRNSS_WAVELENGTH_L5, "5A"},
447        {0.0, 0},
448        {0.0, 0},
449        {0.0, 0},
450        {0.0, 0},
451        {0.0, 0},
452        {0.0, 0},
453        {0.0, 0},
454        {0.0, 0},
455        {0.0, 0},
456        {0.0, 0}
457    };
458
459#define UINT64(c) c ## ULL
460
461//
462////////////////////////////////////////////////////////////////////////////
463bool RTCM3Decoder::DecodeRTCM3MSM(unsigned char* data, int size) {
464  bool decoded = false;
465  int type, syncf, i;
466  uint64_t numbits = 0, bitfield = 0;
467
468  data += 3; /* header */
469  size -= 6; /* header + crc */
470
471  GETBITS(type, 12)
472  SKIPBITS(12)
473  /* id */
474  char sys;
475  if      (type >= 1121)
476    sys = 'C';
477  else if (type >= 1111)
478    sys = 'J';
479  else if (type >= 1101)
480    sys = 'S';
481  else if (type >= 1091)
482    sys = 'E';
483  else if (type >= 1081)
484    sys = 'R';
485  else if (type >= 1071)
486    sys = 'G';
487  else if (type >=   21) // test
488    sys = 'I';
489
490  bncTime CurrentObsTime;
491  if      (sys == 'C') /* BDS */ {
492    GETBITS(i, 30)
493    CurrentObsTime.setBDS(i);
494  }
495  else if (sys == 'R') /* GLONASS */ {
496    SKIPBITS(3)
497    GETBITS(i, 27)
498    /* tk */
499    CurrentObsTime.setTk(i);
500  }
501  else /* GPS style date */ {
502    GETBITS(i, 30)
503    CurrentObsTime.set(i);
504  }
505  if (_CurrentTime.valid() && CurrentObsTime != _CurrentTime) {
506    decoded = true;
507    _obsList.append(_CurrentObsList);
508    _CurrentObsList.clear();
509  }
510  _CurrentTime = CurrentObsTime;
511
512  GETBITS(syncf, 1)
513  /**
514   * Ignore unknown types except for sync flag
515   *
516   * We actually support types 1-3 in following code, but as they are missing
517   * the full cycles and can't be used later we skip interpretation here already.
518   */
519  if (type <= 1130 && (type % 10) >= 4 && (type % 10) <= 7) {
520    int sigmask, numsat = 0, numsig = 0;
521    uint64_t satmask, cellmask, ui;
522    // satellite data
523    double rrmod[RTCM3_MSM_NUMSAT]; // GNSS sat rough ranges modulo 1 millisecond
524    int    rrint[RTCM3_MSM_NUMSAT]; // number of integer msecs in GNSS sat rough ranges
525    int    rdop[RTCM3_MSM_NUMSAT];  // GNSS sat rough phase range rates
526    int    extsat[RTCM3_MSM_NUMSAT];// extended sat info
527    // signal data
528    int    ll[RTCM3_MSM_NUMCELLS];  // lock time indicator
529    /*int    hc[RTCM3_MSM_NUMCELLS];*/  // half cycle ambiguity indicator
530    double cnr[RTCM3_MSM_NUMCELLS]; // signal cnr
531    double cp[RTCM3_MSM_NUMCELLS];  // fine phase range data
532    double psr[RTCM3_MSM_NUMCELLS]; // fine psr
533    double dop[RTCM3_MSM_NUMCELLS]; // fine phase range rates
534
535    SKIPBITS(3 + 7 + 2 + 2 + 1 + 3)
536    GETBITS64(satmask, RTCM3_MSM_NUMSAT)
537
538    /* http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/ */
539    for (ui = satmask; ui; ui &= (ui - 1) /* remove rightmost bit */)
540      ++numsat;
541    GETBITS(sigmask, RTCM3_MSM_NUMSIG)
542    for (i = sigmask; i; i &= (i - 1) /* remove rightmost bit */)
543      ++numsig;
544    for (i = 0; i < RTCM3_MSM_NUMSAT; ++i)
545      extsat[i] = 15;
546
547    i = numsat * numsig;
548    GETBITS64(cellmask, (unsigned )i)
549    // satellite data
550    switch (type % 10) {
551      case 1:
552      case 2:
553      case 3:
554        /* partial data, already skipped above, but implemented for future expansion ! */
555        for (int j = numsat; j--;)
556          GETFLOAT(rrmod[j], 10, 1.0 / 1024.0)
557        break;
558      case 4:
559      case 6:
560        for (int j = numsat; j--;)
561          GETBITS(rrint[j], 8)
562        for (int j = numsat; j--;)
563          GETFLOAT(rrmod[j], 10, 1.0 / 1024.0)
564        break;
565      case 5:
566      case 7:
567        for (int j = numsat; j--;)
568          GETBITS(rrint[j], 8)
569        for (int j = numsat; j--;)
570          GETBITS(extsat[j], 4)
571        for (int j = numsat; j--;)
572          GETFLOAT(rrmod[j], 10, 1.0 / 1024.0)
573        for (int j = numsat; j--;)
574          GETBITSSIGN(rdop[j], 14)
575        break;
576    }
577    // signal data
578    int numcells = numsat * numsig;
579    /** Drop anything which exceeds our cell limit. Increase limit definition
580     * when that happens. */
581    if (numcells <= RTCM3_MSM_NUMCELLS) {
582      switch (type % 10) {
583        case 1:
584          for (int count = numcells; count--;)
585            if (cellmask & (UINT64(1) << count))
586              GETFLOATSIGN(psr[count], 15, 1.0 / (1 << 24))
587          break;
588        case 2:
589          for (int count = numcells; count--;)
590            if (cellmask & (UINT64(1) << count))
591              GETFLOATSIGN(cp[count], 22, 1.0 / (1 << 29))
592          for (int count = numcells; count--;)
593            if (cellmask & (UINT64(1) << count))
594              GETBITS(ll[count], 4)
595          for (int count = numcells; count--;)
596            if (cellmask & (UINT64(1) << count))
597              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
598          break;
599        case 3:
600          for (int count = numcells; count--;)
601            if (cellmask & (UINT64(1) << count))
602              GETFLOATSIGN(psr[count], 15, 1.0 / (1 << 24))
603          for (int count = numcells; count--;)
604            if (cellmask & (UINT64(1) << count))
605              GETFLOATSIGN(cp[count], 22, 1.0 / (1 << 29))
606          for (int count = numcells; count--;)
607            if (cellmask & (UINT64(1) << count))
608              GETBITS(ll[count], 4)
609          for (int count = numcells; count--;)
610            if (cellmask & (UINT64(1) << count))
611              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
612          break;
613        case 4:
614          for (int count = numcells; count--;)
615            if (cellmask & (UINT64(1) << count))
616              GETFLOATSIGN(psr[count], 15, 1.0 / (1 << 24))
617          for (int count = numcells; count--;)
618            if (cellmask & (UINT64(1) << count))
619              GETFLOATSIGN(cp[count], 22, 1.0 / (1 << 29))
620          for (int count = numcells; count--;)
621            if (cellmask & (UINT64(1) << count))
622              GETBITS(ll[count], 4)
623          for (int count = numcells; count--;)
624            if (cellmask & (UINT64(1) << count))
625              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
626          for (int count = numcells; count--;)
627            if (cellmask & (UINT64(1) << count))
628              GETBITS(cnr[count], 6)
629          break;
630        case 5:
631          for (int count = numcells; count--;)
632            if (cellmask & (UINT64(1) << count))
633              GETFLOATSIGN(psr[count], 15, 1.0 / (1 << 24))
634          for (int count = numcells; count--;)
635            if (cellmask & (UINT64(1) << count))
636              GETFLOATSIGN(cp[count], 22, 1.0 / (1 << 29))
637          for (int count = numcells; count--;)
638            if (cellmask & (UINT64(1) << count))
639              GETBITS(ll[count], 4)
640          for (int count = numcells; count--;)
641            if (cellmask & (UINT64(1) << count))
642              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
643          for (int count = numcells; count--;)
644            if (cellmask & (UINT64(1) << count))
645              GETFLOAT(cnr[count], 6, 1.0)
646          for (int count = numcells; count--;)
647            if (cellmask & (UINT64(1) << count))
648              GETFLOATSIGN(dop[count], 15, 0.0001)
649          break;
650        case 6:
651          for (int count = numcells; count--;)
652            if (cellmask & (UINT64(1) << count))
653              GETFLOATSIGN(psr[count], 20, 1.0 / (1 << 29))
654          for (int count = numcells; count--;)
655            if (cellmask & (UINT64(1) << count))
656              GETFLOATSIGN(cp[count], 24, 1.0 / (1U << 31))
657          for (int count = numcells; count--;)
658            if (cellmask & (UINT64(1) << count))
659              GETBITS(ll[count], 10)
660          for (int count = numcells; count--;)
661            if (cellmask & (UINT64(1) << count))
662              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
663          for (int count = numcells; count--;)
664            if (cellmask & (UINT64(1) << count))
665              GETFLOAT(cnr[count], 10, 1.0 / (1 << 4))
666          break;
667        case 7:
668          for (int count = numcells; count--;)
669            if (cellmask & (UINT64(1) << count))
670              GETFLOATSIGN(psr[count], 20, 1.0 / (1 << 29))
671          for (int count = numcells; count--;)
672            if (cellmask & (UINT64(1) << count))
673              GETFLOATSIGN(cp[count], 24, 1.0 / (1U << 31))
674          for (int count = numcells; count--;)
675            if (cellmask & (UINT64(1) << count))
676              GETBITS(ll[count], 10)
677          for (int count = numcells; count--;)
678            if (cellmask & (UINT64(1) << count))
679              SKIPBITS(1)/*GETBITS(hc[count], 1)*/
680          for (int count = numcells; count--;)
681            if (cellmask & (UINT64(1) << count))
682              GETFLOAT(cnr[count], 10, 1.0 / (1 << 4))
683          for (int count = numcells; count--;)
684            if (cellmask & (UINT64(1) << count))
685              GETFLOATSIGN(dop[count], 15, 0.0001)
686          break;
687      }
688      i = RTCM3_MSM_NUMSAT;
689      int j = -1;
690      t_satObs CurrentObs;
691      for (int count = numcells; count--;) {
692        while (j >= 0 && !(sigmask & (1 << --j)))
693          ;
694        if (j < 0) {
695          while (!(satmask & (UINT64(1) << (--i))))
696            /* next satellite */
697            ;
698          if (CurrentObs._obs.size() > 0)
699            _CurrentObsList.push_back(CurrentObs);
700          CurrentObs.clear();
701          CurrentObs._time = CurrentObsTime;
702          if (sys == 'S')
703            CurrentObs._prn.set(sys, 20 - 1 + RTCM3_MSM_NUMSAT - i);
704          else
705            CurrentObs._prn.set(sys, RTCM3_MSM_NUMSAT - i);
706          j = RTCM3_MSM_NUMSIG;
707          while (!(sigmask & (1 << --j)))
708            ;
709          --numsat;
710        }
711        if (cellmask & (UINT64(1) << count)) {
712          struct CodeData cd = {0.0, 0};
713          switch (sys) {
714            case 'J':
715              cd = qzss[RTCM3_MSM_NUMSIG - j - 1];
716              break;
717            case 'C':
718              cd = bds[RTCM3_MSM_NUMSIG - j - 1];
719              break;
720            case 'G':
721            case 'S':
722              cd = gps[RTCM3_MSM_NUMSIG - j - 1];
723              break;
724            case 'R':
725              cd = glo[RTCM3_MSM_NUMSIG - j - 1];
726              {
727                int k = GLOFreq[RTCM3_MSM_NUMSAT - i - 1];
728                if (extsat[numsat] < 14) { // channel number is available as extended info for MSM5/7
729                  k = GLOFreq[RTCM3_MSM_NUMSAT - i - 1] = 100 + extsat[numsat] - 7;
730                }
731                if (k) {
732                  if      (cd.wl == 0.0) {
733                    cd.wl = GLO_WAVELENGTH_L1(k - 100);
734                  }
735                  else if (cd.wl == 1.0) {
736                    cd.wl = GLO_WAVELENGTH_L2(k - 100);
737                  }
738                }
739                else if (!k && cd.wl <= 1) {
740                  cd.code = 0;
741                }
742              }
743              break;
744            case 'E':
745              cd = gal[RTCM3_MSM_NUMSIG - j - 1];
746              break;
747            case 'I':
748              cd = irn[RTCM3_MSM_NUMSIG - j - 1];
749              break;
750          }
751          if (cd.code) {
752            t_frqObs *frqObs = new t_frqObs;
753            frqObs->_rnxType2ch.assign(cd.code);
754
755            switch (type % 10) {
756              case 1:
757                if (psr[count] > -1.0 / (1 << 10)) {
758                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
759                                + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
760                  frqObs->_codeValid = true;
761                }
762                break;
763              case 2:
764                if (cp[count] > -1.0 / (1 << 8)) {
765                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
766                                 + (rrmod[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
767                  frqObs->_phaseValid = true;
768                  frqObs->_lockTime = lti2sec(type,ll[count]);
769                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
770                  frqObs->_slipCounter = ll[count];
771                }
772                break;
773              case 3:
774                if (psr[count] > -1.0 / (1 << 10)) {
775                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
776                                + (rrmod[numsat]) * LIGHTSPEED / 1000.0;
777                  frqObs->_codeValid = true;
778                }
779                if (cp[count] > -1.0 / (1 << 8)) {
780                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
781                                 + rrmod[numsat] * LIGHTSPEED / 1000.0 / cd.wl;
782                  frqObs->_phaseValid = true;
783                  frqObs->_lockTime = lti2sec(type,ll[count]);
784                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
785                  frqObs->_slipCounter = ll[count];
786                }
787                break;
788              case 4:
789                if (psr[count] > -1.0 / (1 << 10)) {
790                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
791                                + (rrmod[numsat] +  rrint[numsat]) * LIGHTSPEED / 1000.0;
792                  frqObs->_codeValid = true;
793                }
794                if (cp[count] > -1.0 / (1 << 8)) {
795                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
796                                 + (rrmod[numsat] +  rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
797                  frqObs->_phaseValid = true;
798                  frqObs->_lockTime = lti2sec(type,ll[count]);
799                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
800                  frqObs->_slipCounter = ll[count];
801                }
802                frqObs->_snr = cnr[count];
803                frqObs->_snrValid = true;
804                break;
805              case 5:
806                if (psr[count] > -1.0 / (1 << 10)) {
807                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
808                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
809                  frqObs->_codeValid = true;
810                }
811                if (cp[count] > -1.0 / (1 << 8)) {
812                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
813                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
814                  frqObs->_phaseValid = true;
815                  frqObs->_lockTime = lti2sec(type,ll[count]);
816                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
817                  frqObs->_slipCounter = ll[count];
818                }
819                frqObs->_snr = cnr[count];
820                frqObs->_snrValid = true;
821                if (dop[count] > -1.6384) {
822                  frqObs->_doppler = -(dop[count] + rdop[numsat]) / cd.wl;
823                  frqObs->_dopplerValid = true;
824                }
825                break;
826              case 6:
827                if (psr[count] > -1.0 / (1 << 10)) {
828                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
829                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
830                  frqObs->_codeValid = true;
831                }
832                if (cp[count] > -1.0 / (1 << 8)) {
833                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
834                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
835                  frqObs->_phaseValid = true;
836                  frqObs->_lockTime = lti2sec(type,ll[count]);
837                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
838                  frqObs->_slipCounter = ll[count];
839                }
840
841                frqObs->_snr = cnr[count];
842                frqObs->_snrValid = true;
843                break;
844              case 7:
845                if (psr[count] > -1.0 / (1 << 10)) {
846                  frqObs->_code = psr[count] * LIGHTSPEED / 1000.0
847                                + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0;
848                  frqObs->_codeValid = true;
849                }
850                if (cp[count] > -1.0 / (1 << 8)) {
851                  frqObs->_phase = cp[count] * LIGHTSPEED / 1000.0 / cd.wl
852                                 + (rrmod[numsat] + rrint[numsat]) * LIGHTSPEED / 1000.0 / cd.wl;
853                  frqObs->_phaseValid = true;
854                  frqObs->_lockTime = lti2sec(type,ll[count]);
855                  frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0);
856                  frqObs->_slipCounter = ll[count];
857                }
858
859                frqObs->_snr = cnr[count];
860                frqObs->_snrValid = true;
861
862                if (dop[count] > -1.6384) {
863                  frqObs->_doppler = -(dop[count] + rdop[numsat]) / cd.wl;
864                  frqObs->_dopplerValid = true;
865                }
866                break;
867            }
868            CurrentObs._obs.push_back(frqObs);
869          }
870        }
871      }
872      if (CurrentObs._obs.size() > 0) {
873        _CurrentObsList.push_back(CurrentObs);
874      }
875    }
876  }
877  else if ((type % 10) < 4) {
878    emit(newMessage(QString("%1: Block %2 contain partial data! Ignored!")
879        .arg(_staID).arg(type).toLatin1(), true));
880  }
881  if (!syncf) {
882    decoded = true;
883    _obsList.append(_CurrentObsList);
884    _CurrentTime.reset();
885    _CurrentObsList.clear();
886  }
887  return decoded;
888}
889
890//
891////////////////////////////////////////////////////////////////////////////
892bool RTCM3Decoder::DecodeRTCM3GLONASS(unsigned char* data, int size) {
893  bool decoded = false;
894  bncTime CurrentObsTime;
895  int i, numsats, syncf, type;
896  uint64_t numbits = 0, bitfield = 0;
897
898  data += 3; /* header */
899  size -= 6; /* header + crc */
900
901  GETBITS(type, 12)
902  SKIPBITS(12)
903  /* id */
904  GETBITS(i, 27)
905  /* tk */
906
907  CurrentObsTime.setTk(i);
908  if (_CurrentTime.valid() && CurrentObsTime != _CurrentTime) {
909    decoded = true;
910    _obsList.append(_CurrentObsList);
911    _CurrentObsList.clear();
912  }
913  _CurrentTime = CurrentObsTime;
914
915  GETBITS(syncf, 1)
916  /* sync */
917  GETBITS(numsats, 5)
918  SKIPBITS(4)
919  /* smind, smint */
920
921  while (numsats--) {
922    int sv, code, l1range, amb = 0, freq;
923    t_satObs CurrentObs;
924    CurrentObs._time = CurrentObsTime;
925
926    GETBITS(sv, 6)
927    CurrentObs._prn.set('R', sv);
928    GETBITS(code, 1)
929    GETBITS(freq, 5)
930    GLOFreq[sv - 1] = 100 + freq - 7; /* store frequency for other users (MSM) */
931
932    t_frqObs *frqObs = new t_frqObs;
933    /* L1 */
934    (code) ?
935        frqObs->_rnxType2ch.assign("1P") : frqObs->_rnxType2ch.assign("1C");
936    GETBITS(l1range, 25);
937    GETBITSSIGN(i, 20);
938    if ((i & ((1 << 20) - 1)) != 0x80000) {
939      frqObs->_code = l1range * 0.02;
940      frqObs->_phase = (l1range * 0.02 + i * 0.0005)
941          / GLO_WAVELENGTH_L1(freq - 7);
942      frqObs->_codeValid = frqObs->_phaseValid = true;
943    }
944    GETBITS(i, 7);
945    frqObs->_lockTime = lti2sec(type,i);
946    frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);
947    frqObs->_slipCounter = i;
948    if (type == 1010 || type == 1012) {
949      GETBITS(amb, 7);
950      if (amb) {
951        frqObs->_code += amb * 599584.916;
952        frqObs->_phase += (amb * 599584.916) / GLO_WAVELENGTH_L1(freq - 7);
953      }
954      GETBITS(i, 8);
955      if (i) {
956        frqObs->_snr = i * 0.25;
957        frqObs->_snrValid = true;
958      }
959    }
960    CurrentObs._obs.push_back(frqObs);
961    if (type == 1011 || type == 1012) {
962      frqObs = new t_frqObs;
963      /* L2 */
964      GETBITS(code, 2);
965      switch (code) {
966        case 3:
967          frqObs->_rnxType2ch.assign("2P");
968          break;
969        case 2:
970          frqObs->_rnxType2ch.assign("2P");
971          break;
972        case 1:
973          frqObs->_rnxType2ch.assign("2P");
974          break;
975        case 0:
976          frqObs->_rnxType2ch.assign("2C");
977          break;
978      }
979      GETBITSSIGN(i, 14);
980      if ((i & ((1 << 14) - 1)) != 0x2000) {
981        frqObs->_code = l1range * 0.02 + i * 0.02 + amb * 599584.916;
982        frqObs->_codeValid = true;
983      }
984      GETBITSSIGN(i, 20);
985      if ((i & ((1 << 20) - 1)) != 0x80000) {
986        frqObs->_phase = (l1range * 0.02 + i * 0.0005 + amb * 599584.916)
987            / GLO_WAVELENGTH_L2(freq - 7);
988        frqObs->_phaseValid = true;
989      }
990      GETBITS(i, 7);
991      frqObs->_lockTime = lti2sec(type,i);
992      frqObs->_lockTimeValid = (frqObs->_lockTime >= 0.0 && frqObs->_phaseValid);
993      frqObs->_slipCounter = i;
994      if (type == 1012) {
995        GETBITS(i, 8);
996        if (i) {
997          frqObs->_snr = i * 0.25;
998          frqObs->_snrValid = true;
999        }
1000      }
1001      CurrentObs._obs.push_back(frqObs);
1002    }
1003    _CurrentObsList.push_back(CurrentObs);
1004  }
1005  if (!syncf) {
1006    decoded = true;
1007    _obsList.append(_CurrentObsList);
1008    _CurrentTime.reset();
1009    _CurrentObsList.clear();
1010  }
1011  return decoded;
1012}
1013
1014//
1015////////////////////////////////////////////////////////////////////////////
1016bool RTCM3Decoder::DecodeGPSEphemeris(unsigned char* data, int size) {
1017  bool decoded = false;
1018
1019  if (size == 67) {
1020    t_ephGPS eph;
1021    int i, week;
1022    uint64_t numbits = 0, bitfield = 0;
1023    int fitIntervalFalg = 0;
1024
1025    data += 3; /* header */
1026    size -= 6; /* header + crc */
1027    SKIPBITS(12)
1028
1029    eph._receptDateTime = currentDateAndTimeGPS();
1030
1031    GETBITS(i, 6)
1032    eph._prn.set('G', i);
1033    GETBITS(week, 10)
1034    GETBITS(i, 4)
1035    eph._ura = accuracyFromIndex(i, eph.type());
1036    GETBITS(eph._L2Codes, 2)
1037    GETFLOATSIGN(eph._IDOT, 14, R2R_PI/(double)(1<<30)/(double)(1<<13))
1038    GETBITS(eph._IODE, 8)
1039    GETBITS(i, 16)
1040    i <<= 4;
1041    eph._TOC.set(i * 1000);
1042    GETFLOATSIGN(eph._clock_driftrate, 8, 1.0 / (double )(1 << 30) / (double )(1 << 25))
1043    GETFLOATSIGN(eph._clock_drift,    16, 1.0 / (double )(1 << 30) / (double )(1 << 13))
1044    GETFLOATSIGN(eph._clock_bias,     22, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1045    GETBITS(eph._IODC, 10)
1046    GETFLOATSIGN(eph._Crs,            16, 1.0 / (double )(1 << 5))
1047    GETFLOATSIGN(eph._Delta_n,        16, R2R_PI/(double)(1<<30)/(double)(1<<13))
1048    GETFLOATSIGN(eph._M0,             32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1049    GETFLOATSIGN(eph._Cuc,            16, 1.0 / (double )(1 << 29))
1050    GETFLOAT(eph._e,                  32, 1.0 / (double )(1 << 30) / (double )(1 << 3))
1051    GETFLOATSIGN(eph._Cus,            16, 1.0 / (double )(1 << 29))
1052    GETFLOAT(eph._sqrt_A,             32, 1.0 / (double )(1 << 19))
1053    GETBITS(i, 16)
1054    i <<= 4;
1055    eph._TOEsec = i;
1056    bncTime t;
1057    t.set(i * 1000);
1058    eph._TOEweek = t.gpsw();
1059    int numOfRollOvers = int(floor(t.gpsw()/1024.0));
1060    week += (numOfRollOvers * 1024);
1061    /* week from HOW, differs from TOC, TOE week, we use adapted value instead */
1062    if (eph._TOEweek > week + 1 || eph._TOEweek < week - 1) /* invalid week */
1063      return false;
1064    GETFLOATSIGN(eph._Cic,      16, 1.0 / (double )(1 << 29))
1065    GETFLOATSIGN(eph._OMEGA0,   32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1066    GETFLOATSIGN(eph._Cis,      16, 1.0 / (double )(1 << 29))
1067    GETFLOATSIGN(eph._i0,       32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1068    GETFLOATSIGN(eph._Crc,      16, 1.0 / (double )(1 << 5))
1069    GETFLOATSIGN(eph._omega,    32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1070    GETFLOATSIGN(eph._OMEGADOT, 24, R2R_PI/(double)(1<<30)/(double)(1<<13))
1071    GETFLOATSIGN(eph._TGD,       8, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1072    GETBITS(eph._health, 6)
1073    GETBITS(eph._L2PFlag, 1)
1074    GETBITS(fitIntervalFalg, 1)
1075    eph._fitInterval = fitIntervalFromFlag(fitIntervalFalg, eph._IODC, eph.type());
1076    eph._TOT = 0.9999e9;
1077
1078    emit newGPSEph(eph);
1079    decoded = true;
1080  }
1081  return decoded;
1082}
1083
1084//
1085////////////////////////////////////////////////////////////////////////////
1086bool RTCM3Decoder::DecodeGLONASSEphemeris(unsigned char* data, int size) {
1087  bool decoded = false;
1088
1089  if (size == 51) {
1090    t_ephGlo eph;
1091    int sv, i, tk;
1092    uint64_t numbits = 0, bitfield = 0;
1093
1094    data += 3; /* header */
1095    size -= 6; /* header + crc */
1096    SKIPBITS(12)
1097
1098    eph._receptDateTime = currentDateAndTimeGPS();
1099
1100    GETBITS(sv, 6)
1101    eph._prn.set('R', sv);
1102
1103    GETBITS(i, 5)
1104    eph._frequency_number = i - 7;
1105    GETBITS(eph._almanac_health, 1) /* almanac healthy */
1106    GETBITS(eph._almanac_health_availablility_indicator, 1) /* almanac health ok */
1107    GETBITS(eph._P1, 2) /*  P1 */
1108    GETBITS(i, 5)
1109    tk = i * 60 * 60;
1110    GETBITS(i, 6)
1111    tk += i * 60;
1112    GETBITS(i, 1)
1113    tk += i * 30;
1114    eph._tki = tk - 3*60*60;
1115    if(eph._tki < 0.0) {
1116      eph._tki += 86400.0;
1117    }
1118    GETBITS(eph._health, 1) /* MSB of Bn*/
1119    GETBITS(eph._P2, 1)  /* P2 */
1120    GETBITS(i, 7)
1121    eph._TOC.setTk(i * 15 * 60 * 1000); /* tb */
1122
1123    GETFLOATSIGNM(eph._x_velocity,    24, 1.0 / (double )(1 << 20))
1124    GETFLOATSIGNM(eph._x_pos,         27, 1.0 / (double )(1 << 11))
1125    GETFLOATSIGNM(eph._x_acceleration, 5, 1.0 / (double )(1 << 30))
1126    GETFLOATSIGNM(eph._y_velocity,    24, 1.0 / (double )(1 << 20))
1127    GETFLOATSIGNM(eph._y_pos,         27, 1.0 / (double )(1 << 11))
1128    GETFLOATSIGNM(eph._y_acceleration, 5, 1.0 / (double )(1 << 30))
1129    GETFLOATSIGNM(eph._z_velocity,    24, 1.0 / (double )(1 << 20))
1130    GETFLOATSIGNM(eph._z_pos,         27, 1.0 / (double )(1 << 11))
1131    GETFLOATSIGNM(eph._z_acceleration, 5, 1.0 / (double )(1 << 30))
1132
1133    GETBITS(eph._P3, 1)    /* P3 */
1134    GETFLOATSIGNM(eph._gamma,      11, 1.0 / (double )(1 << 30) / (double )(1 << 10))
1135    GETBITS(eph._M_P,  2) /* GLONASS-M P, */
1136    GETBITS(eph._M_l3, 1) /*GLONASS-M ln (third string) */
1137    GETFLOATSIGNM(eph._tau,        22, 1.0 / (double )(1 << 30))    /* GLONASS tau n(tb) */
1138    GETFLOATSIGNM(eph._M_delta_tau, 5, 1.0 / (double )(1 << 30))  /* GLONASS-M delta tau n(tb) */
1139    GETBITS(eph._E, 5)
1140    GETBITS(eph._M_P4,  1) /* GLONASS-M P4 */
1141    GETBITS(eph._M_FT,  4) /* GLONASS-M Ft */
1142    GETBITS(eph._M_NT, 11) /* GLONASS-M Nt */
1143    GETBITS(eph._M_M,   2) /* GLONASS-M M */
1144    GETBITS(eph._additional_data_availability, 1) /* GLONASS-M The Availability of Additional Data */
1145    GETBITS(eph._NA,  11) /* GLONASS-M Na */
1146    GETFLOATSIGNM(eph._tauC,       32, 1.0/(double)(1<<30)/(double)(1<<1)) /* GLONASS tau c */
1147    GETBITS(eph._M_N4, 5) /* GLONASS-M N4 */
1148    GETFLOATSIGNM(eph._M_tau_GPS,  22, 1.0/(double)(1<<30)) /* GLONASS-M tau GPS */
1149    GETBITS(eph._M_l5, 1) /* GLONASS-M ln (fifth string) */
1150
1151    unsigned year, month, day;
1152    eph._TOC.civil_date(year, month, day);
1153    eph._gps_utc = gnumleap(year, month, day);
1154    eph._tt = eph._TOC;
1155
1156    eph._xv(1) = eph._x_pos * 1.e3;
1157    eph._xv(2) = eph._y_pos * 1.e3;
1158    eph._xv(3) = eph._z_pos * 1.e3;
1159    eph._xv(4) = eph._x_velocity * 1.e3;
1160    eph._xv(5) = eph._y_velocity * 1.e3;
1161    eph._xv(6) = eph._z_velocity * 1.e3;
1162
1163    GLOFreq[sv - 1] = 100 + eph._frequency_number ; /* store frequency for other users (MSM) */
1164    _gloFrq = QString("%1 %2").arg(eph._prn.toString().c_str()).arg(eph._frequency_number, 2, 'f', 0);
1165
1166    emit newGlonassEph(eph);
1167    decoded = true;
1168  }
1169  return decoded;
1170}
1171
1172//
1173////////////////////////////////////////////////////////////////////////////
1174bool RTCM3Decoder::DecodeQZSSEphemeris(unsigned char* data, int size) {
1175  bool decoded = false;
1176
1177  if (size == 67) {
1178    t_ephGPS eph;
1179    int i, week;
1180    uint64_t numbits = 0, bitfield = 0;
1181    int fitIntervalFalg = 0;
1182
1183    data += 3; /* header */
1184    size -= 6; /* header + crc */
1185    SKIPBITS(12)
1186
1187    eph._receptDateTime = currentDateAndTimeGPS();
1188
1189    GETBITS(i, 4)
1190    eph._prn.set('J', i);
1191
1192    GETBITS(i, 16)
1193    i <<= 4;
1194    eph._TOC.set(i * 1000);
1195
1196    GETFLOATSIGN(eph._clock_driftrate, 8, 1.0 / (double )(1 << 30) / (double )(1 << 25))
1197    GETFLOATSIGN(eph._clock_drift,    16, 1.0 / (double )(1 << 30) / (double )(1 << 13))
1198    GETFLOATSIGN(eph._clock_bias,     22, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1199    GETBITS(eph._IODE, 8)
1200    GETFLOATSIGN(eph._Crs,     16, 1.0 / (double )(1 << 5))
1201    GETFLOATSIGN(eph._Delta_n, 16, R2R_PI/(double)(1<<30)/(double)(1<<13))
1202    GETFLOATSIGN(eph._M0,      32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1203    GETFLOATSIGN(eph._Cuc,     16, 1.0 / (double )(1 << 29))
1204    GETFLOAT(eph._e,           32, 1.0 / (double )(1 << 30) / (double )(1 << 3))
1205    GETFLOATSIGN(eph._Cus,     16, 1.0 / (double )(1 << 29))
1206    GETFLOAT(eph._sqrt_A,      32, 1.0 / (double )(1 << 19))
1207    GETBITS(i, 16)
1208    i <<= 4;
1209    eph._TOEsec = i;
1210    bncTime t;
1211    t.set(i*1000);
1212    eph._TOEweek = t.gpsw();
1213    GETFLOATSIGN(eph._Cic,      16, 1.0 / (double )(1 << 29))
1214    GETFLOATSIGN(eph._OMEGA0,   32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1215    GETFLOATSIGN(eph._Cis,      16, 1.0 / (double )(1 << 29))
1216    GETFLOATSIGN(eph._i0,       32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1217    GETFLOATSIGN(eph._Crc,      16, 1.0 / (double )(1 << 5))
1218    GETFLOATSIGN(eph._omega,    32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1219    GETFLOATSIGN(eph._OMEGADOT, 24, R2R_PI/(double)(1<<30)/(double)(1<<13))
1220    GETFLOATSIGN(eph._IDOT,     14, R2R_PI/(double)(1<<30)/(double)(1<<13))
1221    GETBITS(eph._L2Codes, 2)
1222    GETBITS(week, 10)
1223    int numOfRollOvers = int(floor(t.gpsw()/1024.0));
1224    week += (numOfRollOvers * 1024);
1225    /* week from HOW, differs from TOC, TOE week, we use adapted value instead */
1226    if (eph._TOEweek > week + 1 || eph._TOEweek < week - 1) /* invalid week */
1227      return false;
1228
1229    GETBITS(i, 4)
1230    if (i <= 6)
1231      eph._ura = ceil(10.0 * pow(2.0, 1.0 + i / 2.0)) / 10.0;
1232    else
1233      eph._ura = ceil(10.0 * pow(2.0, i / 2.0)) / 10.0;
1234    GETBITS(eph._health, 6)
1235    GETFLOATSIGN(eph._TGD,       8, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1236    GETBITS(eph._IODC, 10)
1237    GETBITS(fitIntervalFalg, 1)
1238    eph._fitInterval = fitIntervalFromFlag(fitIntervalFalg, eph._IODC, eph.type());
1239    eph._TOT = 0.9999e9;
1240
1241    emit newGPSEph(eph);
1242    decoded = true;
1243  }
1244  return decoded;
1245}
1246
1247//
1248////////////////////////////////////////////////////////////////////////////
1249bool RTCM3Decoder::DecodeIRNSSEphemeris(unsigned char* data, int size) {
1250  bool decoded = false;
1251
1252  if (size == 67) {
1253    t_ephGPS eph;
1254    int i, week, L5Flag, SFlag;
1255    uint64_t numbits = 0, bitfield = 0;
1256
1257    data += 3; /* header */
1258    size -= 6; /* header + crc */
1259    SKIPBITS(12)
1260
1261    eph._receptDateTime = currentDateAndTimeGPS();
1262
1263    GETBITS(i, 6)
1264    eph._prn.set('I', i);
1265    GETBITS(week, 10)
1266    GETFLOATSIGN(eph._clock_bias,     22, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1267    GETFLOATSIGN(eph._clock_drift,    16, 1.0 / (double )(1 << 30) / (double )(1 << 13))
1268    GETFLOATSIGN(eph._clock_driftrate, 8, 1.0 / (double )(1 << 30) / (double )(1 << 25))
1269    GETBITS(i, 4)
1270    eph._ura = accuracyFromIndex(i, eph.type());
1271    GETBITS(i, 16)
1272    i <<= 4;
1273    eph._TOC.set(i * 1000);
1274    GETFLOATSIGN(eph._TGD, 8, 1.0 / (double )(1 << 30) / (double )(1 <<  1))
1275    GETFLOATSIGN(eph._Delta_n, 22, R2R_PI/(double)(1<<30)/(double)(1 << 11))
1276    // IODCE
1277    GETBITS(eph._IODE, 8)
1278    eph._IODC = eph._IODE;
1279    SKIPBITS(10)
1280    GETBITS(L5Flag, 1)
1281    GETBITS(SFlag, 1)
1282    if      (L5Flag == 0 && SFlag == 0) {
1283      eph._health = 0.0;
1284    }
1285    else if (L5Flag == 0 && SFlag == 1) {
1286      eph._health = 1.0;
1287    }
1288    else if (L5Flag == 1 && SFlag == 0) {
1289      eph._health = 2.0;
1290    }
1291    else if (L5Flag == 1 && SFlag == 1) {
1292      eph._health = 3.0;
1293    }
1294    GETFLOATSIGN(eph._Cuc,  15, 1.0 / (double )(1 << 28))
1295    GETFLOATSIGN(eph._Cus,  15, 1.0 / (double )(1 << 28))
1296    GETFLOATSIGN(eph._Cic,  15, 1.0 / (double )(1 << 28))
1297    GETFLOATSIGN(eph._Cis,  15, 1.0 / (double )(1 << 28))
1298    GETFLOATSIGN(eph._Crc,  15, 1.0 / (double )(1 <<  4))
1299    GETFLOATSIGN(eph._Crs,  15, 1.0 / (double )(1 <<  4))
1300    GETFLOATSIGN(eph._IDOT, 14, R2R_PI/(double)(1<<30)/(double)(1<<13))
1301    GETFLOATSIGN(eph._M0,   32, R2R_PI/(double)(1<<30)/(double)(1<< 1))
1302    GETBITS(i, 16)
1303    i <<= 4;
1304    eph._TOEsec = i;
1305    bncTime t;
1306    t.set(i * 1000);
1307    eph._TOEweek = t.gpsw();
1308    int numOfRollOvers = int(floor(t.gpsw()/1024.0));
1309    week += (numOfRollOvers * 1024);
1310    /* week from HOW, differs from TOC, TOE week, we use adapted value instead */
1311    if (eph._TOEweek > week + 1 || eph._TOEweek < week - 1) /* invalid week */
1312      return false;
1313    GETFLOAT(eph._e,            32, 1.0 / (double )(1 << 30) / (double )(1 << 3))
1314    GETFLOAT(eph._sqrt_A,       32, 1.0 / (double )(1 << 19))
1315    GETFLOATSIGN(eph._OMEGA0,   32, R2R_PI/(double)(1<<30)/(double)(1<< 1))
1316    GETFLOATSIGN(eph._omega,    32, R2R_PI/(double)(1<<30)/(double)(1<< 1))
1317    GETFLOATSIGN(eph._OMEGADOT, 22, R2R_PI/(double)(1<<30)/(double)(1<<11))
1318    GETFLOATSIGN(eph._i0,       32, R2R_PI/(double)(1<<30)/(double)(1<< 1))
1319    SKIPBITS(2)
1320    SKIPBITS(2)
1321    eph._TOT = 0.9999e9;
1322
1323    emit newGPSEph(eph);
1324    decoded = true;
1325  }
1326  return decoded;
1327}
1328
1329//
1330////////////////////////////////////////////////////////////////////////////
1331bool RTCM3Decoder::DecodeSBASEphemeris(unsigned char* data, int size) {
1332  bool decoded = false;
1333
1334  if (size == 35) {
1335    t_ephSBAS eph;
1336    int i;
1337    uint64_t numbits = 0, bitfield = 0;
1338
1339    data += 3; /* header */
1340    size -= 6; /* header + crc */
1341    SKIPBITS(12)
1342
1343    eph._receptDateTime = currentDateAndTimeGPS();
1344
1345    GETBITS(i, 6)
1346    eph._prn.set('S', 20 + i);
1347    GETBITS(eph._IODN, 8)
1348    GETBITS(i, 13)
1349    i <<= 4;
1350    eph._TOC.setTOD(i * 1000);
1351    GETBITS(i, 4)
1352    eph._ura = accuracyFromIndex(i, eph.type());
1353    GETFLOATSIGN(eph._x_pos, 30, 0.08)
1354    GETFLOATSIGN(eph._y_pos, 30, 0.08)
1355    GETFLOATSIGN(eph._z_pos, 25, 0.4)
1356    GETFLOATSIGN(eph._x_velocity, 17, 0.000625)
1357    GETFLOATSIGN(eph._y_velocity, 17, 0.000625)
1358    GETFLOATSIGN(eph._z_velocity, 18, 0.004)
1359    GETFLOATSIGN(eph._x_acceleration, 10, 0.0000125)
1360    GETFLOATSIGN(eph._y_acceleration, 10, 0.0000125)
1361    GETFLOATSIGN(eph._z_acceleration, 10, 0.0000625)
1362    GETFLOATSIGN(eph._agf0, 12, 1.0 / (1 << 30) / (1 << 1))
1363    GETFLOATSIGN(eph._agf1, 8, 1.0 / (1 << 30) / (1 << 10))
1364
1365    eph._TOT = 0.9999E9;
1366    eph._health = 0;
1367
1368    emit newSBASEph(eph);
1369    decoded = true;
1370  }
1371  return decoded;
1372}
1373
1374//
1375////////////////////////////////////////////////////////////////////////////
1376bool RTCM3Decoder::DecodeGalileoEphemeris(unsigned char* data, int size) {
1377  bool decoded = false;
1378  uint64_t numbits = 0, bitfield = 0;
1379  int i;
1380
1381  data += 3; /* header */
1382  size -= 6; /* header + crc */
1383  GETBITS(i, 12)
1384
1385  if ((i == 1046 && size == 61) || (i == 1045 && size == 60)) {
1386    t_ephGal eph;
1387
1388    eph._receptDateTime = currentDateAndTimeGPS();
1389
1390    eph._inav = (i == 1046);
1391    eph._fnav = (i == 1045);
1392    GETBITS(i, 6)
1393    eph._prn.set('E', i, eph._inav ? 1 : 0);
1394
1395    GETBITS(eph._TOEweek, 12) //FIXME: roll-over after week 4095!!
1396    GETBITS(eph._IODnav, 10)
1397    GETBITS(i, 8)
1398    eph._SISA = accuracyFromIndex(i, eph.type());
1399    GETFLOATSIGN(eph._IDOT, 14, R2R_PI/(double)(1<<30)/(double)(1<<13))
1400    GETBITSFACTOR(i, 14, 60)
1401    eph._TOC.set(1024 + eph._TOEweek, i);
1402    GETFLOATSIGN(eph._clock_driftrate, 6, 1.0 / (double )(1 << 30) / (double )(1 << 29))
1403    GETFLOATSIGN(eph._clock_drift,    21, 1.0 / (double )(1 << 30) / (double )(1 << 16))
1404    GETFLOATSIGN(eph._clock_bias,     31, 1.0 / (double )(1 << 30) / (double )(1 << 4))
1405    GETFLOATSIGN(eph._Crs,            16, 1.0 / (double )(1 << 5))
1406    GETFLOATSIGN(eph._Delta_n,        16, R2R_PI/(double)(1<<30)/(double)(1<<13))
1407    GETFLOATSIGN(eph._M0,             32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1408    GETFLOATSIGN(eph._Cuc,            16, 1.0 / (double )(1 << 29))
1409    GETFLOAT(eph._e,                  32, 1.0 / (double )(1 << 30) / (double )(1 << 3))
1410    GETFLOATSIGN(eph._Cus,            16, 1.0 / (double )(1 << 29))
1411    GETFLOAT(eph._sqrt_A,             32, 1.0 / (double )(1 << 19))
1412    GETBITSFACTOR(eph._TOEsec, 14, 60)
1413    /* FIXME: overwrite value, copied from old code */
1414    eph._TOEsec = eph._TOC.gpssec();
1415    GETFLOATSIGN(eph._Cic,      16, 1.0 / (double )(1 << 29))
1416    GETFLOATSIGN(eph._OMEGA0,   32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1417    GETFLOATSIGN(eph._Cis,      16, 1.0 / (double )(1 << 29))
1418    GETFLOATSIGN(eph._i0,       32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1419    GETFLOATSIGN(eph._Crc,      16, 1.0 / (double )(1 << 5))
1420    GETFLOATSIGN(eph._omega,    32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1421    GETFLOATSIGN(eph._OMEGADOT, 24, R2R_PI/(double)(1<<30)/(double)(1<<13))
1422    GETFLOATSIGN(eph._BGD_1_5A, 10,
1423        1.0 / (double )(1 << 30) / (double )(1 << 2))
1424    if (eph._inav) {
1425      /* set unused F/NAV values */
1426      eph._E5aHS = 0.0;
1427      eph._e5aDataInValid = false;
1428
1429      GETFLOATSIGN(eph._BGD_1_5B, 10, 1.0 / (double )(1 << 30) / (double )(1 << 2))
1430      GETBITS(eph._E5bHS, 2)
1431      GETBITS(eph._e5bDataInValid, 1)
1432      GETBITS(eph._E1_bHS, 2)
1433      GETBITS(eph._e1DataInValid, 1)
1434    }
1435    else {
1436      /* set unused I/NAV values */
1437      eph._BGD_1_5B = 0.0;
1438      eph._E5bHS = 0.0;
1439      eph._E1_bHS = 0.0;
1440      eph._e1DataInValid = false;
1441      eph._e5bDataInValid = false;
1442
1443      GETBITS(eph._E5aHS, 2)
1444      GETBITS(eph._e5aDataInValid, 1)
1445    }
1446    eph._TOT = 0.9999e9;
1447
1448    emit newGalileoEph(eph);
1449    decoded = true;
1450  }
1451  return decoded;
1452}
1453
1454//
1455////////////////////////////////////////////////////////////////////////////
1456bool RTCM3Decoder::DecodeBDSEphemeris(unsigned char* data, int size) {
1457  bool decoded = false;
1458
1459  if (size == 70) {
1460    t_ephBDS eph;
1461    int i;
1462    uint64_t numbits = 0, bitfield = 0;
1463
1464    data += 3; /* header */
1465    size -= 6; /* header + crc */
1466    SKIPBITS(12)
1467
1468    eph._receptDateTime = currentDateAndTimeGPS();
1469
1470    GETBITS(i, 6)
1471    eph._prn.set('C', i);
1472
1473    SKIPBITS(13)
1474    /* week */
1475    GETBITS(i, 4)
1476    eph._URA = accuracyFromIndex(i, eph.type());
1477    GETFLOATSIGN(eph._IDOT, 14, R2R_PI/(double)(1<<30)/(double)(1<<13))
1478    GETBITS(eph._AODE, 5)
1479    GETBITS(i, 17)
1480    i <<= 3;
1481    eph._TOC.setBDS(i * 1000);
1482    GETFLOATSIGN(eph._clock_driftrate, 11,  1.0 / (double )(1 << 30) / (double )(1 << 30) / (double )(1 << 6))
1483    GETFLOATSIGN(eph._clock_drift,     22,  1.0 / (double )(1 << 30) / (double )(1 << 20))
1484    GETFLOATSIGN(eph._clock_bias,      24,  1.0 / (double )(1 << 30) / (double )(1 << 3))
1485    GETBITS(eph._AODC, 5)
1486    GETFLOATSIGN(eph._Crs,     18, 1.0 / (double )(1 << 6))
1487    GETFLOATSIGN(eph._Delta_n, 16, R2R_PI/(double)(1<<30)/(double)(1<<13))
1488    GETFLOATSIGN(eph._M0,      32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1489    GETFLOATSIGN(eph._Cuc,     18, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1490    GETFLOAT(eph._e,           32, 1.0 / (double )(1 << 30) / (double )(1 << 3))
1491    GETFLOATSIGN(eph._Cus,     18, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1492    GETFLOAT(eph._sqrt_A,      32, 1.0 / (double )(1 << 19))
1493    GETBITS(i, 17)
1494    i <<= 3;
1495    eph._TOEsec = i;
1496    eph._TOE.setBDS(i * 1000);
1497    GETFLOATSIGN(eph._Cic,      18, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1498    GETFLOATSIGN(eph._OMEGA0,   32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1499    GETFLOATSIGN(eph._Cis,      18, 1.0 / (double )(1 << 30) / (double )(1 << 1))
1500    GETFLOATSIGN(eph._i0,       32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1501    GETFLOATSIGN(eph._Crc,      18, 1.0 / (double )(1 << 6))
1502    GETFLOATSIGN(eph._omega,    32, R2R_PI/(double)(1<<30)/(double)(1<<1))
1503    GETFLOATSIGN(eph._OMEGADOT, 24, R2R_PI/(double)(1<<30)/(double)(1<<13))
1504    GETFLOATSIGN(eph._TGD1,     10, 0.0000000001)
1505    GETFLOATSIGN(eph._TGD2,     10, 0.0000000001)
1506    GETBITS(eph._SatH1, 1)
1507
1508    eph._TOT = 0.9999E9;
1509    emit newBDSEph(eph);
1510    decoded = true;
1511  }
1512  return decoded;
1513}
1514
1515//
1516////////////////////////////////////////////////////////////////////////////
1517bool RTCM3Decoder::DecodeAntennaReceiver(unsigned char* data, int size) {
1518  char *antenna;
1519  char *antserialnum;
1520  char *receiver;
1521  char *recfirmware;
1522  char *recserialnum;
1523  int type;
1524  int antsernum = -1;
1525  int antnum = -1;
1526  int recnum = -1;
1527  int recsernum = -1;
1528  int recfirnum = -1;
1529  uint64_t numbits = 0, bitfield = 0;
1530
1531  data += 3; /* header*/
1532  size -= 6; /* header + crc */
1533
1534  GETBITS(type, 12)
1535  SKIPBITS(12) /* reference station ID */
1536  GETSTRING(antnum, antenna)
1537  if ((antnum > -1 && antnum < 265) &&
1538      (_antType.empty() || strncmp(_antType.back().descriptor, antenna, recnum) != 0)) {
1539    _antType.push_back(t_antInfo());
1540    memcpy(_antType.back().descriptor, antenna, antnum);
1541    _antType.back().descriptor[antnum] = 0;
1542  }
1543  SKIPBITS(8) /* antenna setup ID */
1544  if (type == 1008 || type == 1033 ) {
1545    GETSTRING(antsernum, antserialnum)
1546    if ((antsernum > -1 && antsernum < 265)) {
1547      memcpy(_antType.back().serialnumber, antserialnum, antsernum);
1548      _antType.back().serialnumber[antsernum] = 0;
1549    }
1550  }
1551
1552  if (type == 1033) {
1553    GETSTRING(recnum, receiver)
1554    GETSTRING(recfirnum, recfirmware)
1555    GETSTRING(recsernum, recserialnum)
1556    if ((recnum > -1 && recnum < 265) &&
1557        (_recType.empty() || strncmp(_recType.back().descriptor, receiver, recnum) != 0)) {
1558      _recType.push_back(t_recInfo());
1559      memcpy(_recType.back().descriptor, receiver, recnum);
1560      _recType.back().descriptor[recnum] = 0;
1561      if (recfirnum > -1 && recfirnum < 265) {
1562        memcpy(_recType.back().firmware, recfirmware, recfirnum);
1563        _recType.back().firmware[recfirnum] = 0;
1564      }
1565      if (recsernum > -1 && recsernum < 265) {
1566        memcpy(_recType.back().serialnumber, recserialnum, recsernum);
1567        _recType.back().serialnumber[recsernum] = 0;
1568      }
1569    }
1570  }
1571  return true;
1572}
1573
1574//
1575////////////////////////////////////////////////////////////////////////////
1576bool RTCM3Decoder::DecodeAntennaPosition(unsigned char* data, int size) {
1577  int type;
1578  uint64_t numbits = 0, bitfield = 0;
1579  double x, y, z;
1580
1581  data += 3; /* header */
1582  size -= 6; /* header + crc */
1583
1584  GETBITS(type, 12)
1585  _antList.push_back(t_antRefPoint());
1586  _antList.back().type = t_antRefPoint::ARP;
1587  SKIPBITS(22)
1588  GETBITSSIGN(x, 38)
1589  _antList.back().xx = x * 1e-4;
1590  SKIPBITS(2)
1591  GETBITSSIGN(y, 38)
1592  _antList.back().yy = y * 1e-4;
1593  SKIPBITS(2)
1594  GETBITSSIGN(z, 38)
1595  _antList.back().zz = z * 1e-4;
1596  if (type == 1006)
1597      {
1598    double h;
1599    GETBITS(h, 16)
1600    _antList.back().height = h * 1e-4;
1601    _antList.back().height_f = true;
1602  }
1603  _antList.back().message = type;
1604
1605  return true;
1606}
1607
1608//
1609////////////////////////////////////////////////////////////////////////////
1610t_irc RTCM3Decoder::Decode(char* buffer, int bufLen, vector<string>& errmsg) {
1611  bool decoded = false;
1612
1613  errmsg.clear();
1614
1615  while (bufLen && _MessageSize < sizeof(_Message)) {
1616    int l = sizeof(_Message) - _MessageSize;
1617    if (l > bufLen)
1618      l = bufLen;
1619    memcpy(_Message + _MessageSize, buffer, l);
1620    _MessageSize += l;
1621    bufLen -= l;
1622    buffer += l;
1623    int id;
1624    while ((id = GetMessage())) {
1625      /* reset station ID for file loading as it can change */
1626      if (_rawFile)
1627        _staID = _rawFile->staID();
1628      /* store the id into the list of loaded blocks */
1629      _typeList.push_back(id);
1630
1631      /* SSR I+II data handled in another function, already pass the
1632       * extracted data block. That does no harm, as it anyway skip everything
1633       * else. */
1634      if ((id >= 1057 && id <= 1068) ||
1635          (id >= 1240 && id <= 1270) ||
1636                   id == 4076) {
1637        if (!_coDecoders.contains(_staID.toLatin1()))
1638          _coDecoders[_staID.toLatin1()] = new RTCM3coDecoder(_staID);
1639        RTCM3coDecoder* coDecoder = _coDecoders[_staID.toLatin1()];
1640        if (coDecoder->Decode(reinterpret_cast<char *>(_Message), _BlockSize,
1641            errmsg) == success) {
1642          decoded = true;
1643        }
1644      }
1645      else if ((id >= 1070 && id <= 1229) ||
1646               (id >=   21 && id <=   27)) /* MSM */ {
1647        if (DecodeRTCM3MSM(_Message, _BlockSize))
1648          decoded = true;
1649      }
1650      else {
1651        switch (id) {
1652          case 1001:
1653          case 1003:
1654            emit(newMessage(
1655                QString("%1: Block %2 contain partial data! Ignored!")
1656                    .arg(_staID).arg(id).toLatin1(), true));
1657            break; /* no use decoding partial data ATM, remove break when data can be used */
1658          case 1002:
1659          case 1004:
1660            if (DecodeRTCM3GPS(_Message, _BlockSize))
1661              decoded = true;
1662            break;
1663          case 1009:
1664          case 1011:
1665            emit(newMessage(
1666                QString("%1: Block %2 contain partial data! Ignored!")
1667                    .arg(_staID).arg(id).toLatin1(), true));
1668            break; /* no use decoding partial data ATM, remove break when data can be used */
1669          case 1010:
1670          case 1012:
1671            if (DecodeRTCM3GLONASS(_Message, _BlockSize))
1672              decoded = true;
1673            break;
1674          case 1019:
1675            if (DecodeGPSEphemeris(_Message, _BlockSize))
1676              decoded = true;
1677            break;
1678          case 1020:
1679            if (DecodeGLONASSEphemeris(_Message, _BlockSize))
1680              decoded = true;
1681            break;
1682          case 1043:
1683            if (DecodeSBASEphemeris(_Message, _BlockSize))
1684              decoded = true;
1685            break;
1686          case 1044:
1687            if (DecodeQZSSEphemeris(_Message, _BlockSize))
1688              decoded = true;
1689            break;
1690          case 29:
1691            if (DecodeIRNSSEphemeris(_Message, _BlockSize))
1692              decoded = true;
1693            break;
1694          case 1045:
1695          case 1046:
1696            if (DecodeGalileoEphemeris(_Message, _BlockSize))
1697              decoded = true;
1698            break;
1699          case RTCM3ID_BDS:
1700            if (DecodeBDSEphemeris(_Message, _BlockSize))
1701              decoded = true;
1702            break;
1703          case 1007:
1704          case 1008:
1705          case 1033:
1706            DecodeAntennaReceiver(_Message, _BlockSize);
1707            break;
1708          case 1005:
1709          case 1006:
1710            DecodeAntennaPosition(_Message, _BlockSize);
1711            break;
1712        }
1713      }
1714    }
1715  }
1716  return decoded ? success : failure;
1717}
1718;
1719
1720//
1721////////////////////////////////////////////////////////////////////////////
1722uint32_t RTCM3Decoder::CRC24(long size, const unsigned char *buf) {
1723  uint32_t crc = 0;
1724  int i;
1725
1726  while (size--) {
1727    crc ^= (*buf++) << (16);
1728    for (i = 0; i < 8; i++)
1729        {
1730      crc <<= 1;
1731      if (crc & 0x1000000)
1732        crc ^= 0x01864cfb;
1733    }
1734  }
1735  return crc;
1736}
1737
1738//
1739////////////////////////////////////////////////////////////////////////////
1740int RTCM3Decoder::GetMessage(void) {
1741  unsigned char *m, *e;
1742  int i;
1743
1744  m = _Message + _SkipBytes;
1745  e = _Message + _MessageSize;
1746  _NeedBytes = _SkipBytes = 0;
1747  while (e - m >= 3) {
1748    if (m[0] == 0xD3) {
1749      _BlockSize = ((m[1] & 3) << 8) | m[2];
1750      if (e - m >= static_cast<int>(_BlockSize + 6)) {
1751        if (static_cast<uint32_t>((m[3 + _BlockSize] << 16)
1752            | (m[3 + _BlockSize + 1] << 8)
1753            | (m[3 + _BlockSize + 2])) == CRC24(_BlockSize + 3, m)) {
1754          _BlockSize += 6;
1755          _SkipBytes = _BlockSize;
1756          break;
1757        }
1758        else
1759          ++m;
1760      }
1761      else {
1762        _NeedBytes = _BlockSize;
1763        break;
1764      }
1765    }
1766    else
1767      ++m;
1768  }
1769  if (e - m < 3)
1770    _NeedBytes = 3;
1771
1772  /* copy buffer to front */
1773  i = m - _Message;
1774  if (i && m < e)
1775    memmove(_Message, m, static_cast<size_t>(_MessageSize - i));
1776  _MessageSize -= i;
1777
1778  return !_NeedBytes ? ((_Message[3] << 4) | (_Message[4] >> 4)) : 0;
1779}
1780
1781// Time of Corrections
1782//////////////////////////////////////////////////////////////////////////////
1783int RTCM3Decoder::corrGPSEpochTime() const {
1784  return
1785      _coDecoders.size() > 0 ?
1786          _coDecoders.begin().value()->corrGPSEpochTime() : -1;
1787}
Note: See TracBrowser for help on using the repository browser.