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

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

minor changes

File size: 98.9 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      QMap<QString, double> codeBiases;
418      QList<phaseBiasSignal> phaseBiasList;
419      phaseBiasesSat pbSat;
420
421      while (true) {
422        QString key;
423        int numVal = 0;
424        in >> key;
425        if (in.status() != QTextStream::Ok) {
426          break;
427        }
428        if (key == "APC") {
429          in >> numVal;
430          rtnAPC.ReSize(3);
431          for (int ii = 0; ii < numVal; ii++) {
432            in >> rtnAPC[ii];
433          }
434        }
435        else if (key == "Ura") {
436          in >> numVal;
437          if (numVal == 1)
438            in >> rtnUra;
439        }
440        else if (key == "Clk") {
441          rtnClk.ReSize(3);
442          for (int ii = 0; ii < 3; ii++) {
443            rtnClk[ii] = 0.0;
444          }
445          in >> numVal;
446          for (int ii = 0; ii < numVal; ii++) {
447            in >> rtnClk[ii];
448          }
449        }
450        else if (key == "ClkSig") {
451          rtnClkSig.ReSize(3);
452          for (int ii = 0; ii < 3; ii++) {
453            rtnClkSig[ii] = 0.0;
454          }
455          in >> numVal;
456          for (int ii = 0; ii < numVal; ii++) {
457            in >> rtnClkSig[ii];
458          }
459        }
460        else if (key == "Vel") {
461          rtnVel.ReSize(3);
462          in >> numVal;
463          for (int ii = 0; ii < numVal; ii++) {
464            in >> rtnVel[ii];
465          }
466        }
467        else if (key == "CoM") {
468          rtnCoM.ReSize(3);
469          in >> numVal;
470          for (int ii = 0; ii < numVal; ii++) {
471            in >> rtnCoM[ii];
472          }
473        }
474        else if (key == "CodeBias") {
475          in >> numVal;
476          for (int ii = 0; ii < numVal; ii++) {
477            QString type;
478            double value;
479            in >> type >> value;
480            codeBiases[type] = value;
481          }
482        }
483        else if (key == "YawAngle") {
484          in >> numVal >> pbSat.yawAngle;
485          if      (pbSat.yawAngle < 0.0) {
486            pbSat.yawAngle += (2*M_PI);
487          }
488          else if (pbSat.yawAngle > 2*M_PI) {
489            pbSat.yawAngle -= (2*M_PI);
490          }
491        }
492        else if (key == "YawRate") {
493          in >> numVal >> pbSat.yawRate;
494        }
495        else if (key == "PhaseBias") {
496          in >> numVal;
497          for (int ii = 0; ii < numVal; ii++) {
498            phaseBiasSignal pb;
499            in >> pb.type >> pb.bias >> pb.integerIndicator
500              >> pb.wlIndicator >> pb.discontinuityCounter;
501            phaseBiasList.append(pb);
502          }
503        }
504        else {
505          in >> numVal;
506          for (int ii = 0; ii < numVal; ii++) {
507            double dummy;
508            in >> dummy;
509          }
510        }
511      }
512
513      struct ClockOrbit::SatData* sd = 0;
514      if (prn.system() == 'G') {
515        sd = co.Sat + co.NumberOfSat[CLOCKORBIT_SATGPS];
516        ++co.NumberOfSat[CLOCKORBIT_SATGPS];
517      }
518      else if (prn.system() == 'R') {
519        sd = co.Sat + CLOCKORBIT_NUMGPS + co.NumberOfSat[CLOCKORBIT_SATGLONASS];
520        ++co.NumberOfSat[CLOCKORBIT_SATGLONASS];
521      }
522      else if (prn.system() == 'E') {
523        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
524            + co.NumberOfSat[CLOCKORBIT_SATGALILEO];
525        ++co.NumberOfSat[CLOCKORBIT_SATGALILEO];
526      }
527      else if (prn.system() == 'J') {
528        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
529            + CLOCKORBIT_NUMGALILEO + co.NumberOfSat[CLOCKORBIT_SATQZSS];
530        ++co.NumberOfSat[CLOCKORBIT_SATQZSS];
531      }
532      else if (prn.system() == 'S') {
533        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
534            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
535            + co.NumberOfSat[CLOCKORBIT_SATSBAS];
536        ++co.NumberOfSat[CLOCKORBIT_SATSBAS];
537      }
538      else if (prn.system() == 'C') {
539        sd = co.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
540            + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
541            + co.NumberOfSat[CLOCKORBIT_SATBDS];
542        ++co.NumberOfSat[CLOCKORBIT_SATBDS];
543      }
544      if (sd) {
545        QString outLine;
546        processSatellite(eph, epoTime.gpsw(), epoTime.gpssec(), prnStr, rtnAPC, rtnUra,
547            rtnClk, rtnVel, rtnCoM, rtnClkSig, sd, outLine);
548      }
549
550      // Code Biases
551      // -----------
552      struct CodeBias::BiasSat* biasSat = 0;
553      if (!codeBiases.isEmpty()) {
554        if (prn.system() == 'G') {
555          biasSat = bias.Sat + bias.NumberOfSat[CLOCKORBIT_SATGPS];
556          ++bias.NumberOfSat[CLOCKORBIT_SATGPS];
557        }
558        else if (prn.system() == 'R') {
559          biasSat = bias.Sat + CLOCKORBIT_NUMGPS
560              + bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
561          ++bias.NumberOfSat[CLOCKORBIT_SATGLONASS];
562        }
563        else if (prn.system() == 'E') {
564          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
565              + bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
566          ++bias.NumberOfSat[CLOCKORBIT_SATGALILEO];
567        }
568        else if (prn.system() == 'J') {
569          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
570              + CLOCKORBIT_NUMGALILEO + bias.NumberOfSat[CLOCKORBIT_SATQZSS];
571          ++bias.NumberOfSat[CLOCKORBIT_SATQZSS];
572        }
573        else if (prn.system() == 'S') {
574          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
575              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS
576              + bias.NumberOfSat[CLOCKORBIT_SATSBAS];
577          ++bias.NumberOfSat[CLOCKORBIT_SATSBAS];
578        }
579        else if (prn.system() == 'C') {
580          biasSat = bias.Sat + CLOCKORBIT_NUMGPS + CLOCKORBIT_NUMGLONASS
581              + CLOCKORBIT_NUMGALILEO + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
582              + bias.NumberOfSat[CLOCKORBIT_SATBDS];
583          ++bias.NumberOfSat[CLOCKORBIT_SATBDS];
584        }
585      }
586
587      if (biasSat) {
588        biasSat->ID = prn.number();
589        biasSat->NumberOfCodeBiases = 0;
590        if (prn.system() == 'G') {
591          QMapIterator<QString, double> it(codeBiases);
592          while (it.hasNext()) {
593            it.next();
594            if (it.key() == "1C") {
595              int ii = biasSat->NumberOfCodeBiases;
596              if (ii >= CLOCKORBIT_NUMBIAS)
597                break;
598              biasSat->NumberOfCodeBiases += 1;
599              biasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
600              biasSat->Biases[ii].Bias = it.value();
601            }
602            else if (it.key() == "1S") {
603              int ii = biasSat->NumberOfCodeBiases;
604              if (ii >= CLOCKORBIT_NUMBIAS)
605                break;
606              biasSat->NumberOfCodeBiases += 1;
607              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
608              biasSat->Biases[ii].Bias = it.value();
609            }
610            else if (it.key() == "1L") {
611              int ii = biasSat->NumberOfCodeBiases;
612              if (ii >= CLOCKORBIT_NUMBIAS)
613                break;
614              biasSat->NumberOfCodeBiases += 1;
615              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
616              biasSat->Biases[ii].Bias = it.value();
617            }
618            else if (it.key() == "1X") {
619              int ii = biasSat->NumberOfCodeBiases;
620              if (ii >= CLOCKORBIT_NUMBIAS)
621                break;
622              biasSat->NumberOfCodeBiases += 1;
623              biasSat->Biases[ii].Type = CODETYPEGPS_L1C_DP;
624              biasSat->Biases[ii].Bias = it.value();
625            }
626            else if (it.key() == "1P") {
627              int ii = biasSat->NumberOfCodeBiases;
628              if (ii >= CLOCKORBIT_NUMBIAS)
629                break;
630              biasSat->NumberOfCodeBiases += 1;
631              biasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
632              biasSat->Biases[ii].Bias = it.value();
633            }
634            else if (it.key() == "1W") {
635              int ii = biasSat->NumberOfCodeBiases;
636              if (ii >= CLOCKORBIT_NUMBIAS)
637                break;
638              biasSat->NumberOfCodeBiases += 1;
639              biasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
640              biasSat->Biases[ii].Bias = it.value();
641            }
642            else if (it.key() == "2C") {
643              int ii = biasSat->NumberOfCodeBiases;
644              if (ii >= CLOCKORBIT_NUMBIAS)
645                break;
646              biasSat->NumberOfCodeBiases += 1;
647              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
648              biasSat->Biases[ii].Bias = it.value();
649            }
650            else if (it.key() == "2D") {
651              int ii = biasSat->NumberOfCodeBiases;
652              if (ii >= CLOCKORBIT_NUMBIAS)
653                break;
654              biasSat->NumberOfCodeBiases += 1;
655              biasSat->Biases[ii].Type = CODETYPEGPS_SEMI_CODELESS;
656              biasSat->Biases[ii].Bias = it.value();
657            }
658            else if (it.key() == "2S") {
659              int ii = biasSat->NumberOfCodeBiases;
660              if (ii >= CLOCKORBIT_NUMBIAS)
661                break;
662              biasSat->NumberOfCodeBiases += 1;
663              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CM;
664              biasSat->Biases[ii].Bias = it.value();
665            }
666            else if (it.key() == "2L") {
667              int ii = biasSat->NumberOfCodeBiases;
668              if (ii >= CLOCKORBIT_NUMBIAS)
669                break;
670              biasSat->NumberOfCodeBiases += 1;
671              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CL;
672              biasSat->Biases[ii].Bias = it.value();
673            }
674            else if (it.key() == "2X") {
675              int ii = biasSat->NumberOfCodeBiases;
676              if (ii >= CLOCKORBIT_NUMBIAS)
677                break;
678              biasSat->NumberOfCodeBiases += 1;
679              biasSat->Biases[ii].Type = CODETYPEGPS_L2_CML;
680              biasSat->Biases[ii].Bias = it.value();
681            }
682            else if (it.key() == "2P") {
683              int ii = biasSat->NumberOfCodeBiases;
684              if (ii >= CLOCKORBIT_NUMBIAS)
685                break;
686              biasSat->NumberOfCodeBiases += 1;
687              biasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
688              biasSat->Biases[ii].Bias = it.value();
689            }
690            else if (it.key() == "2W") {
691              int ii = biasSat->NumberOfCodeBiases;
692              if (ii >= CLOCKORBIT_NUMBIAS)
693                break;
694              biasSat->NumberOfCodeBiases += 1;
695              biasSat->Biases[ii].Type = CODETYPEGPS_L2_Z;
696              biasSat->Biases[ii].Bias = it.value();
697            }
698            else if (it.key() == "5I") {
699              int ii = biasSat->NumberOfCodeBiases;
700              if (ii >= CLOCKORBIT_NUMBIAS)
701                break;
702              biasSat->NumberOfCodeBiases += 1;
703              biasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
704              biasSat->Biases[ii].Bias = it.value();
705            }
706            else if (it.key() == "5Q") {
707              int ii = biasSat->NumberOfCodeBiases;
708              if (ii >= CLOCKORBIT_NUMBIAS)
709                break;
710              biasSat->NumberOfCodeBiases += 1;
711              biasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
712              biasSat->Biases[ii].Bias = it.value();
713            }
714            else if (it.key() == "5X") {
715              int ii = biasSat->NumberOfCodeBiases;
716              if (ii >= CLOCKORBIT_NUMBIAS)
717                break;
718              biasSat->NumberOfCodeBiases += 1;
719              biasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
720              biasSat->Biases[ii].Bias = it.value();
721            }
722          }
723        }
724        else if (prn.system() == 'R') {
725          QMapIterator<QString, double> it(codeBiases);
726          while (it.hasNext()) {
727            it.next();
728            if (it.key() == "1C") {
729              int ii = biasSat->NumberOfCodeBiases;
730              if (ii >= CLOCKORBIT_NUMBIAS)
731                break;
732              biasSat->NumberOfCodeBiases += 1;
733              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
734              biasSat->Biases[ii].Bias = it.value();
735            }
736            else if (it.key() == "1P") {
737              int ii = biasSat->NumberOfCodeBiases;
738              if (ii >= CLOCKORBIT_NUMBIAS)
739                break;
740              biasSat->NumberOfCodeBiases += 1;
741              biasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
742              biasSat->Biases[ii].Bias = it.value();
743            }
744            else if (it.key() == "2C") {
745              int ii = biasSat->NumberOfCodeBiases;
746              if (ii >= CLOCKORBIT_NUMBIAS)
747                break;
748              biasSat->NumberOfCodeBiases += 1;
749              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
750              biasSat->Biases[ii].Bias = it.value();
751            }
752            else if (it.key() == "2P") {
753              int ii = biasSat->NumberOfCodeBiases;
754              if (ii >= CLOCKORBIT_NUMBIAS)
755                break;
756              biasSat->NumberOfCodeBiases += 1;
757              biasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
758              biasSat->Biases[ii].Bias = it.value();
759            }
760          }
761        }
762        else if (prn.system() == 'E') {
763          QMapIterator<QString, double> it(codeBiases);
764          while (it.hasNext()) {
765            it.next();
766            if (it.key() == "1A") {
767              int ii = biasSat->NumberOfCodeBiases;
768              if (ii >= CLOCKORBIT_NUMBIAS)
769                break;
770              biasSat->NumberOfCodeBiases += 1;
771              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
772              biasSat->Biases[ii].Bias = it.value();
773            }
774            else if (it.key() == "1B") {
775              int ii = biasSat->NumberOfCodeBiases;
776              if (ii >= CLOCKORBIT_NUMBIAS)
777                break;
778              biasSat->NumberOfCodeBiases += 1;
779              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
780              biasSat->Biases[ii].Bias = it.value();
781            }
782            else if (it.key() == "1C") {
783              int ii = biasSat->NumberOfCodeBiases;
784              if (ii >= CLOCKORBIT_NUMBIAS)
785                break;
786              biasSat->NumberOfCodeBiases += 1;
787              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
788              biasSat->Biases[ii].Bias = it.value();
789            }
790            else if (it.key() == "1X") {
791              int ii = biasSat->NumberOfCodeBiases;
792              if (ii >= CLOCKORBIT_NUMBIAS)
793                break;
794              biasSat->NumberOfCodeBiases += 1;
795              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
796              biasSat->Biases[ii].Bias = it.value();
797            }
798            else if (it.key() == "1Z") {
799              int ii = biasSat->NumberOfCodeBiases;
800              if (ii >= CLOCKORBIT_NUMBIAS)
801                break;
802              biasSat->NumberOfCodeBiases += 1;
803              biasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
804              biasSat->Biases[ii].Bias = it.value();
805            }
806            else if (it.key() == "5I") {
807              int ii = biasSat->NumberOfCodeBiases;
808              if (ii >= CLOCKORBIT_NUMBIAS)
809                break;
810              biasSat->NumberOfCodeBiases += 1;
811              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
812              biasSat->Biases[ii].Bias = it.value();
813            }
814            else if (it.key() == "5Q") {
815              int ii = biasSat->NumberOfCodeBiases;
816              if (ii >= CLOCKORBIT_NUMBIAS)
817                break;
818              biasSat->NumberOfCodeBiases += 1;
819              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
820              biasSat->Biases[ii].Bias = it.value();
821            }
822            else if (it.key() == "5X") {
823              int ii = biasSat->NumberOfCodeBiases;
824              if (ii >= CLOCKORBIT_NUMBIAS)
825                break;
826              biasSat->NumberOfCodeBiases += 1;
827              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
828              biasSat->Biases[ii].Bias = it.value();
829            }
830            else if (it.key() == "7I") {
831              int ii = biasSat->NumberOfCodeBiases;
832              if (ii >= CLOCKORBIT_NUMBIAS)
833                break;
834              biasSat->NumberOfCodeBiases += 1;
835              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
836              biasSat->Biases[ii].Bias = it.value();
837            }
838            else if (it.key() == "7Q") {
839              int ii = biasSat->NumberOfCodeBiases;
840              if (ii >= CLOCKORBIT_NUMBIAS)
841                break;
842              biasSat->NumberOfCodeBiases += 1;
843              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
844              biasSat->Biases[ii].Bias = it.value();
845            }
846            else if (it.key() == "7X") {
847              int ii = biasSat->NumberOfCodeBiases;
848              if (ii >= CLOCKORBIT_NUMBIAS)
849                break;
850              biasSat->NumberOfCodeBiases += 1;
851              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
852              biasSat->Biases[ii].Bias = it.value();
853            }
854            else if (it.key() == "8I") {
855              int ii = biasSat->NumberOfCodeBiases;
856              if (ii >= CLOCKORBIT_NUMBIAS)
857                break;
858              biasSat->NumberOfCodeBiases += 1;
859              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
860              biasSat->Biases[ii].Bias = it.value();
861            }
862            else if (it.key() == "8Q") {
863              int ii = biasSat->NumberOfCodeBiases;
864              if (ii >= CLOCKORBIT_NUMBIAS)
865                break;
866              biasSat->NumberOfCodeBiases += 1;
867              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
868              biasSat->Biases[ii].Bias = it.value();
869            }
870            else if (it.key() == "8X") {
871              int ii = biasSat->NumberOfCodeBiases;
872              if (ii >= CLOCKORBIT_NUMBIAS)
873                break;
874              biasSat->NumberOfCodeBiases += 1;
875              biasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
876              biasSat->Biases[ii].Bias = it.value();
877            }
878            else if (it.key() == "6A") {
879              int ii = biasSat->NumberOfCodeBiases;
880              if (ii >= CLOCKORBIT_NUMBIAS)
881                break;
882              biasSat->NumberOfCodeBiases += 1;
883              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
884              biasSat->Biases[ii].Bias = it.value();
885            }
886            else if (it.key() == "6B") {
887              int ii = biasSat->NumberOfCodeBiases;
888              if (ii >= CLOCKORBIT_NUMBIAS)
889                break;
890              biasSat->NumberOfCodeBiases += 1;
891              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
892              biasSat->Biases[ii].Bias = it.value();
893            }
894            else if (it.key() == "6C") {
895              int ii = biasSat->NumberOfCodeBiases;
896              if (ii >= CLOCKORBIT_NUMBIAS)
897                break;
898              biasSat->NumberOfCodeBiases += 1;
899              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
900              biasSat->Biases[ii].Bias = it.value();
901            }
902            else if (it.key() == "6X") {
903              int ii = biasSat->NumberOfCodeBiases;
904              if (ii >= CLOCKORBIT_NUMBIAS)
905                break;
906              biasSat->NumberOfCodeBiases += 1;
907              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
908              biasSat->Biases[ii].Bias = it.value();
909            }
910            else if (it.key() == "6Z") {
911              int ii = biasSat->NumberOfCodeBiases;
912              if (ii >= CLOCKORBIT_NUMBIAS)
913                break;
914              biasSat->NumberOfCodeBiases += 1;
915              biasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
916              biasSat->Biases[ii].Bias = it.value();
917            }
918          }
919        }
920        else if (prn.system() == 'J') {
921          QMapIterator<QString, double> it(codeBiases);
922          while (it.hasNext()) {
923            it.next();
924            if (it.key() == "1C") {
925              int ii = biasSat->NumberOfCodeBiases;
926              if (ii >= CLOCKORBIT_NUMBIAS)
927                break;
928              biasSat->NumberOfCodeBiases += 1;
929              biasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
930              biasSat->Biases[ii].Bias = it.value();
931            }
932            else if (it.key() == "1S") {
933              int ii = biasSat->NumberOfCodeBiases;
934              if (ii >= CLOCKORBIT_NUMBIAS)
935                break;
936              biasSat->NumberOfCodeBiases += 1;
937              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
938              biasSat->Biases[ii].Bias = it.value();
939            }
940            else if (it.key() == "1L") {
941              int ii = biasSat->NumberOfCodeBiases;
942              if (ii >= CLOCKORBIT_NUMBIAS)
943                break;
944              biasSat->NumberOfCodeBiases += 1;
945              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
946              biasSat->Biases[ii].Bias = it.value();
947            }
948            else if (it.key() == "1X") {
949              int ii = biasSat->NumberOfCodeBiases;
950              if (ii >= CLOCKORBIT_NUMBIAS)
951                break;
952              biasSat->NumberOfCodeBiases += 1;
953              biasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
954              biasSat->Biases[ii].Bias = it.value();
955            }
956            else if (it.key() == "2S") {
957              int ii = biasSat->NumberOfCodeBiases;
958              if (ii >= CLOCKORBIT_NUMBIAS)
959                break;
960              biasSat->NumberOfCodeBiases += 1;
961              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
962              biasSat->Biases[ii].Bias = it.value();
963            }
964            else if (it.key() == "2L") {
965              int ii = biasSat->NumberOfCodeBiases;
966              if (ii >= CLOCKORBIT_NUMBIAS)
967                break;
968              biasSat->NumberOfCodeBiases += 1;
969              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
970              biasSat->Biases[ii].Bias = it.value();
971            }
972            else if (it.key() == "2X") {
973              int ii = biasSat->NumberOfCodeBiases;
974              if (ii >= CLOCKORBIT_NUMBIAS)
975                break;
976              biasSat->NumberOfCodeBiases += 1;
977              biasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
978              biasSat->Biases[ii].Bias = it.value();
979            }
980            else if (it.key() == "5I") {
981              int ii = biasSat->NumberOfCodeBiases;
982              if (ii >= CLOCKORBIT_NUMBIAS)
983                break;
984              biasSat->NumberOfCodeBiases += 1;
985              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
986              biasSat->Biases[ii].Bias = it.value();
987            }
988            else if (it.key() == "5Q") {
989              int ii = biasSat->NumberOfCodeBiases;
990              if (ii >= CLOCKORBIT_NUMBIAS)
991                break;
992              biasSat->NumberOfCodeBiases += 1;
993              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
994              biasSat->Biases[ii].Bias = it.value();
995            }
996            else if (it.key() == "5X") {
997              int ii = biasSat->NumberOfCodeBiases;
998              if (ii >= CLOCKORBIT_NUMBIAS)
999                break;
1000              biasSat->NumberOfCodeBiases += 1;
1001              biasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1002              biasSat->Biases[ii].Bias = it.value();
1003            }
1004            else if (it.key() == "6S") {
1005              int ii = biasSat->NumberOfCodeBiases;
1006              if (ii >= CLOCKORBIT_NUMBIAS)
1007                break;
1008              biasSat->NumberOfCodeBiases += 1;
1009              biasSat->Biases[ii].Type = CODETYPEQZSS_LEX_S;
1010              biasSat->Biases[ii].Bias = it.value();
1011            }
1012            else if (it.key() == "6L") {
1013              int ii = biasSat->NumberOfCodeBiases;
1014              if (ii >= CLOCKORBIT_NUMBIAS)
1015                break;
1016              biasSat->NumberOfCodeBiases += 1;
1017              biasSat->Biases[ii].Type = CODETYPEQZSS_LEX_L;
1018              biasSat->Biases[ii].Bias = it.value();
1019            }
1020            else if (it.key() == "6X") {
1021              int ii = biasSat->NumberOfCodeBiases;
1022              if (ii >= CLOCKORBIT_NUMBIAS)
1023                break;
1024              biasSat->NumberOfCodeBiases += 1;
1025              biasSat->Biases[ii].Type = CODETYPEQZSS_LEX_SL;
1026              biasSat->Biases[ii].Bias = it.value();
1027            }
1028          }
1029        }
1030        else if (prn.system() == 'S') {
1031          QMapIterator<QString, double> it(codeBiases);
1032          while (it.hasNext()) {
1033            it.next();
1034            if (it.key() == "1C") {
1035              int ii = biasSat->NumberOfCodeBiases;
1036              if (ii >= CLOCKORBIT_NUMBIAS)
1037                break;
1038              biasSat->NumberOfCodeBiases += 1;
1039              biasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
1040              biasSat->Biases[ii].Bias = it.value();
1041            }
1042            else if (it.key() == "5I") {
1043              int ii = biasSat->NumberOfCodeBiases;
1044              if (ii >= CLOCKORBIT_NUMBIAS)
1045                break;
1046              biasSat->NumberOfCodeBiases += 1;
1047              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
1048              biasSat->Biases[ii].Bias = it.value();
1049            }
1050            else if (it.key() == "5Q") {
1051              int ii = biasSat->NumberOfCodeBiases;
1052              if (ii >= CLOCKORBIT_NUMBIAS)
1053                break;
1054              biasSat->NumberOfCodeBiases += 1;
1055              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
1056              biasSat->Biases[ii].Bias = it.value();
1057            }
1058            else if (it.key() == "5X") {
1059              int ii = biasSat->NumberOfCodeBiases;
1060              if (ii >= CLOCKORBIT_NUMBIAS)
1061                break;
1062              biasSat->NumberOfCodeBiases += 1;
1063              biasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
1064              biasSat->Biases[ii].Bias = it.value();
1065            }
1066          }
1067        }
1068        else if (prn.system() == 'C') {
1069          QMapIterator<QString, double> it(codeBiases);
1070          while (it.hasNext()) {
1071            it.next();
1072            if (it.key() == "2I") {
1073              int ii = biasSat->NumberOfCodeBiases;
1074              if (ii >= CLOCKORBIT_NUMBIAS)
1075                break;
1076              biasSat->NumberOfCodeBiases += 1;
1077              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
1078              biasSat->Biases[ii].Bias = it.value();
1079            }
1080            else if (it.key() == "2Q") {
1081              int ii = biasSat->NumberOfCodeBiases;
1082              if (ii >= CLOCKORBIT_NUMBIAS)
1083                break;
1084              biasSat->NumberOfCodeBiases += 1;
1085              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
1086              biasSat->Biases[ii].Bias = it.value();
1087            }
1088            else if (it.key() == "2X") {
1089              int ii = biasSat->NumberOfCodeBiases;
1090              if (ii >= CLOCKORBIT_NUMBIAS)
1091                break;
1092              biasSat->NumberOfCodeBiases += 1;
1093              biasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
1094              biasSat->Biases[ii].Bias = it.value();
1095            }
1096            else if (it.key() == "6I") {
1097              int ii = biasSat->NumberOfCodeBiases;
1098              if (ii >= CLOCKORBIT_NUMBIAS)
1099                break;
1100              biasSat->NumberOfCodeBiases += 1;
1101              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
1102              biasSat->Biases[ii].Bias = it.value();
1103            }
1104            else if (it.key() == "6Q") {
1105              int ii = biasSat->NumberOfCodeBiases;
1106              if (ii >= CLOCKORBIT_NUMBIAS)
1107                break;
1108              biasSat->NumberOfCodeBiases += 1;
1109              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
1110              biasSat->Biases[ii].Bias = it.value();
1111            }
1112            else if (it.key() == "6X") {
1113              int ii = biasSat->NumberOfCodeBiases;
1114              if (ii >= CLOCKORBIT_NUMBIAS)
1115                break;
1116              biasSat->NumberOfCodeBiases += 1;
1117              biasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
1118              biasSat->Biases[ii].Bias = it.value();
1119            }
1120            else if (it.key() == "7I") {
1121              int ii = biasSat->NumberOfCodeBiases;
1122              if (ii >= CLOCKORBIT_NUMBIAS)
1123                break;
1124              biasSat->NumberOfCodeBiases += 1;
1125              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
1126              biasSat->Biases[ii].Bias = it.value();
1127            }
1128            else if (it.key() == "7Q") {
1129              int ii = biasSat->NumberOfCodeBiases;
1130              if (ii >= CLOCKORBIT_NUMBIAS)
1131                break;
1132              biasSat->NumberOfCodeBiases += 1;
1133              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
1134              biasSat->Biases[ii].Bias = it.value();
1135            }
1136            else if (it.key() == "7X") {
1137              int ii = biasSat->NumberOfCodeBiases;
1138              if (ii >= CLOCKORBIT_NUMBIAS)
1139                break;
1140              biasSat->NumberOfCodeBiases += 1;
1141              biasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
1142              biasSat->Biases[ii].Bias = it.value();
1143            }
1144          }
1145        }
1146      }
1147      // Phase Biases
1148      // ------------
1149      struct PhaseBias::PhaseBiasSat* phasebiasSat = 0;
1150      if (!phaseBiasList.isEmpty()) {
1151        if (prn.system() == 'G') {
1152          phasebiasSat = phasebias.Sat
1153              + phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1154          ++phasebias.NumberOfSat[CLOCKORBIT_SATGPS];
1155        }
1156        else if (prn.system() == 'R') {
1157          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1158              + phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1159          ++phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS];
1160        }
1161        else if (prn.system() == 'E') {
1162          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1163              + CLOCKORBIT_NUMGLONASS
1164              + phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1165          ++phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO];
1166        }
1167        else if (prn.system() == 'J') {
1168          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1169              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1170              + phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1171          ++phasebias.NumberOfSat[CLOCKORBIT_SATQZSS];
1172        }
1173        else if (prn.system() == 'S') {
1174          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1175              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1176              + CLOCKORBIT_NUMQZSS + phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1177          ++phasebias.NumberOfSat[CLOCKORBIT_SATSBAS];
1178        }
1179        else if (prn.system() == 'C') {
1180          phasebiasSat = phasebias.Sat + CLOCKORBIT_NUMGPS
1181              + CLOCKORBIT_NUMGLONASS + CLOCKORBIT_NUMGALILEO
1182              + CLOCKORBIT_NUMQZSS + CLOCKORBIT_NUMSBAS
1183              + phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1184          ++phasebias.NumberOfSat[CLOCKORBIT_SATBDS];
1185        }
1186      }
1187
1188      if (phasebiasSat) {
1189        phasebias.DispersiveBiasConsistencyIndicator = dispersiveBiasConsistenyIndicator;
1190        phasebias.MWConsistencyIndicator = mwConsistencyIndicator;
1191        phasebiasSat->ID = prn.number();
1192        phasebiasSat->NumberOfPhaseBiases = 0;
1193        phasebiasSat->YawAngle = pbSat.yawAngle;
1194        phasebiasSat->YawRate = pbSat.yawRate;
1195        if (prn.system() == 'G') {
1196          QListIterator<phaseBiasSignal> it(phaseBiasList);
1197          while (it.hasNext()) {
1198            const phaseBiasSignal &pbSig = it.next();
1199            if (pbSig.type == "1C") {
1200              int ii = phasebiasSat->NumberOfPhaseBiases;
1201              if (ii >= CLOCKORBIT_NUMBIAS)
1202                break;
1203              phasebiasSat->NumberOfPhaseBiases += 1;
1204              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_CA;
1205              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1206              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1207              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1208                  pbSig.wlIndicator;
1209              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1210                  pbSig.discontinuityCounter;
1211            }
1212            else if (pbSig.type == "1S") {
1213              int ii = phasebiasSat->NumberOfPhaseBiases;
1214              if (ii >= CLOCKORBIT_NUMBIAS)
1215                break;
1216              phasebiasSat->NumberOfPhaseBiases += 1;
1217              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_D;
1218              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1219              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1220              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1221                  pbSig.wlIndicator;
1222              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1223                  pbSig.discontinuityCounter;
1224            }
1225            else if (pbSig.type == "1L") {
1226              int ii = phasebiasSat->NumberOfPhaseBiases;
1227              if (ii >= CLOCKORBIT_NUMBIAS)
1228                break;
1229              phasebiasSat->NumberOfPhaseBiases += 1;
1230              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
1231              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1232              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1233              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1234                  pbSig.wlIndicator;
1235              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1236                  pbSig.discontinuityCounter;
1237            }
1238            else if (pbSig.type == "1X") {
1239              int ii = phasebiasSat->NumberOfPhaseBiases;
1240              if (ii >= CLOCKORBIT_NUMBIAS)
1241                break;
1242              phasebiasSat->NumberOfPhaseBiases += 1;
1243              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1C_P;
1244              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1245              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1246              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1247                  pbSig.wlIndicator;
1248              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1249                  pbSig.discontinuityCounter;
1250            }
1251            else if (pbSig.type == "1P") {
1252              int ii = phasebiasSat->NumberOfPhaseBiases;
1253              if (ii >= CLOCKORBIT_NUMBIAS)
1254                break;
1255              phasebiasSat->NumberOfPhaseBiases += 1;
1256              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_P;
1257              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1258              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1259              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1260                  pbSig.wlIndicator;
1261              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1262                  pbSig.discontinuityCounter;
1263            }
1264            else if (pbSig.type == "1W") {
1265              int ii = phasebiasSat->NumberOfPhaseBiases;
1266              if (ii >= CLOCKORBIT_NUMBIAS)
1267                break;
1268              phasebiasSat->NumberOfPhaseBiases += 1;
1269              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L1_Z;
1270              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1271              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1272              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1273                  pbSig.wlIndicator;
1274              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1275                  pbSig.discontinuityCounter;
1276            }
1277            else if (pbSig.type == "2C") {
1278              int ii = phasebiasSat->NumberOfPhaseBiases;
1279              if (ii >= CLOCKORBIT_NUMBIAS)
1280                break;
1281              phasebiasSat->NumberOfPhaseBiases += 1;
1282              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CA;
1283              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1284              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1285              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1286                  pbSig.wlIndicator;
1287              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1288                  pbSig.discontinuityCounter;
1289            }
1290            else if (pbSig.type == "2D") {
1291              int ii = phasebiasSat->NumberOfPhaseBiases;
1292              if (ii >= CLOCKORBIT_NUMBIAS)
1293                break;
1294              phasebiasSat->NumberOfPhaseBiases += 1;
1295              phasebiasSat->Biases[ii].Type = CODETYPEGPS_SEMI_CODELESS;
1296              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1297              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1298              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1299                  pbSig.wlIndicator;
1300              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1301                  pbSig.discontinuityCounter;
1302            }
1303            else if (pbSig.type == "2S") {
1304              int ii = phasebiasSat->NumberOfPhaseBiases;
1305              if (ii >= CLOCKORBIT_NUMBIAS)
1306                break;
1307              phasebiasSat->NumberOfPhaseBiases += 1;
1308              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CM;
1309              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1310              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1311              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1312                  pbSig.wlIndicator;
1313              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1314                  pbSig.discontinuityCounter;
1315            }
1316            else if (pbSig.type == "2L") {
1317              int ii = phasebiasSat->NumberOfPhaseBiases;
1318              if (ii >= CLOCKORBIT_NUMBIAS)
1319                break;
1320              phasebiasSat->NumberOfPhaseBiases += 1;
1321              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CL;
1322              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1323              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1324              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1325                  pbSig.wlIndicator;
1326              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1327                  pbSig.discontinuityCounter;
1328            }
1329            else if (pbSig.type == "2X") {
1330              int ii = phasebiasSat->NumberOfPhaseBiases;
1331              if (ii >= CLOCKORBIT_NUMBIAS)
1332                break;
1333              phasebiasSat->NumberOfPhaseBiases += 1;
1334              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_CML;
1335              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1336              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1337              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1338                  pbSig.wlIndicator;
1339              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1340                  pbSig.discontinuityCounter;
1341            }
1342            else if (pbSig.type == "2P") {
1343              int ii = phasebiasSat->NumberOfPhaseBiases;
1344              if (ii >= CLOCKORBIT_NUMBIAS)
1345                break;
1346              phasebiasSat->NumberOfPhaseBiases += 1;
1347              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_P;
1348              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1349              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1350              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1351                  pbSig.wlIndicator;
1352              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1353                  pbSig.discontinuityCounter;
1354            }
1355            else if (pbSig.type == "2W") {
1356              int ii = phasebiasSat->NumberOfPhaseBiases;
1357              if (ii >= CLOCKORBIT_NUMBIAS)
1358                break;
1359              phasebiasSat->NumberOfPhaseBiases += 1;
1360              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L2_Z;
1361              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1362              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1363              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1364                  pbSig.wlIndicator;
1365              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1366                  pbSig.discontinuityCounter;
1367            }
1368            else if (pbSig.type == "5I") {
1369              int ii = phasebiasSat->NumberOfPhaseBiases;
1370              if (ii >= CLOCKORBIT_NUMBIAS)
1371                break;
1372              phasebiasSat->NumberOfPhaseBiases += 1;
1373              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_I;
1374              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1375              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1376              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1377                  pbSig.wlIndicator;
1378              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1379                  pbSig.discontinuityCounter;
1380            }
1381            else if (pbSig.type == "5Q") {
1382              int ii = phasebiasSat->NumberOfPhaseBiases;
1383              if (ii >= CLOCKORBIT_NUMBIAS)
1384                break;
1385              phasebiasSat->NumberOfPhaseBiases += 1;
1386              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_Q;
1387              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1388              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1389              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1390                  pbSig.wlIndicator;
1391              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1392                  pbSig.discontinuityCounter;
1393            }
1394            else if (pbSig.type == "5X") {
1395              int ii = phasebiasSat->NumberOfPhaseBiases;
1396              if (ii >= CLOCKORBIT_NUMBIAS)
1397                break;
1398              phasebiasSat->NumberOfPhaseBiases += 1;
1399              phasebiasSat->Biases[ii].Type = CODETYPEGPS_L5_IQ;
1400              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1401              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1402              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1403                  pbSig.wlIndicator;
1404              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1405                  pbSig.discontinuityCounter;
1406            }
1407          }
1408        }
1409        if (prn.system() == 'R') {
1410          QListIterator<phaseBiasSignal> it(phaseBiasList);
1411          while (it.hasNext()) {
1412            const phaseBiasSignal &pbSig = it.next();
1413            if (pbSig.type == "1C") {
1414              int ii = phasebiasSat->NumberOfPhaseBiases;
1415              if (ii >= CLOCKORBIT_NUMBIAS)
1416                break;
1417              phasebiasSat->NumberOfPhaseBiases += 1;
1418              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_CA;
1419              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1420              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1421              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1422                  pbSig.wlIndicator;
1423              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1424                  pbSig.discontinuityCounter;
1425            }
1426            else if (pbSig.type == "1P") {
1427              int ii = phasebiasSat->NumberOfPhaseBiases;
1428              if (ii >= CLOCKORBIT_NUMBIAS)
1429                break;
1430              phasebiasSat->NumberOfPhaseBiases += 1;
1431              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L1_P;
1432              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1433              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1434              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1435                  pbSig.wlIndicator;
1436              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1437                  pbSig.discontinuityCounter;
1438            }
1439            else if (pbSig.type == "2C") {
1440              int ii = phasebiasSat->NumberOfPhaseBiases;
1441              if (ii >= CLOCKORBIT_NUMBIAS)
1442                break;
1443              phasebiasSat->NumberOfPhaseBiases += 1;
1444              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_CA;
1445              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1446              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1447              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1448                  pbSig.wlIndicator;
1449              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1450                  pbSig.discontinuityCounter;
1451            }
1452            else if (pbSig.type == "2P") {
1453              int ii = phasebiasSat->NumberOfPhaseBiases;
1454              if (ii >= CLOCKORBIT_NUMBIAS)
1455                break;
1456              phasebiasSat->NumberOfPhaseBiases += 1;
1457              phasebiasSat->Biases[ii].Type = CODETYPEGLONASS_L2_P;
1458              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1459              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1460              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1461                  pbSig.wlIndicator;
1462              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1463                  pbSig.discontinuityCounter;
1464            }
1465          }
1466        }
1467        if (prn.system() == 'E') {
1468          QListIterator<phaseBiasSignal> it(phaseBiasList);
1469          while (it.hasNext()) {
1470            const phaseBiasSignal &pbSig = it.next();
1471            if (pbSig.type == "1A") {
1472              int ii = phasebiasSat->NumberOfPhaseBiases;
1473              if (ii >= CLOCKORBIT_NUMBIAS)
1474                break;
1475              phasebiasSat->NumberOfPhaseBiases += 1;
1476              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_A;
1477              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1478              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1479              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1480                  pbSig.wlIndicator;
1481              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1482                  pbSig.discontinuityCounter;
1483            }
1484            else if (pbSig.type == "1B") {
1485              int ii = phasebiasSat->NumberOfPhaseBiases;
1486              if (ii >= CLOCKORBIT_NUMBIAS)
1487                break;
1488              phasebiasSat->NumberOfPhaseBiases += 1;
1489              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_B;
1490              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1491              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1492              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1493                  pbSig.wlIndicator;
1494              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1495                  pbSig.discontinuityCounter;
1496            }
1497            else if (pbSig.type == "1C") {
1498              int ii = phasebiasSat->NumberOfPhaseBiases;
1499              if (ii >= CLOCKORBIT_NUMBIAS)
1500                break;
1501              phasebiasSat->NumberOfPhaseBiases += 1;
1502              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_C;
1503              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1504              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1505              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1506                  pbSig.wlIndicator;
1507              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1508                  pbSig.discontinuityCounter;
1509            }
1510            else if (pbSig.type == "1X") {
1511              int ii = phasebiasSat->NumberOfPhaseBiases;
1512              if (ii >= CLOCKORBIT_NUMBIAS)
1513                break;
1514              phasebiasSat->NumberOfPhaseBiases += 1;
1515              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_BC;
1516              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1517              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1518              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1519                  pbSig.wlIndicator;
1520              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1521                  pbSig.discontinuityCounter;
1522            }
1523            else if (pbSig.type == "1Z") {
1524              int ii = phasebiasSat->NumberOfPhaseBiases;
1525              if (ii >= CLOCKORBIT_NUMBIAS)
1526                break;
1527              phasebiasSat->NumberOfPhaseBiases += 1;
1528              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E1_ABC;
1529              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1530              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1531              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1532                  pbSig.wlIndicator;
1533              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1534                  pbSig.discontinuityCounter;
1535            }
1536            else if (pbSig.type == "5I") {
1537              int ii = phasebiasSat->NumberOfPhaseBiases;
1538              if (ii >= CLOCKORBIT_NUMBIAS)
1539                break;
1540              phasebiasSat->NumberOfPhaseBiases += 1;
1541              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_I;
1542              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1543              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1544              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1545                  pbSig.wlIndicator;
1546              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1547                  pbSig.discontinuityCounter;
1548            }
1549            else if (pbSig.type == "5Q") {
1550              int ii = phasebiasSat->NumberOfPhaseBiases;
1551              if (ii >= CLOCKORBIT_NUMBIAS)
1552                break;
1553              phasebiasSat->NumberOfPhaseBiases += 1;
1554              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_Q;
1555              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1556              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1557              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1558                  pbSig.wlIndicator;
1559              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1560                  pbSig.discontinuityCounter;
1561            }
1562            else if (pbSig.type == "5X") {
1563              int ii = phasebiasSat->NumberOfPhaseBiases;
1564              if (ii >= CLOCKORBIT_NUMBIAS)
1565                break;
1566              phasebiasSat->NumberOfPhaseBiases += 1;
1567              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5A_IQ;
1568              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1569              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1570              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1571                  pbSig.wlIndicator;
1572              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1573                  pbSig.discontinuityCounter;
1574            }
1575            else if (pbSig.type == "7I") {
1576              int ii = phasebiasSat->NumberOfPhaseBiases;
1577              if (ii >= CLOCKORBIT_NUMBIAS)
1578                break;
1579              phasebiasSat->NumberOfPhaseBiases += 1;
1580              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_I;
1581              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1582              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1583              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1584                  pbSig.wlIndicator;
1585              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1586                  pbSig.discontinuityCounter;
1587            }
1588            else if (pbSig.type == "7Q") {
1589              int ii = phasebiasSat->NumberOfPhaseBiases;
1590              if (ii >= CLOCKORBIT_NUMBIAS)
1591                break;
1592              phasebiasSat->NumberOfPhaseBiases += 1;
1593              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_Q;
1594              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1595              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1596              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1597                  pbSig.wlIndicator;
1598              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1599                  pbSig.discontinuityCounter;
1600            }
1601            else if (pbSig.type == "7X") {
1602              int ii = phasebiasSat->NumberOfPhaseBiases;
1603              if (ii >= CLOCKORBIT_NUMBIAS)
1604                break;
1605              phasebiasSat->NumberOfPhaseBiases += 1;
1606              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5B_IQ;
1607              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1608              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1609              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1610                  pbSig.wlIndicator;
1611              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1612                  pbSig.discontinuityCounter;
1613            }
1614            else if (pbSig.type == "8I") {
1615              int ii = phasebiasSat->NumberOfPhaseBiases;
1616              if (ii >= CLOCKORBIT_NUMBIAS)
1617                break;
1618              phasebiasSat->NumberOfPhaseBiases += 1;
1619              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_I;
1620              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1621              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1622              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1623                  pbSig.wlIndicator;
1624              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1625                  pbSig.discontinuityCounter;
1626            }
1627            else if (pbSig.type == "8Q") {
1628              int ii = phasebiasSat->NumberOfPhaseBiases;
1629              if (ii >= CLOCKORBIT_NUMBIAS)
1630                break;
1631              phasebiasSat->NumberOfPhaseBiases += 1;
1632              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_Q;
1633              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1634              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1635              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1636                  pbSig.wlIndicator;
1637              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1638                  pbSig.discontinuityCounter;
1639            }
1640            else if (pbSig.type == "8X") {
1641              int ii = phasebiasSat->NumberOfPhaseBiases;
1642              if (ii >= CLOCKORBIT_NUMBIAS)
1643                break;
1644              phasebiasSat->NumberOfPhaseBiases += 1;
1645              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E5_IQ;
1646              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1647              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1648              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1649                  pbSig.wlIndicator;
1650              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1651                  pbSig.discontinuityCounter;
1652            }
1653            else if (pbSig.type == "6A") {
1654              int ii = phasebiasSat->NumberOfPhaseBiases;
1655              if (ii >= CLOCKORBIT_NUMBIAS)
1656                break;
1657              phasebiasSat->NumberOfPhaseBiases += 1;
1658              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_A;
1659              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1660              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1661              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1662                  pbSig.wlIndicator;
1663              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1664                  pbSig.discontinuityCounter;
1665            }
1666            else if (pbSig.type == "6B") {
1667              int ii = phasebiasSat->NumberOfPhaseBiases;
1668              if (ii >= CLOCKORBIT_NUMBIAS)
1669                break;
1670              phasebiasSat->NumberOfPhaseBiases += 1;
1671              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_B;
1672              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1673              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1674              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1675                  pbSig.wlIndicator;
1676              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1677                  pbSig.discontinuityCounter;
1678            }
1679            else if (pbSig.type == "6C") {
1680              int ii = phasebiasSat->NumberOfPhaseBiases;
1681              if (ii >= CLOCKORBIT_NUMBIAS)
1682                break;
1683              phasebiasSat->NumberOfPhaseBiases += 1;
1684              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_C;
1685              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1686              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1687              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1688                  pbSig.wlIndicator;
1689              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1690                  pbSig.discontinuityCounter;
1691            }
1692            else if (pbSig.type == "6X") {
1693              int ii = phasebiasSat->NumberOfPhaseBiases;
1694              if (ii >= CLOCKORBIT_NUMBIAS)
1695                break;
1696              phasebiasSat->NumberOfPhaseBiases += 1;
1697              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_BC;
1698              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1699              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1700              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1701                  pbSig.wlIndicator;
1702              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1703                  pbSig.discontinuityCounter;
1704            }
1705            else if (pbSig.type == "6Z") {
1706              int ii = phasebiasSat->NumberOfPhaseBiases;
1707              if (ii >= CLOCKORBIT_NUMBIAS)
1708                break;
1709              phasebiasSat->NumberOfPhaseBiases += 1;
1710              phasebiasSat->Biases[ii].Type = CODETYPEGALILEO_E6_ABC;
1711              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1712              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1713              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1714                  pbSig.wlIndicator;
1715              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1716                  pbSig.discontinuityCounter;
1717            }
1718          }
1719        }
1720        if (prn.system() == 'J') {
1721          QListIterator<phaseBiasSignal> it(phaseBiasList);
1722          while (it.hasNext()) {
1723            const phaseBiasSignal &pbSig = it.next();
1724            if (pbSig.type == "1C") {
1725              int ii = phasebiasSat->NumberOfPhaseBiases;
1726              if (ii >= CLOCKORBIT_NUMBIAS)
1727                break;
1728              phasebiasSat->NumberOfPhaseBiases += 1;
1729              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1_CA;
1730              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1731              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1732              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1733                  pbSig.wlIndicator;
1734              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1735                  pbSig.discontinuityCounter;
1736            }
1737            else if (pbSig.type == "1S") {
1738              int ii = phasebiasSat->NumberOfPhaseBiases;
1739              if (ii >= CLOCKORBIT_NUMBIAS)
1740                break;
1741              phasebiasSat->NumberOfPhaseBiases += 1;
1742              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_D;
1743              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1744              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1745              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1746                  pbSig.wlIndicator;
1747              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1748                  pbSig.discontinuityCounter;
1749            }
1750            else if (pbSig.type == "1L") {
1751              int ii = phasebiasSat->NumberOfPhaseBiases;
1752              if (ii >= CLOCKORBIT_NUMBIAS)
1753                break;
1754              phasebiasSat->NumberOfPhaseBiases += 1;
1755              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_P;
1756              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1757              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1758              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1759                  pbSig.wlIndicator;
1760              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1761                  pbSig.discontinuityCounter;
1762            }
1763            else if (pbSig.type == "1X") {
1764              int ii = phasebiasSat->NumberOfPhaseBiases;
1765              if (ii >= CLOCKORBIT_NUMBIAS)
1766                break;
1767              phasebiasSat->NumberOfPhaseBiases += 1;
1768              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L1C_DP;
1769              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1770              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1771              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1772                  pbSig.wlIndicator;
1773              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1774                  pbSig.discontinuityCounter;
1775            }
1776            else if (pbSig.type == "2S") {
1777              int ii = phasebiasSat->NumberOfPhaseBiases;
1778              if (ii >= CLOCKORBIT_NUMBIAS)
1779                break;
1780              phasebiasSat->NumberOfPhaseBiases += 1;
1781              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_M;
1782              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1783              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1784              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1785                  pbSig.wlIndicator;
1786              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1787                  pbSig.discontinuityCounter;
1788            }
1789            else if (pbSig.type == "2L") {
1790              int ii = phasebiasSat->NumberOfPhaseBiases;
1791              if (ii >= CLOCKORBIT_NUMBIAS)
1792                break;
1793              phasebiasSat->NumberOfPhaseBiases += 1;
1794              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_L;
1795              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1796              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1797              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1798                  pbSig.wlIndicator;
1799              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1800                  pbSig.discontinuityCounter;
1801            }
1802            else if (pbSig.type == "2X") {
1803              int ii = phasebiasSat->NumberOfPhaseBiases;
1804              if (ii >= CLOCKORBIT_NUMBIAS)
1805                break;
1806              phasebiasSat->NumberOfPhaseBiases += 1;
1807              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L2C_ML;
1808              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1809              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1810              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1811                  pbSig.wlIndicator;
1812              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1813                  pbSig.discontinuityCounter;
1814            }
1815            else if (pbSig.type == "5I") {
1816              int ii = phasebiasSat->NumberOfPhaseBiases;
1817              if (ii >= CLOCKORBIT_NUMBIAS)
1818                break;
1819              phasebiasSat->NumberOfPhaseBiases += 1;
1820              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_I;
1821              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1822              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1823              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1824                  pbSig.wlIndicator;
1825              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1826                  pbSig.discontinuityCounter;
1827            }
1828            else if (pbSig.type == "5Q") {
1829              int ii = phasebiasSat->NumberOfPhaseBiases;
1830              if (ii >= CLOCKORBIT_NUMBIAS)
1831                break;
1832              phasebiasSat->NumberOfPhaseBiases += 1;
1833              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_Q;
1834              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1835              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1836              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1837                  pbSig.wlIndicator;
1838              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1839                  pbSig.discontinuityCounter;
1840            }
1841            else if (pbSig.type == "5X") {
1842              int ii = phasebiasSat->NumberOfPhaseBiases;
1843              if (ii >= CLOCKORBIT_NUMBIAS)
1844                break;
1845              phasebiasSat->NumberOfPhaseBiases += 1;
1846              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_L5_IQ;
1847              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1848              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1849              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1850                  pbSig.wlIndicator;
1851              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1852                  pbSig.discontinuityCounter;
1853            }
1854            else if (pbSig.type == "6S") {
1855              int ii = phasebiasSat->NumberOfPhaseBiases;
1856              if (ii >= CLOCKORBIT_NUMBIAS)
1857                break;
1858              phasebiasSat->NumberOfPhaseBiases += 1;
1859              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_LEX_S;
1860              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1861              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1862              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1863                  pbSig.wlIndicator;
1864              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1865                  pbSig.discontinuityCounter;
1866            }
1867            else if (pbSig.type == "6L") {
1868              int ii = phasebiasSat->NumberOfPhaseBiases;
1869              if (ii >= CLOCKORBIT_NUMBIAS)
1870                break;
1871              phasebiasSat->NumberOfPhaseBiases += 1;
1872              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_LEX_L;
1873              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1874              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1875              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1876                  pbSig.wlIndicator;
1877              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1878                  pbSig.discontinuityCounter;
1879            }
1880            else if (pbSig.type == "6X") {
1881              int ii = phasebiasSat->NumberOfPhaseBiases;
1882              if (ii >= CLOCKORBIT_NUMBIAS)
1883                break;
1884              phasebiasSat->NumberOfPhaseBiases += 1;
1885              phasebiasSat->Biases[ii].Type = CODETYPEQZSS_LEX_SL;
1886              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1887              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1888              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1889                  pbSig.wlIndicator;
1890              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1891                  pbSig.discontinuityCounter;
1892            }
1893          }
1894        }
1895        if (prn.system() == 'S') {
1896          QListIterator<phaseBiasSignal> it(phaseBiasList);
1897          while (it.hasNext()) {
1898            const phaseBiasSignal &pbSig = it.next();
1899            if (pbSig.type == "1C") {
1900              int ii = phasebiasSat->NumberOfPhaseBiases;
1901              if (ii >= CLOCKORBIT_NUMBIAS)
1902                break;
1903              phasebiasSat->NumberOfPhaseBiases += 1;
1904              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L1_CA;
1905              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1906              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1907              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1908                  pbSig.wlIndicator;
1909              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1910                  pbSig.discontinuityCounter;
1911            }
1912            else if (pbSig.type == "5I") {
1913              int ii = phasebiasSat->NumberOfPhaseBiases;
1914              if (ii >= CLOCKORBIT_NUMBIAS)
1915                break;
1916              phasebiasSat->NumberOfPhaseBiases += 1;
1917              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_I;
1918              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1919              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1920              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1921                  pbSig.wlIndicator;
1922              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1923                  pbSig.discontinuityCounter;
1924            }
1925            else if (pbSig.type == "5Q") {
1926              int ii = phasebiasSat->NumberOfPhaseBiases;
1927              if (ii >= CLOCKORBIT_NUMBIAS)
1928                break;
1929              phasebiasSat->NumberOfPhaseBiases += 1;
1930              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_Q;
1931              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1932              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1933              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1934                  pbSig.wlIndicator;
1935              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1936                  pbSig.discontinuityCounter;
1937            }
1938            else if (pbSig.type == "5X") {
1939              int ii = phasebiasSat->NumberOfPhaseBiases;
1940              if (ii >= CLOCKORBIT_NUMBIAS)
1941                break;
1942              phasebiasSat->NumberOfPhaseBiases += 1;
1943              phasebiasSat->Biases[ii].Type = CODETYPE_SBAS_L5_IQ;
1944              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1945              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1946              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1947                  pbSig.wlIndicator;
1948              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1949                  pbSig.discontinuityCounter;
1950            }
1951          }
1952        }
1953        if (prn.system() == 'C') {
1954          QListIterator<phaseBiasSignal> it(phaseBiasList);
1955          while (it.hasNext()) {
1956            const phaseBiasSignal &pbSig = it.next();
1957            if (pbSig.type == "2I") {
1958              int ii = phasebiasSat->NumberOfPhaseBiases;
1959              if (ii >= CLOCKORBIT_NUMBIAS)
1960                break;
1961              phasebiasSat->NumberOfPhaseBiases += 1;
1962              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_I;
1963              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1964              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1965              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1966                  pbSig.wlIndicator;
1967              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1968                  pbSig.discontinuityCounter;
1969            }
1970            else if (pbSig.type == "2Q") {
1971              int ii = phasebiasSat->NumberOfPhaseBiases;
1972              if (ii >= CLOCKORBIT_NUMBIAS)
1973                break;
1974              phasebiasSat->NumberOfPhaseBiases += 1;
1975              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_Q;
1976              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1977              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1978              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1979                  pbSig.wlIndicator;
1980              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1981                  pbSig.discontinuityCounter;
1982            }
1983            else if (pbSig.type == "2X") {
1984              int ii = phasebiasSat->NumberOfPhaseBiases;
1985              if (ii >= CLOCKORBIT_NUMBIAS)
1986                break;
1987              phasebiasSat->NumberOfPhaseBiases += 1;
1988              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B1_IQ;
1989              phasebiasSat->Biases[ii].Bias = pbSig.bias;
1990              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
1991              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
1992                  pbSig.wlIndicator;
1993              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
1994                  pbSig.discontinuityCounter;
1995            }
1996            else if (pbSig.type == "6I") {
1997              int ii = phasebiasSat->NumberOfPhaseBiases;
1998              if (ii >= CLOCKORBIT_NUMBIAS)
1999                break;
2000              phasebiasSat->NumberOfPhaseBiases += 1;
2001              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_I;
2002              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2003              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2004              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2005                  pbSig.wlIndicator;
2006              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2007                  pbSig.discontinuityCounter;
2008            }
2009            else if (pbSig.type == "6Q") {
2010              int ii = phasebiasSat->NumberOfPhaseBiases;
2011              if (ii >= CLOCKORBIT_NUMBIAS)
2012                break;
2013              phasebiasSat->NumberOfPhaseBiases += 1;
2014              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_Q;
2015              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2016              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2017              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2018                  pbSig.wlIndicator;
2019              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2020                  pbSig.discontinuityCounter;
2021            }
2022            else if (pbSig.type == "6X") {
2023              int ii = phasebiasSat->NumberOfPhaseBiases;
2024              if (ii >= CLOCKORBIT_NUMBIAS)
2025                break;
2026              phasebiasSat->NumberOfPhaseBiases += 1;
2027              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B3_IQ;
2028              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2029              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2030              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2031                  pbSig.wlIndicator;
2032              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2033                  pbSig.discontinuityCounter;
2034            }
2035            else if (pbSig.type == "7I") {
2036              int ii = phasebiasSat->NumberOfPhaseBiases;
2037              if (ii >= CLOCKORBIT_NUMBIAS)
2038                break;
2039              phasebiasSat->NumberOfPhaseBiases += 1;
2040              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_I;
2041              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2042              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2043              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2044                  pbSig.wlIndicator;
2045              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2046                  pbSig.discontinuityCounter;
2047            }
2048            else if (pbSig.type == "7Q") {
2049              int ii = phasebiasSat->NumberOfPhaseBiases;
2050              if (ii >= CLOCKORBIT_NUMBIAS)
2051                break;
2052              phasebiasSat->NumberOfPhaseBiases += 1;
2053              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_Q;
2054              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2055              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2056              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2057                  pbSig.wlIndicator;
2058              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2059                  pbSig.discontinuityCounter;
2060            }
2061            else if (pbSig.type == "7X") {
2062              int ii = phasebiasSat->NumberOfPhaseBiases;
2063              if (ii >= CLOCKORBIT_NUMBIAS)
2064                break;
2065              phasebiasSat->NumberOfPhaseBiases += 1;
2066              phasebiasSat->Biases[ii].Type = CODETYPE_BDS_B2_IQ;
2067              phasebiasSat->Biases[ii].Bias = pbSig.bias;
2068              phasebiasSat->Biases[ii].SignalIntegerIndicator = pbSig.integerIndicator;
2069              phasebiasSat->Biases[ii].SignalsWideLaneIntegerIndicator =
2070                  pbSig.wlIndicator;
2071              phasebiasSat->Biases[ii].SignalDiscontinuityCounter =
2072                  pbSig.discontinuityCounter;
2073            }
2074          }
2075        }
2076      }
2077    }
2078  }
2079
2080  QByteArray hlpBufferCo;
2081
2082  // Orbit and Clock Corrections together
2083  // ------------------------------------
2084  if (_samplRtcmEphCorr == 0.0) {
2085    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2086        || co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2087        || co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2088        || co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2089        || co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2090        || co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2091      char obuffer[CLOCKORBIT_BUFFERSIZE];
2092      int len = MakeClockOrbit(&co, COTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2093      if (len > 0) {
2094        hlpBufferCo = QByteArray(obuffer, len);
2095      }
2096    }
2097  }
2098
2099  // Orbit and Clock Corrections separately
2100  // --------------------------------------
2101  else {
2102    if (co.NumberOfSat[CLOCKORBIT_SATGPS] > 0) {
2103      char obuffer[CLOCKORBIT_BUFFERSIZE];
2104      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2105        co.UpdateInterval = ephUpdInd;
2106        int len1 = MakeClockOrbit(&co, COTYPE_GPSORBIT, 1, obuffer,
2107            sizeof(obuffer));
2108        co.UpdateInterval = clkUpdInd;
2109        if (len1 > 0) {
2110          hlpBufferCo += QByteArray(obuffer, len1);
2111        }
2112      }
2113      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) ? 1 : 0;
2114      int len2 = MakeClockOrbit(&co, COTYPE_GPSCLOCK, mmsg, obuffer,
2115          sizeof(obuffer));
2116      if (len2 > 0) {
2117        hlpBufferCo += QByteArray(obuffer, len2);
2118      }
2119    }
2120    if (co.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0) {
2121      char obuffer[CLOCKORBIT_BUFFERSIZE];
2122      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2123        co.UpdateInterval = ephUpdInd;
2124        int len1 = MakeClockOrbit(&co, COTYPE_GLONASSORBIT, 1, obuffer,
2125            sizeof(obuffer));
2126        co.UpdateInterval = clkUpdInd;
2127        if (len1 > 0) {
2128          hlpBufferCo += QByteArray(obuffer, len1);
2129        }
2130      }
2131      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) ? 1 : 0;
2132      int len2 = MakeClockOrbit(&co, COTYPE_GLONASSCLOCK, mmsg, obuffer,
2133          sizeof(obuffer));
2134      if (len2 > 0) {
2135        hlpBufferCo += QByteArray(obuffer, len2);
2136      }
2137    }
2138    if (co.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0) {
2139      char obuffer[CLOCKORBIT_BUFFERSIZE];
2140      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2141        co.UpdateInterval = ephUpdInd;
2142        int len1 = MakeClockOrbit(&co, COTYPE_GALILEOORBIT, 1, obuffer,
2143            sizeof(obuffer));
2144        co.UpdateInterval = clkUpdInd;
2145        if (len1 > 0) {
2146          hlpBufferCo += QByteArray(obuffer, len1);
2147        }
2148      }
2149      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) ? 1 : 0;
2150      int len2 = MakeClockOrbit(&co, COTYPE_GALILEOCLOCK, mmsg, obuffer,
2151          sizeof(obuffer));
2152      if (len2 > 0) {
2153        hlpBufferCo += QByteArray(obuffer, len2);
2154      }
2155    }
2156    if (co.NumberOfSat[CLOCKORBIT_SATQZSS] > 0) {
2157      char obuffer[CLOCKORBIT_BUFFERSIZE];
2158      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2159        co.UpdateInterval = ephUpdInd;
2160        int len1 = MakeClockOrbit(&co, COTYPE_QZSSORBIT, 1, obuffer,
2161            sizeof(obuffer));
2162        co.UpdateInterval = clkUpdInd;
2163        if (len1 > 0) {
2164          hlpBufferCo += QByteArray(obuffer, len1);
2165        }
2166      }
2167      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) ? 1 : 0;
2168      int len2 = MakeClockOrbit(&co, COTYPE_QZSSCLOCK, mmsg, obuffer,
2169          sizeof(obuffer));
2170      if (len2 > 0) {
2171        hlpBufferCo += QByteArray(obuffer, len2);
2172      }
2173    }
2174    if (co.NumberOfSat[CLOCKORBIT_SATSBAS] > 0) {
2175      char obuffer[CLOCKORBIT_BUFFERSIZE];
2176      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2177        co.UpdateInterval = ephUpdInd;
2178        int len1 = MakeClockOrbit(&co, COTYPE_SBASORBIT, 1, obuffer,
2179            sizeof(obuffer));
2180        co.UpdateInterval = clkUpdInd;
2181        if (len1 > 0) {
2182          hlpBufferCo += QByteArray(obuffer, len1);
2183        }
2184      }
2185      int mmsg = (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) ? 1 : 0;
2186      int len2 = MakeClockOrbit(&co, COTYPE_SBASCLOCK, mmsg, obuffer,
2187          sizeof(obuffer));
2188      if (len2 > 0) {
2189        hlpBufferCo += QByteArray(obuffer, len2);
2190      }
2191    }
2192    if (co.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2193      char obuffer[CLOCKORBIT_BUFFERSIZE];
2194      if (fmod(epoTime.gpssec(), _samplRtcmEphCorr) == 0.0) {
2195        co.UpdateInterval = ephUpdInd;
2196        int len1 = MakeClockOrbit(&co, COTYPE_BDSORBIT, 1, obuffer,
2197            sizeof(obuffer));
2198        co.UpdateInterval = clkUpdInd;
2199        if (len1 > 0) {
2200          hlpBufferCo += QByteArray(obuffer, len1);
2201        }
2202      }
2203      int len2 = MakeClockOrbit(&co, COTYPE_BDSCLOCK, 0, obuffer,
2204          sizeof(obuffer));
2205      if (len2 > 0) {
2206        hlpBufferCo += QByteArray(obuffer, len2);
2207      }
2208    }
2209  }
2210
2211  // Code Biases
2212  // -----------
2213  QByteArray hlpBufferBias;
2214  if (bias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2215      || bias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2216      || bias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2217      || bias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2218      || bias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2219      || bias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2220    char obuffer[CLOCKORBIT_BUFFERSIZE];
2221    int len = MakeCodeBias(&bias, BTYPE_AUTO, 0, obuffer, sizeof(obuffer));
2222    if (len > 0) {
2223      hlpBufferBias = QByteArray(obuffer, len);
2224    }
2225  }
2226
2227  // Phase Biases
2228  // ------------
2229  QByteArray hlpBufferPhaseBias;
2230  if (phasebias.NumberOfSat[CLOCKORBIT_SATGPS] > 0
2231      || phasebias.NumberOfSat[CLOCKORBIT_SATGLONASS] > 0
2232      || phasebias.NumberOfSat[CLOCKORBIT_SATGALILEO] > 0
2233      || phasebias.NumberOfSat[CLOCKORBIT_SATQZSS] > 0
2234      || phasebias.NumberOfSat[CLOCKORBIT_SATSBAS] > 0
2235      || phasebias.NumberOfSat[CLOCKORBIT_SATBDS] > 0) {
2236    char obuffer[CLOCKORBIT_BUFFERSIZE];
2237    int len = MakePhaseBias(&phasebias, PBTYPE_AUTO, 0, obuffer,
2238        sizeof(obuffer));
2239    if (len > 0) {
2240      hlpBufferPhaseBias = QByteArray(obuffer, len);
2241    }
2242  }
2243
2244  // VTEC
2245  // ----
2246  QByteArray hlpBufferVtec;
2247  if (vtec.NumLayers > 0) {
2248    char obuffer[CLOCKORBIT_BUFFERSIZE];
2249    int len = MakeVTEC(&vtec, 0, obuffer, sizeof(obuffer));
2250    if (len > 0) {
2251      hlpBufferVtec = QByteArray(obuffer, len);
2252    }
2253  }
2254
2255  _outBuffer += hlpBufferCo + hlpBufferBias + hlpBufferPhaseBias
2256      + hlpBufferVtec;
2257}
2258
2259//
2260////////////////////////////////////////////////////////////////////////////
2261void bncRtnetUploadCaster::processSatellite(const t_eph* eph, int GPSweek,
2262    double GPSweeks, const QString& prn, const ColumnVector& rtnAPC,
2263    double rtnUra, const ColumnVector& rtnClk, const ColumnVector& rtnVel,
2264    const ColumnVector& rtnCoM, const ColumnVector& rtnClkSig,
2265    struct ClockOrbit::SatData* sd, QString& outLine) {
2266
2267  // Broadcast Position and Velocity
2268  // -------------------------------
2269  ColumnVector xB(7);
2270  ColumnVector vB(3);
2271  eph->getCrd(bncTime(GPSweek, GPSweeks), xB, vB, false);
2272
2273  // Precise Position
2274  // ----------------
2275  ColumnVector xP = _CoM ? rtnCoM : rtnAPC;
2276
2277  double dc = 0.0;
2278  if (_crdTrafo != "IGS14") {
2279    crdTrafo(GPSweek, xP, dc);
2280  }
2281
2282  // Difference in xyz
2283  // -----------------
2284  ColumnVector dx = xB.Rows(1, 3) - xP;
2285  ColumnVector dv = vB - rtnVel;
2286
2287  // Difference in RSW
2288  // -----------------
2289  ColumnVector rsw(3);
2290  XYZ_to_RSW(xB.Rows(1, 3), vB, dx, rsw);
2291
2292  ColumnVector dotRsw(3);
2293  XYZ_to_RSW(xB.Rows(1, 3), vB, dv, dotRsw);
2294
2295  // Clock Correction
2296  // ----------------
2297  double dClkA0 = rtnClk(1) - (xB(4) - dc) * t_CST::c;
2298  double dClkA1 = 0.0;
2299  double dClkA2 = 0.0;
2300  if (rtnClk(2)) {
2301    dClkA0 = rtnClk(1) - (xB(5) - dc) * t_CST::c;
2302    dClkA1 = rtnClk(2) -  xB(6) * t_CST::c;
2303  }
2304  if (rtnClk(3)) {
2305    dClkA2 = rtnClk(3) - xB(7) * t_CST::c;
2306  }
2307
2308  if (sd) {
2309    sd->ID = prn.mid(1).toInt();
2310    sd->IOD = eph->IOD();
2311    sd->Clock.DeltaA0 = dClkA0;
2312    sd->Clock.DeltaA1 = dClkA1;
2313    sd->Clock.DeltaA2 = dClkA2;
2314    sd->UserRangeAccuracy = rtnUra;
2315    sd->Orbit.DeltaRadial     = rsw(1);
2316    sd->Orbit.DeltaAlongTrack = rsw(2);
2317    sd->Orbit.DeltaCrossTrack = rsw(3);
2318    sd->Orbit.DotDeltaRadial     = dotRsw(1);
2319    sd->Orbit.DotDeltaAlongTrack = dotRsw(2);
2320    sd->Orbit.DotDeltaCrossTrack = dotRsw(3);
2321  }
2322
2323  outLine.sprintf("%d %.1f %s  %u  %10.3f %8.3f %8.3f  %8.3f %8.3f %8.3f\n", GPSweek,
2324      GPSweeks, eph->prn().toString().c_str(), eph->IOD(), dClkA0, dClkA1, dClkA2,
2325      rsw(1), rsw(2), rsw(3));
2326
2327  // RTNET full clock for RINEX and SP3 file
2328  // ---------------------------------------
2329  double relativity = -2.0 * DotProduct(xP, rtnVel) / t_CST::c;
2330  double clkRnx     = (rtnClk[0] - relativity) / t_CST::c;  // [s]
2331  double clkRnxRate = rtnClk[1] / t_CST::c;                 // [s/s = -]
2332  double clkRnxAcc  = rtnClk[2] / t_CST::c;                 // [s/s² ) -/s]
2333
2334  if (_rnx) {
2335    double clkRnxSig, clkRnxRateSig, clkRnxAccSig;
2336    int s = rtnClkSig.size();
2337    switch (s) {
2338      case 1:
2339        clkRnxSig     = rtnClkSig[0] / t_CST::c;    // [s]
2340        clkRnxRateSig = 0.0;                        // [s/s = -]
2341        clkRnxAccSig  = 0.0;                        // [s/s² ) -/s]
2342        break;
2343      case 2:
2344        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2345        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2346        clkRnxAccSig  = 0.0;                         // [s/s² ) -/s]
2347        break;
2348      case 3:
2349        clkRnxSig     = rtnClkSig[0] / t_CST::c;     // [s]
2350        clkRnxRateSig = rtnClkSig[1] / t_CST::c;     // [s/s = -]
2351        clkRnxAccSig  = rtnClkSig[2] / t_CST::c;     // [s/s² ) -/s]
2352        break;
2353    }
2354    _rnx->write(GPSweek, GPSweeks, prn, clkRnx, clkRnxRate, clkRnxAcc,
2355                clkRnxSig, clkRnxRateSig, clkRnxAccSig);
2356  }
2357  if (_sp3) {
2358    _sp3->write(GPSweek, GPSweeks, prn, rtnCoM, clkRnx, rtnVel, clkRnxRate);
2359  }
2360}
2361
2362// Transform Coordinates
2363////////////////////////////////////////////////////////////////////////////
2364void bncRtnetUploadCaster::crdTrafo(int GPSWeek, ColumnVector& xyz,
2365    double& dc) {
2366
2367  // Current epoch minus 2000.0 in years
2368  // ------------------------------------
2369  double dt = (GPSWeek - (1042.0 + 6.0 / 7.0)) / 365.2422 * 7.0 + 2000.0 - _t0;
2370
2371  ColumnVector dx(3);
2372
2373  dx(1) = _dx + dt * _dxr;
2374  dx(2) = _dy + dt * _dyr;
2375  dx(3) = _dz + dt * _dzr;
2376
2377  static const double arcSec = 180.0 * 3600.0 / M_PI;
2378
2379  double ox = (_ox + dt * _oxr) / arcSec;
2380  double oy = (_oy + dt * _oyr) / arcSec;
2381  double oz = (_oz + dt * _ozr) / arcSec;
2382
2383  double sc = 1.0 + _sc * 1e-9 + dt * _scr * 1e-9;
2384
2385  // Specify approximate center of area
2386  // ----------------------------------
2387  ColumnVector meanSta(3);
2388
2389  if (_crdTrafo == "ETRF2000") {
2390    meanSta(1) = 3661090.0;
2391    meanSta(2) = 845230.0;
2392    meanSta(3) = 5136850.0;
2393  }
2394  else if (_crdTrafo == "GDA2020") {
2395    meanSta(1) = -4052050.0;
2396    meanSta(2) = 4212840.0;
2397    meanSta(3) = -2545110.0;
2398  }
2399  else if (_crdTrafo == "SIRGAS2000") {
2400    meanSta(1) = 3740860.0;
2401    meanSta(2) = -4964290.0;
2402    meanSta(3) = -1425420.0;
2403  }
2404  else if (_crdTrafo == "DREF91") {
2405    meanSta(1) = 3959579.0;
2406    meanSta(2) = 721719.0;
2407    meanSta(3) = 4931539.0;
2408  }
2409  else if (_crdTrafo == "Custom") {
2410    meanSta(1) = 0.0; // TODO
2411    meanSta(2) = 0.0; // TODO
2412    meanSta(3) = 0.0; // TODO
2413  }
2414
2415  // Clock correction proportional to topocentric distance to satellites
2416  // -------------------------------------------------------------------
2417  double rho = (xyz - meanSta).norm_Frobenius();
2418  dc = rho * (sc - 1.0) / sc / t_CST::c;
2419
2420  Matrix rMat(3, 3);
2421  rMat(1, 1) = 1.0;
2422  rMat(1, 2) = -oz;
2423  rMat(1, 3) = oy;
2424  rMat(2, 1) = oz;
2425  rMat(2, 2) = 1.0;
2426  rMat(2, 3) = -ox;
2427  rMat(3, 1) = -oy;
2428  rMat(3, 2) = ox;
2429  rMat(3, 3) = 1.0;
2430
2431  xyz = sc * rMat * xyz + dx;
2432}
2433
2434int bncRtnetUploadCaster::determineUpdateInd(double samplingRate) {
2435
2436  if (samplingRate == 10.0) {
2437    return 3;
2438  }
2439  else if (samplingRate == 15.0) {
2440    return 4;
2441  }
2442  else if (samplingRate == 30.0) {
2443    return 5;
2444  }
2445  else if (samplingRate == 60.0) {
2446    return 6;
2447  }
2448  else if (samplingRate == 120.0) {
2449    return 7;
2450  }
2451  else if (samplingRate == 240.0) {
2452    return 8;
2453  }
2454  else if (samplingRate == 300.0) {
2455    return 9;
2456  }
2457  else if (samplingRate == 600.0) {
2458    return 10;
2459  }
2460  else if (samplingRate == 900.0) {
2461    return 11;
2462  }
2463  else if (samplingRate == 1800.0) {
2464    return 12;
2465  }
2466  else if (samplingRate == 3600.0) {
2467    return 13;
2468  }
2469  else if (samplingRate == 7200.0) {
2470    return 14;
2471  }
2472  else if (samplingRate == 10800.0) {
2473    return 15;
2474  }
2475  return 2;  // default
2476}
Note: See TracBrowser for help on using the repository browser.