source: ntrip/trunk/BNC/bncwindow.cpp@ 3624

Last change on this file since 3624 was 3624, checked in by mervart, 12 years ago
File size: 113.1 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: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "bncpostprocess.h"
65
66using namespace std;
67
68// Constructor
69////////////////////////////////////////////////////////////////////////////
70bncWindow::bncWindow() {
71
72 _caster = 0;
73 _casterEph = 0;
74
75 _bncFigure = new bncFigure(this);
76 _bncFigureLate = new bncFigureLate(this);
77 _bncFigurePPP = new bncFigurePPP(this);
78
79 int ww = QFontMetrics(this->font()).width('w');
80
81 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
82
83 setMinimumSize(85*ww, 65*ww);
84
85 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
86
87 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
88 this, SLOT(slotWindowMessage(QByteArray,bool)));
89
90 // Create Actions
91 // --------------
92 _actHelp = new QAction(tr("&Help Contents"),this);
93 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
94
95 _actAbout = new QAction(tr("&About BNC"),this);
96 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
97
98 _actFlowchart = new QAction(tr("&Flow Chart"),this);
99 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
100
101 _actFontSel = new QAction(tr("Select &Font"),this);
102 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
103
104 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
105 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
106
107 _actQuit = new QAction(tr("&Quit"),this);
108 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
109
110 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
111 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
112
113 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
114 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
115 _actDeleteMountPoints->setEnabled(false);
116
117 _actGetData = new QAction(tr("Sta&rt"),this);
118 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
119
120 _actPostProcessing = new QAction(tr("Start PP"),this);
121 connect(_actPostProcessing, SIGNAL(triggered()), SLOT(slotPostProcessing()));
122
123 _postProgressBar = new QProgressBar;
124 _postProgressBar->hide();
125 _postProgressBar->setMinimum(0);
126 _postProgressBar->setMaximum(100);
127 _postProgressBar->setMinimumWidth(20*ww);
128 _postProgressBar->setMaximumWidth(20*ww);
129
130 _actStop = new QAction(tr("Sto&p"),this);
131 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
132 _actStop->setEnabled(false);
133
134 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
135 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
136
137 CreateMenu();
138 AddToolbar();
139
140 bncSettings settings;
141
142 // Netowrk Options
143 // ---------------
144 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
145 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
146
147 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
148 this, SLOT(slotBncTextChanged()));
149
150 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
151 _ignoreSslErrorsCheckBox = new QCheckBox();
152 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
153 settings.value("ignoreSslErrors").toInt()));
154
155 // General Options
156 // ---------------
157 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
158 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
159 _rnxAppendCheckBox = new QCheckBox();
160 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
161 settings.value("rnxAppend").toInt()));
162 _onTheFlyComboBox = new QComboBox();
163 _onTheFlyComboBox->setEditable(false);
164 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
165 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
166 if (ii != -1) {
167 _onTheFlyComboBox->setCurrentIndex(ii);
168 }
169 _autoStartCheckBox = new QCheckBox();
170 _autoStartCheckBox->setCheckState(Qt::CheckState(
171 settings.value("autoStart").toInt()));
172
173 // RINEX Observations Options
174 // --------------------------
175 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
176 _rnxIntrComboBox = new QComboBox();
177 _rnxIntrComboBox->setEditable(false);
178 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
179 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
180 if (ii != -1) {
181 _rnxIntrComboBox->setCurrentIndex(ii);
182 }
183 _rnxSamplSpinBox = new QSpinBox();
184 _rnxSamplSpinBox->setMinimum(0);
185 _rnxSamplSpinBox->setMaximum(60);
186 _rnxSamplSpinBox->setSingleStep(5);
187 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
188 _rnxSamplSpinBox->setSuffix(" sec");
189 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
190 _rnxSkelLineEdit->setMaximumWidth(5*ww);
191 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
192 _rnxV3CheckBox = new QCheckBox();
193 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
194
195 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
196 this, SLOT(slotBncTextChanged()));
197
198 // RINEX Ephemeris Options
199 // -----------------------
200 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
201 _ephIntrComboBox = new QComboBox();
202 _ephIntrComboBox->setEditable(false);
203 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
204 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
205 if (jj != -1) {
206 _ephIntrComboBox->setCurrentIndex(jj);
207 }
208 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
209 _ephV3CheckBox = new QCheckBox();
210 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
211
212 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
213 this, SLOT(slotBncTextChanged()));
214
215 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
216 this, SLOT(slotBncTextChanged()));
217
218 // Broadcast Corrections Options
219 // -----------------------------
220 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
221 _corrIntrComboBox = new QComboBox();
222 _corrIntrComboBox->setEditable(false);
223 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
224 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
225 if (mm != -1) {
226 _corrIntrComboBox->setCurrentIndex(mm);
227 }
228 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
229 _corrTimeSpinBox = new QSpinBox();
230 _corrTimeSpinBox->setMinimum(0);
231 _corrTimeSpinBox->setMaximum(60);
232 _corrTimeSpinBox->setSingleStep(1);
233 _corrTimeSpinBox->setSuffix(" sec");
234 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
235
236 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
237 this, SLOT(slotBncTextChanged()));
238
239 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
240 this, SLOT(slotBncTextChanged()));
241
242 // Feed Engine Options
243 // -------------------
244 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
245 _waitTimeSpinBox = new QSpinBox();
246 _waitTimeSpinBox->setMinimum(1);
247 _waitTimeSpinBox->setMaximum(30);
248 _waitTimeSpinBox->setSingleStep(1);
249 _waitTimeSpinBox->setSuffix(" sec");
250 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
251 _binSamplSpinBox = new QSpinBox();
252 _binSamplSpinBox->setMinimum(0);
253 _binSamplSpinBox->setMaximum(60);
254 _binSamplSpinBox->setSingleStep(5);
255 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
256 _binSamplSpinBox->setSuffix(" sec");
257 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
258 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
259
260 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
261 this, SLOT(slotBncTextChanged()));
262
263 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
264 this, SLOT(slotBncTextChanged()));
265
266 // Serial Output Options
267 // ---------------------
268 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
269 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
270 _serialBaudRateComboBox = new QComboBox();
271 _serialBaudRateComboBox->addItems(QString("110,300,600,"
272 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
273 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
274 if (kk != -1) {
275 _serialBaudRateComboBox->setCurrentIndex(kk);
276 }
277 _serialFlowControlComboBox = new QComboBox();
278 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
279 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
280 if (kk != -1) {
281 _serialFlowControlComboBox->setCurrentIndex(kk);
282 }
283 _serialDataBitsComboBox = new QComboBox();
284 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
285 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
286 if (kk != -1) {
287 _serialDataBitsComboBox->setCurrentIndex(kk);
288 }
289 _serialParityComboBox = new QComboBox();
290 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
291 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
292 if (kk != -1) {
293 _serialParityComboBox->setCurrentIndex(kk);
294 }
295 _serialStopBitsComboBox = new QComboBox();
296 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
297 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
298 if (kk != -1) {
299 _serialStopBitsComboBox->setCurrentIndex(kk);
300 }
301 _serialAutoNMEAComboBox = new QComboBox();
302 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
303 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
304 if (kk != -1) {
305 _serialAutoNMEAComboBox->setCurrentIndex(kk);
306 }
307 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
308 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
309
310 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
311 this, SLOT(slotBncTextChanged()));
312
313 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
314 this, SLOT(slotBncTextChanged()));
315
316 // Outages Options
317 // ---------------
318 _obsRateComboBox = new QComboBox();
319 _obsRateComboBox->setEditable(false);
320 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
321 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
322 if (kk != -1) {
323 _obsRateComboBox->setCurrentIndex(kk);
324 }
325 _adviseFailSpinBox = new QSpinBox();
326 _adviseFailSpinBox->setMinimum(0);
327 _adviseFailSpinBox->setMaximum(60);
328 _adviseFailSpinBox->setSingleStep(1);
329 _adviseFailSpinBox->setSuffix(" min");
330 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
331 _adviseRecoSpinBox = new QSpinBox();
332 _adviseRecoSpinBox->setMinimum(0);
333 _adviseRecoSpinBox->setMaximum(60);
334 _adviseRecoSpinBox->setSingleStep(1);
335 _adviseRecoSpinBox->setSuffix(" min");
336 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
337 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
338
339 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
340 this, SLOT(slotBncTextChanged()));
341
342 // Miscellaneous Options
343 // ---------------------
344 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
345 _perfIntrComboBox = new QComboBox();
346 _perfIntrComboBox->setEditable(false);
347 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
348 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
349 if (ll != -1) {
350 _perfIntrComboBox->setCurrentIndex(ll);
351 }
352 _scanRTCMCheckBox = new QCheckBox();
353 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
354 settings.value("scanRTCM").toInt()));
355
356 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
357 this, SLOT(slotBncTextChanged()));
358
359 // PPP Options
360 // -----------
361 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
362 _pppMountLineEdit->setMaximumWidth(6*ww);
363 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
364 _pppCorrMountLineEdit->setMaximumWidth(6*ww);
365 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
366 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
367 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
368 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
369 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
370 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
371 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
372 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
373 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
374 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
375 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
376 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
377 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
378 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
379 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
380 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
381 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
382 _pppSync = new QLineEdit(settings.value("pppSync").toString());
383 _pppAntexFileChooser = new qtFileChooser;
384 _pppAntexFileChooser->setMinimumWidth(12*ww);
385 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
386 _pppAntennaLineEdit->setMinimumWidth(14*ww);
387 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
388
389
390 _pppSPPComboBox = new QComboBox();
391 _pppSPPComboBox->setEditable(false);
392 _pppSPPComboBox->addItems(QString("PPP,SPP,Post-Processing").split(","));
393 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
394 if (ik != -1) {
395 _pppSPPComboBox->setCurrentIndex(ik);
396 }
397 _pppUsePhaseCheckBox = new QCheckBox();
398 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
399 settings.value("pppUsePhase").toInt()));
400 _pppEstTropoCheckBox = new QCheckBox();
401 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
402 settings.value("pppEstTropo").toInt()));
403 _pppGLONASSCheckBox = new QCheckBox();
404 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
405 settings.value("pppGLONASS").toInt()));
406 _pppGalileoCheckBox = new QCheckBox();
407 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
408 settings.value("pppGalileo").toInt()));
409
410 _pppPlotCoordinates = new QCheckBox();
411 _pppPlotCoordinates->setCheckState(Qt::CheckState(
412 settings.value("pppPlotCoordinates").toInt()));
413
414 _pppApplySatAntCheckBox = new QCheckBox();
415 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
416 settings.value("pppApplySatAnt").toInt()));
417
418 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
419 this, SLOT(slotBncTextChanged()));
420
421 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
422 this, SLOT(slotBncTextChanged()));
423
424 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
425 this, SLOT(slotBncTextChanged()));
426
427 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
428 this, SLOT(slotBncTextChanged()));
429 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
430 this, SLOT(slotBncTextChanged()));
431 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
432 this, SLOT(slotBncTextChanged()));
433 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
434 this, SLOT(slotBncTextChanged()));
435 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
436 this, SLOT(slotBncTextChanged()));
437 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
438 this, SLOT(slotBncTextChanged()));
439
440 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
441 this, SLOT(slotBncTextChanged()));
442
443 connect(_pppSync, SIGNAL(textChanged(const QString &)),
444 this, SLOT(slotBncTextChanged()));
445
446 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
447 this, SLOT(slotBncTextChanged()));
448
449 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
450 this, SLOT(slotBncTextChanged()));
451
452 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
453 this, SLOT(slotBncTextChanged()));
454
455 // Streams
456 // -------
457 _mountPointsTable = new QTableWidget(0,8);
458
459 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
460 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
461 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
462 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
463 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
464 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
465 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
466 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
467 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
468 _mountPointsTable->setHorizontalHeaderLabels(labels);
469 _mountPointsTable->setGridStyle(Qt::NoPen);
470 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
471 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
472 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
473 _mountPointsTable->hideColumn(0);
474 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
475 SLOT(slotSelectionChanged()));
476 populateMountPointsTable();
477
478 _log = new QTextBrowser();
479 _log->setReadOnly(true);
480
481 // Combination
482 // -----------
483 _cmbTable = new QTableWidget(0,3);
484 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
485 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
486 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
487 _cmbTable->setMaximumWidth(30*ww);
488 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
489 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
490 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
491 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
492 _cmbTable->horizontalHeader()->setStretchLastSection(true);
493 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
494
495 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
496
497 QPushButton* addCmbRowButton = new QPushButton("Add Row");
498 QPushButton* delCmbRowButton = new QPushButton("Delete");
499
500 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
501 SLOT(slotBncTextChanged()));
502
503 _cmbMethodComboBox = new QComboBox();
504 _cmbMethodComboBox->setEditable(false);
505 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
506 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
507 if (im != -1) {
508 _cmbMethodComboBox->setCurrentIndex(im);
509 }
510
511 // Upload Results
512 // -------------
513 _uploadTable = new QTableWidget(0,9);
514 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, bytes").split(","));
515 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
516 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
517 _uploadTable->horizontalHeader()->resizeSection(0,13*ww);
518 _uploadTable->horizontalHeader()->resizeSection(1,5*ww);
519 _uploadTable->horizontalHeader()->resizeSection(2,6*ww);
520 _uploadTable->horizontalHeader()->resizeSection(3,8*ww);
521 _uploadTable->horizontalHeader()->resizeSection(4,11*ww);
522 _uploadTable->horizontalHeader()->resizeSection(5,4*ww);
523 _uploadTable->horizontalHeader()->resizeSection(6,15*ww);
524 _uploadTable->horizontalHeader()->resizeSection(7,15*ww);
525 _uploadTable->horizontalHeader()->resizeSection(8,10*ww);
526 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
527 _uploadTable->horizontalHeader()->setStretchLastSection(true);
528 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
529
530 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
531 SLOT(slotBncTextChanged()));
532
533 QPushButton* addUploadRowButton = new QPushButton("Add Row");
534 QPushButton* delUploadRowButton = new QPushButton("Del Row");
535 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
536 _uploadIntrComboBox = new QComboBox;
537 _uploadIntrComboBox->setEditable(false);
538 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
539 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
540 if (ii != -1) {
541 _uploadIntrComboBox->setCurrentIndex(ii);
542 }
543 _uploadSamplSpinBox = new QSpinBox;
544 _uploadSamplSpinBox->setMinimum(5);
545 _uploadSamplSpinBox->setMaximum(60);
546 _uploadSamplSpinBox->setSingleStep(5);
547 _uploadSamplSpinBox->setMaximumWidth(9*ww);
548 _uploadSamplSpinBox->setValue(settings.value("uploadSampl").toInt());
549 _uploadSamplSpinBox->setSuffix(" sec");
550
551 _uploadSamplOrbSpinBox = new QSpinBox;
552 _uploadSamplOrbSpinBox->setMinimum(0);
553 _uploadSamplOrbSpinBox->setMaximum(60);
554 _uploadSamplOrbSpinBox->setSingleStep(5);
555 _uploadSamplOrbSpinBox->setMaximumWidth(9*ww);
556 _uploadSamplOrbSpinBox->setValue(settings.value("uploadSamplOrb").toInt());
557 _uploadSamplOrbSpinBox->setSuffix(" sec");
558
559 // Upload RTCM3 Ephemeris
560 // ----------------------
561 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
562 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
563 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
564 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
565 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
566 _uploadEphSampleSpinBox = new QSpinBox;
567 _uploadEphSampleSpinBox->setMinimum(5);
568 _uploadEphSampleSpinBox->setMaximum(60);
569 _uploadEphSampleSpinBox->setSingleStep(5);
570 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
571 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
572 _uploadEphSampleSpinBox->setSuffix(" sec");
573 _uploadEphBytesCounter = new bncBytesCounter;
574
575 // WhatsThis
576 // ---------
577 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you might need to use a proxy server to access the Internet. Enter your proxy server IP and port number in case one is operated in front of BNC. If you do not know the IP and port of your proxy server, check the proxy server settings in your Internet browser or ask your network administrator.</p><p>Note that IP streaming is sometimes not allowed in a LAN. In this case you need to ask your network administrator for an appropriate modification of the local security policy or for the installation of a TCP relay to the NTRIP broadcasters. If these are not possible, you might need to run BNC outside your LAN on a network that has unobstructed connection to the Internet.</p>"));
578 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
579 _waitTimeSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full epoch' seconds. A value of 3 to 5 seconds is recommended, depending on the latency of the incoming streams and the delay acceptable to your real-time GNSS network engine or products.</p>"));
580 _outFileLineEdit->setWhatsThis(tr("Specify the full path to a file where synchronized observations are saved in plain ASCII format. Beware that the size of this file can rapidly increase depending on the number of incoming streams."));
581 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
582 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
583 _outEphPortLineEdit->setWhatsThis(tr("BNC can produce ephemeris data in RINEX ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
584 _corrPortLineEdit->setWhatsThis(tr("BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port. Specify a port number here to activate this function."));
585 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application.</p><p>Specifying a value of '0' means that BNC immediately outputs all incoming Broadcast Epemeris Corrections and does not drop any of them for latency reasons.</p>"));
586 _rnxPathLineEdit->setWhatsThis(tr("Here you specify the path to where the RINEX Observation files will be stored. If the specified directory does not exist, BNC will not create RINEX Observation files."));
587 _ephPathLineEdit->setWhatsThis(tr("Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files. If the specified directory does not exist, BNC will not create RINEX Navigation files."));
588 _corrPathLineEdit->setWhatsThis(tr("Specify a directory for saving Broadcast Ephemeris Correction files. If the specified directory does not exist, BNC will not create the files."));
589 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is saved, you might want to compress, copy or upload it immediately via FTP. BNC allows you to execute a script/batch file to carry out these operations. To do that specify the full path of the script/batch file here. BNC will pass the full RINEX Observation file path to the script as a command line parameter (%1 on Windows systems, $1 onUnix/Linux systems).</p>"));
590 _rnxSkelLineEdit->setWhatsThis(tr("<p>BNC allows using personal skeleton files that contain the header records you would like to include. You can derive a personal RINEX header skeleton file from the information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' suffix is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream.</p>"));
591 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and any existing files with the same name will be overwritten. However, users might want to append already existing files following a restart of BNC, a system crash or when BNC crashed. Tick 'Append files' to continue with existing files and keep what has been recorded so far.</p>"));
592 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
593 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
594
595 _onTheFlyComboBox->setWhatsThis(tr("<p>When operating BNC online in 'no window' mode, some configuration parameters can be changed on-the-fly without interrupting the running process. For that BNC rereads parts of its configuration in pre-defined intervals.<p></p>Select '1 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, hour, or day and let in between edited configuration options become effective on-the-fly without terminating uninvolved threads.</p><p>Note that when operating BNC in window mode, on-the-fly changeable configuration options become effective immediately through 'Save & Reread Configuration'.</p>"));
596 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
597 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
598 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
599 _rnxSamplSpinBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. A value of zero '0' tells BNC to store all received epochs into RINEX.</p>"));
600 _binSamplSpinBox->setWhatsThis(tr("<p>Select the synchronized observation sampling interval in seconds. A value of zero '0' tells BNC to send/store all received epochs.</p>"));
601 _obsRateComboBox->setWhatsThis(tr("<p>BNC can collect all returns (success or failure) coming from a decoder within a certain short time span to then decide whether a stream has an outage or its content is corrupted. The procedure needs a rough estimate of the expected 'Observation rate' of the incoming streams. When a continuous problem is detected, BNC can inform its operator about this event through an advisory note.</p>"));
602 _adviseRecoSpinBox->setWhatsThis(tr("<p>Following a stream outage or a longer series of bad observations, an advisory note is generated when valid observations are received again throughout the 'Recovery threshold' time span. A value of about 5min (default) is recommended.</p><p>A value of zero '0' means that for any stream recovery, however short, BNC immediately generates an advisory note.</p>"));
603 _adviseFailSpinBox->setWhatsThis(tr("<p>An advisory note is generated when no (or only corrupted) observations are seen throughout the 'Failure threshold' time span. A value of 15 min (default) is recommended.</p><p>A value of zero '0' means that for any stream failure, however short, BNC immediately generates an advisory note.</p>"));
604 _logFileLineEdit->setWhatsThis(tr("<p>Records of BNC's activities are shown in the 'Log' tab on the bottom of this window. They can be saved into a file when a valid path is specified in the 'Logfile (full path)' field.</p><p>The logfile name will automatically be extended by a string '_YYMMDD' carrying the current date."));
605 _adviseScriptLineEdit->setWhatsThis(tr("<p>Specify the full path to a script or batch file to handle advisory notes generated in the event of corrupted streams or stream outages. The affected mountpoint and one of the comments 'Begin_Outage', 'End_Outage', 'Begin_Corrupted', or 'End_Corrupted' are passed on to the script as command line parameters.</p><p>The script may have the task to send the advisory notes by email to BNC's operator and/or to the affected stream provider. An empty option field (default) or invalid path means that you don't want to use this option.</p>"));
606 _perfIntrComboBox->setWhatsThis(tr("<p>BNC can average latencies per stream over a certain period of GPS time. The resulting mean latencies are recorded in the 'Log' tab at the end of each 'Log latency' interval together with results of a statistical evaluation (approximate number of covered epochs, data gaps).</p><p>Select a 'Log latency' interval or select the empty option field if you do not want BNC to log latencies and statistical information.</p>"));
607 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button will open a window that allows the user to select data streams from an NTRIP broadcaster according to their mountpoints. To remove a stream from the 'Streams' list, highlight it by clicking on it and hit the 'Delete Stream' button. You can also remove multiple streams by highlighting them using +Shift and +Ctrl.</p><p>BNC automatically allocates one of its internal decoders to a stream based on the stream's 'format' as given in the sourcetable. BNC allows users to change this selection by editing the decoder string. Double click on the 'decoder' field, enter your preferred decoder and then hit Enter. The accepted decoder strings are 'RTCM_2.x' and 'RTCM_3.x'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate these streams, the approximate latitude/longitude rover position is sent to the NTRIP broadcaster. The default values can be change according to your requirement. Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter.</p>"));
608 _log->setWhatsThis(tr("Records of BNC's activities are shown in the 'Log' tab. The message log covers the communication status between BNC and the NTRIP broadcaster as well as any problems that occur in the communication link, stream availability, stream delay, stream conversion etc."));
609 _bncFigure->setWhatsThis(tr("The bandwidth consumtion per stream is shown in the 'Throughput' tab in bits per second (bps) or kilo bits per second (kbps)."));
610 _bncFigureLate->setWhatsThis(tr("The individual latency of observations in each incoming stream is shown in the 'Latency' tab. Streams not carrying observations (i.e. those providing only broadcast ephemeris messages) are not considered here. Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized."));
611 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
612 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
613 _miscMountLineEdit->setWhatsThis(tr("<p>Specify a mountpoint to apply any of the options shown below. Enter 'ALL' if you want to apply these options to all configured streams.</p><p>An empty option field (default) means that you don't want BNC to apply any of these options.</p>"));
614 _scanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incomming message types as well as contained antenna coordinates, antenna heigt, and antenna descriptor.</p>"));
615 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
616 _serialPortNameLineEdit->setWhatsThis(tr("<p>Enter the serial 'Port name' selected for communication with your serial connected receiver. Valid port names are</p><pre>Windows: COM1, COM2<br>Linux: /dev/ttyS0, /dev/ttyS1<br>FreeBSD: /dev/ttyd0, /dev/ttyd1<br>Digital Unix: /dev/tty01, /dev/tty02<br>HP-UX: /dev/tty1p0, /dev/tty2p0<br>SGI/IRIX: /dev/ttyf1, /dev/ttyf2<br>SunOS/Solaris: /dev/ttya, /dev/ttyb</pre><p>Note that you must plug a serial cable in the port defined here before you start BNC.</p>"));
617 _serialBaudRateComboBox->setWhatsThis(tr("<p>Select a 'Baud rate' for the serial output link.</p><p>Note that your selection must equal the baud rate configured to the serial connected receiver. Note further that using a high baud rate is recommended.</p>"));
618 _serialParityComboBox->setWhatsThis(tr("<p>Select the 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. Note further that parity is often set to 'NONE'.</p>"));
619 _serialDataBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Data bits' for the serial output link.</p><p>Note that your selection must equal the number of data bits configured to the serial connected receiver. Note further that often 8 data bits are used.</p>"));
620 _serialStopBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Stop bits' for the serial output link.</p><p>Note that your selection must equal the number of stop bits configured to the serial connected receiver. Note further that often 1 stop bit is used.</p>"));
621 _serialFlowControlComboBox->setWhatsThis(tr("<p>Select a 'Flow control' for the serial output link.</p><p>Note that your selection must equal the flow control configured to the serial connected receiver. Select 'OFF' if you don't know better.</p>"));
622 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>Select 'Auto' to automatically forward NMEA-GGA messages coming from your serial connected receiver to the NTRIP broadcaster and/or save them in a file.</p><p>Select 'Manual' only when handling a VRS stream and your serial connected receiver doesn't generate NMEA-GGA messages.</p>"));
623 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
624 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meter for your VRS to simulate an inital NMEA-GGA message.</p><p>The setting of this option is ignored in case of streams coming from physical reference stations.</p>"));
625 _pppMountLineEdit->setWhatsThis(tr("<p>Specify an observations stream by its mountpoint from the 'Streams' list compiled below if you want BNC to estimate coordinates for the affected receiver position through a PPP solution. Example: 'FFMJ1'</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
626 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock corrections stream by its mountpoint from the 'Streams' list compiled below. Example: 'CLK10'</p>"));
627 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
628 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
629 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
630 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
631 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for a combined processing of both, GPS and Galileo observations in PPP mode.</p>"));
632 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
633 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
634 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
635 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
636 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'Sigma XYZ Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
637 _pppMaxSolGapLineEdit->setWhatsThis(tr("<p>Specify a 'Maximum Solution Gap' in seconds. Should the time span between two consecutive solutions exceed this limit, the algorithm returns into the Quick-Start mode and fixes the introduced reference coordinate for the specified Quick-Start period. A value of '120' seconds could be an appropriate choice.</p><p>This option makes only sense for a stationary operated receiver where solution convergence can be enforced because a good approximation for the rover position is known. Default is an empty option field, meaning that you don't want BNC to return into the Quick-Start mode after failures caused i.e. by longer lasting outages.</p>"));
638 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
639 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
640 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
641 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the white noise of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
642 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
643 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 1e-6 (default) would mean that the tropospheric effect may vary for 3600 * 1e-6 = 0.0036 meters per hour.</p>"));
644 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
645 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
646 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
647 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
648 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
649 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
650 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when the corresponting option is selected above. Values are either referred to an XYZ reference coordinate (if specified) or referred to the first estimated set of coordinate compoments. The sliding PPP time series window covers the period of the latest 5 minutes."));
651 _pppSync->setWhatsThis(tr(
652 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
653 "immediately after its arrival using satellite clock corrections available at "
654 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
655 "are buffered and the processing of each epoch is postponed till the satellite clock "
656 "corrections not older than 'Sync Corr' seconds are available.<p>"));
657 _pppAntexFileChooser->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
658 _pppAntennaLineEdit->setWhatsThis(tr("<p>Specify the receiver's antenna name as defined in your ANTEX file. Observations will be corrected for the antenna phase center's offset which may result in a reduction of a few centimeters at max. Corrections for phase center variations are not yet applied by BNC. The specified name must consist of 20 characters. Add trailing blanks if the antenna name has less then 20 characters.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets.</p>"));
659 _pppApplySatAntCheckBox->setWhatsThis(tr("<p>This option is not yet working.</p><p>Satellite orbit and clock corrections refer to the satellite's antenna phase centers and hence observations are actually <u>not</u> to be corrected for satellite antenna phase center offsets. However, you may like to tick 'Apply Offsets' to force BNC to correct observations for satellite antenna phase center offsets.</p><p>Default is to <u>not</u> correct observations for satellite antenna phase center offsets."));
660 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock corrections streams in real-time to produce, encode, upload and save a combination of correctors from various providers. Hit the 'Add Row' button, Double click on the 'Mountpoint' field to enter a Broadcast Ephemeris corrections mountpoint from the 'Streams' section below and hit Enter. Then double click on the 'AC Name' field to enter your choice of an abbreviation for the Analysis Center (AC) providing the stream. Finally, double click on the 'Weight' field to enter the weight to be applied for this stream in the combination.</p><p>Note that an appropriate 'Wait for full epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</p><p>Note further that the sequence of rows in the 'Combination Table' is of importance because the orbit information in the final combination stream is just copied from the stream listed in the first row. Hence the first line in the 'Combination Table' defines a kind of 'Master AC'. The update rate of the combination product follows the 'Master AC's update rate.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC must therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p>"));
661 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
662 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
663
664 // Canvas with Editable Fields
665 // ---------------------------
666 _canvas = new QWidget;
667 setCentralWidget(_canvas);
668
669 _aogroup = new QTabWidget();
670 QWidget* pgroup = new QWidget();
671 QWidget* ggroup = new QWidget();
672 QWidget* sgroup = new QWidget();
673 QWidget* egroup = new QWidget();
674 QWidget* agroup = new QWidget();
675 QWidget* cgroup = new QWidget();
676 QWidget* ogroup = new QWidget();
677 QWidget* rgroup = new QWidget();
678 QWidget* sergroup = new QWidget();
679 QWidget* pppgroup = new QWidget();
680 QWidget* ppp2group = new QWidget();
681 QWidget* cmbgroup = new QWidget();
682 QWidget* uploadgroup = new QWidget();
683 QWidget* uploadEphgroup = new QWidget();
684 _aogroup->addTab(pgroup,tr("Network"));
685 _aogroup->addTab(ggroup,tr("General"));
686 _aogroup->addTab(ogroup,tr("RINEX Observations"));
687 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
688 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
689 _aogroup->addTab(sgroup,tr("Feed Engine"));
690 _aogroup->addTab(sergroup,tr("Serial Output"));
691 _aogroup->addTab(agroup,tr("Outages"));
692 _aogroup->addTab(rgroup,tr("Miscellaneous"));
693 _aogroup->addTab(pppgroup,tr("PPP (1)"));
694 _aogroup->addTab(ppp2group,tr("PPP (2)"));
695#ifdef USE_COMBINATION
696 _aogroup->addTab(cmbgroup,tr("Combination"));
697#endif
698 _aogroup->addTab(uploadgroup,tr("Upload (clk)"));
699 _aogroup->addTab(uploadEphgroup,tr("Upload (eph)"));
700
701 // Log Tab
702 // -------
703 _loggroup = new QTabWidget();
704 _loggroup->addTab(_log,tr("Log"));
705 _loggroup->addTab(_bncFigure,tr("Throughput"));
706 _loggroup->addTab(_bncFigureLate,tr("Latency"));
707 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
708
709 // Netowork (Proxy and SSL) Tab
710 // ----------------------------
711 QGridLayout* pLayout = new QGridLayout;
712 pLayout->setColumnMinimumWidth(0,13*ww);
713 _proxyPortLineEdit->setMaximumWidth(9*ww);
714
715 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
716 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
717 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
718 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
719 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
720 pLayout->addWidget(new QLabel(" "),3,0);
721 pLayout->addWidget(new QLabel(" "),4,0);
722 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 5, 0);
723 pLayout->addWidget(_sslCaCertPathLineEdit, 5, 1, 1,10);
724 pLayout->addWidget(new QLabel("default: " + bncSslConfig::defaultPath()), 5, 12, 1,20);
725 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 6,0);
726 pLayout->addWidget(_ignoreSslErrorsCheckBox, 6, 1, 1,10);
727 pLayout->addWidget(new QLabel("Settings for SSL Authorization."),7, 0, 1, 50, Qt::AlignLeft);
728 pgroup->setLayout(pLayout);
729
730 // General Tab
731 // -----------
732 QGridLayout* gLayout = new QGridLayout;
733 gLayout->setColumnMinimumWidth(0,14*ww);
734 _onTheFlyComboBox->setMaximumWidth(9*ww);
735
736 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
737 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
738 gLayout->addWidget(new QLabel("Append files"), 1, 0);
739 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
740 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
741 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
742 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
743 gLayout->addWidget(_autoStartCheckBox, 3, 1);
744 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
745 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
746 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
747 ggroup->setLayout(gLayout);
748
749 // RINEX Observations
750 // ------------------
751 QGridLayout* oLayout = new QGridLayout;
752 oLayout->setColumnMinimumWidth(0,14*ww);
753 _rnxIntrComboBox->setMaximumWidth(9*ww);
754 _rnxSamplSpinBox->setMaximumWidth(9*ww);
755
756 oLayout->addWidget(new QLabel("Directory"), 0, 0);
757 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
758 oLayout->addWidget(new QLabel("Interval"), 1, 0);
759 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
760 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
761 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
762 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
763 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
764 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
765 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
766 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
767 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
768 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
769 ogroup->setLayout(oLayout);
770
771 // RINEX Ephemeris
772 // ---------------
773 QGridLayout* eLayout = new QGridLayout;
774 eLayout->setColumnMinimumWidth(0,14*ww);
775 _ephIntrComboBox->setMaximumWidth(9*ww);
776 _outEphPortLineEdit->setMaximumWidth(9*ww);
777
778 eLayout->addWidget(new QLabel("Directory"), 0, 0);
779 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
780 eLayout->addWidget(new QLabel("Interval"), 1, 0);
781 eLayout->addWidget(_ephIntrComboBox, 1, 1);
782 eLayout->addWidget(new QLabel("Port"), 2, 0);
783 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
784 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
785 eLayout->addWidget(_ephV3CheckBox, 3, 1);
786 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
787 eLayout->addWidget(new QLabel(" "),5,0);
788 egroup->setLayout(eLayout);
789
790
791 // Broadcast Corrections
792 // ---------------------
793 QGridLayout* cLayout = new QGridLayout;
794 cLayout->setColumnMinimumWidth(0,14*ww);
795 _corrIntrComboBox->setMaximumWidth(9*ww);
796 _corrPortLineEdit->setMaximumWidth(9*ww);
797 _corrTimeSpinBox->setMaximumWidth(9*ww);
798
799 cLayout->addWidget(new QLabel("Directory, ASCII"), 0, 0);
800 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
801 cLayout->addWidget(new QLabel("Interval"), 1, 0);
802 cLayout->addWidget(_corrIntrComboBox, 1, 1);
803 cLayout->addWidget(new QLabel("Port"), 2, 0);
804 cLayout->addWidget(_corrPortLineEdit, 2, 1);
805 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
806 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
807 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
808 cLayout->addWidget(new QLabel(" "),4,0);
809 cLayout->addWidget(new QLabel(" "),5,0);
810 cgroup->setLayout(cLayout);
811
812 // Feed Engine
813 // -----------
814 QGridLayout* sLayout = new QGridLayout;
815 sLayout->setColumnMinimumWidth(0,14*ww);
816 _outPortLineEdit->setMaximumWidth(9*ww);
817 _waitTimeSpinBox->setMaximumWidth(9*ww);
818 _binSamplSpinBox->setMaximumWidth(9*ww);
819 _outUPortLineEdit->setMaximumWidth(9*ww);
820
821 sLayout->addWidget(new QLabel("Port"), 0, 0);
822 sLayout->addWidget(_outPortLineEdit, 0, 1);
823 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
824 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
825 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
826 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
827 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
828 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
829 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
830 sLayout->addWidget(_outUPortLineEdit, 3, 1);
831 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
832 sLayout->addWidget(new QLabel(" "),5,0);
833 sgroup->setLayout(sLayout);
834
835 // Serial Output
836 // -------------
837 QGridLayout* serLayout = new QGridLayout;
838 serLayout->setColumnMinimumWidth(0,14*ww);
839 _serialBaudRateComboBox->setMaximumWidth(9*ww);
840 _serialFlowControlComboBox->setMaximumWidth(11*ww);
841 _serialDataBitsComboBox->setMaximumWidth(5*ww);
842 _serialParityComboBox->setMaximumWidth(9*ww);
843 _serialStopBitsComboBox->setMaximumWidth(5*ww);
844 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
845 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
846
847 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
848 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
849 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
850 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
851 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
852 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
853 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
854 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
855 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
856 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
857 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
858 serLayout->addWidget(_serialParityComboBox, 3,3);
859 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
860 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
861 serLayout->addWidget(new QLabel("NMEA"), 4,0);
862 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
863 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
864 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
865 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
866 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
867 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
868
869 sergroup->setLayout(serLayout);
870
871 // Outages
872 // -------
873 QGridLayout* aLayout = new QGridLayout;
874 aLayout->setColumnMinimumWidth(0,14*ww);
875 _obsRateComboBox->setMaximumWidth(9*ww);
876 _adviseFailSpinBox->setMaximumWidth(9*ww);
877 _adviseRecoSpinBox->setMaximumWidth(9*ww);
878
879 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
880 aLayout->addWidget(_obsRateComboBox, 0, 1);
881 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
882 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
883 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
884 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
885 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
886 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
887 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
888 aLayout->addWidget(new QLabel(" "), 5, 0);
889 agroup->setLayout(aLayout);
890
891 // Miscellaneous
892 // -------------
893 QGridLayout* rLayout = new QGridLayout;
894 rLayout->setColumnMinimumWidth(0,14*ww);
895 _perfIntrComboBox->setMaximumWidth(9*ww);
896
897 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
898 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
899 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
900 rLayout->addWidget(_perfIntrComboBox, 1, 1);
901 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
902 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
903 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
904 rLayout->addWidget(new QLabel(" "), 4, 0);
905 rLayout->addWidget(new QLabel(" "), 5, 0);
906 rgroup->setLayout(rLayout);
907
908 // PPP Client
909 // ----------
910 QGridLayout* pppLayout = new QGridLayout;
911 _pppSigCLineEdit->setMaximumWidth(6*ww);
912 _pppSigPLineEdit->setMaximumWidth(6*ww);
913 _pppSigCrd0->setMaximumWidth(6*ww);
914 _pppSigCrdP->setMaximumWidth(6*ww);
915 _pppSigTrp0->setMaximumWidth(6*ww);
916 _pppSigTrpP->setMaximumWidth(6*ww);
917 _pppAverageLineEdit->setMaximumWidth(6*ww);
918 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
919 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
920 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
921 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
922 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
923 _pppRefdNLineEdit->setMaximumWidth(5*ww);
924 _pppRefdELineEdit->setMaximumWidth(5*ww);
925 _pppRefdULineEdit->setMaximumWidth(5*ww);
926 _pppSync->setMaximumWidth(6*ww);
927 _pppSPPComboBox->setMaximumWidth(15*ww);
928 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
929
930 _postObsFileChooser = new qtFileChooser;
931 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
932 _postObsFileChooser->setWhatsThis(tr("Full Path to RINEX Observation File"));
933
934 _postNavFileChooser = new qtFileChooser;
935 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
936 _postNavFileChooser->setWhatsThis(tr("Full Path to RINEX Navigation File"));
937
938 _postCorrFileChooser = new qtFileChooser;
939 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
940 _postCorrFileChooser->setWhatsThis(tr("Full Path to DGPS Correction File"));
941
942 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
943 _postOutLineEdit->setWhatsThis(tr("Full Path to DGPS Correction File"));
944
945 int ir = 0;
946 pppLayout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 1)</b>"), ir, 0, 1, 8);
947 ++ir;
948 pppLayout->addWidget(new QLabel("Obs Mountpoint"), ir, 0);
949 pppLayout->addWidget(_pppMountLineEdit, ir, 1);
950 pppLayout->addWidget(_pppSPPComboBox, ir, 2);
951 pppLayout->addWidget(new QLabel(" X "), ir, 3, Qt::AlignRight);
952 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 4);
953 pppLayout->addWidget(new QLabel(" Y "), ir, 5, Qt::AlignRight);
954 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 6);
955 pppLayout->addWidget(new QLabel(" Z "), ir, 7, Qt::AlignRight);
956 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 8);
957 ++ir;
958 pppLayout->addWidget(new QLabel("Corr Mountpoint "), ir, 0);
959 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 1);
960 pppLayout->addWidget(new QLabel(" dN "), ir, 3, Qt::AlignRight);
961 pppLayout->addWidget(_pppRefdNLineEdit, ir, 4);
962 pppLayout->addWidget(new QLabel(" dE "), ir, 5, Qt::AlignRight);
963 pppLayout->addWidget(_pppRefdELineEdit, ir, 6);
964 pppLayout->addWidget(new QLabel(" dU "), ir, 7, Qt::AlignRight);
965 pppLayout->addWidget(_pppRefdULineEdit, ir, 8);
966 ++ir;
967 pppLayout->addWidget(new QLabel("Output"), ir, 0);
968 pppLayout->addWidget(new QLabel("NMEA File"), ir, 1, Qt::AlignRight);
969 pppLayout->addWidget(_pppNMEALineEdit, ir, 2, 1, 2);
970 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 5, Qt::AlignRight);
971 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 6);
972 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 7, Qt::AlignRight);
973 pppLayout->addWidget(_pppPlotCoordinates, ir, 8);
974 ++ir;
975 pppLayout->addWidget(new QLabel("<b>Post-Processing </b>"));
976 {
977 QHBoxLayout* hlpLayout = new QHBoxLayout;
978 hlpLayout->addWidget(new QLabel("Obs"));
979 hlpLayout->addWidget(_postObsFileChooser);
980 hlpLayout->addWidget(new QLabel(" Nav"));
981 hlpLayout->addWidget(_postNavFileChooser);
982 hlpLayout->addWidget(new QLabel(" Corr"));
983 hlpLayout->addWidget(_postCorrFileChooser);
984 pppLayout->addLayout(hlpLayout, ir, 1, 1, 8);
985 }
986 ++ir;
987 pppLayout->addWidget(new QLabel("Output"), ir, 1);
988 pppLayout->addWidget(_postOutLineEdit, ir, 2, 1, 2);
989
990 pppgroup->setLayout(pppLayout);
991
992 // PPP Client (second panel)
993 // -------------------------
994 QGridLayout* ppp2Layout = new QGridLayout;
995 ir = 0;
996 ppp2Layout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 2)</b>"), ir, 0, 1, 8);
997 ++ir;
998 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
999 {
1000 QHBoxLayout* hlpLayout = new QHBoxLayout;
1001 hlpLayout->addWidget(_pppAntexFileChooser);
1002 hlpLayout->addWidget(new QLabel("ANTEX File"));
1003 hlpLayout->addWidget(_pppAntennaLineEdit);
1004 hlpLayout->addWidget(new QLabel("Antenna Name"));
1005 hlpLayout->addWidget(_pppApplySatAntCheckBox);
1006 hlpLayout->addWidget(new QLabel("Apply Sat. Ant. Offsets"));
1007 ppp2Layout->addLayout(hlpLayout, ir, 1, 1, 8);
1008 }
1009 ++ir;
1010 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
1011 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1012 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1013 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1014 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1015 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1016 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1017 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1018 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1019 ++ir;
1020 ppp2Layout->addWidget(new QLabel("Options"), ir, 0, 1, 5);
1021 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
1022 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
1023 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
1024 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
1025 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
1026 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
1027 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
1028 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
1029 ++ir;
1030 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1031 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1032 ppp2Layout->addWidget(new QLabel("Sigma XYZ Init "), ir, 2);
1033 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1034 ppp2Layout->addWidget(new QLabel("Sigma XYZ Noise "), ir, 4);
1035 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
1036 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
1037 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
1038 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
1039 ++ir;
1040 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1041 ppp2Layout->addWidget(_pppSync, ir, 1);
1042 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
1043 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
1044 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
1045
1046 ppp2group->setLayout(ppp2Layout);
1047
1048 // Combination
1049 // -----------
1050 QGridLayout* cmbLayout = new QGridLayout;
1051
1052 populateCmbTable();
1053 cmbLayout->addWidget(_cmbTable,0,0,6,3);
1054
1055 cmbLayout->addWidget(addCmbRowButton,1,3);
1056 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1057 cmbLayout->addWidget(delCmbRowButton,2,3);
1058 cmbLayout->addWidget(new QLabel("Method"), 3, 3);
1059 cmbLayout->addWidget(_cmbMethodComboBox, 3, 4, Qt::AlignRight);
1060 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 4, 3);
1061 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 4, Qt::AlignRight);
1062 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1063
1064 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,3);
1065
1066 cmbgroup->setLayout(cmbLayout);
1067
1068 // Upload Layout (Clocks)
1069 // ----------------------
1070 QGridLayout* uploadHlpLayout = new QGridLayout();
1071
1072 uploadHlpLayout->addWidget(new QLabel("Upload RTNet or Combination Results"),0,0);
1073
1074 uploadHlpLayout->addWidget(addUploadRowButton,0,1);
1075 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1076
1077 uploadHlpLayout->addWidget(delUploadRowButton,0,2);
1078 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1079
1080 uploadHlpLayout->addWidget(setUploadTrafoButton,1,1);
1081 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1082
1083 uploadHlpLayout->addWidget(new QLabel("Interval"),0,3, Qt::AlignRight);
1084 uploadHlpLayout->addWidget(_uploadIntrComboBox,0,4);
1085
1086 uploadHlpLayout->addWidget(new QLabel("Sampling"),1,3, Qt::AlignRight);
1087 uploadHlpLayout->addWidget(_uploadSamplSpinBox,1,4);
1088
1089 uploadHlpLayout->addWidget(new QLabel("Sampling (Orb)"),1,5, Qt::AlignRight);
1090 uploadHlpLayout->addWidget(_uploadSamplOrbSpinBox,1,6);
1091
1092 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1093 populateUploadTable();
1094 uploadLayout->addWidget(_uploadTable);
1095 uploadLayout->addLayout(uploadHlpLayout);
1096
1097 uploadgroup->setLayout(uploadLayout);
1098
1099 // Upload Layout (Ephemeris)
1100 // -------------------------
1101 QGridLayout* uploadLayoutEph = new QGridLayout;
1102
1103 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1104 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1105 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1106 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1107
1108 uploadLayoutEph->addWidget(new QLabel("Host"), 0, 0);
1109 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 0, 1, 1, 3);
1110 uploadLayoutEph->addWidget(new QLabel(" Port"), 0, 4, Qt::AlignRight);
1111 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 0, 5, 1, 1);
1112 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 1, 0);
1113 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 1, 1);
1114 uploadLayoutEph->addWidget(new QLabel(" Password"), 1, 2, Qt::AlignRight);
1115 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 1, 3);
1116 uploadLayoutEph->addWidget(new QLabel("Sampling"), 2, 0);
1117 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 2, 1);
1118 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 3, 0, 1, 5);
1119 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 3, 5);
1120
1121 uploadEphgroup->setLayout(uploadLayoutEph);
1122
1123 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1124 this, SLOT(slotBncTextChanged()));
1125
1126 // Main Layout
1127 // -----------
1128 QGridLayout* mLayout = new QGridLayout;
1129 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1130 mLayout->addWidget(_aogroup, 0,0);
1131 mLayout->addWidget(_mountPointsTable, 1,0);
1132 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1133 mLayout->addWidget(_loggroup, 2,0);
1134
1135 _canvas->setLayout(mLayout);
1136
1137 // Enable/Disable all Widgets
1138 // --------------------------
1139 slotBncTextChanged();
1140
1141 // Auto start
1142 // ----------
1143 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1144 slotGetData();
1145 }
1146}
1147
1148// Destructor
1149////////////////////////////////////////////////////////////////////////////
1150bncWindow::~bncWindow() {
1151 delete _caster;
1152 delete _casterEph;
1153}
1154
1155//
1156////////////////////////////////////////////////////////////////////////////
1157void bncWindow::populateMountPointsTable() {
1158
1159 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1160 _mountPointsTable->removeRow(iRow);
1161 }
1162
1163 bncSettings settings;
1164
1165 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1166 if (!it.hasNext()) {
1167 _actGetData->setEnabled(false);
1168 }
1169 int iRow = 0;
1170 while (it.hasNext()) {
1171 QStringList hlp = it.next().split(" ");
1172 if (hlp.size() < 5) continue;
1173 _mountPointsTable->insertRow(iRow);
1174
1175 QUrl url(hlp[0]);
1176
1177 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1178 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1179 QString nmea(hlp[4]);
1180 if (hlp[5] == "S") {
1181 fullPath = hlp[0].replace(0,2,"");
1182 }
1183 QString ntripVersion = "2";
1184 if (hlp.size() >= 6) {
1185 ntripVersion = (hlp[5]);
1186 }
1187
1188 QTableWidgetItem* it;
1189 it = new QTableWidgetItem(url.userInfo());
1190 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1191 _mountPointsTable->setItem(iRow, 0, it);
1192
1193 it = new QTableWidgetItem(fullPath);
1194 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1195 _mountPointsTable->setItem(iRow, 1, it);
1196
1197 it = new QTableWidgetItem(format);
1198 _mountPointsTable->setItem(iRow, 2, it);
1199
1200 if (nmea == "yes") {
1201 it = new QTableWidgetItem(latitude);
1202 _mountPointsTable->setItem(iRow, 3, it);
1203 it = new QTableWidgetItem(longitude);
1204 _mountPointsTable->setItem(iRow, 4, it);
1205 } else {
1206 it = new QTableWidgetItem(latitude);
1207 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1208 _mountPointsTable->setItem(iRow, 3, it);
1209 it = new QTableWidgetItem(longitude);
1210 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1211 _mountPointsTable->setItem(iRow, 4, it);
1212 }
1213
1214 it = new QTableWidgetItem(nmea);
1215 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1216 _mountPointsTable->setItem(iRow, 5, it);
1217
1218 it = new QTableWidgetItem(ntripVersion);
1219 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1220 _mountPointsTable->setItem(iRow, 6, it);
1221
1222 bncTableItem* bncIt = new bncTableItem();
1223 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1224 _mountPointsTable->setItem(iRow, 7, bncIt);
1225
1226 iRow++;
1227 }
1228
1229 _mountPointsTable->sortItems(1);
1230}
1231
1232// Retrieve Table
1233////////////////////////////////////////////////////////////////////////////
1234void bncWindow::slotAddMountPoints() {
1235
1236 bncSettings settings;
1237 QString proxyHost = settings.value("proxyHost").toString();
1238 int proxyPort = settings.value("proxyPort").toInt();
1239 if (proxyHost != _proxyHostLineEdit->text() ||
1240 proxyPort != _proxyPortLineEdit->text().toInt()) {
1241 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1242 "changed. Use the new ones?",
1243 QMessageBox::Yes, QMessageBox::No,
1244 QMessageBox::NoButton);
1245 if (iRet == QMessageBox::Yes) {
1246 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1247 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1248 settings.sync();
1249 }
1250 }
1251
1252 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1253 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1254 settings.sync();
1255
1256 QMessageBox msgBox;
1257 msgBox.setIcon(QMessageBox::Question);
1258 msgBox.setWindowTitle("Add Stream");
1259 msgBox.setText("Add stream(s) coming from:");
1260
1261 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1262 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1263 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1264 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1265 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1266
1267 msgBox.exec();
1268
1269 if (msgBox.clickedButton() == buttonNtrip) {
1270 bncTableDlg* dlg = new bncTableDlg(this);
1271 dlg->move(this->pos().x()+50, this->pos().y()+50);
1272 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1273 this, SLOT(slotNewMountPoints(QStringList*)));
1274 dlg->exec();
1275 delete dlg;
1276 } else if (msgBox.clickedButton() == buttonIP) {
1277 bncIpPort* ipp = new bncIpPort(this);
1278 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1279 this, SLOT(slotNewMountPoints(QStringList*)));
1280 ipp->exec();
1281 delete ipp;
1282 } else if (msgBox.clickedButton() == buttonUDP) {
1283 bncUdpPort* udp = new bncUdpPort(this);
1284 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1285 this, SLOT(slotNewMountPoints(QStringList*)));
1286 udp->exec();
1287 delete udp;
1288 } else if (msgBox.clickedButton() == buttonSerial) {
1289 bncSerialPort* sep = new bncSerialPort(this);
1290 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1291 this, SLOT(slotNewMountPoints(QStringList*)));
1292 sep->exec();
1293 delete sep;
1294 } else if (msgBox.clickedButton() == buttonCancel) {
1295 // Cancel
1296 }
1297}
1298
1299// Delete Selected Mount Points
1300////////////////////////////////////////////////////////////////////////////
1301void bncWindow::slotDeleteMountPoints() {
1302
1303 int nRows = _mountPointsTable->rowCount();
1304 bool flg[nRows];
1305 for (int iRow = 0; iRow < nRows; iRow++) {
1306 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1307 flg[iRow] = true;
1308 }
1309 else {
1310 flg[iRow] = false;
1311 }
1312 }
1313 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1314 if (flg[iRow]) {
1315 _mountPointsTable->removeRow(iRow);
1316 }
1317 }
1318 _actDeleteMountPoints->setEnabled(false);
1319
1320 if (_mountPointsTable->rowCount() == 0) {
1321 _actGetData->setEnabled(false);
1322 }
1323}
1324
1325// New Mount Points Selected
1326////////////////////////////////////////////////////////////////////////////
1327void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1328 int iRow = 0;
1329 QListIterator<QString> it(*mountPoints);
1330 while (it.hasNext()) {
1331 QStringList hlp = it.next().split(" ");
1332 QUrl url(hlp[0]);
1333 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1334 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1335 QString nmea(hlp[4]);
1336 if (hlp[5] == "S") {
1337 fullPath = hlp[0].replace(0,2,"");
1338 }
1339 QString ntripVersion = "2";
1340 if (hlp.size() >= 6) {
1341 ntripVersion = (hlp[5]);
1342 }
1343
1344 _mountPointsTable->insertRow(iRow);
1345
1346 QTableWidgetItem* it;
1347 it = new QTableWidgetItem(url.userInfo());
1348 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1349 _mountPointsTable->setItem(iRow, 0, it);
1350
1351 it = new QTableWidgetItem(fullPath);
1352 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1353 _mountPointsTable->setItem(iRow, 1, it);
1354
1355 it = new QTableWidgetItem(format);
1356 _mountPointsTable->setItem(iRow, 2, it);
1357
1358 if (nmea == "yes") {
1359 it = new QTableWidgetItem(latitude);
1360 _mountPointsTable->setItem(iRow, 3, it);
1361 it = new QTableWidgetItem(longitude);
1362 _mountPointsTable->setItem(iRow, 4, it);
1363 } else {
1364 it = new QTableWidgetItem(latitude);
1365 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1366 _mountPointsTable->setItem(iRow, 3, it);
1367 it = new QTableWidgetItem(longitude);
1368 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1369 _mountPointsTable->setItem(iRow, 4, it);
1370 }
1371
1372 it = new QTableWidgetItem(nmea);
1373 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1374 _mountPointsTable->setItem(iRow, 5, it);
1375
1376 it = new QTableWidgetItem(ntripVersion);
1377 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1378 _mountPointsTable->setItem(iRow, 6, it);
1379
1380 bncTableItem* bncIt = new bncTableItem();
1381 _mountPointsTable->setItem(iRow, 7, bncIt);
1382
1383 iRow++;
1384 }
1385 _mountPointsTable->hideColumn(0);
1386 _mountPointsTable->sortItems(1);
1387 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1388 _actGetData->setEnabled(true);
1389 }
1390 delete mountPoints;
1391}
1392
1393// Save Options
1394////////////////////////////////////////////////////////////////////////////
1395void bncWindow::slotSaveOptions() {
1396
1397 QStringList mountPoints;
1398 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1399
1400 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1401 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1402 "@" + _mountPointsTable->item(iRow, 1)->text() );
1403
1404 mountPoints.append(url.toString() + " " +
1405 _mountPointsTable->item(iRow, 2)->text()
1406 + " " + _mountPointsTable->item(iRow, 3)->text()
1407 + " " + _mountPointsTable->item(iRow, 4)->text()
1408 + " " + _mountPointsTable->item(iRow, 5)->text()
1409 + " " + _mountPointsTable->item(iRow, 6)->text());
1410 } else {
1411 mountPoints.append(
1412 "//" + _mountPointsTable->item(iRow, 1)->text()
1413 + " " + _mountPointsTable->item(iRow, 2)->text()
1414 + " " + _mountPointsTable->item(iRow, 3)->text()
1415 + " " + _mountPointsTable->item(iRow, 4)->text()
1416 + " " + _mountPointsTable->item(iRow, 5)->text()
1417 + " " + _mountPointsTable->item(iRow, 6)->text());
1418 }
1419 }
1420
1421 QStringList combineStreams;
1422 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1423 QString hlp;
1424 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1425 if (_cmbTable->item(iRow, iCol)) {
1426 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1427 }
1428 }
1429 if (!hlp.isEmpty()) {
1430 combineStreams << hlp;
1431 }
1432 }
1433
1434 QStringList uploadMountpointsOut;
1435 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1436 QString hlp;
1437 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1438 if (_uploadTable->cellWidget(iRow, iCol) &&
1439 (iCol == 3 || iCol == 4 || iCol == 5)) {
1440 if (iCol == 3) {
1441 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1442 hlp += passwd->text() + ",";
1443 }
1444 else if (iCol == 4) {
1445 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1446 hlp += system->currentText() + ",";
1447 }
1448 else if (iCol == 5) {
1449 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1450 QString state; state.setNum(com->checkState());
1451 hlp += state + ",";
1452 }
1453 }
1454 else if (_uploadTable->item(iRow, iCol)) {
1455 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1456 }
1457 }
1458 if (!hlp.isEmpty()) {
1459 uploadMountpointsOut << hlp;
1460 }
1461 }
1462
1463 bncSettings settings;
1464
1465 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1466 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1467 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1468 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1469 settings.setValue("binSampl", _binSamplSpinBox->value());
1470 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1471 settings.setValue("corrPath", _corrPathLineEdit->text());
1472 settings.setValue("corrPort", _corrPortLineEdit->text());
1473 settings.setValue("corrTime", _corrTimeSpinBox->value());
1474 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1475 settings.setValue("ephPath", _ephPathLineEdit->text());
1476 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1477 settings.setValue("logFile", _logFileLineEdit->text());
1478 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1479 settings.setValue("miscMount", _miscMountLineEdit->text());
1480 settings.setValue("pppMount", _pppMountLineEdit->text());
1481 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1482 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1483 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1484 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1485 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1486 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1487 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1488 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1489 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1490 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1491 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1492 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1493 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1494 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1495 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1496 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1497 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1498 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1499 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1500 settings.setValue("pppSync", _pppSync->text());
1501 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1502 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1503 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1504 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1505 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1506 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1507 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1508 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1509 settings.setValue("mountPoints", mountPoints);
1510 settings.setValue("obsRate", _obsRateComboBox->currentText());
1511 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1512 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1513 settings.setValue("outFile", _outFileLineEdit->text());
1514 settings.setValue("outPort", _outPortLineEdit->text());
1515 settings.setValue("outUPort", _outUPortLineEdit->text());
1516 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1517 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1518 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1519 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1520 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1521 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1522 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1523 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1524 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1525 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1526 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1527 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1528 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1529 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1530 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1531 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1532 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1533 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1534 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1535 settings.setValue("serialParity", _serialParityComboBox->currentText());
1536 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1537 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1538 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1539 settings.setValue("startTab", _aogroup->currentIndex());
1540 settings.setValue("statusTab", _loggroup->currentIndex());
1541 settings.setValue("waitTime", _waitTimeSpinBox->value());
1542 if (!combineStreams.isEmpty()) {
1543 settings.setValue("combineStreams", combineStreams);
1544 }
1545 else {
1546 settings.setValue("combineStreams", "");
1547 }
1548 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1549 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1550
1551 if (!uploadMountpointsOut.isEmpty()) {
1552 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1553 }
1554 else {
1555 settings.setValue("uploadMountpointsOut", "");
1556 }
1557 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1558 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1559 settings.setValue("uploadSamplOrb", _uploadSamplOrbSpinBox->value());
1560
1561 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1562 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1563 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1564 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1565 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1566
1567 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1568 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1569 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1570 settings.setValue("postOutFile", _postOutLineEdit->text());
1571
1572 if (_caster) {
1573 _caster->slotReadMountPoints();
1574 }
1575 settings.sync();
1576}
1577
1578// All get slots terminated
1579////////////////////////////////////////////////////////////////////////////
1580void bncWindow::slotGetThreadsFinished() {
1581 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1582 delete _caster; _caster = 0;
1583 delete _casterEph; _casterEph = 0;
1584 _actGetData->setEnabled(true);
1585 _actStop->setEnabled(false);
1586}
1587
1588// Retrieve Data
1589////////////////////////////////////////////////////////////////////////////
1590void bncWindow::slotGetData() {
1591 slotSaveOptions();
1592
1593 _bncFigurePPP->reset();
1594
1595 _actDeleteMountPoints->setEnabled(false);
1596 _actGetData->setEnabled(false);
1597 _actStop->setEnabled(true);
1598
1599 _caster = new bncCaster(_outFileLineEdit->text(),
1600 _outPortLineEdit->text().toInt());
1601
1602 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1603 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1604 ((bncApp*)qApp)->initCombination();
1605
1606 connect(_caster, SIGNAL(getThreadsFinished()),
1607 this, SLOT(slotGetThreadsFinished()));
1608
1609 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1610 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1611
1612 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1613
1614 bncSettings settings;
1615
1616 QDir rnxdir(settings.value("rnxPath").toString());
1617 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1618
1619 QString rnx_file = settings.value("rnxScript").toString();
1620 if ( !rnx_file.isEmpty() ) {
1621 QFile rnxfile(settings.value("rnxScript").toString());
1622 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1623 }
1624
1625 QDir ephdir(settings.value("ephPath").toString());
1626 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1627
1628 QDir corrdir(settings.value("corrPath").toString());
1629 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1630
1631 QString advise_file = settings.value("adviseScript").toString();
1632 if ( !advise_file.isEmpty() ) {
1633 QFile advisefile(settings.value("adviseScript").toString());
1634 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1635 }
1636
1637 QString ant_file = settings.value("pppAntex").toString();
1638 if ( !ant_file.isEmpty() ) {
1639 QFile anxfile(settings.value("pppAntex").toString());
1640 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1641 }
1642
1643 _caster->slotReadMountPoints();
1644
1645 _casterEph = new bncEphUploadCaster();
1646 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1647 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1648}
1649
1650// Retrieve Data
1651////////////////////////////////////////////////////////////////////////////
1652void bncWindow::slotStop() {
1653 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1654 QMessageBox::Yes, QMessageBox::No,
1655 QMessageBox::NoButton);
1656 if (iRet == QMessageBox::Yes) {
1657 ((bncApp*)qApp)->stopCombination();
1658 delete _caster; _caster = 0;
1659 delete _casterEph; _casterEph = 0;
1660 _actGetData->setEnabled(true);
1661 _actStop->setEnabled(false);
1662 }
1663}
1664
1665// Close Application gracefully
1666////////////////////////////////////////////////////////////////////////////
1667void bncWindow::closeEvent(QCloseEvent* event) {
1668
1669 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1670 QMessageBox::Yes, QMessageBox::No,
1671 QMessageBox::Cancel);
1672
1673 if (iRet == QMessageBox::Cancel) {
1674 event->ignore();
1675 return;
1676 }
1677 else if (iRet == QMessageBox::Yes) {
1678 slotSaveOptions();
1679 }
1680
1681 QMainWindow::closeEvent(event);
1682}
1683
1684// User changed the selection of mountPoints
1685////////////////////////////////////////////////////////////////////////////
1686void bncWindow::slotSelectionChanged() {
1687 if (_mountPointsTable->selectedItems().isEmpty()) {
1688 _actDeleteMountPoints->setEnabled(false);
1689 }
1690 else {
1691 _actDeleteMountPoints->setEnabled(true);
1692 }
1693}
1694
1695// Display Program Messages
1696////////////////////////////////////////////////////////////////////////////
1697void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1698
1699#ifdef DEBUG_RTCM2_2021
1700 const int maxBufferSize = 1000;
1701#else
1702 const int maxBufferSize = 10000;
1703#endif
1704
1705 if (! showOnScreen ) {
1706 return;
1707 }
1708
1709 QString txt = _log->toPlainText() + "\n" +
1710 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1711 _log->clear();
1712 _log->append(txt.right(maxBufferSize));
1713}
1714
1715// About Message
1716////////////////////////////////////////////////////////////////////////////
1717void bncWindow::slotAbout() {
1718 new bncAboutDlg(0);
1719}
1720
1721//Flowchart
1722////////////////////////////////////////////////////////////////////////////
1723void bncWindow::slotFlowchart() {
1724 new bncFlowchartDlg(0);
1725}
1726
1727// Help Window
1728////////////////////////////////////////////////////////////////////////////
1729void bncWindow::slotHelp() {
1730 QUrl url;
1731 url.setPath(":bnchelp.html");
1732 new bncHlpDlg(0, url);
1733}
1734
1735// Select Fonts
1736////////////////////////////////////////////////////////////////////////////
1737void bncWindow::slotFontSel() {
1738 bool ok;
1739 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1740 if (ok) {
1741 bncSettings settings;
1742 settings.setValue("font", newFont.toString());
1743 QApplication::setFont(newFont);
1744 int ww = QFontMetrics(newFont).width('w');
1745 setMinimumSize(60*ww, 80*ww);
1746 resize(60*ww, 80*ww);
1747 }
1748}
1749
1750// Whats This Help
1751void bncWindow::slotWhatsThis() {
1752 QWhatsThis::enterWhatsThisMode();
1753}
1754
1755//
1756////////////////////////////////////////////////////////////////////////////
1757void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1758 _bncFigure->updateMountPoints();
1759 _bncFigureLate->updateMountPoints();
1760
1761 populateMountPointsTable();
1762 bncSettings settings;
1763 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1764 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1765 QListIterator<bncGetThread*> iTh(threads);
1766 while (iTh.hasNext()) {
1767 bncGetThread* thread = iTh.next();
1768 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1769 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1770 "@" + _mountPointsTable->item(iRow, 1)->text() );
1771 if (url == thread->mountPoint() &&
1772 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1773 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1774 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1775 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1776 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1777 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1778 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1779 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1780 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1781 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1782 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1783 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1784 disconnect(thread,
1785 SIGNAL(newPosition(bncTime, double, double, double)),
1786 _bncFigurePPP,
1787 SLOT(slotNewPosition(bncTime, double, double, double)));
1788 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1789 _bncFigurePPP,
1790 SLOT(slotNewPosition(bncTime, double, double, double)));
1791 }
1792 break;
1793 }
1794 }
1795 }
1796}
1797
1798//
1799////////////////////////////////////////////////////////////////////////////
1800void bncWindow::CreateMenu() {
1801 // Create Menus
1802 // ------------
1803 _menuFile = menuBar()->addMenu(tr("&File"));
1804 _menuFile->addAction(_actFontSel);
1805 _menuFile->addSeparator();
1806 _menuFile->addAction(_actSaveOpt);
1807 _menuFile->addSeparator();
1808 _menuFile->addAction(_actQuit);
1809
1810 _menuHlp = menuBar()->addMenu(tr("&Help"));
1811 _menuHlp->addAction(_actHelp);
1812 _menuHlp->addAction(_actFlowchart);
1813 _menuHlp->addAction(_actAbout);
1814}
1815
1816// Toolbar
1817////////////////////////////////////////////////////////////////////////////
1818void bncWindow::AddToolbar() {
1819 // Tool (Command) Bar
1820 // ------------------
1821 QToolBar* toolBar = new QToolBar;
1822 addToolBar(Qt::BottomToolBarArea, toolBar);
1823 toolBar->setMovable(false);
1824 toolBar->addAction(_actAddMountPoints);
1825 toolBar->addAction(_actDeleteMountPoints);
1826 toolBar->addAction(_actGetData);
1827 toolBar->addAction(_actStop);
1828 toolBar->addAction(_actPostProcessing);
1829 _postProgressLabel = new QLabel(" Progress");
1830 toolBar->addWidget(_postProgressLabel);
1831 toolBar->addWidget(_postProgressBar);
1832 enableWidget(false, _postProgressLabel);
1833 toolBar->addWidget(new QLabel(" "));
1834 toolBar->addAction(_actwhatsthis);
1835}
1836
1837// About
1838////////////////////////////////////////////////////////////////////////////
1839bncAboutDlg::bncAboutDlg(QWidget* parent) :
1840 QDialog(parent) {
1841
1842 QTextBrowser* tb = new QTextBrowser;
1843 QUrl url; url.setPath(":bncabout.html");
1844 tb->setSource(url);
1845 tb->setReadOnly(true);
1846
1847 int ww = QFontMetrics(font()).width('w');
1848 QPushButton* _closeButton = new QPushButton("Close");
1849 _closeButton->setMaximumWidth(10*ww);
1850 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1851
1852 QGridLayout* dlgLayout = new QGridLayout();
1853 QLabel* img = new QLabel();
1854 img->setPixmap(QPixmap(":ntrip-logo.png"));
1855 dlgLayout->addWidget(img, 0,0);
1856 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1857 dlgLayout->addWidget(tb,1,0,1,2);
1858 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1859
1860 setLayout(dlgLayout);
1861 resize(60*ww, 60*ww);
1862 setWindowTitle("About BNC");
1863 show();
1864}
1865
1866//
1867////////////////////////////////////////////////////////////////////////////
1868bncAboutDlg::~bncAboutDlg() {
1869};
1870
1871// Flowchart
1872////////////////////////////////////////////////////////////////////////////
1873bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1874 QDialog(parent) {
1875
1876 int ww = QFontMetrics(font()).width('w');
1877 QPushButton* _closeButton = new QPushButton("Close");
1878 _closeButton->setMaximumWidth(10*ww);
1879 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1880
1881 QGridLayout* dlgLayout = new QGridLayout();
1882 QLabel* img = new QLabel();
1883 img->setPixmap(QPixmap(":bncflowchart.png"));
1884 dlgLayout->addWidget(img, 0,0);
1885 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1886
1887 setLayout(dlgLayout);
1888 setWindowTitle("Flow Chart");
1889 show();
1890}
1891
1892//
1893////////////////////////////////////////////////////////////////////////////
1894bncFlowchartDlg::~bncFlowchartDlg() {
1895};
1896
1897// Enable/Disable Widget (and change its color)
1898////////////////////////////////////////////////////////////////////////////
1899void bncWindow::enableWidget(bool enable, QWidget* widget) {
1900 const static QPalette paletteWhite(QColor(255, 255, 255));
1901 const static QPalette paletteGray(QColor(230, 230, 230));
1902
1903 widget->setEnabled(enable);
1904 if (enable) {
1905 widget->setPalette(paletteWhite);
1906 }
1907 else {
1908 widget->setPalette(paletteGray);
1909 }
1910}
1911
1912// Bnc Text
1913////////////////////////////////////////////////////////////////////////////
1914void bncWindow::slotBncTextChanged(){
1915
1916 bool enable = true;
1917
1918 // Proxy
1919 //------
1920 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1921 enable = !_proxyHostLineEdit->text().isEmpty();
1922 enableWidget(enable, _proxyPortLineEdit);
1923 }
1924
1925 // RINEX Observations
1926 // ------------------
1927 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1928 enable = !_rnxPathLineEdit->text().isEmpty();
1929 enableWidget(enable, _rnxSamplSpinBox);
1930 enableWidget(enable, _rnxSkelLineEdit);
1931 enableWidget(enable, _rnxScrpLineEdit);
1932 enableWidget(enable, _rnxV3CheckBox);
1933 enableWidget(enable, _rnxIntrComboBox);
1934 }
1935
1936 // RINEX Ephemeris
1937 // ---------------
1938 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1939 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
1940 enableWidget(enable, _ephIntrComboBox);
1941 enableWidget(enable, _ephV3CheckBox);
1942 }
1943
1944 // Broadcast Corrections
1945 // ---------------------
1946 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1947 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
1948 enableWidget(enable, _corrIntrComboBox);
1949 }
1950
1951 // Feed Engine
1952 // -----------
1953 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1954 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
1955 enableWidget(enable, _waitTimeSpinBox);
1956 enableWidget(enable, _binSamplSpinBox);
1957 }
1958
1959 // Serial Output
1960 // -------------
1961 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1962 sender() == _serialAutoNMEAComboBox) {
1963 enable = !_serialMountPointLineEdit->text().isEmpty();
1964 enableWidget(enable, _serialPortNameLineEdit);
1965 enableWidget(enable, _serialBaudRateComboBox);
1966 enableWidget(enable, _serialParityComboBox);
1967 enableWidget(enable, _serialDataBitsComboBox);
1968 enableWidget(enable, _serialStopBitsComboBox);
1969 enableWidget(enable, _serialFlowControlComboBox);
1970 enableWidget(enable, _serialAutoNMEAComboBox);
1971
1972 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
1973 enableWidget(enable2, _serialFileNMEALineEdit);
1974 }
1975
1976 // Outages
1977 // -------
1978 if (sender() == 0 || sender() == _obsRateComboBox) {
1979 enable = !_obsRateComboBox->currentText().isEmpty();
1980 enableWidget(enable, _adviseFailSpinBox);
1981 enableWidget(enable, _adviseRecoSpinBox);
1982 enableWidget(enable, _adviseScriptLineEdit);
1983 }
1984
1985 // Miscellaneous
1986 // -------------
1987 if (sender() == 0 || sender() == _miscMountLineEdit) {
1988 enable = !_miscMountLineEdit->text().isEmpty();
1989 enableWidget(enable, _perfIntrComboBox);
1990 enableWidget(enable, _scanRTCMCheckBox);
1991 }
1992
1993 // PPP Client
1994 // ----------
1995 if (sender() == 0
1996 || sender() == _pppMountLineEdit
1997 || sender() == _pppCorrMountLineEdit
1998 || sender() == _pppRefCrdXLineEdit
1999 || sender() == _pppRefCrdYLineEdit
2000 || sender() == _pppRefCrdZLineEdit
2001 || sender() == _pppRefdNLineEdit
2002 || sender() == _pppRefdELineEdit
2003 || sender() == _pppRefdULineEdit
2004 || sender() == _pppSync
2005 || sender() == _pppSPPComboBox
2006 || sender() == _pppQuickStartLineEdit
2007 || sender() == _pppEstTropoCheckBox
2008 || sender() == _pppUsePhaseCheckBox
2009 || sender() == _pppAntexFileChooser ) {
2010
2011 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2012 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "SPP") ||
2013 (_pppSPPComboBox->currentText() == "Post-Processing");
2014
2015 enableWidget(enable, _pppNMEALineEdit);
2016 enableWidget(enable, _pppNMEAPortLineEdit);
2017 enableWidget(enable, _pppRefCrdXLineEdit);
2018 enableWidget(enable, _pppRefCrdYLineEdit);
2019 enableWidget(enable, _pppRefCrdZLineEdit);
2020 enableWidget(enable, _pppRefdNLineEdit);
2021 enableWidget(enable, _pppRefdELineEdit);
2022 enableWidget(enable, _pppRefdULineEdit);
2023 enableWidget(enable, _pppUsePhaseCheckBox);
2024 enableWidget(enable, _pppPlotCoordinates);
2025 enableWidget(enable, _pppEstTropoCheckBox);
2026 enableWidget(enable, _pppGLONASSCheckBox);
2027 enableWidget(enable, _pppGalileoCheckBox);
2028 enableWidget(enable, _pppAntexFileChooser);
2029 enableWidget(enable, _pppSigCLineEdit);
2030 enableWidget(enable, _pppSigCrd0);
2031 enableWidget(enable, _pppSigCrdP);
2032
2033 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2034 !_pppRefCrdYLineEdit->text().isEmpty() &&
2035 !_pppRefCrdZLineEdit->text().isEmpty();
2036
2037 enableWidget(enable2, _pppAverageLineEdit);
2038 enableWidget(enable2, _pppQuickStartLineEdit);
2039
2040 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2041 enableWidget(enable3, _pppMaxSolGapLineEdit);
2042
2043 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2044 enableWidget(enable4, _pppAntennaLineEdit);
2045 enableWidget(enable4, _pppApplySatAntCheckBox);
2046
2047 bool enable5 = enable && _pppEstTropoCheckBox->isChecked() && !_pppMountLineEdit->text().isEmpty();
2048 enableWidget(enable5, _pppSigTrp0);
2049 enableWidget(enable5, _pppSigTrpP);
2050
2051 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2052 enableWidget(enable6, _pppSigPLineEdit);
2053
2054 bool enable7 = enable && _pppSPPComboBox->currentText() == "PPP";
2055 enableWidget(enable7, _pppSync);
2056 enableWidget(enable7, _pppCorrMountLineEdit);
2057
2058 bool enable8 = _pppSPPComboBox->currentText() == "Post-Processing";
2059 enableWidget(enable8, _postObsFileChooser);
2060 enableWidget(enable8, _postNavFileChooser);
2061 enableWidget(enable8, _postCorrFileChooser);
2062 enableWidget(enable8, _postOutLineEdit);
2063 _actPostProcessing->setEnabled(enable8);
2064
2065 enableWidget(!enable8, _pppMountLineEdit);
2066 }
2067}
2068
2069//
2070////////////////////////////////////////////////////////////////////////////
2071void bncWindow::slotAddCmbRow() {
2072 int iRow = _cmbTable->rowCount();
2073 _cmbTable->insertRow(iRow);
2074 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2075 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2076 }
2077}
2078
2079//
2080////////////////////////////////////////////////////////////////////////////
2081void bncWindow::slotDelCmbRow() {
2082 int nRows = _cmbTable->rowCount();
2083 bool flg[nRows];
2084 for (int iRow = 0; iRow < nRows; iRow++) {
2085 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2086 flg[iRow] = true;
2087 }
2088 else {
2089 flg[iRow] = false;
2090 }
2091 }
2092 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2093 if (flg[iRow]) {
2094 _cmbTable->removeRow(iRow);
2095 }
2096 }
2097}
2098
2099//
2100////////////////////////////////////////////////////////////////////////////
2101void bncWindow::populateCmbTable() {
2102
2103 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2104 _cmbTable->removeRow(iRow);
2105 }
2106
2107 bncSettings settings;
2108
2109 int iRow = -1;
2110 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2111 while (it.hasNext()) {
2112 QStringList hlp = it.next().split(" ");
2113 if (hlp.size() > 2) {
2114 ++iRow;
2115 _cmbTable->insertRow(iRow);
2116 }
2117 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2118 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2119 }
2120 }
2121}
2122
2123//
2124////////////////////////////////////////////////////////////////////////////
2125void bncWindow::slotAddUploadRow() {
2126 int iRow = _uploadTable->rowCount();
2127 _uploadTable->insertRow(iRow);
2128 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2129 if (iCol == 3) {
2130 QLineEdit* passwd = new QLineEdit();
2131 passwd->setFrame(false);
2132 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2133 _uploadTable->setCellWidget(iRow, iCol, passwd);
2134 }
2135 else if (iCol == 4) {
2136 QComboBox* system = new QComboBox();
2137 system->setEditable(false);
2138 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2139 system->setFrame(false);
2140 _uploadTable->setCellWidget(iRow, iCol, system);
2141 }
2142 else if (iCol == 5) {
2143 QCheckBox* com = new QCheckBox();
2144 _uploadTable->setCellWidget(iRow, iCol, com);
2145 }
2146 else if (iCol == 8) {
2147 bncTableItem* bncIt = new bncTableItem();
2148 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2149 _uploadTable->setItem(iRow, iCol, bncIt);
2150 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2151 }
2152 else {
2153 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2154 }
2155 }
2156}
2157
2158//
2159////////////////////////////////////////////////////////////////////////////
2160void bncWindow::slotDelUploadRow() {
2161 ((bncApp*)qApp)->_uploadTableItems.clear();
2162 int nRows = _uploadTable->rowCount();
2163 bool flg[nRows];
2164 for (int iRow = 0; iRow < nRows; iRow++) {
2165 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2166 flg[iRow] = true;
2167 }
2168 else {
2169 flg[iRow] = false;
2170 }
2171 }
2172 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2173 if (flg[iRow]) {
2174 _uploadTable->removeRow(iRow);
2175 }
2176 }
2177 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2178 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2179 (bncTableItem*) _uploadTable->item(iRow, 8);
2180 }
2181}
2182
2183//
2184////////////////////////////////////////////////////////////////////////////
2185void bncWindow::populateUploadTable() {
2186 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2187 _uploadTable->removeRow(iRow);
2188 }
2189
2190 bncSettings settings;
2191
2192 int iRow = -1;
2193 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2194 while (it.hasNext()) {
2195 QStringList hlp = it.next().split(",");
2196 if (hlp.size() > 6) {
2197 ++iRow;
2198 _uploadTable->insertRow(iRow);
2199 }
2200 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2201 if (iCol == 3) {
2202 QLineEdit* passwd = new QLineEdit();
2203 passwd->setFrame(false);
2204 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2205 passwd->setText(hlp[iCol]);
2206 _uploadTable->setCellWidget(iRow, iCol, passwd);
2207 }
2208 else if (iCol == 4) {
2209 QComboBox* system = new QComboBox();
2210 system->setEditable(false);
2211 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2212 system->setFrame(false);
2213 system->setCurrentIndex(system->findText(hlp[iCol]));
2214 _uploadTable->setCellWidget(iRow, iCol, system);
2215 }
2216 else if (iCol == 5) {
2217 QCheckBox* com = new QCheckBox();
2218 if (hlp[iCol].toInt() == Qt::Checked) {
2219 com->setCheckState(Qt::Checked);
2220 }
2221 _uploadTable->setCellWidget(iRow, iCol, com);
2222 }
2223 else if (iCol == 8) {
2224 bncTableItem* bncIt = new bncTableItem();
2225 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2226 _uploadTable->setItem(iRow, iCol, bncIt);
2227 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2228 }
2229 else {
2230 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2231 }
2232 }
2233 }
2234}
2235
2236//
2237////////////////////////////////////////////////////////////////////////////
2238void bncWindow::slotSetUploadTrafo() {
2239 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2240 dlg->exec();
2241 delete dlg;
2242}
2243
2244// Post-Processing
2245////////////////////////////////////////////////////////////////////////////
2246void bncWindow::slotPostProcessing() {
2247 _actPostProcessing->setEnabled(false);
2248 slotSaveOptions();
2249 _postProgressBar->reset();
2250 _postProgressBar->show();
2251 enableWidget(true, _postProgressLabel);
2252
2253 bncSettings settings;
2254
2255 t_postInput input;
2256 input.obsFileName = settings.value("postObsFile").toString();
2257 input.navFileName = settings.value("postNavFile").toString();
2258 input.corrFileName = settings.value("postcorrFile").toString();
2259
2260 QFuture<void> future = QtConcurrent::run(postProcessing, input);
2261
2262 enableWidget(false, _postProgressLabel);
2263 _postProgressBar->hide();
2264 _actPostProcessing->setEnabled(true);
2265}
Note: See TracBrowser for help on using the repository browser.