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

Last change on this file since 8720 was 8720, checked in by stuerze, 11 months ago

Update of the transformation parameters IRTF2014 => DREF91

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