Changeset 11130 in ntrip for trunk/BNC/src/RTCM3
- Timestamp:
- Oct 28, 2026, 9:32:30 AM (2 weeks ago)
- Location:
- trunk/BNC/src/RTCM3
- Files:
-
- 4 edited
-
RTCM3Decoder.cpp (modified) (4 diffs)
-
bits.h (modified) (2 diffs)
-
clock_and_orbit/clock_orbit.h (modified) (1 diff)
-
clock_and_orbit/clock_orbit_rtcm_new.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/RTCM3Decoder.cpp
r11124 r11130 39 39 * -----------------------------------------------------------------------*/ 40 40 41 #include <atomic> 41 42 #include <iostream> 42 43 #include <iomanip> … … 241 242 /** 242 243 * Frequency numbers of GLONASS with an offset of 100 to detect unset values. 243 * Gets filled by ephemeris and data blocks and shared between different streams. 244 * Gets filled by ephemeris and data blocks and shared between different streams 245 * (MSM4/6 streams without channel numbers use those of an ephemeris stream). 246 * Atomic, as the streams are decoded in different threads. 244 247 */ 245 static intGLOFreq[RTCM3_MSM_NUMSAT];248 static std::atomic<int> GLOFreq[RTCM3_MSM_NUMSAT]; 246 249 247 250 /* … … 1998 2001 GETSTRING(antnum, antenna) 1999 2002 if ((antnum > -1 && antnum < 265) && 2000 (_antType.empty() || strncmp(_antType.back()._descriptor, antenna, recnum) != 0)) { 2003 (_antType.empty() || int(strlen(_antType.back()._descriptor)) != antnum || 2004 strncmp(_antType.back()._descriptor, antenna, antnum) != 0)) { 2001 2005 _antType.push_back(t_antInfo()); 2002 2006 memcpy(_antType.back()._descriptor, antenna, antnum); … … 2017 2021 GETSTRING(recsernum, recserialnum) 2018 2022 if ((recnum > -1 && recnum < 265) && 2019 (_recType.empty() || strncmp(_recType.back()._descriptor, receiver, recnum) != 0)) { 2023 (_recType.empty() || int(strlen(_recType.back()._descriptor)) != recnum || 2024 strncmp(_recType.back()._descriptor, receiver, recnum) != 0)) { 2020 2025 _recType.push_back(t_recInfo()); 2021 2026 memcpy(_recType.back()._descriptor, receiver, recnum); -
trunk/BNC/src/RTCM3/bits.h
r11023 r11130 104 104 b = variable to store size, s = variable to store string pointer */ 105 105 #define GETSTRING(b, s) { \ 106 if(size < 1) return false; \ 106 107 b = *(data++); \ 108 --size; \ 109 if((b) > size) return false; \ 107 110 s = (char *) data; \ 108 111 data += b; \ 109 size -= b +1; \112 size -= b; \ 110 113 } 111 114 … … 126 129 } 127 130 131 /* up to 56 bits: less than 8 bits are pending in the 64-bit bitbuffer */ 128 132 #define ADDBITS(a, b) { \ 129 bitbuffer = (bitbuffer<<(a))|(( b)&((1<<a)-1)); \133 bitbuffer = (bitbuffer<<(a))|((uint64_t)(b)&((1ULL<<(a))-1)); \ 130 134 numbits += (a); \ 131 135 STOREBITS \ -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit.h
r11124 r11130 605 605 #define E_NADIR_ANGLE_DEPENDENT_CORR_RANGE_EXTENSION(a) ADDBITS(4, a) /* DF+015 (new RTCM) to extend DF+021*/ 606 606 #define E_SATELLITE_SET_INDICATOR(a) ADDBITS(1, a) /* DF+016 (new RTCM) */ 607 /* ADDBITS' mask "(1<<a)-1" uses a 32-bit int literal, so a plain 608 ADDBITS(64, a) is broken the same way GETSSRBITS(a, 64) was on decode 609 (see D_SATELLITE_MASK) - here even ADDBITS(32, ...) is unsafe, since 610 shifting a 32-bit int by exactly its own width is undefined behavior 611 too. Stay well clear of that edge by writing four 16-bit chunks. */ 607 /* ADDBITS handles up to 56 bits, so the 64-bit mask is written as two 608 32-bit halves (as GETSSRBITS(a, 64) does not work either, see 609 D_SATELLITE_MASK). */ 612 610 #define E_SATELLITE_MASK(a) { \ 613 611 uint64_t mask64_ = (a); \ 614 ADDBITS(16, (mask64_ >> 48) & 0xFFFFU) \ 615 ADDBITS(16, (mask64_ >> 32) & 0xFFFFU) \ 616 ADDBITS(16, (mask64_ >> 16) & 0xFFFFU) \ 617 ADDBITS(16, mask64_ & 0xFFFFU) \ 612 ADDBITS(32, mask64_ >> 32) \ 613 ADDBITS(32, mask64_ & 0xFFFFFFFFU) \ 618 614 } /* DF394 */ 619 615 #define E_FREQUENCY_SET_INDICATOR(a) ADDBITS(1, a) /* DF+017 (new RTCM) */ -
trunk/BNC/src/RTCM3/clock_and_orbit/clock_orbit_rtcm_new.cpp
r11126 r11130 489 489 if (md->Entries[i].nonDefaultIndicator && 490 490 md->Entries[i].additionalParameterIndicator) { 491 /* up to 255 bits, only 32 stored (leadingbits zero); in pieces of492 16 bits, as ADDBITS cannot handle more than 30 bits*/491 /* up to 255 bits, only 32 stored: leading zero bits (ADDBITS 492 handles at most 56 bits at a time), then the value */ 493 493 unsigned int k = md->Entries[i].additionalParameterNumBits; 494 while (k) { 495 unsigned int n = (k > 16) ? 16 : k; 494 while (k > 32) { 495 unsigned int n = (k - 32 > 56) ? 56 : k - 32; 496 ADDBITS(n, 0) 496 497 k -= n; 497 E_ADDITIONAL_MODEL_PARAMETER_DATA((k < 32) ? (md->Entries[i].additionalParameterData >> k) : 0, n) 498 } 498 } 499 if (k) 500 E_ADDITIONAL_MODEL_PARAMETER_DATA(md->Entries[i].additionalParameterData, k) 499 501 } 500 502 }
Note:
See TracChangeset
for help on using the changeset viewer.
