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

Last change on this file since 8844 was 8844, checked in by stuerze, 12 months ago

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

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).norm_Frobenius();
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.