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

Last change on this file since 8498 was 8498, checked in by stuerze, 12 months ago

minor changes

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