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

Last change on this file since 8740 was 8740, checked in by stuerze, 13 months ago

some missing GLONASS phase biases are added within rtnet2ssr transition for ssr upload

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