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

Last change on this file since 6879 was 6879, checked in by stuerze, 9 years ago

SSR VTEC: consideration of the fact that max degree and order have to be included

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