source: ntrip/trunk/BNC/GPSS/gpssDecoder.cpp@ 1432

Last change on this file since 1432 was 1432, checked in by mervart, 16 years ago

* empty log message *

File size: 3.0 KB
RevLine 
[1429]1\
[1310]2/* -------------------------------------------------------------------------
3 * BKG NTRIP Client
4 * -------------------------------------------------------------------------
5 *
6 * Class: gpssDecoder
7 *
8 * Purpose: Decode Data in GPSS Format
9 *
10 * Author: L. Mervart
11 *
12 * Created: 20-Dec-2008
13 *
14 * Changes:
15 *
16 * -----------------------------------------------------------------------*/
17
[1431]18#include <iostream>
19
[1310]20#include "gpssDecoder.h"
[1314]21#include "bncapp.h"
[1310]22
[1312]23#define MODE_SEARCH 0
24#define MODE_TYPE 1
25#define MODE_EPOCH 2
26#define MODE_EPOCH_BODY 3
27#define MODE_EPOCH_CRC 4
28#define MODE_EPOCH_ETX 5
29#define MODE_EPH 6
30#define MODE_EPH_BODY 7
31#define MODE_EPH_CRC 8
32#define MODE_EPH_ETX 9
[1311]33
[1310]34using namespace std;
35
[1311]36typedef struct epochHeader {
37 double t_epoch;
38 int n_svs;
39} EPOCHHEADER;
40
[1310]41// Constructor
42////////////////////////////////////////////////////////////////////////////
43gpssDecoder::gpssDecoder() : GPSDecoder() {
[1313]44 _mode = MODE_SEARCH;
[1314]45
46 connect(this, SIGNAL(newGPSEph(gpsephemeris*)),
47 (bncApp*) qApp, SLOT(slotNewGPSEph(gpsephemeris*)));
[1310]48}
49
50// Destructor
51////////////////////////////////////////////////////////////////////////////
52gpssDecoder::~gpssDecoder() {
53}
54
55//
56////////////////////////////////////////////////////////////////////////////
[1311]57t_irc gpssDecoder::Decode(char* data, int dataLen, vector<string>& errmsg) {
58
[1310]59 errmsg.clear();
60
[1429]61 _buffer += QByteArray(data, dataLen);
[1311]62
[1429]63 int iBeg;
64 while ( (iBeg = _buffer.indexOf(0x02)) != -1) {
65 _buffer = _buffer.mid(iBeg);
[1311]66
[1429]67 int recordSize;
[1430]68 int crc;
[1429]69
70 // Observations
71 // ------------
72 if (char(_buffer[1]) == 0x00) {
[1431]73
74 int reqLength = 2 + sizeof(recordSize) + sizeof(EPOCHHEADER);
75
76 cout << "Obs: " << _buffer.length() << " " << reqLength << endl;
77
78 if (_buffer.length() >= reqLength) {
79 EPOCHHEADER epochHdr;
[1429]80 memcpy(&epochHdr, _buffer.data() + 2 + sizeof(recordSize),
81 sizeof(epochHdr));
[1431]82
83 reqLength += epochHdr.n_svs * sizeof(t_obsInternal) + sizeof(crc) + 1;
[1311]84
[1430]85 if (_buffer.length() >= reqLength) {
86 for (int is = 0; is < epochHdr.n_svs; is++) {
[1429]87 t_obs* obs = new t_obs();
[1430]88 memcpy(&(obs->_o), _buffer.data() + 2 + sizeof(recordSize) +
89 sizeof(epochHdr) + is * sizeof(t_obsInternal),
90 sizeof(t_obsInternal));
[1429]91 _obsList.push_back(obs);
92 }
93 }
[1425]94 }
[1431]95 _buffer.mid(reqLength);
[1425]96 }
[1311]97
[1429]98 // Ephemeris
99 // ---------
100 else if (char(_buffer[1]) == 0x01) {
[1430]101 int reqLength = 2 + sizeof(recordSize) + sizeof(gpsephemeris) +
102 sizeof(crc) + 1;
[1431]103
104 cout << "Eph: " << _buffer.length() << " " << reqLength << endl;
105
[1430]106 if (_buffer.length() >= reqLength) {
[1429]107 gpsephemeris* gpsEph = new gpsephemeris;
[1432]108 memcpy(gpsEph, _buffer.data() + 2 + sizeof(recordSize),
109 sizeof(gpsephemeris));
[1429]110 emit newGPSEph(gpsEph);
[1426]111 }
[1431]112 _buffer.mid(reqLength);
[1425]113 }
[1311]114
[1425]115 else {
[1429]116 _buffer == _buffer.mid(1);
[1311]117 }
[1312]118 }
[1311]119
[1425]120 return success;
[1310]121}
Note: See TracBrowser for help on using the repository browser.