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

Last change on this file since 4134 was 4130, checked in by weber, 13 years ago

Online help completed

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