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

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

* empty log message *

File size: 3.1 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 <iostream>
19
20#include "gpssDecoder.h"
21#include "bncapp.h"
22
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
33
34using namespace std;
35
36typedef struct epochHeader {
37 double t_epoch;
38 int n_svs;
39} EPOCHHEADER;
40
41// Constructor
42////////////////////////////////////////////////////////////////////////////
43gpssDecoder::gpssDecoder() : GPSDecoder() {
44 _mode = MODE_SEARCH;
45
46 connect(this, SIGNAL(newGPSEph(gpsephemeris*)),
47 (bncApp*) qApp, SLOT(slotNewGPSEph(gpsephemeris*)));
48}
49
50// Destructor
51////////////////////////////////////////////////////////////////////////////
52gpssDecoder::~gpssDecoder() {
53}
54
55//
56////////////////////////////////////////////////////////////////////////////
57t_irc gpssDecoder::Decode(char* data, int dataLen, vector<string>& errmsg) {
58
59 errmsg.clear();
60
61 _buffer += QByteArray(data, dataLen);
62
63 int iBeg;
64 while ( (iBeg = _buffer.indexOf(0x02)) != -1) {
65 _buffer = _buffer.mid(iBeg);
66
67 int recordSize;
68 int crc;
69
70 // Observations
71 // ------------
72 if (char(_buffer[1]) == 0x00) {
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;
80 memcpy(&epochHdr, _buffer.data() + 2 + sizeof(recordSize),
81 sizeof(epochHdr));
82
83 reqLength += epochHdr.n_svs * sizeof(t_obsInternal) + sizeof(crc) + 1;
84
85 if (_buffer.length() >= reqLength) {
86 for (int is = 0; is < epochHdr.n_svs; is++) {
87 t_obs* obs = new t_obs();
88 memcpy(&(obs->_o), _buffer.data() + 2 + sizeof(recordSize) +
89 sizeof(epochHdr) + is * sizeof(t_obsInternal),
90 sizeof(t_obsInternal));
91 _obsList.push_back(obs);
92 }
93 }
94 }
95 _buffer = _buffer.mid(reqLength);
96 }
97
98 // Ephemeris
99 // ---------
100 else if (char(_buffer[1]) == 0x01) {
101 int reqLength = 2 + sizeof(recordSize) + sizeof(gpsephemeris) +
102 sizeof(crc) + 1;
103
104 cout << "Eph: " << _buffer.length() << " " << reqLength << endl;
105
106 if (_buffer.length() >= reqLength) {
107 gpsephemeris* gpsEph = new gpsephemeris;
108 memcpy(gpsEph, _buffer.data() + 2 + sizeof(recordSize),
109 sizeof(gpsephemeris));
110 emit newGPSEph(gpsEph);
111 }
112 _buffer = _buffer.mid(reqLength);
113 }
114
115 else {
116 _buffer == _buffer.mid(1);
117 }
118 }
119
120 return success;
121}
Note: See TracBrowser for help on using the repository browser.