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

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