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

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

minor changes in rtcm ssr to be compatible with future igs ssr

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