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

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

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

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