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

Last change on this file since 8969 was 8969, checked in by stuerze, 3 months ago

some preparation to support 2 different ssr formats in future

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