source: ntrip/trunk/BNC/src/RTRover/bncrtrover.cpp@ 4769

Last change on this file since 4769 was 4769, checked in by mervart, 12 years ago
File size: 6.9 KB
Line 
1
2#include <iostream>
3#include <string.h>
4
5#include "bncrtrover.h"
6#include "bncapp.h"
7#include "bncsettings.h"
8#include "bnctime.h"
9
10#include "rtrover_interface.h"
11
12using namespace std;
13
14// Constructor
15////////////////////////////////////////////////////////////////////////////
16t_bncRtrover::t_bncRtrover() : QThread(0) {
17}
18
19// Destructor
20////////////////////////////////////////////////////////////////////////////
21t_bncRtrover::~t_bncRtrover() {
22 rtrover_destroy();
23}
24
25// Run (virtual)
26////////////////////////////////////////////////////////////////////////////
27void t_bncRtrover::run() {
28 bncSettings settings;
29
30 // User Options
31 // ------------
32 _mode = settings.value("rtroverMode").toByteArray();
33 _roverMount = settings.value("rtroverRoverMount").toByteArray();
34 _baseMount = settings.value("rtroverBaseMount").toByteArray();
35 _corrMount = settings.value("rtroverCorrMount").toByteArray();
36 _outputFile.setFileName(settings.value("rtroverOutput").toString());
37 _outputFile.open(QIODevice::WriteOnly | QIODevice::Text);
38
39 // Define Input Options
40 // --------------------
41 rtrover_opt opt;
42
43 opt._roverName = strdup(_roverMount.data());
44 opt._baseName = strdup(_baseMount.data());
45 opt._xyzAprRover[0] = settings.value("rtroverRoverRefCrdX").toDouble();
46 opt._xyzAprRover[1] = settings.value("rtroverRoverRefCrdY").toDouble();
47 opt._xyzAprRover[2] = settings.value("rtroverRoverRefCrdZ").toDouble();
48 opt._xyzAprBase[0] = settings.value("rtroverBaseRefCrdX").toDouble();
49 opt._xyzAprBase[1] = settings.value("rtroverBaseRefCrdY").toDouble();
50 opt._xyzAprBase[2] = settings.value("rtroverBaseRefCrdZ").toDouble();
51 opt._sigmaPhase = 0.002; // TODO
52 opt._sigmaCode = 2.0; // TODO
53
54 rtrover_setOptions(&opt);
55
56 free(opt._roverName);
57 free(opt._baseName);
58
59 // Connect to BNC Signals
60 // ----------------------
61 connect(((bncApp*)qApp), SIGNAL(newCorrections(QList<QString>)),
62 this, SLOT(slotNewCorrections(QList<QString>)));
63
64 connect(((bncApp*)qApp), SIGNAL(newEphGPS(gpsephemeris)),
65 this, SLOT(slotNewEphGPS(gpsephemeris)));
66
67 connect(((bncApp*)qApp), SIGNAL(newEphGlonass(glonassephemeris)),
68 this, SLOT(slotNewEphGlonass(glonassephemeris)));
69
70 connect(((bncApp*)qApp), SIGNAL(newEphGalileo(galileoephemeris)),
71 this, SLOT(slotNewEphGalileo(galileoephemeris)));
72
73 // Start processing loop
74 // ---------------------
75 QThread::exec();
76}
77
78//
79////////////////////////////////////////////////////////////////////////////
80void t_bncRtrover::slotNewEphGPS(gpsephemeris gpseph) {
81 QMutexLocker locker(&_mutex);
82
83 bncTime toc(gpseph.GPSweek, gpseph.TOC);
84 bncTime toe(gpseph.GPSweek, gpseph.TOE);
85
86 rtrover_ephGPS eph;
87 eph._satellite._system = 'G';
88 eph._satellite._number = gpseph.satellite;
89 eph._TOC._mjd = toc.mjd();
90 eph._TOC._sec = toc.daysec();
91 eph._TOE._mjd = toe.mjd();
92 eph._TOE._sec = toe.daysec();
93 eph._IODE = gpseph.IODE;
94 eph._IODC = gpseph.IODC;
95 eph._clock_bias = gpseph.clock_bias;
96 eph._clock_drift = gpseph.clock_drift;
97 eph._clock_driftrate = gpseph.clock_driftrate;
98 eph._Crs = gpseph.Crs;
99 eph._Delta_n = gpseph.Delta_n;
100 eph._M0 = gpseph.M0;
101 eph._Cuc = gpseph.Cuc;
102 eph._e = gpseph.e;
103 eph._Cus = gpseph.Cus;
104 eph._sqrt_A = gpseph.sqrt_A;
105 eph._Cic = gpseph.Cic;
106 eph._OMEGA0 = gpseph.OMEGA0;
107 eph._Cis = gpseph.Cis;
108 eph._i0 = gpseph.i0;
109 eph._Crc = gpseph.Crc;
110 eph._omega = gpseph.omega;
111 eph._OMEGADOT = gpseph.OMEGADOT;
112 eph._IDOT = gpseph.IDOT;
113 eph._TGD = gpseph.TGD;
114 eph._health = gpseph.SVhealth;
115
116 rtrover_putGPSEphemeris(&eph);
117}
118
119//
120////////////////////////////////////////////////////////////////////////////
121void t_bncRtrover::slotNewEphGlonass(glonassephemeris gloeph) {
122 QMutexLocker locker(&_mutex);
123
124 int wwUTC = gloeph.GPSWeek;
125 int towUTC = gloeph.GPSTOW;
126 updatetime(&wwUTC, &towUTC, gloeph.tb*1000, 1); // Moscow -> UTC
127 bncTime tUTC(wwUTC,towUTC);
128
129 int wwGPS = gloeph.GPSWeek;
130 int towGPS = gloeph.GPSTOW;
131 updatetime(&wwGPS, &towGPS, gloeph.tb*1000, 0); // Moscow -> GPS
132 bncTime tGPS(wwGPS,towGPS);
133
134 rtrover_ephGlo eph;
135 eph._satellite._system = 'R';
136 eph._satellite._number = gloeph.almanac_number;
137 eph._timeUTC._mjd = tUTC.mjd();
138 eph._timeUTC._sec = tUTC.daysec();
139 eph._gps_utc = int(tGPS-tUTC);
140 eph._E = gloeph.E;
141 eph._tau = gloeph.tau;
142 eph._gamma = gloeph.gamma;
143 eph._x_pos = gloeph.x_pos;
144 eph._x_velocity = gloeph.x_velocity;
145 eph._x_acceleration = gloeph.x_acceleration;
146 eph._y_pos = gloeph.y_pos;
147 eph._y_velocity = gloeph.y_velocity;
148 eph._y_acceleration = gloeph.y_acceleration;
149 eph._z_pos = gloeph.z_pos;
150 eph._z_velocity = gloeph.z_velocity;
151 eph._z_acceleration = gloeph.z_acceleration;
152 eph._health = 0; // TODO ?
153 eph._frequency_number = gloeph.frequency_number;
154
155 rtrover_putGloEphemeris(&eph);
156}
157
158//
159////////////////////////////////////////////////////////////////////////////
160void t_bncRtrover::slotNewEphGalileo(galileoephemeris /* galeph */) {
161 // not yet implemented
162}
163
164//
165////////////////////////////////////////////////////////////////////////////
166void t_bncRtrover::slotNewCorrections(QList<QString> corrList) {
167 QMutexLocker locker(&_mutex);
168
169 // Check the Mountpoint (source of corrections)
170 // --------------------------------------------
171 QMutableListIterator<QString> itm(corrList);
172 while (itm.hasNext()) {
173 QStringList hlp = itm.next().split(" ");
174 if (hlp.size() > 0) {
175 QString mountpoint = hlp[hlp.size()-1];
176 if (mountpoint != _corrMount) {
177 itm.remove();
178 }
179 }
180 }
181
182 if (corrList.size() == 0) {
183 return;
184 }
185
186 QListIterator<QString> it(corrList);
187 while (it.hasNext()) {
188 QString line = it.next();
189
190 QTextStream in(&line);
191 int messageType;
192 int updateInterval;
193 int GPSweek;
194 double GPSweeks;
195 QString prn;
196 in >> messageType >> updateInterval >> GPSweek >> GPSweeks >> prn;
197
198 if ( t_corr::relevantMessageType(messageType) ) {
199 }
200 }
201}
202
203//
204////////////////////////////////////////////////////////////////////////////
205void t_bncRtrover::slotNewObs(QByteArray staID, bool /* firstObs */, t_obs obsIn) {
206 QMutexLocker locker(&_mutex);
207
208 if (staID != _roverMount && staID != _baseMount) {
209 return;
210 }
211
212 bncTime obsTime(obsIn.GPSWeek, obsIn.GPSWeeks);
213 int numSatRover = 1;
214 rtrover_satObs satObsRover[numSatRover];
215 for (int ii = 0; ii < numSatRover; ii++) {
216
217 }
218
219 rtrover_output output;
220 rtrover_processEpoch(numSatRover, satObsRover, 0, 0, &output);
221
222 _outputFile.write(output._log);
223 _outputFile.flush();
224
225 rtrover_freeOutput(&output);
226}
Note: See TracBrowser for help on using the repository browser.