source: ntrip/trunk/BNC/src/pppMain.cpp@ 7948

Last change on this file since 7948 was 7943, checked in by stuerze, 10 years ago

the approach how to wait for clock corrections in PPP mode, which was well proven in BNC verson 2.11 is now re-implemented

File size: 13.4 KB
Line 
1
2// Part of BNC, a utility for retrieving decoding and
3// converting GNSS data streams from NTRIP broadcasters.
4//
5// Copyright (C) 2007
6// German Federal Agency for Cartography and Geodesy (BKG)
7// http://www.bkg.bund.de
8// Czech Technical University Prague, Department of Geodesy
9// http://www.fsv.cvut.cz
10//
11// Email: euref-ip@bkg.bund.de
12//
13// This program is free software; you can redistribute it and/or
14// modify it under the terms of the GNU General Public License
15// as published by the Free Software Foundation, version 2.
16//
17// This program is distributed in the hope that it will be useful,
18// but WITHOUT ANY WARRANTY; without even the implied warranty of
19// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20// GNU General Public License for more details.
21//
22// You should have received a copy of the GNU General Public License
23// along with this program; if not, write to the Free Software
24// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25
26/* -------------------------------------------------------------------------
27 * BKG NTRIP Client
28 * -------------------------------------------------------------------------
29 *
30 * Class: t_pppMain
31 *
32 * Purpose: Start of the PPP client(s)
33 *
34 * Author: L. Mervart
35 *
36 * Created: 29-Jul-2014
37 *
38 * Changes:
39 *
40 * -----------------------------------------------------------------------*/
41
42#include <iostream>
43
44#include "pppMain.h"
45#include "pppCrdFile.h"
46#include "bncsettings.h"
47
48using namespace BNC_PPP;
49using namespace std;
50
51// Constructor
52//////////////////////////////////////////////////////////////////////////////
53t_pppMain::t_pppMain() {
54 _running = false;
55}
56
57// Destructor
58//////////////////////////////////////////////////////////////////////////////
59t_pppMain::~t_pppMain() {
60 stop();
61 QListIterator<t_pppOptions*> iOpt(_options);
62 while (iOpt.hasNext()) {
63 delete iOpt.next();
64 }
65}
66
67//
68//////////////////////////////////////////////////////////////////////////////
69void t_pppMain::start() {
70 if (_running) {
71 return;
72 }
73
74 try {
75 readOptions();
76
77 QListIterator<t_pppOptions*> iOpt(_options);
78 while (iOpt.hasNext()) {
79 const t_pppOptions* opt = iOpt.next();
80 t_pppThread* pppThread = new t_pppThread(opt);
81 pppThread->start();
82 _pppThreads << pppThread;
83 _running = true;
84 }
85 }
86 catch (t_except exc) {
87 _running = true;
88 stop();
89 }
90}
91
92//
93//////////////////////////////////////////////////////////////////////////////
94void t_pppMain::stop() {
95
96 if (!_running) {
97 return;
98 }
99
100 if (_realTime) {
101 QListIterator<t_pppThread*> it(_pppThreads);
102 while (it.hasNext()) {
103 t_pppThread* pppThread = it.next();
104 pppThread->exit();
105#ifdef BNC_DEBUG
106 if (BNC_CORE->mode() != t_bncCore::interactive) {
107 while(!pppThread->isFinished()) {
108 pppThread->wait();
109 }
110 delete pppThread;
111 }
112#endif
113 }
114 _pppThreads.clear();
115 }
116
117 _running = false;
118}
119
120//
121//////////////////////////////////////////////////////////////////////////////
122void t_pppMain::readOptions() {
123
124 QListIterator<t_pppOptions*> iOpt(_options);
125 while (iOpt.hasNext()) {
126 delete iOpt.next();
127 }
128 _options.clear();
129
130 bncSettings settings;
131
132 _realTime = false;
133 if (settings.value("PPP/dataSource").toString() == "Real-Time Streams") {
134 _realTime = true;
135 }
136 else if (settings.value("PPP/dataSource").toString() == "RINEX Files") {
137 _realTime = false;
138 }
139 else {
140 return;
141 }
142
143 QListIterator<QString> iSta(settings.value("PPP/staTable").toStringList());
144 while (iSta.hasNext()) {
145 QStringList hlp = iSta.next().split(",");
146
147 if (hlp.size() < 10) {
148 throw t_except("pppMain: wrong option staTable");
149 }
150
151 t_pppOptions* opt = new t_pppOptions();
152
153 opt->_realTime = _realTime;
154 opt->_roverName = hlp[0].toStdString();
155 opt->_aprSigCrd[0] = hlp[1].toDouble();
156 opt->_aprSigCrd[1] = hlp[2].toDouble();
157 opt->_aprSigCrd[2] = hlp[3].toDouble();
158 opt->_noiseCrd[0] = hlp[4].toDouble();
159 opt->_noiseCrd[1] = hlp[5].toDouble();
160 opt->_noiseCrd[2] = hlp[6].toDouble();
161 opt->_aprSigTrp = hlp[7].toDouble();
162 opt->_noiseTrp = hlp[8].toDouble();
163 opt->_nmeaPort = hlp[9].toInt();
164
165 if (_realTime) {
166 opt->_corrMount.assign(settings.value("PPP/corrMount").toString().toStdString());
167 }
168 else {
169 opt->_rinexObs.assign(settings.value("PPP/rinexObs").toString().toStdString());
170 opt->_rinexNav.assign(settings.value("PPP/rinexNav").toString().toStdString());
171 opt->_corrFile.assign(settings.value("PPP/corrFile").toString().toStdString());
172 }
173
174 opt->_crdFile.assign(settings.value("PPP/crdFile").toString().toStdString());
175 opt->_antexFileName.assign(settings.value("PPP/antexFile").toString().toStdString());
176
177 opt->_sigmaC1 = settings.value("PPP/sigmaC1").toDouble(); if (opt->_sigmaC1 <= 0.0) opt->_sigmaC1 = 2.0;
178 opt->_sigmaL1 = settings.value("PPP/sigmaL1").toDouble(); if (opt->_sigmaL1 <= 0.0) opt->_sigmaL1 = 0.01;
179 opt->_corrWaitTime = settings.value("PPP/corrWaitTime").toDouble();
180 if (!_realTime || opt->_corrMount.empty()) {
181 opt->_corrWaitTime = 0;
182 }
183
184 if (settings.value("PPP/lcGPS").toString() == "P1") {
185 opt->_LCsGPS.push_back(t_lc::c1);
186 }
187 else if (settings.value("PPP/lcGPS").toString() == "L1") {
188 opt->_LCsGPS.push_back(t_lc::l1);
189 }
190 else if (settings.value("PPP/lcGPS").toString() == "P1&L1") {
191 opt->_LCsGPS.push_back(t_lc::c1);
192 opt->_LCsGPS.push_back(t_lc::l1);
193 }
194 if (settings.value("PPP/lcGPS").toString() == "P2") {
195 opt->_LCsGPS.push_back(t_lc::c2);
196 }
197 else if (settings.value("PPP/lcGPS").toString() == "L2") {
198 opt->_LCsGPS.push_back(t_lc::l2);
199 }
200 else if (settings.value("PPP/lcGPS").toString() == "P2&L2") {
201 opt->_LCsGPS.push_back(t_lc::c2);
202 opt->_LCsGPS.push_back(t_lc::l2);
203 }
204 if (settings.value("PPP/lcGPS").toString() == "Pi") {
205 opt->_LCsGPS.push_back(t_lc::c1);
206 opt->_LCsGPS.push_back(t_lc::c2);
207 }
208 else if (settings.value("PPP/lcGPS").toString() == "Li") {
209 opt->_LCsGPS.push_back(t_lc::l1);
210 opt->_LCsGPS.push_back(t_lc::l2);
211 }
212 else if (settings.value("PPP/lcGPS").toString() == "Pi&Li") {
213 opt->_LCsGPS.push_back(t_lc::c1);
214 opt->_LCsGPS.push_back(t_lc::c2);
215 opt->_LCsGPS.push_back(t_lc::l1);
216 opt->_LCsGPS.push_back(t_lc::l2);
217 }
218 if (settings.value("PPP/lcGPS").toString() == "P3") {
219 opt->_LCsGPS.push_back(t_lc::cIF);
220 }
221 else if (settings.value("PPP/lcGPS").toString() == "L3") {
222 opt->_LCsGPS.push_back(t_lc::lIF);
223 }
224 else if (settings.value("PPP/lcGPS").toString() == "P3&L3") {
225 opt->_LCsGPS.push_back(t_lc::cIF);
226 opt->_LCsGPS.push_back(t_lc::lIF);
227 }
228
229 if (settings.value("PPP/lcGLONASS").toString() == "P1") {
230 opt->_LCsGLONASS.push_back(t_lc::c1);
231 }
232 else if (settings.value("PPP/lcGLONASS").toString() == "L1") {
233 opt->_LCsGLONASS.push_back(t_lc::l1);
234 }
235 else if (settings.value("PPP/lcGLONASS").toString() == "P1&L1") {
236 opt->_LCsGLONASS.push_back(t_lc::c1);
237 opt->_LCsGLONASS.push_back(t_lc::l1);
238 }
239 if (settings.value("PPP/lcGLONASS").toString() == "P2") {
240 opt->_LCsGLONASS.push_back(t_lc::c2);
241 }
242 else if (settings.value("PPP/lcGLONASS").toString() == "L2") {
243 opt->_LCsGLONASS.push_back(t_lc::l2);
244 }
245 else if (settings.value("PPP/lcGLONASS").toString() == "P2&L2") {
246 opt->_LCsGLONASS.push_back(t_lc::c2);
247 opt->_LCsGLONASS.push_back(t_lc::l2);
248 }
249 if (settings.value("PPP/lcGLONASS").toString() == "Pi") {
250 opt->_LCsGLONASS.push_back(t_lc::c1);
251 opt->_LCsGLONASS.push_back(t_lc::c2);
252 }
253 else if (settings.value("PPP/lcGLONASS").toString() == "Li") {
254 opt->_LCsGLONASS.push_back(t_lc::l1);
255 opt->_LCsGLONASS.push_back(t_lc::l2);
256 }
257 else if (settings.value("PPP/lcGLONASS").toString() == "Pi&Li") {
258 opt->_LCsGLONASS.push_back(t_lc::c1);
259 opt->_LCsGLONASS.push_back(t_lc::c2);
260 opt->_LCsGLONASS.push_back(t_lc::l1);
261 opt->_LCsGLONASS.push_back(t_lc::l2);
262 }
263 if (settings.value("PPP/lcGLONASS").toString() == "P3") {
264 opt->_LCsGLONASS.push_back(t_lc::cIF);
265 }
266 else if (settings.value("PPP/lcGLONASS").toString() == "L3") {
267 opt->_LCsGLONASS.push_back(t_lc::lIF);
268 }
269 else if (settings.value("PPP/lcGLONASS").toString() == "P3&L3") {
270 opt->_LCsGLONASS.push_back(t_lc::cIF);
271 opt->_LCsGLONASS.push_back(t_lc::lIF);
272 }
273
274 if (settings.value("PPP/lcGalileo").toString() == "P1") {
275 opt->_LCsGalileo.push_back(t_lc::c1);
276 }
277 else if (settings.value("PPP/lcGalileo").toString() == "L1") {
278 opt->_LCsGalileo.push_back(t_lc::l1);
279 }
280 else if (settings.value("PPP/lcGalileo").toString() == "P1&L1") {
281 opt->_LCsGalileo.push_back(t_lc::c1);
282 opt->_LCsGalileo.push_back(t_lc::l1);
283 }
284 if (settings.value("PPP/lcGalileo").toString() == "P5") {
285 opt->_LCsGalileo.push_back(t_lc::c2);
286 }
287 else if (settings.value("PPP/lcGalileo").toString() == "L5") {
288 opt->_LCsGalileo.push_back(t_lc::l2);
289 }
290 else if (settings.value("PPP/lcGalileo").toString() == "P5&L5") {
291 opt->_LCsGalileo.push_back(t_lc::c2);
292 opt->_LCsGalileo.push_back(t_lc::l2);
293 }
294 if (settings.value("PPP/lcGalileo").toString() == "Pi") {
295 opt->_LCsGalileo.push_back(t_lc::c1);
296 opt->_LCsGalileo.push_back(t_lc::c2);
297 }
298 else if (settings.value("PPP/lcGalileo").toString() == "Li") {
299 opt->_LCsGalileo.push_back(t_lc::l1);
300 opt->_LCsGalileo.push_back(t_lc::l2);
301 }
302 else if (settings.value("PPP/lcGalileo").toString() == "Pi&Li") {
303 opt->_LCsGalileo.push_back(t_lc::c1);
304 opt->_LCsGalileo.push_back(t_lc::c2);
305 opt->_LCsGalileo.push_back(t_lc::l1);
306 opt->_LCsGalileo.push_back(t_lc::l2);
307 }
308 if (settings.value("PPP/lcGalileo").toString() == "P3") {
309 opt->_LCsGalileo.push_back(t_lc::cIF);
310 }
311 else if (settings.value("PPP/lcGalileo").toString() == "L3") {
312 opt->_LCsGalileo.push_back(t_lc::lIF);
313 }
314 else if (settings.value("PPP/lcGalileo").toString() == "P3&L3") {
315 opt->_LCsGalileo.push_back(t_lc::cIF);
316 opt->_LCsGalileo.push_back(t_lc::lIF);
317 }
318
319 if (settings.value("PPP/lcBDS").toString() == "P2") {
320 opt->_LCsBDS.push_back(t_lc::c1);
321 }
322 else if (settings.value("PPP/lcBDS").toString() == "L2") {
323 opt->_LCsBDS.push_back(t_lc::l1);
324 }
325 else if (settings.value("PPP/lcBDS").toString() == "P2&L2") {
326 opt->_LCsBDS.push_back(t_lc::c1);
327 opt->_LCsBDS.push_back(t_lc::l1);
328 }
329 if (settings.value("PPP/lcBDS").toString() == "P7") {
330 opt->_LCsBDS.push_back(t_lc::c2);
331 }
332 else if (settings.value("PPP/lcBDS").toString() == "L7") {
333 opt->_LCsBDS.push_back(t_lc::l2);
334 }
335 else if (settings.value("PPP/lcBDS").toString() == "P7&L7") {
336 opt->_LCsBDS.push_back(t_lc::c2);
337 opt->_LCsBDS.push_back(t_lc::l2);
338 }
339 if (settings.value("PPP/lcBDS").toString() == "Pi") {
340 opt->_LCsBDS.push_back(t_lc::c1);
341 opt->_LCsBDS.push_back(t_lc::c2);
342 }
343 else if (settings.value("PPP/lcBDS").toString() == "Li") {
344 opt->_LCsBDS.push_back(t_lc::l1);
345 opt->_LCsBDS.push_back(t_lc::l2);
346 }
347 else if (settings.value("PPP/lcBDS").toString() == "Pi&Li") {
348 opt->_LCsBDS.push_back(t_lc::c1);
349 opt->_LCsBDS.push_back(t_lc::c2);
350 opt->_LCsBDS.push_back(t_lc::l1);
351 opt->_LCsBDS.push_back(t_lc::l2);
352 }
353 if (settings.value("PPP/lcBDS").toString() == "P3") {
354 opt->_LCsBDS.push_back(t_lc::cIF);
355 }
356 else if (settings.value("PPP/lcBDS").toString() == "L3") {
357 opt->_LCsBDS.push_back(t_lc::lIF);
358 }
359 else if (settings.value("PPP/lcBDS").toString() == "P3&L3") {
360 opt->_LCsBDS.push_back(t_lc::cIF);
361 opt->_LCsBDS.push_back(t_lc::lIF);
362 }
363
364 // Information from the coordinate file
365 // ------------------------------------
366 string crdFileName(settings.value("PPP/crdFile").toString().toStdString());
367 if (!crdFileName.empty()) {
368 vector<t_pppCrdFile::t_staInfo> staInfoVec;
369 t_pppCrdFile::readCrdFile(crdFileName, staInfoVec);
370 for (unsigned ii = 0; ii < staInfoVec.size(); ii++) {
371 const t_pppCrdFile::t_staInfo& staInfo = staInfoVec[ii];
372 if (staInfo._name == opt->_roverName) {
373 opt->_xyzAprRover[0] = staInfo._xyz[0];
374 opt->_xyzAprRover[1] = staInfo._xyz[1];
375 opt->_xyzAprRover[2] = staInfo._xyz[2];
376 opt->_neuEccRover[0] = staInfo._neuAnt[0];
377 opt->_neuEccRover[1] = staInfo._neuAnt[1];
378 opt->_neuEccRover[2] = staInfo._neuAnt[2];
379 opt->_antNameRover = staInfo._antenna;
380 opt->_recNameRover = staInfo._receiver;
381 break;
382 }
383 }
384 }
385
386 opt->_minObs = settings.value("PPP/minObs").toInt(); if (opt->_minObs < 4) opt->_minObs = 4;
387 opt->_minEle = settings.value("PPP/minEle").toDouble() * M_PI / 180.0;
388 opt->_maxResC1 = settings.value("PPP/maxResC1").toDouble(); if (opt->_maxResC1 <= 0.0) opt->_maxResC1 = 3.0;
389 opt->_maxResL1 = settings.value("PPP/maxResL1").toDouble(); if (opt->_maxResL1 <= 0.0) opt->_maxResL1 = 0.03;
390 opt->_eleWgtCode = (settings.value("PPP/eleWgtCode").toInt() != 0);
391 opt->_eleWgtPhase = (settings.value("PPP/eleWgtPhase").toInt() != 0);
392 opt->_seedingTime = settings.value("PPP/seedingTime").toDouble();
393
394 // Some default values
395 // -------------------
396 opt->_aprSigAmb = 100.0;
397 opt->_noiseClk = 1000.0;
398
399 _options << opt;
400 }
401}
402
Note: See TracBrowser for help on using the repository browser.