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

Last change on this file since 8679 was 8679, checked in by stuerze, 6 weeks ago

minor changes

File size: 105.6 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          emit(newMessage("                      RTNET format error: "
507                          +  lines[ii].toLatin1(), false));
508        }
509      }
510
511
512      struct ClockOrbit::SatData* sd = 0;
513      if (prn.system() == 'G') {
514        sd = co.Sat + co.NumberOfSat[CLOCKORBIT_SATGPS];
515        ++co.NumberOfSat[CLOCKORBIT_SATGPS];
516      }
517      else if (prn.system() == 'R') {
518        sd = co.Sat + CLOCKORBIT_NUMGPS + co.NumberOfSat[CLOCKORBIT_SATGLONASS];
519        ++co.NumberOfSat[CLOCKORBIT_SATGLONASS];
520      }
521      else if (prn.system() == 'E') {
522        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
523            + co.NumberOfSat[CLOCKORBIT_SATGALILEO];
524        ++co.NumberOfSat[CLOCKORBIT_SATGALILEO];
525      }
526      else if (prn.system() == 'J') {
527        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
528            + CLOCKORBIT_NUMGALILEO + co.NumberOfSat[CLOCKORBIT_SATQZSS];
529        ++co.NumberOfSat[CLOCKORBIT_SATQZSS];
530      }
531      else if (prn.system() == 'S') {
532        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
533            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
534            + co.NumberOfSat[CLOCKORBIT_SATSBAS];
535        ++co.NumberOfSat[CLOCKORBIT_SATSBAS];
536      }
537      else if (prn.system() == 'C') {
538        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
539            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
540            + co.NumberOfSat[CLOCKORBIT_SATBDS];
541        ++co.NumberOfSat[CLOCKORBIT_SATBDS];
542      }
543      if (sd) {
544        QString outLine;
545        t_irc irc = processSatellite(eph, epoTime.gpsw(), epoTime.gpssec(), prnStr, rtnAPC,
546                                     rtnUra, rtnClk, rtnVel, rtnCoM, rtnClkSig, sd, outLine);
547        if (irc != success) {
548          // very few cases: check states bad and unhealthy are excluded earlier
549          sd->ID = prnStr.mid(1).toInt(); // to prevent G00, R00 entries
550          sd->IOD = eph->IOD();
551        }
552      }
553
554      // Code Biases
555      // -----------
556      struct CodeBias::BiasSat* biasSat = 0;
557      if (!codeBiases.isEmpty()) {
558        if (prn.system() == 'G') {
559          biasSat = bias.Sat + bias.NumberOfSat[CLOCKORBIT_SATGPS];
560          ++bias.NumberOfSat[CLOCKORBIT_SATGPS];
561        }
562        else if (prn.system() == 'R') {
563          biasSat = bias.Sat + CLOCKORBIT_NUMGPS
564              + bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
565          ++bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
566        }
567        else if (prn.system() == 'E') {
568          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
569              + bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
570          ++bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
571        }
572        else if (prn.system() == 'J') {
573          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
574              + CLOCKORBIT_NUMGALILEO + bias.NumberOfSat[CLOCKORBIT_SATQZSS];
575          ++bias.NumberOfSat[CLOCKORBIT_SATQZSS];
576        }
577        else if (prn.system() == 'S') {
578          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
579              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
580              + bias.NumberOfSat[CLOCKORBIT_SATSBAS];
581          ++bias.NumberOfSat[CLOCKORBIT_SATSBAS];
582        }
583        else if (prn.system() == 'C') {
584          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
585              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
586              + bias.NumberOfSat[CLOCKORBIT_SATBDS];
587          ++bias.NumberOfSat[CLOCKORBIT_SATBDS];
588        }
589      }
590
591      if (biasSat) {
592        biasSat->ID = prn.number();
593        biasSat->NumberOfCodeBiases = 0;
594        if (prn.system() == 'G') {
595          QMapIterator<QString, double> it(codeBiases);
596          while (it.hasNext()) {
597            it.next();
598            if (it.key() == "1C") {
599              int ii = biasSat->NumberOfCodeBiases;
600              if (ii >= CLOCKORBIT_NUMBIAS)
601                break;
602              biasSat->NumberOfCodeBiases += 1;
603              biasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
604              biasSat->Biases[ii].Bias = it.value();
605            }
606            else if (it.key() == "1S") {
607              int ii = biasSat->NumberOfCodeBiases;
608              if (ii >= CLOCKORBIT_NUMBIAS)
609                break;
610              biasSat->NumberOfCodeBiases += 1;
611              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
612              biasSat->Biases[ii].Bias = it.value();
613            }
614            else if (it.key() == "1L") {
615              int ii = biasSat->NumberOfCodeBiases;
616              if (ii >= CLOCKORBIT_NUMBIAS)
617                break;
618              biasSat->NumberOfCodeBiases += 1;
619              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
620              biasSat->Biases[ii].Bias = it.value();
621            }
622            else if (it.key() == "1X") {
623              int ii = biasSat->NumberOfCodeBiases;
624              if (ii >= CLOCKORBIT_NUMBIAS)
625                break;
626              biasSat->NumberOfCodeBiases += 1;
627              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_DP;
628              biasSat->Biases[ii].Bias = it.value();
629            }
630            else if (it.key() == "1P") {
631              int ii = biasSat->NumberOfCodeBiases;
632              if (ii >= CLOCKORBIT_NUMBIAS)
633                break;
634              biasSat->NumberOfCodeBiases += 1;
635              biasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
636              biasSat->Biases[ii].Bias = it.value();
637            }
638            else if (it.key() == "1W") {
639              int ii = biasSat->NumberOfCodeBiases;
640              if (ii >= CLOCKORBIT_NUMBIAS)
641                break;
642              biasSat->NumberOfCodeBiases += 1;
643              biasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
644              biasSat->Biases[ii].Bias = it.value();
645            }
646            else if (it.key() == "2C") {
647              int ii = biasSat->NumberOfCodeBiases;
648              if (ii >= CLOCKORBIT_NUMBIAS)
649                break;
650              biasSat->NumberOfCodeBiases += 1;
651              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
652              biasSat->Biases[ii].Bias = it.value();
653            }
654            else if (it.key() == "2D") {
655              int ii = biasSat->NumberOfCodeBiases;
656              if (ii >= CLOCKORBIT_NUMBIAS)
657                break;
658              biasSat->NumberOfCodeBiases += 1;
659              biasSat->Biases[ii].Type = CODETYPEGPS_SEMI_CODELESS;
660              biasSat->Biases[ii].Bias = it.value();
661            }
662            else if (it.key() == "2S") {
663              int ii = biasSat->NumberOfCodeBiases;
664              if (ii >= CLOCKORBIT_NUMBIAS)
665                break;
666              biasSat->NumberOfCodeBiases += 1;
667              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_M;
668              biasSat->Biases[ii].Bias = it.value();
669            }
670            else if (it.key() == "2L") {
671              int ii = biasSat->NumberOfCodeBiases;
672              if (ii >= CLOCKORBIT_NUMBIAS)
673                break;
674              biasSat->NumberOfCodeBiases += 1;
675              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_L;
676              biasSat->Biases[ii].Bias = it.value();
677            }
678            else if (it.key() == "2X") {
679              int ii = biasSat->NumberOfCodeBiases;
680              if (ii >= CLOCKORBIT_NUMBIAS)
681                break;
682              biasSat->NumberOfCodeBiases += 1;
683              biasSat->Biases[ii].Type = CODETYPEGPS_L2C_ML;
684              biasSat->Biases[ii].Bias = it.value();
685            }
686            else if (it.key() == "2P") {
687              int ii = biasSat->NumberOfCodeBiases;
688              if (ii >= CLOCKORBIT_NUMBIAS)
689                break;
690              biasSat->NumberOfCodeBiases += 1;
691              biasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
692              biasSat->Biases[ii].Bias = it.value();
693            }
694            else if (it.key() == "2W") {
695              int ii = biasSat->NumberOfCodeBiases;
696              if (ii >= CLOCKORBIT_NUMBIAS)
697                break;
698              biasSat->NumberOfCodeBiases += 1;
699              biasSat->Biases[ii].Type = CODETYPEGPS_L2_Z;
700              biasSat->Biases[ii].Bias = it.value();
701            }
702            else if (it.key() == "5I") {
703              int ii = biasSat->NumberOfCodeBiases;
704              if (ii >= CLOCKORBIT_NUMBIAS)
705                break;
706              biasSat->NumberOfCodeBiases += 1;
707              biasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
708              biasSat->Biases[ii].Bias = it.value();
709            }
710            else if (it.key() == "5Q") {
711              int ii = biasSat->NumberOfCodeBiases;
712              if (ii >= CLOCKORBIT_NUMBIAS)
713                break;
714              biasSat->NumberOfCodeBiases += 1;
715              biasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
716              biasSat->Biases[ii].Bias = it.value();
717            }
718            else if (it.key() == "5X") {
719              int ii = biasSat->NumberOfCodeBiases;
720              if (ii >= CLOCKORBIT_NUMBIAS)
721                break;
722              biasSat->NumberOfCodeBiases += 1;
723              biasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
724              biasSat->Biases[ii].Bias = it.value();
725            }
726          }
727        }
728        else if (prn.system() == 'R') {
729          QMapIterator<QString, double> it(codeBiases);
730          while (it.hasNext()) {
731            it.next();
732            if (it.key() == "1C") {
733              int ii = biasSat->NumberOfCodeBiases;
734              if (ii >= CLOCKORBIT_NUMBIAS)
735                break;
736              biasSat->NumberOfCodeBiases += 1;
737              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
738              biasSat->Biases[ii].Bias = it.value();
739            }
740            else if (it.key() == "1P") {
741              int ii = biasSat->NumberOfCodeBiases;
742              if (ii >= CLOCKORBIT_NUMBIAS)
743                break;
744              biasSat->NumberOfCodeBiases += 1;
745              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
746              biasSat->Biases[ii].Bias = it.value();
747            }
748            else if (it.key() == "2C") {
749              int ii = biasSat->NumberOfCodeBiases;
750              if (ii >= CLOCKORBIT_NUMBIAS)
751                break;
752              biasSat->NumberOfCodeBiases += 1;
753              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
754              biasSat->Biases[ii].Bias = it.value();
755            }
756            else if (it.key() == "2P") {
757              int ii = biasSat->NumberOfCodeBiases;
758              if (ii >= CLOCKORBIT_NUMBIAS)
759                break;
760              biasSat->NumberOfCodeBiases += 1;
761              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
762              biasSat->Biases[ii].Bias = it.value();
763            }
764                        else if (it.key() == "4A") {
765              int ii = biasSat->NumberOfCodeBiases;
766              if (ii >= CLOCKORBIT_NUMBIAS)
767                break;
768              biasSat->NumberOfCodeBiases += 1;
769              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCd;
770              biasSat->Biases[ii].Bias = it.value();
771            }
772            else if (it.key() == "4B") {
773              int ii = biasSat->NumberOfCodeBiases;
774              if (ii >= CLOCKORBIT_NUMBIAS)
775                break;
776              biasSat->NumberOfCodeBiases += 1;
777              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCp;
778              biasSat->Biases[ii].Bias = it.value();
779            }
780            else if (it.key() == "4X") {
781              int ii = biasSat->NumberOfCodeBiases;
782              if (ii >= CLOCKORBIT_NUMBIAS)
783                break;
784              biasSat->NumberOfCodeBiases += 1;
785              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1a_OCdp;
786              biasSat->Biases[ii].Bias = it.value();
787            }
788            else if (it.key() == "6A") {
789              int ii = biasSat->NumberOfCodeBiases;
790              if (ii >= CLOCKORBIT_NUMBIAS)
791                break;
792              biasSat->NumberOfCodeBiases += 1;
793              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSI;
794              biasSat->Biases[ii].Bias = it.value();
795            }
796            else if (it.key() == "6B") {
797              int ii = biasSat->NumberOfCodeBiases;
798              if (ii >= CLOCKORBIT_NUMBIAS)
799                break;
800              biasSat->NumberOfCodeBiases += 1;
801              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_OCp;
802              biasSat->Biases[ii].Bias = it.value();
803            }
804            else if (it.key() == "6X") {
805              int ii = biasSat->NumberOfCodeBiases;
806              if (ii >= CLOCKORBIT_NUMBIAS)
807                break;
808              biasSat->NumberOfCodeBiases += 1;
809              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2a_CSIOCp;
810              biasSat->Biases[ii].Bias = it.value();
811            }
812            else if (it.key() == "3I") {
813              int ii = biasSat->NumberOfCodeBiases;
814              if (ii >= CLOCKORBIT_NUMBIAS)
815                break;
816              biasSat->NumberOfCodeBiases += 1;
817              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_I;
818              biasSat->Biases[ii].Bias = it.value();
819            }
820            else if (it.key() == "3Q") {
821              int ii = biasSat->NumberOfCodeBiases;
822              if (ii >= CLOCKORBIT_NUMBIAS)
823                break;
824              biasSat->NumberOfCodeBiases += 1;
825              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_Q;
826              biasSat->Biases[ii].Bias = it.value();
827            }
828            else if (it.key() == "3X") {
829              int ii = biasSat->NumberOfCodeBiases;
830              if (ii >= CLOCKORBIT_NUMBIAS)
831                break;
832              biasSat->NumberOfCodeBiases += 1;
833              biasSat->Biases[ii].Type = CODETYPEGLONASS_L3_IQ;
834              biasSat->Biases[ii].Bias = it.value();
835            }
836          }
837        }
838        else if (prn.system() == 'E') {
839          QMapIterator<QString, double> it(codeBiases);
840          while (it.hasNext()) {
841            it.next();
842            if (it.key() == "1A") {
843              int ii = biasSat->NumberOfCodeBiases;
844              if (ii >= CLOCKORBIT_NUMBIAS)
845                break;
846              biasSat->NumberOfCodeBiases += 1;
847              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
848              biasSat->Biases[ii].Bias = it.value();
849            }
850            else if (it.key() == "1B") {
851              int ii = biasSat->NumberOfCodeBiases;
852              if (ii >= CLOCKORBIT_NUMBIAS)
853                break;
854              biasSat->NumberOfCodeBiases += 1;
855              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
856              biasSat->Biases[ii].Bias = it.value();
857            }
858            else if (it.key() == "1C") {
859              int ii = biasSat->NumberOfCodeBiases;
860              if (ii >= CLOCKORBIT_NUMBIAS)
861                break;
862              biasSat->NumberOfCodeBiases += 1;
863              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
864              biasSat->Biases[ii].Bias = it.value();
865            }
866            else if (it.key() == "1X") {
867              int ii = biasSat->NumberOfCodeBiases;
868              if (ii >= CLOCKORBIT_NUMBIAS)
869                break;
870              biasSat->NumberOfCodeBiases += 1;
871              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
872              biasSat->Biases[ii].Bias = it.value();
873            }
874            else if (it.key() == "1Z") {
875              int ii = biasSat->NumberOfCodeBiases;
876              if (ii >= CLOCKORBIT_NUMBIAS)
877                break;
878              biasSat->NumberOfCodeBiases += 1;
879              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
880              biasSat->Biases[ii].Bias = it.value();
881            }
882            else if (it.key() == "5I") {
883              int ii = biasSat->NumberOfCodeBiases;
884              if (ii >= CLOCKORBIT_NUMBIAS)
885                break;
886              biasSat->NumberOfCodeBiases += 1;
887              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
888              biasSat->Biases[ii].Bias = it.value();
889            }
890            else if (it.key() == "5Q") {
891              int ii = biasSat->NumberOfCodeBiases;
892              if (ii >= CLOCKORBIT_NUMBIAS)
893                break;
894              biasSat->NumberOfCodeBiases += 1;
895              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
896              biasSat->Biases[ii].Bias = it.value();
897            }
898            else if (it.key() == "5X") {
899              int ii = biasSat->NumberOfCodeBiases;
900              if (ii >= CLOCKORBIT_NUMBIAS)
901                break;
902              biasSat->NumberOfCodeBiases += 1;
903              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
904              biasSat->Biases[ii].Bias = it.value();
905            }
906            else if (it.key() == "7I") {
907              int ii = biasSat->NumberOfCodeBiases;
908              if (ii >= CLOCKORBIT_NUMBIAS)
909                break;
910              biasSat->NumberOfCodeBiases += 1;
911              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
912              biasSat->Biases[ii].Bias = it.value();
913            }
914            else if (it.key() == "7Q") {
915              int ii = biasSat->NumberOfCodeBiases;
916              if (ii >= CLOCKORBIT_NUMBIAS)
917                break;
918              biasSat->NumberOfCodeBiases += 1;
919              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
920              biasSat->Biases[ii].Bias = it.value();
921            }
922            else if (it.key() == "7X") {
923              int ii = biasSat->NumberOfCodeBiases;
924              if (ii >= CLOCKORBIT_NUMBIAS)
925                break;
926              biasSat->NumberOfCodeBiases += 1;
927              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
928              biasSat->Biases[ii].Bias = it.value();
929            }
930            else if (it.key() == "8I") {
931              int ii = biasSat->NumberOfCodeBiases;
932              if (ii >= CLOCKORBIT_NUMBIAS)
933                break;
934              biasSat->NumberOfCodeBiases += 1;
935              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
936              biasSat->Biases[ii].Bias = it.value();
937            }
938            else if (it.key() == "8Q") {
939              int ii = biasSat->NumberOfCodeBiases;
940              if (ii >= CLOCKORBIT_NUMBIAS)
941                break;
942              biasSat->NumberOfCodeBiases += 1;
943              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
944              biasSat->Biases[ii].Bias = it.value();
945            }
946            else if (it.key() == "8X") {
947              int ii = biasSat->NumberOfCodeBiases;
948              if (ii >= CLOCKORBIT_NUMBIAS)
949                break;
950              biasSat->NumberOfCodeBiases += 1;
951              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
952              biasSat->Biases[ii].Bias = it.value();
953            }
954            else if (it.key() == "6A") {
955              int ii = biasSat->NumberOfCodeBiases;
956              if (ii >= CLOCKORBIT_NUMBIAS)
957                break;
958              biasSat->NumberOfCodeBiases += 1;
959              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
960              biasSat->Biases[ii].Bias = it.value();
961            }
962            else if (it.key() == "6B") {
963              int ii = biasSat->NumberOfCodeBiases;
964              if (ii >= CLOCKORBIT_NUMBIAS)
965                break;
966              biasSat->NumberOfCodeBiases += 1;
967              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
968              biasSat->Biases[ii].Bias = it.value();
969            }
970            else if (it.key() == "6C") {
971              int ii = biasSat->NumberOfCodeBiases;
972              if (ii >= CLOCKORBIT_NUMBIAS)
973                break;
974              biasSat->NumberOfCodeBiases += 1;
975              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
976              biasSat->Biases[ii].Bias = it.value();
977            }
978            else if (it.key() == "6X") {
979              int ii = biasSat->NumberOfCodeBiases;
980              if (ii >= CLOCKORBIT_NUMBIAS)
981                break;
982              biasSat->NumberOfCodeBiases += 1;
983              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
984              biasSat->Biases[ii].Bias = it.value();
985            }
986            else if (it.key() == "6Z") {
987              int ii = biasSat->NumberOfCodeBiases;
988              if (ii >= CLOCKORBIT_NUMBIAS)
989                break;
990              biasSat->NumberOfCodeBiases += 1;
991              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
992              biasSat->Biases[ii].Bias = it.value();
993            }
994          }
995        }
996        else if (prn.system() == 'J') {
997          QMapIterator<QString, double> it(codeBiases);
998          while (it.hasNext()) {
999            it.next();
1000            if (it.key() == "1C") {
1001              int ii = biasSat->NumberOfCodeBiases;
1002              if (ii >= CLOCKORBIT_NUMBIAS)
1003                break;
1004              biasSat->NumberOfCodeBiases += 1;
1005              biasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
1006              biasSat->Biases[ii].Bias = it.value();
1007            }
1008            else if (it.key() == "1S") {
1009              int ii = biasSat->NumberOfCodeBiases;
1010              if (ii >= CLOCKORBIT_NUMBIAS)
1011                break;
1012              biasSat->NumberOfCodeBiases += 1;
1013              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
1014              biasSat->Biases[ii].Bias = it.value();
1015            }
1016            else if (it.key() == "1L") {
1017              int ii = biasSat->NumberOfCodeBiases;
1018              if (ii >= CLOCKORBIT_NUMBIAS)
1019                break;
1020              biasSat->NumberOfCodeBiases += 1;
1021              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
1022              biasSat->Biases[ii].Bias = it.value();
1023            }
1024            else if (it.key() == "2S") {
1025              int ii = biasSat->NumberOfCodeBiases;
1026              if (ii >= CLOCKORBIT_NUMBIAS)
1027                break;
1028              biasSat->NumberOfCodeBiases += 1;
1029              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
1030              biasSat->Biases[ii].Bias = it.value();
1031            }
1032            else if (it.key() == "2L") {
1033              int ii = biasSat->NumberOfCodeBiases;
1034              if (ii >= CLOCKORBIT_NUMBIAS)
1035                break;
1036              biasSat->NumberOfCodeBiases += 1;
1037              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
1038              biasSat->Biases[ii].Bias = it.value();
1039            }
1040            else if (it.key() == "2X") {
1041              int ii = biasSat->NumberOfCodeBiases;
1042              if (ii >= CLOCKORBIT_NUMBIAS)
1043                break;
1044              biasSat->NumberOfCodeBiases += 1;
1045              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
1046              biasSat->Biases[ii].Bias = it.value();
1047            }
1048            else if (it.key() == "5I") {
1049              int ii = biasSat->NumberOfCodeBiases;
1050              if (ii >= CLOCKORBIT_NUMBIAS)
1051                break;
1052              biasSat->NumberOfCodeBiases += 1;
1053              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
1054              biasSat->Biases[ii].Bias = it.value();
1055            }
1056            else if (it.key() == "5Q") {
1057              int ii = biasSat->NumberOfCodeBiases;
1058              if (ii >= CLOCKORBIT_NUMBIAS)
1059                break;
1060              biasSat->NumberOfCodeBiases += 1;
1061              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
1062              biasSat->Biases[ii].Bias = it.value();
1063            }
1064            else if (it.key() == "5X") {
1065              int ii = biasSat->NumberOfCodeBiases;
1066              if (ii >= CLOCKORBIT_NUMBIAS)
1067                break;
1068              biasSat->NumberOfCodeBiases += 1;
1069              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1070              biasSat->Biases[ii].Bias = it.value();
1071            }
1072            else if (it.key() == "6S") {
1073              int ii = biasSat->NumberOfCodeBiases;
1074              if (ii >= CLOCKORBIT_NUMBIAS)
1075                break;
1076              biasSat->NumberOfCodeBiases += 1;
1077              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_D;
1078              biasSat->Biases[ii].Bias = it.value();
1079            }
1080            else if (it.key() == "6L") {
1081              int ii = biasSat->NumberOfCodeBiases;
1082              if (ii >= CLOCKORBIT_NUMBIAS)
1083                break;
1084              biasSat->NumberOfCodeBiases += 1;
1085              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_P;
1086              biasSat->Biases[ii].Bias = it.value();
1087            }
1088            else if (it.key() == "6X") {
1089              int ii = biasSat->NumberOfCodeBiases;
1090              if (ii >= CLOCKORBIT_NUMBIAS)
1091                break;
1092              biasSat->NumberOfCodeBiases += 1;
1093              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_DP;
1094              biasSat->Biases[ii].Bias = it.value();
1095            }
1096            else if (it.key() == "1X") {
1097              int ii = biasSat->NumberOfCodeBiases;
1098              if (ii >= CLOCKORBIT_NUMBIAS)
1099                break;
1100              biasSat->NumberOfCodeBiases += 1;
1101              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
1102              biasSat->Biases[ii].Bias = it.value();
1103            }
1104            else if (it.key() == "1Z") {
1105              int ii = biasSat->NumberOfCodeBiases;
1106              if (ii >= CLOCKORBIT_NUMBIAS)
1107                break;
1108              biasSat->NumberOfCodeBiases += 1;
1109              biasSat->Biases[ii].Type = CODETYPEQZSS_L1_S;
1110              biasSat->Biases[ii].Bias = it.value();
1111            }
1112            else if (it.key() == "5D") {
1113              int ii = biasSat->NumberOfCodeBiases;
1114              if (ii >= CLOCKORBIT_NUMBIAS)
1115                break;
1116              biasSat->NumberOfCodeBiases += 1;
1117              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_D;
1118              biasSat->Biases[ii].Bias = it.value();
1119            }
1120            else if (it.key() == "5P") {
1121              int ii = biasSat->NumberOfCodeBiases;
1122              if (ii >= CLOCKORBIT_NUMBIAS)
1123                break;
1124              biasSat->NumberOfCodeBiases += 1;
1125              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_P;
1126              biasSat->Biases[ii].Bias = it.value();
1127            }
1128            else if (it.key() == "5Z") {
1129              int ii = biasSat->NumberOfCodeBiases;
1130              if (ii >= CLOCKORBIT_NUMBIAS)
1131                break;
1132              biasSat->NumberOfCodeBiases += 1;
1133              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_DP;
1134              biasSat->Biases[ii].Bias = it.value();
1135            }
1136            else if (it.key() == "6E") {
1137              int ii = biasSat->NumberOfCodeBiases;
1138              if (ii >= CLOCKORBIT_NUMBIAS)
1139                break;
1140              biasSat->NumberOfCodeBiases += 1;
1141              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_E;
1142              biasSat->Biases[ii].Bias = it.value();
1143            }
1144            else if (it.key() == "6Z") {
1145              int ii = biasSat->NumberOfCodeBiases;
1146              if (ii >= CLOCKORBIT_NUMBIAS)
1147                break;
1148              biasSat->NumberOfCodeBiases += 1;
1149              biasSat->Biases[ii].Type = CODETYPEQZSS_L6_DE;
1150              biasSat->Biases[ii].Bias = it.value();
1151            }
1152           }
1153        }
1154        else if (prn.system() == 'S') {
1155          QMapIterator<QString, double> it(codeBiases);
1156          while (it.hasNext()) {
1157            it.next();
1158            if (it.key() == "1C") {
1159              int ii = biasSat->NumberOfCodeBiases;
1160              if (ii >= CLOCKORBIT_NUMBIAS)
1161                break;
1162              biasSat->NumberOfCodeBiases += 1;
1163              biasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
1164              biasSat->Biases[ii].Bias = it.value();
1165            }
1166            else if (it.key() == "5I") {
1167              int ii = biasSat->NumberOfCodeBiases;
1168              if (ii >= CLOCKORBIT_NUMBIAS)
1169                break;
1170              biasSat->NumberOfCodeBiases += 1;
1171              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
1172              biasSat->Biases[ii].Bias = it.value();
1173            }
1174            else if (it.key() == "5Q") {
1175              int ii = biasSat->NumberOfCodeBiases;
1176              if (ii >= CLOCKORBIT_NUMBIAS)
1177                break;
1178              biasSat->NumberOfCodeBiases += 1;
1179              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
1180              biasSat->Biases[ii].Bias = it.value();
1181            }
1182            else if (it.key() == "5X") {
1183              int ii = biasSat->NumberOfCodeBiases;
1184              if (ii >= CLOCKORBIT_NUMBIAS)
1185                break;
1186              biasSat->NumberOfCodeBiases += 1;
1187              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
1188              biasSat->Biases[ii].Bias = it.value();
1189            }
1190          }
1191        }
1192        else if (prn.system() == 'C') {
1193          QMapIterator<QString, double> it(codeBiases);
1194          while (it.hasNext()) {
1195            it.next();
1196            if (it.key() == "2I") {
1197              int ii = biasSat->NumberOfCodeBiases;
1198              if (ii >= CLOCKORBIT_NUMBIAS)
1199                break;
1200              biasSat->NumberOfCodeBiases += 1;
1201              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
1202              biasSat->Biases[ii].Bias = it.value();
1203            }
1204            else if (it.key() == "2Q") {
1205              int ii = biasSat->NumberOfCodeBiases;
1206              if (ii >= CLOCKORBIT_NUMBIAS)
1207                break;
1208              biasSat->NumberOfCodeBiases += 1;
1209              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
1210              biasSat->Biases[ii].Bias = it.value();
1211            }
1212            else if (it.key() == "2X") {
1213              int ii = biasSat->NumberOfCodeBiases;
1214              if (ii >= CLOCKORBIT_NUMBIAS)
1215                break;
1216              biasSat->NumberOfCodeBiases += 1;
1217              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
1218              biasSat->Biases[ii].Bias = it.value();
1219            }
1220            else if (it.key() == "6I") {
1221              int ii = biasSat->NumberOfCodeBiases;
1222              if (ii >= CLOCKORBIT_NUMBIAS)
1223                break;
1224              biasSat->NumberOfCodeBiases += 1;
1225              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
1226              biasSat->Biases[ii].Bias = it.value();
1227            }
1228            else if (it.key() == "6Q") {
1229              int ii = biasSat->NumberOfCodeBiases;
1230              if (ii >= CLOCKORBIT_NUMBIAS)
1231                break;
1232              biasSat->NumberOfCodeBiases += 1;
1233              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
1234              biasSat->Biases[ii].Bias = it.value();
1235            }
1236            else if (it.key() == "6X") {
1237              int ii = biasSat->NumberOfCodeBiases;
1238              if (ii >= CLOCKORBIT_NUMBIAS)
1239                break;
1240              biasSat->NumberOfCodeBiases += 1;
1241              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
1242              biasSat->Biases[ii].Bias = it.value();
1243            }
1244            else if (it.key() == "7I") {
1245              int ii = biasSat->NumberOfCodeBiases;
1246              if (ii >= CLOCKORBIT_NUMBIAS)
1247                break;
1248              biasSat->NumberOfCodeBiases += 1;
1249              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
1250              biasSat->Biases[ii].Bias = it.value();
1251            }
1252            else if (it.key() == "7Q") {
1253              int ii = biasSat->NumberOfCodeBiases;
1254              if (ii >= CLOCKORBIT_NUMBIAS)
1255                break;
1256              biasSat->NumberOfCodeBiases += 1;
1257              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
1258              biasSat->Biases[ii].Bias = it.value();
1259            }
1260            else if (it.key() == "7X") {
1261              int ii = biasSat->NumberOfCodeBiases;
1262              if (ii >= CLOCKORBIT_NUMBIAS)
1263                break;
1264              biasSat->NumberOfCodeBiases += 1;
1265              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
1266              biasSat->Biases[ii].Bias = it.value();
1267            }
1268          }
1269        }
1270      }
1271      // Phase Biases
1272      // ------------
1273      struct PhaseBias::PhaseBiasSat* phasebiasSat = 0;
1274      if (!phaseBiasList.isEmpty()) {
1275        if (prn.system() == 'G') {
1276          phasebiasSat = phasebias.Sat
1277              + phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1278          ++phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1279        }
1280        else if (prn.system() == 'R') {
1281          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1282              + phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1283          ++phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1284        }
1285        else if (prn.system() == 'E') {
1286          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1287              + CLOCKORBIT_NUMGLONASS
1288              + phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1289          ++phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1290        }
1291        else if (prn.system() == 'J') {
1292          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1293              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1294              + phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1295          ++phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1296        }
1297        else if (prn.system() == 'S') {
1298          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1299              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1300              + CLOCKORBIT_NUMQZSS + phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1301          ++phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1302        }
1303        else if (prn.system() == 'C') {
1304          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1305              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1306              + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
1307              + phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1308          ++phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1309        }
1310      }
1311
1312      if (phasebiasSat) {
1313        phasebias.DispersiveBiasConsistencyIndicator = dispersiveBiasConsistenyIndicator;
1314        phasebias.MWConsistencyIndicator = mwConsistencyIndicator;
1315        phasebiasSat->ID = prn.number();
1316        phasebiasSat->NumberOfPhaseBiases = 0;
1317        phasebiasSat->YawAngle = pbSat.yawAngle;
1318        phasebiasSat->YawRate = pbSat.yawRate;
1319        if (prn.system() == 'G') {
1320          QListIterator<phaseBiasSignal> it(phaseBiasList);
1321          while (it.hasNext()) {
1322            const phaseBiasSignal &pbSig = it.next();
1323            if (pbSig.type == "1C") {
1324              int ii = phasebiasSat->NumberOfPhaseBiases;
1325              if (ii >= CLOCKORBIT_NUMBIAS)
1326                break;
1327              phasebiasSat->NumberOfPhaseBiases += 1;
1328              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
1329              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1330              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1331              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1332              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1333            }
1334            else if (pbSig.type == "1P") {
1335              int ii = phasebiasSat->NumberOfPhaseBiases;
1336              if (ii >= CLOCKORBIT_NUMBIAS)
1337                break;
1338              phasebiasSat->NumberOfPhaseBiases += 1;
1339              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
1340              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1341              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1342              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1343              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1344            }
1345            else if (pbSig.type == "1W") {
1346              int ii = phasebiasSat->NumberOfPhaseBiases;
1347              if (ii >= CLOCKORBIT_NUMBIAS)
1348                break;
1349              phasebiasSat->NumberOfPhaseBiases += 1;
1350              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
1351              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1352              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1353              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1354              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1355            }
1356            else if (pbSig.type == "2C") {
1357              int ii = phasebiasSat->NumberOfPhaseBiases;
1358              if (ii >= CLOCKORBIT_NUMBIAS)
1359                break;
1360              phasebiasSat->NumberOfPhaseBiases += 1;
1361              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
1362              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1363              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1364              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1365              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1366            }
1367            else if (pbSig.type == "2D") {
1368              int ii = phasebiasSat->NumberOfPhaseBiases;
1369              if (ii >= CLOCKORBIT_NUMBIAS)
1370                break;
1371              phasebiasSat->NumberOfPhaseBiases += 1;
1372              phasebiasSat->Biases[ii].Type = CODETYPEGPS_SEMI_CODELESS;
1373              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1374              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1375              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1376              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1377            }
1378            else if (pbSig.type == "2S") {
1379              int ii = phasebiasSat->NumberOfPhaseBiases;
1380              if (ii >= CLOCKORBIT_NUMBIAS)
1381                break;
1382              phasebiasSat->NumberOfPhaseBiases += 1;
1383              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_M;
1384              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1385              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1386              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1387              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1388            }
1389            else if (pbSig.type == "2L") {
1390              int ii = phasebiasSat->NumberOfPhaseBiases;
1391              if (ii >= CLOCKORBIT_NUMBIAS)
1392                break;
1393              phasebiasSat->NumberOfPhaseBiases += 1;
1394              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_L;
1395              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1396              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1397              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1398              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1399            }
1400            else if (pbSig.type == "2X") {
1401              int ii = phasebiasSat->NumberOfPhaseBiases;
1402              if (ii >= CLOCKORBIT_NUMBIAS)
1403                break;
1404              phasebiasSat->NumberOfPhaseBiases += 1;
1405              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2C_ML;
1406              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1407              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1408              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1409              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1410            }
1411            else if (pbSig.type == "2P") {
1412              int ii = phasebiasSat->NumberOfPhaseBiases;
1413              if (ii >= CLOCKORBIT_NUMBIAS)
1414                break;
1415              phasebiasSat->NumberOfPhaseBiases += 1;
1416              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
1417              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1418              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1419              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1420              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1421            }
1422            else if (pbSig.type == "2W") {
1423              int ii = phasebiasSat->NumberOfPhaseBiases;
1424              if (ii >= CLOCKORBIT_NUMBIAS)
1425                break;
1426              phasebiasSat->NumberOfPhaseBiases += 1;
1427              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
1428              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1429              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1430              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1431              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1432            }
1433            else if (pbSig.type == "5I") {
1434              int ii = phasebiasSat->NumberOfPhaseBiases;
1435              if (ii >= CLOCKORBIT_NUMBIAS)
1436                break;
1437              phasebiasSat->NumberOfPhaseBiases += 1;
1438              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
1439              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1440              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1441              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1442              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1443            }
1444            else if (pbSig.type == "5Q") {
1445              int ii = phasebiasSat->NumberOfPhaseBiases;
1446              if (ii >= CLOCKORBIT_NUMBIAS)
1447                break;
1448              phasebiasSat->NumberOfPhaseBiases += 1;
1449              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
1450              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1451              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1452              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1453              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1454            }
1455            else if (pbSig.type == "5X") {
1456              int ii = phasebiasSat->NumberOfPhaseBiases;
1457              if (ii >= CLOCKORBIT_NUMBIAS)
1458                break;
1459              phasebiasSat->NumberOfPhaseBiases += 1;
1460              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
1461              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1462              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1463              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1464              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1465            }
1466            else if (pbSig.type == "1S") {
1467              int ii = phasebiasSat->NumberOfPhaseBiases;
1468              if (ii >= CLOCKORBIT_NUMBIAS)
1469                break;
1470              phasebiasSat->NumberOfPhaseBiases += 1;
1471              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
1472              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1473              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1474              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1475              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1476            }
1477            else if (pbSig.type == "1L") {
1478              int ii = phasebiasSat->NumberOfPhaseBiases;
1479              if (ii >= CLOCKORBIT_NUMBIAS)
1480                break;
1481              phasebiasSat->NumberOfPhaseBiases += 1;
1482              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
1483              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1484              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1485              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1486              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1487            }
1488            else if (pbSig.type == "1X") {
1489              int ii = phasebiasSat->NumberOfPhaseBiases;
1490              if (ii >= CLOCKORBIT_NUMBIAS)
1491                break;
1492              phasebiasSat->NumberOfPhaseBiases += 1;
1493              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_DP;
1494              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1495              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1496              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1497              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1498            }
1499          }
1500        }
1501        if (prn.system() == 'R') {
1502          QListIterator<phaseBiasSignal> it(phaseBiasList);
1503          while (it.hasNext()) {
1504            const phaseBiasSignal &pbSig = it.next();
1505            if (pbSig.type == "1C") {
1506              int ii = phasebiasSat->NumberOfPhaseBiases;
1507              if (ii >= CLOCKORBIT_NUMBIAS)
1508                break;
1509              phasebiasSat->NumberOfPhaseBiases += 1;
1510              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
1511              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1512              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1513              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1514              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1515            }
1516            else if (pbSig.type == "1P") {
1517              int ii = phasebiasSat->NumberOfPhaseBiases;
1518              if (ii >= CLOCKORBIT_NUMBIAS)
1519                break;
1520              phasebiasSat->NumberOfPhaseBiases += 1;
1521              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
1522              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1523              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1524              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1525              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1526            }
1527            else if (pbSig.type == "2C") {
1528              int ii = phasebiasSat->NumberOfPhaseBiases;
1529              if (ii >= CLOCKORBIT_NUMBIAS)
1530                break;
1531              phasebiasSat->NumberOfPhaseBiases += 1;
1532              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
1533              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1534              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1535              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1536              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1537            }
1538            else if (pbSig.type == "2P") {
1539              int ii = phasebiasSat->NumberOfPhaseBiases;
1540              if (ii >= CLOCKORBIT_NUMBIAS)
1541                break;
1542              phasebiasSat->NumberOfPhaseBiases += 1;
1543              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
1544              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1545              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1546              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1547              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1548            }
1549          }
1550        }
1551        if (prn.system() == 'E') {
1552          QListIterator<phaseBiasSignal> it(phaseBiasList);
1553          while (it.hasNext()) {
1554            const phaseBiasSignal &pbSig = it.next();
1555            if (pbSig.type == "1A") {
1556              int ii = phasebiasSat->NumberOfPhaseBiases;
1557              if (ii >= CLOCKORBIT_NUMBIAS)
1558                break;
1559              phasebiasSat->NumberOfPhaseBiases += 1;
1560              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
1561              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1562              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1563              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1564              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1565            }
1566            else if (pbSig.type == "1B") {
1567              int ii = phasebiasSat->NumberOfPhaseBiases;
1568              if (ii >= CLOCKORBIT_NUMBIAS)
1569                break;
1570              phasebiasSat->NumberOfPhaseBiases += 1;
1571              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
1572              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1573              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1574              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1575              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1576            }
1577            else if (pbSig.type == "1C") {
1578              int ii = phasebiasSat->NumberOfPhaseBiases;
1579              if (ii >= CLOCKORBIT_NUMBIAS)
1580                break;
1581              phasebiasSat->NumberOfPhaseBiases += 1;
1582              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
1583              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1584              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1585              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1586              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1587            }
1588            else if (pbSig.type == "1X") {
1589              int ii = phasebiasSat->NumberOfPhaseBiases;
1590              if (ii >= CLOCKORBIT_NUMBIAS)
1591                break;
1592              phasebiasSat->NumberOfPhaseBiases += 1;
1593              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
1594              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1595              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1596              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1597              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1598            }
1599            else if (pbSig.type == "1Z") {
1600              int ii = phasebiasSat->NumberOfPhaseBiases;
1601              if (ii >= CLOCKORBIT_NUMBIAS)
1602                break;
1603              phasebiasSat->NumberOfPhaseBiases += 1;
1604              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
1605              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1606              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1607              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1608              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1609            }
1610            else if (pbSig.type == "5I") {
1611              int ii = phasebiasSat->NumberOfPhaseBiases;
1612              if (ii >= CLOCKORBIT_NUMBIAS)
1613                break;
1614              phasebiasSat->NumberOfPhaseBiases += 1;
1615              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
1616              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1617              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1618              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1619              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1620            }
1621            else if (pbSig.type == "5Q") {
1622              int ii = phasebiasSat->NumberOfPhaseBiases;
1623              if (ii >= CLOCKORBIT_NUMBIAS)
1624                break;
1625              phasebiasSat->NumberOfPhaseBiases += 1;
1626              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
1627              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1628              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1629              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1630              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1631            }
1632            else if (pbSig.type == "5X") {
1633              int ii = phasebiasSat->NumberOfPhaseBiases;
1634              if (ii >= CLOCKORBIT_NUMBIAS)
1635                break;
1636              phasebiasSat->NumberOfPhaseBiases += 1;
1637              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
1638              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1639              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1640              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1641              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1642            }
1643            else if (pbSig.type == "7I") {
1644              int ii = phasebiasSat->NumberOfPhaseBiases;
1645              if (ii >= CLOCKORBIT_NUMBIAS)
1646                break;
1647              phasebiasSat->NumberOfPhaseBiases += 1;
1648              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
1649              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1650              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1651              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1652              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1653            }
1654            else if (pbSig.type == "7Q") {
1655              int ii = phasebiasSat->NumberOfPhaseBiases;
1656              if (ii >= CLOCKORBIT_NUMBIAS)
1657                break;
1658              phasebiasSat->NumberOfPhaseBiases += 1;
1659              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
1660              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1661              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1662              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1663              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1664            }
1665            else if (pbSig.type == "7X") {
1666              int ii = phasebiasSat->NumberOfPhaseBiases;
1667              if (ii >= CLOCKORBIT_NUMBIAS)
1668                break;
1669              phasebiasSat->NumberOfPhaseBiases += 1;
1670              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
1671              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1672              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1673              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1674              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1675            }
1676            else if (pbSig.type == "8I") {
1677              int ii = phasebiasSat->NumberOfPhaseBiases;
1678              if (ii >= CLOCKORBIT_NUMBIAS)
1679                break;
1680              phasebiasSat->NumberOfPhaseBiases += 1;
1681              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
1682              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1683              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1684              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1685              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1686            }
1687            else if (pbSig.type == "8Q") {
1688              int ii = phasebiasSat->NumberOfPhaseBiases;
1689              if (ii >= CLOCKORBIT_NUMBIAS)
1690                break;
1691              phasebiasSat->NumberOfPhaseBiases += 1;
1692              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
1693              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1694              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1695              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1696              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1697            }
1698            else if (pbSig.type == "8X") {
1699              int ii = phasebiasSat->NumberOfPhaseBiases;
1700              if (ii >= CLOCKORBIT_NUMBIAS)
1701                break;
1702              phasebiasSat->NumberOfPhaseBiases += 1;
1703              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
1704              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1705              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1706              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1707              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1708            }
1709            else if (pbSig.type == "6A") {
1710              int ii = phasebiasSat->NumberOfPhaseBiases;
1711              if (ii >= CLOCKORBIT_NUMBIAS)
1712                break;
1713              phasebiasSat->NumberOfPhaseBiases += 1;
1714              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
1715              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1716              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1717              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1718              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1719            }
1720            else if (pbSig.type == "6B") {
1721              int ii = phasebiasSat->NumberOfPhaseBiases;
1722              if (ii >= CLOCKORBIT_NUMBIAS)
1723                break;
1724              phasebiasSat->NumberOfPhaseBiases += 1;
1725              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
1726              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1727              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1728              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1729              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1730            }
1731            else if (pbSig.type == "6C") {
1732              int ii = phasebiasSat->NumberOfPhaseBiases;
1733              if (ii >= CLOCKORBIT_NUMBIAS)
1734                break;
1735              phasebiasSat->NumberOfPhaseBiases += 1;
1736              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
1737              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1738              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1739              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1740              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1741            }
1742            else if (pbSig.type == "6X") {
1743              int ii = phasebiasSat->NumberOfPhaseBiases;
1744              if (ii >= CLOCKORBIT_NUMBIAS)
1745                break;
1746              phasebiasSat->NumberOfPhaseBiases += 1;
1747              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
1748              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1749              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1750              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1751              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1752            }
1753            else if (pbSig.type == "6Z") {
1754              int ii = phasebiasSat->NumberOfPhaseBiases;
1755              if (ii >= CLOCKORBIT_NUMBIAS)
1756                break;
1757              phasebiasSat->NumberOfPhaseBiases += 1;
1758              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
1759              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1760              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1761              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1762              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1763            }
1764          }
1765        }
1766        if (prn.system() == 'J') {
1767          QListIterator<phaseBiasSignal> it(phaseBiasList);
1768          while (it.hasNext()) {
1769            const phaseBiasSignal &pbSig = it.next();
1770            if (pbSig.type == "1C") {
1771              int ii = phasebiasSat->NumberOfPhaseBiases;
1772              if (ii >= CLOCKORBIT_NUMBIAS)
1773                break;
1774              phasebiasSat->NumberOfPhaseBiases += 1;
1775              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
1776              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1777              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1778              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1779              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1780            }
1781            else if (pbSig.type == "1S") {
1782              int ii = phasebiasSat->NumberOfPhaseBiases;
1783              if (ii >= CLOCKORBIT_NUMBIAS)
1784                break;
1785              phasebiasSat->NumberOfPhaseBiases += 1;
1786              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
1787              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1788              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1789              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1790            }
1791            else if (pbSig.type == "1L") {
1792              int ii = phasebiasSat->NumberOfPhaseBiases;
1793              if (ii >= CLOCKORBIT_NUMBIAS)
1794                break;
1795              phasebiasSat->NumberOfPhaseBiases += 1;
1796              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
1797              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1798              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1799              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1800              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1801            }
1802            else if (pbSig.type == "2S") {
1803              int ii = phasebiasSat->NumberOfPhaseBiases;
1804              if (ii >= CLOCKORBIT_NUMBIAS)
1805                break;
1806              phasebiasSat->NumberOfPhaseBiases += 1;
1807              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
1808              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1809              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1810              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1811              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1812            }
1813            else if (pbSig.type == "2L") {
1814              int ii = phasebiasSat->NumberOfPhaseBiases;
1815              if (ii >= CLOCKORBIT_NUMBIAS)
1816                break;
1817              phasebiasSat->NumberOfPhaseBiases += 1;
1818              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
1819              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1820              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1821              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1822              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1823            }
1824            else if (pbSig.type == "2X") {
1825              int ii = phasebiasSat->NumberOfPhaseBiases;
1826              if (ii >= CLOCKORBIT_NUMBIAS)
1827                break;
1828              phasebiasSat->NumberOfPhaseBiases += 1;
1829              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
1830              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1831              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1832              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1833            }
1834            else if (pbSig.type == "5I") {
1835              int ii = phasebiasSat->NumberOfPhaseBiases;
1836              if (ii >= CLOCKORBIT_NUMBIAS)
1837                break;
1838              phasebiasSat->NumberOfPhaseBiases += 1;
1839              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
1840              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1841              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1842              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1843              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1844            }
1845            else if (pbSig.type == "5Q") {
1846              int ii = phasebiasSat->NumberOfPhaseBiases;
1847              if (ii >= CLOCKORBIT_NUMBIAS)
1848                break;
1849              phasebiasSat->NumberOfPhaseBiases += 1;
1850              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
1851              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1852              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1853              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1854              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1855            }
1856            else if (pbSig.type == "5X") {
1857              int ii = phasebiasSat->NumberOfPhaseBiases;
1858              if (ii >= CLOCKORBIT_NUMBIAS)
1859                break;
1860              phasebiasSat->NumberOfPhaseBiases += 1;
1861              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1862              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1863              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1864              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1865              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1866            }
1867            else if (pbSig.type == "6S") {
1868              int ii = phasebiasSat->NumberOfPhaseBiases;
1869              if (ii >= CLOCKORBIT_NUMBIAS)
1870                break;
1871              phasebiasSat->NumberOfPhaseBiases += 1;
1872              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_D;
1873              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1874              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1875              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1876              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1877            }
1878            else if (pbSig.type == "6L") {
1879              int ii = phasebiasSat->NumberOfPhaseBiases;
1880              if (ii >= CLOCKORBIT_NUMBIAS)
1881                break;
1882              phasebiasSat->NumberOfPhaseBiases += 1;
1883              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_P;
1884              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1885              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1886              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1887              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1888            }
1889            else if (pbSig.type == "6X") {
1890              int ii = phasebiasSat->NumberOfPhaseBiases;
1891              if (ii >= CLOCKORBIT_NUMBIAS)
1892                break;
1893              phasebiasSat->NumberOfPhaseBiases += 1;
1894              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_DP;
1895              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1896              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1897              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1898              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1899            }
1900            else if (pbSig.type == "1X") {
1901              int ii = phasebiasSat->NumberOfPhaseBiases;
1902              if (ii >= CLOCKORBIT_NUMBIAS)
1903                break;
1904              phasebiasSat->NumberOfPhaseBiases += 1;
1905              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
1906              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1907              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1908              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1909              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1910            }
1911            else if (pbSig.type == "1Z") {
1912              int ii = phasebiasSat->NumberOfPhaseBiases;
1913              if (ii >= CLOCKORBIT_NUMBIAS)
1914                break;
1915              phasebiasSat->NumberOfPhaseBiases += 1;
1916              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1_S;
1917              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1918              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1919              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1920              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1921            }
1922            else if (pbSig.type == "5D") {
1923              int ii = phasebiasSat->NumberOfPhaseBiases;
1924              if (ii >= CLOCKORBIT_NUMBIAS)
1925                break;
1926              phasebiasSat->NumberOfPhaseBiases += 1;
1927              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_D;
1928              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1929              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1930              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1931              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1932            }
1933            else if (pbSig.type == "5P") {
1934              int ii = phasebiasSat->NumberOfPhaseBiases;
1935              if (ii >= CLOCKORBIT_NUMBIAS)
1936                break;
1937              phasebiasSat->NumberOfPhaseBiases += 1;
1938              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_P;
1939              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1940              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1941              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1942              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1943            }
1944            else if (pbSig.type == "5D") {
1945              int ii = phasebiasSat->NumberOfPhaseBiases;
1946              if (ii >= CLOCKORBIT_NUMBIAS)
1947                break;
1948              phasebiasSat->NumberOfPhaseBiases += 1;
1949              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_DP;
1950              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1951              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1952              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1953              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1954            }
1955            else if (pbSig.type == "6E") {
1956              int ii = phasebiasSat->NumberOfPhaseBiases;
1957              if (ii >= CLOCKORBIT_NUMBIAS)
1958                break;
1959              phasebiasSat->NumberOfPhaseBiases += 1;
1960              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_E;
1961              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1962              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1963              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1964              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1965            }
1966            else if (pbSig.type == "6Z") {
1967              int ii = phasebiasSat->NumberOfPhaseBiases;
1968              if (ii >= CLOCKORBIT_NUMBIAS)
1969                break;
1970              phasebiasSat->NumberOfPhaseBiases += 1;
1971              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L6_DE;
1972              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1973              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1974              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1975              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1976            }
1977          }
1978        }
1979        if (prn.system() == 'S') {
1980          QListIterator<phaseBiasSignal> it(phaseBiasList);
1981          while (it.hasNext()) {
1982            const phaseBiasSignal &pbSig = it.next();
1983            if (pbSig.type == "1C") {
1984              int ii = phasebiasSat->NumberOfPhaseBiases;
1985              if (ii >= CLOCKORBIT_NUMBIAS)
1986                break;
1987              phasebiasSat->NumberOfPhaseBiases += 1;
1988              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
1989              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1990              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1991              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
1992              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
1993            }
1994            else if (pbSig.type == "5I") {
1995              int ii = phasebiasSat->NumberOfPhaseBiases;
1996              if (ii >= CLOCKORBIT_NUMBIAS)
1997                break;
1998              phasebiasSat->NumberOfPhaseBiases += 1;
1999              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
2000              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2001              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2002              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2003            }
2004            else if (pbSig.type == "5Q") {
2005              int ii = phasebiasSat->NumberOfPhaseBiases;
2006              if (ii >= CLOCKORBIT_NUMBIAS)
2007                break;
2008              phasebiasSat->NumberOfPhaseBiases += 1;
2009              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
2010              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2011              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2012              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2013              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2014            }
2015            else if (pbSig.type == "5X") {
2016              int ii = phasebiasSat->NumberOfPhaseBiases;
2017              if (ii >= CLOCKORBIT_NUMBIAS)
2018                break;
2019              phasebiasSat->NumberOfPhaseBiases += 1;
2020              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
2021              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2022              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2023              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2024              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2025            }
2026          }
2027        }
2028        if (prn.system() == 'C') {
2029          QListIterator<phaseBiasSignal> it(phaseBiasList);
2030          while (it.hasNext()) {
2031            const phaseBiasSignal &pbSig = it.next();
2032            if (pbSig.type == "2I") {
2033              int ii = phasebiasSat->NumberOfPhaseBiases;
2034              if (ii >= CLOCKORBIT_NUMBIAS)
2035                break;
2036              phasebiasSat->NumberOfPhaseBiases += 1;
2037              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
2038              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2039              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2040              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2041              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2042            }
2043            else if (pbSig.type == "2Q") {
2044              int ii = phasebiasSat->NumberOfPhaseBiases;
2045              if (ii >= CLOCKORBIT_NUMBIAS)
2046                break;
2047              phasebiasSat->NumberOfPhaseBiases += 1;
2048              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
2049              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2050              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2051              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2052              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2053            }
2054            else if (pbSig.type == "2X") {
2055              int ii = phasebiasSat->NumberOfPhaseBiases;
2056              if (ii >= CLOCKORBIT_NUMBIAS)
2057                break;
2058              phasebiasSat->NumberOfPhaseBiases += 1;
2059              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
2060              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2061              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2062              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2063              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2064            }
2065            else if (pbSig.type == "6I") {
2066              int ii = phasebiasSat->NumberOfPhaseBiases;
2067              if (ii >= CLOCKORBIT_NUMBIAS)
2068                break;
2069              phasebiasSat->NumberOfPhaseBiases += 1;
2070              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
2071              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2072              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2073              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2074              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2075            }
2076            else if (pbSig.type == "6Q") {
2077              int ii = phasebiasSat->NumberOfPhaseBiases;
2078              if (ii >= CLOCKORBIT_NUMBIAS)
2079                break;
2080              phasebiasSat->NumberOfPhaseBiases += 1;
2081              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
2082              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2083              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2084              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2085              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2086            }
2087            else if (pbSig.type == "6X") {
2088              int ii = phasebiasSat->NumberOfPhaseBiases;
2089              if (ii >= CLOCKORBIT_NUMBIAS)
2090                break;
2091              phasebiasSat->NumberOfPhaseBiases += 1;
2092              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
2093              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2094              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2095              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2096              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2097            }
2098            else if (pbSig.type == "7I") {
2099              int ii = phasebiasSat->NumberOfPhaseBiases;
2100              if (ii >= CLOCKORBIT_NUMBIAS)
2101                break;
2102              phasebiasSat->NumberOfPhaseBiases += 1;
2103              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
2104              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2105              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2106              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2107              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2108            }
2109            else if (pbSig.type == "7Q") {
2110              int ii = phasebiasSat->NumberOfPhaseBiases;
2111              if (ii >= CLOCKORBIT_NUMBIAS)
2112                break;
2113              phasebiasSat->NumberOfPhaseBiases += 1;
2114              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
2115              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2116              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2117              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2118              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2119            }
2120            else if (pbSig.type == "7X") {
2121              int ii = phasebiasSat->NumberOfPhaseBiases;
2122              if (ii >= CLOCKORBIT_NUMBIAS)
2123                break;
2124              phasebiasSat->NumberOfPhaseBiases += 1;
2125              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
2126              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2127              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator = pbSig.wlIndicator;
2128              phasebiasSat->Biases[ii].SignalDiscontinuityCounter = pbSig.discontinuityCounter;
2129            }
2130          }
2131        }
2132      }
2133    }
2134  }
2135
2136
2137  QByteArray hlpBufferCo;
2138
2139  // Orbit and Clock Corrections together
2140  // ------------------------------------
2141  if (_samplRtcmEphCorr == 0.0) {
2142    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2143        || co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2144        || co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2145        || co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2146        || co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2147        || co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2148      char obuffer[CLOCKORBIT_BUFFERSIZE];
2149      int len = MakeClockOrbit(&co, COTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2150      if (len > 0) {
2151        hlpBufferCo = QByteArray(obuffer, len);
2152      }
2153    }
2154  }
2155
2156  // Orbit and Clock Corrections separately
2157  // --------------------------------------
2158  else {
2159    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0) {
2160      char obuffer[CLOCKORBIT_BUFFERSIZE];
2161      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2162        co.UpdateInterval = ephUpdInd;
2163        int len1 = MakeClockOrbit(&co, COTYPE_GPSORBIT, 1, obuffer,
2164            sizeof(obuffer));
2165        co.UpdateInterval = clkUpdInd;
2166        if (len1 > 0) {
2167          hlpBufferCo += QByteArray(obuffer, len1);
2168        }
2169      }
2170      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) ? 1 : 0;
2171      int len2 = MakeClockOrbit(&co, COTYPE_GPSCLOCK, mmsg, obuffer,
2172          sizeof(obuffer));
2173      if (len2 > 0) {
2174        hlpBufferCo += QByteArray(obuffer, len2);
2175      }
2176    }
2177    if (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) {
2178      char obuffer[CLOCKORBIT_BUFFERSIZE];
2179      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2180        co.UpdateInterval = ephUpdInd;
2181        int len1 = MakeClockOrbit(&co, COTYPE_GLONASSORBIT, 1, obuffer,
2182            sizeof(obuffer));
2183        co.UpdateInterval = clkUpdInd;
2184        if (len1 > 0) {
2185          hlpBufferCo += QByteArray(obuffer, len1);
2186        }
2187      }
2188      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) ? 1 : 0;
2189      int len2 = MakeClockOrbit(&co, COTYPE_GLONASSCLOCK, mmsg, obuffer,
2190          sizeof(obuffer));
2191      if (len2 > 0) {
2192        hlpBufferCo += QByteArray(obuffer, len2);
2193      }
2194    }
2195    if (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) {
2196      char obuffer[CLOCKORBIT_BUFFERSIZE];
2197      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2198        co.UpdateInterval = ephUpdInd;
2199        int len1 = MakeClockOrbit(&co, COTYPE_GALILEOORBIT, 1, obuffer,
2200            sizeof(obuffer));
2201        co.UpdateInterval = clkUpdInd;
2202        if (len1 > 0) {
2203          hlpBufferCo += QByteArray(obuffer, len1);
2204        }
2205      }
2206      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) ? 1 : 0;
2207      int len2 = MakeClockOrbit(&co, COTYPE_GALILEOCLOCK, mmsg, obuffer,
2208          sizeof(obuffer));
2209      if (len2 > 0) {
2210        hlpBufferCo += QByteArray(obuffer, len2);
2211      }
2212    }
2213    if (co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) {
2214      char obuffer[CLOCKORBIT_BUFFERSIZE];
2215      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2216        co.UpdateInterval = ephUpdInd;
2217        int len1 = MakeClockOrbit(&co, COTYPE_QZSSORBIT, 1, obuffer,
2218            sizeof(obuffer));
2219        co.UpdateInterval = clkUpdInd;
2220        if (len1 > 0) {
2221          hlpBufferCo += QByteArray(obuffer, len1);
2222        }
2223      }
2224      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) ? 1 : 0;
2225      int len2 = MakeClockOrbit(&co, COTYPE_QZSSCLOCK, mmsg, obuffer,
2226          sizeof(obuffer));
2227      if (len2 > 0) {
2228        hlpBufferCo += QByteArray(obuffer, len2);
2229      }
2230    }
2231    if (co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) {
2232      char obuffer[CLOCKORBIT_BUFFERSIZE];
2233      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2234        co.UpdateInterval = ephUpdInd;
2235        int len1 = MakeClockOrbit(&co, COTYPE_SBASORBIT, 1, obuffer,
2236            sizeof(obuffer));
2237        co.UpdateInterval = clkUpdInd;
2238        if (len1 > 0) {
2239          hlpBufferCo += QByteArray(obuffer, len1);
2240        }
2241      }
2242      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) ? 1 : 0;
2243      int len2 = MakeClockOrbit(&co, COTYPE_SBASCLOCK, mmsg, obuffer,
2244          sizeof(obuffer));
2245      if (len2 > 0) {
2246        hlpBufferCo += QByteArray(obuffer, len2);
2247      }
2248    }
2249    if (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2250      char obuffer[CLOCKORBIT_BUFFERSIZE];
2251      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2252        co.UpdateInterval = ephUpdInd;
2253        int len1 = MakeClockOrbit(&co, COTYPE_BDSORBIT, 1, obuffer,
2254            sizeof(obuffer));
2255        co.UpdateInterval = clkUpdInd;
2256        if (len1 > 0) {
2257          hlpBufferCo += QByteArray(obuffer, len1);
2258        }
2259      }
2260      int len2 = MakeClockOrbit(&co, COTYPE_BDSCLOCK, 0, obuffer,
2261          sizeof(obuffer));
2262      if (len2 > 0) {
2263        hlpBufferCo += QByteArray(obuffer, len2);
2264      }
2265    }
2266  }
2267
2268  // Code Biases
2269  // -----------
2270  QByteArray hlpBufferBias;
2271  if (bias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2272      || bias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2273      || bias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2274      || bias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2275      || bias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2276      || bias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2277    char obuffer[CLOCKORBIT_BUFFERSIZE];
2278    int len = MakeCodeBias(&bias, BTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2279    if (len > 0) {
2280      hlpBufferBias = QByteArray(obuffer, len);
2281    }
2282  }
2283
2284  // Phase Biases
2285  // ------------
2286  QByteArray hlpBufferPhaseBias;
2287  if (phasebias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2288      || phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2289      || phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2290      || phasebias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2291      || phasebias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2292      || phasebias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2293    char obuffer[CLOCKORBIT_BUFFERSIZE];
2294    int len = MakePhaseBias(&phasebias, PBTYPE_AUTO, 0, obuffer,
2295        sizeof(obuffer));
2296    if (len > 0) {
2297      hlpBufferPhaseBias = QByteArray(obuffer, len);
2298    }
2299  }
2300
2301  // VTEC
2302  // ----
2303  QByteArray hlpBufferVtec;
2304  if (vtec.NumLayers > 0) {
2305    char obuffer[CLOCKORBIT_BUFFERSIZE];
2306    int len = MakeVTEC(&vtec, 0, obuffer, sizeof(obuffer));
2307    if (len > 0) {
2308      hlpBufferVtec = QByteArray(obuffer, len);
2309    }
2310  }
2311
2312  _outBuffer += hlpBufferCo + hlpBufferBias + hlpBufferPhaseBias
2313      + hlpBufferVtec;
2314}
2315
2316//
2317////////////////////////////////////////////////////////////////////////////
2318t_irc bncRtnetUploadCaster::processSatellite(const t_eph* eph, int GPSweek,
2319    double GPSweeks, const QString& prn, const ColumnVector& rtnAPC,
2320    double rtnUra, const ColumnVector& rtnClk, const ColumnVector& rtnVel,
2321    const ColumnVector& rtnCoM, const ColumnVector& rtnClkSig,
2322    struct ClockOrbit::SatData* sd, QString& outLine) {
2323
2324  // Broadcast Position and Velocity
2325  // -------------------------------
2326  ColumnVector xB(6);
2327  ColumnVector vB(3);
2328  t_irc irc = eph->getCrd(bncTime(GPSweek, GPSweeks), xB, vB, false);
2329
2330  if (irc != success) {
2331    return irc;
2332  }
2333
2334  // Precise Position
2335  // ----------------
2336  ColumnVector xP = _CoM ? rtnCoM : rtnAPC;
2337
2338  if (xP.size() == 0) {
2339    return failure;
2340  }
2341
2342  double dc = 0.0;
2343  if (_crdTrafo != "IGS14") {
2344    crdTrafo(GPSweek, xP, dc);
2345  }
2346
2347  // Difference in xyz
2348  // -----------------
2349  ColumnVector dx = xB.Rows(1, 3) - xP;
2350  ColumnVector dv = vB - rtnVel;
2351
2352  // Difference in RSW
2353  // -----------------
2354  ColumnVector rsw(3);
2355  XYZ_to_RSW(xB.Rows(1, 3), vB, dx, rsw);
2356
2357  ColumnVector dotRsw(3);
2358  XYZ_to_RSW(xB.Rows(1, 3), vB, dv, dotRsw);
2359
2360  // Clock Correction
2361  // ----------------
2362  double dClkA0 = rtnClk(1) - (xB(4) - dc) * t_CST::c;
2363  double dClkA1 = 0.0;
2364  if (rtnClk(2)) {
2365    dClkA1 = rtnClk(2) - xB(5) * t_CST::c;
2366  }
2367  double dClkA2 = 0.0;
2368  if (rtnClk(3)) {
2369    dClkA2 = rtnClk(3) - xB(6) * t_CST::c;
2370  }
2371
2372  if (sd) {
2373    sd->ID = prn.mid(1).toInt();
2374    sd->IOD = eph->IOD();
2375    sd->Clock.DeltaA0 = dClkA0;
2376    sd->Clock.DeltaA1 = dClkA1;
2377    sd->Clock.DeltaA2 = dClkA2;
2378    sd->UserRangeAccuracy = rtnUra;
2379    sd->Orbit.DeltaRadial     = rsw(1);
2380    sd->Orbit.DeltaAlongTrack = rsw(2);
2381    sd->Orbit.DeltaCrossTrack = rsw(3);
2382    sd->Orbit.DotDeltaRadial     = dotRsw(1);
2383    sd->Orbit.DotDeltaAlongTrack = dotRsw(2);
2384    sd->Orbit.DotDeltaCrossTrack = dotRsw(3);
2385  }
2386
2387  outLine.sprintf("%d %.1f %s  %u  %10.3f %8.3f %8.3f  %8.3f %8.3f %8.3f\n", GPSweek,
2388      GPSweeks, eph->prn().toString().c_str(), eph->IOD(), dClkA0, dClkA1, dClkA2,
2389      rsw(1), rsw(2), rsw(3));
2390
2391  // RTNET full clock for RINEX and SP3 file
2392  // ---------------------------------------
2393  double relativity = -2.0 * DotProduct(xP, rtnVel) / t_CST::c;
2394  double clkRnx     = (rtnClk[0] - relativity) / t_CST::c;  // [s]
2395  double clkRnxRate = rtnClk[1] / t_CST::c;                 // [s/s = -]
2396  double clkRnxAcc  = rtnClk[2] / t_CST::c;                 // [s/s² ) -/s]
2397
2398  if (_rnx) {
2399    double clkRnxSig, clkRnxRateSig, clkRnxAccSig;
2400    int s = rtnClkSig.size();
2401    switch (s) {
2402      case 1:
2403        clkRnxSig     = rtnClkSig[0] / t_CST::c;    // [s]
2404        clkRnxRateSig = 0.0;                        // [s/s = -]
2405        clkRnxAccSig  = 0.0;                        // [s/s² ) -/s]
2406        break;
2407      case 2:
2408        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2409        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2410        clkRnxAccSig  = 0.0;                         // [s/s² ) -/s]
2411        break;
2412      case 3:
2413        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2414        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2415        clkRnxAccSig  = rtnClkSig[2] / t_CST::c;     // [s/s² ) -/s]
2416        break;
2417    }
2418    _rnx->write(GPSweek, GPSweeks, prn, clkRnx, clkRnxRate, clkRnxAcc,
2419                clkRnxSig, clkRnxRateSig, clkRnxAccSig);
2420  }
2421  if (_sp3) {
2422    _sp3->write(GPSweek, GPSweeks, prn, rtnCoM, clkRnx, rtnVel, clkRnxRate);
2423  }
2424  return success;
2425}
2426
2427// Transform Coordinates
2428////////////////////////////////////////////////////////////////////////////
2429void bncRtnetUploadCaster::crdTrafo(int GPSWeek, ColumnVector& xyz,
2430    double& dc) {
2431
2432  // Current epoch minus 2000.0 in years
2433  // ------------------------------------
2434  double dt = (GPSWeek - (1042.0 + 6.0 / 7.0)) / 365.2422 * 7.0 + 2000.0 - _t0;
2435
2436  ColumnVector dx(3);
2437
2438  dx(1) = _dx + dt * _dxr;
2439  dx(2) = _dy + dt * _dyr;
2440  dx(3) = _dz + dt * _dzr;
2441
2442  static const double arcSec = 180.0 * 3600.0 / M_PI;
2443
2444  double ox = (_ox + dt * _oxr) / arcSec;
2445  double oy = (_oy + dt * _oyr) / arcSec;
2446  double oz = (_oz + dt * _ozr) / arcSec;
2447
2448  double sc = 1.0 + _sc * 1e-9 + dt * _scr * 1e-9;
2449
2450  // Specify approximate center of area
2451  // ----------------------------------
2452  ColumnVector meanSta(3);
2453
2454  if (_crdTrafo == "ETRF2000") {
2455    meanSta(1) = 3661090.0;
2456    meanSta(2) = 845230.0;
2457    meanSta(3) = 5136850.0;
2458  }
2459  else if (_crdTrafo == "GDA2020") {
2460    meanSta(1) = -4052050.0;
2461    meanSta(2) = 4212840.0;
2462    meanSta(3) = -2545110.0;
2463  }
2464  else if (_crdTrafo == "SIRGAS2000") {
2465    meanSta(1) = 3740860.0;
2466    meanSta(2) = -4964290.0;
2467    meanSta(3) = -1425420.0;
2468  }
2469  else if (_crdTrafo == "DREF91") {
2470    meanSta(1) = 3959579.0;
2471    meanSta(2) = 721719.0;
2472    meanSta(3) = 4931539.0;
2473  }
2474  else if (_crdTrafo == "Custom") {
2475    meanSta(1) = 0.0; // TODO
2476    meanSta(2) = 0.0; // TODO
2477    meanSta(3) = 0.0; // TODO
2478  }
2479
2480  // Clock correction proportional to topocentric distance to satellites
2481  // -------------------------------------------------------------------
2482  double rho = (xyz - meanSta).norm_Frobenius();
2483  dc = rho * (sc - 1.0) / sc / t_CST::c;
2484
2485  Matrix rMat(3, 3);
2486  rMat(1, 1) = 1.0;
2487  rMat(1, 2) = -oz;
2488  rMat(1, 3) = oy;
2489  rMat(2, 1) = oz;
2490  rMat(2, 2) = 1.0;
2491  rMat(2, 3) = -ox;
2492  rMat(3, 1) = -oy;
2493  rMat(3, 2) = ox;
2494  rMat(3, 3) = 1.0;
2495
2496  xyz = sc * rMat * xyz + dx;
2497}
2498
2499int bncRtnetUploadCaster::determineUpdateInd(double samplingRate) {
2500
2501  if (samplingRate == 10.0) {
2502    return 3;
2503  }
2504  else if (samplingRate == 15.0) {
2505    return 4;
2506  }
2507  else if (samplingRate == 30.0) {
2508    return 5;
2509  }
2510  else if (samplingRate == 60.0) {
2511    return 6;
2512  }
2513  else if (samplingRate == 120.0) {
2514    return 7;
2515  }
2516  else if (samplingRate == 240.0) {
2517    return 8;
2518  }
2519  else if (samplingRate == 300.0) {
2520    return 9;
2521  }
2522  else if (samplingRate == 600.0) {
2523    return 10;
2524  }
2525  else if (samplingRate == 900.0) {
2526    return 11;
2527  }
2528  else if (samplingRate == 1800.0) {
2529    return 12;
2530  }
2531  else if (samplingRate == 3600.0) {
2532    return 13;
2533  }
2534  else if (samplingRate == 7200.0) {
2535    return 14;
2536  }
2537  else if (samplingRate == 10800.0) {
2538    return 15;
2539  }
2540  return 2;  // default
2541}
Note: See TracBrowser for help on using the repository browser.