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

Last change on this file since 1430 was 1430, checked in by mervart, 15 years ago

* empty log message *

File size: 2.9 KB
Line 
1\
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
18#include "gpssDecoder.h"
19#include "bncapp.h"
20
21#define MODE_SEARCH 0
22#define MODE_TYPE 1
23#define MODE_EPOCH 2
24#define MODE_EPOCH_BODY 3
25#define MODE_EPOCH_CRC 4
26#define MODE_EPOCH_ETX 5
27#define MODE_EPH 6
28#define MODE_EPH_BODY 7
29#define MODE_EPH_CRC 8
30#define MODE_EPH_ETX 9
31
32using namespace std;
33
34typedef struct epochHeader {
35 double t_epoch;
36 int n_svs;
37} EPOCHHEADER;
38
39// Constructor
40////////////////////////////////////////////////////////////////////////////
41gpssDecoder::gpssDecoder() : GPSDecoder() {
42 _mode = MODE_SEARCH;
43
44 connect(this, SIGNAL(newGPSEph(gpsephemeris*)),
45 (bncApp*) qApp, SLOT(slotNewGPSEph(gpsephemeris*)));
46}
47
48// Destructor
49////////////////////////////////////////////////////////////////////////////
50gpssDecoder::~gpssDecoder() {
51}
52
53//
54////////////////////////////////////////////////////////////////////////////
55t_irc gpssDecoder::Decode(char* data, int dataLen, vector<string>& errmsg) {
56
57 errmsg.clear();
58
59 _buffer += QByteArray(data, dataLen);
60
61 int iBeg;
62 while ( (iBeg = _buffer.indexOf(0x02)) != -1) {
63 _buffer = _buffer.mid(iBeg);
64
65 int recordSize;
66 int crc;
67
68 // Observations
69 // ------------
70 if (char(_buffer[1]) == 0x00) {
71 EPOCHHEADER epochHdr;
72 if (_buffer.length() >= int(2 + sizeof(recordSize) + sizeof(epochHdr))) {
73 memcpy(&epochHdr, _buffer.data() + 2 + sizeof(recordSize),
74 sizeof(epochHdr));
75
76 int reqLength = 2 + sizeof(recordSize) + sizeof(epochHdr) +
77 epochHdr.n_svs * sizeof(t_obsInternal) + sizeof(crc) + 1;
78
79 if (_buffer.length() >= reqLength) {
80 for (int is = 0; is < epochHdr.n_svs; is++) {
81 t_obs* obs = new t_obs();
82 memcpy(&(obs->_o), _buffer.data() + 2 + sizeof(recordSize) +
83 sizeof(epochHdr) + is * sizeof(t_obsInternal),
84 sizeof(t_obsInternal));
85 _obsList.push_back(obs);
86 }
87 }
88 }
89 }
90
91 // Ephemeris
92 // ---------
93 else if (char(_buffer[1]) == 0x01) {
94 int reqLength = 2 + sizeof(recordSize) + sizeof(gpsephemeris) +
95 sizeof(crc) + 1;
96 if (_buffer.length() >= reqLength) {
97 gpsephemeris* gpsEph = new gpsephemeris;
98 memcpy(gpsEph, _buffer.data() + 2 + sizeof(recordSize) +
99 sizeof(gpsephemeris), sizeof(gpsephemeris));
100 emit newGPSEph(gpsEph);
101 }
102 }
103
104 else {
105 _buffer == _buffer.mid(1);
106 }
107 }
108
109 return success;
110}
Note: See TracBrowser for help on using the repository browser.