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

Last change on this file since 6655 was 6653, checked in by stuerze, 10 years ago

sinex tro file support added,
troposphere results in overall ppp logfile added

File size: 17.7 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 "pppWidgets.h"
44#include "qtfilechooser.h"
45#include "bncsettings.h"
46#include "bnccore.h"
47
48using namespace std;
49
50// Constructor
51////////////////////////////////////////////////////////////////////////////
52t_pppWidgets::t_pppWidgets() {
53
54 _dataSource = new QComboBox(); _dataSource ->setObjectName("PPP/dataSource"); _widgets << _dataSource;
55 _rinexObs = new qtFileChooser(); _rinexObs ->setObjectName("PPP/rinexObs"); _widgets << _rinexObs;
56 _rinexNav = new qtFileChooser(); _rinexNav ->setObjectName("PPP/rinexNav"); _widgets << _rinexNav;
57 _corrMount = new QLineEdit(); _corrMount ->setObjectName("PPP/corrMount"); _widgets << _corrMount;
58 _corrFile = new qtFileChooser(); _corrFile ->setObjectName("PPP/corrFile"); _widgets << _corrFile;
59 _crdFile = new qtFileChooser(); _crdFile ->setObjectName("PPP/crdFile"); _widgets << _crdFile;
60 _antexFile = new qtFileChooser(); _antexFile ->setObjectName("PPP/antexFile"); _widgets << _antexFile;
61 _logFile = new QLineEdit(); _logFile ->setObjectName("PPP/logFile"); _widgets << _logFile;
62 _nmeaFile = new QLineEdit(); _nmeaFile ->setObjectName("PPP/nmeaFile"); _widgets << _nmeaFile;
63 _nmeaPort = new QLineEdit(); _nmeaPort ->setObjectName("PPP/nmeaPort"); _widgets << _nmeaPort;
64 _snxtroFile = new QLineEdit(); _snxtroFile ->setObjectName("PPP/snxtroFile"); _widgets << _snxtroFile;
65 _snxtroSampl = new QSpinBox(); _snxtroSampl ->setObjectName("PPP/snxtroSampl"); _widgets << _snxtroSampl;
66 _staTable = new QTableWidget(); _staTable ->setObjectName("PPP/staTable"); _widgets << _staTable;
67 _lcGPS = new QComboBox(); _lcGPS ->setObjectName("PPP/lcGPS"); _widgets << _lcGPS;
68 _lcGLONASS = new QComboBox(); _lcGLONASS ->setObjectName("PPP/lcGLONASS"); _widgets << _lcGLONASS;
69 _lcGalileo = new QComboBox(); _lcGalileo ->setObjectName("PPP/lcGalileo"); _widgets << _lcGalileo;
70 _sigmaC1 = new QLineEdit(); _sigmaC1 ->setObjectName("PPP/sigmaC1"); _widgets << _sigmaC1;
71 _sigmaL1 = new QLineEdit(); _sigmaL1 ->setObjectName("PPP/sigmaL1"); _widgets << _sigmaL1;
72 _maxResC1 = new QLineEdit(); _maxResC1 ->setObjectName("PPP/maxResC1"); _widgets << _maxResC1;
73 _maxResL1 = new QLineEdit(); _maxResL1 ->setObjectName("PPP/maxResL1"); _widgets << _maxResL1;
74 _minObs = new QSpinBox(); _minObs ->setObjectName("PPP/minObs"); _widgets << _minObs;
75 _minEle = new QSpinBox(); _minEle ->setObjectName("PPP/minEle"); _widgets << _minEle;
76 _eleWgtCode = new QCheckBox(); _eleWgtCode ->setObjectName("PPP/eleWgtCode"); _widgets << _eleWgtCode;
77 _eleWgtPhase = new QCheckBox(); _eleWgtPhase ->setObjectName("PPP/eleWgtPhase"); _widgets << _eleWgtPhase;
78 _seedingTime = new QLineEdit(); _seedingTime ->setObjectName("PPP/seedingTime"); _widgets << _seedingTime;
79 _corrWaitTime = new QSpinBox(); _corrWaitTime->setObjectName("PPP/corrWaitTime"); _widgets << _corrWaitTime;
80
81 _addStaButton = new QPushButton("Add Station"); _widgets << _addStaButton;
82 _delStaButton = new QPushButton("Delete Station"); _widgets << _delStaButton;
83
84 _plotCoordinates = new QLineEdit; _plotCoordinates ->setObjectName("PPP/plotCoordinates"); _widgets << _plotCoordinates;
85 _mapWinButton = new QPushButton; _mapWinButton ->setObjectName("PPP/mapWinButton"); _widgets << _mapWinButton;
86 _useGoogleMap = new QRadioButton; _useGoogleMap ->setObjectName("PPP/useGoogleMap"); _widgets << _useGoogleMap;
87 _useOpenStreetMap = new QRadioButton; _useOpenStreetMap->setObjectName("PPP/useOpenStreetMap"); _widgets << _useOpenStreetMap;
88 _mapWinDotSize = new QLineEdit; _mapWinDotSize ->setObjectName("PPP/mapWinDotSize"); _widgets << _mapWinDotSize;
89 _mapWinDotColor = new QComboBox; _mapWinDotColor ->setObjectName("PPP/mapWinDotColor"); _widgets << _mapWinDotColor;
90 _mapSpeedSlider = new QSlider; _mapSpeedSlider ->setObjectName("PPP/mapSpeedSlider"); _widgets << _mapSpeedSlider;
91
92 _dataSource->setEditable(false);
93 _dataSource->addItems(QString("no,Real-Time Streams,RINEX Files").split(","));
94 connect(_dataSource, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotEnableWidgets()));
95
96 _lcGPS->setEditable(false);
97 _lcGPS->addItems(QString("no,P3,L3,P3&L3").split(","));
98
99 _lcGLONASS->setEditable(false);
100 _lcGLONASS->addItems(QString("no,P3,L3,P3&L3").split(","));
101
102 _lcGalileo->setEditable(false);
103 _lcGalileo->addItems(QString("no,P3,L3,P3&L3").split(","));
104
105 _snxtroSampl->setMinimum(0);
106 _snxtroSampl->setMaximum(300);
107 _snxtroSampl->setSingleStep(30);
108 _snxtroSampl->setSuffix(" sec");
109
110 _minObs->setMinimum(4);
111 _minObs->setMaximum(6);
112 _minObs->setSingleStep(1);
113
114 _minEle->setMinimum(0);
115 _minEle->setMaximum(20);
116 _minEle->setSingleStep(1);
117 _minEle->setSuffix(" deg");
118
119 _corrWaitTime->setMinimum(0);
120 _corrWaitTime->setMaximum(20);
121 _corrWaitTime->setSingleStep(1);
122 _corrWaitTime->setSuffix(" sec");
123 _corrWaitTime->setSpecialValueText("no");
124
125 _staTable->setColumnCount(9);
126 _staTable->setRowCount(0);
127 _staTable->setHorizontalHeaderLabels(
128 QString("Station,Sigma N,Sigma E,Sigma H,Noise N,Noise E,Noise H,Tropo Sigma,Tropo Noise").split(","));
129 _staTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
130 _staTable->setSelectionBehavior(QAbstractItemView::SelectRows);
131 _staTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
132 _staTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
133
134 connect(_addStaButton, SIGNAL(clicked()), this, SLOT(slotAddStation()));
135 connect(_delStaButton, SIGNAL(clicked()), this, SLOT(slotDelStation()));
136
137 _mapWinButton->setText("Open Map");
138
139 _mapWinDotColor->setEditable(false);
140 _mapWinDotColor->addItems(QString("red,yellow").split(","));
141
142 _mapSpeedSlider->setOrientation(Qt::Horizontal);
143 _mapSpeedSlider->setRange(1, 100);
144 _mapSpeedSlider->setTickPosition(QSlider::TicksBelow);
145 _mapSpeedSlider->setTickInterval(10);
146 connect(_mapSpeedSlider, SIGNAL(valueChanged(int)), BNC_CORE, SIGNAL(mapSpeedSliderChanged(int)));
147
148 _plotCoordinates->setWhatsThis(tr("<p>BNC allows to produce a time series plot of coordinates for one Real-time PPP solution in the 'PPP Plot' section below. Specify the 'Mountpoint' of the stream whose coordinate displacements you would like to see plotted.</p><p>Default is an empty option field, meaning that BNC shall not produce a time series plot of PPP coordinate displacements.</p>"));
149 _mapWinButton->setWhatsThis(tr("<p>You make like to track your rover position using Google Maps or Open Street Map as a background map. Track maps can be produced with BNC in 'Realtime-PPP', 'Realtime-SPP' and 'Post-Processing' mode.</p><p>The 'Open Map' button opens a windows showing a map according to specified options.</p><p>Even in 'Post-Processing' mode you should not forget to specify a proxy under the 'Network' tab if that is operated in front of BNC."));
150 _useGoogleMap->setWhatsThis(tr("<p>Specify Google Maps as the background for your rover positions."));
151 _useOpenStreetMap->setWhatsThis(tr("<p>Specify Open Street Map as the background for your rover positions."));
152 _mapWinDotSize->setWhatsThis(tr("<p>Specify the size of dots showing the 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.</p>"));
153 _mapWinDotColor->setWhatsThis(tr("<p>Specify the color of dots showing the rover track on the map.</p>"));
154 _mapSpeedSlider->setWhatsThis(tr("<p>With BNC in PPP post-processing mode you can specify the speed of computations as appropriate for 'Track map' visualization. Note that you can adjust 'speed' on-the-fly while BNC is already processing your observations."));
155
156 readOptions();
157}
158
159//
160////////////////////////////////////////////////////////////////////////////
161void t_pppWidgets::readOptions() {
162
163 bncSettings settings;
164
165 // ComboBoxes
166 // ----------
167 int ii = _dataSource->findText(settings.value(_dataSource->objectName()).toString());
168 if (ii != -1) {
169 _dataSource->setCurrentIndex(ii);
170 }
171 ii = _lcGPS->findText(settings.value(_lcGPS->objectName()).toString());
172 if (ii != -1) {
173 _lcGPS->setCurrentIndex(ii);
174 }
175 ii = _lcGLONASS->findText(settings.value(_lcGLONASS->objectName()).toString());
176 if (ii != -1) {
177 _lcGLONASS->setCurrentIndex(ii);
178 }
179 ii = _lcGalileo->findText(settings.value(_lcGalileo->objectName()).toString());
180 if (ii != -1) {
181 _lcGalileo->setCurrentIndex(ii);
182 }
183
184 // FileChoosers
185 // ------------
186 _rinexObs ->setFileName(settings.value(_rinexObs ->objectName()).toString());
187 _rinexNav ->setFileName(settings.value(_rinexNav ->objectName()).toString());
188 _corrFile ->setFileName(settings.value(_corrFile ->objectName()).toString());
189 _crdFile ->setFileName(settings.value(_crdFile ->objectName()).toString());
190 _antexFile->setFileName(settings.value(_antexFile->objectName()).toString());
191
192 // LineEdits
193 // ---------
194 _corrMount ->setText(settings.value(_corrMount ->objectName()).toString());
195 _logFile ->setText(settings.value(_logFile ->objectName()).toString());
196 _nmeaFile ->setText(settings.value(_nmeaFile ->objectName()).toString());
197 _nmeaPort ->setText(settings.value(_nmeaPort ->objectName()).toString());
198 _snxtroFile ->setText(settings.value(_snxtroFile ->objectName()).toString());
199 _sigmaC1 ->setText(settings.value(_sigmaC1 ->objectName()).toString());
200 _sigmaL1 ->setText(settings.value(_sigmaL1 ->objectName()).toString());
201 _maxResC1 ->setText(settings.value(_maxResC1 ->objectName()).toString());
202 _maxResL1 ->setText(settings.value(_maxResL1 ->objectName()).toString());
203 _seedingTime->setText(settings.value(_seedingTime->objectName()).toString());
204
205 // CheckBoxes
206 // ----------
207 _eleWgtCode ->setCheckState(Qt::CheckState(settings.value(_eleWgtCode ->objectName()).toInt()));
208 _eleWgtPhase->setCheckState(Qt::CheckState(settings.value(_eleWgtPhase->objectName()).toInt()));
209
210 // SpinBoxex
211 // ---------
212 _minObs->setValue(settings.value(_minObs->objectName()).toInt());
213 _minEle->setValue(settings.value(_minEle->objectName()).toInt());
214 _corrWaitTime->setValue(settings.value(_corrWaitTime->objectName()).toInt());
215 _snxtroSampl->setValue(settings.value(_snxtroSampl->objectName()).toInt());
216
217 // Table with stations
218 // -------------------
219 for (int iRow = _staTable->rowCount()-1; iRow >=0; iRow--) {
220 _staTable->removeRow(iRow);
221 }
222 int iRow = -1;
223 QListIterator<QString> it(settings.value(_staTable->objectName()).toStringList());
224 while (it.hasNext()) {
225 QStringList hlp = it.next().split(",");
226 ++iRow;
227 _staTable->insertRow(iRow);
228 for (int iCol = 0; iCol < hlp.size(); iCol++) {
229 _staTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
230 }
231 }
232
233 // Plots and Maps
234 // --------------
235 _plotCoordinates ->setText(settings.value(_plotCoordinates->objectName()).toString());
236 _useGoogleMap ->setChecked(settings.value(_useGoogleMap->objectName()).toBool());
237 _useOpenStreetMap->setChecked(settings.value(_useOpenStreetMap->objectName()).toBool());
238 _mapWinDotSize ->setText(settings.value(_mapWinDotSize->objectName()).toString());
239
240 ii = _mapWinDotColor->findText(settings.value(_mapWinDotColor->objectName()).toString());
241 if (ii != -1) {
242 _mapWinDotColor->setCurrentIndex(ii);
243 }
244
245 int speed = settings.value(_mapSpeedSlider->objectName()).toInt();
246 if (speed == 0) speed = _mapSpeedSlider->maximum();
247 _mapSpeedSlider->setSliderPosition(speed);
248}
249
250//
251////////////////////////////////////////////////////////////////////////////
252void t_pppWidgets::saveOptions() {
253
254 bncSettings settings;
255
256 settings.setValue(_dataSource ->objectName(), _dataSource ->currentText());
257 settings.setValue(_rinexObs ->objectName(), _rinexObs ->fileName());
258 settings.setValue(_rinexNav ->objectName(), _rinexNav ->fileName());
259 settings.setValue(_corrMount ->objectName(), _corrMount ->text());
260 settings.setValue(_corrFile ->objectName(), _corrFile ->fileName());
261 settings.setValue(_crdFile ->objectName(), _crdFile ->fileName());
262 settings.setValue(_antexFile ->objectName(), _antexFile ->fileName());
263 settings.setValue(_logFile ->objectName(), _logFile ->text());
264 settings.setValue(_nmeaFile ->objectName(), _nmeaFile ->text());
265 settings.setValue(_nmeaPort ->objectName(), _nmeaPort ->text());
266 settings.setValue(_snxtroFile ->objectName(), _snxtroFile ->text());
267 settings.setValue(_snxtroSampl ->objectName(), _snxtroSampl ->value());
268 settings.setValue(_lcGPS ->objectName(), _lcGPS ->currentText());
269 settings.setValue(_lcGLONASS ->objectName(), _lcGLONASS ->currentText());
270 settings.setValue(_lcGalileo ->objectName(), _lcGalileo ->currentText());
271 settings.setValue(_sigmaC1 ->objectName(), _sigmaC1 ->text());
272 settings.setValue(_sigmaL1 ->objectName(), _sigmaL1 ->text());
273 settings.setValue(_corrWaitTime->objectName(), _corrWaitTime->value());
274 settings.setValue(_maxResC1 ->objectName(), _maxResC1 ->text());
275 settings.setValue(_maxResL1 ->objectName(), _maxResL1 ->text());
276 settings.setValue(_seedingTime ->objectName(), _seedingTime ->text());
277 settings.setValue(_minObs ->objectName(), _minObs ->value());
278 settings.setValue(_minEle ->objectName(), _minEle ->value());
279 settings.setValue(_eleWgtCode ->objectName(), _eleWgtCode ->checkState());
280 settings.setValue(_eleWgtPhase ->objectName(), _eleWgtPhase ->checkState());
281
282 QStringList staList;
283 for (int iRow = 0; iRow < _staTable->rowCount(); iRow++) {
284 QString hlp;
285 for (int iCol = 0; iCol < _staTable->columnCount(); iCol++) {
286 if (_staTable->item(iRow, iCol)) {
287 hlp += _staTable->item(iRow, iCol)->text() + ",";
288 }
289 }
290 if (!hlp.isEmpty()) {
291 staList << hlp;
292 }
293 }
294 settings.setValue(_staTable->objectName(), staList);
295
296 settings.setValue(_plotCoordinates ->objectName(), _plotCoordinates ->text());
297 settings.setValue(_useGoogleMap ->objectName(), _useGoogleMap ->isChecked());
298 settings.setValue(_useOpenStreetMap->objectName(), _useOpenStreetMap->isChecked());
299 settings.setValue(_mapWinDotSize ->objectName(), _mapWinDotSize ->text());
300 settings.setValue(_mapWinDotColor ->objectName(), _mapWinDotColor ->currentText());
301 settings.setValue(_mapSpeedSlider ->objectName(), _mapSpeedSlider ->value());
302}
303
304//
305////////////////////////////////////////////////////////////////////////////
306void t_pppWidgets::slotEnableWidgets() {
307
308 const static QPalette paletteWhite(QColor(255, 255, 255));
309 const static QPalette paletteGray(QColor(230, 230, 230));
310
311 bool allDisabled = _dataSource->currentText() == "no";
312 bool realTime = _dataSource->currentText() == "Real-Time Streams";
313 bool rinexFiles = _dataSource->currentText() == "RINEX Files";
314
315 QListIterator<QWidget*> it(_widgets);
316 while (it.hasNext()) {
317 QWidget* widget = it.next();
318 widget->setEnabled(!allDisabled);
319 }
320
321 if (realTime) {
322 _rinexObs->setEnabled(false);
323 _rinexNav->setEnabled(false);
324 _corrFile->setEnabled(false);
325 }
326 else if (rinexFiles) {
327 _corrMount->setEnabled(false);
328 }
329
330 _dataSource->setEnabled(true);
331
332 it.toFront();
333 while (it.hasNext()) {
334 QWidget* widget = it.next();
335 if (widget->isEnabled()) {
336 widget->setPalette(paletteWhite);
337 }
338 else {
339 widget->setPalette(paletteGray);
340 }
341 }
342}
343
344//
345////////////////////////////////////////////////////////////////////////////
346void t_pppWidgets::slotAddStation() {
347 int iRow = _staTable->rowCount();
348 _staTable->insertRow(iRow);
349 for (int iCol = 0; iCol < _staTable->columnCount(); iCol++) {
350 _staTable->setItem(iRow, iCol, new QTableWidgetItem(""));
351 }
352}
353
354//
355////////////////////////////////////////////////////////////////////////////
356void t_pppWidgets::slotDelStation() {
357 int nRows = _staTable->rowCount();
358 bool flg[nRows];
359 for (int iRow = 0; iRow < nRows; iRow++) {
360 if (_staTable->isItemSelected(_staTable->item(iRow,1))) {
361 flg[iRow] = true;
362 }
363 else {
364 flg[iRow] = false;
365 }
366 }
367 for (int iRow = nRows-1; iRow >= 0; iRow--) {
368 if (flg[iRow]) {
369 _staTable->removeRow(iRow);
370 }
371 }
372}
373
Note: See TracBrowser for help on using the repository browser.