Changeset 1866 in ntrip for trunk/BNS


Ignore:
Timestamp:
Jul 13, 2009, 1:50:12 PM (15 years ago)
Author:
mervart
Message:

* empty log message *

Location:
trunk/BNS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNS/bnseph.cpp

    r1668 r1866  
    2121#include "bnssettings.h"
    2222
     23#define PI          3.1415926535898
     24
    2325using namespace std;
    2426
     
    218220    }
    219221    else if (ii == 6) {
    220       in >>  _IDOT;
     222      double GPSweek;
     223      in >>  _IDOT >> _L2Codes >> GPSweek >> _L2PFlag;
    221224    }
    222225    else if (ii == 7) {
    223       double hlp, health;
    224       in >> hlp >> health >> _TGD >> _IODC;
     226      in >> _ura >> _health >> _TGD >> _IODC;
    225227    }
    226228    else if (ii == 8) {
     
    228230    }
    229231  }
    230 }
     232  unsigned char Array[67];
     233  int size = RTCM3GPS(Array);
     234  fwrite(Array,size, 1, stdout);
     235}
     236
     237// Returns nearest integer value
     238////////////////////////////////////////////////////////////////////////////
     239static double NearestInt(double fl, double * remain)
     240{
     241  bool isneg = fl < 0.0;
     242  double intval;
     243  if(isneg) fl *= -1.0;
     244  intval = (double)((unsigned long)(fl+0.5));
     245  if(isneg) {fl *= -1.0; intval *= -1.0;}
     246  if(remain)
     247    *remain = fl-intval;
     248  return intval;
     249} /* NearestInt() */
     250
     251// Returns CRC24
     252////////////////////////////////////////////////////////////////////////////
     253static unsigned long CRC24(long size, const unsigned char *buf)
     254{
     255  unsigned long crc = 0;
     256  int i;
     257
     258  while(size--)
     259  {
     260    crc ^= (*buf++) << (16);
     261    for(i = 0; i < 8; i++)
     262    {
     263      crc <<= 1;
     264      if(crc & 0x1000000)
     265        crc ^= 0x01864cfb;
     266    }
     267  }
     268  return crc;
     269} /* CRC24 */
     270
     271// build up RTCM3 for GPS
     272////////////////////////////////////////////////////////////////////////////
     273
     274#define GPSTOINT(type, value) static_cast<type>(NearestInt(value,0))
     275
     276#define GPSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
     277                       |(GPSTOINT(long long,b)&((1ULL<<a)-1)); \
     278                       numbits += (a); \
     279                       while(numbits >= 8) { \
     280                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
     281#define GPSADDBITSFLOAT(a,b,c) {long long i = GPSTOINT(long long,(b)/(c)); \
     282                             GPSADDBITS(a,i)};
     283
     284int t_ephGPS::RTCM3GPS(unsigned char *buffer)
     285{
     286
     287  unsigned char *startbuffer = buffer;
     288  buffer= buffer+3;
     289  int size = 0;
     290  int numbits = 0;
     291  unsigned long long bitbuffer = 0;
     292
     293  GPSADDBITS(12, 1019)
     294  GPSADDBITS(6,_prn.right((_prn.length()-1)).toInt())
     295  GPSADDBITS(10, _GPSweek)
     296  GPSADDBITS(4, _ura)
     297  GPSADDBITS(2,_L2Codes)
     298  GPSADDBITSFLOAT(14, _IDOT, PI/static_cast<double>(1<<30)
     299  /static_cast<double>(1<<13))
     300  GPSADDBITS(8, _IODE)
     301  GPSADDBITS(16, static_cast<int>(_TOC)>>4)
     302  GPSADDBITSFLOAT(8, _clock_driftrate, 1.0/static_cast<double>(1<<30)
     303  /static_cast<double>(1<<25))
     304  GPSADDBITSFLOAT(16, _clock_drift, 1.0/static_cast<double>(1<<30)
     305  /static_cast<double>(1<<13))
     306  GPSADDBITSFLOAT(22, _clock_bias, 1.0/static_cast<double>(1<<30)
     307  /static_cast<double>(1<<1))
     308  GPSADDBITS(10, _IODC)
     309  GPSADDBITSFLOAT(16, _Crs, 1.0/static_cast<double>(1<<5))
     310  GPSADDBITSFLOAT(16, _Delta_n, PI/static_cast<double>(1<<30)
     311  /static_cast<double>(1<<13))
     312  GPSADDBITSFLOAT(32, _M0, PI/static_cast<double>(1<<30)/static_cast<double>(1<<1))
     313  GPSADDBITSFLOAT(16, _Cuc, 1.0/static_cast<double>(1<<29))
     314  GPSADDBITSFLOAT(32, _e, 1.0/static_cast<double>(1<<30)/static_cast<double>(1<<3))
     315  GPSADDBITSFLOAT(16, _Cus, 1.0/static_cast<double>(1<<29))
     316  GPSADDBITSFLOAT(32, _sqrt_A, 1.0/static_cast<double>(1<<19))
     317  GPSADDBITS(16, static_cast<int>(_TOE)>>4)
     318  GPSADDBITSFLOAT(16, _Cic, 1.0/static_cast<double>(1<<29))
     319  GPSADDBITSFLOAT(32, _OMEGA0, PI/static_cast<double>(1<<30)
     320  /static_cast<double>(1<<1))
     321  GPSADDBITSFLOAT(16, _Cis, 1.0/static_cast<double>(1<<29))
     322  GPSADDBITSFLOAT(32, _i0, PI/static_cast<double>(1<<30)/static_cast<double>(1<<1))
     323  GPSADDBITSFLOAT(16, _Crc, 1.0/static_cast<double>(1<<5))
     324  GPSADDBITSFLOAT(32, _omega, PI/static_cast<double>(1<<30)
     325  /static_cast<double>(1<<1))
     326  GPSADDBITSFLOAT(24, _OMEGADOT, PI/static_cast<double>(1<<30)
     327  /static_cast<double>(1<<13))
     328  GPSADDBITSFLOAT(8, _TGD, 1.0/static_cast<double>(1<<30)/static_cast<double>(1<<1))
     329  GPSADDBITS(6, _health)
     330  GPSADDBITS(1, _L2PFlag)
     331  GPSADDBITS(1, 0) /* GPS fit interval */
     332
     333  startbuffer[0]=0xD3;
     334  startbuffer[1]=(size >> 8);
     335  startbuffer[2]=size;
     336  unsigned long  i = CRC24(size+3, startbuffer);
     337  buffer[size++] = i >> 16;
     338  buffer[size++] = i >> 8;
     339  buffer[size++] = i;
     340  size += 3;
     341  return size;
     342} /* RTCM3GPS */
    231343
    232344// Compute GPS Satellite Position
     
    329441      double  year, month, day, hour, minute, second;
    330442      in >> _prn >> year >> month >> day >> hour >> minute >> second
    331          >> _tau >> _gamma;
     443         >> _tau >> _gamma >> _tki;
    332444
    333445      _tau = -_tau;
     
    369481  _xv(5) = _y_velocity * 1.e3;
    370482  _xv(6) = _z_velocity * 1.e3;
    371 }
     483  unsigned char Array[51];
     484  int size = RTCM3GLO(Array);
     485  fwrite(Array,size, 1, stdout);
     486}
     487
     488
     489// build up RTCM3 for GLONASS
     490////////////////////////////////////////////////////////////////////////////
     491#define GLONASSTOINT(type, value) static_cast<type>(NearestInt(value,0))
     492
     493#define GLONASSADDBITS(a, b) {bitbuffer = (bitbuffer<<(a)) \
     494                       |(GLONASSTOINT(long long,b)&((1ULL<<(a))-1)); \
     495                       numbits += (a); \
     496                       while(numbits >= 8) { \
     497                       buffer[size++] = bitbuffer>>(numbits-8);numbits -= 8;}}
     498#define GLONASSADDBITSFLOATM(a,b,c) {int s; long long i; \
     499                       if(b < 0.0) \
     500                       { \
     501                         s = 1; \
     502                         i = GLONASSTOINT(long long,(-b)/(c)); \
     503                         if(!i) s = 0; \
     504                       } \
     505                       else \
     506                       { \
     507                         s = 0; \
     508                         i = GLONASSTOINT(long long,(b)/(c)); \
     509                       } \
     510                       GLONASSADDBITS(1,s) \
     511                       GLONASSADDBITS(a-1,i)}
     512
     513int t_ephGlo::RTCM3GLO(unsigned char *buffer)
     514{
     515
     516  int size = 0;
     517  int numbits = 0;
     518  long long bitbuffer = 0;
     519  unsigned char *startbuffer = buffer;
     520  buffer= buffer+3;
     521
     522  GLONASSADDBITS(12, 1020)
     523  GLONASSADDBITS(6, _prn.right((_prn.length()-1)).toInt())
     524  GLONASSADDBITS(5, 7+_frequency_number)
     525  GLONASSADDBITS(1, 0)
     526  GLONASSADDBITS(1, 0)
     527  GLONASSADDBITS(2, 0)
     528  _tki=_tki+3*60*60;
     529  GLONASSADDBITS(5, static_cast<int>(_tki)/(60*60))
     530  GLONASSADDBITS(6, (static_cast<int>(_tki)/60)%60)
     531  GLONASSADDBITS(1, (static_cast<int>(_tki)/30)%30)
     532  GLONASSADDBITS(1, _health)
     533  GLONASSADDBITS(1, 0)
     534  unsigned long long timeofday = (static_cast<int>(_tt+3*60*60-_gps_utc)%86400);
     535  GLONASSADDBITS(7, timeofday/60/15)
     536  GLONASSADDBITSFLOATM(24, _x_velocity*1000, 1000.0/static_cast<double>(1<<20))
     537  GLONASSADDBITSFLOATM(27, _x_pos*1000, 1000.0/static_cast<double>(1<<11))
     538  GLONASSADDBITSFLOATM(5, _x_acceleration*1000, 1000.0/static_cast<double>(1<<30))
     539  GLONASSADDBITSFLOATM(24, _y_velocity*1000, 1000.0/static_cast<double>(1<<20))
     540  GLONASSADDBITSFLOATM(27, _y_pos*1000, 1000.0/static_cast<double>(1<<11))
     541  GLONASSADDBITSFLOATM(5, _y_acceleration*1000, 1000.0/static_cast<double>(1<<30))
     542  GLONASSADDBITSFLOATM(24, _z_velocity*1000, 1000.0/static_cast<double>(1<<20))
     543  GLONASSADDBITSFLOATM(27,_z_pos*1000, 1000.0/static_cast<double>(1<<11))
     544  GLONASSADDBITSFLOATM(5, _z_acceleration*1000, 1000.0/static_cast<double>(1<<30))
     545  GLONASSADDBITS(1, 0)
     546  GLONASSADDBITSFLOATM(11, _gamma, 1.0/static_cast<double>(1<<30)
     547  /static_cast<double>(1<<10))
     548  GLONASSADDBITS(2, 0) /* GLONASS-M P */
     549  GLONASSADDBITS(1, 0) /* GLONASS-M ln(3) */
     550  GLONASSADDBITSFLOATM(22, _tau, 1.0/static_cast<double>(1<<30))
     551  GLONASSADDBITS(5, 0) /* GLONASS-M delta tau */
     552  GLONASSADDBITS(5, _E)
     553  GLONASSADDBITS(1, 0) /* GLONASS-M P4 */
     554  GLONASSADDBITS(4, 0) /* GLONASS-M FT */
     555  GLONASSADDBITS(11, 0) /* GLONASS-M NT */
     556  GLONASSADDBITS(2, 0) /* GLONASS-M active? */
     557  GLONASSADDBITS(1, 0) /* GLONASS additional data */
     558  GLONASSADDBITS(11, 0) /* GLONASS NA */
     559  GLONASSADDBITS(32, 0) /* GLONASS tau C */
     560  GLONASSADDBITS(5, 0) /* GLONASS-M N4 */
     561  GLONASSADDBITS(22, 0) /* GLONASS-M tau GPS */
     562  GLONASSADDBITS(1, 0) /* GLONASS-M ln(5) */
     563  GLONASSADDBITS(7, 0) /* Reserved */
     564
     565  startbuffer[0]=0xD3;
     566  startbuffer[1]=(size >> 8);
     567  startbuffer[2]=size;
     568  unsigned long i = CRC24(size+3, startbuffer);
     569  buffer[size++] = i >> 16;
     570  buffer[size++] = i >> 8;
     571  buffer[size++] = i;
     572  size += 3;
     573  return size;
     574} /* RTCM3GLO */
    372575
    373576// Derivative of the state vector using a simple force model (static)
  • trunk/BNS/bnseph.h

    r1089 r1866  
    3838                        ColumnVector& vv) const;
    3939  virtual int  IOD() const;
     40  virtual int  RTCM3GLO(unsigned char *);
    4041 private:
    4142  static ColumnVector glo_deriv(double /* tt */, const ColumnVector& xv);
     
    5859  double _health;             // 0 = O.K.
    5960  double _frequency_number;   // ICD-GLONASS data position
     61  double _tki;                // message frame time
    6062};
    6163
     
    6971                        ColumnVector& vv) const;
    7072  virtual int  IOD() const {return int(_IODE);}
    71 
     73  virtual int  RTCM3GPS(unsigned char *);
    7274 private:
    7375  double  _TOW;              //  [s]   
     
    98100
    99101  double  _TGD;              //  [s]   
     102  double _health;            //  SV health
     103  double _ura;               //  SV accuracy
     104  double _L2PFlag;           //  L2 P data flag
     105  double _L2Codes;           //  Codes on L2 channel
    100106};
    101107
Note: See TracChangeset for help on using the changeset viewer.