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

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