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

Last change on this file since 4177 was 4177, checked in by weber, 12 years ago

Online help completed

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