Changeset 11042 in ntrip for trunk/BNC/src/RTCM3
- Timestamp:
- Sep 22, 2026, 5:19:12 PM (13 days ago)
- Location:
- trunk/BNC/src/RTCM3/clock_and_orbit
- Files:
-
- 7 edited
-
clock_orbit.h (modified) (1 diff)
-
clock_orbit_igs.cpp (modified) (1 diff)
-
clock_orbit_igs.h (modified) (1 diff)
-
clock_orbit_rtcm.cpp (modified) (1 diff)
-
clock_orbit_rtcm.h (modified) (1 diff)
-
clock_orbit_rtcm_new.cpp (modified) (2 diffs)
-
clock_orbit_rtcm_new.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h
r11041 r11042 604 604 #define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4, a) /* DF+015 (new RTCM) to extend DF+021*/ 605 605 #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 */ 607 618 #define E_FREQUENCY_SET_INDICATOR(a) ADDBITS(1, a) /* DF+017 (new RTCM) */ 608 619 #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 945 945 } 946 946 947 // 948 //////////////////////////////////////////////////////////////////////////// 949 size_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 227 227 size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size); 228 228 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); 229 230 enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v, 230 231 struct PhaseBias *pb, struct MetaData *md, struct Antenna* a, -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm.cpp
r11041 r11042 1399 1399 } 1400 1400 1401 // 1402 //////////////////////////////////////////////////////////////////////////// 1403 size_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 226 226 size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size); 227 227 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); 228 229 enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v, 229 230 struct PhaseBias *pb, struct MetaData *md, struct Antenna* a, -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp
r11041 r11042 495 495 } 496 496 497 // 498 //////////////////////////////////////////////////////////////////////////// 499 size_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 497 571 enum GCOB_RETURN SsrCorrRtcmNew::GetSSR(struct ClockOrbit* co, struct CodeBias* cb, struct VTEC* v, 498 572 struct PhaseBias* pb, struct MetaData* md, struct Antenna* a, const char* buffer, size_t size, int* bytesused) { … … 1152 1226 1153 1227 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 = {}; 1155 1237 D_FREQUENCY_SET_INDICATOR(satBlock.FrequencySetIndicator) 1156 1238 D_GNSS_FREQUENCY_MASK(satBlock.GnssFrequencyMask) -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.h
r11041 r11042 280 280 size_t MakeVTEC(const struct VTEC *v, int moremessagesfollow, char *buffer, size_t size); 281 281 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); 282 283 enum GCOB_RETURN GetSSR(struct ClockOrbit *co, struct CodeBias *cb, struct VTEC *v, 283 284 struct PhaseBias *pb, struct MetaData *md, struct Antenna* a,
Note:
See TracChangeset
for help on using the changeset viewer.
