Changeset 11042 in ntrip for trunk/BNC/src/RTCM3


Ignore:
Timestamp:
Sep 22, 2026, 5:19:12 PM (13 days ago)
Author:
stuerze
Message:

updates regarding RTCM-SSR

Location:
trunk/BNC/src/RTCM3/clock_and_orbit
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h

    r11041 r11042  
    604604#define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4,  a)                      /* DF+015 (new RTCM) to extend DF+021*/
    605605#define E_SATELLITE_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+016 (new RTCM) */
    606 #define E_SATELLITE_MASK(a)                             ADDBITS(64, a)                      /* DF394 */
     606/* ADDBITS' mask "(1<<a)-1" uses a 32-bit int literal, so a plain
     607   ADDBITS(64, a) is broken the same way GETSSRBITS(a, 64) was on decode
     608   (see D_SATELLITE_MASK) - here even ADDBITS(32, ...) is unsafe, since
     609   shifting a 32-bit int by exactly its own width is undefined behavior
     610   too. Stay well clear of that edge by writing four 16-bit chunks. */
     611#define E_SATELLITE_MASK(a)                             { \
     612  uint64_t mask64_ = (a); \
     613  ADDBITS(16, (mask64_ >> 48) & 0xFFFFU) \
     614  ADDBITS(16, (mask64_ >> 32) & 0xFFFFU) \
     615  ADDBITS(16, (mask64_ >> 16) & 0xFFFFU) \
     616  ADDBITS(16,  mask64_        & 0xFFFFU) \
     617}                                                                             /* DF394 */
    607618#define E_FREQUENCY_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+017 (new RTCM) */
    608619#define E_GNSS_FREQUENCY_MASK(a)                        ADDBITS(6,  a)                      /* DF+018 (new RTCM) */
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.cpp

    r11041 r11042  
    945945}
    946946
     947//
     948////////////////////////////////////////////////////////////////////////////
     949size_t SsrCorrIgs::MakeAntenna(const struct Antenna*, SatAntennaType, char*, size_t) {
     950  // This format does not encode Satellite Antenna message content; nothing
     951  // to encode.
     952  return 0;
     953}
     954
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_igs.h

    r11041 r11042  
    227227  size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size);
    228228  size_t MakeMetaData(const struct MetaData *md, char *buffer, size_t size);
     229  size_t MakeAntenna(const struct Antenna *a, SatAntennaType type, char *buffer, size_t size);
    229230  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v,
    230231                          struct PhaseBias *pb, struct MetaData *md, struct Antenna* a,
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp

    r11041 r11042  
    13991399}
    14001400
     1401//
     1402////////////////////////////////////////////////////////////////////////////
     1403size_t SsrCorrRtcm::MakeAntenna(const struct Antenna*, SatAntennaType, char*, size_t) {
     1404  // Satellite Antenna messages are not defined in (old) RTCM-SSR; nothing
     1405  // to encode.
     1406  return 0;
     1407}
     1408
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.h

    r11041 r11042  
    226226  size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size);
    227227  size_t MakeMetaData(const struct MetaData *md, char *buffer, size_t size);
     228  size_t MakeAntenna(const struct Antenna *a, SatAntennaType type, char *buffer, size_t size);
    228229  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v,
    229230                          struct PhaseBias *pb, struct MetaData *md, struct Antenna* a,
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp

    r11041 r11042  
    495495}
    496496
     497//
     498////////////////////////////////////////////////////////////////////////////
     499size_t SsrCorrRtcmNew::MakeAntenna(const struct Antenna* a, SatAntennaType type,
     500  char* buffer, size_t size) {
     501  unsigned int s, k, satBlockIdx, freqBlockIdx, deg, f, numSatBlocks, numFreqBlocks;
     502  unsigned int satPositions[64], numSatPositions;
     503  unsigned int freqPositions[ANT_MAXFREQUENCIES], numFreqPositions;
     504
     505  STARTDATA
     506
     507    for (s = 0; s < CLOCKORBIT_SATNUM; ++s) {
     508      if (a->SatelliteMask[s] == 0 ||
     509          !(type == SATANTTYPE_AUTO || type == corType[s][COBOFS_SATANT])) {
     510        continue;
     511      }
     512      INITBLOCK
     513        E_RTCM_MESSAGE_NUMBER(corType[s][COBOFS_SATANT])
     514        E_SSR_PROVIDER_ID(a->SSRProviderID[s])
     515        E_SATELLITE_ANTENNA_IOD(a->SatelliteAntennaIOD[s])
     516        E_PHASE_CENTER_INFO_INDICATOR(a->PhaseCenterInformationIndicator[s])
     517        E_GROUP_DELAY_INFO_INDICATOR(a->GroupDelayInformationIndicator[s])
     518        E_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a->NadirAngleDependentCorrectionIndicator[s])
     519        if (a->NadirAngleDependentCorrectionIndicator[s]) {
     520          E_MAXIMUM_OFF_NADIR_ANGLE(a->maximumOffNadirAngle[s])
     521          E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a->NadirAngleDependentCorrectionRangeExtension[s])
     522        }
     523        E_SATELLITE_SET_INDICATOR(a->SatelliteSetIndicator[s])
     524        E_SATELLITE_MASK(a->SatelliteMask[s])
     525
     526        /* same MSB-first mask convention as D_SATELLITE_MASK/GetSSR */
     527        numSatPositions = 0;
     528        for (k = 0; k < 64 && satoffset[s] + k < satoffset[s + 1]; ++k) {
     529          if ((a->SatelliteMask[s] >> (63 - k)) & 1ULL) {
     530            satPositions[numSatPositions++] = satoffset[s] + k;
     531          }
     532        }
     533        numSatBlocks = a->SatelliteSetIndicator[s] ? (numSatPositions ? 1 : 0) : numSatPositions;
     534
     535        for (satBlockIdx = 0; satBlockIdx < numSatBlocks; ++satBlockIdx) {
     536          /* satellites sharing a block (SatelliteSetIndicator set) must
     537             already carry identical Sat[] content - the caller is
     538             responsible for that, same as the encoder trusts NumberOfSat
     539             elsewhere; only the first masked satellite's data is sent */
     540          const struct Antenna::SatellitePart& satBlock = a->Sat[satPositions[satBlockIdx]];
     541          E_FREQUENCY_SET_INDICATOR(satBlock.FrequencySetIndicator)
     542          E_GNSS_FREQUENCY_MASK(satBlock.GnssFrequencyMask)
     543
     544          numFreqPositions = 0;
     545          for (k = 0; k < ANT_MAXFREQUENCIES; ++k) {
     546            if ((satBlock.GnssFrequencyMask >> (ANT_MAXFREQUENCIES - 1 - k)) & 1U) {
     547              freqPositions[numFreqPositions++] = k;
     548            }
     549          }
     550          numFreqBlocks = satBlock.FrequencySetIndicator ? (numFreqPositions ? 1 : 0) : numFreqPositions;
     551
     552          for (freqBlockIdx = 0; freqBlockIdx < numFreqBlocks; ++freqBlockIdx) {
     553            f = satBlock.FrequencySetIndicator ? freqPositions[0] : freqPositions[freqBlockIdx];
     554            E_NADIR_CORR_INDICATOR(satBlock.Freq[f].NadirCorrectionIndicator)
     555            if (satBlock.Freq[f].NadirCorrectionIndicator) {
     556              E_NADIR_CORRECTION(satBlock.Freq[f].NadirCorrection)
     557            }
     558            if (a->NadirAngleDependentCorrectionIndicator[s]) {
     559              for (deg = 0; deg <= a->maximumOffNadirAngle[s] && deg < ANT_MAXNADIRDEGREES; ++deg) {
     560                E_NADIR_ANGLE_DEPENDENT_CORRECTION(satBlock.Freq[f].NadirAngleCorrection[deg],
     561                  a->NadirAngleDependentCorrectionRangeExtension[s])
     562              }
     563            }
     564          }
     565        }
     566      ENDBLOCK
     567    }
     568  return ressize;
     569}
     570
    497571enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* v,
    498572  struct PhaseBias* pb, struct MetaData* md, struct Antenna* a, const char* buffer, size_t size, int* bytesused) {
    … …  
    11521226
    11531227      for (satBlockIdx = 0; satBlockIdx < numSatBlocks; ++satBlockIdx) {
    1154         struct Antenna::SatellitePart satBlock;
     1228        /* zero-initialized, not just declared: DF+019/DF+013 unset means the
     1229           correction IS zero (not "not present"), per spec - a plain
     1230           declaration left NadirCorrection/NadirAngleCorrection as
     1231           uninitialized stack garbage for every satellite/frequency whose
     1232           indicator was 0, which is nearly all of them in real data. This
     1233           went unnoticed because normal call depth happened to leave zero
     1234           there; it surfaced via a deeper (nested) call stack during
     1235           MakeAntenna round-trip testing. */
     1236        struct Antenna::SatellitePart satBlock = {};
    11551237        D_FREQUENCY_SET_INDICATOR(satBlock.FrequencySetIndicator)
    11561238        D_GNSS_FREQUENCY_MASK(satBlock.GnssFrequencyMask)
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h

    r11041 r11042  
    280280  size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size);
    281281  size_t MakeMetaData(const struct MetaData *md, char *buffer, size_t size);
     282  size_t MakeAntenna(const struct Antenna *a, SatAntennaType type, char *buffer, size_t size);
    282283  enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v,
    283284                          struct PhaseBias *pb, struct MetaData *md, struct Antenna* a,
Note: See TracChangeset for help on using the changeset viewer.