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

Last change on this file since 8987 was 8987, checked in by stuerze, 2 months ago

initial import igs ssr encoding and decoding + debug output

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