Changeset 1311 in ntrip


Ignore:
Timestamp:
Dec 20, 2008, 1:32:04 PM (15 years ago)
Author:
mervart
Message:

* empty log message *

Location:
trunk/BNC/GPSS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/GPSS/gpssDecoder.cpp

    r1310 r1311  
    1818#include "gpssDecoder.h"
    1919
     20#define MODE_SEARCH     0
     21#define MODE_TYPE       1
     22#define MODE_EPOCH      2
     23#define MODE_EPOCH_BODY 3
     24#define MODE_EPOCH_CRC  4
     25#define MODE_EPOCH_ETX  5
     26#define MODE_EPH        6
     27#define MODE_EPH_BODY   7
     28#define MODE_EPH_CRC    8
     29#define MODE_EPH_ETX    9
     30#define MAX_PRN         32
     31
    2032using namespace std;
     33
     34typedef struct epochHeader {
     35  double t_epoch;
     36  int    n_svs;
     37} EPOCHHEADER;
    2138
    2239// Constructor
    2340////////////////////////////////////////////////////////////////////////////
    2441gpssDecoder::gpssDecoder() : GPSDecoder() {
     42  _mode = MODE_SEARCH;
    2543}
    2644
     
    3250//
    3351////////////////////////////////////////////////////////////////////////////
    34 t_irc gpssDecoder::Decode(char* buffer, int bufLen, vector<string>& errmsg) {
     52t_irc gpssDecoder::Decode(char* data, int dataLen, vector<string>& errmsg) {
     53
    3554  errmsg.clear();
    3655
     56  _buffer.append(data, dataLen);
     57
     58  bool     haveEpoch  = false;
     59  bool     haveEph    = false;
     60  int      recordSize = 0;
     61  unsigned offset     = 0;
     62
     63  EPOCHHEADER   epochHdr;
     64  t_obsInternal gpsObs[MAX_PRN];
     65  gpsephemeris  gpsEph;
     66
     67  for (offset = 0; offset < _buffer.size(); offset++) {
     68
     69    switch(_mode) {
     70
     71      case MODE_SEARCH:
     72        if (_buffer[offset] == 0x02) {
     73          _mode = MODE_TYPE;
     74        }
     75        continue;
     76
     77      case MODE_TYPE:
     78        if        (_buffer[offset] == 0x00) {
     79          _mode = MODE_EPOCH;
     80        } else if (_buffer[offset] == 0x01) {
     81          _mode = MODE_EPH;
     82        } else {
     83          errmsg.push_back("Unknown record type");
     84          _mode = MODE_SEARCH;
     85        }
     86        continue;
     87
     88      case MODE_EPOCH:
     89      case MODE_EPH:
     90        if (offset+sizeof(recordSize) > _buffer.size()) {
     91          errmsg.push_back("Record size too large (A)");
     92          _mode = MODE_SEARCH;
     93        } else {
     94          memcpy(&_buffer[offset], &recordSize, sizeof(recordSize));
     95          if (_mode == MODE_EPOCH) {
     96            _mode = MODE_EPOCH_BODY;
     97          }
     98          if (_mode == MODE_EPH) {
     99            _mode = MODE_EPH_BODY;
     100          }
     101          offset += sizeof(recordSize) - 1;
     102        }
     103        continue;
     104
     105      case MODE_EPOCH_BODY:
     106        if (offset + recordSize > _buffer.size()) {
     107          errmsg.push_back("Record size too large (B)");
     108          _mode = MODE_SEARCH;
     109        } else {
     110          ///          memcpy(&_buffer[offset], epoch, recordSize);
     111          offset += recordSize - 1;
     112          _mode = MODE_EPOCH_CRC;
     113        }
     114        continue;
     115
     116      case MODE_EPH_BODY:
     117        if (offset + recordSize > _buffer.size()) {
     118          errmsg.push_back("Record size too large (B)");
     119          _mode = MODE_SEARCH;
     120        } else {
     121          ///          memcpy(&_buffer[offset], eph, recordSize);
     122          offset += recordSize - 1;
     123          _mode = MODE_EPH_CRC;
     124        }
     125        continue;
     126
     127      case MODE_EPOCH_CRC:
     128        _mode = MODE_EPOCH_ETX; // TODO: CRC check
     129        continue;
     130
     131      case MODE_EPH_CRC:
     132        _mode = MODE_EPH_ETX;   // TODO: CRC check
     133        continue;
     134
     135      case MODE_EPOCH_ETX:
     136        haveEpoch = true;
     137        _mode = MODE_SEARCH;
     138        continue;
     139
     140      case MODE_EPH_ETX:
     141        haveEph = true;
     142        _mode = MODE_SEARCH;
     143        continue;
     144    }
     145
     146    if (haveEpoch) {
     147      haveEpoch = false;
     148    }
     149
     150    if (haveEph) {
     151      haveEph = false;
     152    }
     153  }
    37154}
  • trunk/BNC/GPSS/gpssDecoder.h

    r1310 r1311  
    1010class gpssDecoder : public QObject, public GPSDecoder {
    1111Q_OBJECT
     12
    1213 public:
    1314  gpssDecoder();
    1415  virtual ~gpssDecoder();
    1516  virtual t_irc Decode(char* buffer, int bufLen, std::vector<std::string>& errmsg);
     17
    1618 signals:
    1719  void newMessage(QByteArray msg, bool showOnScreen);
    1820  void newGPSEph(gpsephemeris* gpseph);
     21
    1922 private:
     23  int         _mode;
     24  std::string _buffer;
    2025} ;
    2126
Note: See TracChangeset for help on using the changeset viewer.