Changeset 10534 in ntrip for trunk/BNC/src/RTCM3/bits.h


Ignore:
Timestamp:
Sep 17, 2024, 4:56:38 PM (2 days ago)
Author:
stuerze
Message:

Service and RTCM CRS encoding and decoding as well as Helmert parameter decoding added + some re-organisation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/bits.h

    r9032 r10534  
    110110}
    111111
     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
    112230#endif /* BITS_H */
Note: See TracChangeset for help on using the changeset viewer.