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

Last change on this file since 8570 was 8570, checked in by stuerze, 17 months ago

minor changes

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