Changeset 11137 in ntrip
- Timestamp:
- Oct 28, 2026, 9:48:01 PM (9 hours ago)
- Location:
- trunk/BNC
- Files:
-
- 31 edited
-
CHANGELOG.md (modified) (1 diff)
-
src/PPP/pppEphPool.cpp (modified) (1 diff)
-
src/bncephuser.cpp (modified) (3 diffs)
-
src/bncephuser.h (modified) (3 diffs)
-
src/bnchelp.html (modified) (3 diffs)
-
src/ephemeris.cpp (modified) (1 diff)
-
src/ephemeris.h (modified) (2 diffs)
-
src/src.pro (modified) (1 diff)
-
src/ssrQc.cpp (modified) (10 diffs)
-
src/ssrQc.h (modified) (3 diffs)
-
src/upload/bncephuploadcaster.cpp (modified) (1 diff)
-
tests/README.md (modified) (2 diffs)
-
tests/cases/combi_multi/expected/BKG0MGXRTS_20262750000_01D_05S_CLK.CLK.gz (modified) ( previous)
-
tests/cases/combi_multi/expected/BKG0MGXRTS_20262750000_01D_30S_ORB.SP3.gz (modified) ( previous)
-
tests/cases/combi_multi/expected/Combi.log.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA00BKG1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA00CHC1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA00CNE1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA00GMV0_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA00NRC0_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA01GFZ1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc/expected/SSRA01SHA1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA00BKG1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA00CHC1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA00CNE1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA00GMV0_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA00NRC0_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA01GFZ1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_bias/expected/SSRA01SHA1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_select/expected/SSRA00CNE1_S_20262750000_01D_QC.txt.gz (modified) ( previous)
-
tests/cases/ssr_qc_select/expected/SSRA00GMV0_S_20262750000_01D_QC.txt.gz (modified) ( previous)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/CHANGELOG.md
r11136 r11137 23 23 - ADDED: Option 'File per stream' (key ephFilePerStation) in the RINEX Ephemeris panel: one RINEX navigation file per stream, named after the stream like the observation files, each with all ephemerides of its stream; by default still one file with each ephemeris once 24 24 - ADDED: PPP option 'Ephemeris stream' (key PPP/ephMount): real-time PPP uses the Broadcast Ephemeris of the given stream(s) only, e.g. BCEP00BKG0, not those of the observation streams; empty: all streams as before 25 - FIXED: GPS and QZSS uploads within the curve fit interval (cutover; TOC some 16 s earlier than that of the data set replaced, e.g. 01:59:44 instead of 02:00:00) were ignored as not newer until the next regular data set, in RINEX navigation files, ephemeris upload (BCEP), PPP and combination; corrections of ACs referring to such an upload were not used for up to 2 hours. Data sets received before (e.g. from a slower stream) are ignored now explicitly 26 - ADDED: GPS/QZSS ephemeris check: data sets with IODE different from the 8 LSBs of IODC (assembled from subframes of two uploads) are rejected 27 - FIXED: Ephemeris upload: the periods of validity of the uploaded data sets were not applied (logical or instead of and), so a data set was uploaded as long as no newer one came, e.g. a Galileo data set 32 hours after its TOC 28 - CHANGED: SSR QC: the IOD of the corrections is looked up among the last 30 data sets of a satellite instead of the last two (false 'IOD of no received broadcast ephemeris' for Galileo and GLONASS); new report lines for IODs received from the ephemeris stream(s) only later (with the largest delay) and for corrections referring to a broadcast ephemeris outside its validity 25 29 - ADDED: Regression test suite ('tests'): example configurations and short raw captures replayed through BNC and compared with reference outputs 26 30 - ADDED: macOS packaging script -
trunk/BNC/src/PPP/pppEphPool.cpp
r11047 r11137 97 97 ///////////////////////////////////////////////////////////////////////////// 98 98 void t_pppEphPool::t_satEphPool::putEphemeris(unsigned maxQueueSize, t_eph* eph) { 99 // data set received before (e.g. from another stream after a newer one) 100 for (unsigned ii = 0; ii < _ephs.size(); ii++) { 101 if (_ephs[ii]->sameDataSet(eph)) { 102 delete eph; 103 return; 104 } 105 } 99 106 if (_ephs.empty() || eph->isNewerThan(_ephs.front())) { 100 107 _ephs.push_front(eph); -
trunk/BNC/src/bncephuser.cpp
r11057 r11137 48 48 // Constructor 49 49 //////////////////////////////////////////////////////////////////////////// 50 bncEphUser::bncEphUser(bool connectSlots) { 50 bncEphUser::bncEphUser(bool connectSlots, unsigned maxQueueSize) : _maxQueueSize(maxQueueSize) { 51 51 if (connectSlots) { 52 52 connect(BNC_CORE, SIGNAL(newGPSEph(t_ephGPS)), … … 148 148 149 149 QString prn(newEph->prn().toInternalString().c_str()); 150 151 // data set received before, e.g. from a slower stream after a newer one 152 if (_eph.contains(prn)) { 153 const deque<t_eph*>& qq = _eph[prn]; 154 for (unsigned ii = 0; ii < qq.size(); ii++) { 155 if (qq[ii]->sameDataSet(eph)) { 156 delete newEph; 157 return failure; 158 } 159 } 160 } 150 161 151 162 const t_eph* ephOld = ephLast(prn); … … 224 235 if (eph->isUnhealthy()) { 225 236 eph->setCheckState(t_eph::unhealthy); 237 return; 238 } 239 240 // GPS/QZSS: IODE and IODC of the same upload 241 // ------------------------------------------- 242 const t_ephGPS* ephGPS = dynamic_cast<const t_ephGPS*>(eph); 243 if (ephGPS && !ephGPS->iodeIodcConsistent()) { 244 eph->setCheckState(t_eph::bad); 226 245 return; 227 246 } -
trunk/BNC/src/bncephuser.h
r11047 r11137 46 46 47 47 public: 48 bncEphUser(bool connectSlots); 48 bncEphUser(bool connectSlots, unsigned maxQueueSize = 6); 49 49 virtual ~bncEphUser(); 50 50 … … 72 72 } 73 73 74 // latest data set of the satellite with this IOD 75 t_eph* ephWithIOD(const QString& prn, unsigned iod) { 76 if (_eph.contains(prn)) { 77 const std::deque<t_eph*>& qq = _eph[prn]; 78 for (int ii = int(qq.size()) - 1; ii >= 0; ii--) { 79 if (qq[ii]->IOD() == iod) { 80 return qq[ii]; 81 } 82 } 83 } 84 return 0; 85 } 86 74 87 const QList<QString> prnList() {return _eph.keys();} 75 88 … … 80 93 void checkEphemeris(t_eph* eph, bool realTime); 81 94 QMutex _mutex; 82 static constunsigned _maxQueueSize= 6;95 unsigned _maxQueueSize; // data sets kept per satellite 83 96 QMap<QString, std::deque<t_eph*> > _eph; 84 97 }; -
trunk/BNC/src/bnchelp.html
r11136 r11137 3453 3453 or 'OUTDATED EPHEMERIS' in the logfile. 3454 3454 </p> 3455 <p> 3456 A data set is taken as new if its Time of Clock (TOC) is later than that of the latest data set of the 3457 satellite. An upload of a GPS or QZSS satellite within the curve fit interval (cutover) gets a TOC slightly 3458 earlier than that of the data set it replaces, off the regular grid (e.g. 01:59:44 instead of 02:00:00); such a 3459 data set with a different IOD and a TOC up to 10 minutes earlier is taken as new as well, as the satellite 3460 broadcasts it from then on and the corrections of the Analysis Centers refer to it. A data set received before, 3461 e.g. from a slower stream after a newer one, is ignored. A GPS or QZSS data set whose IODE differs from the 8 least 3462 significant bits of its IODC, i.e. assembled from subframes of two uploads, is ignored as wrong. 3463 </p> 3455 3464 3456 3465 <p> … … 5156 5165 <li>satellites with a healthy, current broadcast ephemeris without orbit corrections, clock corrections, code 5157 5166 biases or phase biases (the latter two only if the stream provides them for the system),</li> 5158 <li>orbit and clock corrections referring to an IOD of no received broadcast ephemeris, to an unhealthy 5159 broadcast ephemeris, or to a satellite without broadcast ephemeris (number of corrections in brackets; not 5160 checked during the first 2 minutes, while the broadcast ephemerides are received),</li> 5167 <li>orbit and clock corrections referring to an IOD of no received broadcast ephemeris, to an IOD received from 5168 the ephemeris stream(s) only later (up to 5 minutes, with the largest delay; the Analysis Center switched to a 5169 new data set before the ephemeris stream delivered it), to a broadcast ephemeris outside its validity (see section 5170 2.16 'Upload Ephemeris' for the periods of validity), to an unhealthy broadcast ephemeris, or to a satellite 5171 without broadcast ephemeris (number of corrections in brackets; not checked during the first 2 minutes, while 5172 the broadcast ephemerides are received). The IOD is looked up among the last 30 data sets of the satellite, 5173 as Galileo e.g. broadcasts a new data set every 10 minutes and Analysis Centers keep one for up to an 5174 hour,</li> 5161 5175 <li>the code bias signals provided, satellites without code biases of the reference signals (default GPS C1W/C2W, 5162 5176 GLONASS C1P/C2P, Galileo C1C/C5Q, BDS C2I/C6I, QZSS C1C/C2L, SBAS C1C/C5Q; as in the combination, see option … … 9784 9798 <li>SBAS ephemeris will be interpreted as outdated and ignored when dt > 600.0 or dt < -600.0.</li> 9785 9799 <li>QZSS ephemeris will be interpreted as outdated and ignored when dt > 7200.0 or dt < -3600.0.</li> 9786 <li>NavIC ephemeris will be interpreted as outdated and ignored when fabs(dt > 86400.0 ).</li>9800 <li>NavIC ephemeris will be interpreted as outdated and ignored when fabs(dt) > 86400.0.</li> 9787 9801 </ul> 9788 9802 A note 'OUTDATED EPHEMERIS' will be given in the logfile and the data will be disregarded when necessary. -
trunk/BNC/src/ephemeris.cpp
r11057 r11137 26 26 _clkCorr = 0; 27 27 } 28 29 // Is this data set newer than eph (the latest one received)? 30 // Usually its TOC is later. An upload of a GPS or QZSS satellite within the 31 // curve fit interval (cutover) gets a TOC slightly earlier than that of the 32 // data set it replaces (e.g. 01:59:44 instead of 02:00:00, i.e. off the regular 33 // grid), and a different IOD; the new upload is broadcast from then on and 34 // the corrections of the ACs refer to it. 35 //////////////////////////////////////////////////////////////////////////// 36 bool t_eph::isNewerThan(const t_eph* eph) const { 37 if (eph->_TOC < _TOC) { 38 return true; 39 } 40 const double MAX_CUTOVER_SHIFT = 600.0; // observed: 16 s, 32 s 41 if ((system() == GPS || system() == QZSS) && system() == eph->system() && 42 IOD() != eph->IOD() && eph->_TOC - _TOC <= MAX_CUTOVER_SHIFT) { 43 return true; 44 } 45 return false; 46 } 47 28 48 // Destructor 29 49 //////////////////////////////////////////////////////////////////////////// -
trunk/BNC/src/ephemeris.h
r10954 r11137 29 29 virtual int slotNum() const {return 0;} 30 30 bncTime TOC() const {return _TOC;} 31 bool isNewerThan(const t_eph* eph) const {return earlierTime(eph, this);} 31 bool isNewerThan(const t_eph* eph) const; 32 bool sameDataSet(const t_eph* eph) const {return _TOC == eph->_TOC && IOD() == eph->IOD();} 32 33 void setCheckState(e_checkState checkState) {_checkState = checkState;} 33 34 e_checkState checkState() const {return _checkState;} … … 146 147 virtual QString toString(double version) const; 147 148 virtual unsigned int IOD() const { return static_cast<unsigned int>(_IODE); } 149 // GPS/QZSS: IODE equals the 8 LSBs of IODC, except for data sets assembled 150 // from subframes of two uploads (cutover) 151 bool iodeIodcConsistent() const { 152 return (system() != t_eph::GPS && system() != t_eph::QZSS) || 153 (static_cast<int>(_IODE) == (static_cast<int>(_IODC) & 0xFF)); 154 } 148 155 //virtual unsigned int isUnhealthy() const { return static_cast<unsigned int>(_health);} 149 156 virtual unsigned int isUnhealthy() const; -
trunk/BNC/src/src.pro
r11020 r11137 2 2 TARGET = ../bnc 3 3 4 CONFIG -= debug5 CONFIG += release4 CONFIG += debug 5 CONFIG -= release 6 6 7 7 macx { -
trunk/BNC/src/ssrQc.cpp
r11129 r11137 56 56 const double MAX_CLK_JUMP = 0.5; // [m] clock change beyond its rate between consecutive epochs 57 57 const double EPH_WARMUP = 120.0; // [s] no ephemeris checks at the start 58 const double EPH_EARLY_MAX = 300.0; // [s] IOD received this much later still counted as early 59 const double EPH_IOD_REUSE = 21600.0; // [s] an outdated data set this far from the epoch: IOD reused 60 const unsigned EPH_KEPT = 30; // data sets kept per satellite 58 61 const double CMP_SAMPL = 30.0; // [s] sampling of the stream comparison 59 62 const double CMP_DELAY = 60.0; // [s] epochs compared when data this much newer arrived … … 119 122 //////////////////////////////////////////////////////////////////////////// 120 123 t_ssrQc::t_ssrQc(const QString& dirName, double interval, const QStringList& streams, 121 const QString& reference) : _ephUser(true) { 124 const QString& reference) : _ephUser(true, EPH_KEPT) { 122 125 _dirName = dirName; 123 126 _reference = reference.isEmpty() ? QString("CONSENSUS") : reference; … … 359 362 // Broadcast ephemeris the correction refers to 360 363 //////////////////////////////////////////////////////////////////////////// 361 void t_ssrQc::checkEph(t_satStat& stat, const QString& prnInt, unsigned iod, constbncTime& time,362 const string& staID) { 364 void t_ssrQc::checkEph(t_satStat& stat, const QString& satKey, const QString& prnInt, 365 unsigned iod, const bncTime& time, const string& staID) { 363 366 // not before all broadcast ephemerides may have been received 364 367 if (time - _staStart[QString::fromStdString(staID)] < EPH_WARMUP) { 365 368 return; 366 369 } 367 t_eph* ephLast = _ephUser.ephLast(prnInt); 368 t_eph* ephPrev = _ephUser.ephPrev(prnInt); 369 t_eph* eph = 0; 370 if (ephLast && ephLast->IOD() == iod) eph = ephLast; 371 else if (ephPrev && ephPrev->IOD() == iod) eph = ephPrev; 372 if (!ephLast) { 370 if (!_ephUser.ephLast(prnInt)) { 373 371 stat.noEph += 1; 374 } 375 else if (!eph) { 376 stat.iodUnknown += 1; 372 return; 373 } 374 // any data set kept, not only the last two: Galileo has a new IODnav every 375 // 10 minutes, and ACs keep one for up to an hour 376 t_eph* eph = _ephUser.ephWithIOD(prnInt, iod); 377 // an IOD used again later (GLONASS tb every day, GPS IODE) is another data set 378 if (eph && outDatedBcep(eph, time) && fabs(time - eph->TOC()) > EPH_IOD_REUSE) { 379 eph = 0; 380 } 381 if (!eph) { 382 // received later from the ephemeris stream(s)? decided in resolvePendingIod 383 t_pendingIod& pending = _pendingIod[satKey][iod]; 384 if (pending.num == 0) { 385 pending.prnInt = prnInt; 386 pending.first = currentTime(); 387 } 388 pending.num += 1; 377 389 } 378 390 else if (eph->checkState() == t_eph::unhealthy || eph->checkState() == t_eph::bad) { 379 391 stat.ephUnhealthy += 1; 392 } 393 else if (outDatedBcep(eph, time)) { 394 stat.ephOutdated += 1; 395 } 396 if (_pendingIod.contains(satKey)) { 397 resolvePendingIod(satKey, false); 398 } 399 } 400 401 // Corrections referring to an IOD not received before: counted as early if 402 // the ephemeris stream(s) delivered the data set later, as unknown if not 403 // within EPH_EARLY_MAX (or at the end of the report interval, final) 404 //////////////////////////////////////////////////////////////////////////// 405 void t_ssrQc::resolvePendingIod(const QString& satKey, bool final) { 406 t_satStat& stat = _satStat[satKey]; 407 QMap<unsigned, t_pendingIod>& pend = _pendingIod[satKey]; 408 QMutableMapIterator<unsigned, t_pendingIod> it(pend); 409 while (it.hasNext()) { 410 it.next(); 411 const t_pendingIod& pending = it.value(); 412 t_eph* eph = _ephUser.ephWithIOD(pending.prnInt, it.key()); 413 if (eph && eph->receptDateTime().isValid()) { 414 bncTime recept(eph->receptDateTime().toString(Qt::ISODate).toStdString()); 415 if (recept >= pending.first) { 416 stat.iodEarly += pending.num; 417 stat.maxEarly = max(stat.maxEarly, recept - pending.first); 418 it.remove(); 419 continue; 420 } 421 } 422 if (final || currentTime() - pending.first > EPH_EARLY_MAX) { 423 stat.iodUnknown += pending.num; 424 it.remove(); 425 } 426 } 427 if (pend.isEmpty()) { 428 _pendingIod.remove(satKey); 380 429 } 381 430 } … … 395 444 t_satStat& stat = _satStat[QString::fromStdString(corr._staID) + ' ' + prn]; 396 445 stat.numOrb += 1; 397 checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time, corr._staID); 446 checkEph(stat, QString::fromStdString(corr._staID) + ' ' + prn, 447 QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time, corr._staID); 398 448 double radial = fabs(corr._xr[0]); 399 449 double alongCross = max(fabs(corr._xr[1]), fabs(corr._xr[2])); … … 417 467 t_satStat& stat = _satStat[QString::fromStdString(corr._staID) + ' ' + prn]; 418 468 stat.numClk += 1; 419 checkEph(stat, QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time, corr._staID); 469 checkEph(stat, QString::fromStdString(corr._staID) + ' ' + prn, 470 QString::fromStdString(corr._prn.toInternalString()), corr._iod, corr._time, corr._staID); 420 471 421 472 // jump: change between consecutive epochs (same IOD) beyond the clock rate … … 837 888 } 838 889 const t_orbCorr& orb = (--itO).value(); 839 t_eph* eph = 0; 840 t_eph* ephLast = _ephUser.ephLast(prnInt); 841 t_eph* ephPrev = _ephUser.ephPrev(prnInt); 842 if (ephLast && ephLast->IOD() == orb._iod) eph = ephLast; 843 else if (ephPrev && ephPrev->IOD() == orb._iod) eph = ephPrev; 890 t_eph* eph = _ephUser.ephWithIOD(prnInt, orb._iod); 891 if (eph && outDatedBcep(eph, tt) && fabs(tt - eph->TOC()) > EPH_IOD_REUSE) { 892 eph = 0; 893 } 844 894 if (!eph || clk._iod != orb._iod) { 845 895 continue; … … 1363 1413 bncTime endTime = final ? _lastTime : _intervalStart + _interval; 1364 1414 1415 // IODs not received: early or unknown (pending ones younger than 1416 // EPH_EARLY_MAX are decided in the next interval) 1417 for (const QString& satKey : _pendingIod.keys()) { 1418 resolvePendingIod(satKey, final); 1419 } 1420 1365 1421 // Healthy and current broadcast ephemerides per system 1366 1422 QMap<char, QSet<QString> > ephSats; … … 1475 1531 continue; 1476 1532 } 1533 QMap<QString, unsigned> iodEarly, outdated; 1534 double maxEarly = 0.0; 1477 1535 QMap<QString, unsigned> missOrb, missClk, missCB, missPB, iodUnknown, unhealthy, noEph, 1478 1536 jumps, missRef, noYaw, yawPartly; … … 1507 1565 const t_satStat& stat = itSat.value(); 1508 1566 if (stat.iodUnknown) iodUnknown[prn] = stat.iodUnknown; 1567 if (stat.iodEarly) { 1568 iodEarly[prn] = stat.iodEarly; 1569 maxEarly = max(maxEarly, stat.maxEarly); 1570 } 1571 if (stat.ephOutdated) outdated[prn] = stat.ephOutdated; 1509 1572 if (stat.ephUnhealthy) unhealthy[prn] = stat.ephUnhealthy; 1510 1573 if (stat.noEph) noEph[prn] = stat.noEph; … … 1568 1631 addSats("phase biases missing (healthy broadcast ephemeris available)", missPB); 1569 1632 addSats("corrections referring to an IOD of no received broadcast ephemeris", iodUnknown); 1633 if (!iodEarly.isEmpty()) { 1634 addSats(QString("corrections referring to an IOD received from the ephemeris stream(s) " 1635 "only later (up to %1 s)").arg(maxEarly, 0, 'f', 0), iodEarly); 1636 } 1637 addSats("corrections referring to a broadcast ephemeris outside its validity", outdated); 1570 1638 addSats("corrections for unhealthy broadcast ephemeris", unhealthy); 1571 1639 addSats("corrections for satellites without broadcast ephemeris", noEph); -
trunk/BNC/src/ssrQc.h
r11129 r11137 59 59 unsigned numClk; 60 60 unsigned iodUnknown; // IOD of no received broadcast ephemeris 61 unsigned iodEarly = 0; // IOD received from the ephemeris stream(s) only later 62 double maxEarly = 0.0; // [s] largest delay of these 63 unsigned ephOutdated = 0; // broadcast ephemeris outside its validity 61 64 unsigned ephUnhealthy; // broadcast ephemeris unhealthy/bad 62 65 unsigned noEph; // no broadcast ephemeris at all … … 77 80 void newEpoch(const std::string& staID, char sys, e_type type, const bncTime& time, 78 81 unsigned updateInt, const QString& prn); 79 void checkEph(t_satStat& stat, const QString& prnInt, unsigned iod , const bncTime& time,80 const std::string& staID); 82 void checkEph(t_satStat& stat, const QString& satKey, const QString& prnInt, unsigned iod, 83 const bncTime& time, const std::string& staID); 81 84 void checkInterval(const bncTime& time); 82 85 void writeReport(bool final); … … 138 141 QMap<QString, t_epoStat> _epoStat; // key "STA SYS TYPE" 139 142 QMap<QString, t_satStat> _satStat; // key "STA PRN" 143 class t_pendingIod { // IOD not (yet) received, key "STA PRN" and IOD 144 public: 145 QString prnInt; // internal PRN (with the Galileo F/NAV, I/NAV flag) 146 bncTime first; // reception time of the first correction 147 unsigned num = 0; // corrections referring to it 148 }; 149 QMap<QString, QMap<unsigned, t_pendingIod> > _pendingIod; 150 void resolvePendingIod(const QString& satKey, bool final); 140 151 QMap<QString, QSet<QString> > _codeSignals; // key "STA SYS": signals with code biases 141 152 QMap<QString, QSet<QString> > _phaseSignals; // key "STA SYS": signals with phase biases -
trunk/BNC/src/upload/bncephuploadcaster.cpp
r10754 r11137 92 92 93 93 if (ephGPS && ephGPS->system() == t_eph::GPS && (system == "ALL" || system.contains('G'))) { 94 if (dt < 14400.0 ||dt > -7200.0) {94 if (dt < 14400.0 && dt > -7200.0) { 95 95 size = t_ephEncoder::RTCM3(*ephGPS, Array); 96 96 } 97 97 } 98 98 else if (ephGPS && ephGPS->system() == t_eph::QZSS && (system == "ALL" || system.contains('J'))) { 99 if (dt < 7200.0 ||dt > -3600.0) {99 if (dt < 7200.0 && dt > -3600.0) { 100 100 size = t_ephEncoder::RTCM3(*ephGPS, Array); 101 101 } 102 102 } 103 103 else if (ephGlo && (system == "ALL" || system.contains('R'))) { 104 if (dt < 3900.0 ||dt > -2100.0) {104 if (dt < 3900.0 && dt > -2100.0) { 105 105 size = t_ephEncoder::RTCM3(*ephGlo, Array); 106 106 } 107 107 } 108 108 else if (ephGal && (system == "ALL" || system.contains('E'))) { 109 if (dt < 14400.0 ||dt > 0.0) {109 if (dt < 14400.0 && dt > 0.0) { 110 110 size = t_ephEncoder::RTCM3(*ephGal, Array); 111 111 } 112 112 } 113 113 else if (ephSBAS && (system == "ALL" || system.contains('S'))) { 114 if (dt < 600.0 ||dt > -600.0) {114 if (dt < 600.0 && dt > -600.0) { 115 115 size = t_ephEncoder::RTCM3(*ephSBAS, Array); 116 116 } 117 117 } 118 118 else if (ephBDS && (system == "ALL" || system.contains('C'))) { 119 if (dt < 3900.0 ||dt > 0.0) {119 if (dt < 3900.0 && dt > 0.0) { 120 120 size = t_ephEncoder::RTCM3(*ephBDS, Array); 121 121 } 122 122 } 123 123 else if (ephGPS && ephGPS->system() == t_eph::NavIC && (system == "ALL" || system.contains('I'))) { 124 if (fabs(dt < 86400.0 )) {124 if (fabs(dt) < 86400.0) { 125 125 size = t_ephEncoder::RTCM3(*ephGPS, Array); 126 126 } -
trunk/BNC/tests/README.md
r11136 r11137 55 55 (ephemeris messages of BCEP00BKG0, SSRA00EUH0, FFMJ00DEU0, WTZR00DEU0 cut from the 56 56 merged capture): one RINEX 4 navigation file per stream. 57 * `replay_eph_cutover`: 02 on `data/eph_cutover_261023_20min.raw` (GPS ephemerides of 58 BCEP00BKG0, BCEP01JPL0, BCEP00CAS0, 23 Oct 2026 01:05-01:25): the G17 upload within the 59 fit interval (IOD 4, TOC 01:59:44, 16 s before IOD 148) is accepted, the data set mixed 60 from both uploads (IODE 4, IODC 148) rejected. 57 61 * `replay_save_sp3_has`: 14 with Galileo HAS (SSRA00EUH0) only; its epochs are 58 62 off the SP3/CLK sampling grid and are written at the preceding grid epoch. … … 97 101 `data/combi_multi_261002_5min.raw`. `ssr_qc_bias` adds the CAS DCB file as 98 102 'QC Bias File' (code bias check against the other ACs and the file). 103 * `ssr_qc_iod`: IOD check of the SSR QC on `data/qc_iod_261015.raw` (made with 104 `tools/mk_qc_iod.py` from the QC capture of 15 Oct 2026: BCEP00BKG0 with each message only 105 at its first reception from 00:00, SSRA00WHU1/GMV1/CNE1 01:55-02:10): IODs received only 106 later (WHU1), never received (GMV1 G16, upload not in BCEP00BKG0), ephemeris outside its 107 validity (CNE1 GLONASS). 99 108 100 109 * `decoder_limits`: crafted, CRC-valid frames from `tools/mkcrafted.py`
Note:
See TracChangeset
for help on using the changeset viewer.
