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

Last change on this file since 8943 was 8943, checked in by stuerze, 5 months ago

BDS and QZSS SSR signal and tracking mode is adapted with respect to RTCM SSR proposal version 08

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