source: ntrip/trunk/BNC/src/upload/bncrtnetuploadcaster.cpp @ 8904

Last change on this file since 8904 was 8904, checked in by stuerze, 7 months ago

minor changes

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