Changeset 11195 in ntrip


Ignore:
Timestamp:
Nov 10, 2026, 6:14:20 PM (less than one hour ago)
Author:
stuerze
Message:

Structured logging improved

Location:
trunk/BNC
Files:
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/CHANGELOG.md

    r11192 r11195  
    11# Changelog
    22## 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)
    312- 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')
    413- 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  
    110110  // Resolvable ambiguities
    111111  // ----------------------
    112   map<char, set<t_prn>> usedPrns;
    113112  for (char system : OPT->_ar._systems) {
    114113    for (const auto& par : params) {
  • trunk/BNC/src/PPP/ambres.h

    r10793 r11195  
    4141    };
    4242 
    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  
    5843    class AmbGroup {
    5944    public:
    … …  
    6348      const ZdAmb*       _zdAmbRef;
    6449      std::vector<ZdAmb> _zdAmbs;
    65       std::vector<SdAmb> _sdAmbs;
    6650    };
    6751
  • trunk/BNC/src/PPP/pppFilter.cpp

    r11051 r11195  
    381381                                    const vector<t_pppSatObs*> &obsVector) {
    382382
    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;
    392383  string epoTimeStr = string(_epoTime);
    393384
  • trunk/BNC/src/PPP/pppStation.h

    r8905 r11195  
    4949  double            _dClk;
    5050  mutable t_windUp* _windUp;
    51   bncTime           _timeCheck;
    52   ColumnVector      _xyzCheck;
    5351  t_iono*            _iono;
    5452  bncTime           _epochTime;
  • trunk/BNC/src/RTCM/RTCM2.cpp

    r11130 r11195  
    965965};
    966966
    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 
    976967bool RTCM2_Obs::allGPS() const {
    977968
    … …  
    11091100
    11101101    for (int iSat=0;iSat<NSat;iSat++){
    1111 
    1112       // Code type
    1113       isCAcode = ( P.getUnsignedBits(iSat*48+25,1)==0 );
    11141102
    11151103      // Satellite
  • trunk/BNC/src/RTCM/RTCM2.h

    r7629 r11195  
    323323
    324324    bool anyGPS() const;
    325     bool anyGLONASS() const;
    326325    bool allGPS() const;
    327326    bool allGLONASS() const;
  • trunk/BNC/src/RTCM3/RTCM3Decoder.cpp

    r11191 r11195  
    5858
    5959using namespace std;
    60 
    61 // Error Handling
    62 ////////////////////////////////////////////////////////////////////////////
    63 void RTCM3Error(const char*, ...) {
    64 }
    6560
    6661// Constructor
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp

    r11130 r11195  
    427427}
    428428
    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
     430size_t SsrCorrRtcmNew::MakeVTEC(const struct VTEC* /* v */, int /* moremessagesfollow */,
     431                                char* /* buffer */, size_t /* size */) {
     432  return 0;
    460433}
    461434
    … …  
    592565}
    593566
    594 enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* v,
     567enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* /* v: no VTEC in the new RTCM-SSR */,
    595568  struct PhaseBias* pb, struct MetaData* md, struct Antenna* a, const char* buffer, size_t size, int* bytesused) {
    596569  int mmi = 0, h, rs;
    … …  
    837810        ExtendedPhaseBiasPropertyID, pb->ExtendedPhaseBiasPropertyID);
    838811#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 */
    839814      if (EpochTime == pb->EpochTime[s] &&
     815        SSRIOD == pb->SSRIOD &&
     816        SSRProviderID == pb->SSRProviderID &&
     817        SSRSolutionID == pb->SSRSolutionID &&
    840818        ExtendedPhaseBiasPropertyID == pb->ExtendedPhaseBiasPropertyID) {
    841819        for (i = 0; i < pb->NumberOfSat[s]; ++i) {
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h

    r11042 r11195  
    9292  };
    9393
    94   void setVtecType() {};
     94  void setVtecType() {
     95    VTEC_BASE = 0;   /* the new RTCM-SSR has no VTEC message */
     96  };
    9597
    9698  void setSatAntType() {
    … …  
    221223     GPS, GLONASS, GALILEO, QZSS and BDS are supported; SBAS has no new-RTCM-SSR
    222224     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). */
    226229  void setCorType() {
    227230    COBOFS_ORBIT    = 0;
  • trunk/BNC/src/bncgetthread.h

    r11191 r11195  
    127127   int                        _NMEASampl;
    128128   int                        _nextSleep;
    129    int                        _iMount;
    130129   int                        _ssrEpoch;
    131130   bncRawFile*                _rawFile;
  • trunk/BNC/src/bncnetqueryudp.cpp

    r11128 r11195  
    2626
    2727using namespace std;
    28 
    29 #define TIME_RESOLUTION 125
    3028
    3129// Constructor
  • trunk/BNC/src/bncrinex.h

    r11021 r11195  
    8484   QStringList     _addComments;
    8585
    86    QMap<QString, int>  _slip_cnt_L1;
    87    QMap<QString, int>  _slip_cnt_L2;
    88    QMap<QString, int>  _slip_cnt_L5;
    8986
    9087   t_rnxObsHeader _sklHeader;
  • trunk/BNC/src/bncserialport.h

    r11022 r11195  
    3838    bncSerialPort(QWidget* parent);
    3939    ~bncSerialPort();
    40     QString*   _serialPort1;
    4140
    4241  signals:
  • trunk/BNC/src/bncutils.cpp

    r11158 r11195  
    120120  int y,m,d,k,l, nul;
    121121  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;
    123123  for(y = 1980; j >= (unsigned int)(k = (l = (365+longyear(y,0)))*24*60*60)
    124124  + gnumleap(y+1,1,1); ++y)
    125125  {
    126     j -= k; glo_daynumber += l;
     126    j -= k;
    127127  }
    128128  for(m = 1; j >= (unsigned int)(k = (l = months[m]+longyear(y, m))*24*60*60)
    129129  + gnumleap(y, m+1, 1); ++m)
    130130  {
    131     j -= k; glo_daynumber += l;
     131    j -= k;
    132132  }
    133133  for(d = 1; j >= 24UL*60UL*60UL + gnumleap(y, m, d+1); ++d)
    134134    j -= 24*60*60;
    135   glo_daynumber -= 16*365+4-d;
    136135  nul = gnumleap(y, m, d);
    137136  glo_timeofday = j-nul;
  • trunk/BNC/src/bncwindow.h

    r11185 r11195  
    134134    QAction* _actDeleteMountPoints;
    135135    QAction* _actwhatsthis;
    136     QAction* _actwhatsthismenu;
    137136
    138137    QLineEdit* _proxyHostLineEdit;
    … …  
    219218    QSpinBox* _serialNMEASamplingSpinBox;
    220219
    221     QLineEdit* _LatLineEdit;
    222     QLineEdit* _LonLineEdit;
    223220
    224221    QComboBox* _onTheFlyComboBox;
  • trunk/BNC/src/combination/bnccomb.cpp

    r11194 r11195  
    773773
    774774  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);
    776777
    777778  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);
    779780
    780781  QString msg = "bncComb: switch corr " + corr->_prn.mid(0,3)
    … …  
    14821483  // X = X_brdc - RSW(xr): X_CoM = X_APC - dx  =>  xr_CoM = xr_APC + RSW(dx)
    14831484  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);
    14851486  corr->_orbCorr._xr += dRAO;
    14861487  return success;
    … …  
    17431744    if (!masterIsAPC && _antex) {
    17441745      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);
    17461747      orbCorrections.back()._xr -= dRAO;
    17471748    }
  • trunk/BNC/src/combination/bnccomb.h

    r11185 r11195  
    306306  QMap<char, unsigned>                       _cmbSysPrn;
    307307  bncEphUser                                 _ephUser;
    308   QString                                    _cmbRefAttributes;
    309308  bool                                       _useGps;
    310309  bool                                       _useGlo;
  • trunk/BNC/src/ephemeris.cpp

    r11192 r11195  
    116116        dtO -= (0.5 * ssrUpdateInt[_orbCorr->_updateInt]);
    117117      }
     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
    118122      ColumnVector dx(3);
    119123      dx[0] = _orbCorr->_xr[0] + _orbCorr->_dotXr[0] * dtO;
    … …  
    121125      dx[2] = _orbCorr->_xr[2] + _orbCorr->_dotXr[2] * dtO;
    122126
    123       RSW_to_XYZ(xc.Rows(1, 3), vv.Rows(1, 3), dx, dx);
     127      RSW_to_XYZ(xBrdc, vFrame, dx, dx);
    124128
    125129      xc[0] -= dx[0];
    … …  
    128132
    129133      ColumnVector dv(3);
    130       RSW_to_XYZ(xc.Rows(1, 3), vv.Rows(1, 3), _orbCorr->_dotXr, dv);
     134      RSW_to_XYZ(xBrdc, vFrame, _orbCorr->_dotXr, dv);
    131135
    132136      vv[0] -= dv[0];
  • trunk/BNC/src/ephemeris.h

    r11194 r11195  
    22#define EPHEMERIS_H
    33
     4#include <cmath>
    45#include <newmat.h>
    56#include <QtCore>
    … …  
    3637  bool    matchesSsrIOD(unsigned int iod) const {
    3738    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;
    3854  }
    3955  bool    sameDataSet(const t_eph* eph) const {return _TOC == eph->_TOC && IOD() == eph->IOD();}
    … …  
    163179  virtual unsigned int isUnhealthy() const;
    164180  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  }
    165184
    166185 private:
    … …  
    515534
    516535  virtual e_system  system() const {return t_eph::SBAS;}
     536  virtual bool isGeo() const {return true;}
    517537  virtual unsigned int IOD() const;
    518538  virtual unsigned int  isUnhealthy() const;
    … …  
    601621
    602622  virtual e_system  system() const {return t_eph::BDS;}
     623  virtual bool isGeo() const {return _i0 <= 10.0 / 180.0 * M_PI;}
    603624  virtual unsigned int IOD() const;
    604625  virtual unsigned int isUnhealthy() const;
  • trunk/BNC/src/latencychecker.h

    r11179 r11195  
    150150  QDateTime  _checkTime;
    151151  QDateTime  _decodeSucc;
    152   QDateTime  _decodeFailure;
    153152  QDateTime  _decodeStart;
    154153  QDateTime  _decodeStop;
  • trunk/BNC/src/map/bncmapwin.h

    r11023 r11195  
    5757  void gotoLocation(double lat, double lon);
    5858  QWebEngineView*  _webView;
    59   QWebEnginePage*  _webPage;
    6059  QLabel*          _statusLabel;
    6160  double           _currLat;
  • trunk/BNC/src/ssrQc.cpp

    r11185 r11195  
    906906      sc.xx  = xc.Rows(1,3);
    907907      sc.vv  = vv;
     908      sc.vFrame = eph->ssrFrameVel(xc, vv);
    908909      sc.clk = xc(4) * t_CST::c;
    909910      sc.refPoint = refPoint(staID);
    … …  
    10371038          for (int ii = 0; ii < 3; ii++) dx[ii] = sc.xx[ii] - median(xs[ii]);
    10381039          ColumnVector er = sc.xx / sc.xx.NormFrobenius();
    1039           ColumnVector ec = crossproduct(sc.xx, sc.vv);
     1040          ColumnVector ec = crossproduct(sc.xx, sc.vFrame);
    10401041          ec /= ec.NormFrobenius();
    10411042          ColumnVector ea = crossproduct(ec, er);
  • trunk/BNC/src/ssrQc.h

    r11185 r11195  
    115115    ColumnVector xx;   // [m]
    116116    ColumnVector vv;   // [m/s]
     117    ColumnVector vFrame; // [m/s] velocity of the RAC frame (GEO: inertial)
    117118    double       clk;  // [m], referred to the reference signals (+ B_IF) if clkOK
    118119    bool         clkOK;
  • trunk/BNC/src/upload/bncrtnetuploadcaster.cpp

    r11194 r11195  
    11451145    // Difference in RSW
    11461146    // -----------------
     1147    // (GEO: along/cross from the inertial velocity, IGS SSR v1.00 4.2)
     1148    ColumnVector vFrame = eph->ssrFrameVel(xB, vB);
    11471149    ColumnVector rsw(3);
    1148     XYZ_to_RSW(xB.Rows(1, 3), vB, dx, rsw);
     1150    XYZ_to_RSW(xB.Rows(1, 3), vFrame, dx, rsw);
    11491151
    11501152    ColumnVector dotRsw(3);
    1151     XYZ_to_RSW(xB.Rows(1, 3), vB, dv, dotRsw);
     1153    XYZ_to_RSW(xB.Rows(1, 3), vFrame, dv, dotRsw);
    11521154
    11531155    // Clock Correction
  • trunk/BNC/src/upload/bncuploadcaster.h

    r11185 r11195  
    5353  bool        _isToBeDeleted;
    5454  QString     _mountpoint;
    55   QString     _outHost;
    56   int         _outPort;
    5755  QString     _casterOutHost;
    5856  int         _casterOutPort;
Note: See TracChangeset for help on using the changeset viewer.