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

Last change on this file since 4179 was 4179, checked in by mervart, 12 years ago
File size: 137.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 "reqcdlg.h"
65#ifdef USE_POSTPROCESSING
66# include "rinex/bncpostprocess.h"
67# include "rinex/reqcedit.h"
68# include "rinex/reqcanalyze.h"
69#endif
70
71using namespace std;
72
73// Constructor
74////////////////////////////////////////////////////////////////////////////
75bncWindow::bncWindow() {
76
77 _caster = 0;
78 _casterEph = 0;
79
80 _bncFigure = new bncFigure(this);
81 _bncFigureLate = new bncFigureLate(this);
82 _bncFigurePPP = new bncFigurePPP(this);
83 _runningRealTime = false;
84 _runningPostProcessingPPP = false;
85 _runningPostProcessingReqc = false;
86
87 _pppSPPComboBox = 0; // necessary for enableStartStop()
88 _reqcActionComboBox = 0; // necessary for enableStartStop()
89
90 int ww = QFontMetrics(this->font()).width('w');
91
92 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
93
94 setMinimumSize(85*ww, 65*ww);
95
96 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
97
98 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
99 this, SLOT(slotWindowMessage(QByteArray,bool)));
100
101 // Create Actions
102 // --------------
103 _actHelp = new QAction(tr("&Help Contents"),this);
104 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
105
106 _actAbout = new QAction(tr("&About BNC"),this);
107 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
108
109 _actFlowchart = new QAction(tr("&Flow Chart"),this);
110 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
111
112 _actFontSel = new QAction(tr("Select &Font"),this);
113 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
114
115 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
116 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
117
118 _actQuit = new QAction(tr("&Quit"),this);
119 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
120
121 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
122 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
123
124 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
125 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
126 _actDeleteMountPoints->setEnabled(false);
127
128 _actStart = new QAction(tr("Sta&rt"),this);
129 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
130
131 _actStop = new QAction(tr("Sto&p"),this);
132 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
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 // Network 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(8*ww);
363 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
364 _pppMountLineEdit->setMinimumWidth(8*ww);
365 _pppCorrMountLineEdit->setMinimumWidth(8*ww);
366 _pppCorrMountLineEdit->setMaximumWidth(8*ww);
367 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
368 _pppNMEALineEdit->setMinimumWidth(15*ww);
369 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
370 _pppNMEAPortLineEdit->setMaximumWidth(8*ww);
371 _pppNMEAPortLineEdit->setMinimumWidth(8*ww);
372 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
373 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
374 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
375 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
376 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
377 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
378 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
379 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
380 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
381 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
382 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
383 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
384 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
385 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
386 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
387 _pppSync = new QLineEdit(settings.value("pppSync").toString());
388 _pppAntexFileChooser = new qtFileChooser;
389 _pppAntexFileChooser->setMinimumWidth(12*ww);
390 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
391 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
392
393 _pppSPPComboBox = new QComboBox();
394 _pppSPPComboBox->setEditable(false);
395 _pppSPPComboBox->addItems(QString(",Realtime-PPP,Realtime-SPP,Post-Processing").split(","));
396 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
397 if (ik != -1) {
398 _pppSPPComboBox->setCurrentIndex(ik);
399 }
400 _pppUsePhaseCheckBox = new QCheckBox();
401 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
402 settings.value("pppUsePhase").toInt()));
403 _pppEstTropoCheckBox = new QCheckBox();
404 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
405 settings.value("pppEstTropo").toInt()));
406 _pppGLONASSCheckBox = new QCheckBox();
407 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
408 settings.value("pppGLONASS").toInt()));
409 _pppGalileoCheckBox = new QCheckBox();
410 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
411 settings.value("pppGalileo").toInt()));
412
413 _pppPlotCoordinates = new QCheckBox();
414 _pppPlotCoordinates->setCheckState(Qt::CheckState(
415 settings.value("pppPlotCoordinates").toInt()));
416
417 _pppApplySatAntCheckBox = new QCheckBox();
418 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
419 settings.value("pppApplySatAnt").toInt()));
420
421 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
422 this, SLOT(slotBncTextChanged()));
423
424 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
425 this, SLOT(slotBncTextChanged()));
426
427 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
428 this, SLOT(slotBncTextChanged()));
429
430 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
431 this, SLOT(slotBncTextChanged()));
432 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
433 this, SLOT(slotBncTextChanged()));
434 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
435 this, SLOT(slotBncTextChanged()));
436 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
437 this, SLOT(slotBncTextChanged()));
438 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
439 this, SLOT(slotBncTextChanged()));
440 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
441 this, SLOT(slotBncTextChanged()));
442
443 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
444 this, SLOT(slotBncTextChanged()));
445
446 connect(_pppSync, SIGNAL(textChanged(const QString &)),
447 this, SLOT(slotBncTextChanged()));
448
449 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
450 this, SLOT(slotBncTextChanged()));
451
452 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
453 this, SLOT(slotBncTextChanged()));
454
455 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
456 this, SLOT(slotBncTextChanged()));
457
458 // Streams
459 // -------
460 _mountPointsTable = new QTableWidget(0,8);
461
462 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
463 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
464 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
465 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
466 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
467 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
468 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
469 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
470 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
471_mountPointsTable->setHorizontalHeaderLabels(labels);
472 _mountPointsTable->setGridStyle(Qt::NoPen);
473 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
474 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
475 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
476 _mountPointsTable->hideColumn(0);
477 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
478 SLOT(slotSelectionChanged()));
479 populateMountPointsTable();
480
481 _log = new QTextBrowser();
482 _log->setReadOnly(true);
483
484 // Combination
485 // -----------
486 _cmbTable = new QTableWidget(0,3);
487 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
488 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
489 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
490 _cmbTable->setMaximumWidth(30*ww);
491 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
492 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
493 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
494 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
495 _cmbTable->horizontalHeader()->setStretchLastSection(true);
496 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
497
498 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
499
500 _cmbSamplSpinBox = new QSpinBox;
501 _cmbSamplSpinBox->setMinimum(0);
502 _cmbSamplSpinBox->setMaximum(60);
503 _cmbSamplSpinBox->setSingleStep(5);
504 _cmbSamplSpinBox->setMaximumWidth(9*ww);
505 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
506 _cmbSamplSpinBox->setSuffix(" sec");
507
508 QPushButton* addCmbRowButton = new QPushButton("Add Row");
509 QPushButton* delCmbRowButton = new QPushButton("Delete");
510
511 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
512 SLOT(slotBncTextChanged()));
513
514 _cmbMethodComboBox = new QComboBox();
515 _cmbMethodComboBox->setEditable(false);
516 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
517 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
518 if (im != -1) {
519 _cmbMethodComboBox->setCurrentIndex(im);
520 }
521
522 int iRow = _cmbTable->rowCount();
523 if (iRow > 0) {
524 enableWidget(true, _cmbMethodComboBox);
525 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
526 _cmbMaxresLineEdit->setEnabled(true);
527 _cmbSamplSpinBox->setEnabled(true);
528 }
529 else {
530 enableWidget(false, _cmbMethodComboBox);
531 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
532 _cmbMaxresLineEdit->setEnabled(false);
533 _cmbSamplSpinBox->setEnabled(false);
534 }
535
536 // Upload Results
537 // -------------
538 _uploadTable = new QTableWidget(0,12);
539 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, PID, SID, IOD, bytes").split(","));
540 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
541 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
542 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
543 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
544 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
545 _uploadTable->horizontalHeader()->resizeSection( 3, 8*ww);
546 _uploadTable->horizontalHeader()->resizeSection( 4,11*ww);
547 _uploadTable->horizontalHeader()->resizeSection( 5, 4*ww);
548 _uploadTable->horizontalHeader()->resizeSection( 6,15*ww);
549 _uploadTable->horizontalHeader()->resizeSection( 7,15*ww);
550 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
551 _uploadTable->horizontalHeader()->resizeSection( 9, 4*ww);
552 _uploadTable->horizontalHeader()->resizeSection(10, 4*ww);
553 _uploadTable->horizontalHeader()->resizeSection(11,12*ww);
554 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
555 /// _uploadTable->horizontalHeader()->setStretchLastSection(true);
556 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
557
558 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
559 SLOT(slotBncTextChanged()));
560
561 QPushButton* addUploadRowButton = new QPushButton("Add Row");
562 QPushButton* delUploadRowButton = new QPushButton("Del Row");
563 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
564 _uploadIntrComboBox = new QComboBox;
565 _uploadIntrComboBox->setEditable(false);
566 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
567 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
568 if (ii != -1) {
569 _uploadIntrComboBox->setCurrentIndex(ii);
570 }
571
572 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
573 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
574 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
575 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
576 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
577 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
578 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
579
580 _uploadSamplSp3SpinBox = new QSpinBox;
581 _uploadSamplSp3SpinBox->setMinimum(0);
582 _uploadSamplSp3SpinBox->setMaximum(15);
583 _uploadSamplSp3SpinBox->setSingleStep(1);
584 _uploadSamplSp3SpinBox->setMaximumWidth(9*ww);
585 _uploadSamplSp3SpinBox->setValue(settings.value("uploadSamplSp3").toInt());
586 _uploadSamplSp3SpinBox->setSuffix(" min");
587
588 _uploadSamplClkRnxSpinBox = new QSpinBox;
589 _uploadSamplClkRnxSpinBox->setMinimum(0);
590 _uploadSamplClkRnxSpinBox->setMaximum(60);
591 _uploadSamplClkRnxSpinBox->setSingleStep(5);
592 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
593 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
594 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
595
596 int iRowT = _uploadTable->rowCount();
597 if (iRowT > 0) {
598 enableWidget(true, _uploadIntrComboBox);
599 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
600 enableWidget(true, _uploadSamplSp3SpinBox);
601 enableWidget(true, _uploadSamplClkRnxSpinBox);
602 }
603 else {
604 enableWidget(false, _uploadIntrComboBox);
605 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
606 enableWidget(false, _uploadSamplSp3SpinBox);
607 enableWidget(false, _uploadSamplClkRnxSpinBox);
608 }
609
610 // Upload RTCM3 Ephemeris
611 // ----------------------
612 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
613 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
614 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
615 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
616 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
617 _uploadEphSampleSpinBox = new QSpinBox;
618 _uploadEphSampleSpinBox->setMinimum(5);
619 _uploadEphSampleSpinBox->setMaximum(60);
620 _uploadEphSampleSpinBox->setSingleStep(5);
621 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
622 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
623 _uploadEphSampleSpinBox->setSuffix(" sec");
624 _uploadEphBytesCounter = new bncBytesCounter;
625
626 // Canvas with Editable Fields
627 // ---------------------------
628 _canvas = new QWidget;
629 setCentralWidget(_canvas);
630
631 _aogroup = new QTabWidget();
632 QWidget* pgroup = new QWidget();
633 QWidget* ggroup = new QWidget();
634 QWidget* sgroup = new QWidget();
635 QWidget* egroup = new QWidget();
636 QWidget* agroup = new QWidget();
637 QWidget* cgroup = new QWidget();
638 QWidget* ogroup = new QWidget();
639 QWidget* rgroup = new QWidget();
640 QWidget* sergroup = new QWidget();
641 QWidget* pppgroup = new QWidget();
642 QWidget* ppp2group = new QWidget();
643 QWidget* reqcgroup = new QWidget();
644 QWidget* cmbgroup = new QWidget();
645 QWidget* uploadgroup = new QWidget();
646 QWidget* uploadEphgroup = new QWidget();
647 _aogroup->addTab(pgroup,tr("Network"));
648 _aogroup->addTab(ggroup,tr("General"));
649 _aogroup->addTab(ogroup,tr("RINEX Observations"));
650 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
651 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
652 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
653 _aogroup->addTab(sgroup,tr("Feed Engine"));
654 _aogroup->addTab(sergroup,tr("Serial Output"));
655 _aogroup->addTab(agroup,tr("Outages"));
656 _aogroup->addTab(rgroup,tr("Miscellaneous"));
657 _aogroup->addTab(pppgroup,tr("PPP (1)"));
658 _aogroup->addTab(ppp2group,tr("PPP (2)"));
659#ifdef USE_COMBINATION
660 _aogroup->addTab(cmbgroup,tr("Combination"));
661#endif
662 _aogroup->addTab(uploadgroup,tr("Upload (clk)"));
663 _aogroup->addTab(uploadEphgroup,tr("Upload (eph)"));
664
665 // Log Tab
666 // -------
667 _loggroup = new QTabWidget();
668 _loggroup->addTab(_log,tr("Log"));
669 _loggroup->addTab(_bncFigure,tr("Throughput"));
670 _loggroup->addTab(_bncFigureLate,tr("Latency"));
671 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
672
673 // Netowork (Proxy and SSL) Tab
674 // ----------------------------
675 QGridLayout* pLayout = new QGridLayout;
676 pLayout->setColumnMinimumWidth(0,13*ww);
677 _proxyPortLineEdit->setMaximumWidth(9*ww);
678
679 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
680 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
681 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
682 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
683 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
684 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
685 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
686 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
687 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
688 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
689 pLayout->addWidget(new QLabel(" "), 4, 0);
690 pLayout->addWidget(new QLabel(" "), 5, 0);
691 pLayout->addWidget(new QLabel(" "), 6, 0);
692 pgroup->setLayout(pLayout);
693
694 // General Tab
695 // -----------
696 QGridLayout* gLayout = new QGridLayout;
697 gLayout->setColumnMinimumWidth(0,14*ww);
698 _onTheFlyComboBox->setMaximumWidth(9*ww);
699
700 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
701 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
702 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
703 gLayout->addWidget(new QLabel("Append files"), 2, 0);
704 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
705 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
706 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
707 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
708 gLayout->addWidget(_autoStartCheckBox, 4, 1);
709 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
710 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
711 gLayout->addWidget(new QLabel(" "), 6, 0);
712 ggroup->setLayout(gLayout);
713
714 // RINEX Observations
715 // ------------------
716 QGridLayout* oLayout = new QGridLayout;
717 oLayout->setColumnMinimumWidth(0,14*ww);
718 _rnxIntrComboBox->setMaximumWidth(9*ww);
719 _rnxSamplSpinBox->setMaximumWidth(9*ww);
720
721 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
722 oLayout->addWidget(new QLabel("Directory"), 1, 0);
723 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
724 oLayout->addWidget(new QLabel("Interval"), 2, 0);
725 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
726 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
727 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
728 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
729 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
730 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
731 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
732 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
733 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
734 oLayout->addWidget(new QLabel(" "), 6, 0);
735 ogroup->setLayout(oLayout);
736
737 // RINEX Ephemeris
738 // ---------------
739 QGridLayout* eLayout = new QGridLayout;
740 eLayout->setColumnMinimumWidth(0,14*ww);
741 _ephIntrComboBox->setMaximumWidth(9*ww);
742 _outEphPortLineEdit->setMaximumWidth(9*ww);
743
744 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
745 eLayout->addWidget(new QLabel("Directory"), 1, 0);
746 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
747 eLayout->addWidget(new QLabel("Interval"), 2, 0);
748 eLayout->addWidget(_ephIntrComboBox, 2, 1);
749 eLayout->addWidget(new QLabel("Port"), 3, 0);
750 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
751 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
752 eLayout->addWidget(_ephV3CheckBox, 4, 1);
753 eLayout->addWidget(new QLabel(" "), 5, 0);
754 eLayout->addWidget(new QLabel(" "), 6, 0);
755 egroup->setLayout(eLayout);
756
757
758 // Broadcast Corrections
759 // ---------------------
760 QGridLayout* cLayout = new QGridLayout;
761 cLayout->setColumnMinimumWidth(0,14*ww);
762 _corrIntrComboBox->setMaximumWidth(9*ww);
763 _corrPortLineEdit->setMaximumWidth(9*ww);
764 _corrTimeSpinBox->setMaximumWidth(9*ww);
765
766 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
767 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
768 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
769 cLayout->addWidget(new QLabel("Interval"), 2, 0);
770 cLayout->addWidget(_corrIntrComboBox, 2, 1);
771 cLayout->addWidget(new QLabel("Port"), 3, 0);
772 cLayout->addWidget(_corrPortLineEdit, 3, 1);
773 cLayout->addWidget(new QLabel(" Wait for full epoch"), 3, 2, Qt::AlignRight);
774 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
775 cLayout->addWidget(new QLabel(" "), 4, 0);
776 cLayout->addWidget(new QLabel(" "), 5, 0);
777 cLayout->addWidget(new QLabel(" "), 6, 0);
778 cgroup->setLayout(cLayout);
779
780 // Feed Engine
781 // -----------
782 QGridLayout* sLayout = new QGridLayout;
783 sLayout->setColumnMinimumWidth(0,14*ww);
784 _outPortLineEdit->setMaximumWidth(9*ww);
785 _waitTimeSpinBox->setMaximumWidth(9*ww);
786 _binSamplSpinBox->setMaximumWidth(9*ww);
787 _outUPortLineEdit->setMaximumWidth(9*ww);
788
789 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine."),0,0,1,50);
790 sLayout->addWidget(new QLabel("Port"), 1, 0);
791 sLayout->addWidget(_outPortLineEdit, 1, 1);
792 sLayout->addWidget(new QLabel("Wait for full epoch"), 1, 2, Qt::AlignRight);
793 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
794 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
795 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
796 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
797 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
798 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
799 sLayout->addWidget(_outUPortLineEdit, 4, 1);
800 sLayout->addWidget(new QLabel(" "), 5, 0);
801 sLayout->addWidget(new QLabel(" "), 6, 0);
802 sgroup->setLayout(sLayout);
803
804 // Serial Output
805 // -------------
806 QGridLayout* serLayout = new QGridLayout;
807 serLayout->setColumnMinimumWidth(0,14*ww);
808 _serialBaudRateComboBox->setMaximumWidth(9*ww);
809 _serialFlowControlComboBox->setMaximumWidth(11*ww);
810 _serialDataBitsComboBox->setMaximumWidth(5*ww);
811 _serialParityComboBox->setMaximumWidth(9*ww);
812 _serialStopBitsComboBox->setMaximumWidth(5*ww);
813 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
814 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
815
816 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
817 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
818 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
819 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
820 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
821 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
822 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
823 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
824 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
825 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
826 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
827 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
828 serLayout->addWidget(_serialParityComboBox, 4, 3);
829 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
830 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
831 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
832 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
833 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
834 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
835 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
836 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
837 serLayout->addWidget(new QLabel(" "), 6, 0);
838
839 sergroup->setLayout(serLayout);
840
841 // Outages
842 // -------
843 QGridLayout* aLayout = new QGridLayout;
844 aLayout->setColumnMinimumWidth(0,14*ww);
845 _obsRateComboBox->setMaximumWidth(9*ww);
846 _adviseFailSpinBox->setMaximumWidth(9*ww);
847 _adviseRecoSpinBox->setMaximumWidth(9*ww);
848
849 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
850 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
851 aLayout->addWidget(_obsRateComboBox, 1, 1);
852 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
853 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
854 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
855 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
856 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
857 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
858 aLayout->addWidget(new QLabel(" "), 5, 0);
859 aLayout->addWidget(new QLabel(" "), 6, 0);
860 agroup->setLayout(aLayout);
861
862 // Miscellaneous
863 // -------------
864 QGridLayout* rLayout = new QGridLayout;
865 rLayout->setColumnMinimumWidth(0,14*ww);
866 _perfIntrComboBox->setMaximumWidth(9*ww);
867
868 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),0, 0,1,30);
869 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
870 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
871 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
872 rLayout->addWidget(_perfIntrComboBox, 2, 1);
873 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
874 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
875 rLayout->addWidget(new QLabel(" "), 4, 0);
876 rLayout->addWidget(new QLabel(" "), 5, 0);
877 rLayout->addWidget(new QLabel(" "), 6, 0);
878 rgroup->setLayout(rLayout);
879
880 // PPP Client
881 // ----------
882 QGridLayout* pppLayout = new QGridLayout;
883 pppLayout->setColumnMinimumWidth(0,14*ww);
884 _pppSigCLineEdit->setMaximumWidth(6*ww);
885 _pppSigPLineEdit->setMaximumWidth(6*ww);
886 _pppSigCrd0->setMaximumWidth(6*ww);
887 _pppSigCrdP->setMaximumWidth(6*ww);
888 _pppSigTrp0->setMaximumWidth(6*ww);
889 _pppSigTrpP->setMaximumWidth(6*ww);
890 _pppAverageLineEdit->setMaximumWidth(6*ww);
891 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
892 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
893 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
894 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
895 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
896 _pppRefdNLineEdit->setMaximumWidth(6*ww);
897 _pppRefdELineEdit->setMaximumWidth(6*ww);
898 _pppRefdULineEdit->setMaximumWidth(6*ww);
899 _pppSync->setMaximumWidth(6*ww);
900 _pppSPPComboBox->setMinimumWidth(15*ww);
901
902 _postObsFileChooser = new qtFileChooser;
903 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
904 _postObsFileChooser->setMinimumWidth(15*ww);
905 _postNavFileChooser = new qtFileChooser;
906 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
907 _postNavFileChooser->setMinimumWidth(15*ww);
908 _postCorrFileChooser = new qtFileChooser;
909 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
910 _postCorrFileChooser->setMinimumWidth(15*ww);
911 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
912 _postOutLineEdit->setMinimumWidth(15*ww);
913
914 int ir = 0;
915 pppLayout->addWidget(new QLabel("Precise Point Positioning, Panel 1."), ir, 0, 1, 2, Qt::AlignLeft);
916 ++ir;
917 pppLayout->addWidget(new QLabel("Mode & mountpoints"),ir, 0, Qt::AlignLeft);
918 pppLayout->addWidget(_pppSPPComboBox, ir, 1, Qt::AlignRight);
919 pppLayout->addWidget(_pppMountLineEdit, ir, 3, Qt::AlignRight);
920 pppLayout->addWidget(new QLabel("Obs."), ir, 4, Qt::AlignLeft);
921 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 5, Qt::AlignRight);
922 pppLayout->addWidget(new QLabel("Corr."), ir, 6, Qt::AlignLeft);
923 ++ir;
924 pppLayout->addWidget(new QLabel("Marker coordinates"), ir, 0, Qt::AlignLeft);
925 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 1, Qt::AlignRight);
926 pppLayout->addWidget(new QLabel("X "), ir, 2, Qt::AlignLeft);
927 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 3, Qt::AlignRight);
928 pppLayout->addWidget(new QLabel("Y"), ir, 4, Qt::AlignLeft);
929 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 5, Qt::AlignRight);
930 pppLayout->addWidget(new QLabel("Z"), ir, 6, Qt::AlignLeft);
931 ++ir;
932 pppLayout->addWidget(new QLabel("Antenna excentricity"), ir, 0, Qt::AlignLeft);
933 pppLayout->addWidget(_pppRefdNLineEdit, ir, 1, Qt::AlignRight);
934 pppLayout->addWidget(new QLabel("dN"), ir, 2, Qt::AlignLeft);
935 pppLayout->addWidget(_pppRefdELineEdit, ir, 3, Qt::AlignRight);
936 pppLayout->addWidget(new QLabel("dE"), ir, 4, Qt::AlignLeft);
937 pppLayout->addWidget(_pppRefdULineEdit, ir, 5, Qt::AlignRight);
938 pppLayout->addWidget(new QLabel("dU"), ir, 6, Qt::AlignLeft);
939 ++ir;
940 pppLayout->addWidget(new QLabel("NMEA & plot output"),ir, 0, Qt::AlignLeft);
941 pppLayout->addWidget(_pppNMEALineEdit, ir, 1, Qt::AlignRight);
942 pppLayout->addWidget(new QLabel("NMEA File"), ir, 2, Qt::AlignLeft);
943 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 3, Qt::AlignRight);
944 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 4, Qt::AlignLeft);
945 pppLayout->addWidget(_pppPlotCoordinates, ir, 5, Qt::AlignRight);
946 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 6, Qt::AlignLeft);
947 ++ir;
948 pppLayout->addWidget(new QLabel("Post-processing"), ir, 0, Qt::AlignLeft);
949 pppLayout->addWidget(_postObsFileChooser, ir, 1, Qt::AlignRight);
950 pppLayout->addWidget(new QLabel("Obs "), ir, 2, Qt::AlignLeft);
951 pppLayout->addWidget(_postNavFileChooser, ir, 3, Qt::AlignRight);
952 pppLayout->addWidget(new QLabel("Nav "), ir, 4, Qt::AlignLeft);
953 ++ir;
954 pppLayout->addWidget(_postCorrFileChooser, ir, 1, Qt::AlignRight);
955 pppLayout->addWidget(new QLabel("Corr"), ir, 2, Qt::AlignLeft);
956 pppLayout->addWidget(_postOutLineEdit, ir, 3, Qt::AlignRight);
957 pppLayout->addWidget(new QLabel("Log (full path)"), ir, 4, Qt::AlignLeft);
958
959 pppgroup->setLayout(pppLayout);
960
961 // PPP Client (second panel)
962 // -------------------------
963 QGridLayout* ppp2Layout = new QGridLayout;
964 ppp2Layout->setColumnMinimumWidth(0,14*ww);
965 ir = 0;
966 ppp2Layout->addWidget(new QLabel("Precise Point Positioning, Panel 2."), ir, 0, 1, 10);
967 ++ir;
968 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
969 ppp2Layout->addWidget(_pppAntexFileChooser, ir, 1,1,3);
970 ppp2Layout->addWidget(new QLabel("ANTEX File"), ir, 4);
971 ppp2Layout->addWidget(_pppAntennaLineEdit, ir, 5,1,3);
972 ppp2Layout->addWidget(new QLabel("Antenna Name"), ir, 8);
973 ++ir;
974 ppp2Layout->addWidget(new QLabel("Antennas cont'd"), ir, 0);
975 ppp2Layout->addWidget(_pppApplySatAntCheckBox, ir, 1, Qt::AlignRight);
976 ppp2Layout->addWidget(new QLabel("Apply Sat. Ant. Offsets"),ir, 2);
977 ++ir;
978 ppp2Layout->addWidget(new QLabel("Basics"), ir, 0, 1, 5);
979 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
980 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
981 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
982 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
983 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
984 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
985 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
986 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
987 ++ir;
988 ppp2Layout->addWidget(new QLabel("Basics cont'd"), ir, 0);
989 ppp2Layout->addWidget(_pppSync, ir, 1);
990 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
991 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
992 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
993 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
994 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
995 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
996 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
997 ++ir;
998 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
999 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1000 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1001 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1002 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1003 ++ir;
1004 ppp2Layout->addWidget(new QLabel("Sigmas cont'd"), ir, 0);
1005 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1006 ppp2Layout->addWidget(new QLabel("XYZ Init "), ir, 2);
1007 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1008 ppp2Layout->addWidget(new QLabel("XYZ White Noise "), ir, 4);
1009 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1010 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1011 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1012 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1013 ++ir;
1014 ppp2Layout->addWidget(new QLabel(""), ir, 0);
1015
1016 ppp2group->setLayout(ppp2Layout);
1017
1018 // Reqc Processing
1019 // ---------------
1020 _reqcActionComboBox = new QComboBox();
1021 _reqcActionComboBox->setEditable(false);
1022 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1023 ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1024 if (ik != -1) {
1025 _reqcActionComboBox->setCurrentIndex(ik);
1026 }
1027 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1028 this, SLOT(slotBncTextChanged()));
1029
1030 QGridLayout* reqcLayout = new QGridLayout;
1031 _reqcActionComboBox->setMinimumWidth(15*ww);
1032 _reqcActionComboBox->setMaximumWidth(15*ww);
1033
1034 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1035 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1036 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
1037 _reqcObsFileChooser->setMinimumWidth(15*ww);
1038 _reqcObsFileChooser->setMaximumWidth(15*ww);
1039
1040 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1041 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1042 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
1043 _reqcNavFileChooser->setMinimumWidth(15*ww);
1044 _reqcNavFileChooser->setMaximumWidth(15*ww);
1045
1046 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1047 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1048 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
1049 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
1050
1051 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1052 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1053 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
1054 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
1055
1056 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1057 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1058 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
1059 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
1060
1061 ir = 0;
1062 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1063 ++ir;
1064 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1065 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1066 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1067 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1068 ++ir;
1069 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1070 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1071 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1072 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1073 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1074 ++ir;
1075 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1076 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1077 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1078 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1079 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1080 ++ir;
1081 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1082 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1083 ++ir;
1084 reqcLayout->addWidget(new QLabel(""), ir, 1);
1085 reqcLayout->setRowStretch(ir, 999);
1086
1087 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1088 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1089
1090 reqcgroup->setLayout(reqcLayout);
1091
1092 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1093 this, SLOT(slotReqcEditOption()));
1094
1095 // Combination
1096 // -----------
1097 QGridLayout* cmbLayout = new QGridLayout;
1098
1099 populateCmbTable();
1100 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1101 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1102 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1103 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1104 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1105 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1106 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1107 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1108 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1109 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1110 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1111 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1112 cmbLayout->addWidget(new QLabel("Sampling"), 4, 0);
1113 cmbLayout->addWidget(_cmbSamplSpinBox, 5, 0);
1114 cmbLayout->addWidget(new QLabel(" "), 6, 0);
1115
1116 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1117 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1118
1119 cmbgroup->setLayout(cmbLayout);
1120
1121 // Upload Layout (Clocks)
1122 // ----------------------
1123 QGridLayout* uploadHlpLayout = new QGridLayout();
1124
1125 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1126 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1127 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1128
1129 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1130 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1131 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1132 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1133 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1134 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1135 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1136 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1137 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1138 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1139 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1140
1141 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1142 populateUploadTable();
1143
1144 uploadLayout->addWidget(new QLabel("Upload orbit/clock stream coming from Real-time Network Engine or upload orbit/clock combination stream."));
1145 uploadLayout->addWidget(_uploadTable);
1146 uploadLayout->addLayout(uploadHlpLayout);
1147
1148 uploadgroup->setLayout(uploadLayout);
1149
1150 // Upload Layout (Ephemeris)
1151 // -------------------------
1152 QGridLayout* uploadLayoutEph = new QGridLayout;
1153
1154 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1155 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1156 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1157 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1158
1159 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1160 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1161 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1162 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1163 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1164 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1165 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1166 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1167 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1168 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1169 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1170 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1171 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1172 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1173 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1174
1175 uploadEphgroup->setLayout(uploadLayoutEph);
1176
1177 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1178 this, SLOT(slotBncTextChanged()));
1179
1180 // Main Layout
1181 // -----------
1182 QGridLayout* mLayout = new QGridLayout;
1183 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1184 mLayout->addWidget(_aogroup, 0,0);
1185 mLayout->addWidget(_mountPointsTable, 1,0);
1186 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1187 mLayout->addWidget(_loggroup, 2,0);
1188
1189 _canvas->setLayout(mLayout);
1190
1191 // WhatsThis
1192 // ---------
1193 _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>"));
1194 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1195 _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an NTRIP broadcaster over SSL requires the exchange of client and/or server certificates. Specify the path to a directory where you save certificates on your system. Don't try communication via SSL if you are not sure wheter this is supported by the involved NTRIP broadcaster. Note that SSL communication is usually done over port 443.</p>"));
1196 _ignoreSslErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the NTRIP broadcaster. Tick 'Ignore SSL authorization erros' if you don't want to be bothered with this.</p>"));
1197 _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>"));
1198 _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."));
1199 _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."));
1200 _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."));
1201 _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."));
1202 _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."));
1203 _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>"));
1204 _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."));
1205 _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."));
1206 _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."));
1207 _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>"));
1208 _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>"));
1209 _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>"));
1210 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1211 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1212
1213 _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>"));
1214 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1215 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1216 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1217 _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>"));
1218 _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>"));
1219 _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>"));
1220 _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>"));
1221 _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>"));
1222 _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."));
1223 _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>"));
1224 _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>"));
1225 _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', 'RTCM_3.x' and 'RTNET'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders 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>"));
1226 _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."));
1227 _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)."));
1228 _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."));
1229 _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."));
1230 _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."));
1231 _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>"));
1232 _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>"));
1233 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1234 _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>"));
1235 _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>"));
1236 _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>"));
1237 _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>"));
1238 _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>"));
1239 _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>"));
1240 _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>"));
1241 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1242 _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>"));
1243 _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>"));
1244 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock Broadcast Ephemeris corrections stream by its mountpoint from the 'Streams' list below. Example: 'CLK10'</p><p>Note that BNC can produce an internal PPP solution from combined Broadcast Ephemeris corrections as specified under 'Combination' if you introduce keyword 'INTERNAL' as the corrections mountpoint.</p>"));
1245 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP) in 'Realtime' or 'Post-Processing' mode.</p><p>When in 'Post-Processing mode:<ul><li>Specifying a RINEX Observation, a RINEX Navigation and a Broadcast Correction file leads to a PPP solution.</li><li>Specifying only a RINEX Observation and a RINEX Navigation file and no Broadcast Correction file leads to a SPP solution.</ul></p>"));
1246 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to edit or concatenate RINEX v2 or v3 files or to perform a quality check.</p><p>In this it follows UNAVCO's famous 'teqc' program.</p>"));
1247 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1248 _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>"));
1249 _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>"));
1250 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for adding GLONASS observations to GPS and Galileo (optional) in a PPP solution.</p>"));
1251 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for adding Galileo observations to GPS and GLONASS (optional) in a PPP solution.</p>"));
1252 _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."));
1253 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
1254 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
1255 _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>"));
1256 _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>"));
1257 _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 Quick-Start mode and fixes the introduced reference coordinate for the specified period. A value of '60' 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>"));
1258 _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>"));
1259 _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>"));
1260 _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."));
1261 _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>"));
1262 _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>"));
1263 _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 3e-6 (default) would mean that the tropospheric effect may vary for 3600 * 3e-6 = 0.01 meters per hour.</p>"));
1264 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p><p>This option only makes sense in static observation conditions.</p>"));
1265 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1266 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1267 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
1268 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
1269 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
1270 _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."));
1271 _pppSync->setWhatsThis(tr(
1272 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
1273 "immediately after its arrival using satellite clock corrections available at "
1274 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
1275 "are buffered and the processing of each epoch is postponed till the satellite clock "
1276 "corrections not older than 'Sync Corr' seconds are available.<p>"));
1277 _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>"));
1278 _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>"));
1279 _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."));
1280 _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 coming 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.<ul><li>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.</li><li>Note also that you need to tick 'Use GLONASS' which is part ot the 'PPP (2)' panel in case you want to produce an GPS plus GLONASS combination.</li></ul></p><p>Note further that the orbit information in the final combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris corrections stream in the combination table. Instead of combining corrections BNC will then merge them with Broadcast Ephemeris to save results in SP3 and/or Clock RINEX format."));
1281 _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Residuum' meters from the average of all clocks will be ignored.<p></p>It is suggested to specify a value of about 0.2 m for the Kalman filter combination approach and a value of about 3.0 meters for the Single-Epoch combination approach.</p><p>Default is a value of '999.0'.</p>"));
1282 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'. It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning.</p>"));
1283 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to broadcast ephemeris (Broadcast Corrections) in RTCM Version 3 SSR format. You may have a situation where clocks and orbits come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified NTRIP broadcaster</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris corrections if you specify correction streams in the 'Combination' stream table.</p><p>Hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an NTRIP broadcaster and hit Enter. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the NTRIP broadcaster IP port (default is 80), the mountpoint and the stream upload password. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference system (e.g. IGS08) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving the generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create SP3 orbit files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.sp3<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><ul><li>As an SP3 file contents should be referred to the satellites Center of Mass (CoM) while correctors are referred to the satellites Antenna Phase Center (APC), an offset has to be applied which is available from an IGS ANTEX file. You should therefore specify the 'ANTEX File' path under tab 'PPP (2)' if you want to save the stream contents in SP3 format. If you don't specify an 'ANTEX File' path there, the SP3 file contents will be referred to the satellites APCs.</li></ul></p><p>Specify a path for saving the generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.clk<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><p>Specify finally an SSR Provider ID number, an SSR Solution ID number and an Issue of Data SSR number.</p><p>In case the 'Combination' table contains only one Broadcast Corrections stream, BNC will merge that stream with Broadcast Ephemeris to save results in files specified here through SP3 and/or Clock RINEX file path. In such a case you should define only the SP3 and Clock RINEX file path and no further options in the 'Upload (clk)' table.</p>"));
1284 _postObsFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Observation file."));
1285 _postNavFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Navigation file."));
1286 _postCorrFileChooser->setWhatsThis(tr("Full path to Broadcast Corrections file as previously saved with BNC in plain ASCII format."));
1287 _postOutLineEdit->setWhatsThis(tr("Full path to file with post processing PPP results. "));
1288 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1289 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1290 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1291 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1292 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1293 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("Select the stream's orbit correction sampling interval in seconds. A value of zero '0' tells BNC to upload all available samples."));
1294 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("Select the Clock RINEX file sampling interval in seconds. A value of zero '0' tells BNC to store all available samples into Clock RINEX files."));
1295 _uploadSamplSp3SpinBox->setWhatsThis(tr("Select the SP3 orbit file sampling interval in minutes. A value of zero '0' tells BNC to store all available samples into SP3 orbit files."));
1296 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1297
1298 _uploadEphHostLineEdit->setWhatsThis(tr("BNC can upload a Broadcast Ephemeris stream in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload Broadcast Ephemeris."));
1299 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1300 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1301 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1302 _uploadEphSampleSpinBox->setWhatsThis(tr("Select the Broadcast Ephemeris sampling interval in seconds. Defaut is '5' meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds."));
1303 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1304
1305 // Enable/Disable all Widgets
1306 // --------------------------
1307 slotBncTextChanged();
1308 enableStartStop();
1309
1310 // Auto start
1311 // ----------
1312 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1313 slotStart();
1314 }
1315}
1316
1317// Destructor
1318////////////////////////////////////////////////////////////////////////////
1319bncWindow::~bncWindow() {
1320 delete _caster;
1321 delete _casterEph;
1322}
1323
1324//
1325////////////////////////////////////////////////////////////////////////////
1326void bncWindow::populateMountPointsTable() {
1327
1328 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1329 _mountPointsTable->removeRow(iRow);
1330 }
1331
1332 bncSettings settings;
1333
1334 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1335 int iRow = 0;
1336 while (it.hasNext()) {
1337 QStringList hlp = it.next().split(" ");
1338 if (hlp.size() < 5) continue;
1339 _mountPointsTable->insertRow(iRow);
1340
1341 QUrl url(hlp[0]);
1342
1343 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1344 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1345 QString nmea(hlp[4]);
1346 if (hlp[5] == "S") {
1347 fullPath = hlp[0].replace(0,2,"");
1348 }
1349 QString ntripVersion = "2";
1350 if (hlp.size() >= 6) {
1351 ntripVersion = (hlp[5]);
1352 }
1353
1354 QTableWidgetItem* it;
1355 it = new QTableWidgetItem(url.userInfo());
1356 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1357 _mountPointsTable->setItem(iRow, 0, it);
1358
1359 it = new QTableWidgetItem(fullPath);
1360 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1361 _mountPointsTable->setItem(iRow, 1, it);
1362
1363 it = new QTableWidgetItem(format);
1364 _mountPointsTable->setItem(iRow, 2, it);
1365
1366 if (nmea == "yes") {
1367 it = new QTableWidgetItem(latitude);
1368 _mountPointsTable->setItem(iRow, 3, it);
1369 it = new QTableWidgetItem(longitude);
1370 _mountPointsTable->setItem(iRow, 4, it);
1371 } else {
1372 it = new QTableWidgetItem(latitude);
1373 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1374 _mountPointsTable->setItem(iRow, 3, it);
1375 it = new QTableWidgetItem(longitude);
1376 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1377 _mountPointsTable->setItem(iRow, 4, it);
1378 }
1379
1380 it = new QTableWidgetItem(nmea);
1381 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1382 _mountPointsTable->setItem(iRow, 5, it);
1383
1384 it = new QTableWidgetItem(ntripVersion);
1385 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1386 _mountPointsTable->setItem(iRow, 6, it);
1387
1388 bncTableItem* bncIt = new bncTableItem();
1389 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1390 _mountPointsTable->setItem(iRow, 7, bncIt);
1391
1392 iRow++;
1393 }
1394
1395 _mountPointsTable->sortItems(1);
1396
1397 enableStartStop();
1398}
1399
1400// Retrieve Table
1401////////////////////////////////////////////////////////////////////////////
1402void bncWindow::slotAddMountPoints() {
1403
1404 bncSettings settings;
1405 QString proxyHost = settings.value("proxyHost").toString();
1406 int proxyPort = settings.value("proxyPort").toInt();
1407 if (proxyHost != _proxyHostLineEdit->text() ||
1408 proxyPort != _proxyPortLineEdit->text().toInt()) {
1409 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1410 "changed. Use the new ones?",
1411 QMessageBox::Yes, QMessageBox::No,
1412 QMessageBox::NoButton);
1413 if (iRet == QMessageBox::Yes) {
1414 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1415 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1416 }
1417 }
1418
1419 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1420 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1421
1422 QMessageBox msgBox;
1423 msgBox.setIcon(QMessageBox::Question);
1424 msgBox.setWindowTitle("Add Stream");
1425 msgBox.setText("Add stream(s) coming from:");
1426
1427 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1428 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1429 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1430 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1431 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1432
1433 msgBox.exec();
1434
1435 if (msgBox.clickedButton() == buttonNtrip) {
1436 bncTableDlg* dlg = new bncTableDlg(this);
1437 dlg->move(this->pos().x()+50, this->pos().y()+50);
1438 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1439 this, SLOT(slotNewMountPoints(QStringList*)));
1440 dlg->exec();
1441 delete dlg;
1442 } else if (msgBox.clickedButton() == buttonIP) {
1443 bncIpPort* ipp = new bncIpPort(this);
1444 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1445 this, SLOT(slotNewMountPoints(QStringList*)));
1446 ipp->exec();
1447 delete ipp;
1448 } else if (msgBox.clickedButton() == buttonUDP) {
1449 bncUdpPort* udp = new bncUdpPort(this);
1450 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1451 this, SLOT(slotNewMountPoints(QStringList*)));
1452 udp->exec();
1453 delete udp;
1454 } else if (msgBox.clickedButton() == buttonSerial) {
1455 bncSerialPort* sep = new bncSerialPort(this);
1456 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1457 this, SLOT(slotNewMountPoints(QStringList*)));
1458 sep->exec();
1459 delete sep;
1460 } else if (msgBox.clickedButton() == buttonCancel) {
1461 // Cancel
1462 }
1463
1464 enableStartStop();
1465}
1466
1467// Delete Selected Mount Points
1468////////////////////////////////////////////////////////////////////////////
1469void bncWindow::slotDeleteMountPoints() {
1470
1471 int nRows = _mountPointsTable->rowCount();
1472 bool flg[nRows];
1473 for (int iRow = 0; iRow < nRows; iRow++) {
1474 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1475 flg[iRow] = true;
1476 }
1477 else {
1478 flg[iRow] = false;
1479 }
1480 }
1481 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1482 if (flg[iRow]) {
1483 _mountPointsTable->removeRow(iRow);
1484 }
1485 }
1486 _actDeleteMountPoints->setEnabled(false);
1487
1488 enableStartStop();
1489}
1490
1491// New Mount Points Selected
1492////////////////////////////////////////////////////////////////////////////
1493void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1494 int iRow = 0;
1495 QListIterator<QString> it(*mountPoints);
1496 while (it.hasNext()) {
1497 QStringList hlp = it.next().split(" ");
1498 QUrl url(hlp[0]);
1499 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1500 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1501 QString nmea(hlp[4]);
1502 if (hlp[5] == "S") {
1503 fullPath = hlp[0].replace(0,2,"");
1504 }
1505 QString ntripVersion = "2";
1506 if (hlp.size() >= 6) {
1507 ntripVersion = (hlp[5]);
1508 }
1509
1510 _mountPointsTable->insertRow(iRow);
1511
1512 QTableWidgetItem* it;
1513 it = new QTableWidgetItem(url.userInfo());
1514 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1515 _mountPointsTable->setItem(iRow, 0, it);
1516
1517 it = new QTableWidgetItem(fullPath);
1518 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1519 _mountPointsTable->setItem(iRow, 1, it);
1520
1521 it = new QTableWidgetItem(format);
1522 _mountPointsTable->setItem(iRow, 2, it);
1523
1524 if (nmea == "yes") {
1525 it = new QTableWidgetItem(latitude);
1526 _mountPointsTable->setItem(iRow, 3, it);
1527 it = new QTableWidgetItem(longitude);
1528 _mountPointsTable->setItem(iRow, 4, it);
1529 } else {
1530 it = new QTableWidgetItem(latitude);
1531 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1532 _mountPointsTable->setItem(iRow, 3, it);
1533 it = new QTableWidgetItem(longitude);
1534 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1535 _mountPointsTable->setItem(iRow, 4, it);
1536 }
1537
1538 it = new QTableWidgetItem(nmea);
1539 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1540 _mountPointsTable->setItem(iRow, 5, it);
1541
1542 it = new QTableWidgetItem(ntripVersion);
1543 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1544 _mountPointsTable->setItem(iRow, 6, it);
1545
1546 bncTableItem* bncIt = new bncTableItem();
1547 _mountPointsTable->setItem(iRow, 7, bncIt);
1548
1549 iRow++;
1550 }
1551 _mountPointsTable->hideColumn(0);
1552 _mountPointsTable->sortItems(1);
1553 delete mountPoints;
1554
1555 enableStartStop();
1556}
1557
1558// Save Options (serialize)
1559////////////////////////////////////////////////////////////////////////////
1560void bncWindow::slotSaveOptions() {
1561 saveOptions();
1562 bncSettings settings;
1563 settings.sync();
1564}
1565
1566// Save Options (memory only)
1567////////////////////////////////////////////////////////////////////////////
1568void bncWindow::saveOptions() {
1569
1570 QStringList mountPoints;
1571 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1572
1573 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1574 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1575 "@" + _mountPointsTable->item(iRow, 1)->text() );
1576
1577 mountPoints.append(url.toString() + " " +
1578 _mountPointsTable->item(iRow, 2)->text()
1579 + " " + _mountPointsTable->item(iRow, 3)->text()
1580 + " " + _mountPointsTable->item(iRow, 4)->text()
1581 + " " + _mountPointsTable->item(iRow, 5)->text()
1582 + " " + _mountPointsTable->item(iRow, 6)->text());
1583 } else {
1584 mountPoints.append(
1585 "//" + _mountPointsTable->item(iRow, 1)->text()
1586 + " " + _mountPointsTable->item(iRow, 2)->text()
1587 + " " + _mountPointsTable->item(iRow, 3)->text()
1588 + " " + _mountPointsTable->item(iRow, 4)->text()
1589 + " " + _mountPointsTable->item(iRow, 5)->text()
1590 + " " + _mountPointsTable->item(iRow, 6)->text());
1591 }
1592 }
1593
1594 QStringList combineStreams;
1595 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1596 QString hlp;
1597 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1598 if (_cmbTable->item(iRow, iCol)) {
1599 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1600 }
1601 }
1602 if (!hlp.isEmpty()) {
1603 combineStreams << hlp;
1604 }
1605 }
1606
1607 QStringList uploadMountpointsOut;
1608 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1609 QString hlp;
1610 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1611 if (_uploadTable->cellWidget(iRow, iCol) &&
1612 (iCol == 3 || iCol == 4 || iCol == 5)) {
1613 if (iCol == 3) {
1614 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1615 hlp += passwd->text() + ",";
1616 }
1617 else if (iCol == 4) {
1618 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1619 hlp += system->currentText() + ",";
1620 }
1621 else if (iCol == 5) {
1622 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1623 QString state; state.setNum(com->checkState());
1624 hlp += state + ",";
1625 }
1626 }
1627 else if (_uploadTable->item(iRow, iCol)) {
1628 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1629 }
1630 }
1631 if (!hlp.isEmpty()) {
1632 uploadMountpointsOut << hlp;
1633 }
1634 }
1635
1636 bncSettings settings;
1637
1638 settings.setValue("startTab", _aogroup->currentIndex());
1639 settings.setValue("statusTab", _loggroup->currentIndex());
1640 settings.setValue("mountPoints", mountPoints);
1641// Network
1642 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1643 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1644 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1645 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1646// General
1647 settings.setValue("logFile", _logFileLineEdit->text());
1648 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1649 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1650 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1651 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1652// RINEX Observations
1653 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1654 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1655 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1656 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1657 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1658 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1659// RINEX Ephemeris
1660 settings.setValue("ephPath", _ephPathLineEdit->text());
1661 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1662 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1663 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1664// Broadcast Corrections
1665 settings.setValue("corrPath", _corrPathLineEdit->text());
1666 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1667 settings.setValue("corrPort", _corrPortLineEdit->text());
1668 settings.setValue("corrTime", _corrTimeSpinBox->value());
1669// Feed Engine
1670 settings.setValue("outPort", _outPortLineEdit->text());
1671 settings.setValue("waitTime", _waitTimeSpinBox->value());
1672 settings.setValue("binSampl", _binSamplSpinBox->value());
1673 settings.setValue("outFile", _outFileLineEdit->text());
1674 settings.setValue("outUPort", _outUPortLineEdit->text());
1675// Serial Output
1676 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1677 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1678 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1679 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1680 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1681 settings.setValue("serialParity", _serialParityComboBox->currentText());
1682 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1683 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1684 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1685 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1686// Outages
1687 settings.setValue("obsRate", _obsRateComboBox->currentText());
1688 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1689 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1690 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1691// Miscellaneous
1692 settings.setValue("miscMount", _miscMountLineEdit->text());
1693 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1694 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1695// PPPP
1696 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1697 settings.setValue("pppMount", _pppMountLineEdit->text());
1698 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1699 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1700 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1701 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1702 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1703 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1704 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1705 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1706 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1707 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1708 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1709 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1710 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1711 settings.setValue("postOutFile", _postOutLineEdit->text());
1712 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1713 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1714 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1715 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1716 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1717 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1718 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1719 settings.setValue("pppSync", _pppSync->text());
1720 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1721 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1722 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1723 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1724 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1725 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1726 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1727 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1728 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1729// Reqc
1730 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1731 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1732 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1733 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1734 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1735 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1736// Combination
1737 if (!combineStreams.isEmpty()) {
1738 settings.setValue("combineStreams", combineStreams);
1739 }
1740 else {
1741 settings.setValue("combineStreams", "");
1742 }
1743 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1744 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1745 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1746// Upload (clk)
1747 if (!uploadMountpointsOut.isEmpty()) {
1748 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1749 }
1750 else {
1751 settings.setValue("uploadMountpointsOut", "");
1752 }
1753 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1754 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1755 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1756 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1757// Upload (eph)
1758 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1759 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1760 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1761 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1762 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1763 if (_caster) {
1764 _caster->slotReadMountPoints();
1765 }
1766}
1767
1768// All get slots terminated
1769////////////////////////////////////////////////////////////////////////////
1770void bncWindow::slotGetThreadsFinished() {
1771 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1772 delete _caster; _caster = 0;
1773 delete _casterEph; _casterEph = 0;
1774 _runningRealTime = false;
1775}
1776
1777// Start It!
1778////////////////////////////////////////////////////////////////////////////
1779void bncWindow::slotStart() {
1780 saveOptions();
1781 if ( _pppSPPComboBox->currentText() == "Post-Processing" ) {
1782 startPostProcessingPPP();
1783 }
1784 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1785 startPostProcessingReqc();
1786 }
1787 else {
1788 startRealTime();
1789 }
1790}
1791
1792// Start Real-Time (Retrieve Data etc.)
1793////////////////////////////////////////////////////////////////////////////
1794void bncWindow::startRealTime() {
1795
1796 _runningRealTime = true;
1797
1798 _bncFigurePPP->reset();
1799
1800 _actDeleteMountPoints->setEnabled(false);
1801
1802 enableStartStop();
1803
1804 _caster = new bncCaster(_outFileLineEdit->text(),
1805 _outPortLineEdit->text().toInt());
1806
1807 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1808 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1809 ((bncApp*)qApp)->initCombination();
1810
1811 connect(_caster, SIGNAL(getThreadsFinished()),
1812 this, SLOT(slotGetThreadsFinished()));
1813
1814 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1815 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1816
1817 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1818
1819 bncSettings settings;
1820
1821 QDir rnxdir(settings.value("rnxPath").toString());
1822 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1823
1824 QString rnx_file = settings.value("rnxScript").toString();
1825 if ( !rnx_file.isEmpty() ) {
1826 QFile rnxfile(settings.value("rnxScript").toString());
1827 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1828 }
1829
1830 QDir ephdir(settings.value("ephPath").toString());
1831 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1832
1833 QDir corrdir(settings.value("corrPath").toString());
1834 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1835
1836 QString advise_file = settings.value("adviseScript").toString();
1837 if ( !advise_file.isEmpty() ) {
1838 QFile advisefile(settings.value("adviseScript").toString());
1839 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1840 }
1841
1842 QString ant_file = settings.value("pppAntex").toString();
1843 if ( !ant_file.isEmpty() ) {
1844 QFile anxfile(settings.value("pppAntex").toString());
1845 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1846 }
1847
1848 _caster->slotReadMountPoints();
1849
1850 _casterEph = new bncEphUploadCaster();
1851 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1852 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1853}
1854
1855// Retrieve Data
1856////////////////////////////////////////////////////////////////////////////
1857void bncWindow::slotStop() {
1858 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1859 QMessageBox::Yes, QMessageBox::No,
1860 QMessageBox::NoButton);
1861 if (iRet == QMessageBox::Yes) {
1862 ((bncApp*)qApp)->stopCombination();
1863 delete _caster; _caster = 0;
1864 delete _casterEph; _casterEph = 0;
1865 _runningRealTime = false;
1866 enableStartStop();
1867 }
1868}
1869
1870// Close Application gracefully
1871////////////////////////////////////////////////////////////////////////////
1872void bncWindow::closeEvent(QCloseEvent* event) {
1873
1874 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1875 QMessageBox::Yes, QMessageBox::No,
1876 QMessageBox::Cancel);
1877
1878 if (iRet == QMessageBox::Cancel) {
1879 event->ignore();
1880 return;
1881 }
1882 else if (iRet == QMessageBox::Yes) {
1883 slotSaveOptions();
1884 }
1885
1886 QMainWindow::closeEvent(event);
1887}
1888
1889// User changed the selection of mountPoints
1890////////////////////////////////////////////////////////////////////////////
1891void bncWindow::slotSelectionChanged() {
1892 if (_mountPointsTable->selectedItems().isEmpty()) {
1893 _actDeleteMountPoints->setEnabled(false);
1894 }
1895 else {
1896 _actDeleteMountPoints->setEnabled(true);
1897 }
1898}
1899
1900// Display Program Messages
1901////////////////////////////////////////////////////////////////////////////
1902void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1903
1904#ifdef DEBUG_RTCM2_2021
1905 const int maxBufferSize = 1000;
1906#else
1907 const int maxBufferSize = 10000;
1908#endif
1909
1910 if (! showOnScreen ) {
1911 return;
1912 }
1913
1914 QString txt = _log->toPlainText() + "\n" +
1915 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1916 _log->clear();
1917 _log->append(txt.right(maxBufferSize));
1918}
1919
1920// About Message
1921////////////////////////////////////////////////////////////////////////////
1922void bncWindow::slotAbout() {
1923 new bncAboutDlg(0);
1924}
1925
1926//Flowchart
1927////////////////////////////////////////////////////////////////////////////
1928void bncWindow::slotFlowchart() {
1929 new bncFlowchartDlg(0);
1930}
1931
1932// Help Window
1933////////////////////////////////////////////////////////////////////////////
1934void bncWindow::slotHelp() {
1935 QUrl url;
1936 url.setPath(":bnchelp.html");
1937 new bncHlpDlg(0, url);
1938}
1939
1940// Select Fonts
1941////////////////////////////////////////////////////////////////////////////
1942void bncWindow::slotFontSel() {
1943 bool ok;
1944 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1945 if (ok) {
1946 bncSettings settings;
1947 settings.setValue("font", newFont.toString());
1948 QApplication::setFont(newFont);
1949 int ww = QFontMetrics(newFont).width('w');
1950 setMinimumSize(60*ww, 80*ww);
1951 resize(60*ww, 80*ww);
1952 }
1953}
1954
1955// Whats This Help
1956void bncWindow::slotWhatsThis() {
1957 QWhatsThis::enterWhatsThisMode();
1958}
1959
1960//
1961////////////////////////////////////////////////////////////////////////////
1962void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1963 _bncFigure->updateMountPoints();
1964 _bncFigureLate->updateMountPoints();
1965
1966 populateMountPointsTable();
1967 bncSettings settings;
1968 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1969 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1970 QListIterator<bncGetThread*> iTh(threads);
1971 while (iTh.hasNext()) {
1972 bncGetThread* thread = iTh.next();
1973 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1974 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1975 "@" + _mountPointsTable->item(iRow, 1)->text() );
1976 if (url == thread->mountPoint() &&
1977 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1978 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1979 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1980 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1981 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1982 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1983 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1984 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1985 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1986 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1987 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1988 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1989 disconnect(thread,
1990 SIGNAL(newPosition(bncTime, double, double, double)),
1991 _bncFigurePPP,
1992 SLOT(slotNewPosition(bncTime, double, double, double)));
1993 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1994 _bncFigurePPP,
1995 SLOT(slotNewPosition(bncTime, double, double, double)));
1996 }
1997 break;
1998 }
1999 }
2000 }
2001}
2002
2003//
2004////////////////////////////////////////////////////////////////////////////
2005void bncWindow::CreateMenu() {
2006 // Create Menus
2007 // ------------
2008 _menuFile = menuBar()->addMenu(tr("&File"));
2009 _menuFile->addAction(_actFontSel);
2010 _menuFile->addSeparator();
2011 _menuFile->addAction(_actSaveOpt);
2012 _menuFile->addSeparator();
2013 _menuFile->addAction(_actQuit);
2014
2015 _menuHlp = menuBar()->addMenu(tr("&Help"));
2016 _menuHlp->addAction(_actHelp);
2017 _menuHlp->addAction(_actFlowchart);
2018 _menuHlp->addAction(_actAbout);
2019}
2020
2021// Toolbar
2022////////////////////////////////////////////////////////////////////////////
2023void bncWindow::AddToolbar() {
2024 QToolBar* toolBar = new QToolBar;
2025 addToolBar(Qt::BottomToolBarArea, toolBar);
2026 toolBar->setMovable(false);
2027 toolBar->addAction(_actAddMountPoints);
2028 toolBar->addAction(_actDeleteMountPoints);
2029 toolBar->addAction(_actStart);
2030 toolBar->addAction(_actStop);
2031 toolBar->addWidget(new QLabel(" "));
2032 toolBar->addAction(_actwhatsthis);
2033}
2034
2035// About
2036////////////////////////////////////////////////////////////////////////////
2037bncAboutDlg::bncAboutDlg(QWidget* parent) :
2038 QDialog(parent) {
2039
2040 QTextBrowser* tb = new QTextBrowser;
2041 QUrl url; url.setPath(":bncabout.html");
2042 tb->setSource(url);
2043 tb->setReadOnly(true);
2044
2045 int ww = QFontMetrics(font()).width('w');
2046 QPushButton* _closeButton = new QPushButton("Close");
2047 _closeButton->setMaximumWidth(10*ww);
2048 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2049
2050 QGridLayout* dlgLayout = new QGridLayout();
2051 QLabel* img = new QLabel();
2052 img->setPixmap(QPixmap(":ntrip-logo.png"));
2053 dlgLayout->addWidget(img, 0,0);
2054 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
2055 dlgLayout->addWidget(tb,1,0,1,2);
2056 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2057
2058 setLayout(dlgLayout);
2059 resize(60*ww, 60*ww);
2060 setWindowTitle("About BNC");
2061 show();
2062}
2063
2064//
2065////////////////////////////////////////////////////////////////////////////
2066bncAboutDlg::~bncAboutDlg() {
2067};
2068
2069// Flowchart
2070////////////////////////////////////////////////////////////////////////////
2071bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2072 QDialog(parent) {
2073
2074 int ww = QFontMetrics(font()).width('w');
2075 QPushButton* _closeButton = new QPushButton("Close");
2076 _closeButton->setMaximumWidth(10*ww);
2077 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2078
2079 QGridLayout* dlgLayout = new QGridLayout();
2080 QLabel* img = new QLabel();
2081 img->setPixmap(QPixmap(":bncflowchart.png"));
2082 dlgLayout->addWidget(img, 0,0);
2083 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2084
2085 setLayout(dlgLayout);
2086 setWindowTitle("Flow Chart");
2087 show();
2088}
2089
2090//
2091////////////////////////////////////////////////////////////////////////////
2092bncFlowchartDlg::~bncFlowchartDlg() {
2093};
2094
2095// Enable/Disable Widget (and change its color)
2096////////////////////////////////////////////////////////////////////////////
2097void bncWindow::enableWidget(bool enable, QWidget* widget) {
2098 const static QPalette paletteWhite(QColor(255, 255, 255));
2099 const static QPalette paletteGray(QColor(230, 230, 230));
2100
2101 widget->setEnabled(enable);
2102 if (enable) {
2103 widget->setPalette(paletteWhite);
2104 }
2105 else {
2106 widget->setPalette(paletteGray);
2107 }
2108}
2109
2110// Bnc Text
2111////////////////////////////////////////////////////////////////////////////
2112void bncWindow::slotBncTextChanged(){
2113
2114 bool enable = true;
2115
2116 // Proxy
2117 //------
2118 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2119 enable = !_proxyHostLineEdit->text().isEmpty();
2120 enableWidget(enable, _proxyPortLineEdit);
2121 }
2122
2123 // RINEX Observations
2124 // ------------------
2125 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2126 enable = !_rnxPathLineEdit->text().isEmpty();
2127 enableWidget(enable, _rnxSamplSpinBox);
2128 enableWidget(enable, _rnxSkelLineEdit);
2129 enableWidget(enable, _rnxScrpLineEdit);
2130 enableWidget(enable, _rnxV3CheckBox);
2131 enableWidget(enable, _rnxIntrComboBox);
2132 }
2133
2134 // RINEX Ephemeris
2135 // ---------------
2136 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2137 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2138 enableWidget(enable, _ephIntrComboBox);
2139 enableWidget(enable, _ephV3CheckBox);
2140 }
2141
2142 // Broadcast Corrections
2143 // ---------------------
2144 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2145 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2146 enableWidget(enable, _corrIntrComboBox);
2147 }
2148
2149 // Feed Engine
2150 // -----------
2151 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2152 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2153 enableWidget(enable, _waitTimeSpinBox);
2154 enableWidget(enable, _binSamplSpinBox);
2155 }
2156
2157 // Serial Output
2158 // -------------
2159 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2160 sender() == _serialAutoNMEAComboBox) {
2161 enable = !_serialMountPointLineEdit->text().isEmpty();
2162 enableWidget(enable, _serialPortNameLineEdit);
2163 enableWidget(enable, _serialBaudRateComboBox);
2164 enableWidget(enable, _serialParityComboBox);
2165 enableWidget(enable, _serialDataBitsComboBox);
2166 enableWidget(enable, _serialStopBitsComboBox);
2167 enableWidget(enable, _serialFlowControlComboBox);
2168 enableWidget(enable, _serialAutoNMEAComboBox);
2169
2170 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2171 enableWidget(enable2, _serialFileNMEALineEdit);
2172 }
2173
2174 // Outages
2175 // -------
2176 if (sender() == 0 || sender() == _obsRateComboBox) {
2177 enable = !_obsRateComboBox->currentText().isEmpty();
2178 enableWidget(enable, _adviseFailSpinBox);
2179 enableWidget(enable, _adviseRecoSpinBox);
2180 enableWidget(enable, _adviseScriptLineEdit);
2181 }
2182
2183 // Miscellaneous
2184 // -------------
2185 if (sender() == 0 || sender() == _miscMountLineEdit) {
2186 enable = !_miscMountLineEdit->text().isEmpty();
2187 enableWidget(enable, _perfIntrComboBox);
2188 enableWidget(enable, _scanRTCMCheckBox);
2189 }
2190
2191 // Enable/disable Broadcast Ephemerides
2192 // ------------------------------------
2193 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2194 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2195 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2196 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2197 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2198 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2199 _uploadEphPortLineEdit->setEnabled(true);
2200 _uploadEphMountpointLineEdit->setEnabled(true);
2201 _uploadEphPasswordLineEdit->setEnabled(true);
2202 _uploadEphSampleSpinBox->setEnabled(true);
2203 }
2204 else {
2205 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2206 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2207 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2208 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2209 _uploadEphPortLineEdit->setEnabled(false);
2210 _uploadEphMountpointLineEdit->setEnabled(false);
2211 _uploadEphPasswordLineEdit->setEnabled(false);
2212 _uploadEphSampleSpinBox->setEnabled(false);
2213 }
2214 }
2215
2216 // Combination
2217 // -----------
2218 if (sender() == 0 || sender() == _cmbTable) {
2219 int iRow = _cmbTable->rowCount();
2220 if (iRow > 0) {
2221 enableWidget(true, _cmbMethodComboBox);
2222 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2223 _cmbMaxresLineEdit->setEnabled(true);
2224 _cmbSamplSpinBox->setEnabled(true);
2225 }
2226 else {
2227 enableWidget(false, _cmbMethodComboBox);
2228 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2229 _cmbMaxresLineEdit->setEnabled(false);
2230 _cmbSamplSpinBox->setEnabled(false);
2231 }
2232 }
2233
2234 // Upload(clk)
2235 // -----------
2236 int iRow = _uploadTable->rowCount();
2237 if (iRow > 0) {
2238 enableWidget(true, _uploadIntrComboBox);
2239 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2240 enableWidget(true, _uploadSamplClkRnxSpinBox);
2241 enableWidget(true, _uploadSamplSp3SpinBox);
2242 }
2243 else {
2244 enableWidget(false, _uploadIntrComboBox);
2245 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2246 enableWidget(false, _uploadSamplClkRnxSpinBox);
2247 enableWidget(false, _uploadSamplSp3SpinBox);
2248 }
2249
2250 // PPP Client
2251 // ----------
2252 if (sender() == 0
2253 || sender() == _pppMountLineEdit
2254 || sender() == _pppCorrMountLineEdit
2255 || sender() == _pppRefCrdXLineEdit
2256 || sender() == _pppRefCrdYLineEdit
2257 || sender() == _pppRefCrdZLineEdit
2258 || sender() == _pppRefdNLineEdit
2259 || sender() == _pppRefdELineEdit
2260 || sender() == _pppRefdULineEdit
2261 || sender() == _pppSync
2262 || sender() == _pppSPPComboBox
2263 || sender() == _pppQuickStartLineEdit
2264 || sender() == _pppEstTropoCheckBox
2265 || sender() == _pppUsePhaseCheckBox
2266 || sender() == _pppAntexFileChooser ) {
2267
2268 enable = !_pppSPPComboBox->currentText().isEmpty();
2269 if (enable) {
2270 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2271 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "Realtime-SPP") ||
2272 (_pppSPPComboBox->currentText() == "Post-Processing");
2273 }
2274
2275 enableWidget(enable, _pppNMEALineEdit);
2276 enableWidget(enable, _pppNMEAPortLineEdit);
2277 enableWidget(enable, _pppRefCrdXLineEdit);
2278 enableWidget(enable, _pppRefCrdYLineEdit);
2279 enableWidget(enable, _pppRefCrdZLineEdit);
2280 enableWidget(enable, _pppRefdNLineEdit);
2281 enableWidget(enable, _pppRefdELineEdit);
2282 enableWidget(enable, _pppRefdULineEdit);
2283 enableWidget(enable, _pppUsePhaseCheckBox);
2284 enableWidget(enable, _pppPlotCoordinates);
2285 enableWidget(enable, _pppEstTropoCheckBox);
2286// enableWidget(enable, _pppGLONASSCheckBox);
2287 enableWidget(enable, _pppGalileoCheckBox);
2288// enableWidget(enable, _pppAntexFileChooser);
2289 enableWidget(enable, _pppSigCLineEdit);
2290 enableWidget(enable, _pppSigCrd0);
2291 enableWidget(enable, _pppSigCrdP);
2292
2293 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2294 !_pppRefCrdYLineEdit->text().isEmpty() &&
2295 !_pppRefCrdZLineEdit->text().isEmpty();
2296
2297 enableWidget(enable2, _pppAverageLineEdit);
2298 enableWidget(enable2, _pppQuickStartLineEdit);
2299
2300 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2301 enableWidget(enable3, _pppMaxSolGapLineEdit);
2302
2303 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2304 enableWidget(enable4, _pppAntennaLineEdit);
2305 enableWidget(enable4, _pppApplySatAntCheckBox);
2306
2307 bool enable5 = enable && _pppEstTropoCheckBox->isChecked();
2308 enableWidget(enable5, _pppSigTrp0);
2309 enableWidget(enable5, _pppSigTrpP);
2310
2311 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2312 enableWidget(enable6, _pppSigPLineEdit);
2313
2314 bool enable7 = enable && _pppSPPComboBox->currentText() == "Realtime-PPP";
2315 enableWidget(enable7, _pppSync);
2316
2317 bool enable8 = _pppSPPComboBox->currentText() == "Realtime-PPP";
2318 enableWidget(enable8, _pppCorrMountLineEdit);
2319
2320 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2321 enableWidget(enable9, _postObsFileChooser);
2322 enableWidget(enable9, _postNavFileChooser);
2323 enableWidget(enable9, _postCorrFileChooser);
2324 enableWidget(enable9, _postOutLineEdit);
2325
2326 bool enable10 = !_pppSPPComboBox->currentText().isEmpty() && !enable9;
2327 enableWidget(enable10, _pppMountLineEdit);
2328 }
2329
2330 if (sender() == 0 || sender() == _reqcActionComboBox) {
2331 enable = !_reqcActionComboBox->currentText().isEmpty();
2332 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2333 enableWidget(enable && enable10, _reqcEditOptionButton);
2334 enableWidget(enable, _reqcObsFileChooser);
2335 enableWidget(enable, _reqcNavFileChooser);
2336 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2337 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2338 enableWidget(enable && !enable10, _reqcOutLogLineEdit);
2339 }
2340
2341 enableStartStop();
2342}
2343
2344//
2345////////////////////////////////////////////////////////////////////////////
2346void bncWindow::slotAddCmbRow() {
2347 int iRow = _cmbTable->rowCount();
2348 _cmbTable->insertRow(iRow);
2349 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2350 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2351 }
2352}
2353
2354//
2355////////////////////////////////////////////////////////////////////////////
2356void bncWindow::slotDelCmbRow() {
2357 int nRows = _cmbTable->rowCount();
2358 bool flg[nRows];
2359 for (int iRow = 0; iRow < nRows; iRow++) {
2360 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2361 flg[iRow] = true;
2362 }
2363 else {
2364 flg[iRow] = false;
2365 }
2366 }
2367 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2368 if (flg[iRow]) {
2369 _cmbTable->removeRow(iRow);
2370 }
2371 }
2372 nRows = _cmbTable->rowCount();
2373 if (nRows < 1) {
2374 enableWidget(false, _cmbMethodComboBox);
2375 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2376 _cmbMaxresLineEdit->setEnabled(false);
2377 _cmbSamplSpinBox->setEnabled(false);
2378 }
2379}
2380
2381//
2382////////////////////////////////////////////////////////////////////////////
2383void bncWindow::populateCmbTable() {
2384
2385 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2386 _cmbTable->removeRow(iRow);
2387 }
2388
2389 bncSettings settings;
2390
2391 int iRow = -1;
2392 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2393 while (it.hasNext()) {
2394 QStringList hlp = it.next().split(" ");
2395 if (hlp.size() > 2) {
2396 ++iRow;
2397 _cmbTable->insertRow(iRow);
2398 }
2399 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2400 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2401 }
2402 }
2403}
2404
2405//
2406////////////////////////////////////////////////////////////////////////////
2407void bncWindow::slotAddUploadRow() {
2408 int iRow = _uploadTable->rowCount();
2409 _uploadTable->insertRow(iRow);
2410 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2411 if (iCol == 3) {
2412 QLineEdit* passwd = new QLineEdit();
2413 passwd->setFrame(false);
2414 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2415 _uploadTable->setCellWidget(iRow, iCol, passwd);
2416 }
2417 else if (iCol == 4) {
2418 QComboBox* system = new QComboBox();
2419 system->setEditable(false);
2420 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2421 system->setFrame(false);
2422 _uploadTable->setCellWidget(iRow, iCol, system);
2423 }
2424 else if (iCol == 5) {
2425 QCheckBox* com = new QCheckBox();
2426 _uploadTable->setCellWidget(iRow, iCol, com);
2427 }
2428 else if (iCol == 11) {
2429 bncTableItem* bncIt = new bncTableItem();
2430 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2431 _uploadTable->setItem(iRow, iCol, bncIt);
2432 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2433 }
2434 else {
2435 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2436 }
2437 }
2438}
2439
2440//
2441////////////////////////////////////////////////////////////////////////////
2442void bncWindow::slotDelUploadRow() {
2443 ((bncApp*)qApp)->_uploadTableItems.clear();
2444 int nRows = _uploadTable->rowCount();
2445 bool flg[nRows];
2446 for (int iRow = 0; iRow < nRows; iRow++) {
2447 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2448 flg[iRow] = true;
2449 }
2450 else {
2451 flg[iRow] = false;
2452 }
2453 }
2454 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2455 if (flg[iRow]) {
2456 _uploadTable->removeRow(iRow);
2457 }
2458 }
2459 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2460 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2461 (bncTableItem*) _uploadTable->item(iRow, 11);
2462 }
2463 nRows = _uploadTable->rowCount();
2464 if (nRows < 1) {
2465 enableWidget(false, _uploadIntrComboBox);
2466 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2467 enableWidget(false, _uploadSamplSp3SpinBox);
2468 enableWidget(false, _uploadSamplClkRnxSpinBox);
2469 }
2470}
2471
2472//
2473////////////////////////////////////////////////////////////////////////////
2474void bncWindow::populateUploadTable() {
2475 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2476 _uploadTable->removeRow(iRow);
2477 }
2478
2479 bncSettings settings;
2480
2481 int iRow = -1;
2482 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2483 while (it.hasNext()) {
2484 QStringList hlp = it.next().split(",");
2485 if (hlp.size() > 6) {
2486 ++iRow;
2487 _uploadTable->insertRow(iRow);
2488 }
2489 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2490 if (iCol == 3) {
2491 QLineEdit* passwd = new QLineEdit();
2492 passwd->setFrame(false);
2493 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2494 passwd->setText(hlp[iCol]);
2495 _uploadTable->setCellWidget(iRow, iCol, passwd);
2496 }
2497 else if (iCol == 4) {
2498 QComboBox* system = new QComboBox();
2499 system->setEditable(false);
2500 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2501 system->setFrame(false);
2502 system->setCurrentIndex(system->findText(hlp[iCol]));
2503 _uploadTable->setCellWidget(iRow, iCol, system);
2504 }
2505 else if (iCol == 5) {
2506 QCheckBox* com = new QCheckBox();
2507 if (hlp[iCol].toInt() == Qt::Checked) {
2508 com->setCheckState(Qt::Checked);
2509 }
2510 _uploadTable->setCellWidget(iRow, iCol, com);
2511 }
2512 else if (iCol == 11) {
2513 bncTableItem* bncIt = new bncTableItem();
2514 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2515 _uploadTable->setItem(iRow, iCol, bncIt);
2516 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2517 }
2518 else {
2519 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2520 }
2521 }
2522 }
2523}
2524
2525//
2526////////////////////////////////////////////////////////////////////////////
2527void bncWindow::slotSetUploadTrafo() {
2528 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2529 dlg->exec();
2530 delete dlg;
2531}
2532
2533// Start Post-Processing PPP
2534////////////////////////////////////////////////////////////////////////////
2535void bncWindow::startPostProcessingPPP() {
2536#ifdef USE_POSTPROCESSING
2537 _runningPostProcessingPPP = true;
2538 _actStart->setText("0 Epochs");
2539 enableStartStop();
2540
2541 t_postProcessing* postProcessing = new t_postProcessing(this);
2542 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessingPPP()));
2543 connect(postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2544
2545 postProcessing->start();
2546#else
2547 QMessageBox::information(this, "Information",
2548 "Post-Processing Not Permitted");
2549#endif
2550}
2551
2552// Post-Processing PPP Finished
2553////////////////////////////////////////////////////////////////////////////
2554void bncWindow::slotFinishedPostProcessingPPP() {
2555 _runningPostProcessingPPP = false;
2556 QMessageBox::information(this, "Information",
2557 "Post-Processing Thread Finished");
2558 _actStart->setText("Start");
2559 enableStartStop();
2560}
2561
2562// Progress Bar Change
2563////////////////////////////////////////////////////////////////////////////
2564void bncWindow::slotPostProgress(int nEpo) {
2565 if (_actStart) {
2566 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2567 }
2568}
2569
2570// Start Post-Processing Reqc
2571////////////////////////////////////////////////////////////////////////////
2572void bncWindow::startPostProcessingReqc() {
2573#ifdef USE_POSTPROCESSING
2574 _runningPostProcessingReqc = true;
2575 enableStartStop();
2576 if (_reqcActionComboBox->currentText() == "Analyze") {
2577 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2578 connect(reqcAnalyze, SIGNAL(finished()),
2579 this, SLOT(slotFinishedPostProcessingReqc()));
2580 reqcAnalyze->start();
2581 }
2582 else {
2583 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2584 connect(reqcEdit, SIGNAL(finished()),
2585 this, SLOT(slotFinishedPostProcessingReqc()));
2586 reqcEdit->start();
2587 }
2588#else
2589 QMessageBox::information(this, "Information",
2590 "Post-Processing Not Permitted");
2591#endif
2592}
2593
2594// Post-Processing Reqc Finished
2595////////////////////////////////////////////////////////////////////////////
2596void bncWindow::slotFinishedPostProcessingReqc() {
2597 _runningPostProcessingReqc = false;
2598 QMessageBox::information(this, "Information",
2599 "RINEX Processing Thread Finished");
2600 enableStartStop();
2601}
2602
2603// Edit teqc-like editing options
2604////////////////////////////////////////////////////////////////////////////
2605void bncWindow::slotReqcEditOption() {
2606 reqcDlg* dlg = new reqcDlg(this);
2607 dlg->move(this->pos().x()+50, this->pos().y()+50);
2608 dlg->exec();
2609 delete dlg;
2610}
2611
2612// Enable/Disable Start and Stop Buttons
2613////////////////////////////////////////////////////////////////////////////
2614void bncWindow::enableStartStop() {
2615
2616 if ( _pppSPPComboBox && _pppSPPComboBox->currentText() == "Post-Processing" ) {
2617 if (_runningPostProcessingPPP) {
2618 _actStart->setEnabled(false);
2619 }
2620 else {
2621 _actStart->setEnabled(true);
2622 }
2623 _actStop->setEnabled(false);
2624 }
2625 else if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2626 if (_runningPostProcessingReqc) {
2627 _actStart->setEnabled(false);
2628 }
2629 else {
2630 _actStart->setEnabled(true);
2631 }
2632 _actStop->setEnabled(false);
2633 }
2634 else {
2635 if (_runningRealTime) {
2636 _actStart->setEnabled(false);
2637 _actStop->setEnabled(true);
2638 }
2639 else {
2640 _actStop->setEnabled(false);
2641 if (_mountPointsTable->rowCount() == 0) {
2642 _actStart->setEnabled(false);
2643 }
2644 else {
2645 _actStart->setEnabled(true);
2646 }
2647 }
2648 }
2649}
Note: See TracBrowser for help on using the repository browser.