Changeset 11195 in ntrip
- Timestamp:
- Nov 10, 2026, 6:14:20 PM (less than one hour ago)
- Location:
- trunk/BNC
- Files:
-
- 26 edited
-
CHANGELOG.md (modified) (1 diff)
-
src/PPP/ambres.cpp (modified) (1 diff)
-
src/PPP/ambres.h (modified) (2 diffs)
-
src/PPP/pppFilter.cpp (modified) (1 diff)
-
src/PPP/pppStation.h (modified) (1 diff)
-
src/RTCM/RTCM2.cpp (modified) (2 diffs)
-
src/RTCM/RTCM2.h (modified) (1 diff)
-
src/RTCM3/RTCM3Decoder.cpp (modified) (1 diff)
-
src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp (modified) (3 diffs)
-
src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h (modified) (2 diffs)
-
src/bncgetthread.h (modified) (1 diff)
-
src/bncnetqueryudp.cpp (modified) (1 diff)
-
src/bncrinex.h (modified) (1 diff)
-
src/bncserialport.h (modified) (1 diff)
-
src/bncutils.cpp (modified) (1 diff)
-
src/bncwindow.h (modified) (2 diffs)
-
src/combination/bnccomb.cpp (modified) (3 diffs)
-
src/combination/bnccomb.h (modified) (1 diff)
-
src/ephemeris.cpp (modified) (3 diffs)
-
src/ephemeris.h (modified) (5 diffs)
-
src/latencychecker.h (modified) (1 diff)
-
src/map/bncmapwin.h (modified) (1 diff)
-
src/ssrQc.cpp (modified) (2 diffs)
-
src/ssrQc.h (modified) (1 diff)
-
src/upload/bncrtnetuploadcaster.cpp (modified) (1 diff)
-
src/upload/bncuploadcaster.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/CHANGELOG.md
r11192 r11195 1 1 # Changelog 2 2 ## 2.13.8 (2026-11-04) 3 - FIXED: New RTCM-SSR upload with VTEC: the message number of the VTEC message was not initialised (the new RTCM-SSR has no VTEC message); no VTEC is encoded in this format now 4 - FIXED: New RTCM-SSR Extended Phase Bias: the wide-lane indicators are only taken over if SSR IOD, provider ID and solution ID match the preceding Phase Bias message too (before only epoch and property ID) 5 - CHANGED: Unused variables, class members (e.g. class SdAmb in the ambiguity resolution) and a macro removed 6 - FIXED: **PPP ionosphere from VTEC**: the slant TEC of a layer was computed as VTEC * sin(E + psi_PP) instead of VTEC / sin(E + psi_PP) (IGS SSR v1.00 4.5.1, RTCM 10403.3), i.e. far too small except at zenith (factor ~6.5 at 10 deg elevation); affects the ionospheric code delay and the STEC pseudo-observations. Quick-Start PPP with SSRA00CNE1 (11 min): height RMS 0.64 m -> 0.08 m 7 - FIXED: IGS-SSR Galileo IOD: an SSR correction carries the 8 LSBs of IODnav (IDF012); the ephemeris is now matched on the 8 LSBs (PPP, combination, SSR QC), before an IODnav >= 256 could never be matched 8 - FIXED: IGS-SSR SBAS satellite ID: ID 1 is PRN 120 (S20) (IDF011), decoded and encoded (upload) with this offset now, before ID n was taken as S<n>; GPS/GLONASS/BDS ID 0 is decoded as 64 9 - FIXED: SSR High Rate Clock messages: the clock polynomial keeps the reference time of its clock message; it is now re-referenced to the High Rate Clock epoch (C1 and C2 terms) before the high rate correction is added, before the polynomial was moved to the new epoch without propagation 10 - CHANGED: IGS-SSR upload: IGS SSR Version (IDF001) 1 instead of 3 (IGS SSR v1.00); any version is decoded 11 - CHANGED: SSR orbit corrections of geostationary satellites (BDS/QZSS/NavIC GEO with inclination < 10 deg, SBAS): along-track and cross-track refer to the velocity in the non-rotating frame parallel to ITRF at the SSR epoch, v + Omega_e x r (IGS SSR v1.00 4.2), before the ECEF velocity (nearly zero for a GEO); applied consistently in PPP, upload, combination and SSR QC, all SSR formats (not yet validated: no stream with GEO corrections available) 3 12 - ADDED: **RINEX observation files: event records are kept** (RINEX Edit/Concatenate): epoch flag 1 (power failure) is written again, flags 2-5 with their special records (header records valid in the output version, without changes of the observation types fixed by the output header), flag 6 cycle slip records; events of epochs left out by the sampling are written with the next epoch, events after the last epoch at the end. Before, flag 5 records were skipped, flag 2 was written as an empty epoch and flag 6 stopped the editing ('unhandled flag') 4 13 - ADDED: **RINEX observation header records kept**: records not interpreted by BNC (e.g. SIGNAL STRENGTH UNIT, LEAP SECONDS, SYS / DCBS APPLIED, SYS / PCVS APPLIED, ANTENNA: PHASECENTER/ZERODIR/DELTA X/Y/Z/B.SIGHT XYZ, CENTER OF MASS: XYZ, DOI, LICENSE OF USE, STATION INFORMATION) are written again if they exist in the output version; SYS / SCALE FACTOR is applied when reading and writing (RINEX 2 output: unscaled); the satellite system of RINEX VERSION / TYPE is kept for single-system files (before always M) -
trunk/BNC/src/PPP/ambres.cpp
r10793 r11195 110 110 // Resolvable ambiguities 111 111 // ---------------------- 112 map<char, set<t_prn>> usedPrns;113 112 for (char system : OPT->_ar._systems) { 114 113 for (const auto& par : params) { -
trunk/BNC/src/PPP/ambres.h
r10793 r11195 41 41 }; 42 42 43 class SdAmb {44 public:45 SdAmb(const ZdAmb& zdAmb1, const ZdAmb& zdAmb2,46 const ColumnVector& xBie, const SymmetricMatrix& covBie);47 t_lc _LC;48 t_prn _prn1;49 t_prn _prn2;50 double _aprVal;51 double _bieValue;52 double _bieSigma;53 bool _fixed;54 bncTime _firstObsTime;55 const t_pppParam* _ambGlobal[2];56 };57 58 43 class AmbGroup { 59 44 public: … … 63 48 const ZdAmb* _zdAmbRef; 64 49 std::vector<ZdAmb> _zdAmbs; 65 std::vector<SdAmb> _sdAmbs;66 50 }; 67 51 -
trunk/BNC/src/PPP/pppFilter.cpp
r11051 r11195 381 381 const vector<t_pppSatObs*> &obsVector) { 382 382 383 double SLIP = 150.0;384 double fac = 1.0;385 if (_lastEpoTimeOK.valid()) {386 fac = _epoTime - _lastEpoTimeOK;387 if (fac > 60.0 || fac < 1.0) {388 fac = 1.0;389 }390 }391 SLIP *= fac;392 383 string epoTimeStr = string(_epoTime); 393 384 -
trunk/BNC/src/PPP/pppStation.h
r8905 r11195 49 49 double _dClk; 50 50 mutable t_windUp* _windUp; 51 bncTime _timeCheck;52 ColumnVector _xyzCheck;53 51 t_iono* _iono; 54 52 bncTime _epochTime; -
trunk/BNC/src/RTCM/RTCM2.cpp
r11130 r11195 965 965 }; 966 966 967 bool RTCM2_Obs::anyGLONASS() const {968 969 return availability.test(bit_L1rngGLO) ||970 availability.test(bit_L2rngGLO) ||971 availability.test(bit_L1cphGLO) ||972 availability.test(bit_L2cphGLO);973 974 };975 976 967 bool RTCM2_Obs::allGPS() const { 977 968 … … 1109 1100 1110 1101 for (int iSat=0;iSat<NSat;iSat++){ 1111 1112 // Code type1113 isCAcode = ( P.getUnsignedBits(iSat*48+25,1)==0 );1114 1102 1115 1103 // Satellite -
trunk/BNC/src/RTCM/RTCM2.h
r7629 r11195 323 323 324 324 bool anyGPS() const; 325 bool anyGLONASS() const;326 325 bool allGPS() const; 327 326 bool allGLONASS() const; -
trunk/BNC/src/RTCM3/RTCM3Decoder.cpp
r11191 r11195 58 58 59 59 using namespace std; 60 61 // Error Handling62 ////////////////////////////////////////////////////////////////////////////63 void RTCM3Error(const char*, ...) {64 }65 60 66 61 // Constructor -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp
r11130 r11195 427 427 } 428 428 429 size_t SsrCorrRtcmNew::MakeVTEC(const struct VTEC* v, int moremessagesfollow, char* buffer, size_t size) { 430 unsigned int l, o, d; 431 432 STARTDATA 433 INITBLOCK 434 E_RTCM_MESSAGE_NUMBER(VTEC_BASE) 435 E_GPS_EPOCH_TIME(v->EpochTime) 436 E_SSR_UPDATE_INTERVAL(v->UpdateInterval) 437 E_MULTIPLE_MESSAGE_INDICATOR(moremessagesfollow ? 1 : 0) 438 E_SSR_IOD(v->SSRIOD) 439 E_SSR_PROVIDER_ID(v->SSRProviderID) 440 E_SSR_SOLUTION_ID(v->SSRSolutionID) 441 E_VTEC_QUALITY_INDICATOR(v->Quality) 442 E_NO_IONO_LAYERS(v->NumLayers) 443 for (l = 0; l < v->NumLayers; ++l) { 444 E_IONO_HEIGHT(v->Layers[l].Height) 445 E_IONO_DEGREE(v->Layers[l].Degree) 446 E_IONO_ORDER(v->Layers[l].Order) 447 for (o = 0; o <= v->Layers[l].Order; ++o) { 448 for (d = o; d <= v->Layers[l].Degree; ++d) { 449 E_IONO_COEFF_C(v->Layers[l].Cosinus[d][o]) 450 } 451 } 452 for (o = 1; o <= v->Layers[l].Order; ++o) { 453 for (d = o; d <= v->Layers[l].Degree; ++d) { 454 E_IONO_COEFF_S(v->Layers[l].Sinus[d][o]) 455 } 456 } 457 } 458 ENDBLOCK 459 return ressize; 429 // The new RTCM-SSR has no VTEC message: nothing is encoded 430 size_t SsrCorrRtcmNew::MakeVTEC(const struct VTEC* /* v */, int /* moremessagesfollow */, 431 char* /* buffer */, size_t /* size */) { 432 return 0; 460 433 } 461 434 … … 592 565 } 593 566 594 enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* v,567 enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* /* v: no VTEC in the new RTCM-SSR */, 595 568 struct PhaseBias* pb, struct MetaData* md, struct Antenna* a, const char* buffer, size_t size, int* bytesused) { 596 569 int mmi = 0, h, rs; … … 837 810 ExtendedPhaseBiasPropertyID, pb->ExtendedPhaseBiasPropertyID); 838 811 #endif 812 /* the wide-lane indicators belong to the preceding Phase Bias message 813 * only if epoch, SSR IOD, provider, solution and property ID match */ 839 814 if (EpochTime == pb->EpochTime[s] && 815 SSRIOD == pb->SSRIOD && 816 SSRProviderID == pb->SSRProviderID && 817 SSRSolutionID == pb->SSRSolutionID && 840 818 ExtendedPhaseBiasPropertyID == pb->ExtendedPhaseBiasPropertyID) { 841 819 for (i = 0; i < pb->NumberOfSat[s]; ++i) { -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h
r11042 r11195 92 92 }; 93 93 94 void setVtecType() {}; 94 void setVtecType() { 95 VTEC_BASE = 0; /* the new RTCM-SSR has no VTEC message */ 96 }; 95 97 96 98 void setSatAntType() { … … 221 223 GPS, GLONASS, GALILEO, QZSS and BDS are supported; SBAS has no new-RTCM-SSR 222 224 messages defined, so its row is left all-zero (0 = undefined). GRID, Tropo, 223 Metadata and VTEC are single global message numbers, not per-system, so 224 they are handled directly against their BASE constant instead of via this 225 table (VTEC already is, at the top of GetSSR). */ 225 Metadata are single global message numbers, not per-system, so they are 226 handled directly against their BASE constant instead of via this table. 227 The new RTCM-SSR has no VTEC message (VTEC_BASE = 0, MakeVTEC() encodes 228 nothing, GetSSR() decodes none). */ 226 229 void setCorType() { 227 230 COBOFS_ORBIT = 0; -
trunk/BNC/src/bncgetthread.h
r11191 r11195 127 127 int _NMEASampl; 128 128 int _nextSleep; 129 int _iMount;130 129 int _ssrEpoch; 131 130 bncRawFile* _rawFile; -
trunk/BNC/src/bncnetqueryudp.cpp
r11128 r11195 26 26 27 27 using namespace std; 28 29 #define TIME_RESOLUTION 12530 28 31 29 // Constructor -
trunk/BNC/src/bncrinex.h
r11021 r11195 84 84 QStringList _addComments; 85 85 86 QMap<QString, int> _slip_cnt_L1;87 QMap<QString, int> _slip_cnt_L2;88 QMap<QString, int> _slip_cnt_L5;89 86 90 87 t_rnxObsHeader _sklHeader; -
trunk/BNC/src/bncserialport.h
r11022 r11195 38 38 bncSerialPort(QWidget* parent); 39 39 ~bncSerialPort(); 40 QString* _serialPort1;41 40 42 41 signals: -
trunk/BNC/src/bncutils.cpp
r11158 r11195 120 120 int y,m,d,k,l, nul; 121 121 unsigned int j = *week*(7*24*60*60) + *secOfWeek + 5*24*60*60+3*60*60; 122 int glo_ daynumber = 0, glo_timeofday;122 int glo_timeofday; 123 123 for(y = 1980; j >= (unsigned int)(k = (l = (365+longyear(y,0)))*24*60*60) 124 124 + gnumleap(y+1,1,1); ++y) 125 125 { 126 j -= k; glo_daynumber += l;126 j -= k; 127 127 } 128 128 for(m = 1; j >= (unsigned int)(k = (l = months[m]+longyear(y, m))*24*60*60) 129 129 + gnumleap(y, m+1, 1); ++m) 130 130 { 131 j -= k; glo_daynumber += l;131 j -= k; 132 132 } 133 133 for(d = 1; j >= 24UL*60UL*60UL + gnumleap(y, m, d+1); ++d) 134 134 j -= 24*60*60; 135 glo_daynumber -= 16*365+4-d;136 135 nul = gnumleap(y, m, d); 137 136 glo_timeofday = j-nul; -
trunk/BNC/src/bncwindow.h
r11185 r11195 134 134 QAction* _actDeleteMountPoints; 135 135 QAction* _actwhatsthis; 136 QAction* _actwhatsthismenu;137 136 138 137 QLineEdit* _proxyHostLineEdit; … … 219 218 QSpinBox* _serialNMEASamplingSpinBox; 220 219 221 QLineEdit* _LatLineEdit;222 QLineEdit* _LonLineEdit;223 220 224 221 QComboBox* _onTheFlyComboBox; -
trunk/BNC/src/combination/bnccomb.cpp
r11194 r11195 773 773 774 774 ColumnVector dRAO(3); 775 XYZ_to_RSW(newXC.Rows(1,3), newVV, dX, dRAO); 775 ColumnVector vFrame = lastEph->ssrFrameVel(newXC, newVV); // GEO: inertial velocity 776 XYZ_to_RSW(newXC.Rows(1,3), vFrame, dX, dRAO); 776 777 777 778 ColumnVector dDotRAO(3); 778 XYZ_to_RSW(newXC.Rows(1,3), newVV, dV, dDotRAO);779 XYZ_to_RSW(newXC.Rows(1,3), vFrame, dV, dDotRAO); 779 780 780 781 QString msg = "bncComb: switch corr " + corr->_prn.mid(0,3) … … 1482 1483 // X = X_brdc - RSW(xr): X_CoM = X_APC - dx => xr_CoM = xr_APC + RSW(dx) 1483 1484 ColumnVector dRAO(3); 1484 XYZ_to_RSW(xc.Rows(1,3), vv, dx, dRAO);1485 XYZ_to_RSW(xc.Rows(1,3), corr->_eph->ssrFrameVel(xc, vv), dx, dRAO); 1485 1486 corr->_orbCorr._xr += dRAO; 1486 1487 return success; … … 1743 1744 if (!masterIsAPC && _antex) { 1744 1745 ColumnVector dRAO(3); 1745 XYZ_to_RSW(xc.Rows(1,3), vv, dx, dRAO);1746 XYZ_to_RSW(xc.Rows(1,3), corr->_eph->ssrFrameVel(xc, vv), dx, dRAO); 1746 1747 orbCorrections.back()._xr -= dRAO; 1747 1748 } -
trunk/BNC/src/combination/bnccomb.h
r11185 r11195 306 306 QMap<char, unsigned> _cmbSysPrn; 307 307 bncEphUser _ephUser; 308 QString _cmbRefAttributes;309 308 bool _useGps; 310 309 bool _useGlo; -
trunk/BNC/src/ephemeris.cpp
r11192 r11195 116 116 dtO -= (0.5 * ssrUpdateInt[_orbCorr->_updateInt]); 117 117 } 118 // along/cross directions from the broadcast orbit (GEO: inertial velocity) 119 ColumnVector vFrame = ssrFrameVel(xc, vv); 120 ColumnVector xBrdc = xc.Rows(1, 3); 121 118 122 ColumnVector dx(3); 119 123 dx[0] = _orbCorr->_xr[0] + _orbCorr->_dotXr[0] * dtO; … … 121 125 dx[2] = _orbCorr->_xr[2] + _orbCorr->_dotXr[2] * dtO; 122 126 123 RSW_to_XYZ(x c.Rows(1, 3), vv.Rows(1, 3), dx, dx);127 RSW_to_XYZ(xBrdc, vFrame, dx, dx); 124 128 125 129 xc[0] -= dx[0]; … … 128 132 129 133 ColumnVector dv(3); 130 RSW_to_XYZ(x c.Rows(1, 3), vv.Rows(1, 3), _orbCorr->_dotXr, dv);134 RSW_to_XYZ(xBrdc, vFrame, _orbCorr->_dotXr, dv); 131 135 132 136 vv[0] -= dv[0]; -
trunk/BNC/src/ephemeris.h
r11194 r11195 2 2 #define EPHEMERIS_H 3 3 4 #include <cmath> 4 5 #include <newmat.h> 5 6 #include <QtCore> … … 36 37 bool matchesSsrIOD(unsigned int iod) const { 37 38 return (system() == Galileo) ? ((IOD() & 0xFF) == (iod & 0xFF)) : (IOD() == iod); 39 } 40 // Geostationary satellite (BDS/QZSS/NavIC GEO: inclination below 10 deg, 41 // SBAS: always) 42 virtual bool isGeo() const {return false;} 43 // Velocity defining the along/cross directions of an SSR orbit correction 44 // (IGS SSR v1.00 4.2): the ECEF velocity, for GEOs (ECEF velocity nearly 45 // zero) the velocity in the non-rotating frame parallel to ITRF at the 46 // SSR epoch, vv + Omega_e x r. xc: position [m], vv: ECEF velocity [m/s] 47 ColumnVector ssrFrameVel(const ColumnVector& xc, const ColumnVector& vv) const { 48 ColumnVector vel = vv.Rows(1, 3); 49 if (isGeo()) { 50 vel(1) -= t_CST::omega * xc(2); 51 vel(2) += t_CST::omega * xc(1); 52 } 53 return vel; 38 54 } 39 55 bool sameDataSet(const t_eph* eph) const {return _TOC == eph->_TOC && IOD() == eph->IOD();} … … 163 179 virtual unsigned int isUnhealthy() const; 164 180 double TGD() const {return _TGD;} // Timing Group Delay (P1-P2 DCB) 181 virtual bool isGeo() const { 182 return (system() == t_eph::QZSS || system() == t_eph::NavIC) && _i0 < 10.0 / 180.0 * M_PI; 183 } 165 184 166 185 private: … … 515 534 516 535 virtual e_system system() const {return t_eph::SBAS;} 536 virtual bool isGeo() const {return true;} 517 537 virtual unsigned int IOD() const; 518 538 virtual unsigned int isUnhealthy() const; … … 601 621 602 622 virtual e_system system() const {return t_eph::BDS;} 623 virtual bool isGeo() const {return _i0 <= 10.0 / 180.0 * M_PI;} 603 624 virtual unsigned int IOD() const; 604 625 virtual unsigned int isUnhealthy() const; -
trunk/BNC/src/latencychecker.h
r11179 r11195 150 150 QDateTime _checkTime; 151 151 QDateTime _decodeSucc; 152 QDateTime _decodeFailure;153 152 QDateTime _decodeStart; 154 153 QDateTime _decodeStop; -
trunk/BNC/src/map/bncmapwin.h
r11023 r11195 57 57 void gotoLocation(double lat, double lon); 58 58 QWebEngineView* _webView; 59 QWebEnginePage* _webPage;60 59 QLabel* _statusLabel; 61 60 double _currLat; -
trunk/BNC/src/ssrQc.cpp
r11185 r11195 906 906 sc.xx = xc.Rows(1,3); 907 907 sc.vv = vv; 908 sc.vFrame = eph->ssrFrameVel(xc, vv); 908 909 sc.clk = xc(4) * t_CST::c; 909 910 sc.refPoint = refPoint(staID); … … 1037 1038 for (int ii = 0; ii < 3; ii++) dx[ii] = sc.xx[ii] - median(xs[ii]); 1038 1039 ColumnVector er = sc.xx / sc.xx.NormFrobenius(); 1039 ColumnVector ec = crossproduct(sc.xx, sc.v v);1040 ColumnVector ec = crossproduct(sc.xx, sc.vFrame); 1040 1041 ec /= ec.NormFrobenius(); 1041 1042 ColumnVector ea = crossproduct(ec, er); -
trunk/BNC/src/ssrQc.h
r11185 r11195 115 115 ColumnVector xx; // [m] 116 116 ColumnVector vv; // [m/s] 117 ColumnVector vFrame; // [m/s] velocity of the RAC frame (GEO: inertial) 117 118 double clk; // [m], referred to the reference signals (+ B_IF) if clkOK 118 119 bool clkOK; -
trunk/BNC/src/upload/bncrtnetuploadcaster.cpp
r11194 r11195 1145 1145 // Difference in RSW 1146 1146 // ----------------- 1147 // (GEO: along/cross from the inertial velocity, IGS SSR v1.00 4.2) 1148 ColumnVector vFrame = eph->ssrFrameVel(xB, vB); 1147 1149 ColumnVector rsw(3); 1148 XYZ_to_RSW(xB.Rows(1, 3), v B, dx, rsw);1150 XYZ_to_RSW(xB.Rows(1, 3), vFrame, dx, rsw); 1149 1151 1150 1152 ColumnVector dotRsw(3); 1151 XYZ_to_RSW(xB.Rows(1, 3), v B, dv, dotRsw);1153 XYZ_to_RSW(xB.Rows(1, 3), vFrame, dv, dotRsw); 1152 1154 1153 1155 // Clock Correction -
trunk/BNC/src/upload/bncuploadcaster.h
r11185 r11195 53 53 bool _isToBeDeleted; 54 54 QString _mountpoint; 55 QString _outHost;56 int _outPort;57 55 QString _casterOutHost; 58 56 int _casterOutPort;
Note:
See TracChangeset
for help on using the changeset viewer.
