Changeset 10534 in ntrip for trunk/BNC/src/RTCM3/bits.h
- Timestamp:
- Sep 17, 2024, 4:56:38 PM (2 days ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/RTCM3/bits.h
r9032 r10534 110 110 } 111 111 112 #define STARTDATA \ 113 size_t ressize=0; \ 114 char *blockstart=0; \ 115 int numbits=0; \ 116 uint64_t bitbuffer=0; 117 118 119 #define STOREBITS \ 120 while(numbits >= 8) { \ 121 if(!size) return 0; \ 122 *(buffer++) = bitbuffer>>(numbits-8); \ 123 numbits -= 8; \ 124 ++ressize; \ 125 --size; \ 126 } 127 128 #define ADDBITS(a, b) { \ 129 bitbuffer = (bitbuffer<<(a))|((b)&((1<<a)-1)); \ 130 numbits += (a); \ 131 STOREBITS \ 132 } 133 134 135 #define INITBLOCK \ 136 numbits = 0; \ 137 blockstart = buffer; \ 138 ADDBITS(8, 0xD3) \ 139 ADDBITS(6, 0) \ 140 ADDBITS(10, 0) 141 142 #define ENDBLOCK \ 143 if(numbits) { ADDBITS((8-numbits), 0) } { \ 144 int len = buffer-blockstart-3; \ 145 blockstart[1] |= len>>8; \ 146 blockstart[2] = len; \ 147 if(len > 1023) \ 148 return 0; \ 149 len = CRC24(len+3, (const unsigned char *) blockstart); \ 150 ADDBITS(24, len) \ 151 } 152 153 #define SCALEADDBITS(a, b, c) ADDBITS(a, (int64_t)(c > 0 ? b*c+0.5 : b*c-0.5)) 154 155 // RTCM3 GPS EPH encoding 156 ////////////////////////////////////////////////////////// 157 #define GPSTOINT(type, value) static_cast<type>(round(value)) 158 159 #define GPSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \ 160 |(GPSTOINT(long long,b)&((1ULL<<a)-1)); \ 161 numbits += (a); \ 162 while(numbits >= 8) { \ 163 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}} 164 165 #define GPSADDBITSFLOAT(a,b,c) {long long i = GPSTOINT(long long,(b)/(c)); \ 166 GPSADDBITS(a,i)}; 167 168 // RTCM3 GLONASS EPH encoding 169 ////////////////////////////////////////////////////////// 170 #define GLONASSTOINT(type, value) static_cast<type>(round(value)) 171 172 #define GLONASSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \ 173 |(GLONASSTOINT(long long,b)&((1ULL<<(a))-1)); \ 174 numbits += (a); \ 175 while(numbits >= 8) { \ 176 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}} 177 178 #define GLONASSADDBITSFLOATM(a,b,c) {int s; long long i; \ 179 if(b < 0.0) \ 180 { \ 181 s = 1; \ 182 i = GLONASSTOINT(long long,(-b)/(c)); \ 183 if(!i) s = 0; \ 184 } \ 185 else \ 186 { \ 187 s = 0; \ 188 i = GLONASSTOINT(long long,(b)/(c)); \ 189 } \ 190 GLONASSADDBITS(1,s) \ 191 GLONASSADDBITS(a-1,i)} 192 193 // RTCM3 Galileo EPH encoding 194 ////////////////////////////////////////////////////////// 195 #define GALILEOTOINT(type, value) static_cast<type>(round(value)) 196 197 #define GALILEOADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \ 198 |(GALILEOTOINT(long long,b)&((1LL<<a)-1)); \ 199 numbits += (a); \ 200 while(numbits >= 8) { \ 201 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}} 202 203 #define GALILEOADDBITSFLOAT(a,b,c) {long long i = GALILEOTOINT(long long,(b)/(c)); \ 204 GALILEOADDBITS(a,i)}; 205 206 // RTCM3 BDS EPH encoding 207 ////////////////////////////////////////////////////////// 208 #define BDSTOINT(type, value) static_cast<type>(round(value)) 209 210 #define BDSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \ 211 |(BDSTOINT(long long,b)&((1ULL<<a)-1)); \ 212 numbits += (a); \ 213 while(numbits >= 8) { \ 214 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}} 215 216 #define BDSADDBITSFLOAT(a,b,c) {long long i = BDSTOINT(long long,(b)/(c)); \ 217 BDSADDBITS(a,i)}; 218 219 // RTCM3 SBAS EPH encoding 220 ////////////////////////////////////////////////////////// 221 #define SBASTOINT(type, value) static_cast<type>(round(value)) 222 #define SBASADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \ 223 |(SBASTOINT(long long,b)&((1ULL<<a)-1)); \ 224 numbits += (a); \ 225 while(numbits >= 8) { \ 226 buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}} 227 #define SBASADDBITSFLOAT(a,b,c) {long long i = SBASTOINT(long long,(b)/(c)); \ 228 SBASADDBITS(a,i)}; 229 112 230 #endif /* BITS_H */
Note:
See TracChangeset
for help on using the changeset viewer.