Changeset 1024 in ntrip


Ignore:
Timestamp:
Aug 7, 2008, 4:01:56 PM (16 years ago)
Author:
zdenek
Message:

Zdenek Lukes: added logic for decoding of message 20/21 from RTCM 2.3 streams

Location:
trunk/BNC
Files:
4 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/RTCM/GPSDecoder.h

    r649 r1024  
    4747  double L1;          // L1 carrier phase (cycles)
    4848  double L2;          // L2 carrier phase (cycles)
     49  int    slip_cnt_L1; // L1 cumulative loss of continuity indicator
     50  int    slip_cnt_L2; // L2 cumulative loss of continuity indicator
    4951  double S1;          // L1 signal-to noise ratio
    5052  double S2;          // L2 signal-to noise ratio
  • trunk/BNC/RTCM/RTCM2.cpp

    r728 r1024  
    945945  cph_L1.resize(0);        // Carrier phase [m]
    946946  cph_L2.resize(0);        // Carrier phase [m]
     947  slip_L1.resize(0);       // Slip counter
     948  slip_L2.resize(0);       // Slip counter
    947949 
    948950  availability.reset();    // Message status flags
     
    10051007  bool    isGPS,isCAcode,isL1,isOth;
    10061008  int     NSat,idx;
    1007   int     sid,prn;
     1009  int     sid,prn,slip_cnt;
    10081010  double  t,rng,cph;
    10091011
     
    11171119      // Carrier phase measurement (mod 2^23 [cy]; sign matched to range)
    11181120      cph = -P.getBits(iSat*48+40,32)/256.0;
     1121
     1122      // Slip counter
     1123      slip_cnt = P.getUnsignedBits(iSat*48+35,5);
    11191124
    11201125      // Is this a new PRN?
     
    11321137        cph_L1.push_back(0.0);
    11331138        cph_L2.push_back(0.0);
     1139        slip_L1.push_back(-1);
     1140        slip_L2.push_back(-1);
    11341141      };
    11351142     
    11361143      // Store measurement
    11371144      if (isL1) {
    1138         cph_L1[idx] = cph;
     1145        cph_L1 [idx] = cph;
     1146        slip_L1[idx] = slip_cnt;
    11391147      }
    11401148      else {
    1141         cph_L2[idx] = cph;
     1149        cph_L2 [idx] = cph;
     1150        slip_L2[idx] = slip_cnt;
    11421151      };
    11431152           
     
    13391348
    13401349}; // End of namespace rtcm2
     1350
     1351
     1352
  • trunk/BNC/RTCM/RTCM2.h

    r725 r1024  
    309309    std::vector<double>  cph_L1;           // Carrier phase on L1 [cy]
    310310    std::vector<double>  cph_L2;           // Carrier phase on L2 [cy]
     311    std::vector<int>     slip_L1;          // Carrier phase slip counter, L1
     312    std::vector<int>     slip_L2;          // Carrier phase slip counter, L1
    311313
    312314  private:
  • trunk/BNC/RTCM/RTCM2Decoder.cpp

    r702 r1024  
    3939 * -----------------------------------------------------------------------*/
    4040
     41#include <math.h>
     42#include <sstream>
     43
    4144#include "../bncutils.h"
     45#include "rtcm_utils.h"
    4246#include "GPSDecoder.h"
    4347#include "RTCM2Decoder.h"
    4448
    4549using namespace std;
     50using namespace rtcm2;
    4651
    4752//
     
    4954//
    5055
    51 RTCM2Decoder::RTCM2Decoder() {
    52 
     56RTCM2Decoder::RTCM2Decoder(const std::string& ID) {
     57  _ID = ID;
    5358}
    5459
     
    5863
    5964RTCM2Decoder::~RTCM2Decoder() {
    60 }
    61 
    62 //
    63 
     65  for (t_pairMap::iterator ii = _ephPair.begin(); ii != _ephPair.end(); ii++) {
     66    delete ii->second;
     67  }
     68}
     69
     70
     71//
     72t_irc RTCM2Decoder::getStaCrd(double& xx, double& yy, double& zz) {
     73  if ( !_msg03.validMsg ) {
     74    return failure;
     75  }
     76 
     77  xx = _msg03.x + (_msg22.validMsg ? _msg22.dL1[0] : 0.0);
     78  yy = _msg03.y + (_msg22.validMsg ? _msg22.dL1[1] : 0.0);
     79  zz = _msg03.z + (_msg22.validMsg ? _msg22.dL1[2] : 0.0);
     80
     81  return success;
     82}
     83
     84
     85//
    6486t_irc RTCM2Decoder::Decode(char* buffer, int bufLen) {
    6587
     
    95117          _obsList.push_back(obs);
    96118          if (_ObsBlock.PRN[iSat] > 100) {
    97             obs->_o.satNum = _ObsBlock.PRN[iSat] % 100;
    98             obs->_o.satSys = 'R';
    99           }
    100           else {
    101             obs->_o.satNum = _ObsBlock.PRN[iSat];
    102             obs->_o.satSys = 'G';
    103           }
    104           obs->_o.GPSWeek  = epochWeek;
    105           obs->_o.GPSWeeks = epochSecs;
    106           obs->_o.C1       = _ObsBlock.rng_C1[iSat];
    107           obs->_o.P1       = _ObsBlock.rng_P1[iSat];
    108           obs->_o.P2       = _ObsBlock.rng_P2[iSat];
    109           obs->_o.L1       = _ObsBlock.resolvedPhase_L1(iSat);
    110           obs->_o.L2       = _ObsBlock.resolvedPhase_L2(iSat);
     119            obs->_o.satNum    = _ObsBlock.PRN[iSat] % 100;
     120            obs->_o.satSys    = 'R';
     121          }                   
     122          else {             
     123            obs->_o.satNum    = _ObsBlock.PRN[iSat];
     124            obs->_o.satSys    = 'G';
     125          }                   
     126          obs->_o.GPSWeek     = epochWeek;
     127          obs->_o.GPSWeeks    = epochSecs;
     128          obs->_o.C1          = _ObsBlock.rng_C1[iSat];
     129          obs->_o.P1          = _ObsBlock.rng_P1[iSat];
     130          obs->_o.P2          = _ObsBlock.rng_P2[iSat];
     131          obs->_o.L1          = _ObsBlock.resolvedPhase_L1(iSat);
     132          obs->_o.L2          = _ObsBlock.resolvedPhase_L2(iSat);
     133          obs->_o.slip_cnt_L1 = _ObsBlock.slip_L1[iSat];
     134          obs->_o.slip_cnt_L2 = _ObsBlock.slip_L2[iSat];
    111135        }
    112136        _ObsBlock.clear();
    113137      }
    114138    }
     139
     140    else if ( _PP.ID() == 20 || _PP.ID() == 21 ) {
     141      _msg2021.extract(_PP);
     142
     143      if (_msg2021.valid()) {
     144        translateCorr2Obs();
     145      }
     146    }
     147
     148    else if ( _PP.ID() == 3 ) {
     149      _msg03.extract(_PP);
     150    }
     151
     152    else if ( _PP.ID() == 22 ) {
     153      _msg22.extract(_PP);
     154    }
    115155  }
    116156  return success;
    117157}
    118158
     159
     160
     161void RTCM2Decoder::storeEph(const gpsephemeris& gpseph) {
     162  t_ephGPS* eph = new t_ephGPS; eph->set(&gpseph);
     163
     164  string prn = eph->prn();
     165
     166  t_pairMap::iterator ip = _ephPair.find(prn);
     167  if (ip == _ephPair.end() ) {
     168    ip = _ephPair.insert(pair<string, t_ephPair*>(prn, new t_ephPair)).first;
     169  }
     170  t_ephPair* pair = ip->second;
     171
     172  if ( !pair->eph || eph->isNewerThan(pair->eph) ) {
     173    delete pair->oldEph;
     174    pair->oldEph = pair->eph;
     175    pair->eph    = eph;
     176
     177    return;
     178  }
     179
     180  delete eph;
     181}
     182
     183
     184void RTCM2Decoder::storeEph(const t_ephGPS& gpseph) {
     185  t_ephGPS* eph = new t_ephGPS(gpseph);
     186
     187  string prn = eph->prn();
     188
     189  t_pairMap::iterator ip = _ephPair.find(prn);
     190  if (ip == _ephPair.end() ) {
     191    ip = _ephPair.insert(pair<string, t_ephPair*>(prn, new t_ephPair)).first;
     192  }
     193  t_ephPair* pair = ip->second;
     194
     195  if ( !pair->eph || eph->isNewerThan(pair->eph) ) {
     196    delete pair->oldEph;
     197    pair->oldEph = pair->eph;
     198    pair->eph    = eph;
     199
     200    return;
     201  }
     202
     203  delete eph;
     204}
     205 
     206 
     207void RTCM2Decoder::translateCorr2Obs() {
     208
     209  if ( !_msg03.validMsg || !_msg2021.valid() ) {
     210    return;
     211  }
     212
     213  double stax = _msg03.x + (_msg22.validMsg ? _msg22.dL1[0] : 0.0);
     214  double stay = _msg03.y + (_msg22.validMsg ? _msg22.dL1[1] : 0.0);
     215  double staz = _msg03.z + (_msg22.validMsg ? _msg22.dL1[2] : 0.0);
     216
     217  int    refWeek;
     218  double refSecs;
     219  currentGPSWeeks(refWeek, refSecs);
     220
     221  // Resolve receiver time of measurement (see RTCM 2.3, page 4-42, Message 18, Note 1)
     222  // ----------------------------------------------------------------------------------
     223  double hoursec_est  = _msg2021.hoursec();              // estimated time of measurement
     224  double hoursec_rcv  = rint(hoursec_est * 1e2) / 1e2;   // receiver clock reading at hoursec_est 
     225  double rcv_clk_bias = (hoursec_est - hoursec_rcv) * c_light;
     226
     227  int    GPSWeek;
     228  double GPSWeeks;
     229  resolveEpoch(hoursec_est, refWeek, refSecs,
     230               GPSWeek, GPSWeeks);
     231
     232  int    GPSWeek_rcv;
     233  double GPSWeeks_rcv;
     234  resolveEpoch(hoursec_rcv, refWeek, refSecs,
     235               GPSWeek_rcv, GPSWeeks_rcv);
     236
     237  // Loop over all satellites
     238  // ------------------------
     239  for (RTCM2_2021::data_iterator icorr = _msg2021.data.begin();
     240       icorr != _msg2021.data.end(); icorr++) {
     241    const RTCM2_2021::HiResCorr* corr = icorr->second;
     242
     243    ostringstream oPRN; oPRN.fill('0');
     244
     245    oPRN <<            (corr->PRN < 200 ? 'G'       : 'R')
     246         << setw(2) << (corr->PRN < 200 ? corr->PRN : corr->PRN - 200);
     247
     248    string PRN(oPRN.str());
     249
     250    t_pairMap::const_iterator ieph = _ephPair.find(PRN);
     251    const t_eph* eph0 = 0;
     252    const t_eph* eph1 = 0;
     253
     254    if ( ieph != _ephPair.end() ) {
     255      eph0 = ieph->second->eph;
     256      eph1 = ieph->second->oldEph;
     257    }
     258
     259
     260    if ( !eph0 && !eph1 ) {
     261      continue;
     262    }
     263
     264    double L1 = 0;
     265    double L2 = 0;
     266    double P1 = 0;
     267    double P2 = 0;
     268    string obsT = "";
     269
     270    // new observation
     271    p_obs new_obs = 0;
     272
     273    for (unsigned ii = 0; ii < 4; ii++) {
     274      int          IODcorr = 0;
     275      double       corrVal = 0;
     276      const t_eph* eph     = 0;
     277      double*      obsVal  = 0;
     278
     279      switch (ii) {
     280      case 0: // --- L1 ---
     281        IODcorr = corr->IODp1;
     282        corrVal = corr->phase1 * LAMBDA_1;
     283        obsVal  = &L1;
     284        obsT    = "L1";
     285        break;
     286      case 1: // --- L2 ---
     287        IODcorr = corr->IODp2;
     288        corrVal = corr->phase2 * LAMBDA_2;
     289        obsVal  = &L2;
     290        obsT    = "L2";
     291        break;
     292      case 2: // --- P1 ---
     293        IODcorr = corr->IODr1;
     294        corrVal = corr->range1;
     295        obsVal  = &P1;
     296        obsT    = "P1";
     297        break;
     298      case 3: // --- P2 ---
     299        IODcorr = corr->IODr2;
     300        corrVal = corr->range2;
     301        obsVal  = &P2;
     302        obsT    = "P2";
     303        break;
     304      default:
     305        continue;
     306      }
     307
     308      eph = 0;
     309      if      ( eph0 && eph0->IOD() == IODcorr )
     310        eph = eph0;
     311      else if ( eph1 && eph1->IOD() == IODcorr )
     312        eph = eph1;
     313      if ( eph && corr ) {
     314        int    GPSWeek_tot;
     315        double GPSWeeks_tot;
     316        double rho, xSat, ySat, zSat, clkSat;
     317        cmpRho(eph, stax, stay, staz,
     318               GPSWeek, GPSWeeks,
     319               rho, GPSWeek_tot, GPSWeeks_tot,
     320               xSat, ySat, zSat, clkSat);
     321
     322        *obsVal = rho - corrVal + rcv_clk_bias - clkSat;
     323
     324        if ( *obsVal == 0 )  *obsVal = ZEROVALUE;
     325
     326        // Allocate new memory
     327        // -------------------
     328        if ( !new_obs ) {
     329          new_obs = new t_obs();
     330
     331          new_obs->_o.StatID[0] = '\x0';
     332          new_obs->_o.satSys    = (corr->PRN < 200 ? 'G'       : 'R');
     333          new_obs->_o.satNum    = (corr->PRN < 200 ? corr->PRN : corr->PRN - 200);
     334         
     335          new_obs->_o.GPSWeek   = GPSWeek_rcv;
     336          new_obs->_o.GPSWeeks  = GPSWeeks_rcv;
     337        }
     338       
     339        // Store estimated measurements
     340        // ----------------------------
     341        switch (ii) {
     342        case 0: // --- L1 ---
     343          new_obs->_o.L1 = *obsVal / LAMBDA_1;
     344          new_obs->_o.slip_cnt_L1 = corr->lock1;
     345          break;
     346        case 1: // --- L2 ---
     347          new_obs->_o.L2 = *obsVal / LAMBDA_2;
     348          new_obs->_o.slip_cnt_L2 = corr->lock2;
     349          break;
     350        case 2: // --- C1 / P1 ---
     351          if ( corr->Pind1 )
     352            new_obs->_o.P1 = *obsVal;
     353          else
     354            new_obs->_o.C1 = *obsVal;
     355          break;
     356        case 3: // --- C2 / P2 ---
     357          if ( corr->Pind2 )
     358            new_obs->_o.P2 = *obsVal;
     359          else
     360            new_obs->_o.C2 = *obsVal;
     361          break;
     362        default:
     363          continue;
     364        }
     365      }
     366    } // loop over frequencies
     367   
     368    if ( new_obs ) {
     369      _obsList.push_back( new_obs );
     370    }
     371  }
     372}
  • trunk/BNC/RTCM/RTCM2Decoder.h

    r649 r1024  
    2626#define INC_RTCM2DECODER_H
    2727
     28#include <list>
     29
    2830#include "GPSDecoder.h"
    2931#include "RTCM2.h"
     32#include "RTCM2_2021.h"
     33#include "../RTCM3/rtcm3torinex.h"
     34#include "../RTCM3/ephemeris.h"
    3035
    3136class RTCM2Decoder: public GPSDecoder {
    3237
    3338  public:
    34     RTCM2Decoder();
     39    RTCM2Decoder(const std::string& ID);
    3540    virtual ~RTCM2Decoder();
    3641    virtual t_irc Decode(char* buffer, int bufLen);
    3742
     43    void  storeEph(const gpsephemeris& gpseph);
     44    void  storeEph(const t_ephGPS&     gpseph);
     45
     46    t_irc getStaCrd(double& xx, double& yy, double& zz);
     47
     48    const rtcm2::RTCM2_2021& msg2021() const { return _msg2021; }
     49
    3850  private:
    3951
    40     std::string        _buffer;
    41     rtcm2::RTCM2_Obs   _ObsBlock;
    42     rtcm2::RTCM2packet _PP;
     52    class t_ephPair {
     53    public:
     54      t_ephPair() {
     55        eph    = 0;
     56        oldEph = 0;
     57      }
     58     
     59      ~t_ephPair() {
     60        delete eph;
     61        delete oldEph;
     62      }
     63     
     64      t_eph* eph;
     65      t_eph* oldEph;
     66    };
    4367
     68    void translateCorr2Obs();
     69
     70    std::string            _ID;
     71
     72    std::string            _buffer;
     73    rtcm2::RTCM2packet     _PP;
     74
     75    // for messages 18, 19 decoding
     76    rtcm2::RTCM2_Obs       _ObsBlock;
     77
     78    // for messages 20, 21 decoding
     79    rtcm2::RTCM2_03           _msg03;
     80    rtcm2::RTCM2_22           _msg22;
     81    rtcm2::RTCM2_2021         _msg2021;
     82    std::map<std::string, t_ephPair*> _ephPair;
     83
     84    typedef std::map<std::string, t_ephPair*> t_pairMap;
    4485};
    4586
  • trunk/BNC/bnc.pro

    r866 r1024  
    22# Switch to debug configuration
    33# -----------------------------
    4 CONFIG += release
    5 ###CONFIG -= debug
     4###CONFIG += release
     5CONFIG += debug
    66
    77DEFINES += NO_RTCM3_MAIN
     
    2727          bncconst.h bnchtml.h bnctableitem.h bnczerodecoder.h        \
    2828          RTCM/GPSDecoder.h RTCM/RTCM2.h RTCM/RTCM2Decoder.h          \
     29          RTCM/RTCM2_2021.h RTCM/rtcm_utils.h                         \
    2930          RTCM3/RTCM3Decoder.h RTCM3/rtcm3torinex.h                   \
    3031          RTCM3/RTCM3coDecoder.h RTCM3/clock_orbit_rtcm.h             \
     32          RTCM3/ephemeris.h RTCM3/timeutils.h                         \
    3133          RTIGS/RTIGSDecoder.h RTIGS/rtigs_records.h                  \
    3234          RTIGS/cgps_transform.h RTIGS/rtstruct.h RTIGS/rtacp.h RTIGS/gpswro.h
     
    3739          bnczerodecoder.cpp                                          \
    3840          RTCM/RTCM2.cpp RTCM/RTCM2Decoder.cpp                        \
     41          RTCM/RTCM2_2021.cpp RTCM/rtcm_utils.cpp                     \
    3942          RTCM3/RTCM3Decoder.cpp RTCM3/rtcm3torinex.c                 \
    4043          RTCM3/RTCM3coDecoder.cpp RTCM3/clock_orbit_rtcm.c           \
     44          RTCM3/ephemeris.cpp RTCM3/timeutils.cpp                     \
    4145          RTIGS/RTIGSDecoder.cpp RTIGS/cgps_transform.cpp
    4246
  • trunk/BNC/bncapp.cpp

    r995 r1024  
    3939 * -----------------------------------------------------------------------*/
    4040
    41 #include <iostream>
    4241#include <QSettings>
    4342#include <QMessageBox>
     
    190189void bncApp::slotNewGPSEph(gpsephemeris* gpseph) {
    191190
     191  gpsephemeris copy_gpseph = *gpseph;
     192  emit newEphGPS(copy_gpseph);
     193
    192194  QMutexLocker locker(&_mutex);
    193195
     
    206208    delete gpseph;
    207209  }
     210
    208211}
    209212   
     
    601604////////////////////////////////////////////////////////////////////////////
    602605void bncApp::slotQuit() {
    603   cout << "bncApp::slotQuit" << endl;
    604606  delete _caster;
    605607  quit();
  • trunk/BNC/bncapp.h

    r994 r1024  
    4949    void slotQuit();
    5050
    51  signals:
    52    void newMessage(QByteArray msg);
     51  signals:
     52    void newEphGPS(gpsephemeris gpseph);
     53    void newMessage(QByteArray msg);
    5354   
    5455 private slots:
  • trunk/BNC/bncgetthread.cpp

    r1022 r1024  
    140140    _rnx = new bncRinex(_staID, mountPoint, format, latitude, longitude, nmea);
    141141  }
     142  _rnx_set_position = false;
    142143
    143144  msleep(100); //sleep 0.1 sec
     
    156157  }
    157158  delete _decoder;
    158   delete _rnx;   
     159  delete _rnx;
    159160}
    160161
     
    365366    if      (_format.indexOf("RTCM_2") != -1) {
    366367      emit(newMessage("Get Data: " + _staID + " in RTCM 2.x format"));
    367       _decoder = new RTCM2Decoder();
     368      _decoder = new RTCM2Decoder(_staID.data());
    368369    }
    369370    else if (_format.indexOf("RTCM_3") != -1) {
     
    557558
    558559        delete [] data;
    559        
     560
    560561        QListIterator<p_obs> it(_decoder->_obsList);
    561562        while (it.hasNext()) {
     
    645646          // ------------
    646647          if (_rnx) {
    647              long iSec    = long(floor(obs->_o.GPSWeeks+0.5));
    648              long newTime = obs->_o.GPSWeek * 7*24*3600 + iSec;
    649             if (_samplingRate == 0 || iSec % _samplingRate == 0) {
    650               _rnx->deepCopy(obs);
    651             }
    652             _rnx->dumpEpoch(newTime);
    653           }
    654 
     648            bool dump = true;
     649
     650            RTCM2Decoder* decoder2 = dynamic_cast<RTCM2Decoder*>(_decoder);
     651            if ( decoder2 && !_rnx_set_position ) {
     652              double stax, stay, staz;
     653              if ( decoder2->getStaCrd(stax, stay, staz) == success ) {
     654                _rnx->setApproxPos(stax, stay, staz);
     655                _rnx_set_position = true;
     656              }
     657              else {
     658                dump = false;
     659              }
     660            }
     661             
     662            if ( dump ) {
     663              long iSec    = long(floor(obs->_o.GPSWeeks+0.5));
     664              long newTime = obs->_o.GPSWeek * 7*24*3600 + iSec;
     665              if (_samplingRate == 0 || iSec % _samplingRate == 0) {
     666                _rnx->deepCopy(obs);
     667              }
     668              _rnx->dumpEpoch(newTime);
     669            }
     670          }
     671
     672          // Emit new observation signal
     673          // ---------------------------
    655674          bool firstObs = (obs == _decoder->_obsList.first());
    656675          obs->_status = t_obs::posted;
     
    736755  }
    737756}
     757
     758//
     759//////////////////////////////////////////////////////////////////////////////
     760void bncGetThread::slotNewEphGPS(gpsephemeris gpseph) {
     761  RTCM2Decoder* decoder = dynamic_cast<RTCM2Decoder*>(_decoder);
     762
     763  if ( decoder ) {
     764    QMutexLocker locker(&_mutex);
     765 
     766    decoder->storeEph(gpseph);
     767  }
     768}
     769
  • trunk/BNC/bncgetthread.h

    r728 r1024  
    2626#define BNCGETTHREAD_H
    2727
     28#include <stdio.h>
     29
    2830#include <QThread>
    2931#include <QtNetwork>
     
    3133
    3234#include "RTCM/GPSDecoder.h"
     35#include "RTCM3/rtcm3torinex.h"
    3336#include "bncconst.h"
    3437
     
    5659   void error(QByteArray staID);
    5760   void newMessage(QByteArray msg);
     61
     62 public slots:
     63   void slotNewEphGPS(gpsephemeris gpseph);
    5864
    5965 protected:
     
    95101   int         _samplingRate;
    96102   bncRinex*   _rnx;
     103   bool        _rnx_set_position;
    97104   QDateTime   _decodeFailure;
    98105   QDateTime   _decodeStart;
  • trunk/BNC/bncrinex.cpp

    r843 r1024  
    9393    _rinexVers = 2;
    9494  }
     95
     96  _approxPos[0] = _approxPos[1] = _approxPos[2] = 0.0;
    9597}
    9698
     
    447449  // ------------------
    448450  else {
    449     double approxPos[3];  approxPos[0]  = approxPos[1]  = approxPos[2]  = 0.0;
    450451    double antennaNEU[3]; antennaNEU[0] = antennaNEU[1] = antennaNEU[2] = 0.0;
    451452   
     
    477478         << setw(20) << " "                                          << "ANT # / TYPE"         << endl;
    478479    _out.unsetf(ios::left);
    479     _out << setw(14) << setprecision(4) << approxPos[0]
    480          << setw(14) << setprecision(4) << approxPos[1]
    481          << setw(14) << setprecision(4) << approxPos[2]
     480    _out << setw(14) << setprecision(4) << _approxPos[0]
     481         << setw(14) << setprecision(4) << _approxPos[1]
     482         << setw(14) << setprecision(4) << _approxPos[2]
    482483         << "                  "                                     << "APPROX POSITION XYZ"  << endl;
    483484    _out << setw(14) << setprecision(4) << antennaNEU[0]
     
    565566  double sec = double(datTim.time().second()) + fmod(fObs->_o.GPSWeeks,1.0);
    566567
    567   // RINEX Version 3
    568   // ---------------
     568  // Epoch header line: RINEX Version 3
     569  // ----------------------------------
    569570  if (_rinexVers == 3) {
    570     char sbasflag = 'S';
    571571    _out << datTim.toString("> yyyy MM dd hh mm ").toAscii().data()
    572572         << setw(10) << setprecision(7) << sec
    573573         << "  " << 0 << setw(3)  << dumpList.size() << endl;
    574 
    575     QListIterator<p_obs> it(dumpList);
    576     while (it.hasNext()) {
    577       p_obs obs = it.next();
    578 // Changed data output, C1P, C2C|X, L2C|X, S2C|X added. Changed Output for SBAS Perlt 
    579       if (sbasflag != obs->_o.satSys) {
    580       _out << obs->_o.satSys
    581            << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
    582            << setw(14) << setprecision(3) << obs->_o.C1 << "  " 
    583            << setw(14) << setprecision(3) << obs->_o.P1 << "  " 
    584            << setw(14) << setprecision(3) << obs->_o.L1 << " "
    585            << setw(1)                     << obs->_o.SNR1
    586            << setw(14) << setprecision(3) << obs->_o.S1 << "  "
    587            << setw(14) << setprecision(3) << obs->_o.C2 << "  " 
    588            << setw(14) << setprecision(3) << obs->_o.P2 << "  " ;
    589       if ((obs->_o.C2 != 0.0) && (obs->_o.P2 == 0.0)) {
    590        _out << setw(14) << setprecision(3) << obs->_o.L2 << " "
    591             << setw(1)                     << obs->_o.SNR2
    592             << setw(14) << setprecision(3) << obs->_o.S2 << "  "
    593             << "         0.000           0.000  ";
    594       }
    595       else {
    596        _out << "         0.000           0.000  "
    597             << setw(14) << setprecision(3) << obs->_o.L2 << " "
    598             << setw(1)                     << obs->_o.SNR2
    599             << setw(14) << setprecision(3) << obs->_o.S2;
    600       }
    601       _out << endl;
    602       }
    603       else {
    604       _out << obs->_o.satSys
    605            << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
    606            << setw(14) << setprecision(3) << obs->_o.C1 << "  " 
    607            << setw(14) << setprecision(3) << obs->_o.P1 << "  " 
    608            << setw(14) << setprecision(3) << obs->_o.L1 << " "
    609            << setw(1)                     << obs->_o.SNR1
    610            << setw(14) << setprecision(3) << obs->_o.S1 << endl;
    611       }
    612       delete obs;
    613     }
    614   }
    615 
    616   // RINEX Version 2
    617   // ---------------
     574  }
     575  // Epoch header line: RINEX Version 2
     576  // ----------------------------------
    618577  else {
    619578    _out << datTim.toString(" yy MM dd hh mm ").toAscii().data()
    620579         << setw(10) << setprecision(7) << sec
    621580         << "  " << 0 << setw(3)  << dumpList.size();
    622    
     581
    623582    QListIterator<p_obs> it(dumpList); int iSat = 0;
    624583    while (it.hasNext()) {
     
    632591    }
    633592    _out << endl;
    634    
    635     it.toFront();
    636     while (it.hasNext()) {
    637       p_obs obs = it.next();
    638    
     593  }
     594
     595  QListIterator<p_obs> it(dumpList);
     596  while (it.hasNext()) {
     597    p_obs obs = it.next();
     598
     599    // Cycle slips detection
     600    // ---------------------
     601    int prn = 0;
     602    switch (obs->_o.satSys) {
     603    case 'G': prn = obs->_o.satNum;       break;
     604    case 'R': prn = obs->_o.satNum + 200; break;
     605    default:  prn = obs->_o.satNum;
     606    }
     607
     608    int lli1 = 0;
     609    int lli2 = 0;
     610    if ( _slip_cnt_L1.find(prn) != _slip_cnt_L1.end() &&
     611         _slip_cnt_L1.find(prn).value() != obs->_o.slip_cnt_L1 ) {
     612      lli1 = 1;
     613    }
     614    if ( _slip_cnt_L2.find(prn) != _slip_cnt_L2.end() &&
     615         _slip_cnt_L2.find(prn).value() != obs->_o.slip_cnt_L2 ) {
     616      lli2 = 1;
     617    }
     618    _slip_cnt_L1[prn]= obs->_o.slip_cnt_L1;
     619    _slip_cnt_L2[prn]= obs->_o.slip_cnt_L2;
     620
     621    // RINEX Version 3
     622    // ---------------
     623    if (_rinexVers == 3) {
     624      char sbasflag = 'S';
     625      // Changed data output, C1P, C2C|X, L2C|X, S2C|X added. Changed Output for SBAS Perlt 
     626      if (sbasflag != obs->_o.satSys) {
     627        _out << obs->_o.satSys
     628             << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
     629             << setw(14) << setprecision(3) << obs->_o.C1 << "  " 
     630             << setw(14) << setprecision(3) << obs->_o.P1 << "  " 
     631             << setw(14) << setprecision(3) << obs->_o.L1 << lli1
     632             << setw(1)                     << obs->_o.SNR1
     633             << setw(14) << setprecision(3) << obs->_o.S1 << "  "
     634             << setw(14) << setprecision(3) << obs->_o.C2 << "  " 
     635             << setw(14) << setprecision(3) << obs->_o.P2 << "  " ;
     636        if ((obs->_o.C2 != 0.0) && (obs->_o.P2 == 0.0)) {
     637          _out << setw(14) << setprecision(3) << obs->_o.L2 << lli2
     638               << setw(1)                     << obs->_o.SNR2
     639               << setw(14) << setprecision(3) << obs->_o.S2 << "  "
     640               << "         0.000           0.000  ";
     641        }
     642        else {
     643          _out << "         0.000           0.000  "
     644               << setw(14) << setprecision(3) << obs->_o.L2 << " "
     645               << setw(1)                     << obs->_o.SNR2
     646               << setw(14) << setprecision(3) << obs->_o.S2;
     647        }
     648        _out << endl;
     649      }
     650      else {
     651        _out << obs->_o.satSys
     652             << setw(2) << setfill('0') << obs->_o.satNum << setfill(' ')
     653             << setw(14) << setprecision(3) << obs->_o.C1 << "  " 
     654             << setw(14) << setprecision(3) << obs->_o.P1 << "  " 
     655             << setw(14) << setprecision(3) << obs->_o.L1 << lli1
     656             << setw(1)                     << obs->_o.SNR1
     657             << setw(14) << setprecision(3) << obs->_o.S1 << endl;
     658      }
     659    }
     660
     661    // RINEX Version 2
     662    // ---------------
     663    else {
    639664      char lli = ' ';
    640665      char snr = ' ';
     
    643668      _out << setw(14) << setprecision(3) << obs->_o.P1 << lli << snr;
    644669      _out << setw(14) << setprecision(3) << obs->_o.P2 << lli << snr;
    645       _out << setw(14) << setprecision(3) << obs->_o.L1 << lli
     670      _out << setw(14) << setprecision(3) << obs->_o.L1 << lli1
    646671           << setw(1) << obs->_o.SNR1 << endl;
    647       _out << setw(14) << setprecision(3) << obs->_o.L2 << lli
     672      _out << setw(14) << setprecision(3) << obs->_o.L2 << lli2
    648673           << setw(1) << obs->_o.SNR2;
    649674      _out << setw(14) << setprecision(3) << obs->_o.S1 ;
    650675      _out << setw(16) << setprecision(3) << obs->_o.S2 ;
    651676      _out << endl;
    652    
    653       delete obs;
    654     }
     677    }
     678
     679    delete obs;
    655680  }
    656681
  • trunk/BNC/bncrinex.h

    r675 r1024  
    4949                               QDateTime* nextEpoch = 0);
    5050
     51   void setApproxPos(double stax, double stay, double staz) {
     52     _approxPos[0] = stax;
     53     _approxPos[1] = stay;
     54     _approxPos[2] = staz;
     55   }
     56
    5157 protected:
    5258   virtual void run() {};
     
    8187   bool          _reloadTable;
    8288   bool          _reloadDone;
     89   double        _approxPos[3];
     90
     91   QMap<int, int> _slip_cnt_L1;
     92   QMap<int, int> _slip_cnt_L2;
    8393};
    8494
  • trunk/BNC/bncwindow.cpp

    r998 r1024  
    688688            SLOT(slotNewBytes(QByteArray, double)));
    689689
     690    connect(((bncApp*)qApp), SIGNAL(newEphGPS(gpsephemeris)),
     691            getThread, SLOT(slotNewEphGPS(gpsephemeris)));
     692
    690693    _caster->addGetThread(getThread);
    691694
Note: See TracChangeset for help on using the changeset viewer.