source: ntrip/branches/BNC_2.12/src/upload/bncrtnetuploadcaster.cpp @ 8843

Last change on this file since 8843 was 8843, checked in by stuerze, 13 months ago

Harmonization of RTCM3 Signal ID Mapping and RTCM SSR Signal and Tracking Mode Identifiers

File size: 111.0 KB
Line 
1/* -------------------------------------------------------------------------
2 * BKG NTRIP Server
3 * -------------------------------------------------------------------------
4 *
5 * Class:      bncRtnetUploadCaster
6 *
7 * Purpose:    Connection to NTRIP Caster
8 *
9 * Author:     L. Mervart
10 *
11 * Created:    29-Mar-2011
12 *
13 * Changes:
14 *
15 * -----------------------------------------------------------------------*/
16
17#include <math.h>
18#include "bncrtnetuploadcaster.h"
19#include "bncsettings.h"
20#include "bncephuser.h"
21#include "bncclockrinex.h"
22#include "bncsp3.h"
23#include "gnss.h"
24
25using namespace std;
26
27// Constructor
28////////////////////////////////////////////////////////////////////////////
29bncRtnetUploadCaster::bncRtnetUploadCaster(const QString& mountpoint,
30    const QString& outHost, int outPort, const QString& password,
31    const QString& crdTrafo, bool CoM, const QString& sp3FileName,
32    const QString& rnxFileName, int PID, int SID, int IOD, int iRow) :
33    bncUploadCaster(mountpoint, outHost, outPort, password, iRow, 0) {
34
35  if (!mountpoint.isEmpty()) {
36    _casterID += mountpoint;
37  }
38  if (!outHost.isEmpty()) {
39    _casterID +=  " " + outHost;
40    if (outPort) {
41      _casterID += ":" +  QString("%1").arg(outPort, 10);
42    }
43  }
44  if (!crdTrafo.isEmpty()) {
45    _casterID += " " + crdTrafo;
46  }
47  if (!sp3FileName.isEmpty()) {
48    _casterID += " " + sp3FileName;
49  }
50  if (!rnxFileName.isEmpty()) {
51    _casterID += " " + rnxFileName;
52  }
53
54  _crdTrafo = crdTrafo;
55  _CoM = CoM;
56  _PID = PID;
57  _SID = SID;
58  _IOD = IOD;
59
60  // Member that receives the ephemeris
61  // ----------------------------------
62  _ephUser = new bncEphUser(true);
63
64  bncSettings settings;
65  QString intr = settings.value("uploadIntr").toString();
66  QStringList hlp = settings.value("cmbStreams").toStringList();
67  _samplRtcmEphCorr = settings.value("uploadSamplRtcmEphCorr").toDouble();
68  if (hlp.size() > 1) { // combination stream upload
69    _samplRtcmClkCorr = settings.value("cmbSampl").toInt();
70  }
71  else { // single stream upload or sp3 file generation
72    _samplRtcmClkCorr = 5; // default
73  }
74  int samplClkRnx = settings.value("uploadSamplClkRnx").toInt();
75  int samplSp3 = settings.value("uploadSamplSp3").toInt() * 60;
76
77  if (_samplRtcmEphCorr == 0.0) {
78    _usedEph = 0;
79  }
80  else {
81    _usedEph = new QMap<QString, const t_eph*>;
82  }
83
84  // RINEX writer
85  // ------------
86  if (!rnxFileName.isEmpty()) {
87    _rnx = new bncClockRinex(rnxFileName, intr, samplClkRnx);
88  }
89  else {
90    _rnx = 0;
91  }
92
93  // SP3 writer
94  // ----------
95  if (!sp3FileName.isEmpty()) {
96    _sp3 = new bncSP3(sp3FileName, intr, samplSp3);
97  }
98  else {
99    _sp3 = 0;
100  }
101
102  // Set Transformation Parameters
103  // -----------------------------
104  // Transformation Parameters from ITRF2014 to ETRF2000
105  // EUREF Technical Note 1 Relationship and Transformation between the ITRF and ETRF
106  // Zuheir Altamimi, June 28, 2018
107  if (_crdTrafo == "ETRF2000") {
108    _dx  =  0.0547;
109    _dy  =  0.0522;
110    _dz  = -0.0741;
111
112    _dxr =  0.0001;
113    _dyr =  0.0001;
114    _dzr = -0.0019;
115
116    _ox  =  0.001701;
117    _oy  =  0.010290;
118    _oz  = -0.016632;
119
120    _oxr =  0.000081;
121    _oyr =  0.000490;
122    _ozr = -0.000729;
123
124    _sc  =  2.12;
125    _scr =  0.11;
126
127    _t0  =  2010.0;
128  }
129  // Transformation Parameters from ITRF2014 to GDA2020 (Ryan Ruddick, GA)
130  else if (_crdTrafo == "GDA2020") {
131    _dx  = 0.0;
132    _dy  = 0.0;
133    _dz  = 0.0;
134
135    _dxr = 0.0;
136    _dyr = 0.0;
137    _dzr = 0.0;
138
139    _ox  = 0.0;
140    _oy  = 0.0;
141    _oz  = 0.0;
142
143    _oxr = 0.00150379;
144    _oyr = 0.00118346;
145    _ozr = 0.00120716;
146
147    _sc  = 0.0;
148    _scr = 0.0;
149
150    _t0  = 2020.0;
151  }
152  // Transformation Parameters from IGb14 to SIRGAS2000 (Sonia Costa, BRA)
153  else if (_crdTrafo == "SIRGAS2000") {
154    _dx  =  0.0026;
155    _dy  =  0.0018;
156    _dz  = -0.0061;
157
158    _dxr =  0.0000;
159    _dyr =  0.0000;
160    _dzr =  0.0000;
161
162    _ox  =  0.000000;
163    _oy  =  0.000000;
164    _oz  =  0.000000;
165
166    _oxr =  0.000000;
167    _oyr =  0.000000;
168    _ozr =  0.000000;
169
170    _sc  = -1.00000;
171    _scr =  0.00000;
172    _t0  =  2000.0;
173  }
174  // Transformation Parameters from ITRF2014 to DREF91
175  else if (_crdTrafo == "DREF91") {
176    _dx  =  0.0547;
177    _dy  =  0.0522;
178    _dz  = -0.0741;
179
180    _dxr =  0.0001;
181    _dyr =  0.0001;
182    _dzr = -0.0019;
183    // ERTF200  + rotation parameters (ETRF200 => DREF91)
184    _ox  =  0.001701 + 0.000658;
185    _oy  =  0.010290 - 0.000208;
186    _oz  = -0.016632 + 0.000755;
187
188    _oxr =  0.000081;
189    _oyr =  0.000490;
190    _ozr = -0.000729;
191
192    _sc  =  2.12;
193    _scr =  0.11;
194
195    _t0  =  2010.0;
196  }
197  else if (_crdTrafo == "Custom") {
198    _dx = settings.value("trafo_dx").toDouble();
199    _dy = settings.value("trafo_dy").toDouble();
200    _dz = settings.value("trafo_dz").toDouble();
201    _dxr = settings.value("trafo_dxr").toDouble();
202    _dyr = settings.value("trafo_dyr").toDouble();
203    _dzr = settings.value("trafo_dzr").toDouble();
204    _ox = settings.value("trafo_ox").toDouble();
205    _oy = settings.value("trafo_oy").toDouble();
206    _oz = settings.value("trafo_oz").toDouble();
207    _oxr = settings.value("trafo_oxr").toDouble();
208    _oyr = settings.value("trafo_oyr").toDouble();
209    _ozr = settings.value("trafo_ozr").toDouble();
210    _sc = settings.value("trafo_sc").toDouble();
211    _scr = settings.value("trafo_scr").toDouble();
212    _t0 = settings.value("trafo_t0").toDouble();
213  }
214}
215
216// Destructor
217////////////////////////////////////////////////////////////////////////////
218bncRtnetUploadCaster::~bncRtnetUploadCaster() {
219  if (isRunning()) {
220    wait();
221  }
222  delete _rnx;
223  delete _sp3;
224  delete _ephUser;
225  delete _usedEph;
226}
227
228//
229////////////////////////////////////////////////////////////////////////////
230void bncRtnetUploadCaster::decodeRtnetStream(char* buffer, int bufLen) {
231
232  QMutexLocker locker(&_mutex);
233
234  // Append to internal buffer
235  // -------------------------
236  _rtnetStreamBuffer.append(QByteArray(buffer, bufLen));
237
238  // Select buffer part that contains last epoch
239  // -------------------------------------------
240  QStringList lines;
241  int iEpoBeg = _rtnetStreamBuffer.lastIndexOf('*');   // begin of last epoch
242  if (iEpoBeg == -1) {
243    _rtnetStreamBuffer.clear();
244    return;
245  }
246  int iEpoBegEarlier = _rtnetStreamBuffer.indexOf('*');
247  if (iEpoBegEarlier != -1 && iEpoBegEarlier < iEpoBeg) { // are there two epoch lines in buffer?
248    _rtnetStreamBuffer = _rtnetStreamBuffer.mid(iEpoBegEarlier);
249  }
250  else {
251    _rtnetStreamBuffer = _rtnetStreamBuffer.mid(iEpoBeg);
252  }
253  int iEpoEnd = _rtnetStreamBuffer.lastIndexOf("EOE"); // end of last epoch
254  if (iEpoEnd == -1) {
255    return;
256  }
257
258  while (_rtnetStreamBuffer.count('*') > 1) { // is there more than 1 epoch line in buffer?
259    QString rtnetStreamBuffer = _rtnetStreamBuffer.mid(1);
260    int nextEpoch = rtnetStreamBuffer.indexOf('*');
261    if      (nextEpoch != -1 && nextEpoch < iEpoEnd) {
262      _rtnetStreamBuffer = _rtnetStreamBuffer.mid(nextEpoch);
263    }
264    else if (nextEpoch != -1 && nextEpoch >= iEpoEnd) {
265      break;
266    }
267  }
268
269  lines = _rtnetStreamBuffer.left(iEpoEnd).split('\n',
270      QString::SkipEmptyParts);
271  _rtnetStreamBuffer = _rtnetStreamBuffer.mid(iEpoEnd + 3);
272
273  if (lines.size() < 2) {
274    return;
275  }
276
277  // Read first line (with epoch time)
278  // ---------------------------------
279  QTextStream in(lines[0].toAscii());
280  QString hlp;
281  int year, month, day, hour, min;
282  double sec;
283  in >> hlp >> year >> month >> day >> hour >> min >> sec;
284  bncTime epoTime;
285  epoTime.set(year, month, day, hour, min, sec);
286
287  emit(newMessage(
288      "bncRtnetUploadCaster: decode " + QByteArray(epoTime.datestr().c_str())
289          + " " + QByteArray(epoTime.timestr().c_str()) + " "
290          + _casterID.toAscii(), false));
291
292  struct ClockOrbit co;
293  memset(&co, 0, sizeof(co));
294  co.EpochTime[CLOCKORBIT_SATGPS] = static_cast<int>(epoTime.gpssec());
295  double gt = epoTime.gpssec() + 3 * 3600 - gnumleap(year, month, day);
296  co.EpochTime[CLOCKORBIT_SATGLONASS] = static_cast<int>(fmod(gt, 86400.0));
297  co.EpochTime[CLOCKORBIT_SATGALILEO] = static_cast<int>(epoTime.gpssec());
298  co.EpochTime[CLOCKORBIT_SATQZSS] = static_cast<int>(epoTime.gpssec());
299  co.EpochTime[CLOCKORBIT_SATSBAS] = static_cast<int>(epoTime.gpssec());
300  co.EpochTime[CLOCKORBIT_SATBDS] = static_cast<int>(epoTime.bdssec());
301  co.Supplied[COBOFS_CLOCK] = 1;
302  co.Supplied[COBOFS_ORBIT] = 1;
303  co.SatRefDatum = DATUM_ITRF;
304  co.SSRIOD = _IOD;
305  co.SSRProviderID = _PID; // 256 .. BKG,  257 ... EUREF
306  co.SSRSolutionID = _SID;
307
308  struct CodeBias bias;
309  memset(&bias, 0, sizeof(bias));
310  bias.EpochTime[CLOCKORBIT_SATGPS] = co.EpochTime[CLOCKORBIT_SATGPS];
311  bias.EpochTime[CLOCKORBIT_SATGLONASS] = co.EpochTime[CLOCKORBIT_SATGLONASS];
312  bias.EpochTime[CLOCKORBIT_SATGALILEO] = co.EpochTime[CLOCKORBIT_SATGALILEO];
313  bias.EpochTime[CLOCKORBIT_SATQZSS] = co.EpochTime[CLOCKORBIT_SATQZSS];
314  bias.EpochTime[CLOCKORBIT_SATSBAS] = co.EpochTime[CLOCKORBIT_SATSBAS];
315  bias.EpochTime[CLOCKORBIT_SATBDS] = co.EpochTime[CLOCKORBIT_SATBDS];
316  bias.SSRIOD = _IOD;
317  bias.SSRProviderID = _PID;
318  bias.SSRSolutionID = _SID;
319
320  struct PhaseBias phasebias;
321  memset(&phasebias, 0, sizeof(phasebias));
322  unsigned int dispersiveBiasConsistenyIndicator = 0;
323  unsigned int mwConsistencyIndicator = 0;
324  phasebias.EpochTime[CLOCKORBIT_SATGPS] = co.EpochTime[CLOCKORBIT_SATGPS];
325  phasebias.EpochTime[CLOCKORBIT_SATGLONASS] = co.EpochTime[CLOCKORBIT_SATGLONASS];
326  phasebias.EpochTime[CLOCKORBIT_SATGALILEO] = co.EpochTime[CLOCKORBIT_SATGALILEO];
327  phasebias.EpochTime[CLOCKORBIT_SATQZSS] = co.EpochTime[CLOCKORBIT_SATQZSS];
328  phasebias.EpochTime[CLOCKORBIT_SATSBAS] = co.EpochTime[CLOCKORBIT_SATSBAS];
329  phasebias.EpochTime[CLOCKORBIT_SATBDS] = co.EpochTime[CLOCKORBIT_SATBDS];
330  phasebias.SSRIOD = _IOD;
331  phasebias.SSRProviderID = _PID;
332  phasebias.SSRSolutionID = _SID;
333
334  struct VTEC vtec;
335  memset(&vtec, 0, sizeof(vtec));
336  vtec.EpochTime = static_cast<int>(epoTime.gpssec());
337  vtec.SSRIOD = _IOD;
338  vtec.SSRProviderID = _PID;
339  vtec.SSRSolutionID = _SID;
340
341  // Default Update Interval
342  // -----------------------
343  int clkUpdInd = 2;         // 5 sec
344  int ephUpdInd = clkUpdInd; // default
345
346  if (_samplRtcmClkCorr > 5.0 && _samplRtcmEphCorr <= 5.0) { // combined orb and clock
347    ephUpdInd = determineUpdateInd(_samplRtcmClkCorr);
348  }
349  if (_samplRtcmClkCorr > 5.0) {
350    clkUpdInd = determineUpdateInd(_samplRtcmClkCorr);
351  }
352  if (_samplRtcmEphCorr > 5.0) {
353    ephUpdInd = determineUpdateInd(_samplRtcmEphCorr);
354  }
355
356  co.UpdateInterval = clkUpdInd;
357  bias.UpdateInterval = clkUpdInd;
358  phasebias.UpdateInterval = clkUpdInd;
359
360  for (int ii = 1; ii < lines.size(); ii++) {
361    QString key;  // prn or key VTEC, IND (phase bias indicators)
362    double rtnUra = 0.0;    // [m]
363    ColumnVector rtnAPC; rtnAPC.ReSize(3); rtnAPC = 0.0;          // [m, m, m]
364    ColumnVector rtnVel; rtnVel.ReSize(3); rtnVel = 0.0;          // [m/s, m/s, m/s]
365    ColumnVector rtnCoM; rtnCoM.ReSize(3); rtnCoM = 0.0;          // [m, m, m]
366    ColumnVector rtnClk; rtnClk.ReSize(3); rtnClk = 0.0;          // [m, m/s, m/s²]
367    ColumnVector rtnClkSig; rtnClkSig.ReSize(3); rtnClkSig = 0.0; // [m, m/s, m/s²]
368    t_prn prn;
369
370    QTextStream in(lines[ii].toAscii());
371    in >> key;
372
373    // non-satellite specific parameters
374    if (key.contains("IND", Qt::CaseSensitive)) {
375      in >> dispersiveBiasConsistenyIndicator >> mwConsistencyIndicator;
376      continue;
377    }
378
379    // non-satellite specific parameters
380    if (key.contains("VTEC", Qt::CaseSensitive)) {
381      double ui;
382      in >> ui >> vtec.NumLayers;
383      vtec.UpdateInterval = (unsigned int) determineUpdateInd(ui);
384      for (unsigned ll = 0; ll < vtec.NumLayers; ll++) {
385        int dummy;
386        in >> dummy >> vtec.Layers[ll].Degree >> vtec.Layers[ll].Order
387            >> vtec.Layers[ll].Height;
388        for (unsigned iDeg = 0; iDeg <= vtec.Layers[ll].Degree; iDeg++) {
389          for (unsigned iOrd = 0; iOrd <= vtec.Layers[ll].Order; iOrd++) {
390            in >> vtec.Layers[ll].Cosinus[iDeg][iOrd];
391          }
392        }
393        for (unsigned iDeg = 0; iDeg <= vtec.Layers[ll].Degree; iDeg++) {
394          for (unsigned iOrd = 0; iOrd <= vtec.Layers[ll].Order; iOrd++) {
395            in >> vtec.Layers[ll].Sinus[iDeg][iOrd];
396          }
397        }
398      }
399      continue;
400    }
401
402    // satellite specific parameters
403    char sys = key.mid(0, 1).at(0).toAscii();
404    int number = key.mid(1, 2).toInt();
405    int flags = 0;
406    if (sys == 'E') { // I/NAV
407      flags = 1;
408    }
409    prn.set(sys, number, flags);
410    QString prnInternalStr = QString::fromStdString(prn.toInternalString());
411    QString prnStr = QString::fromStdString(prn.toString());
412
413    const t_eph* ephLast = _ephUser->ephLast(prnInternalStr);
414    const t_eph* ephPrev = _ephUser->ephPrev(prnInternalStr);
415    const t_eph* eph = ephLast;
416
417    if (eph) {
418
419      // Use previous ephemeris if the last one is too recent
420      // ----------------------------------------------------
421      const int MINAGE = 60; // seconds
422      if (ephPrev && eph->receptDateTime().isValid()
423          && eph->receptDateTime().secsTo(currentDateAndTimeGPS()) < MINAGE) {
424        eph = ephPrev;
425      }
426
427      // Make sure the clock messages refer to same IOD as orbit messages
428      // ----------------------------------------------------------------
429      if (_usedEph) {
430        if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
431          (*_usedEph)[prnInternalStr] = eph;
432        }
433        else {
434          eph = 0;
435          if (_usedEph->contains(prnInternalStr)) {
436            const t_eph* usedEph = _usedEph->value(prnInternalStr);
437            if (usedEph == ephLast) {
438              eph = ephLast;
439            }
440            else if (usedEph == ephPrev) {
441              eph = ephPrev;
442            }
443          }
444        }
445      }
446    }
447
448    if (eph  &&
449        eph->checkState() != t_eph::bad &&
450        eph->checkState() != t_eph::unhealthy &&
451        eph->checkState() != t_eph::outdated) {
452      QMap<QString, double> codeBiases;
453      QList<phaseBiasSignal> phaseBiasList;
454      phaseBiasesSat pbSat;
455
456      while (true) {
457        QString key;
458        int numVal = 0;
459        in >> key;
460        if (in.status() != QTextStream::Ok) {
461          break;
462        }
463        if (key == "APC") {
464          in >> numVal;
465          rtnAPC.ReSize(3); rtnAPC = 0.0;
466          for (int ii = 0; ii < numVal; ii++) {
467            in >> rtnAPC[ii];
468          }
469        }
470        else if (key == "Ura") {
471          in >> numVal;
472          if (numVal == 1)
473            in >> rtnUra;
474        }
475        else if (key == "Clk") {
476          in >> numVal;
477          rtnClk.ReSize(3); rtnClk = 0.0;
478          for (int ii = 0; ii < numVal; ii++) {
479            in >> rtnClk[ii];
480          }
481        }
482        else if (key == "ClkSig") {
483          in >> numVal;
484          rtnClkSig.ReSize(3); rtnClkSig = 0.0;
485          for (int ii = 0; ii < numVal; ii++) {
486            in >> rtnClkSig[ii];
487          }
488        }
489        else if (key == "Vel") {
490          in >> numVal;
491          rtnVel.ReSize(3); rtnVel = 0.0;
492          for (int ii = 0; ii < numVal; ii++) {
493            in >> rtnVel[ii];
494          }
495        }
496        else if (key == "CoM") {
497          in >> numVal;
498          rtnCoM.ReSize(3); rtnCoM = 0.0;
499          for (int ii = 0; ii < numVal; ii++) {
500            in >> rtnCoM[ii];
501          }
502        }
503        else if (key == "CodeBias") {
504          in >> numVal;
505          for (int ii = 0; ii < numVal; ii++) {
506            QString type;
507            double value;
508            in >> type >> value;
509            codeBiases[type] = value;
510          }
511        }
512        else if (key == "YawAngle") {
513          in >> numVal >> pbSat.yawAngle;
514          if      (pbSat.yawAngle < 0.0) {
515            pbSat.yawAngle += (2*M_PI);
516          }
517          else if (pbSat.yawAngle > 2*M_PI) {
518            pbSat.yawAngle -= (2*M_PI);
519          }
520        }
521        else if (key == "YawRate") {
522          in >> numVal >> pbSat.yawRate;
523        }
524        else if (key == "PhaseBias") {
525          in >> numVal;
526          for (int ii = 0; ii < numVal; ii++) {
527            phaseBiasSignal pb;
528            in >> pb.type >> pb.bias >> pb.integerIndicator
529              >> pb.wlIndicator >> pb.discontinuityCounter;
530            phaseBiasList.append(pb);
531          }
532        }
533        else {
534          in >> numVal;
535          for (int ii = 0; ii < numVal; ii++) {
536            double dummy;
537            in >> dummy;
538          }
539          emit(newMessage("                      RTNET format error: "
540                          +  lines[ii].toAscii(), false));
541        }
542      }
543
544      struct ClockOrbit::SatData* sd = 0;
545      if (prn.system() == 'G') {
546        sd = co.Sat + co.NumberOfSat[CLOCKORBIT_SATGPS];
547        ++co.NumberOfSat[CLOCKORBIT_SATGPS];
548      }
549      else if (prn.system() == 'R') {
550        sd = co.Sat + CLOCKORBIT_NUMGPS + co.NumberOfSat[CLOCKORBIT_SATGLONASS];
551        ++co.NumberOfSat[CLOCKORBIT_SATGLONASS];
552      }
553      else if (prn.system() == 'E') {
554        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
555            + co.NumberOfSat[CLOCKORBIT_SATGALILEO];
556        ++co.NumberOfSat[CLOCKORBIT_SATGALILEO];
557      }
558      else if (prn.system() == 'J') {
559        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
560            + CLOCKORBIT_NUMGALILEO + co.NumberOfSat[CLOCKORBIT_SATQZSS];
561        ++co.NumberOfSat[CLOCKORBIT_SATQZSS];
562      }
563      else if (prn.system() == 'S') {
564        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
565            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
566            + co.NumberOfSat[CLOCKORBIT_SATSBAS];
567        ++co.NumberOfSat[CLOCKORBIT_SATSBAS];
568      }
569      else if (prn.system() == 'C') {
570        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
571            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
572            + co.NumberOfSat[CLOCKORBIT_SATBDS];
573        ++co.NumberOfSat[CLOCKORBIT_SATBDS];
574      }
575      if (sd) {
576        QString outLine;
577        t_irc irc = processSatellite(eph, epoTime.gpsw(), epoTime.gpssec(), prnStr, rtnAPC,
578                                     rtnUra, rtnClk, rtnVel, rtnCoM, rtnClkSig, sd, outLine);
579        if (irc != success) {
580          // very few cases: check states bad and unhealthy are excluded earlier
581          sd->ID = prnStr.mid(1).toInt(); // to prevent G00, R00 entries
582          sd->IOD = eph->IOD();
583        }
584      }
585
586      // Code Biases
587      // -----------
588      struct CodeBias::BiasSat* biasSat = 0;
589      if (!codeBiases.isEmpty()) {
590        if (prn.system() == 'G') {
591          biasSat = bias.Sat + bias.NumberOfSat[CLOCKORBIT_SATGPS];
592          ++bias.NumberOfSat[CLOCKORBIT_SATGPS];
593        }
594        else if (prn.system() == 'R') {
595          biasSat = bias.Sat + CLOCKORBIT_NUMGPS
596              + bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
597          ++bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
598        }
599        else if (prn.system() == 'E') {
600          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
601              + bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
602          ++bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
603        }
604        else if (prn.system() == 'J') {
605          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
606              + CLOCKORBIT_NUMGALILEO + bias.NumberOfSat[CLOCKORBIT_SATQZSS];
607          ++bias.NumberOfSat[CLOCKORBIT_SATQZSS];
608        }
609        else if (prn.system() == 'S') {
610          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
611              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
612              + bias.NumberOfSat[CLOCKORBIT_SATSBAS];
613          ++bias.NumberOfSat[CLOCKORBIT_SATSBAS];
614        }
615        else if (prn.system() == 'C') {
616          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
617              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
618              + bias.NumberOfSat[CLOCKORBIT_SATBDS];
619          ++bias.NumberOfSat[CLOCKORBIT_SATBDS];
620        }
621      }
622
623      if (biasSat) {
624        biasSat->ID = prn.number();
625        biasSat->NumberOfCodeBiases = 0;
626        if (prn.system() == 'G') {
627          QMapIterator<QString, double> it(codeBiases);
628          while (it.hasNext()) {
629            it.next();
630            if (it.key() == "1C") {
631              int ii = biasSat->NumberOfCodeBiases;
632              if (ii >= CLOCKORBIT_NUMBIAS)
633                break;
634              biasSat->NumberOfCodeBiases += 1;
635              biasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
636              biasSat->Biases[ii].Bias = it.value();
637            }
638            else if (it.key() == "1S") {
639              int ii = biasSat->NumberOfCodeBiases;
640              if (ii >= CLOCKORBIT_NUMBIAS)
641                break;
642              biasSat->NumberOfCodeBiases += 1;
643              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
644              biasSat->Biases[ii].Bias = it.value();
645            }
646            else if (it.key() == "1L") {
647              int ii = biasSat->NumberOfCodeBiases;
648              if (ii >= CLOCKORBIT_NUMBIAS)
649                break;
650              biasSat->NumberOfCodeBiases += 1;
651              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
652              biasSat->Biases[ii].Bias = it.value();
653            }
654            else if (it.key() == "1X") {
655              int ii = biasSat->NumberOfCodeBiases;
656              if (ii >= CLOCKORBIT_NUMBIAS)
657                break;
658              biasSat->NumberOfCodeBiases += 1;
659              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_DP;
660              biasSat->Biases[ii].Bias = it.value();
661            }
662            else if (it.key() == "1P") {
663              int ii = biasSat->NumberOfCodeBiases;
664              if (ii >= CLOCKORBIT_NUMBIAS)
665                break;
666              biasSat->NumberOfCodeBiases += 1;
667              biasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
668              biasSat->Biases[ii].Bias = it.value();
669            }
670            else if (it.key() == "1W") {
671              int ii = biasSat->NumberOfCodeBiases;
672              if (ii >= CLOCKORBIT_NUMBIAS)
673                break;
674              biasSat->NumberOfCodeBiases += 1;
675              biasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
676              biasSat->Biases[ii].Bias = it.value();
677            }
678            else if (it.key() == "2C") {
679              int ii = biasSat->NumberOfCodeBiases;
680              if (ii >= CLOCKORBIT_NUMBIAS)
681                break;
682              biasSat->NumberOfCodeBiases += 1;
683              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
684              biasSat->Biases[ii].Bias = it.value();
685            }
686            else if (it.key() == "2S") {
687              int ii = biasSat->NumberOfCodeBiases;
688              if (ii >= CLOCKORBIT_NUMBIAS)
689                break;
690              biasSat->NumberOfCodeBiases += 1;
691              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_M;
692              biasSat->Biases[ii].Bias = it.value();
693            }
694            else if (it.key() == "2L") {
695              int ii = biasSat->NumberOfCodeBiases;
696              if (ii >= CLOCKORBIT_NUMBIAS)
697                break;
698              biasSat->NumberOfCodeBiases += 1;
699              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_L;
700              biasSat->Biases[ii].Bias = it.value();
701            }
702            else if (it.key() == "2X") {
703              int ii = biasSat->NumberOfCodeBiases;
704              if (ii >= CLOCKORBIT_NUMBIAS)
705                break;
706              biasSat->NumberOfCodeBiases += 1;
707              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_ML;
708              biasSat->Biases[ii].Bias = it.value();
709            }
710            else if (it.key() == "2P") {
711              int ii = biasSat->NumberOfCodeBiases;
712              if (ii >= CLOCKORBIT_NUMBIAS)
713                break;
714              biasSat->NumberOfCodeBiases += 1;
715              biasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
716              biasSat->Biases[ii].Bias = it.value();
717            }
718            else if (it.key() == "2W") {
719              int ii = biasSat->NumberOfCodeBiases;
720              if (ii >= CLOCKORBIT_NUMBIAS)
721                break;
722              biasSat->NumberOfCodeBiases += 1;
723              biasSat->Biases[ii].Type = CODETYPEGPS_L2_Z;
724              biasSat->Biases[ii].Bias = it.value();
725            }
726            else if (it.key() == "5I") {
727              int ii = biasSat->NumberOfCodeBiases;
728              if (ii >= CLOCKORBIT_NUMBIAS)
729                break;
730              biasSat->NumberOfCodeBiases += 1;
731              biasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
732              biasSat->Biases[ii].Bias = it.value();
733            }
734            else if (it.key() == "5Q") {
735              int ii = biasSat->NumberOfCodeBiases;
736              if (ii >= CLOCKORBIT_NUMBIAS)
737                break;
738              biasSat->NumberOfCodeBiases += 1;
739              biasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
740              biasSat->Biases[ii].Bias = it.value();
741            }
742            else if (it.key() == "5X") {
743              int ii = biasSat->NumberOfCodeBiases;
744              if (ii >= CLOCKORBIT_NUMBIAS)
745                break;
746              biasSat->NumberOfCodeBiases += 1;
747              biasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
748              biasSat->Biases[ii].Bias = it.value();
749            }
750          }
751        }
752        else if (prn.system() == 'R') {
753          QMapIterator<QString, double> it(codeBiases);
754          while (it.hasNext()) {
755            it.next();
756            if (it.key() == "1C") {
757              int ii = biasSat->NumberOfCodeBiases;
758              if (ii >= CLOCKORBIT_NUMBIAS)
759                break;
760              biasSat->NumberOfCodeBiases += 1;
761              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
762              biasSat->Biases[ii].Bias = it.value();
763            }
764            else if (it.key() == "1P") {
765              int ii = biasSat->NumberOfCodeBiases;
766              if (ii >= CLOCKORBIT_NUMBIAS)
767                break;
768              biasSat->NumberOfCodeBiases += 1;
769              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
770              biasSat->Biases[ii].Bias = it.value();
771            }
772            else if (it.key() == "2C") {
773              int ii = biasSat->NumberOfCodeBiases;
774              if (ii >= CLOCKORBIT_NUMBIAS)
775                break;
776              biasSat->NumberOfCodeBiases += 1;
777              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
778              biasSat->Biases[ii].Bias = it.value();
779            }
780            else if (it.key() == "2P") {
781              int ii = biasSat->NumberOfCodeBiases;
782              if (ii >= CLOCKORBIT_NUMBIAS)
783                break;
784              biasSat->NumberOfCodeBiases += 1;
785              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
786              biasSat->Biases[ii].Bias = it.value();
787            }
788            else if (it.key() == "4A") {
789              int ii = biasSat->NumberOfCodeBiases;
790              if (ii >= CLOCKORBIT_NUMBIAS)
791                break;
792              biasSat->NumberOfCodeBiases += 1;
793              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCd;
794              biasSat->Biases[ii].Bias = it.value();
795            }
796            else if (it.key() == "4B") {
797              int ii = biasSat->NumberOfCodeBiases;
798              if (ii >= CLOCKORBIT_NUMBIAS)
799                break;
800              biasSat->NumberOfCodeBiases += 1;
801              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCp;
802              biasSat->Biases[ii].Bias = it.value();
803            }
804            else if (it.key() == "4X") {
805              int ii = biasSat->NumberOfCodeBiases;
806              if (ii >= CLOCKORBIT_NUMBIAS)
807                break;
808              biasSat->NumberOfCodeBiases += 1;
809              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCdp;
810              biasSat->Biases[ii].Bias = it.value();
811            }
812            else if (it.key() == "6A") {
813              int ii = biasSat->NumberOfCodeBiases;
814              if (ii >= CLOCKORBIT_NUMBIAS)
815                break;
816              biasSat->NumberOfCodeBiases += 1;
817              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSI;
818              biasSat->Biases[ii].Bias = it.value();
819            }
820            else if (it.key() == "6B") {
821              int ii = biasSat->NumberOfCodeBiases;
822              if (ii >= CLOCKORBIT_NUMBIAS)
823                break;
824              biasSat->NumberOfCodeBiases += 1;
825              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_OCp;
826              biasSat->Biases[ii].Bias = it.value();
827            }
828            else if (it.key() == "6X") {
829              int ii = biasSat->NumberOfCodeBiases;
830              if (ii >= CLOCKORBIT_NUMBIAS)
831                break;
832              biasSat->NumberOfCodeBiases += 1;
833              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSIOCp;
834              biasSat->Biases[ii].Bias = it.value();
835            }
836            else if (it.key() == "3I") {
837              int ii = biasSat->NumberOfCodeBiases;
838              if (ii >= CLOCKORBIT_NUMBIAS)
839                break;
840              biasSat->NumberOfCodeBiases += 1;
841              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_I;
842              biasSat->Biases[ii].Bias = it.value();
843            }
844            else if (it.key() == "3Q") {
845              int ii = biasSat->NumberOfCodeBiases;
846              if (ii >= CLOCKORBIT_NUMBIAS)
847                break;
848              biasSat->NumberOfCodeBiases += 1;
849              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_Q;
850              biasSat->Biases[ii].Bias = it.value();
851            }
852            else if (it.key() == "3X") {
853              int ii = biasSat->NumberOfCodeBiases;
854              if (ii >= CLOCKORBIT_NUMBIAS)
855                break;
856              biasSat->NumberOfCodeBiases += 1;
857              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_IQ;
858              biasSat->Biases[ii].Bias = it.value();
859            }
860          }
861        }
862        else if (prn.system() == 'E') {
863          QMapIterator<QString, double> it(codeBiases);
864          while (it.hasNext()) {
865            it.next();
866            if (it.key() == "1A") {
867              int ii = biasSat->NumberOfCodeBiases;
868              if (ii >= CLOCKORBIT_NUMBIAS)
869                break;
870              biasSat->NumberOfCodeBiases += 1;
871              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
872              biasSat->Biases[ii].Bias = it.value();
873            }
874            else if (it.key() == "1B") {
875              int ii = biasSat->NumberOfCodeBiases;
876              if (ii >= CLOCKORBIT_NUMBIAS)
877                break;
878              biasSat->NumberOfCodeBiases += 1;
879              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
880              biasSat->Biases[ii].Bias = it.value();
881            }
882            else if (it.key() == "1C") {
883              int ii = biasSat->NumberOfCodeBiases;
884              if (ii >= CLOCKORBIT_NUMBIAS)
885                break;
886              biasSat->NumberOfCodeBiases += 1;
887              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
888              biasSat->Biases[ii].Bias = it.value();
889            }
890            else if (it.key() == "1X") {
891              int ii = biasSat->NumberOfCodeBiases;
892              if (ii >= CLOCKORBIT_NUMBIAS)
893                break;
894              biasSat->NumberOfCodeBiases += 1;
895              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
896              biasSat->Biases[ii].Bias = it.value();
897            }
898            else if (it.key() == "1Z") {
899              int ii = biasSat->NumberOfCodeBiases;
900              if (ii >= CLOCKORBIT_NUMBIAS)
901                break;
902              biasSat->NumberOfCodeBiases += 1;
903              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
904              biasSat->Biases[ii].Bias = it.value();
905            }
906            else if (it.key() == "5I") {
907              int ii = biasSat->NumberOfCodeBiases;
908              if (ii >= CLOCKORBIT_NUMBIAS)
909                break;
910              biasSat->NumberOfCodeBiases += 1;
911              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
912              biasSat->Biases[ii].Bias = it.value();
913            }
914            else if (it.key() == "5Q") {
915              int ii = biasSat->NumberOfCodeBiases;
916              if (ii >= CLOCKORBIT_NUMBIAS)
917                break;
918              biasSat->NumberOfCodeBiases += 1;
919              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
920              biasSat->Biases[ii].Bias = it.value();
921            }
922            else if (it.key() == "5X") {
923              int ii = biasSat->NumberOfCodeBiases;
924              if (ii >= CLOCKORBIT_NUMBIAS)
925                break;
926              biasSat->NumberOfCodeBiases += 1;
927              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
928              biasSat->Biases[ii].Bias = it.value();
929            }
930            else if (it.key() == "7I") {
931              int ii = biasSat->NumberOfCodeBiases;
932              if (ii >= CLOCKORBIT_NUMBIAS)
933                break;
934              biasSat->NumberOfCodeBiases += 1;
935              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
936              biasSat->Biases[ii].Bias = it.value();
937            }
938            else if (it.key() == "7Q") {
939              int ii = biasSat->NumberOfCodeBiases;
940              if (ii >= CLOCKORBIT_NUMBIAS)
941                break;
942              biasSat->NumberOfCodeBiases += 1;
943              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
944              biasSat->Biases[ii].Bias = it.value();
945            }
946            else if (it.key() == "7X") {
947              int ii = biasSat->NumberOfCodeBiases;
948              if (ii >= CLOCKORBIT_NUMBIAS)
949                break;
950              biasSat->NumberOfCodeBiases += 1;
951              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
952              biasSat->Biases[ii].Bias = it.value();
953            }
954            else if (it.key() == "8I") {
955              int ii = biasSat->NumberOfCodeBiases;
956              if (ii >= CLOCKORBIT_NUMBIAS)
957                break;
958              biasSat->NumberOfCodeBiases += 1;
959              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
960              biasSat->Biases[ii].Bias = it.value();
961            }
962            else if (it.key() == "8Q") {
963              int ii = biasSat->NumberOfCodeBiases;
964              if (ii >= CLOCKORBIT_NUMBIAS)
965                break;
966              biasSat->NumberOfCodeBiases += 1;
967              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
968              biasSat->Biases[ii].Bias = it.value();
969            }
970            else if (it.key() == "8X") {
971              int ii = biasSat->NumberOfCodeBiases;
972              if (ii >= CLOCKORBIT_NUMBIAS)
973                break;
974              biasSat->NumberOfCodeBiases += 1;
975              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
976              biasSat->Biases[ii].Bias = it.value();
977            }
978            else if (it.key() == "6A") {
979              int ii = biasSat->NumberOfCodeBiases;
980              if (ii >= CLOCKORBIT_NUMBIAS)
981                break;
982              biasSat->NumberOfCodeBiases += 1;
983              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
984              biasSat->Biases[ii].Bias = it.value();
985            }
986            else if (it.key() == "6B") {
987              int ii = biasSat->NumberOfCodeBiases;
988              if (ii >= CLOCKORBIT_NUMBIAS)
989                break;
990              biasSat->NumberOfCodeBiases += 1;
991              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
992              biasSat->Biases[ii].Bias = it.value();
993            }
994            else if (it.key() == "6C") {
995              int ii = biasSat->NumberOfCodeBiases;
996              if (ii >= CLOCKORBIT_NUMBIAS)
997                break;
998              biasSat->NumberOfCodeBiases += 1;
999              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
1000              biasSat->Biases[ii].Bias = it.value();
1001            }
1002            else if (it.key() == "6X") {
1003              int ii = biasSat->NumberOfCodeBiases;
1004              if (ii >= CLOCKORBIT_NUMBIAS)
1005                break;
1006              biasSat->NumberOfCodeBiases += 1;
1007              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
1008              biasSat->Biases[ii].Bias = it.value();
1009            }
1010            else if (it.key() == "6Z") {
1011              int ii = biasSat->NumberOfCodeBiases;
1012              if (ii >= CLOCKORBIT_NUMBIAS)
1013                break;
1014              biasSat->NumberOfCodeBiases += 1;
1015              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
1016              biasSat->Biases[ii].Bias = it.value();
1017            }
1018          }
1019        }
1020        else if (prn.system() == 'J') {
1021          QMapIterator<QString, double> it(codeBiases);
1022          while (it.hasNext()) {
1023            it.next();
1024            if (it.key() == "1C") {
1025              int ii = biasSat->NumberOfCodeBiases;
1026              if (ii >= CLOCKORBIT_NUMBIAS)
1027                break;
1028              biasSat->NumberOfCodeBiases += 1;
1029              biasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
1030              biasSat->Biases[ii].Bias = it.value();
1031            }
1032            else if (it.key() == "1S") {
1033              int ii = biasSat->NumberOfCodeBiases;
1034              if (ii >= CLOCKORBIT_NUMBIAS)
1035                break;
1036              biasSat->NumberOfCodeBiases += 1;
1037              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
1038              biasSat->Biases[ii].Bias = it.value();
1039            }
1040            else if (it.key() == "1L") {
1041              int ii = biasSat->NumberOfCodeBiases;
1042              if (ii >= CLOCKORBIT_NUMBIAS)
1043                break;
1044              biasSat->NumberOfCodeBiases += 1;
1045              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
1046              biasSat->Biases[ii].Bias = it.value();
1047            }
1048            else if (it.key() == "1X") {
1049              int ii = biasSat->NumberOfCodeBiases;
1050              if (ii >= CLOCKORBIT_NUMBIAS)
1051                break;
1052              biasSat->NumberOfCodeBiases += 1;
1053              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
1054              biasSat->Biases[ii].Bias = it.value();
1055            }
1056            else if (it.key() == "2S") {
1057              int ii = biasSat->NumberOfCodeBiases;
1058              if (ii >= CLOCKORBIT_NUMBIAS)
1059                break;
1060              biasSat->NumberOfCodeBiases += 1;
1061              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
1062              biasSat->Biases[ii].Bias = it.value();
1063            }
1064            else if (it.key() == "2L") {
1065              int ii = biasSat->NumberOfCodeBiases;
1066              if (ii >= CLOCKORBIT_NUMBIAS)
1067                break;
1068              biasSat->NumberOfCodeBiases += 1;
1069              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
1070              biasSat->Biases[ii].Bias = it.value();
1071            }
1072            else if (it.key() == "2X") {
1073              int ii = biasSat->NumberOfCodeBiases;
1074              if (ii >= CLOCKORBIT_NUMBIAS)
1075                break;
1076              biasSat->NumberOfCodeBiases += 1;
1077              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
1078              biasSat->Biases[ii].Bias = it.value();
1079            }
1080            else if (it.key() == "5I") {
1081              int ii = biasSat->NumberOfCodeBiases;
1082              if (ii >= CLOCKORBIT_NUMBIAS)
1083                break;
1084              biasSat->NumberOfCodeBiases += 1;
1085              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
1086              biasSat->Biases[ii].Bias = it.value();
1087            }
1088            else if (it.key() == "5Q") {
1089              int ii = biasSat->NumberOfCodeBiases;
1090              if (ii >= CLOCKORBIT_NUMBIAS)
1091                break;
1092              biasSat->NumberOfCodeBiases += 1;
1093              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
1094              biasSat->Biases[ii].Bias = it.value();
1095            }
1096            else if (it.key() == "5X") {
1097              int ii = biasSat->NumberOfCodeBiases;
1098              if (ii >= CLOCKORBIT_NUMBIAS)
1099                break;
1100              biasSat->NumberOfCodeBiases += 1;
1101              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1102              biasSat->Biases[ii].Bias = it.value();
1103            }
1104            else if (it.key() == "6S") {
1105              int ii = biasSat->NumberOfCodeBiases;
1106              if (ii >= CLOCKORBIT_NUMBIAS)
1107                break;
1108              biasSat->NumberOfCodeBiases += 1;
1109              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_D;
1110              biasSat->Biases[ii].Bias = it.value();
1111            }
1112            else if (it.key() == "6L") {
1113              int ii = biasSat->NumberOfCodeBiases;
1114              if (ii >= CLOCKORBIT_NUMBIAS)
1115                break;
1116              biasSat->NumberOfCodeBiases += 1;
1117              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_P;
1118              biasSat->Biases[ii].Bias = it.value();
1119            }
1120            else if (it.key() == "6X") {
1121              int ii = biasSat->NumberOfCodeBiases;
1122              if (ii >= CLOCKORBIT_NUMBIAS)
1123                break;
1124              biasSat->NumberOfCodeBiases += 1;
1125              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_DP;
1126              biasSat->Biases[ii].Bias = it.value();
1127            }
1128          }
1129        }
1130        else if (prn.system() == 'S') {
1131          QMapIterator<QString, double> it(codeBiases);
1132          while (it.hasNext()) {
1133            it.next();
1134            if (it.key() == "1C") {
1135              int ii = biasSat->NumberOfCodeBiases;
1136              if (ii >= CLOCKORBIT_NUMBIAS)
1137                break;
1138              biasSat->NumberOfCodeBiases += 1;
1139              biasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
1140              biasSat->Biases[ii].Bias = it.value();
1141            }
1142            else if (it.key() == "5I") {
1143              int ii = biasSat->NumberOfCodeBiases;
1144              if (ii >= CLOCKORBIT_NUMBIAS)
1145                break;
1146              biasSat->NumberOfCodeBiases += 1;
1147              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
1148              biasSat->Biases[ii].Bias = it.value();
1149            }
1150            else if (it.key() == "5Q") {
1151              int ii = biasSat->NumberOfCodeBiases;
1152              if (ii >= CLOCKORBIT_NUMBIAS)
1153                break;
1154              biasSat->NumberOfCodeBiases += 1;
1155              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
1156              biasSat->Biases[ii].Bias = it.value();
1157            }
1158            else if (it.key() == "5X") {
1159              int ii = biasSat->NumberOfCodeBiases;
1160              if (ii >= CLOCKORBIT_NUMBIAS)
1161                break;
1162              biasSat->NumberOfCodeBiases += 1;
1163              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
1164              biasSat->Biases[ii].Bias = it.value();
1165            }
1166          }
1167        }
1168        else if (prn.system() == 'C') {
1169          QMapIterator<QString, double> it(codeBiases);
1170          while (it.hasNext()) {
1171            it.next();
1172            if (it.key() == "2I") {
1173              int ii = biasSat->NumberOfCodeBiases;
1174              if (ii >= CLOCKORBIT_NUMBIAS)
1175                break;
1176              biasSat->NumberOfCodeBiases += 1;
1177              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
1178              biasSat->Biases[ii].Bias = it.value();
1179            }
1180            else if (it.key() == "2Q") {
1181              int ii = biasSat->NumberOfCodeBiases;
1182              if (ii >= CLOCKORBIT_NUMBIAS)
1183                break;
1184              biasSat->NumberOfCodeBiases += 1;
1185              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
1186              biasSat->Biases[ii].Bias = it.value();
1187            }
1188            else if (it.key() == "2X") {
1189              int ii = biasSat->NumberOfCodeBiases;
1190              if (ii >= CLOCKORBIT_NUMBIAS)
1191                break;
1192              biasSat->NumberOfCodeBiases += 1;
1193              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
1194              biasSat->Biases[ii].Bias = it.value();
1195            }
1196            else if (it.key() == "6I") {
1197              int ii = biasSat->NumberOfCodeBiases;
1198              if (ii >= CLOCKORBIT_NUMBIAS)
1199                break;
1200              biasSat->NumberOfCodeBiases += 1;
1201              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
1202              biasSat->Biases[ii].Bias = it.value();
1203            }
1204            else if (it.key() == "6Q") {
1205              int ii = biasSat->NumberOfCodeBiases;
1206              if (ii >= CLOCKORBIT_NUMBIAS)
1207                break;
1208              biasSat->NumberOfCodeBiases += 1;
1209              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
1210              biasSat->Biases[ii].Bias = it.value();
1211            }
1212            else if (it.key() == "6X") {
1213              int ii = biasSat->NumberOfCodeBiases;
1214              if (ii >= CLOCKORBIT_NUMBIAS)
1215                break;
1216              biasSat->NumberOfCodeBiases += 1;
1217              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
1218              biasSat->Biases[ii].Bias = it.value();
1219            }
1220            else if (it.key() == "7I") {
1221              int ii = biasSat->NumberOfCodeBiases;
1222              if (ii >= CLOCKORBIT_NUMBIAS)
1223                break;
1224              biasSat->NumberOfCodeBiases += 1;
1225              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
1226              biasSat->Biases[ii].Bias = it.value();
1227            }
1228            else if (it.key() == "7Q") {
1229              int ii = biasSat->NumberOfCodeBiases;
1230              if (ii >= CLOCKORBIT_NUMBIAS)
1231                break;
1232              biasSat->NumberOfCodeBiases += 1;
1233              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
1234              biasSat->Biases[ii].Bias = it.value();
1235            }
1236            else if (it.key() == "7X") {
1237              int ii = biasSat->NumberOfCodeBiases;
1238              if (ii >= CLOCKORBIT_NUMBIAS)
1239                break;
1240              biasSat->NumberOfCodeBiases += 1;
1241              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
1242              biasSat->Biases[ii].Bias = it.value();
1243            }
1244            else if (it.key() == "5D") {
1245              int ii = biasSat->NumberOfCodeBiases;
1246              if (ii >= CLOCKORBIT_NUMBIAS)
1247                break;
1248              biasSat->NumberOfCodeBiases += 1;
1249              biasSat->Biases[ii].Type = CODETYPE_BDS_B2a_D;
1250              biasSat->Biases[ii].Bias = it.value();
1251            }
1252            else if (it.key() == "5P") {
1253              int ii = biasSat->NumberOfCodeBiases;
1254              if (ii >= CLOCKORBIT_NUMBIAS)
1255                break;
1256              biasSat->NumberOfCodeBiases += 1;
1257              biasSat->Biases[ii].Type = CODETYPE_BDS_B2a_P;
1258              biasSat->Biases[ii].Bias = it.value();
1259            }
1260            else if (it.key() == "5X") {
1261              int ii = biasSat->NumberOfCodeBiases;
1262              if (ii >= CLOCKORBIT_NUMBIAS)
1263                break;
1264              biasSat->NumberOfCodeBiases += 1;
1265              biasSat->Biases[ii].Type = CODETYPE_BDS_B2a_DP;
1266              biasSat->Biases[ii].Bias = it.value();
1267            }
1268            else if (it.key() == "1D") {
1269              int ii = biasSat->NumberOfCodeBiases;
1270              if (ii >= CLOCKORBIT_NUMBIAS)
1271                break;
1272              biasSat->NumberOfCodeBiases += 1;
1273              biasSat->Biases[ii].Type = CODETYPE_BDS_B1C_D;
1274              biasSat->Biases[ii].Bias = it.value();
1275            }
1276            else if (it.key() == "1P") {
1277              int ii = biasSat->NumberOfCodeBiases;
1278              if (ii >= CLOCKORBIT_NUMBIAS)
1279                break;
1280              biasSat->NumberOfCodeBiases += 1;
1281              biasSat->Biases[ii].Type = CODETYPE_BDS_B1C_P;
1282              biasSat->Biases[ii].Bias = it.value();
1283            }
1284            else if (it.key() == "1X") {
1285              int ii = biasSat->NumberOfCodeBiases;
1286              if (ii >= CLOCKORBIT_NUMBIAS)
1287                break;
1288              biasSat->NumberOfCodeBiases += 1;
1289              biasSat->Biases[ii].Type = CODETYPE_BDS_B1C_DP;
1290              biasSat->Biases[ii].Bias = it.value();
1291            }
1292          }
1293        }
1294      }
1295      // Phase Biases
1296      // ------------
1297      struct PhaseBias::PhaseBiasSat* phasebiasSat = 0;
1298      if (!phaseBiasList.isEmpty()) {
1299        if (prn.system() == 'G') {
1300          phasebiasSat = phasebias.Sat
1301              + phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1302          ++phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1303        }
1304        else if (prn.system() == 'R') {
1305          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1306              + phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1307          ++phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1308        }
1309        else if (prn.system() == 'E') {
1310          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1311              + CLOCKORBIT_NUMGLONASS
1312              + phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1313          ++phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1314        }
1315        else if (prn.system() == 'J') {
1316          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1317              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1318              + phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1319          ++phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1320        }
1321        else if (prn.system() == 'S') {
1322          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1323              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1324              + CLOCKORBIT_NUMQZSS + phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1325          ++phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1326        }
1327        else if (prn.system() == 'C') {
1328          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1329              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1330              + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
1331              + phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1332          ++phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1333        }
1334      }
1335
1336      if (phasebiasSat) {
1337        phasebias.DispersiveBiasConsistencyIndicator = dispersiveBiasConsistenyIndicator;
1338        phasebias.MWConsistencyIndicator = mwConsistencyIndicator;
1339        phasebiasSat->ID = prn.number();
1340        phasebiasSat->NumberOfPhaseBiases = 0;
1341        phasebiasSat->YawAngle = pbSat.yawAngle;
1342        phasebiasSat->YawRate = pbSat.yawRate;
1343        if (prn.system() == 'G') {
1344          QListIterator<phaseBiasSignal> it(phaseBiasList);
1345          while (it.hasNext()) {
1346            const phaseBiasSignal &pbSig = it.next();
1347            if (pbSig.type == "1C") {
1348              int ii = phasebiasSat->NumberOfPhaseBiases;
1349              if (ii >= CLOCKORBIT_NUMBIAS)
1350                break;
1351              phasebiasSat->NumberOfPhaseBiases += 1;
1352              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
1353              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1354              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1355              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1356              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1357            }
1358            else if (pbSig.type == "1P") {
1359              int ii = phasebiasSat->NumberOfPhaseBiases;
1360              if (ii >= CLOCKORBIT_NUMBIAS)
1361                break;
1362              phasebiasSat->NumberOfPhaseBiases += 1;
1363              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
1364              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1365              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1366              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1367              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1368            }
1369            else if (pbSig.type == "1W") {
1370              int ii = phasebiasSat->NumberOfPhaseBiases;
1371              if (ii >= CLOCKORBIT_NUMBIAS)
1372                break;
1373              phasebiasSat->NumberOfPhaseBiases += 1;
1374              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
1375              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1376              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1377              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1378              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1379            }
1380            else if (pbSig.type == "2C") {
1381              int ii = phasebiasSat->NumberOfPhaseBiases;
1382              if (ii >= CLOCKORBIT_NUMBIAS)
1383                break;
1384              phasebiasSat->NumberOfPhaseBiases += 1;
1385              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
1386              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1387              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1388              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1389              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1390            }
1391            else if (pbSig.type == "2S") {
1392              int ii = phasebiasSat->NumberOfPhaseBiases;
1393              if (ii >= CLOCKORBIT_NUMBIAS)
1394                break;
1395              phasebiasSat->NumberOfPhaseBiases += 1;
1396              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_M;
1397              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1398              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1399              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1400              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1401            }
1402            else if (pbSig.type == "2L") {
1403              int ii = phasebiasSat->NumberOfPhaseBiases;
1404              if (ii >= CLOCKORBIT_NUMBIAS)
1405                break;
1406              phasebiasSat->NumberOfPhaseBiases += 1;
1407              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_L;
1408              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1409              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1410              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1411              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1412            }
1413            else if (pbSig.type == "2X") {
1414              int ii = phasebiasSat->NumberOfPhaseBiases;
1415              if (ii >= CLOCKORBIT_NUMBIAS)
1416                break;
1417              phasebiasSat->NumberOfPhaseBiases += 1;
1418              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_ML;
1419              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1420              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1421              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1422              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1423            }
1424            else if (pbSig.type == "2P") {
1425              int ii = phasebiasSat->NumberOfPhaseBiases;
1426              if (ii >= CLOCKORBIT_NUMBIAS)
1427                break;
1428              phasebiasSat->NumberOfPhaseBiases += 1;
1429              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
1430              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1431              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1432              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1433              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1434            }
1435            else if (pbSig.type == "2W") {
1436              int ii = phasebiasSat->NumberOfPhaseBiases;
1437              if (ii >= CLOCKORBIT_NUMBIAS)
1438                break;
1439              phasebiasSat->NumberOfPhaseBiases += 1;
1440              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_Z;
1441              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1442              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1443              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1444              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1445            }
1446            else if (pbSig.type == "5I") {
1447              int ii = phasebiasSat->NumberOfPhaseBiases;
1448              if (ii >= CLOCKORBIT_NUMBIAS)
1449                break;
1450              phasebiasSat->NumberOfPhaseBiases += 1;
1451              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
1452              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1453              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1454              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1455              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1456            }
1457            else if (pbSig.type == "5Q") {
1458              int ii = phasebiasSat->NumberOfPhaseBiases;
1459              if (ii >= CLOCKORBIT_NUMBIAS)
1460                break;
1461              phasebiasSat->NumberOfPhaseBiases += 1;
1462              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
1463              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1464              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1465              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1466              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1467            }
1468            else if (pbSig.type == "5X") {
1469              int ii = phasebiasSat->NumberOfPhaseBiases;
1470              if (ii >= CLOCKORBIT_NUMBIAS)
1471                break;
1472              phasebiasSat->NumberOfPhaseBiases += 1;
1473              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
1474              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1475              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1476              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1477              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1478            }
1479            else if (pbSig.type == "1S") {
1480              int ii = phasebiasSat->NumberOfPhaseBiases;
1481              if (ii >= CLOCKORBIT_NUMBIAS)
1482                break;
1483              phasebiasSat->NumberOfPhaseBiases += 1;
1484              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
1485              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1486              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1487              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1488              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1489            }
1490            else if (pbSig.type == "1L") {
1491              int ii = phasebiasSat->NumberOfPhaseBiases;
1492              if (ii >= CLOCKORBIT_NUMBIAS)
1493                break;
1494              phasebiasSat->NumberOfPhaseBiases += 1;
1495              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
1496              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1497              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1498              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1499              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1500            }
1501            else if (pbSig.type == "1X") {
1502              int ii = phasebiasSat->NumberOfPhaseBiases;
1503              if (ii >= CLOCKORBIT_NUMBIAS)
1504                break;
1505              phasebiasSat->NumberOfPhaseBiases += 1;
1506              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_DP;
1507              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1508              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1509              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1510              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1511            }
1512          }
1513        }
1514        if (prn.system() == 'R') {
1515          QListIterator<phaseBiasSignal> it(phaseBiasList);
1516          while (it.hasNext()) {
1517            const phaseBiasSignal &pbSig = it.next();
1518            if (pbSig.type == "1C") {
1519              int ii = phasebiasSat->NumberOfPhaseBiases;
1520              if (ii >= CLOCKORBIT_NUMBIAS)
1521                break;
1522              phasebiasSat->NumberOfPhaseBiases += 1;
1523              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
1524              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1525              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1526              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1527              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1528            }
1529            else if (pbSig.type == "1P") {
1530              int ii = phasebiasSat->NumberOfPhaseBiases;
1531              if (ii >= CLOCKORBIT_NUMBIAS)
1532                break;
1533              phasebiasSat->NumberOfPhaseBiases += 1;
1534              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
1535              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1536              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1537              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1538              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1539            }
1540            else if (pbSig.type == "2C") {
1541              int ii = phasebiasSat->NumberOfPhaseBiases;
1542              if (ii >= CLOCKORBIT_NUMBIAS)
1543                break;
1544              phasebiasSat->NumberOfPhaseBiases += 1;
1545              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
1546              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1547              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1548              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1549              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1550            }
1551            else if (pbSig.type == "2P") {
1552              int ii = phasebiasSat->NumberOfPhaseBiases;
1553              if (ii >= CLOCKORBIT_NUMBIAS)
1554                break;
1555              phasebiasSat->NumberOfPhaseBiases += 1;
1556              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
1557              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1558              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1559              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1560              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1561            }
1562            else if (pbSig.type == "4A") {
1563              int ii = phasebiasSat->NumberOfPhaseBiases;
1564              if (ii >= CLOCKORBIT_NUMBIAS)
1565                break;
1566              phasebiasSat->NumberOfPhaseBiases += 1;
1567              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCd;
1568              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1569              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1570              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1571              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1572            }
1573            else if (pbSig.type == "4B") {
1574              int ii = phasebiasSat->NumberOfPhaseBiases;
1575              if (ii >= CLOCKORBIT_NUMBIAS)
1576                break;
1577              phasebiasSat->NumberOfPhaseBiases += 1;
1578              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCp;
1579              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1580              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1581              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1582              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1583            }
1584            else if (pbSig.type == "4X") {
1585              int ii = phasebiasSat->NumberOfPhaseBiases;
1586              if (ii >= CLOCKORBIT_NUMBIAS)
1587                break;
1588              phasebiasSat->NumberOfPhaseBiases += 1;
1589              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCdp;
1590              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1591              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1592              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1593              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1594            }
1595            else if (pbSig.type == "6A") {
1596              int ii = phasebiasSat->NumberOfPhaseBiases;
1597              if (ii >= CLOCKORBIT_NUMBIAS)
1598                break;
1599              phasebiasSat->NumberOfPhaseBiases += 1;
1600              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSI;
1601              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1602              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1603              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1604              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1605            }
1606            else if (pbSig.type == "6B") {
1607              int ii = phasebiasSat->NumberOfPhaseBiases;
1608              if (ii >= CLOCKORBIT_NUMBIAS)
1609                break;
1610              phasebiasSat->NumberOfPhaseBiases += 1;
1611              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_OCp;
1612              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1613              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1614              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1615              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1616            }
1617            else if (pbSig.type == "6X") {
1618              int ii = phasebiasSat->NumberOfPhaseBiases;
1619              if (ii >= CLOCKORBIT_NUMBIAS)
1620                break;
1621              phasebiasSat->NumberOfPhaseBiases += 1;
1622              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSIOCp;
1623              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1624              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1625              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1626              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1627            }
1628            else if (pbSig.type == "3I") {
1629              int ii = phasebiasSat->NumberOfPhaseBiases;
1630              if (ii >= CLOCKORBIT_NUMBIAS)
1631                break;
1632              phasebiasSat->NumberOfPhaseBiases += 1;
1633              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L3_I;
1634              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1635              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1636              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1637              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1638            }
1639            else if (pbSig.type == "3Q") {
1640              int ii = phasebiasSat->NumberOfPhaseBiases;
1641              if (ii >= CLOCKORBIT_NUMBIAS)
1642                break;
1643              phasebiasSat->NumberOfPhaseBiases += 1;
1644              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L3_Q;
1645              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1646              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1647              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1648              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1649            }
1650            else if (pbSig.type == "3X") {
1651              int ii = phasebiasSat->NumberOfPhaseBiases;
1652              if (ii >= CLOCKORBIT_NUMBIAS)
1653                break;
1654              phasebiasSat->NumberOfPhaseBiases += 1;
1655              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L3_IQ;
1656              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1657              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1658              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1659              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1660            }
1661          }
1662        }
1663        if (prn.system() == 'E') {
1664          QListIterator<phaseBiasSignal> it(phaseBiasList);
1665          while (it.hasNext()) {
1666            const phaseBiasSignal &pbSig = it.next();
1667            if (pbSig.type == "1A") {
1668              int ii = phasebiasSat->NumberOfPhaseBiases;
1669              if (ii >= CLOCKORBIT_NUMBIAS)
1670                break;
1671              phasebiasSat->NumberOfPhaseBiases += 1;
1672              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
1673              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1674              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1675              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1676              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1677            }
1678            else if (pbSig.type == "1B") {
1679              int ii = phasebiasSat->NumberOfPhaseBiases;
1680              if (ii >= CLOCKORBIT_NUMBIAS)
1681                break;
1682              phasebiasSat->NumberOfPhaseBiases += 1;
1683              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
1684              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1685              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1686              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1687              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1688            }
1689            else if (pbSig.type == "1C") {
1690              int ii = phasebiasSat->NumberOfPhaseBiases;
1691              if (ii >= CLOCKORBIT_NUMBIAS)
1692                break;
1693              phasebiasSat->NumberOfPhaseBiases += 1;
1694              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
1695              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1696              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1697              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1698              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1699            }
1700            else if (pbSig.type == "1X") {
1701              int ii = phasebiasSat->NumberOfPhaseBiases;
1702              if (ii >= CLOCKORBIT_NUMBIAS)
1703                break;
1704              phasebiasSat->NumberOfPhaseBiases += 1;
1705              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
1706              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1707              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1708              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1709              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1710            }
1711            else if (pbSig.type == "1Z") {
1712              int ii = phasebiasSat->NumberOfPhaseBiases;
1713              if (ii >= CLOCKORBIT_NUMBIAS)
1714                break;
1715              phasebiasSat->NumberOfPhaseBiases += 1;
1716              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
1717              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1718              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1719              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1720              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1721            }
1722            else if (pbSig.type == "5I") {
1723              int ii = phasebiasSat->NumberOfPhaseBiases;
1724              if (ii >= CLOCKORBIT_NUMBIAS)
1725                break;
1726              phasebiasSat->NumberOfPhaseBiases += 1;
1727              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
1728              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1729              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1730              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1731              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1732            }
1733            else if (pbSig.type == "5Q") {
1734              int ii = phasebiasSat->NumberOfPhaseBiases;
1735              if (ii >= CLOCKORBIT_NUMBIAS)
1736                break;
1737              phasebiasSat->NumberOfPhaseBiases += 1;
1738              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
1739              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1740              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1741              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1742              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1743            }
1744            else if (pbSig.type == "5X") {
1745              int ii = phasebiasSat->NumberOfPhaseBiases;
1746              if (ii >= CLOCKORBIT_NUMBIAS)
1747                break;
1748              phasebiasSat->NumberOfPhaseBiases += 1;
1749              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
1750              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1751              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1752              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1753              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1754            }
1755            else if (pbSig.type == "7I") {
1756              int ii = phasebiasSat->NumberOfPhaseBiases;
1757              if (ii >= CLOCKORBIT_NUMBIAS)
1758                break;
1759              phasebiasSat->NumberOfPhaseBiases += 1;
1760              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
1761              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1762              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1763              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1764              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1765            }
1766            else if (pbSig.type == "7Q") {
1767              int ii = phasebiasSat->NumberOfPhaseBiases;
1768              if (ii >= CLOCKORBIT_NUMBIAS)
1769                break;
1770              phasebiasSat->NumberOfPhaseBiases += 1;
1771              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
1772              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1773              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1774              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1775              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1776            }
1777            else if (pbSig.type == "7X") {
1778              int ii = phasebiasSat->NumberOfPhaseBiases;
1779              if (ii >= CLOCKORBIT_NUMBIAS)
1780                break;
1781              phasebiasSat->NumberOfPhaseBiases += 1;
1782              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
1783              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1784              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1785              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1786              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1787            }
1788            else if (pbSig.type == "8I") {
1789              int ii = phasebiasSat->NumberOfPhaseBiases;
1790              if (ii >= CLOCKORBIT_NUMBIAS)
1791                break;
1792              phasebiasSat->NumberOfPhaseBiases += 1;
1793              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
1794              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1795              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1796              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1797              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1798            }
1799            else if (pbSig.type == "8Q") {
1800              int ii = phasebiasSat->NumberOfPhaseBiases;
1801              if (ii >= CLOCKORBIT_NUMBIAS)
1802                break;
1803              phasebiasSat->NumberOfPhaseBiases += 1;
1804              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
1805              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1806              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1807              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1808              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1809            }
1810            else if (pbSig.type == "8X") {
1811              int ii = phasebiasSat->NumberOfPhaseBiases;
1812              if (ii >= CLOCKORBIT_NUMBIAS)
1813                break;
1814              phasebiasSat->NumberOfPhaseBiases += 1;
1815              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
1816              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1817              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1818              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1819              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1820            }
1821            else if (pbSig.type == "6A") {
1822              int ii = phasebiasSat->NumberOfPhaseBiases;
1823              if (ii >= CLOCKORBIT_NUMBIAS)
1824                break;
1825              phasebiasSat->NumberOfPhaseBiases += 1;
1826              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
1827              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1828              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1829              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1830              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1831            }
1832            else if (pbSig.type == "6B") {
1833              int ii = phasebiasSat->NumberOfPhaseBiases;
1834              if (ii >= CLOCKORBIT_NUMBIAS)
1835                break;
1836              phasebiasSat->NumberOfPhaseBiases += 1;
1837              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
1838              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1839              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1840              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1841              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1842            }
1843            else if (pbSig.type == "6C") {
1844              int ii = phasebiasSat->NumberOfPhaseBiases;
1845              if (ii >= CLOCKORBIT_NUMBIAS)
1846                break;
1847              phasebiasSat->NumberOfPhaseBiases += 1;
1848              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
1849              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1850              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1851              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1852              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1853            }
1854            else if (pbSig.type == "6X") {
1855              int ii = phasebiasSat->NumberOfPhaseBiases;
1856              if (ii >= CLOCKORBIT_NUMBIAS)
1857                break;
1858              phasebiasSat->NumberOfPhaseBiases += 1;
1859              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
1860              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1861              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1862              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1863              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1864            }
1865            else if (pbSig.type == "6Z") {
1866              int ii = phasebiasSat->NumberOfPhaseBiases;
1867              if (ii >= CLOCKORBIT_NUMBIAS)
1868                break;
1869              phasebiasSat->NumberOfPhaseBiases += 1;
1870              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
1871              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1872              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1873              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1874              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1875            }
1876          }
1877        }
1878        if (prn.system() == 'J') {
1879          QListIterator<phaseBiasSignal> it(phaseBiasList);
1880          while (it.hasNext()) {
1881            const phaseBiasSignal &pbSig = it.next();
1882            if (pbSig.type == "1C") {
1883              int ii = phasebiasSat->NumberOfPhaseBiases;
1884              if (ii >= CLOCKORBIT_NUMBIAS)
1885                break;
1886              phasebiasSat->NumberOfPhaseBiases += 1;
1887              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
1888              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1889              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1890              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1891              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1892            }
1893            else if (pbSig.type == "1S") {
1894              int ii = phasebiasSat->NumberOfPhaseBiases;
1895              if (ii >= CLOCKORBIT_NUMBIAS)
1896                break;
1897              phasebiasSat->NumberOfPhaseBiases += 1;
1898              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
1899              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1900              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1901              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1902            }
1903            else if (pbSig.type == "1L") {
1904              int ii = phasebiasSat->NumberOfPhaseBiases;
1905              if (ii >= CLOCKORBIT_NUMBIAS)
1906                break;
1907              phasebiasSat->NumberOfPhaseBiases += 1;
1908              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
1909              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1910              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1911              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1912              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1913            }
1914            else if (pbSig.type == "1X") {
1915              int ii = phasebiasSat->NumberOfPhaseBiases;
1916              if (ii >= CLOCKORBIT_NUMBIAS)
1917                break;
1918              phasebiasSat->NumberOfPhaseBiases += 1;
1919              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
1920              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1921              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1922              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1923              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1924            }
1925            else if (pbSig.type == "2S") {
1926              int ii = phasebiasSat->NumberOfPhaseBiases;
1927              if (ii >= CLOCKORBIT_NUMBIAS)
1928                break;
1929              phasebiasSat->NumberOfPhaseBiases += 1;
1930              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
1931              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1932              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1933              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1934              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1935            }
1936            else if (pbSig.type == "2L") {
1937              int ii = phasebiasSat->NumberOfPhaseBiases;
1938              if (ii >= CLOCKORBIT_NUMBIAS)
1939                break;
1940              phasebiasSat->NumberOfPhaseBiases += 1;
1941              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
1942              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1943              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1944              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1945              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1946            }
1947            else if (pbSig.type == "2X") {
1948              int ii = phasebiasSat->NumberOfPhaseBiases;
1949              if (ii >= CLOCKORBIT_NUMBIAS)
1950                break;
1951              phasebiasSat->NumberOfPhaseBiases += 1;
1952              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
1953              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1954              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1955              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1956            }
1957            else if (pbSig.type == "5I") {
1958              int ii = phasebiasSat->NumberOfPhaseBiases;
1959              if (ii >= CLOCKORBIT_NUMBIAS)
1960                break;
1961              phasebiasSat->NumberOfPhaseBiases += 1;
1962              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
1963              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1964              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1965              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1966              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1967            }
1968            else if (pbSig.type == "5Q") {
1969              int ii = phasebiasSat->NumberOfPhaseBiases;
1970              if (ii >= CLOCKORBIT_NUMBIAS)
1971                break;
1972              phasebiasSat->NumberOfPhaseBiases += 1;
1973              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
1974              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1975              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1976              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1977              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1978            }
1979            else if (pbSig.type == "5X") {
1980              int ii = phasebiasSat->NumberOfPhaseBiases;
1981              if (ii >= CLOCKORBIT_NUMBIAS)
1982                break;
1983              phasebiasSat->NumberOfPhaseBiases += 1;
1984              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1985              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1986              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1987              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1988              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1989            }
1990            else if (pbSig.type == "6S") {
1991              int ii = phasebiasSat->NumberOfPhaseBiases;
1992              if (ii >= CLOCKORBIT_NUMBIAS)
1993                break;
1994              phasebiasSat->NumberOfPhaseBiases += 1;
1995              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_D;
1996              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1997              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1998              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1999              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2000            }
2001            else if (pbSig.type == "6L") {
2002              int ii = phasebiasSat->NumberOfPhaseBiases;
2003              if (ii >= CLOCKORBIT_NUMBIAS)
2004                break;
2005              phasebiasSat->NumberOfPhaseBiases += 1;
2006              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_P;
2007              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2008              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2009              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2010              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2011            }
2012            else if (pbSig.type == "6X") {
2013              int ii = phasebiasSat->NumberOfPhaseBiases;
2014              if (ii >= CLOCKORBIT_NUMBIAS)
2015                break;
2016              phasebiasSat->NumberOfPhaseBiases += 1;
2017              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_DP;
2018              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2019              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2020              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2021              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2022            }
2023          }
2024        }
2025        if (prn.system() == 'S') {
2026          QListIterator<phaseBiasSignal> it(phaseBiasList);
2027          while (it.hasNext()) {
2028            const phaseBiasSignal &pbSig = it.next();
2029            if (pbSig.type == "1C") {
2030              int ii = phasebiasSat->NumberOfPhaseBiases;
2031              if (ii >= CLOCKORBIT_NUMBIAS)
2032                break;
2033              phasebiasSat->NumberOfPhaseBiases += 1;
2034              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
2035              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2036              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2037              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2038              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2039            }
2040            else if (pbSig.type == "5I") {
2041              int ii = phasebiasSat->NumberOfPhaseBiases;
2042              if (ii >= CLOCKORBIT_NUMBIAS)
2043                break;
2044              phasebiasSat->NumberOfPhaseBiases += 1;
2045              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
2046              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2047              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2048              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2049            }
2050            else if (pbSig.type == "5Q") {
2051              int ii = phasebiasSat->NumberOfPhaseBiases;
2052              if (ii >= CLOCKORBIT_NUMBIAS)
2053                break;
2054              phasebiasSat->NumberOfPhaseBiases += 1;
2055              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
2056              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2057              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2058              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2059              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2060            }
2061            else if (pbSig.type == "5X") {
2062              int ii = phasebiasSat->NumberOfPhaseBiases;
2063              if (ii >= CLOCKORBIT_NUMBIAS)
2064                break;
2065              phasebiasSat->NumberOfPhaseBiases += 1;
2066              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
2067              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2068              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2069              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2070              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2071            }
2072          }
2073        }
2074        if (prn.system() == 'C') {
2075          QListIterator<phaseBiasSignal> it(phaseBiasList);
2076          while (it.hasNext()) {
2077            const phaseBiasSignal &pbSig = it.next();
2078            if (pbSig.type == "2I") {
2079              int ii = phasebiasSat->NumberOfPhaseBiases;
2080              if (ii >= CLOCKORBIT_NUMBIAS)
2081                break;
2082              phasebiasSat->NumberOfPhaseBiases += 1;
2083              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
2084              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2085              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2086              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2087              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2088            }
2089            else if (pbSig.type == "2Q") {
2090              int ii = phasebiasSat->NumberOfPhaseBiases;
2091              if (ii >= CLOCKORBIT_NUMBIAS)
2092                break;
2093              phasebiasSat->NumberOfPhaseBiases += 1;
2094              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
2095              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2096              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2097              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2098              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2099            }
2100            else if (pbSig.type == "2X") {
2101              int ii = phasebiasSat->NumberOfPhaseBiases;
2102              if (ii >= CLOCKORBIT_NUMBIAS)
2103                break;
2104              phasebiasSat->NumberOfPhaseBiases += 1;
2105              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
2106              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2107              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2108              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2109              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2110            }
2111            else if (pbSig.type == "6I") {
2112              int ii = phasebiasSat->NumberOfPhaseBiases;
2113              if (ii >= CLOCKORBIT_NUMBIAS)
2114                break;
2115              phasebiasSat->NumberOfPhaseBiases += 1;
2116              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
2117              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2118              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2119              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2120              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2121            }
2122            else if (pbSig.type == "6Q") {
2123              int ii = phasebiasSat->NumberOfPhaseBiases;
2124              if (ii >= CLOCKORBIT_NUMBIAS)
2125                break;
2126              phasebiasSat->NumberOfPhaseBiases += 1;
2127              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
2128              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2129              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2130              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2131              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2132            }
2133            else if (pbSig.type == "6X") {
2134              int ii = phasebiasSat->NumberOfPhaseBiases;
2135              if (ii >= CLOCKORBIT_NUMBIAS)
2136                break;
2137              phasebiasSat->NumberOfPhaseBiases += 1;
2138              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
2139              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2140              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2141              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2142              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2143            }
2144            else if (pbSig.type == "7I") {
2145              int ii = phasebiasSat->NumberOfPhaseBiases;
2146              if (ii >= CLOCKORBIT_NUMBIAS)
2147                break;
2148              phasebiasSat->NumberOfPhaseBiases += 1;
2149              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
2150              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2151              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2152              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2153              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2154            }
2155            else if (pbSig.type == "7Q") {
2156              int ii = phasebiasSat->NumberOfPhaseBiases;
2157              if (ii >= CLOCKORBIT_NUMBIAS)
2158                break;
2159              phasebiasSat->NumberOfPhaseBiases += 1;
2160              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
2161              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2162              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2163              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2164              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2165            }
2166            else if (pbSig.type == "7X") {
2167              int ii = phasebiasSat->NumberOfPhaseBiases;
2168              if (ii >= CLOCKORBIT_NUMBIAS)
2169                break;
2170              phasebiasSat->NumberOfPhaseBiases += 1;
2171              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
2172              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2173              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2174              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2175            }
2176            else if (pbSig.type == "5D") {
2177              int ii = phasebiasSat->NumberOfPhaseBiases;
2178              if (ii >= CLOCKORBIT_NUMBIAS)
2179                break;
2180              phasebiasSat->NumberOfPhaseBiases += 1;
2181              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2a_D;
2182              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2183              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2184              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2185            }
2186            else if (pbSig.type == "5P") {
2187              int ii = phasebiasSat->NumberOfPhaseBiases;
2188              if (ii >= CLOCKORBIT_NUMBIAS)
2189                break;
2190              phasebiasSat->NumberOfPhaseBiases += 1;
2191              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2a_P;
2192              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2193              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2194              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2195            }
2196            else if (pbSig.type == "5X") {
2197              int ii = phasebiasSat->NumberOfPhaseBiases;
2198              if (ii >= CLOCKORBIT_NUMBIAS)
2199                break;
2200              phasebiasSat->NumberOfPhaseBiases += 1;
2201              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2a_DP;
2202              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2203              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2204              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2205            }
2206            else if (pbSig.type == "1D") {
2207              int ii = phasebiasSat->NumberOfPhaseBiases;
2208              if (ii >= CLOCKORBIT_NUMBIAS)
2209                break;
2210              phasebiasSat->NumberOfPhaseBiases += 1;
2211              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1C_D;
2212              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2213              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2214              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2215            }
2216            else if (pbSig.type == "1P") {
2217              int ii = phasebiasSat->NumberOfPhaseBiases;
2218              if (ii >= CLOCKORBIT_NUMBIAS)
2219                break;
2220              phasebiasSat->NumberOfPhaseBiases += 1;
2221              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1C_P;
2222              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2223              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2224              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2225            }
2226            else if (pbSig.type == "1X") {
2227              int ii = phasebiasSat->NumberOfPhaseBiases;
2228              if (ii >= CLOCKORBIT_NUMBIAS)
2229                break;
2230              phasebiasSat->NumberOfPhaseBiases += 1;
2231              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1C_DP;
2232              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2233              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2234              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2235            }
2236          }
2237        }
2238      }
2239    }
2240  }
2241
2242  QByteArray hlpBufferCo;
2243
2244  // Orbit and Clock Corrections together
2245  // ------------------------------------
2246  if (_samplRtcmEphCorr == 0.0) {
2247    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2248        || co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2249        || co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2250        || co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2251        || co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2252        || co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2253      char obuffer[CLOCKORBIT_BUFFERSIZE];
2254      int len = MakeClockOrbit(&co, COTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2255      if (len > 0) {
2256        hlpBufferCo = QByteArray(obuffer, len);
2257      }
2258    }
2259  }
2260
2261  // Orbit and Clock Corrections separately
2262  // --------------------------------------
2263  else {
2264    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0) {
2265      char obuffer[CLOCKORBIT_BUFFERSIZE];
2266      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2267        co.UpdateInterval = ephUpdInd;
2268        int len1 = MakeClockOrbit(&co, COTYPE_GPSORBIT, 1, obuffer,
2269            sizeof(obuffer));
2270        co.UpdateInterval = clkUpdInd;
2271        if (len1 > 0) {
2272          hlpBufferCo += QByteArray(obuffer, len1);
2273        }
2274      }
2275      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0 ||
2276                  co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0 ||
2277                  co.NumberOfSat[CLOCKORBIT_SATQZSS]    > 0 ||
2278                  co.NumberOfSat[CLOCKORBIT_SATSBAS]    > 0 ||
2279                  co.NumberOfSat[CLOCKORBIT_SATBDS]     > 0   ) ? 1 : 0;
2280      int len2 = MakeClockOrbit(&co, COTYPE_GPSCLOCK, mmsg, obuffer,
2281          sizeof(obuffer));
2282      if (len2 > 0) {
2283        hlpBufferCo += QByteArray(obuffer, len2);
2284      }
2285    }
2286    if (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) {
2287      char obuffer[CLOCKORBIT_BUFFERSIZE];
2288      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2289        co.UpdateInterval = ephUpdInd;
2290        int len1 = MakeClockOrbit(&co, COTYPE_GLONASSORBIT, 1, obuffer,
2291            sizeof(obuffer));
2292        co.UpdateInterval = clkUpdInd;
2293        if (len1 > 0) {
2294          hlpBufferCo += QByteArray(obuffer, len1);
2295        }
2296      }
2297      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0 ||
2298                  co.NumberOfSat[CLOCKORBIT_SATQZSS]    > 0 ||
2299                  co.NumberOfSat[CLOCKORBIT_SATSBAS]    > 0 ||
2300                  co.NumberOfSat[CLOCKORBIT_SATBDS]     > 0   ) ? 1 : 0;
2301      int len2 = MakeClockOrbit(&co, COTYPE_GLONASSCLOCK, mmsg, obuffer,
2302          sizeof(obuffer));
2303      if (len2 > 0) {
2304        hlpBufferCo += QByteArray(obuffer, len2);
2305      }
2306    }
2307    if (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) {
2308      char obuffer[CLOCKORBIT_BUFFERSIZE];
2309      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2310        co.UpdateInterval = ephUpdInd;
2311        int len1 = MakeClockOrbit(&co, COTYPE_GALILEOORBIT, 1, obuffer,
2312            sizeof(obuffer));
2313        co.UpdateInterval = clkUpdInd;
2314        if (len1 > 0) {
2315          hlpBufferCo += QByteArray(obuffer, len1);
2316        }
2317      }
2318      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATQZSS]    > 0 ||
2319                  co.NumberOfSat[CLOCKORBIT_SATSBAS]    > 0 ||
2320                  co.NumberOfSat[CLOCKORBIT_SATBDS]     > 0   ) ? 1 : 0;
2321      int len2 = MakeClockOrbit(&co, COTYPE_GALILEOCLOCK, mmsg, obuffer,
2322          sizeof(obuffer));
2323      if (len2 > 0) {
2324        hlpBufferCo += QByteArray(obuffer, len2);
2325      }
2326    }
2327    if (co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) {
2328      char obuffer[CLOCKORBIT_BUFFERSIZE];
2329      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2330        co.UpdateInterval = ephUpdInd;
2331        int len1 = MakeClockOrbit(&co, COTYPE_QZSSORBIT, 1, obuffer,
2332            sizeof(obuffer));
2333        co.UpdateInterval = clkUpdInd;
2334        if (len1 > 0) {
2335          hlpBufferCo += QByteArray(obuffer, len1);
2336        }
2337      }
2338      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATSBAS]    > 0 ||
2339                  co.NumberOfSat[CLOCKORBIT_SATBDS]     > 0   ) ? 1 : 0;
2340      int len2 = MakeClockOrbit(&co, COTYPE_QZSSCLOCK, mmsg, obuffer,
2341          sizeof(obuffer));
2342      if (len2 > 0) {
2343        hlpBufferCo += QByteArray(obuffer, len2);
2344      }
2345    }
2346    if (co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) {
2347      char obuffer[CLOCKORBIT_BUFFERSIZE];
2348      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2349        co.UpdateInterval = ephUpdInd;
2350        int len1 = MakeClockOrbit(&co, COTYPE_SBASORBIT, 1, obuffer,
2351            sizeof(obuffer));
2352        co.UpdateInterval = clkUpdInd;
2353        if (len1 > 0) {
2354          hlpBufferCo += QByteArray(obuffer, len1);
2355        }
2356      }
2357      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) ? 1 : 0;
2358      int len2 = MakeClockOrbit(&co, COTYPE_SBASCLOCK, mmsg, obuffer,
2359          sizeof(obuffer));
2360      if (len2 > 0) {
2361        hlpBufferCo += QByteArray(obuffer, len2);
2362      }
2363    }
2364    if (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2365      char obuffer[CLOCKORBIT_BUFFERSIZE];
2366      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2367        co.UpdateInterval = ephUpdInd;
2368        int len1 = MakeClockOrbit(&co, COTYPE_BDSORBIT, 1, obuffer,
2369            sizeof(obuffer));
2370        co.UpdateInterval = clkUpdInd;
2371        if (len1 > 0) {
2372          hlpBufferCo += QByteArray(obuffer, len1);
2373        }
2374      }
2375      int mmsg = 0;
2376      int len2 = MakeClockOrbit(&co, COTYPE_BDSCLOCK, mmsg, obuffer,
2377          sizeof(obuffer));
2378      if (len2 > 0) {
2379        hlpBufferCo += QByteArray(obuffer, len2);
2380      }
2381    }
2382  }
2383
2384  // Code Biases
2385  // -----------
2386  QByteArray hlpBufferBias;
2387  if (bias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2388      || bias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2389      || bias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2390      || bias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2391      || bias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2392      || bias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2393    char obuffer[CLOCKORBIT_BUFFERSIZE];
2394    int len = MakeCodeBias(&bias, BTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2395    if (len > 0) {
2396      hlpBufferBias = QByteArray(obuffer, len);
2397    }
2398  }
2399
2400  // Phase Biases
2401  // ------------
2402  QByteArray hlpBufferPhaseBias;
2403  if (phasebias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2404      || phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2405      || phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2406      || phasebias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2407      || phasebias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2408      || phasebias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2409    char obuffer[CLOCKORBIT_BUFFERSIZE];
2410    int len = MakePhaseBias(&phasebias, PBTYPE_AUTO, 0, obuffer,
2411        sizeof(obuffer));
2412    if (len > 0) {
2413      hlpBufferPhaseBias = QByteArray(obuffer, len);
2414    }
2415  }
2416
2417  // VTEC
2418  // ----
2419  QByteArray hlpBufferVtec;
2420  if (vtec.NumLayers > 0) {
2421    char obuffer[CLOCKORBIT_BUFFERSIZE];
2422    int len = MakeVTEC(&vtec, 0, obuffer, sizeof(obuffer));
2423    if (len > 0) {
2424      hlpBufferVtec = QByteArray(obuffer, len);
2425    }
2426  }
2427
2428  _outBuffer += hlpBufferCo + hlpBufferBias + hlpBufferPhaseBias
2429      + hlpBufferVtec;
2430}
2431
2432//
2433////////////////////////////////////////////////////////////////////////////
2434t_irc bncRtnetUploadCaster::processSatellite(const t_eph* eph, int GPSweek,
2435    double GPSweeks, const QString& prn, const ColumnVector& rtnAPC,
2436    double rtnUra, const ColumnVector& rtnClk, const ColumnVector& rtnVel,
2437    const ColumnVector& rtnCoM, const ColumnVector& rtnClkSig,
2438    struct ClockOrbit::SatData* sd, QString& outLine) {
2439
2440  // Broadcast Position and Velocity
2441  // -------------------------------
2442  ColumnVector xB(6);
2443  ColumnVector vB(3);
2444  t_irc irc = eph->getCrd(bncTime(GPSweek, GPSweeks), xB, vB, false);
2445
2446  if (irc != success) {
2447    return irc;
2448  }
2449
2450  // Precise Position
2451  // ----------------
2452  ColumnVector xP = _CoM ? rtnCoM : rtnAPC;
2453
2454  if (xP.size() == 0) {
2455    return failure;
2456  }
2457
2458  double dc = 0.0;
2459  if (_crdTrafo != "IGS14") {
2460    crdTrafo(GPSweek, xP, dc);
2461  }
2462
2463  // Difference in xyz
2464  // -----------------
2465  ColumnVector dx = xB.Rows(1, 3) - xP;
2466  ColumnVector dv = vB - rtnVel;
2467
2468  // Difference in RSW
2469  // -----------------
2470  ColumnVector rsw(3);
2471  XYZ_to_RSW(xB.Rows(1, 3), vB, dx, rsw);
2472
2473  ColumnVector dotRsw(3);
2474  XYZ_to_RSW(xB.Rows(1, 3), vB, dv, dotRsw);
2475
2476  // Clock Correction
2477  // ----------------
2478  double dClkA0 = rtnClk(1) - (xB(4) - dc) * t_CST::c;
2479  double dClkA1 = 0.0;
2480  if (rtnClk(2)) {
2481    dClkA1 = rtnClk(2) - xB(5) * t_CST::c;
2482  }
2483  double dClkA2 = 0.0;
2484  if (rtnClk(3)) {
2485    dClkA2 = rtnClk(3) - xB(6) * t_CST::c;
2486  }
2487
2488  if (sd) {
2489    sd->ID = prn.mid(1).toInt();
2490    sd->IOD = eph->IOD();
2491    sd->Clock.DeltaA0 = dClkA0;
2492    sd->Clock.DeltaA1 = dClkA1;
2493    sd->Clock.DeltaA2 = dClkA2;
2494    sd->UserRangeAccuracy = rtnUra;
2495    sd->Orbit.DeltaRadial     = rsw(1);
2496    sd->Orbit.DeltaAlongTrack = rsw(2);
2497    sd->Orbit.DeltaCrossTrack = rsw(3);
2498    sd->Orbit.DotDeltaRadial     = dotRsw(1);
2499    sd->Orbit.DotDeltaAlongTrack = dotRsw(2);
2500    sd->Orbit.DotDeltaCrossTrack = dotRsw(3);
2501  }
2502
2503  outLine.sprintf("%d %.1f %s  %u  %10.3f %8.3f %8.3f  %8.3f %8.3f %8.3f\n", GPSweek,
2504      GPSweeks, eph->prn().toString().c_str(), eph->IOD(), dClkA0, dClkA1, dClkA2,
2505      rsw(1), rsw(2), rsw(3));
2506
2507  // RTNET full clock for RINEX and SP3 file
2508  // ---------------------------------------
2509  double relativity = -2.0 * DotProduct(xP, rtnVel) / t_CST::c;
2510  double clkRnx     = (rtnClk[0] - relativity) / t_CST::c;  // [s]
2511  double clkRnxRate = rtnClk[1] / t_CST::c;                 // [s/s = -]
2512  double clkRnxAcc  = rtnClk[2] / t_CST::c;                 // [s/s² ) -/s]
2513
2514  if (_rnx) {
2515    double clkRnxSig, clkRnxRateSig, clkRnxAccSig;
2516    int s = rtnClkSig.size();
2517    switch (s) {
2518      case 1:
2519        clkRnxSig     = rtnClkSig[0] / t_CST::c;    // [s]
2520        clkRnxRateSig = 0.0;                        // [s/s = -]
2521        clkRnxAccSig  = 0.0;                        // [s/s² ) -/s]
2522        break;
2523      case 2:
2524        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2525        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2526        clkRnxAccSig  = 0.0;                         // [s/s² ) -/s]
2527        break;
2528      case 3:
2529        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2530        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2531        clkRnxAccSig  = rtnClkSig[2] / t_CST::c;     // [s/s² ) -/s]
2532        break;
2533    }
2534    _rnx->write(GPSweek, GPSweeks, prn, clkRnx, clkRnxRate, clkRnxAcc,
2535                clkRnxSig, clkRnxRateSig, clkRnxAccSig);
2536  }
2537  if (_sp3) {
2538    _sp3->write(GPSweek, GPSweeks, prn, rtnCoM, clkRnx, rtnVel, clkRnxRate);
2539  }
2540  return success;
2541}
2542
2543// Transform Coordinates
2544////////////////////////////////////////////////////////////////////////////
2545void bncRtnetUploadCaster::crdTrafo(int GPSWeek, ColumnVector& xyz,
2546    double& dc) {
2547
2548  // Current epoch minus 2000.0 in years
2549  // ------------------------------------
2550  double dt = (GPSWeek - (1042.0 + 6.0 / 7.0)) / 365.2422 * 7.0 + 2000.0 - _t0;
2551
2552  ColumnVector dx(3);
2553
2554  dx(1) = _dx + dt * _dxr;
2555  dx(2) = _dy + dt * _dyr;
2556  dx(3) = _dz + dt * _dzr;
2557
2558  static const double arcSec = 180.0 * 3600.0 / M_PI;
2559
2560  double ox = (_ox + dt * _oxr) / arcSec;
2561  double oy = (_oy + dt * _oyr) / arcSec;
2562  double oz = (_oz + dt * _ozr) / arcSec;
2563
2564  double sc = 1.0 + _sc * 1e-9 + dt * _scr * 1e-9;
2565
2566  // Specify approximate center of area
2567  // ----------------------------------
2568  ColumnVector meanSta(3);
2569
2570  if (_crdTrafo == "ETRF2000") {
2571    meanSta(1) = 3661090.0;
2572    meanSta(2) = 845230.0;
2573    meanSta(3) = 5136850.0;
2574  }
2575  else if (_crdTrafo == "GDA2020") {
2576    meanSta(1) = -4052050.0;
2577    meanSta(2) = 4212840.0;
2578    meanSta(3) = -2545110.0;
2579  }
2580  else if (_crdTrafo == "SIRGAS2000") {
2581    meanSta(1) = 3740860.0;
2582    meanSta(2) = -4964290.0;
2583    meanSta(3) = -1425420.0;
2584  }
2585  else if (_crdTrafo == "DREF91") {
2586    meanSta(1) = 3959579.0;
2587    meanSta(2) = 721719.0;
2588    meanSta(3) = 4931539.0;
2589  }
2590  else if (_crdTrafo == "Custom") {
2591    meanSta(1) = 0.0; // TODO
2592    meanSta(2) = 0.0; // TODO
2593    meanSta(3) = 0.0; // TODO
2594  }
2595
2596  // Clock correction proportional to topocentric distance to satellites
2597  // -------------------------------------------------------------------
2598  double rho = (xyz - meanSta).norm_Frobenius();
2599  dc = rho * (sc - 1.0) / sc / t_CST::c;
2600
2601  Matrix rMat(3, 3);
2602  rMat(1, 1) = 1.0;
2603  rMat(1, 2) = -oz;
2604  rMat(1, 3) = oy;
2605  rMat(2, 1) = oz;
2606  rMat(2, 2) = 1.0;
2607  rMat(2, 3) = -ox;
2608  rMat(3, 1) = -oy;
2609  rMat(3, 2) = ox;
2610  rMat(3, 3) = 1.0;
2611
2612  xyz = sc * rMat * xyz + dx;
2613}
2614
2615int bncRtnetUploadCaster::determineUpdateInd(double samplingRate) {
2616
2617  if (samplingRate == 10.0) {
2618    return 3;
2619  }
2620  else if (samplingRate == 15.0) {
2621    return 4;
2622  }
2623  else if (samplingRate == 30.0) {
2624    return 5;
2625  }
2626  else if (samplingRate == 60.0) {
2627    return 6;
2628  }
2629  else if (samplingRate == 120.0) {
2630    return 7;
2631  }
2632  else if (samplingRate == 240.0) {
2633    return 8;
2634  }
2635  else if (samplingRate == 300.0) {
2636    return 9;
2637  }
2638  else if (samplingRate == 600.0) {
2639    return 10;
2640  }
2641  else if (samplingRate == 900.0) {
2642    return 11;
2643  }
2644  else if (samplingRate == 1800.0) {
2645    return 12;
2646  }
2647  else if (samplingRate == 3600.0) {
2648    return 13;
2649  }
2650  else if (samplingRate == 7200.0) {
2651    return 14;
2652  }
2653  else if (samplingRate == 10800.0) {
2654    return 15;
2655  }
2656  return 2;  // default
2657}
Note: See TracBrowser for help on using the repository browser.