Changeset 1218 in ntrip for trunk/BNC/RTCM


Ignore:
Timestamp:
Nov 19, 2008, 2:56:05 PM (15 years ago)
Author:
mervart
Message:

Zdenek Lukes:
a) changed logic how the ephemerides are stored for decoding of message 20/21 RTCM 2.3
b) added some debugging output (enabled is macro DEBUG_RTCM2_2021 is defined)

Location:
trunk/BNC/RTCM
Files:
3 edited

Legend:

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

    r1184 r1218  
    2727
    2828#include <iostream>
     29#include <vector>
     30#include <string>
    2931#include <QPointer>
    3032#include <QList>
     
    121123class GPSDecoder {
    122124 public:
    123   virtual t_irc Decode(char* buffer, int bufLen) = 0;
     125  virtual t_irc Decode(char* buffer, int bufLen, std::vector<std::string>& errmsg) = 0;
    124126
    125127  virtual ~GPSDecoder() {
  • trunk/BNC/RTCM/RTCM2Decoder.cpp

    r1167 r1218  
    4242#include <sstream>
    4343#include <iomanip>
     44#include <set>
    4445
    4546#include "../bncutils.h"
     
    6465
    6566RTCM2Decoder::~RTCM2Decoder() {
    66   for (t_pairMap::iterator ii = _ephPair.begin(); ii != _ephPair.end(); ii++) {
     67  for (t_listMap::iterator ii = _ephList.begin(); ii != _ephList.end(); ii++) {
    6768    delete ii->second;
    6869  }
     
    104105
    105106//
    106 t_irc RTCM2Decoder::Decode(char* buffer, int bufLen) {
     107t_irc RTCM2Decoder::Decode(char* buffer, int bufLen, vector<string>& errmsg) {
     108
     109  errmsg.clear();
    107110
    108111  _buffer.append(buffer, bufLen);
     
    165168      if (_msg2021.valid()) {
    166169        decoded = true;
    167         translateCorr2Obs();
     170        translateCorr2Obs(errmsg);
    168171      }
    169172    }
     
    182185
    183186
    184 void RTCM2Decoder::storeEph(const gpsephemeris& gpseph) {
     187bool RTCM2Decoder::storeEph(const gpsephemeris& gpseph, string& storedPRN, vector<int>& IODs) {
    185188  t_ephGPS eph; eph.set(&gpseph);
    186189
    187   storeEph(eph);
    188 }
    189 
    190 
    191 void RTCM2Decoder::storeEph(const t_ephGPS& gpseph) {
     190  return storeEph(eph, storedPRN, IODs);
     191}
     192
     193
     194bool RTCM2Decoder::storeEph(const t_ephGPS& gpseph, string& storedPRN, vector<int>& IODs) {
    192195  t_ephGPS* eph = new t_ephGPS(gpseph);
    193196
    194197  string prn = eph->prn();
    195198
    196   t_pairMap::iterator ip = _ephPair.find(prn);
    197   if (ip == _ephPair.end() ) {
    198     ip = _ephPair.insert(pair<string, t_ephPair*>(prn, new t_ephPair)).first;
    199   }
    200   t_ephPair* pair = ip->second;
    201 
    202   if ( !pair->eph || eph->isNewerThan(pair->eph) ) {
    203     delete pair->oldEph;
    204     pair->oldEph = pair->eph;
    205     pair->eph    = eph;
    206 
    207     return;
     199  t_listMap::iterator ip = _ephList.find(prn);
     200  if (ip == _ephList.end() ) {
     201    ip = _ephList.insert(pair<string, t_ephList*>(prn, new t_ephList)).first;
     202  }
     203  t_ephList* ephList = ip->second;
     204
     205  bool stored = ephList->store(eph);
     206
     207  if ( stored ) {
     208    storedPRN = eph->prn();
     209    ephList->getIODs(IODs);
     210    return true;
    208211  }
    209212
    210213  delete eph;
     214
     215  return false;
    211216}
    212217 
    213218 
    214 void RTCM2Decoder::translateCorr2Obs() {
     219void RTCM2Decoder::translateCorr2Obs(vector<string>& errmsg) {
    215220
    216221  if ( !_msg03.validMsg || !_msg2021.valid() ) {
     
    248253    const RTCM2_2021::HiResCorr* corr = icorr->second;
    249254
     255    // beg test
     256    if ( corr->PRN >= 200 ) {
     257      continue;
     258    }
     259    // end test
     260
     261
    250262    ostringstream oPRN; oPRN.fill('0');
    251263
     
    255267    string PRN(oPRN.str());
    256268
    257     t_pairMap::const_iterator ieph = _ephPair.find(PRN);
    258     const t_eph* eph0 = 0;
    259     const t_eph* eph1 = 0;
    260 
    261     if ( ieph != _ephPair.end() ) {
    262       eph0 = ieph->second->eph;
    263       eph1 = ieph->second->oldEph;
    264     }
    265 
    266     if ( !eph0 && !eph1 ) {
     269    t_listMap::const_iterator ieph = _ephList.find(PRN);
     270
     271    if ( ieph == _ephList.end() ) {
     272      errmsg.push_back("missing eph for " + PRN);
    267273      continue;
    268274    }
     
    277283    p_obs new_obs = 0;
    278284
     285    // missing IOD
     286    vector<string> missingIOD;
     287    vector<string>     hasIOD;
    279288    for (unsigned ii = 0; ii < 4; ii++) {
    280289      int          IODcorr = 0;
     
    312321      }
    313322
    314       eph = 0;
    315       if      ( eph0 && eph0->IOD() == IODcorr )
    316         eph = eph0;
    317       else if ( eph1 && eph1->IOD() == IODcorr )
    318         eph = eph1;
    319       if ( eph && corr ) {
     323      eph = ieph->second->getEph(IODcorr);
     324
     325      if ( eph ) {
     326        ostringstream msg;
     327        msg << obsT << ':' << setw(3) << eph->IOD();
     328        hasIOD.push_back(msg.str());
     329
     330
    320331        int    GPSWeek_tot;
    321332        double GPSWeeks_tot;
     
    372383        }
    373384      }
     385      else if ( IODcorr != 0 ) {
     386        ostringstream msg;
     387        msg << obsT << ':' << setw(3) << IODcorr;
     388        missingIOD.push_back(msg.str());
     389      }
    374390    } // loop over frequencies
    375    
     391   
     392    // Error report
     393    if ( missingIOD.size() ) {
     394      ostringstream missingIODstr;
     395
     396      copy(missingIOD.begin(), missingIOD.end(), ostream_iterator<string>(missingIODstr, "   "));
     397
     398      errmsg.push_back("missing eph for " + PRN + " , IODs " + missingIODstr.str());
     399    }
     400
     401    // Store new observation
    376402    if ( new_obs ) {
    377403      _obsList.push_back( new_obs );
    378     }
    379   }
    380 }
     404
     405      ///ostringstream hasIODstr;
     406      ///copy(hasIOD.begin(), hasIOD.end(), ostream_iterator<string>(hasIODstr, "    "));
     407      ///errmsg.push_back("decoded PRN " + PRN + " : " + hasIODstr.str());
     408    }
     409  }
     410}
  • trunk/BNC/RTCM/RTCM2Decoder.h

    r1167 r1218  
    2727
    2828#include <map>
     29#include <vector>
     30#include <list>
    2931
    3032#include "GPSDecoder.h"
     
    3941    RTCM2Decoder(const std::string& ID);
    4042    virtual ~RTCM2Decoder();
    41     virtual t_irc Decode(char* buffer, int bufLen);
     43    virtual t_irc Decode(char* buffer, int bufLen, std::vector<std::string>& errmsg);
    4244
    43     void  storeEph(const gpsephemeris& gpseph);
    44     void  storeEph(const t_ephGPS&     gpseph);
     45    bool  storeEph(const gpsephemeris& gpseph, std::string& storedPRN, std::vector<int>& IODs);
     46    bool  storeEph(const t_ephGPS&     gpseph, std::string& storedPRN, std::vector<int>& IODs);
    4547
    4648    t_irc getStaCrd(double& xx, double& yy, double& zz);
    4749
    48     t_irc getStaCrd(double& xx, double& yy, double& zz,
     50    t_irc getStaCrd(double& xx,  double& yy, double& zz,
    4951                    double& dx1, double& dy1, double& dz1,
    5052                    double& dx2, double& dy2, double& dz2);
     
    5658  private:
    5759
    58     class t_ephPair {
     60    class t_ephList {
    5961    public:
    60       t_ephPair() {
    61         eph    = 0;
    62         oldEph = 0;
     62      t_ephList() {}
     63     
     64      ~t_ephList() {
     65        for (std::list<t_eph*>::iterator ii = _eph.begin(); ii != _eph.end(); ii++) {
     66          delete  (*ii);
     67        }
     68      }
     69
     70      bool store(t_eph* eph) {
     71        if ( _eph.size() == 0 ) {
     72          _eph.push_back(eph);
     73          return true;
     74        }
     75         
     76        std::list<t_eph*>::iterator ii = _eph.begin();
     77        while (ii != _eph.end()) {
     78          if ( eph->IOD() == (*ii)->IOD() ) {
     79            return false;
     80          }
     81          if ( ! eph->isNewerThan(*ii) ) {
     82            break;
     83          }
     84          ++ii;
     85        }
     86
     87        if ( ii == _eph.begin() && _eph.size() == MAXSIZE) {
     88          return false;
     89        }
     90
     91        _eph.insert(ii, eph);
     92
     93        while ( _eph.size() > MAXSIZE ) {
     94          delete _eph.front();
     95          _eph.pop_front();
     96        }
     97
     98        return true;
    6399      }
    64100     
    65       ~t_ephPair() {
    66         delete eph;
    67         delete oldEph;
     101      const t_eph* getEph(int IOD) const {
     102        for (std::list<t_eph*>::const_iterator ii = _eph.begin(); ii != _eph.end(); ii++) {
     103          if ( (*ii)->IOD() == IOD ) {
     104            return (*ii);
     105          }
     106        }
     107        return 0;
    68108      }
    69      
    70       t_eph* eph;
    71       t_eph* oldEph;
     109
     110      void getIODs(std::vector<int>& IODs) const {
     111        IODs.clear();
     112        for (std::list<t_eph*>::const_iterator ii = _eph.begin(); ii != _eph.end(); ii++) {
     113          IODs.push_back((*ii)->IOD());
     114        }
     115      }
     116
     117      static const unsigned MAXSIZE = 3;
     118
     119      std::list<t_eph*> _eph;
    72120    };
    73121
    74     void translateCorr2Obs();
     122    void translateCorr2Obs(std::vector<std::string>& errmsg);
    75123
    76124    std::string            _ID;
     
    86134    rtcm2::RTCM2_22           _msg22;
    87135    rtcm2::RTCM2_2021         _msg2021;
    88     std::map<std::string, t_ephPair*> _ephPair;
     136    std::map<std::string, t_ephList*> _ephList;
    89137
    90     typedef std::map<std::string, t_ephPair*> t_pairMap;
     138    typedef std::map<std::string, t_ephList*> t_listMap;
    91139};
    92140
Note: See TracChangeset for help on using the changeset viewer.