source: ntrip/trunk/BNC/src/pppWidgets.cpp@ 10109

Last change on this file since 10109 was 10062, checked in by stuerze, 19 months ago

docu updated

File size: 31.3 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: t_pppWidgets
30 *
31 * Purpose: This class stores widgets for PPP options
32 *
33 * Author: L. Mervart
34 *
35 * Created: 29-Jul-2014
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <QCheckBox>
44#include <QComboBox>
45#include <QHeaderView>
46#include <QLineEdit>
47#include <QPushButton>
48#include <QRadioButton>
49#include <QSpinBox>
50#include <QTableWidget>
51
52#include "pppWidgets.h"
53#include "qtfilechooser.h"
54#include "bncsettings.h"
55#include "bnccore.h"
56
57using namespace std;
58
59// Constructor
60////////////////////////////////////////////////////////////////////////////
61t_pppWidgets::t_pppWidgets() {
62
63 _dataSource = new QComboBox(); _dataSource ->setObjectName("PPP/dataSource"); _widgets << _dataSource;
64 _rinexObs = new qtFileChooser(); _rinexObs ->setObjectName("PPP/rinexObs"); _widgets << _rinexObs;
65 _rinexNav = new qtFileChooser(); _rinexNav ->setObjectName("PPP/rinexNav"); _widgets << _rinexNav;
66 _corrMount = new QLineEdit(); _corrMount ->setObjectName("PPP/corrMount"); _widgets << _corrMount;
67 _ionoMount = new QLineEdit(); _ionoMount ->setObjectName("PPP/ionoMount"); _widgets << _ionoMount;
68 _corrFile = new qtFileChooser(); _corrFile ->setObjectName("PPP/corrFile"); _widgets << _corrFile;
69 _ionoFile = new qtFileChooser(); _ionoFile ->setObjectName("PPP/ionoFile"); _widgets << _ionoFile;
70 _crdFile = new qtFileChooser(); _crdFile ->setObjectName("PPP/crdFile"); _widgets << _crdFile;
71 _antexFile = new qtFileChooser(); _antexFile ->setObjectName("PPP/antexFile"); _widgets << _antexFile;
72 _blqFile = new qtFileChooser(); _blqFile ->setObjectName("PPP/blqFile"); _widgets << _blqFile;
73 _logPath = new QLineEdit(); _logPath ->setObjectName("PPP/logPath"); _widgets << _logPath;
74 _nmeaPath = new QLineEdit(); _nmeaPath ->setObjectName("PPP/nmeaPath"); _widgets << _nmeaPath;
75 _snxtroPath = new QLineEdit(); _snxtroPath ->setObjectName("PPP/snxtroPath"); _widgets << _snxtroPath;
76 _snxtroSampl = new QComboBox(); _snxtroSampl->setObjectName("PPP/snxtroSampl"); _widgets << _snxtroSampl;
77 _snxtroIntr = new QComboBox(); _snxtroIntr ->setObjectName("PPP/snxtroIntr"); _widgets << _snxtroIntr;
78 _snxtroAc = new QLineEdit(); _snxtroAc ->setObjectName("PPP/snxtroAc"); _widgets << _snxtroAc;
79 _snxtroSol = new QLineEdit(); _snxtroSol ->setObjectName("PPP/snxtroSol"); _widgets << _snxtroSol;
80 _staTable = new QTableWidget(); _staTable ->setObjectName("PPP/staTable"); _widgets << _staTable;
81 _lcGPS = new QComboBox(); _lcGPS ->setObjectName("PPP/lcGPS"); _widgets << _lcGPS;
82 _lcGLONASS = new QComboBox(); _lcGLONASS ->setObjectName("PPP/lcGLONASS"); _widgets << _lcGLONASS;
83 _lcGalileo = new QComboBox(); _lcGalileo ->setObjectName("PPP/lcGalileo"); _widgets << _lcGalileo;
84 _lcBDS = new QComboBox(); _lcBDS ->setObjectName("PPP/lcBDS"); _widgets << _lcBDS;
85 _modelObs = new QComboBox(); _modelObs ->setObjectName("PPP/modelObs"); _widgets << _modelObs;
86 _pseudoObs = new QComboBox(); _pseudoObs ->setObjectName("PPP/pseudoObs"); _widgets << _pseudoObs;
87 _sigmaC1 = new QLineEdit(); _sigmaC1 ->setObjectName("PPP/sigmaC1"); _widgets << _sigmaC1;
88 _sigmaL1 = new QLineEdit(); _sigmaL1 ->setObjectName("PPP/sigmaL1"); _widgets << _sigmaL1;
89 _sigmaGIM = new QLineEdit(); _sigmaGIM ->setObjectName("PPP/sigmaGIM"); _widgets << _sigmaGIM;
90 _maxResC1 = new QLineEdit(); _maxResC1 ->setObjectName("PPP/maxResC1"); _widgets << _maxResC1;
91 _maxResL1 = new QLineEdit(); _maxResL1 ->setObjectName("PPP/maxResL1"); _widgets << _maxResL1;
92 _maxResGIM = new QLineEdit(); _maxResGIM ->setObjectName("PPP/maxResGIM"); _widgets << _maxResGIM;
93 _minObs = new QSpinBox(); _minObs ->setObjectName("PPP/minObs"); _widgets << _minObs;
94 _minEle = new QSpinBox(); _minEle ->setObjectName("PPP/minEle"); _widgets << _minEle;
95 _eleWgtCode = new QCheckBox(); _eleWgtCode ->setObjectName("PPP/eleWgtCode"); _widgets << _eleWgtCode;
96 _eleWgtPhase = new QCheckBox(); _eleWgtPhase ->setObjectName("PPP/eleWgtPhase"); _widgets << _eleWgtPhase;
97 _seedingTime = new QLineEdit(); _seedingTime ->setObjectName("PPP/seedingTime"); _widgets << _seedingTime;
98 _corrWaitTime = new QSpinBox(); _corrWaitTime->setObjectName("PPP/corrWaitTime"); _widgets << _corrWaitTime;
99
100 _addStaButton = new QPushButton("Add Station"); _widgets << _addStaButton;
101 _delStaButton = new QPushButton("Delete Station"); _widgets << _delStaButton;
102
103 _addStaButton->setWhatsThis(tr("<p>Hit the 'Add Station' button to add a new line to the Station table.</p>"));
104 _delStaButton->setWhatsThis(tr("<p>Hit the 'Delete Station' button to delete a highlighted row from the Station table.</p>"));
105
106 _plotCoordinates = new QLineEdit; _plotCoordinates ->setObjectName("PPP/plotCoordinates"); _widgets << _plotCoordinates;
107 _mapWinButton = new QPushButton; _mapWinButton ->setObjectName("PPP/mapWinButton"); _widgets << _mapWinButton;
108 _audioResponse = new QLineEdit; _audioResponse ->setObjectName("PPP/audioResponse"); _widgets << _audioResponse;
109 _mapWinDotSize = new QLineEdit; _mapWinDotSize ->setObjectName("PPP/mapWinDotSize"); _widgets << _mapWinDotSize;
110 _mapWinDotColor = new QComboBox; _mapWinDotColor ->setObjectName("PPP/mapWinDotColor"); _widgets << _mapWinDotColor;
111 _mapSpeedSlider = new QSlider; _mapSpeedSlider ->setObjectName("PPP/mapSpeedSlider"); _widgets << _mapSpeedSlider;
112
113 _dataSource->setEditable(false);
114 _dataSource->addItems(QString(",Real-Time Streams,RINEX Files").split(","));
115 connect(_dataSource, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotEnableWidgets()));
116 connect(_pseudoObs, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotEnableWidgets()));
117 connect(_modelObs, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotEnableWidgets()));
118 connect(_snxtroPath, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
119 connect(_snxtroAc, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
120 connect(_snxtroSol, SIGNAL(textChanged(const QString &)), this, SLOT(slotPPPTextChanged()));
121
122 slotEnableWidgets();
123
124 _lcGPS->setEditable(false);
125#ifdef USE_PPP_SSR_I
126 _lcGPS->addItems(QString("P3,P3&L3").split(","));
127#else
128 _lcGPS->addItems(QString("Pi&Li,Pi,Li,no").split(","));
129#endif
130
131 _lcGLONASS->setEditable(false);
132#ifdef USE_PPP_SSR_I
133 _lcGLONASS->addItems(QString("no,P3,L3,P3&L3").split(","));
134#else
135 _lcGLONASS->addItems(QString("Pi&Li,Pi,Li,no").split(","));
136#endif
137
138 _lcGalileo->setEditable(false);
139#ifdef USE_PPP_SSR_I
140 _lcGalileo->addItems(QString("no,P3,L3,P3&L3").split(","));
141#else
142 _lcGalileo->addItems(QString("Pi&Li,Pi,Li,no").split(","));
143#endif
144
145 _lcBDS->setEditable(false);
146#ifdef USE_PPP_SSR_I
147 _lcBDS->addItems(QString("no,P3,L3,P3&L3").split(","));
148#else
149 _lcBDS->addItems(QString("Pi&Li,Pi,Li,no").split(","));
150#endif
151
152 _modelObs->setEditable(false);
153 _pseudoObs->setEditable(false);
154#ifdef USE_PPP_SSR_I
155 _modelObs->addItems(QString("Ionosphere-free PPP").split(","));
156 _pseudoObs->addItems(QString("no").split(","));
157#else
158 _modelObs->addItems(QString("Uncombined PPP,Ionosphere-free PPP").split(","));
159 _pseudoObs->addItems(QString("no,Ionosphere").split(","));
160#endif
161
162 _snxtroSampl->setEditable(false);
163 _snxtroSampl->addItems(QString("1 sec,5 sec,10 sec,30 sec,60 sec,300 sec").split(","));
164
165 _snxtroIntr->setEditable(false);
166 _snxtroIntr->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
167 _snxtroIntr->setCurrentIndex(6);
168
169 _minObs->setMinimum(4);
170 _minObs->setMaximum(6);
171 _minObs->setSingleStep(1);
172
173 _minEle->setMinimum(0);
174 _minEle->setMaximum(20);
175 _minEle->setSingleStep(1);
176 _minEle->setSuffix(" deg");
177
178 _corrWaitTime->setMinimum(0);
179 _corrWaitTime->setMaximum(20);
180 _corrWaitTime->setSingleStep(1);
181 _corrWaitTime->setSuffix(" sec");
182
183 _staTable->setColumnCount(11);
184 _staTable->setRowCount(0);
185 _staTable->setHorizontalHeaderLabels(
186 QString("Station,Sigma N,Sigma E,Sigma H,Noise N,Noise E,Noise H,Tropo Sigma,Tropo Noise, NMEA Port,Signal Priorities").split(","));
187 _staTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
188 _staTable->setSelectionBehavior(QAbstractItemView::SelectRows);
189 _staTable->setColumnWidth(0,120);
190 _staTable->setColumnWidth(10,220);
191#if QT_VERSION >= 0x050000
192 _staTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
193#endif
194 _staTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
195 connect(_addStaButton, SIGNAL(clicked()), this, SLOT(slotAddStation()));
196 connect(_delStaButton, SIGNAL(clicked()), this, SLOT(slotDelStation()));
197
198 _mapWinButton->setText("Open Map");
199
200 _mapWinDotColor->setEditable(false);
201 _mapWinDotColor->addItems(QString("red,yellow").split(","));
202
203 _mapSpeedSlider->setOrientation(Qt::Horizontal);
204 _mapSpeedSlider->setRange(1, 100);
205 _mapSpeedSlider->setTickPosition(QSlider::TicksBelow);
206 _mapSpeedSlider->setTickInterval(10);
207 connect(_mapSpeedSlider, SIGNAL(valueChanged(int)), BNC_CORE, SIGNAL(mapSpeedSliderChanged(int)));
208
209 // WhatsThis, PPP (2)
210 // ------------------
211 _corrWaitTime->setWhatsThis(tr("<p>Zero value means that BNC processes each epoch of data immediately after its arrival using satellite clock corrections available at that time.</p><p> Specifying a non-zero value (i.e. 5 sec) means that the epochs of data are buffered and the processing of each epoch is postponed till the satellite clock corrections not older than '5 sec' (example) become available. <i>[key: PPP/corrWaitTime]</i><p>"));
212 _seedingTime->setWhatsThis(tr("<p>Enter the length of a startup period in seconds for which you want to fix the PPP solutions to known a priori coordinates as introduced through option 'Coordinates file'. Adjust 'Sigma N/E/H' in the PPP Stations table according to the coordinate's precision. Fixing a priori coordinates is done in BNC through setting 'Noise N/E/H' temporarily to zero.</p><p>This option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the a priori known position throughout the startup period.</p><p>A value of 60 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning that you don't want BNC to fix PPP solutions during startup to an a priori coordinate. <i>[key: PPP/seedingTime]</i></p>"));
213
214 // WhatsThis, PPP (3)
215 // ------------------
216 _staTable->setWhatsThis(tr("<p>Specify values for Sigma and white Noise of the Stations North, East and Height coordinate components in meters. Specify also a Sigma in meters for a priori model based Tropospheric delays and a Sigma in meters per second for the delay's Noise. You can also specify a 'NMEA Port' to output coordinates in NMEA format through an IP port of your local host. Specify a list of signal priorities for the observations that shall be used for PPP.</p><p>Specifying one record per Station is mandatory. BNC will only process data for stations which are listed here. To define a station, specify the 'Mountpoint' when in 'Real-Time Streams' mode or the 9-character station ID when in 'RINEX Files' mode.</p><p>'Sigma' is meant to describe the uncertainty of a single coordinate or tropospheric delay estimated for one epoch. 'Noise' is meant to describe the variation of estimates from epoch to epoch.</p><p><ul><li>A Sigma of 100.0 meters may be an appropriate choice e.g. for the initial N/E/H coordinates. However, this value may be significantly smaller (i.e. 0.01) for stations with well-known a priori coordinates.</li><li>A Noise of 100.0 meters for the estimated N/E/H coordinates may also be appropriate considering the potential movement of a rover position.</li><li>A value of 0.1 meters may be an appropriate Sigma for the a priori model based Tropospheric delay estimation.</li><li>Specify a Noise to describe the expected variation of the tropospheric effect over time. Supposing 1Hz observation data, specifying a value of 3e-6 would mean that the tropospheric effect may vary 3600 * 3e-6 = 0.01 meters per hour.</li></ul></p><p>'Signal Priorities' can be specified as equal for all systems, as system specific or as system and frequency specific. Default for all PPP models is the following list of 'Signal Priorities': <ul><li>'G:12&CWPSLX R:12&CP E:1&CBX E:5&QIX C:26&IQX'</li></ul><p>But it is recommended to specify it in more detail per individual station, e.g.:</p> <ul> <li>'G:12&W R:12&P E:1&C E:5&Q C:26&I'</li> </ul> <p> <i>[key: PPP/staTable]</i></p>"));
217
218 // WhatsThis, PPP (4)
219 // ------------------
220 _plotCoordinates->setWhatsThis(tr("<p>For one of your PPP Stations BNC can produce a time series plot of coordinate displacements in the 'PPP Plot' tab below. Specify a 'Mountpoint' (when in 'Real-Time Streams' mode) or the 9/4-character station ID (when in 'RINEX Files' mode) to define the station whose coordinate displacements you would like to see plotted.</p><p>Note that this option makes only sense for a stationary receiver with known a priori marker coordinates as specified through PPP option 'Coordinates file'.</p><p>Default is an empty option field, meaning that BNC shall not produce a time series plot of PPP coordinate displacements. <i>[key: PPP/plotCoordinates]</i></p>"));
221 _audioResponse->setWhatsThis(tr("<p>Specify an 'Audio response' threshold in meters. A beep is produced by BNC whenever a horizontal PPP coordinate component differs by more than the threshold value from the a priori marker coordinate.</p><p>Default is an empty option field, meaning that you don't want BNC to produce alarm signals. <i>[key: PPP/audioResponse]</i></p>"));
222 _mapWinButton->setWhatsThis(tr("<p>You may like to track your rover position using Open Street Map as a background map. A 'Track map' can be produced with BNC in 'Real-Time Streams' or 'RINEX files' PPP mode.</p><p>The 'Open Map' button opens a windows showing a map according to specified options.</p><p>Even in 'RINEX files' post processing mode you should not forget to specify a proxy under the 'Network' tab if that is operated in front of BNC because the program needs to download the map data. Without any entry, BNC will try to use the system proxies.</p>"));
223 _mapWinDotSize->setWhatsThis(tr("<p>Specify the size of dots showing rover positions on the track map.</p><p>A dot size of '3' may be appropriate. The maximum possible dot size is '10'. An empty option field or a size of '0' would mean that you don't want BNC to show the rover's track on the map. <i>[key: PPP/mapWinDotSize]</i></p>"));
224 _mapWinDotColor->setWhatsThis(tr("<p>Specify the color of dots showing the rover track on the map. <i>[key: PPP/mapWinDotColor]</i></p>"));
225 _mapSpeedSlider->setWhatsThis(tr("<p>With BNC in 'RINEX files' PPP post processing mode you can specify the speed of computations as appropriate for 'Track map' visualization.</p><p>Note that you can adjust 'Post-processing speed' on-the-fly while BNC is already processing your observations. <i>[key: PPP/mapSpeedSlider]</i></p>"));
226
227 readOptions();
228}
229
230//
231////////////////////////////////////////////////////////////////////////////
232t_pppWidgets::~t_pppWidgets() {
233 delete _dataSource;
234 delete _rinexObs;
235 delete _rinexNav;
236 delete _corrMount;
237 delete _ionoMount;
238 delete _corrFile;
239 delete _ionoFile;
240 delete _crdFile;
241 delete _antexFile;
242 delete _blqFile;
243 delete _logPath;
244 delete _nmeaPath;
245 delete _snxtroPath;
246 delete _snxtroSampl;
247 delete _snxtroIntr;
248 delete _snxtroAc;
249 delete _snxtroSol;
250 for (int iRow = _staTable->rowCount()-1; iRow >=0; iRow--) {
251 _staTable->removeRow(iRow);
252 }
253 delete _staTable;
254 delete _lcGPS;
255 delete _lcGLONASS;
256 delete _lcGalileo;
257 delete _lcBDS;
258 delete _modelObs;
259 delete _pseudoObs;
260 delete _sigmaC1;
261 delete _sigmaL1;
262 delete _sigmaGIM;
263 delete _maxResC1;
264 delete _maxResL1;
265 delete _maxResGIM;
266 delete _minObs;
267 delete _minEle;
268 delete _eleWgtCode;
269 delete _eleWgtPhase;
270 delete _seedingTime;
271 delete _corrWaitTime;
272 delete _addStaButton;
273 delete _delStaButton;
274 delete _plotCoordinates;
275 delete _mapWinButton;
276 delete _audioResponse;
277 delete _mapWinDotSize;
278 delete _mapWinDotColor;
279 delete _mapSpeedSlider;
280}
281
282//
283////////////////////////////////////////////////////////////////////////////
284void t_pppWidgets::readOptions() {
285
286 bncSettings settings;
287
288 // ComboBoxes
289 // ----------
290 int ii = _dataSource->findText(settings.value(_dataSource->objectName()).toString());
291 if (ii != -1) {
292 _dataSource->setCurrentIndex(ii);
293 }
294 ii = _lcGPS->findText(settings.value(_lcGPS->objectName()).toString());
295 if (ii != -1) {
296 _lcGPS->setCurrentIndex(ii);
297 }
298 ii = _lcGLONASS->findText(settings.value(_lcGLONASS->objectName()).toString());
299 if (ii != -1) {
300 _lcGLONASS->setCurrentIndex(ii);
301 }
302 ii = _lcGalileo->findText(settings.value(_lcGalileo->objectName()).toString());
303 if (ii != -1) {
304 _lcGalileo->setCurrentIndex(ii);
305 }
306 ii = _lcBDS->findText(settings.value(_lcBDS->objectName()).toString());
307 if (ii != -1) {
308 _lcBDS->setCurrentIndex(ii);
309 }
310 ii = _modelObs->findText(settings.value(_modelObs->objectName()).toString());
311 if (ii != -1) {
312 _modelObs->setCurrentIndex(ii);
313 }
314 ii = _pseudoObs->findText(settings.value(_pseudoObs->objectName()).toString());
315 if (ii != -1) {
316 _pseudoObs->setCurrentIndex(ii);
317 }
318 ii = _snxtroIntr->findText(settings.value(_snxtroIntr->objectName()).toString());
319 if (ii != -1) {
320 _snxtroIntr->setCurrentIndex(ii);
321 }
322
323 // FileChoosers
324 // ------------
325 _rinexObs ->setFileName(settings.value(_rinexObs ->objectName()).toString());
326 _rinexNav ->setFileName(settings.value(_rinexNav ->objectName()).toString());
327 _corrFile ->setFileName(settings.value(_corrFile ->objectName()).toString());
328 _ionoFile ->setFileName(settings.value(_ionoFile ->objectName()).toString());
329 _crdFile ->setFileName(settings.value(_crdFile ->objectName()).toString());
330 _antexFile->setFileName(settings.value(_antexFile->objectName()).toString());
331 _blqFile->setFileName(settings.value(_blqFile->objectName()).toString());
332
333 // LineEdits
334 // ---------
335 _corrMount ->setText(settings.value(_corrMount ->objectName()).toString());
336 _ionoMount ->setText(settings.value(_ionoMount ->objectName()).toString());
337 _logPath ->setText(settings.value(_logPath ->objectName()).toString());
338 _nmeaPath ->setText(settings.value(_nmeaPath ->objectName()).toString());
339 _snxtroPath ->setText(settings.value(_snxtroPath ->objectName()).toString());
340 _snxtroAc ->setText(settings.value(_snxtroAc ->objectName()).toString());
341 _snxtroSol ->setText(settings.value(_snxtroSol ->objectName()).toString());
342
343 if (!settings.value(_sigmaC1->objectName()).toString().isEmpty()) {
344 _sigmaC1->setText(settings.value(_sigmaC1->objectName()).toString());
345 }
346 else {
347 _sigmaC1->setText("2.0");
348 }
349
350 if (!settings.value(_sigmaL1->objectName()).toString().isEmpty()) {
351 _sigmaL1->setText(settings.value(_sigmaL1->objectName()).toString());
352 }
353 else {
354 _sigmaL1->setText("0.02");
355 }
356
357 if (!settings.value(_sigmaGIM->objectName()).toString().isEmpty()) {
358 _sigmaGIM->setText(settings.value(_sigmaGIM->objectName()).toString());
359 }
360 else {
361 _sigmaGIM->setText("5.0");
362 }
363
364 if (!settings.value(_maxResC1->objectName()).toString().isEmpty()) {
365 _maxResC1->setText(settings.value(_maxResC1->objectName()).toString());
366 }
367 else {
368 _maxResC1->setText("3.0");
369 }
370
371 if (!settings.value(_maxResL1->objectName()).toString().isEmpty()) {
372 _maxResL1->setText(settings.value(_maxResL1->objectName()).toString());
373 }
374 else {
375 _maxResL1->setText("0.03");
376 }
377
378 if (!settings.value(_maxResGIM->objectName()).toString().isEmpty()) {
379 _maxResGIM->setText(settings.value(_maxResGIM->objectName()).toString());
380 }
381 else {
382 _maxResGIM->setText("3.0");
383 }
384
385
386 if (!settings.value(_seedingTime->objectName()).toString().isEmpty()) {
387 _seedingTime->setText(settings.value(_seedingTime->objectName()).toString());
388 }
389 else {
390 _seedingTime->setText("0");
391 }
392
393 // CheckBoxes
394 // ----------
395 _eleWgtCode ->setCheckState(Qt::CheckState(settings.value(_eleWgtCode ->objectName()).toInt()));
396 _eleWgtPhase->setCheckState(Qt::CheckState(settings.value(_eleWgtPhase->objectName()).toInt()));
397
398 // SpinBoxex
399 // ---------
400 _minObs->setValue(settings.value(_minObs->objectName()).toInt());
401 _minEle->setValue(settings.value(_minEle->objectName()).toInt());
402 _corrWaitTime->setValue(settings.value(_corrWaitTime->objectName()).toInt());
403
404
405 ii = _snxtroSampl->findText(settings.value(_snxtroSampl->objectName()).toString());
406 if (ii != -1) {
407 _snxtroSampl->setCurrentIndex(ii);
408 }
409
410 // Table with stations
411 // -------------------
412 for (int iRow = _staTable->rowCount()-1; iRow >=0; iRow--) {
413 _staTable->removeRow(iRow);
414 }
415 int iRow = -1;
416 QListIterator<QString> it(settings.value(_staTable->objectName()).toStringList());
417 while (it.hasNext()) {
418 QStringList hlp = it.next().split(",");
419 ++iRow;
420 _staTable->insertRow(iRow);
421 for (int iCol = 0; iCol < hlp.size(); iCol++) {
422 _staTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
423 }
424 }
425
426 // Plots and Maps
427 // --------------
428 _plotCoordinates ->setText(settings.value(_plotCoordinates->objectName()).toString());
429 _audioResponse ->setText(settings.value(_audioResponse->objectName()).toString());
430 _mapWinDotSize ->setText(settings.value(_mapWinDotSize->objectName()).toString());
431
432 ii = _mapWinDotColor->findText(settings.value(_mapWinDotColor->objectName()).toString());
433 if (ii != -1) {
434 _mapWinDotColor->setCurrentIndex(ii);
435 }
436
437 int speed = settings.value(_mapSpeedSlider->objectName()).toInt();
438 if (speed == 0) speed = _mapSpeedSlider->maximum();
439 _mapSpeedSlider->setSliderPosition(speed);
440}
441
442//
443////////////////////////////////////////////////////////////////////////////
444void t_pppWidgets::saveOptions() {
445
446 bncSettings settings;
447
448 settings.setValue(_dataSource ->objectName(), _dataSource ->currentText());
449 settings.setValue(_rinexObs ->objectName(), _rinexObs ->fileName());
450 settings.setValue(_rinexNav ->objectName(), _rinexNav ->fileName());
451 settings.setValue(_corrMount ->objectName(), _corrMount ->text());
452 settings.setValue(_ionoMount ->objectName(), _ionoMount ->text());
453 settings.setValue(_corrFile ->objectName(), _corrFile ->fileName());
454 settings.setValue(_ionoFile ->objectName(), _ionoFile ->fileName());
455 settings.setValue(_crdFile ->objectName(), _crdFile ->fileName());
456 settings.setValue(_antexFile ->objectName(), _antexFile ->fileName());
457 settings.setValue(_blqFile ->objectName(), _blqFile ->fileName());
458 settings.setValue(_logPath ->objectName(), _logPath ->text());
459 settings.setValue(_nmeaPath ->objectName(), _nmeaPath ->text());
460 settings.setValue(_snxtroPath ->objectName(), _snxtroPath ->text());
461 settings.setValue(_snxtroSampl ->objectName(), _snxtroSampl ->currentText());
462 settings.setValue(_snxtroIntr ->objectName(), _snxtroIntr ->currentText());
463 settings.setValue(_snxtroAc ->objectName(), _snxtroAc ->text());
464 settings.setValue(_snxtroSol ->objectName(), _snxtroSol ->text());
465 settings.setValue(_lcGPS ->objectName(), _lcGPS ->currentText());
466 settings.setValue(_lcGLONASS ->objectName(), _lcGLONASS ->currentText());
467 settings.setValue(_lcGalileo ->objectName(), _lcGalileo ->currentText());
468 settings.setValue(_lcBDS ->objectName(), _lcBDS ->currentText());
469 settings.setValue(_modelObs ->objectName(), _modelObs ->currentText());
470 settings.setValue(_pseudoObs ->objectName(), _pseudoObs ->currentText());
471 settings.setValue(_sigmaC1 ->objectName(), _sigmaC1 ->text());
472 settings.setValue(_sigmaL1 ->objectName(), _sigmaL1 ->text());
473 settings.setValue(_sigmaGIM ->objectName(), _sigmaGIM ->text());
474 settings.setValue(_corrWaitTime->objectName(), _corrWaitTime->value());
475 settings.setValue(_maxResC1 ->objectName(), _maxResC1 ->text());
476 settings.setValue(_maxResL1 ->objectName(), _maxResL1 ->text());
477 settings.setValue(_maxResGIM ->objectName(), _maxResGIM ->text());
478 settings.setValue(_seedingTime ->objectName(), _seedingTime ->text());
479 settings.setValue(_minObs ->objectName(), _minObs ->value());
480 settings.setValue(_minEle ->objectName(), _minEle ->value());
481 settings.setValue(_eleWgtCode ->objectName(), _eleWgtCode ->checkState());
482 settings.setValue(_eleWgtPhase ->objectName(), _eleWgtPhase ->checkState());
483
484 QStringList staList;
485 for (int iRow = 0; iRow < _staTable->rowCount(); iRow++) {
486 QString hlp;
487 for (int iCol = 0; iCol < _staTable->columnCount(); iCol++) {
488 if (_staTable->item(iRow, iCol)) {
489 hlp += _staTable->item(iRow, iCol)->text() + ",";
490 }
491 }
492 if (!hlp.isEmpty()) {
493 staList << hlp;
494 }
495 }
496 settings.setValue(_staTable->objectName(), staList);
497
498 settings.setValue(_plotCoordinates ->objectName(), _plotCoordinates ->text());
499 settings.setValue(_audioResponse ->objectName(), _audioResponse ->text());
500 settings.setValue(_mapWinDotSize ->objectName(), _mapWinDotSize ->text());
501 settings.setValue(_mapWinDotColor ->objectName(), _mapWinDotColor ->currentText());
502 settings.setValue(_mapSpeedSlider ->objectName(), _mapSpeedSlider ->value());
503}
504
505//
506////////////////////////////////////////////////////////////////////////////
507void t_pppWidgets::slotEnableWidgets() {
508
509 const static QPalette paletteWhite(QColor(255, 255, 255));
510 const static QPalette paletteGray(QColor(230, 230, 230));
511
512 bool allDisabled = _dataSource->currentText() == "";
513 bool realTime = _dataSource->currentText() == "Real-Time Streams";
514 bool rinexFiles = _dataSource->currentText() == "RINEX Files";
515 bool enablePseudoObs;
516 if (_modelObs->currentText() == "PPP-RTK" ||
517 _modelObs->currentText() == "Ionosphere-free PPP") {
518 enablePseudoObs = false;
519 }
520 else {
521 enablePseudoObs = true;
522 }
523 bool pseudoObsUsed = _pseudoObs->currentText() == "Ionosphere";
524
525 QListIterator<QWidget*> it(_widgets);
526 while (it.hasNext()) {
527 QWidget* widget = it.next();
528 widget->setEnabled(!allDisabled);
529 }
530
531 if (realTime) {
532 _rinexObs->setEnabled(false);
533 _rinexNav->setEnabled(false);
534 _corrFile->setEnabled(false);
535 _ionoFile->setEnabled(false);
536 }
537 else if (rinexFiles) {
538 _corrMount ->setEnabled(false);
539 _ionoMount ->setEnabled(false);
540 _audioResponse->setEnabled(false);
541 }
542
543 if ( _snxtroPath->text() != "" && !allDisabled) {
544 _snxtroSampl->setEnabled(true);
545 _snxtroIntr ->setEnabled(true);
546 _snxtroAc ->setEnabled(true);
547 _snxtroSol ->setEnabled(true);
548 }
549 else {
550 _snxtroSampl->setEnabled(false);
551 _snxtroIntr ->setEnabled(false);
552 _snxtroAc ->setEnabled(false);
553 _snxtroSol ->setEnabled(false);
554 }
555
556 if (enablePseudoObs) {
557 _pseudoObs->setEnabled(true);
558 if (pseudoObsUsed) {
559 _sigmaGIM->setEnabled(true);
560 _maxResGIM->setEnabled(true);
561 } else {
562 _sigmaGIM->setEnabled(false);
563 _maxResGIM->setEnabled(false);
564 }
565 } else {
566 _pseudoObs->setEnabled(false);
567 _sigmaGIM->setEnabled(false);
568 _maxResGIM->setEnabled(false);
569 }
570
571 _dataSource->setEnabled(true);
572
573 it.toFront();
574 while (it.hasNext()) {
575 QWidget* widget = it.next();
576 if (widget->isEnabled()) {
577 widget->setPalette(paletteWhite);
578 }
579 else {
580 widget->setPalette(paletteGray);
581 }
582 }
583}
584
585//
586////////////////////////////////////////////////////////////////////////////
587void t_pppWidgets::slotAddStation() {
588 int iRow = _staTable->rowCount();
589 _staTable->insertRow(iRow);
590 QString preferredAttributes = "G:12&CWPSLX R:12&CP E:1&CBX E:5&QIX C:26&IQX";
591
592 for (int iCol = 0; iCol < _staTable->columnCount(); iCol++) {
593 if (iCol == 0) _staTable->setItem(iRow, iCol, new QTableWidgetItem(""));
594 if (iCol == 1) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
595 if (iCol == 2) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
596 if (iCol == 3) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
597 if (iCol == 4) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
598 if (iCol == 5) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
599 if (iCol == 6) _staTable->setItem(iRow, iCol, new QTableWidgetItem("100.0"));
600 if (iCol == 7) _staTable->setItem(iRow, iCol, new QTableWidgetItem("0.1"));
601 if (iCol == 8) _staTable->setItem(iRow, iCol, new QTableWidgetItem("3e-6"));
602 if (iCol == 9) _staTable->setItem(iRow, iCol, new QTableWidgetItem("0"));
603 if (iCol == 10) _staTable->setItem(iRow, iCol, new QTableWidgetItem(preferredAttributes));
604 }
605}
606
607//
608////////////////////////////////////////////////////////////////////////////
609void t_pppWidgets::slotDelStation() {
610 int nRows = _staTable->rowCount();
611 std::vector <bool> flg(nRows);
612 for (int iRow = 0; iRow < nRows; iRow++) {
613 if (_staTable->item(iRow,1)->isSelected()) {
614 flg[iRow] = true;
615 }
616 else {
617 flg[iRow] = false;
618 }
619 }
620 for (int iRow = nRows-1; iRow >= 0; iRow--) {
621 if (flg[iRow]) {
622 _staTable->removeRow(iRow);
623 }
624 }
625}
626
627// PPP Text
628////////////////////////////////////////////////////////////////////////////
629void t_pppWidgets::slotPPPTextChanged(){
630
631 const static QPalette paletteWhite(QColor(255, 255, 255));
632 const static QPalette paletteGray(QColor(230, 230, 230));
633
634 // SNX TRO file sampling
635 // ---------------------
636 if (sender() == 0 || sender() == _snxtroPath) {
637 if ( _snxtroPath->text() != "" ) {
638 _snxtroSampl->setEnabled(true);
639 _snxtroIntr ->setEnabled(true);
640 _snxtroAc ->setEnabled(true);
641 _snxtroSol ->setEnabled(true);
642 _snxtroSampl->setPalette(paletteWhite);
643 _snxtroIntr ->setPalette(paletteWhite);
644 _snxtroAc ->setPalette(paletteWhite);
645 _snxtroSol ->setPalette(paletteWhite);
646 }
647 else {
648 _snxtroSampl->setEnabled(false);
649 _snxtroIntr ->setEnabled(false);
650 _snxtroAc ->setEnabled(false);
651 _snxtroSol ->setEnabled(false);
652 _snxtroSampl->setPalette(paletteGray);
653 _snxtroIntr ->setPalette(paletteGray);
654 _snxtroAc ->setPalette(paletteGray);
655 _snxtroSol ->setPalette(paletteGray);
656 }
657 }
658
659
660}
Note: See TracBrowser for help on using the repository browser.