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

Last change on this file since 8499 was 8499, checked in by stuerze, 11 months ago

minor changes

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