Changeset 10534 in ntrip


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

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

Location:
trunk/BNC/src/RTCM3
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/RTCM3/RTCM3Decoder.cpp

    r10236 r10534  
    5353#include "bncutils.h"
    5454#include "bncsettings.h"
     55#include "bnctime.h"
     56#include "crs.h"
    5557
    5658using namespace std;
     
    481483    sys = 'J';
    482484  }
    483   else if (type >= 1101 && type <= 1007) {
     485  else if (type >= 1101 && type <= 1107) {
    484486    sys = 'S';
    485487  }
     
    17301732  GETBITSSIGN(z, 38)
    17311733  _antList.back().zz = z * 1e-4;
    1732   if (type == 1006)
    1733       {
     1734  if (type == 1006) {
    17341735    double h;
    17351736    GETBITS(h, 16)
     
    17411742  return true;
    17421743}
     1744
     1745//
     1746////////////////////////////////////////////////////////////////////////////
     1747bool RTCM3Decoder::DecodeServiceCRS(unsigned char* data, int size) {
     1748  t_serviceCrs serviceCrs;
     1749  int servicecrsnum = -1;
     1750
     1751  uint64_t numbits = 0, bitfield = 0;
     1752
     1753  data += 3; // header
     1754  size -= 6; // header + crc
     1755
     1756  SKIPBITS(12) // Message Number
     1757
     1758  GETBITS(servicecrsnum, 5)
     1759  if (servicecrsnum > -1 && servicecrsnum <= 31) {
     1760    for(int i = 0; i < servicecrsnum; i++) {
     1761      GETBITS(serviceCrs._name[i], 8);
     1762    }
     1763    serviceCrs._name[servicecrsnum] = 0;
     1764  }
     1765  if (_serviceCrs.empty() ||
     1766      (strncmp(_serviceCrs.back()._name, serviceCrs._name, servicecrsnum) != 0)) {
     1767    _serviceCrs.push_back(serviceCrs);
     1768    GETFLOAT(_serviceCrs.back()._CE, 16, 1/100.0)
     1769    _serviceCrs.back().setCoordinateEpochFromCE();
     1770    _serviceCrs.back().print();
     1771  }
     1772  return true;
     1773
     1774}
     1775
     1776//
     1777////////////////////////////////////////////////////////////////////////////
     1778bool RTCM3Decoder::DecodeRTCMCRS(unsigned char* data, int size) {
     1779
     1780  t_rtcmCrs rtcmCrs;
     1781  int rtcmcrsnum = -1;
     1782
     1783  uint64_t numbits = 0, bitfield = 0;
     1784
     1785  data += 3; // header
     1786  size -= 6; // header + crc
     1787
     1788  SKIPBITS(12) // Message Number
     1789  GETBITS(rtcmcrsnum, 5)
     1790  if (rtcmcrsnum > -1 && rtcmcrsnum <= 31) {
     1791    for(int i = 0; i < rtcmcrsnum; i++) {
     1792      GETBITS(rtcmCrs._name[i], 8);
     1793    }
     1794    rtcmCrs._name[rtcmcrsnum] = 0;
     1795  }
     1796  if (_rtcmCrs.empty() ||
     1797      (strncmp(_rtcmCrs.back()._name, rtcmCrs._name, rtcmcrsnum) != 0)) {
     1798    _rtcmCrs.push_back(rtcmCrs);
     1799
     1800    GETBITS(_rtcmCrs.back()._anchor, 1)
     1801    GETBITS(_rtcmCrs.back()._plateNumber, 5)
     1802
     1803    int dblinksnum = 0;
     1804    GETBITS(dblinksnum, 3)
     1805    for (int i = 0; i < dblinksnum; i++) {
     1806      int dblinknum = -1;
     1807      char dblinkname[31];
     1808      GETBITS(dblinknum, 5)
     1809      if (dblinknum > -1 && dblinknum <= 31) {
     1810        for(int i = 0; i < dblinknum; i++) {
     1811          GETBITS(dblinkname[i], 8);
     1812        }
     1813        dblinkname[dblinknum] = 0;
     1814        _rtcmCrs.back()._databaseLinks.append(QString("%1").arg(dblinkname));
     1815      }
     1816    }
     1817    _rtcmCrs.back().print();
     1818  }
     1819
     1820  return true;
     1821}
     1822
     1823
     1824////////////////////////////////////////////////////////////////////////////
     1825bool RTCM3Decoder::DecodeHelmertTrafoParameters(unsigned char* data, int size) {
     1826
     1827  t_helmertPar helmertPar;
     1828  int sourcenum = -1;
     1829  int targetnum = -1;
     1830
     1831  uint64_t numbits = 0, bitfield = 0;
     1832  data += 3; // header
     1833  size -= 6; // header + crc
     1834
     1835  SKIPBITS(12) // Message Number
     1836  GETBITS(sourcenum, 5)
     1837  if (sourcenum > -1 && sourcenum <= 31) {
     1838    for(int i = 0; i < sourcenum; i++) {
     1839      GETBITS(helmertPar._sourceName[i], 8);
     1840    }
     1841    helmertPar._sourceName[sourcenum] = 0;
     1842  }
     1843  GETBITS(targetnum, 5)
     1844  if (targetnum > -1 && targetnum <= 31) {
     1845    for(int i = 0; i < targetnum; i++) {
     1846      GETBITS(helmertPar._targetName[i], 8);
     1847    }
     1848    helmertPar._targetName[targetnum] = 0;
     1849  }
     1850  GETBITS(helmertPar._sysIdentNum, 8)
     1851  GETBITS(helmertPar._utilTrafoMessageIndicator, 10)
     1852  int mjd;
     1853  GETBITS(mjd, 16)
     1854  helmertPar._t0 = mjd + 44244;
     1855
     1856  // delete old parameter entries if available
     1857  if (!_helmertPar.empty()) {
     1858    QList<t_helmertPar>::iterator it = _helmertPar.begin();
     1859    while (it != _helmertPar.end()) {
     1860      (helmertPar == *it) ? it = _helmertPar.erase(it) : ++it;
     1861    }
     1862  }
     1863  _helmertPar.push_back(helmertPar);
     1864
     1865  GETFLOATSIGN(_helmertPar.back()._dx, 23, 0.001)
     1866  GETFLOATSIGN(_helmertPar.back()._dy, 23, 0.001)
     1867  GETFLOATSIGN(_helmertPar.back()._dz, 23, 0.001)
     1868  GETFLOATSIGN(_helmertPar.back()._ox, 32, 0.00002)
     1869  GETFLOATSIGN(_helmertPar.back()._oy, 32, 0.00002)
     1870  GETFLOATSIGN(_helmertPar.back()._oz, 32, 0.00002)
     1871  GETFLOATSIGN(_helmertPar.back()._sc, 25, 0.00001)
     1872  GETFLOATSIGN(_helmertPar.back()._dxr, 17, 0.00002)
     1873  GETFLOATSIGN(_helmertPar.back()._dyr, 17, 0.00002)
     1874  GETFLOATSIGN(_helmertPar.back()._dzr, 17, 0.00002)
     1875  GETFLOATSIGN(_helmertPar.back()._oxr, 17, 0.0000004)
     1876  GETFLOATSIGN(_helmertPar.back()._oyr, 17, 0.0000004)
     1877  GETFLOATSIGN(_helmertPar.back()._ozr, 17, 0.0000004)
     1878  GETFLOATSIGN(_helmertPar.back()._scr, 14, 0.0000002)
     1879
     1880  _helmertPar.back().print();
     1881
     1882  return true;
     1883}
     1884
    17431885
    17441886//
     
    18531995            DecodeAntennaPosition(_Message, _BlockSize);
    18541996            break;
     1997          case 1300:
     1998            DecodeServiceCRS(_Message, _BlockSize);
     1999            break;
     2000          case 1301:
     2001            DecodeHelmertTrafoParameters(_Message, _BlockSize);
     2002            break;
     2003          case 1302:
     2004          case 35:
     2005            DecodeRTCMCRS(_Message, _BlockSize);
     2006            break;
    18552007        }
    18562008      }
    18572009    }
    18582010  }
     2011  /*
     2012  for (int ii = 0; ii < _helmertParList.size(); ii++) {
     2013    _helmertParList[ii].print();
     2014  }*/
    18592015  return decoded ? success : failure;
    18602016}
    1861 ;
    18622017
    18632018//
  • trunk/BNC/src/RTCM3/RTCM3Decoder.h

    r9287 r10534  
    3232#include "GPSDecoder.h"
    3333#include "RTCM3coDecoder.h"
     34#include "crs.h"
    3435#include "bncrawfile.h"
    3536#include "ephemeris.h"
     
    167168   */
    168169  bool DecodeAntennaPosition(unsigned char* buffer, int bufLen);
    169 
     170  /**
     171   * Extract service CRS from 1300 RTCM3 messages
     172   * @param buffer the buffer containing CRS name and epoch RTCM block
     173   * @param bufLen the length of the buffer (the message length including header+crc)
     174   * @return <code>true</code> when data block was decodable
     175   */
     176  bool DecodeServiceCRS(unsigned char* buffer, int bufLen);
     177  /**
     178   * Extract Helmert transformation parameters from 1301 RTCM3 messages
     179   * @param buffer the buffer containing Helmert transformation parameters RTCM block
     180   * @param bufLen the length of the buffer (the message length including header+crc)
     181   * @return <code>true</code> when data block was decodable
     182   */
     183 bool DecodeHelmertTrafoParameters(unsigned char* buffer, int bufLen);
     184  /**
     185   * Extract RTCM CRS data from 1302 RTCM3 messages
     186   * @param buffer the buffer containing a database link RTCM block
     187   * @param bufLen the length of the buffer (the message length including header+crc)
     188   * @return <code>true</code> when data block was decodable
     189   */
     190  bool DecodeRTCMCRS(unsigned char* buffer, int bufLen);
    170191  /** Current station description, dynamic in case of raw input file handling */
    171192  QString                _staID;
     
    197218   */
    198219  QList<t_satObs> _CurrentObsList;
     220
    199221};
    200222
  • trunk/BNC/src/RTCM3/RTCM3coDecoder.cpp

    r10527 r10534  
    9898
    9999  _ssrCorr = 0;
     100
    100101}
    101102
     
    178179    struct SsrCorr::PhaseBias  phaseBiasSav;
    179180    struct SsrCorr::VTEC       vTECSav;
    180     memcpy(&clkOrbSav,    &_clkOrb,    sizeof(clkOrbSav)); // save state
    181     memcpy(&codeBiasSav,  &_codeBias,  sizeof(codeBiasSav));
    182     memcpy(&phaseBiasSav, &_phaseBias, sizeof(phaseBiasSav));
    183     memcpy(&vTECSav,      &_vTEC,      sizeof(vTECSav));
     181    memcpy(&clkOrbSav,     &_clkOrb,    sizeof(clkOrbSav)); // save state
     182    memcpy(&codeBiasSav,   &_codeBias,  sizeof(codeBiasSav));
     183    memcpy(&phaseBiasSav,  &_phaseBias, sizeof(phaseBiasSav));
     184    memcpy(&vTECSav,       &_vTEC,      sizeof(vTECSav));
    184185
    185186    int bytesused = 0;
     
    205206
    206207      if (irc == GCOBR_OK || irc == GCOBR_MESSAGEFOLLOWS ) {
    207 
    208208        setEpochTime(); // sets _lastTime
    209209
     
    554554  newProviderID[1] = _clkOrb.SSRSolutionID;
    555555  newProviderID[2] = _clkOrb.SSRIOD;
     556  QString newProviderIDStr = QString(" [SSR Provider ID: %1 SSR Solution ID: %2 SSR IOD: %3]: ")
     557      .arg(newProviderID[0]).arg(newProviderID[1]).arg(newProviderID[2]);
    556558
    557559  bool alreadySet = false;
     
    569571
    570572  if (alreadySet && different) {
    571     emit newMessage("RTCM3coDecoder: Provider Changed: " + _staID.toLatin1(), true);
     573    emit newMessage("RTCM3coDecoder: Provider Changed " +  newProviderIDStr.toLatin1() + _staID.toLatin1(), true);
    572574    emit providerIDChanged(_staID);
    573575  }
     
    657659  }
    658660  else if (epoSecGlo != -1) {
     661    QDate date = dateAndTimeFromGPSweek(currentTime.gpsw(), currentTime.gpssec()).date();
     662    if (_type == IGSssr) {
     663      if (epoSecGPS != -1 && epoSecGPS != epoSecGlo) {// should be not done in case of an IGS-SSR encoding error => line has to be deleted
     664        epoSecGlo = epoSecGlo + gnumleap(date.year(), date.month(), date.day());
     665      }
     666    }
    659667    if (_type == RTCMssr) {
    660       QDate date = dateAndTimeFromGPSweek(currentTime.gpsw(), currentTime.gpssec()).date();
    661668      epoSecGlo = epoSecGlo - 3 * 3600 + gnumleap(date.year(), date.month(), date.day());
    662669    }
     
    673680  }
    674681  else if (epoSecBds != -1) {
     682    if (_type == IGSssr) {
     683      if (epoSecGPS != -1 && epoSecGPS != epoSecBds) {// should be not done in case of an IGS-SSR encoding error => line has to be deleted
     684        epoSecBds += 14.0;
     685        if (epoSecBds > 604800.0) {
     686          epoSecBds -= 7.0*24.0*60.0*60.0;
     687        }
     688      }
     689    }//  line has to be deleted
    675690    if (_type == RTCMssr) {
    676691      epoSecBds += 14.0;
  • 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 */
  • trunk/BNC/src/RTCM3/ephEncoder.h

    r6799 r10534  
    44#include "ephemeris.h"
    55#include "bncutils.h"
     6#include "bits.h"
    67
    78class t_ephEncoder {
Note: See TracChangeset for help on using the changeset viewer.