Changeset 1866 in ntrip
- Timestamp:
- Jul 13, 2009, 1:50:12 PM (16 years ago)
- Location:
- trunk/BNS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNS/bnseph.cpp
r1668 r1866 21 21 #include "bnssettings.h" 22 22 23 #define PI 3.1415926535898 24 23 25 using namespace std; 24 26 … … 218 220 } 219 221 else if (ii == 6) { 220 in >> _IDOT; 222 double GPSweek; 223 in >> _IDOT >> _L2Codes >> GPSweek >> _L2PFlag; 221 224 } 222 225 else if (ii == 7) { 223 double hlp, health; 224 in >> hlp >> health >> _TGD >> _IODC; 226 in >> _ura >> _health >> _TGD >> _IODC; 225 227 } 226 228 else if (ii == 8) { … … 228 230 } 229 231 } 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 //////////////////////////////////////////////////////////////////////////// 239 static 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 //////////////////////////////////////////////////////////////////////////// 253 static 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 284 int 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 */ 231 343 232 344 // Compute GPS Satellite Position … … 329 441 double year, month, day, hour, minute, second; 330 442 in >> _prn >> year >> month >> day >> hour >> minute >> second 331 >> _tau >> _gamma ;443 >> _tau >> _gamma >> _tki; 332 444 333 445 _tau = -_tau; … … 369 481 _xv(5) = _y_velocity * 1.e3; 370 482 _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 513 int 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 */ 372 575 373 576 // Derivative of the state vector using a simple force model (static) -
trunk/BNS/bnseph.h
r1089 r1866 38 38 ColumnVector& vv) const; 39 39 virtual int IOD() const; 40 virtual int RTCM3GLO(unsigned char *); 40 41 private: 41 42 static ColumnVector glo_deriv(double /* tt */, const ColumnVector& xv); … … 58 59 double _health; // 0 = O.K. 59 60 double _frequency_number; // ICD-GLONASS data position 61 double _tki; // message frame time 60 62 }; 61 63 … … 69 71 ColumnVector& vv) const; 70 72 virtual int IOD() const {return int(_IODE);} 71 73 virtual int RTCM3GPS(unsigned char *); 72 74 private: 73 75 double _TOW; // [s] … … 98 100 99 101 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 100 106 }; 101 107
Note:
See TracChangeset
for help on using the changeset viewer.