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

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

minor changes

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