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

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

SSR parameter clock rate, clock drift and URA are added within RTNET format

File size: 98.2 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(5) - dc) * t_CST::c;
2302  double dClkA1 = rtnClk(2) - xB(6) * t_CST::c;
2303  double dClkA2 = rtnClk(3) - xB(7) * t_CST::c;
2304
2305  if (sd) {
2306    sd->ID = prn.mid(1).toInt();
2307    sd->IOD = eph->IOD();
2308    sd->Clock.DeltaA0 = dClkA0;
2309    sd->Clock.DeltaA1 = dClkA1;
2310    sd->Clock.DeltaA2 = dClkA2;
2311    sd->UserRangeAccuracy = rtnUra;
2312    sd->Orbit.DeltaRadial     = rsw(1);
2313    sd->Orbit.DeltaAlongTrack = rsw(2);
2314    sd->Orbit.DeltaCrossTrack = rsw(3);
2315    sd->Orbit.DotDeltaRadial     = dotRsw(1);
2316    sd->Orbit.DotDeltaAlongTrack = dotRsw(2);
2317    sd->Orbit.DotDeltaCrossTrack = dotRsw(3);
2318  }
2319
2320  outLine.sprintf("%d %.1f %s  %u  %10.3f %8.3f %8.3f  %8.3f %8.3f %8.3f\n", GPSweek,
2321      GPSweeks, eph->prn().toString().c_str(), eph->IOD(), dClkA0, dClkA1, dClkA2,
2322      rsw(1), rsw(2), rsw(3));
2323
2324  double relativity = -2.0 * DotProduct(xP, rtnVel) / t_CST::c;
2325  double clkRnx     = (rtnClk[0] - relativity) / t_CST::c;  // in seconds
2326  double clkRnxRate = rtnClk[1] / t_CST::c;                 // [s/s = -]
2327  double clkRnxAcc  = rtnClk[2] / t_CST::c;                 // [s/s² ) -/s]
2328
2329  if (_rnx) {
2330    double clkRnxSig     = rtnClkSig[0] / t_CST::c;           // in seconds
2331    double clkRnxRateSig = rtnClkSig[1] / t_CST::c;           // [s/s = -]
2332    double clkRnxAccSig  = rtnClkSig[2] / t_CST::c;           // [s/s² ) -/s]
2333    _rnx->write(GPSweek, GPSweeks, prn, clkRnx, clkRnxRate, clkRnxAcc,
2334                clkRnxSig, clkRnxRateSig, clkRnxAccSig);
2335  }
2336  if (_sp3) {
2337    _sp3->write(GPSweek, GPSweeks, prn, rtnCoM, clkRnx, rtnVel, clkRnxRate);
2338  }
2339}
2340
2341// Transform Coordinates
2342////////////////////////////////////////////////////////////////////////////
2343void bncRtnetUploadCaster::crdTrafo(int GPSWeek, ColumnVector& xyz,
2344    double& dc) {
2345
2346  // Current epoch minus 2000.0 in years
2347  // ------------------------------------
2348  double dt = (GPSWeek - (1042.0 + 6.0 / 7.0)) / 365.2422 * 7.0 + 2000.0 - _t0;
2349
2350  ColumnVector dx(3);
2351
2352  dx(1) = _dx + dt * _dxr;
2353  dx(2) = _dy + dt * _dyr;
2354  dx(3) = _dz + dt * _dzr;
2355
2356  static const double arcSec = 180.0 * 3600.0 / M_PI;
2357
2358  double ox = (_ox + dt * _oxr) / arcSec;
2359  double oy = (_oy + dt * _oyr) / arcSec;
2360  double oz = (_oz + dt * _ozr) / arcSec;
2361
2362  double sc = 1.0 + _sc * 1e-9 + dt * _scr * 1e-9;
2363
2364  // Specify approximate center of area
2365  // ----------------------------------
2366  ColumnVector meanSta(3);
2367
2368  if (_crdTrafo == "ETRF2000") {
2369    meanSta(1) = 3661090.0;
2370    meanSta(2) = 845230.0;
2371    meanSta(3) = 5136850.0;
2372  }
2373  else if (_crdTrafo == "GDA2020") {
2374    meanSta(1) = -4052050.0;
2375    meanSta(2) = 4212840.0;
2376    meanSta(3) = -2545110.0;
2377  }
2378  else if (_crdTrafo == "SIRGAS2000") {
2379    meanSta(1) = 3740860.0;
2380    meanSta(2) = -4964290.0;
2381    meanSta(3) = -1425420.0;
2382  }
2383  else if (_crdTrafo == "DREF91") {
2384    meanSta(1) = 3959579.0;
2385    meanSta(2) = 721719.0;
2386    meanSta(3) = 4931539.0;
2387  }
2388  else if (_crdTrafo == "Custom") {
2389    meanSta(1) = 0.0; // TODO
2390    meanSta(2) = 0.0; // TODO
2391    meanSta(3) = 0.0; // TODO
2392  }
2393
2394  // Clock correction proportional to topocentric distance to satellites
2395  // -------------------------------------------------------------------
2396  double rho = (xyz - meanSta).norm_Frobenius();
2397  dc = rho * (sc - 1.0) / sc / t_CST::c;
2398
2399  Matrix rMat(3, 3);
2400  rMat(1, 1) = 1.0;
2401  rMat(1, 2) = -oz;
2402  rMat(1, 3) = oy;
2403  rMat(2, 1) = oz;
2404  rMat(2, 2) = 1.0;
2405  rMat(2, 3) = -ox;
2406  rMat(3, 1) = -oy;
2407  rMat(3, 2) = ox;
2408  rMat(3, 3) = 1.0;
2409
2410  xyz = sc * rMat * xyz + dx;
2411}
2412
2413int bncRtnetUploadCaster::determineUpdateInd(double samplingRate) {
2414
2415  if (samplingRate == 10.0) {
2416    return 3;
2417  }
2418  else if (samplingRate == 15.0) {
2419    return 4;
2420  }
2421  else if (samplingRate == 30.0) {
2422    return 5;
2423  }
2424  else if (samplingRate == 60.0) {
2425    return 6;
2426  }
2427  else if (samplingRate == 120.0) {
2428    return 7;
2429  }
2430  else if (samplingRate == 240.0) {
2431    return 8;
2432  }
2433  else if (samplingRate == 300.0) {
2434    return 9;
2435  }
2436  else if (samplingRate == 600.0) {
2437    return 10;
2438  }
2439  else if (samplingRate == 900.0) {
2440    return 11;
2441  }
2442  else if (samplingRate == 1800.0) {
2443    return 12;
2444  }
2445  else if (samplingRate == 3600.0) {
2446    return 13;
2447  }
2448  else if (samplingRate == 7200.0) {
2449    return 14;
2450  }
2451  else if (samplingRate == 10800.0) {
2452    return 15;
2453  }
2454  return 2;  // default
2455}
Note: See TracBrowser for help on using the repository browser.