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

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