source: ntrip/trunk/BNC/src/upload/bncrtnetuploadcaster.cpp @ 7781

Last change on this file since 7781 was 7781, checked in by stuerze, 4 years ago

small bugs regarding BDS OBS types fixed

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