Changeset 11034 in ntrip


Ignore:
Timestamp:
Sep 21, 2026, 2:06:01 PM (3 days ago)
Author:
stuerze
Message:

updates regarding RTCM-SSR

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

Legend:

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

    r11031 r11034  
    7878  GCOBR_NOPHASEBIASPARAMETER = -12,
    7979  GCOBR_NOVTECPARAMETER = -13,
     80  GCOBR_NOANTENNAPARAMETER = -14,
    8081  /* data mismatch - data in storage does not match new data */
    8182  GCOBR_TIMEMISMATCH = -20,
     
    478479
    479480  struct Antenna {
    480     unsigned int SSRProviderID;
    481     unsigned int SatelliteAntennaIOD;
    482     unsigned int PhaseCenterInformationIndicator;
    483     unsigned int GroupDelayInformationIndicator;
    484     unsigned int NadirAngleDependentCorrectionIndicator;
    485     unsigned int maximumOffNadirAngle;
    486     unsigned int NadirAngleDependentCorrectionRangeExtension;
    487     unsigned int SatelliteSetIndicator;
    488     unsigned int SatelliteMask;
     481    SatAntennaType messageType[CLOCKORBIT_SATNUM];
     482    unsigned int SSRProviderID[CLOCKORBIT_SATNUM];
     483    unsigned int SatelliteAntennaIOD[CLOCKORBIT_SATNUM];
     484    unsigned int PhaseCenterInformationIndicator[CLOCKORBIT_SATNUM];
     485    unsigned int GroupDelayInformationIndicator[CLOCKORBIT_SATNUM];
     486    unsigned int NadirAngleDependentCorrectionIndicator[CLOCKORBIT_SATNUM];
     487    unsigned int maximumOffNadirAngle[CLOCKORBIT_SATNUM];
     488    unsigned int NadirAngleDependentCorrectionRangeExtension[CLOCKORBIT_SATNUM];
     489    unsigned int SatelliteSetIndicator[CLOCKORBIT_SATNUM];
     490    uint64_t SatelliteMask[CLOCKORBIT_SATNUM];
    489491    struct SatellitePart {
    490492      unsigned int FrequencySetIndicator;
     
    496498      } Freq[ANT_MAXFREQUENCIES];
    497499    } Sat[CLOCKORBIT_COUNTSAT];
    498   } GNSS[CLOCKORBIT_SATNUM];
     500  };
    499501
    500502  /* return size of resulting data or 0 in case of an error */
     
    598600#define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4,  a)                      /* DF+015 (new RTCM) to extend DF+021*/
    599601#define E_SATELLITE_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+016 (new RTCM) */
     602#define E_SATELLITE_MASK(a)                             ADDBITS(64, a)                      /* DF394 */
    600603#define E_FREQUENCY_SET_INDICATOR(a)                    ADDBITS(1,  a)                      /* DF+017 (new RTCM) */
    601604#define E_GNSS_FREQUENCY_MASK(a)                        ADDBITS(6,  a)                      /* DF+018 (new RTCM) */
     
    843846/* Antenna Information*/
    844847#define D_SATELLITE_ANTENNA_IOD(a)                      GETSSRBITS(a,  6)                    /* DF+010 (new RTCM) */
    845 #define D_PHASE_CENTER_INFO_INDICATORD(a)               GETSSRBITS(a,  1)                    /* DF+011 (new RTCM) */   
     848#define D_PHASE_CENTER_INFO_INDICATOR(a)                GETSSRBITS(a,  1)                    /* DF+011 (new RTCM) */   
    846849#define D_GROUP_DELAY_INFO_INDICATOR(a)                 GETSSRBITS(a,  1)                    /* DF+012 (new RTCM) */   
    847850#define D_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a)       GETSSRBITS(a,  1)                    /* DF+013 (new RTCM) */
     851#define D_MAXIMUM_OFF_NADIR_ANGLE(a)                    GETSSRBITS(a,  5)                    /* DF+014 (new RTCM  */
    848852#define D_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) GETSSRBITS(a,  4)                    /* DF+015 (new RTCM) required to extend DF+021*/
    849853#define D_SATELLITE_SET_INDICATOR(a)                    GETSSRBITS(a,  1)                    /* DF+016 (new RTCM) */
    850 #define D_FREQUENCY_SET_INDICATOR (a)                   GETSSRBITS(a,  1)                    /* DF+017 (new RTCM) */
    851 #define D_GNSS_FREQUENCY_MASK (a)                       GETSSRBITS(a,  6)                    /* DF+018 (new RTCM) */
     854/* GETSSRBITS cannot safely read a full 64 bits in one call: bitbuffer is
     855   itself only 64 bits wide, so LOADSSRBITS's loop (which keeps whatever
     856   residual (0-7) bits are already buffered from the previous field) can be
     857   asked to hold residual+64 bits at once, silently shifting the residual
     858   bits out before extraction. Split into two 32-bit reads instead, each of
     859   which stays safely within bitbuffer's capacity. */
     860#define D_SATELLITE_MASK(a)                             { \
     861  unsigned int maskHi32, maskLo32; \
     862  GETSSRBITS(maskHi32, 32) \
     863  GETSSRBITS(maskLo32, 32) \
     864  (a) = ((uint64_t)maskHi32 << 32) | maskLo32; \
     865}                                                                             /* DF394 */
     866#define D_FREQUENCY_SET_INDICATOR(a)                    GETSSRBITS(a,  1)                    /* DF+017 (new RTCM) */
     867#define D_GNSS_FREQUENCY_MASK(a)                        GETSSRBITS(a,  6)                    /* DF+018 (new RTCM) */
    852868#define D_NADIR_CORR_INDICATOR(a)                       GETSSRBITS(a,  1)                    /* DF+019 (new RTCM) */
    853869#define D_NADIR_CORRECTION(a)                           GETSSRFLOATSIGN(a, 12, 1/1000.0)     /* DF+020 (new RTCM) in [m] */
  • trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp

    r11032 r11034  
    11091109      }
    11101110    }
    1111     //else if (kind == COBOFS_)
     1111    else if (kind == COBOFS_SATANT) {
     1112      unsigned int k, satBlockIdx, numSatBlocks;
     1113      unsigned int freqBlockIdx, numFreqBlocks, f;
     1114      unsigned int deg;
     1115      unsigned int satPositions[64], numSatPositions = 0;
     1116      unsigned int freqPositions[ANT_MAXFREQUENCIES], numFreqPositions;
     1117      if (!a)
     1118        return GCOBR_NOANTENNAPARAMETER;
     1119      a->messageType[s] = type;
     1120      D_SSR_PROVIDER_ID(a->SSRProviderID[s])
     1121      D_SATELLITE_ANTENNA_IOD(a->SatelliteAntennaIOD[s])
     1122      D_PHASE_CENTER_INFO_INDICATOR(a->PhaseCenterInformationIndicator[s])
     1123      D_GROUP_DELAY_INFO_INDICATOR(a->GroupDelayInformationIndicator[s])
     1124      D_NADIR_ANGLE_DEPENDENT_CORR_INDICATOR(a->NadirAngleDependentCorrectionIndicator[s])
     1125      if (a->NadirAngleDependentCorrectionIndicator[s]) {
     1126        D_MAXIMUM_OFF_NADIR_ANGLE(a->maximumOffNadirAngle[s])
     1127        D_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a->NadirAngleDependentCorrectionRangeExtension[s])
     1128      }
     1129      else {
     1130        a->maximumOffNadirAngle[s] = 0;
     1131        a->NadirAngleDependentCorrectionRangeExtension[s] = 0;
     1132      }
     1133      D_SATELLITE_SET_INDICATOR(a->SatelliteSetIndicator[s])
     1134      D_SATELLITE_MASK(a->SatelliteMask[s])
     1135#ifdef BNC_DEBUG_SSR
     1136      fprintf(stderr, "type %d providerId %d  satAntIOD %d  PCInfoInd %d GDInfoInd %d NadirAngleDepCorrInd %d "
     1137                      " maxOffNadirAngle %d NadirAngleDepCorrRangeExt %d SatSetInd %d SatMask %llx\n",
     1138        a->messageType[s], a->SSRProviderID[s], a->SatelliteAntennaIOD[s],
     1139        a->PhaseCenterInformationIndicator[s], a->GroupDelayInformationIndicator[s],
     1140        a->NadirAngleDependentCorrectionIndicator[s],a->maximumOffNadirAngle[s],
     1141        a->NadirAngleDependentCorrectionRangeExtension[s],
     1142        a->SatelliteSetIndicator[s], (unsigned long long)a->SatelliteMask[s]);
     1143#endif
     1144
     1145      /* DF394 satellite mask: MSB (bit 63) = satellite 1 within this system,
     1146         same convention as the MSM satellite mask that shares this field. */
     1147      for (k = 0; k < 64 && satoffset[s] + k < satoffset[s + 1]; ++k) {
     1148        if ((a->SatelliteMask[s] >> (63 - k)) & 1ULL)
     1149          satPositions[numSatPositions++] = satoffset[s] + k;
     1150      }
     1151      numSatBlocks = a->SatelliteSetIndicator[s] ? (numSatPositions ? 1 : 0) : numSatPositions;
     1152
     1153      for (satBlockIdx = 0; satBlockIdx < numSatBlocks; ++satBlockIdx) {
     1154        struct Antenna::SatellitePart satBlock;
     1155        D_FREQUENCY_SET_INDICATOR(satBlock.FrequencySetIndicator)
     1156        D_GNSS_FREQUENCY_MASK(satBlock.GnssFrequencyMask)
     1157
     1158        numFreqPositions = 0;
     1159        for (k = 0; k < ANT_MAXFREQUENCIES; ++k) {
     1160          if ((satBlock.GnssFrequencyMask >> k) & 1U)
     1161            freqPositions[numFreqPositions++] = k;
     1162        }
     1163        numFreqBlocks = satBlock.FrequencySetIndicator ? (numFreqPositions ? 1 : 0) : numFreqPositions;
     1164
     1165        for (freqBlockIdx = 0; freqBlockIdx < numFreqBlocks; ++freqBlockIdx) {
     1166          f = satBlock.FrequencySetIndicator ? freqPositions[0] : freqPositions[freqBlockIdx];
     1167          D_NADIR_CORR_INDICATOR(satBlock.Freq[f].NadirCorrectionIndicator)
     1168          if (satBlock.Freq[f].NadirCorrectionIndicator)
     1169            D_NADIR_CORRECTION(satBlock.Freq[f].NadirCorrection)
     1170          if (a->NadirAngleDependentCorrectionIndicator[s]) {
     1171            for (deg = 0; deg <= a->maximumOffNadirAngle[s] && deg < ANT_MAXNADIRDEGREES; ++deg)
     1172              D_NADIR_ANGLE_DEPENDENT_CORRECTION(satBlock.Freq[f].NadirAngleCorrection[deg],
     1173                a->NadirAngleDependentCorrectionRangeExtension[s])
     1174          }
     1175#ifdef BNC_DEBUG_SSR
     1176          fprintf(stderr, "  freq %d nadirCorrInd %d nadirCorr %d\n",
     1177            f, satBlock.Freq[f].NadirCorrectionIndicator, satBlock.Freq[f].NadirCorrection);
     1178#endif
     1179          if (satBlock.FrequencySetIndicator) {
     1180            for (k = 1; k < numFreqPositions; ++k)
     1181              satBlock.Freq[freqPositions[k]] = satBlock.Freq[f];
     1182          }
     1183        }
     1184
     1185        if (a->SatelliteSetIndicator[s]) {
     1186          for (k = 0; k < numSatPositions; ++k)
     1187            a->Sat[satPositions[k]] = satBlock;
     1188        }
     1189        else {
     1190          a->Sat[satPositions[satBlockIdx]] = satBlock;
     1191        }
     1192      }
     1193    }
    11121194    else {
    11131195      /* COBOFS_SATANT / COBOFS_REGIONO: message numbers are
Note: See TracChangeset for help on using the changeset viewer.