Changeset 10998 in ntrip for trunk


Ignore:
Timestamp:
Aug 28, 2026, 9:23:41 PM (11 days ago)
Author:
stuerze
Message:

minor changes regarding RTCM-SSR

Location:
trunk/BNC/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp

    r10994 r10998  
    314314      orbCorr._dotXr[1]  = _clkOrb.Sat[ii].Orbit.DotDeltaAlongTrack;
    315315      orbCorr._dotXr[2]  = _clkOrb.Sat[ii].Orbit.DotDeltaCrossTrack;
    316       orbCorr._rtcmSsr   = (_type == RTCMssr || _type == RTCMnewssr);
     316      orbCorr._ssrFormat = (_type == RTCMssr) ? ssrRtcmOld :
     317                            (_type == RTCMnewssr) ? ssrRtcmNew : ssrUnknown;
    317318
    318319      _orbCorrections[_lastTime].append(orbCorr);
     
    502503    satPhaseBias._time       = _lastTime;
    503504    satPhaseBias._updateInt  = _phaseBias.UpdateInterval;
     505    satPhaseBias._ssrFormat  = (_type == RTCMssr) ? ssrRtcmOld :
     506                                (_type == RTCMnewssr) ? ssrRtcmNew : ssrUnknown;
    504507    satPhaseBias._dispBiasConstistInd = _phaseBias.DispersiveBiasConsistencyIndicator;
    505508    satPhaseBias._MWConsistInd        = _phaseBias.MWConsistencyIndicator;
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp

    r10997 r10998  
    353353
    354354  for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
    355     /* Extended Satellite Phase Bias Message
    356        The Widelane Signal Group Indicator shall be releated for every satellite and signal
    357        included in the corresponding Satellite Phase Bias Message in the same order. The
    358        Extended Satellite Phase Bias Message shall be sent BEFORE the corresponding
    359        Satellite Phase Bias Message */
    360     if (b->NumberOfSat[s] && (type == PBEXTTYPE_AUTO || type == corType[s][COBOFS_PBEXT])) {
    361       INITBLOCK
    362       E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_PBEXT])
    363       switch (s) {
    364         case CLOCKORBIT_SATGPS:
    365         case CLOCKORBIT_SATGALILEO:
    366         case CLOCKORBIT_SATQZSS:
    367         case CLOCKORBIT_SATSBAS:
    368         case CLOCKORBIT_SATBDS:
    369           E_GPS_EPOCH_TIME(b->EpochTime[s])
    370           break;
    371         case CLOCKORBIT_SATGLONASS:
    372           E_GLONASS_EPOCH_TIME(b->EpochTime[s])
    373           break;
    374       }
    375       E_SSR_IOD(b->SSRIOD)
    376       E_SSR_PROVIDER_ID(b->SSRProviderID)
    377       E_SSR_SOLUTION_ID(b->SSRSolutionID)
    378       E_EXTENDED_PHASE_BIAS_ID(b->ExtendedPhaseBiasPropertyID)
    379       for (i = satoffset[s]; i < satoffset[s] + b->NumberOfSat[s]; ++i) {
    380         for (j = 0; j < b->Sat[i].NumberOfPhaseBiases; ++j) {
    381           E_WIDE_LANE_INDICATOR(b->Sat[i].Biases[j].WidelaneGroupIndicator)
    382         }
    383       }
    384       ENDBLOCK
    385     }
    386     /* Satellite Phase Bias Message */
     355     /* Satellite Phase Bias Message */
    387356    if (b->NumberOfSat[s] && (type == PBTYPE_AUTO || type == corType[s][COBOFS_PBIAS])) {
    388357      INITBLOCK
     
    422391      ENDBLOCK
    423392    }
     393    /* Extended Satellite Phase Bias Message
     394       The Widelane Signal Group Indicator shall be releated for every satellite and signal
     395       included in the corresponding Satellite Phase Bias Message in the same order. The
     396       Extended Satellite Phase Bias Message shall be sent BEFORE the corresponding
     397       Satellite Phase Bias Message VICE VERSA??*/
     398    if (b->NumberOfSat[s] && (type == PBEXTTYPE_AUTO || type == corType[s][COBOFS_PBEXT])) {
     399      INITBLOCK
     400      E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_PBEXT])
     401      switch (s) {
     402        case CLOCKORBIT_SATGPS:
     403        case CLOCKORBIT_SATGALILEO:
     404        case CLOCKORBIT_SATQZSS:
     405        case CLOCKORBIT_SATSBAS:
     406        case CLOCKORBIT_SATBDS:
     407          E_GPS_EPOCH_TIME(b->EpochTime[s])
     408          break;
     409        case CLOCKORBIT_SATGLONASS:
     410          E_GLONASS_EPOCH_TIME(b->EpochTime[s])
     411          break;
     412      }
     413      E_SSR_IOD(b->SSRIOD)
     414      E_SSR_PROVIDER_ID(b->SSRProviderID)
     415      E_SSR_SOLUTION_ID(b->SSRSolutionID)
     416      E_EXTENDED_PHASE_BIAS_ID(b->ExtendedPhaseBiasPropertyID)
     417      for (i = satoffset[s]; i < satoffset[s] + b->NumberOfSat[s]; ++i) {
     418        for (j = 0; j < b->Sat[i].NumberOfPhaseBiases; ++j) {
     419          E_WIDE_LANE_INDICATOR(b->Sat[i].Biases[j].WidelaneGroupIndicator)
     420        }
     421      }
     422      ENDBLOCK
     423    }
    424424  }
    425425  return ressize;
     
    561561    /* COBOFS_* are per-instance (set in setCorType()), not compile-time
    562562       constants, so this has to be an if/else-if chain rather than a switch. */
    563     if (kind == COBOFS_PBIAS) {
     563    if      (kind == COBOFS_PBIAS) {
    564564          if (!pb)
    565565            return GCOBR_NOPHASEBIASPARAMETER;
    566566          pb->messageType = type;
     567          /* Header Part*/
    567568          switch (s) {
    568569            case CLOCKORBIT_SATGPS:
     
    586587          D_NO_OF_SATELLITES(nums)
    587588#ifdef BNC_DEBUG_SSR
    588           fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d dispInd %d mwInd %d\n",
    589                           pb->EpochTime[s], pb->UpdateInterval,mmi,pb->NumberOfSat[s],nums,
    590                                   pb->SSRIOD, pb->SSRProviderID, pb->SSRSolutionID,
    591                                   pb->DispersiveBiasConsistencyIndicator, pb->MWConsistencyIndicator);
    592 #endif
     589          fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d yawInd %d extpbInd %d\n",
     590                              pb->EpochTime[s], pb->UpdateInterval,mmi,pb->NumberOfSat[s],nums,
     591                                          pb->SSRIOD, pb->SSRProviderID, pb->SSRSolutionID,
     592                                          pb->SatelliteYawInformationIndicator, pb->ExtendedPhaseBiasPropertyID);
     593#endif
     594          /* Satellite Specific Part*/
    593595          for (i = 0; i < nums; ++i) {
    594596            D_GPS_SATELLITE_ID(id)
     
    608610            fprintf(stderr, "id %2d #%d y %10.6f yr %10.6f ",
    609611                    pb->Sat[pos].ID, pb->Sat[pos].NumberOfPhaseBiases,
    610                                         pb->Sat[pos].YawAngle/MPI, pb->Sat[pos].YawRate/MPI);
    611 #endif
     612                                                  pb->Sat[pos].YawAngle/MPI, pb->Sat[pos].YawRate/MPI);
     613#endif
     614            /* Signal Specific Part */
    612615            for (j = 0; j < pb->Sat[pos].NumberOfPhaseBiases; ++j) {
    613616              D_GNSS_SIGNAL_IDENTIFIER(pb->Sat[pos].Biases[j].Type)
    614617              D_INTEGER_INDICATOR(pb->Sat[pos].Biases[j].IntegerIndicator)
    615              // D_WIDE_LANE_INDICATOR(pb->Sat[pos].Biases[j].WidelaneGroupIndicator)
    616618              D_DISCONTINUITY_COUNTER(pb->Sat[pos].Biases[j].DiscontinuityCounter)
    617619              D_PHASE_BIAS_CORRECTION(pb->Sat[pos].Biases[j].Bias)
     620#ifdef BNC_DEBUG_SSR
     621              fprintf(stderr, "t%02d int %d disc %d b %8.4f ",
     622                      pb->Sat[pos].Biases[j].Type,
     623                                                    pb->Sat[pos].Biases[j].IntegerIndicator,
     624                                                  pb->Sat[pos].Biases[j].DiscontinuityCounter,
     625                                                    pb->Sat[pos].Biases[j].Bias);
     626#endif
     627            }
     628#ifdef BNC_DEBUG_SSR
     629            fprintf(stderr, "\n");
     630#endif
     631          }
     632    }
     633    else if (kind == COBOFS_PBEXT) {
     634      unsigned int EpochTime, SSRIOD, SSRProviderID, SSRSolutionID, ExtendedPhaseBiasPropertyID;
     635        if (!pb)
     636          return GCOBR_NOPHASEBIASPARAMETER;
     637        pb->messageExtType = type;
     638        switch (s) {
     639          case CLOCKORBIT_SATGPS:
     640          case CLOCKORBIT_SATGALILEO:
     641          case CLOCKORBIT_SATQZSS:
     642          case CLOCKORBIT_SATSBAS:
     643          case CLOCKORBIT_SATBDS:
     644            D_GPS_EPOCH_TIME(EpochTime)
     645            break;
     646          case CLOCKORBIT_SATGLONASS:
     647            D_GLONASS_EPOCH_TIME(EpochTime)
     648            break;
     649        }
     650        D_SSR_IOD(SSRIOD)
     651        D_SSR_PROVIDER_ID(SSRProviderID)
     652        D_SSR_SOLUTION_ID(SSRSolutionID)
     653        D_EXTENDED_PHASE_BIAS_ID(ExtendedPhaseBiasPropertyID)
     654#ifdef BNC_DEBUG_SSR
     655        fprintf(stderr, "epochTime %d/%d ssrIod %d/%d  providerId %d/%d  solId %d/%d  extpbInd %d/%d \n",
     656                      EpochTime, pb->EpochTime[s],
     657                            SSRIOD, pb->SSRIOD,
     658                SSRProviderID, pb->SSRProviderID,
     659                SSRSolutionID, pb->SSRSolutionID,
     660                            ExtendedPhaseBiasPropertyID, pb->ExtendedPhaseBiasPropertyID);
     661#endif
     662        if (EpochTime == pb->EpochTime[s] &&
     663            ExtendedPhaseBiasPropertyID == pb->ExtendedPhaseBiasPropertyID) {
     664          for (i = 0; i < pb->NumberOfSat[s]; ++i) {
     665            for (pos = satoffset[s];
     666                pos < satoffset[s] + pb->NumberOfSat[s];
     667                ++pos)
     668              ;
     669            if (pos >= satoffset[s + 1])
     670              return GCOBR_DATAMISMATCH;
     671            else if (pos == pb->NumberOfSat[s] + satoffset[s])
     672              ++pb->NumberOfSat[s];
     673#ifdef BNC_DEBUG_SSR
     674            fprintf(stderr, "id %2d ", pb->Sat[pos].ID);
     675#endif
     676            for (j = 0; j < pb->Sat[pos].NumberOfPhaseBiases; ++j) {
     677              D_WIDE_LANE_INDICATOR(pb->Sat[pos].Biases[j].WidelaneGroupIndicator)
    618678#ifdef BNC_DEBUG_SSR
    619679              fprintf(stderr, "t%02d int %d /*wl %d*/ disc %d b %8.4f ",
    620680                      pb->Sat[pos].Biases[j].Type,
    621681                                          pb->Sat[pos].Biases[j].IntegerIndicator,
    622                                           //pb->Sat[pos].Biases[j].WidelaneGroupIndicator,
     682                                          pb->Sat[pos].Biases[j].WidelaneGroupIndicator,
    623683                                          pb->Sat[pos].Biases[j].DiscontinuityCounter,
    624684                                          pb->Sat[pos].Biases[j].Bias);
     
    629689#endif
    630690          }
     691        }
    631692    }
    632693    else if (kind == COBOFS_ORBIT) {
     
    9541015#ifdef BNC_DEBUG_SSR
    9551016          fprintf(stderr, "epochTime %d ui %d mmi %d sats %d/%d ssrIod %d providerId %d solId %d\n",
    956                           b->EpochTime[s], b->UpdateInterval,mmi,b->NumberOfSat[s],nums,
    957                                   b->SSRIOD, b->SSRProviderID, b->SSRSolutionID);
     1017                          b->EpochTime[s], b->UpdateInterval,mmi,b->NumberOfSat[s],nums,
     1018                                          b->SSRIOD, b->SSRProviderID, b->SSRSolutionID);
    9581019#endif
    9591020          for (i = 0; i < nums; ++i) {
  • trunk/BNC/src/ephemeris.cpp

    r10993 r10998  
    736736  // the one recommended together with RTCM-SSR corrections; the classic
    737737  // eccentricity-based form is used otherwise (broadcast-only or IGS-SSR).
    738   if (_orbCorr && _orbCorr->_rtcmSsr) {
     738  if (_orbCorr && _orbCorr->_ssrFormat == ssrRtcmNew) {
    739739    xc[3] -= 2.0 * (xc[0]*vv[0] + xc[1]*vv[1] + xc[2]*vv[2]) / t_CST::c / t_CST::c;
    740740  }
     
    20662066  // See t_ephGPS::position() for the rationale behind selecting between the
    20672067  // eccentricity-based and velocity-based forms.
    2068   if (_orbCorr && _orbCorr->_rtcmSsr) {
     2068  if (_orbCorr && _orbCorr->_ssrFormat == ssrRtcmNew) {
    20692069    xc[3] -= 2.0 * (xc[0]*vv[0] + xc[1]*vv[1] + xc[2]*vv[2]) / t_CST::c / t_CST::c;
    20702070  }
     
    29772977  // See t_ephGPS::position() for the rationale behind selecting between the
    29782978  // eccentricity-based and velocity-based forms.
    2979   if (_orbCorr && _orbCorr->_rtcmSsr) {
     2979  if (_orbCorr && _orbCorr->_ssrFormat == ssrRtcmNew) {
    29802980    xc[3] -= 2.0 * (xc[0]*vv[0] + xc[1]*vv[1] + xc[2]*vv[2]) / t_CST::c / t_CST::c;
    29812981  }
  • trunk/BNC/src/satObs.cpp

    r10993 r10998  
    8686  _xr.ReSize(3);    _xr    = 0.0;
    8787  _dotXr.ReSize(3); _dotXr = 0.0;
    88   _rtcmSsr   = false;
     88  _ssrFormat = ssrUnknown;
    8989}
    9090
     
    105105           << corr._updateInt <<  " "
    106106           << corrList.size() << ' ' << corr._staID << endl;
     107      *out << " " << static_cast<int>(corr._ssrFormat) << endl;
    107108    }
    108109    *out << corr._prn.toString() << ' ' << setw(11) << corr._iod << ' '
     
    112113         << setw(10) << setprecision(4) << corr._dotXr[0] * 1.e3 << ' '   // m/s => mm/s
    113114         << setw(10) << setprecision(4) << corr._dotXr[1] * 1.e3 << ' '   // m/s => mm/s
    114          << setw(10) << setprecision(4) << corr._dotXr[2] * 1.e3 << ' '   // m/s => mm/s
    115          << (corr._rtcmSsr ? 1 : 0) << endl;
     115         << setw(10) << setprecision(4) << corr._dotXr[2] * 1.e3 << endl; // m/s => mm/s
    116116  }
    117117  out->flush();
     
    128128    return;
    129129  }
     130
     131  e_ssrFormat ssrFormat = ssrUnknown;
     132  {
     133    string line;
     134    getline(inStream, line);
     135    istringstream in(line.c_str());
     136    int ssrFormatInt = 0;
     137    if (in >> ssrFormatInt) {
     138      ssrFormat = static_cast<e_ssrFormat>(ssrFormatInt);
     139    }
     140  }
     141
    130142  for (int ii = 0; ii < numCorr; ii++) {
    131143    t_orbCorr corr;
     
    133145    corr._updateInt = updateInt;
    134146    corr._staID     = staID;
     147    corr._ssrFormat = ssrFormat;
    135148
    136149    string line;
     
    150163    corr._dotXr[1] /= 1.e3; // mm/s => m/s
    151164    corr._dotXr[2] /= 1.e3; // mm/s => m/s
    152 
    153     // Optional trailing column - absent in files written before this field
    154     // existed, in which case the source format is unknown and defaults to
    155     // the classic eccentricity-based relativistic correction.
    156     int rtcmSsrFlag = 0;
    157     if (in >> rtcmSsrFlag) {
    158       corr._rtcmSsr = (rtcmSsrFlag != 0);
    159     }
    160     else {
    161       corr._rtcmSsr = false;
    162     }
    163165
    164166    corrList.push_back(corr);
     
    312314           << satPhaseBias._updateInt <<  " "
    313315           << biasList.size() << ' ' << satPhaseBias._staID <<  endl;
    314       *out << " " << satPhaseBias._dispBiasConstistInd << "   "
     316      *out << " " << static_cast<int>(satPhaseBias._ssrFormat) << "   "
     317           << satPhaseBias._dispBiasConstistInd << "   "
    315318           << satPhaseBias._MWConsistInd << endl;
    316319    }
     
    341344  unsigned int dispInd;
    342345  unsigned int mwInd;
     346  e_ssrFormat  ssrFormat = ssrUnknown;
    343347  if (t_corrSSR::readEpoLine(epoLine, epoTime, updateInt, numSat, staID) != t_corrSSR::phaseBias) {
    344348    return;
     
    355359
    356360    if (ii == 0) {
    357       in >> dispInd >> mwInd;
     361      int ssrFormatInt = 0;
     362      in >> ssrFormatInt >> dispInd >> mwInd;
     363      ssrFormat = static_cast<e_ssrFormat>(ssrFormatInt);
    358364      continue;
    359365    }
     366    satPhaseBias._ssrFormat = ssrFormat;
    360367    satPhaseBias._dispBiasConstistInd = dispInd;
    361368    satPhaseBias._MWConsistInd = mwInd;
  • trunk/BNC/src/satObs.h

    r10993 r10998  
    104104};
    105105
     106// SSR source format, shared by orbit corrections and phase biases: governs the
     107// relativistic-correction formula for orbits (velocity-based per IS-GPS-200D
     108// 20.3.3.3.3.1 for RTCM-SSR/RTCM-SSR-new, classic eccentricity-based otherwise)
     109// and the applicable parameter set for phase biases (old vs new RTCM-SSR).
     110enum e_ssrFormat {ssrUnknown = 0, ssrRtcmOld = 1, ssrRtcmNew = 2};
     111
    106112class t_orbCorr {
    107113 public:
     
    117123  ColumnVector   _xr;
    118124  ColumnVector   _dotXr;
    119   bool           _rtcmSsr; // true: RTCM-SSR/RTCM-SSR-new source (velocity-based relativistic
    120                             // correction per IS-GPS-200D 20.3.3.3.3.1); false: IGS-SSR or
    121                             // unknown source (classic eccentricity-based correction)
     125  e_ssrFormat    _ssrFormat;
    122126};
    123127
     
    192196  t_satPhaseBias() {
    193197    _updateInt  = 0;
     198    _ssrFormat  = ssrUnknown;
    194199    _dispBiasConstistInd = 0;
    195200    _MWConsistInd = 0;
     
    203208  bncTime                     _time;
    204209  unsigned int                _updateInt;           // not satellite specific
     210  e_ssrFormat                 _ssrFormat;           // not satellite specific
    205211  unsigned int                _dispBiasConstistInd; // not satellite specific
    206212  unsigned int                _MWConsistInd;        // not satellite specific
Note: See TracChangeset for help on using the changeset viewer.