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

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

* empty log message *

File size: 3.7 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.append(data, dataLen);
60
61 for (;;) {
62
63 if (_mode == MODE_SEARCH) {
64 if (_buffer.size() < 1) {
65 _mode = MODE_SEARCH;
66 return success;
67 }
68 if (_buffer[0] == 0x02) {
69 _mode = MODE_TYPE;
70 }
71 _buffer.erase(0,1);
72 }
73
74 else if (_mode == MODE_TYPE) {
75 if (_buffer.size() < 1) {
76 _mode = MODE_SEARCH;
77 return success;
78 }
79 if (_buffer[0] == 0x00) {
80 _mode = MODE_EPOCH;
81 } else if (_buffer[0] == 0x01) {
82 _mode = MODE_EPH;
83 } else {
84 errmsg.push_back("Unknown record type");
85 _mode = MODE_SEARCH;
86 }
87 _buffer.erase(0,1);
88 }
89
90 else if (_mode == MODE_EPOCH || _mode == MODE_EPH) {
91 int recordSize;
92 if (_buffer.size() < sizeof(recordSize)) {
93 _mode = MODE_SEARCH;
94 return success;
95 }
96 memcpy(&recordSize, _buffer.data(), sizeof(recordSize));
97 if (_mode == MODE_EPOCH) {
98 _mode = MODE_EPOCH_BODY;
99 }
100 if (_mode == MODE_EPH) {
101 _mode = MODE_EPH_BODY;
102 }
103 _buffer.erase(0,sizeof(recordSize));
104 }
105
106 else if (_mode == MODE_EPOCH_BODY) {
107 EPOCHHEADER epochHdr;
108 if (_buffer.size() < sizeof(epochHdr)) {
109 _mode = MODE_SEARCH;
110 return success;
111 }
112 memcpy(&epochHdr, _buffer.data(), sizeof(epochHdr));
113 _buffer.erase(0,sizeof(epochHdr));
114 for (int is = 1; is <= epochHdr.n_svs; is++) {
115 if (_buffer.size() < sizeof(t_obsInternal)) {
116 _mode = MODE_SEARCH;
117 return success;
118 }
119 t_obs* obs = new t_obs();
120 memcpy(&(obs->_o), _buffer.data(), sizeof(t_obsInternal));
121 _obsList.push_back(obs);
122 _buffer.erase(0, sizeof(t_obsInternal));
123 }
124 _mode = MODE_EPOCH_CRC;
125 }
126
127 else if (_mode == MODE_EPH_BODY) {
128 if (_buffer.size() < sizeof(gpsephemeris)) {
129 _mode = MODE_SEARCH;
130 return success;
131 }
132 gpsephemeris* gpsEph = new gpsephemeris;
133 memcpy(gpsEph, _buffer.data(), sizeof(gpsephemeris));
134 emit newGPSEph(gpsEph);
135 _buffer.erase(0, sizeof(gpsephemeris));
136 _mode = MODE_EPH_CRC;
137 }
138
139 else {
140 if (_buffer.size() < 1) {
141 _mode = MODE_SEARCH;
142 return success;
143 }
144 _buffer.erase(0,1);
145 _mode = MODE_SEARCH;
146 }
147 }
148
149 return success;
150}
Note: See TracBrowser for help on using the repository browser.