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

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

Layout midified

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