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

Last change on this file since 8649 was 8649, checked in by stuerze, 5 months ago

minor changes

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