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

Last change on this file since 8016 was 8016, checked in by stuerze, 2 years ago

minor changes

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