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

Last change on this file since 8484 was 8484, checked in by stuerze, 10 months ago

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

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