Changeset 1218 in ntrip for trunk/BNC/RTCM/RTCM2Decoder.cpp


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)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.