source: ntrip/trunk/BNC/src/bncwindow.cpp@ 10276

Last change on this file since 10276 was 10276, checked in by stuerze, 5 months ago

an initialization of the supported GNSS in Eph upload is now added

File size: 176.8 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 <QAction>
44#include <QApplication>
45#include <QCheckBox>
46#include <QCloseEvent>
47#include <QComboBox>
48#include <QDialog>
49#include <QFontDialog>
50#include <QGridLayout>
51#include <QHeaderView>
52#include <QLabel>
53#include <QLineEdit>
54#include <QMenu>
55#include <QMenuBar>
56#include <QMessageBox>
57#include <QPushButton>
58#include <QRadioButton>
59#include <QSpinBox>
60#include <QTableWidgetItem>
61#include <QTextEdit>
62#include <QToolBar>
63
64#ifndef WIN32
65#include <unistd.h>
66#else
67#include <windows.h>
68#endif
69#include "bncwindow.h"
70#include "bnccore.h"
71#include "bncgetthread.h"
72#include "bnctabledlg.h"
73#include "bncipport.h"
74#include "bncudpport.h"
75#include "bncserialport.h"
76#include "bnchlpdlg.h"
77#include "bnchtml.h"
78#include "bnctableitem.h"
79#include "bncsettings.h"
80#include "bncfigure.h"
81#include "bncfigurelate.h"
82#include "bncfigureppp.h"
83#include "bncversion.h"
84#include "bncbytescounter.h"
85#include "bncsslconfig.h"
86#include "upload/bnccustomtrafo.h"
87#include "upload/bncephuploadcaster.h"
88#include "qtfilechooser.h"
89#include "reqcdlg.h"
90#include "bncmap.h"
91#include "rinex/reqcedit.h"
92#include "rinex/reqcanalyze.h"
93#include "orbComp/sp3Comp.h"
94#ifdef QT_WEBENGINE
95# include "map/bncmapwin.h"
96#endif
97
98using namespace std;
99
100// Constructor
101////////////////////////////////////////////////////////////////////////////
102bncWindow::bncWindow() {
103
104 const static QPalette paletteWhite(QColor(255, 255, 255));
105 const static QPalette paletteGray(QColor(230, 230, 230));
106
107 _caster = 0;
108 _casterEph = 0;
109
110 _bncFigure = new bncFigure(this);
111 _bncFigureLate = new bncFigureLate(this);
112 _bncFigurePPP = new bncFigurePPP(this);
113
114 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
115 _bncFigurePPP, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
116
117 connect(BNC_CORE, SIGNAL(progressRnxPPP(int)), this, SLOT(slotPostProcessingProgress(int)));
118 connect(BNC_CORE, SIGNAL(finishedRnxPPP()), this, SLOT(slotPostProcessingFinished()));
119
120 _runningRealTime = false;
121 _runningPPP = false;
122 _runningEdit = false;
123 _runningQC = false;
124 _runningSp3Comp = false;
125 _reqcActionComboBox = 0; // necessary for enableStartStop()
126
127 _mapWin = 0;
128
129 int ww = QFontMetrics(this->font()).width('w');
130
131 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, country, lat, long, nmea, ntrip, bytes").split(",");
132
133 setMinimumSize(100*ww, 70*ww);
134
135 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
136
137 connect(BNC_CORE, SIGNAL(newMessage(QByteArray,bool)),
138 this, SLOT(slotWindowMessage(QByteArray,bool)));
139
140 // Create Actions
141 // --------------
142 _actHelp = new QAction(tr("&Help Contents"),this);
143 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
144
145 _actAbout = new QAction(tr("&About BNC"),this);
146 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
147
148 _actFlowchart = new QAction(tr("&Flow Chart"),this);
149 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
150
151 _actFontSel = new QAction(tr("Select &Font"),this);
152 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
153
154 _actSaveOpt = new QAction(tr("&Reread && Save Configuration"),this);
155 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
156
157 _actQuit = new QAction(tr("&Quit"),this);
158 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
159
160 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
161 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
162
163 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
164 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
165 _actDeleteMountPoints->setEnabled(false);
166
167 _actMapMountPoints = new QAction(tr("&Map"),this);
168 connect(_actMapMountPoints, SIGNAL(triggered()), SLOT(slotMapMountPoints()));
169
170 _actStart = new QAction(tr("Sta&rt"),this);
171 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
172
173 _actStop = new QAction(tr("Sto&p"),this);
174 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
175 connect(_actStop, SIGNAL(triggered()), SLOT(slotMapPPPClosed()));
176
177 _actwhatsthis= new QAction(tr("Help?=Shift+F1"),this);
178 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
179
180 CreateMenu();
181 AddToolbar();
182
183 bncSettings settings;
184
185 // Network Options
186 // ---------------
187 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
188 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
189
190 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
191 this, SLOT(slotBncTextChanged()));
192
193 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
194 _sslClientCertPathLineEdit = new QLineEdit(settings.value("sslClientCertPath").toString());
195 _sslIgnoreErrorsCheckBox = new QCheckBox();
196 _sslIgnoreErrorsCheckBox->setCheckState(Qt::CheckState(
197 settings.value("sslIgnoreErrors").toInt()));
198
199 // General Options
200 // ---------------
201 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
202 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
203 _rnxAppendCheckBox = new QCheckBox();
204 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
205 settings.value("rnxAppend").toInt()));
206 _onTheFlyComboBox = new QComboBox();
207 _onTheFlyComboBox->setEditable(false);
208 _onTheFlyComboBox->addItems(QString("no,1 day,1 hour,5 min,1 min").split(","));
209 int go = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
210 if (go != -1) {
211 _onTheFlyComboBox->setCurrentIndex(go);
212 }
213 _autoStartCheckBox = new QCheckBox();
214 _autoStartCheckBox->setCheckState(Qt::CheckState(
215 settings.value("autoStart").toInt()));
216
217 // RINEX Observations Options
218 // --------------------------
219 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
220 _rnxIntrComboBox = new QComboBox();
221 _rnxIntrComboBox->setEditable(false);
222 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
223 int ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
224 if (ii != -1) {
225 _rnxIntrComboBox->setCurrentIndex(ii);
226 }
227 _rnxSamplComboBox = new QComboBox();
228 _rnxSamplComboBox->setEditable(false);
229 _rnxSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
230 int ij = _rnxSamplComboBox->findText(settings.value("rnxSampl").toString());
231 if (ij != -1) {
232 _rnxSamplComboBox->setCurrentIndex(ij);
233 }
234 _rnxFileCheckBox = new QCheckBox();
235 _rnxFileCheckBox->setCheckState(Qt::CheckState(settings.value("rnxOnlyWithSKL").toInt()));
236 _rnxSkelExtComboBox = new QComboBox();
237 _rnxSkelExtComboBox->setEditable(false);
238 _rnxSkelExtComboBox->addItems(QString("skl, SKL").split(","));
239 int ik = _rnxSkelExtComboBox->findText(settings.value("rnxSkel").toString());
240 if (ik != -1) {
241 _rnxSkelExtComboBox->setCurrentIndex(ik);
242 }
243 _rnxSkelPathLineEdit = new QLineEdit(settings.value("rnxSkelPath").toString());
244 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
245 _rnxVersComboBox = new QComboBox();
246 _rnxVersComboBox->setEditable(false);
247 _rnxVersComboBox->addItems(QString("4,3,2").split(","));
248 _rnxVersComboBox->setMaximumWidth(7*ww);
249 int il = _rnxVersComboBox->findText(settings.value("rnxVersion").toString());
250 if (il != -1) {
251 _rnxVersComboBox->setCurrentIndex(il);
252 }
253 QString hlp = settings.value("rnxV2Priority").toString();
254 if (hlp.isEmpty()) {
255 hlp = "G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX";
256 }
257 _rnxV2Priority = new QLineEdit(hlp);
258
259 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(slotBncTextChanged()));
260 connect(_rnxSkelPathLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(slotBncTextChanged()));
261 connect(_rnxVersComboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slotBncTextChanged()));
262
263 // RINEX Ephemeris Options
264 // -----------------------
265 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
266 _ephIntrComboBox = new QComboBox();
267 _ephIntrComboBox->setEditable(false);
268 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
269 int ji = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
270 if (ji != -1) {
271 _ephIntrComboBox->setCurrentIndex(ji);
272 }
273 _ephOutPortLineEdit = new QLineEdit(settings.value("ephOutPort").toString());
274 _ephVersComboBox = new QComboBox();
275 _ephVersComboBox->setEditable(false);
276 _ephVersComboBox->addItems(QString("4,3,2").split(","));
277 _ephVersComboBox->setMaximumWidth(7*ww);
278 int jk = _ephVersComboBox->findText(settings.value("ephVersion").toString());
279 if (jk != -1) {
280 _ephVersComboBox->setCurrentIndex(jk);
281 }
282 //_ephFilePerStation = new QCheckBox();
283 //_ephFilePerStation->setCheckState(Qt::CheckState(settings.value("ephFilePerStation").toInt()));
284
285 connect(_ephOutPortLineEdit, SIGNAL(textChanged(const QString &)),
286 this, SLOT(slotBncTextChanged()));
287
288 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
289 this, SLOT(slotBncTextChanged()));
290
291 // Broadcast Corrections Options
292 // -----------------------------
293 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
294 _corrIntrComboBox = new QComboBox();
295 _corrIntrComboBox->setEditable(false);
296 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
297 int bi = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
298 if (bi != -1) {
299 _corrIntrComboBox->setCurrentIndex(bi);
300 }
301 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
302
303 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
304 this, SLOT(slotBncTextChanged()));
305
306 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
307 this, SLOT(slotBncTextChanged()));
308
309 // Feed Engine Options
310 // -------------------
311 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
312 _outWaitSpinBox = new QSpinBox();
313 _outWaitSpinBox->setMinimum(0);
314 _outWaitSpinBox->setMaximum(30);
315 _outWaitSpinBox->setSingleStep(1);
316 _outWaitSpinBox->setSuffix(" sec");
317 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
318 _outSamplComboBox = new QComboBox();
319 _outSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
320 int nn = _outSamplComboBox->findText(settings.value("outSampl").toString());
321 if (nn != -1) {
322 _outSamplComboBox->setCurrentIndex(nn);
323 }
324 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
325 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
326 _outLockTimeCheckBox = new QCheckBox();
327 _outLockTimeCheckBox->setCheckState(Qt::CheckState(settings.value("outLockTime").toInt()));
328
329 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
330 this, SLOT(slotBncTextChanged()));
331
332 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
333 this, SLOT(slotBncTextChanged()));
334
335 connect(_outLockTimeCheckBox, SIGNAL(stateChanged(int)),
336 this, SLOT(slotBncTextChanged()));
337
338 // Serial Output Options
339 // ---------------------
340 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
341 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
342 _serialBaudRateComboBox = new QComboBox();
343 _serialBaudRateComboBox->addItems(QString("110,300,600,"
344 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
345 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
346 if (kk != -1) {
347 _serialBaudRateComboBox->setCurrentIndex(kk);
348 }
349 _serialFlowControlComboBox = new QComboBox();
350 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
351 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
352 if (kk != -1) {
353 _serialFlowControlComboBox->setCurrentIndex(kk);
354 }
355 _serialDataBitsComboBox = new QComboBox();
356 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
357 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
358 if (kk != -1) {
359 _serialDataBitsComboBox->setCurrentIndex(kk);
360 }
361 _serialParityComboBox = new QComboBox();
362 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
363 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
364 if (kk != -1) {
365 _serialParityComboBox->setCurrentIndex(kk);
366 }
367 _serialStopBitsComboBox = new QComboBox();
368 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
369 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
370 if (kk != -1) {
371 _serialStopBitsComboBox->setCurrentIndex(kk);
372 }
373 _serialAutoNMEAComboBox = new QComboBox();
374 _serialAutoNMEAComboBox->addItems(QString("no,Auto,Manual GPGGA,Manual GNGGA").split(","));
375 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
376 if (kk != -1) {
377 _serialAutoNMEAComboBox->setCurrentIndex(kk);
378 }
379 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
380 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
381
382 _serialManualNMEASamplingSpinBox = new QSpinBox();
383 _serialManualNMEASamplingSpinBox->setMinimum(0);
384 _serialManualNMEASamplingSpinBox->setMaximum(300);
385 _serialManualNMEASamplingSpinBox->setSingleStep(10);
386 _serialManualNMEASamplingSpinBox->setValue(settings.value("serialManualNMEASampling").toInt());
387 _serialManualNMEASamplingSpinBox->setSuffix(" sec");
388
389 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
390 this, SLOT(slotBncTextChanged()));
391
392 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
393 this, SLOT(slotBncTextChanged()));
394
395 // Outages Options
396 // ---------------
397 _adviseObsRateComboBox = new QComboBox();
398 _adviseObsRateComboBox->setEditable(false);
399 _adviseObsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
400 kk = _adviseObsRateComboBox->findText(settings.value("adviseObsRate").toString());
401 if (kk != -1) {
402 _adviseObsRateComboBox->setCurrentIndex(kk);
403 }
404 _adviseFailSpinBox = new QSpinBox();
405 _adviseFailSpinBox->setMinimum(0);
406 _adviseFailSpinBox->setMaximum(60);
407 _adviseFailSpinBox->setSingleStep(1);
408 _adviseFailSpinBox->setSuffix(" min");
409 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
410 _adviseRecoSpinBox = new QSpinBox();
411 _adviseRecoSpinBox->setMinimum(0);
412 _adviseRecoSpinBox->setMaximum(60);
413 _adviseRecoSpinBox->setSingleStep(1);
414 _adviseRecoSpinBox->setSuffix(" min");
415 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
416 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
417
418 connect(_adviseObsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
419 this, SLOT(slotBncTextChanged()));
420
421 // Miscellaneous Options
422 // ---------------------
423 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
424 _miscPortLineEdit = new QLineEdit(settings.value("miscPort").toString());
425 _miscIntrComboBox = new QComboBox();
426 _miscIntrComboBox->setEditable(false);
427 _miscIntrComboBox->addItems(QString(",2 sec,10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
428 int ll = _miscIntrComboBox->findText(settings.value("miscIntr").toString());
429 if (ll != -1) {
430 _miscIntrComboBox->setCurrentIndex(ll);
431 }
432 _miscScanRTCMCheckBox = new QCheckBox();
433 _miscScanRTCMCheckBox->setCheckState(Qt::CheckState(
434 settings.value("miscScanRTCM").toInt()));
435
436 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
437 this, SLOT(slotBncTextChanged()));
438
439 // Streams
440 // -------
441 _mountPointsTable = new QTableWidget(0,9);
442
443 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
444 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
445 _mountPointsTable->horizontalHeader()->resizeSection(3,9*ww);
446 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
447 _mountPointsTable->horizontalHeader()->resizeSection(5,7*ww);
448 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
449 _mountPointsTable->horizontalHeader()->resizeSection(7,5*ww);
450#if QT_VERSION < 0x050000
451 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
452#else
453 _mountPointsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
454#endif
455 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
456 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
457 _mountPointsTable->setHorizontalHeaderLabels(labels);
458 _mountPointsTable->setGridStyle(Qt::NoPen);
459 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
460 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
461 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
462 _mountPointsTable->hideColumn(0);
463 _mountPointsTable->hideColumn(3);
464 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
465 SLOT(slotSelectionChanged()));
466 populateMountPointsTable();
467
468 _log = new QTextEdit();
469 _log->setReadOnly(true);
470 QFont msFont(""); msFont.setStyleHint(QFont::TypeWriter); // default monospace font
471 _log->setFont(msFont);
472 _log->document()->setMaximumBlockCount(1000);
473
474 // Combine Corrections
475 // -------------------
476 _cmbTable = new QTableWidget(0,3);
477 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight Factor").split(","));
478 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
479 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
480 _cmbTable->setMaximumWidth(30*ww);
481 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
482 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
483 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
484#if QT_VERSION < 0x050000
485 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
486#else
487 _cmbTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
488#endif
489 _cmbTable->horizontalHeader()->setStretchLastSection(true);
490 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
491
492 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
493
494 _cmbSamplSpinBox = new QSpinBox;
495 _cmbSamplSpinBox->setMinimum(0);
496 _cmbSamplSpinBox->setMaximum(60);
497 _cmbSamplSpinBox->setSingleStep(5);
498 _cmbSamplSpinBox->setMaximumWidth(9*ww);
499 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
500 _cmbSamplSpinBox->setSuffix(" sec");
501
502 QPushButton* addCmbRowButton = new QPushButton("Add Row");
503 QPushButton* delCmbRowButton = new QPushButton("Delete");
504
505 connect(_cmbTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
506
507 _cmbMethodComboBox = new QComboBox();
508 _cmbMethodComboBox->setEditable(false);
509 _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
510 int cm = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
511 if (cm != -1) {
512 _cmbMethodComboBox->setCurrentIndex(cm);
513 }
514
515 int iRow = _cmbTable->rowCount();
516 if (iRow > 0) {
517 enableWidget(true, _cmbMethodComboBox);
518 enableWidget(true, _cmbMaxresLineEdit);
519 enableWidget(true, _cmbSamplSpinBox);
520 }
521 else {
522 enableWidget(false, _cmbMethodComboBox);
523 enableWidget(false, _cmbMaxresLineEdit);
524 enableWidget(false, _cmbSamplSpinBox);
525 }
526 _cmbGpsCheckBox = new QCheckBox();
527 _cmbGpsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGps").toInt()));
528 _cmbGloCheckBox = new QCheckBox();
529 _cmbGloCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGlo").toInt()));
530 _cmbGalCheckBox = new QCheckBox();
531 _cmbGalCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGal").toInt()));
532 _cmbBdsCheckBox = new QCheckBox();
533 _cmbBdsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbBds").toInt()));
534 _cmbQzssCheckBox = new QCheckBox();
535 _cmbQzssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbQzss").toInt()));
536 _cmbSbasCheckBox = new QCheckBox();
537 _cmbSbasCheckBox->setCheckState(Qt::CheckState(settings.value("cmbSbas").toInt()));
538 _cmbIrnssCheckBox = new QCheckBox();
539 _cmbIrnssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbIrnss").toInt()));
540
541 connect(_cmbGpsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
542 connect(_cmbGloCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
543 connect(_cmbGalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
544 connect(_cmbBdsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
545 connect(_cmbQzssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
546 connect(_cmbSbasCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
547 connect(_cmbIrnssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
548
549 _cmbBsxFile = new qtFileChooser(0, qtFileChooser::File);
550 _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
551
552 // Upload Results
553 // -------------
554 _uploadTable = new QTableWidget(0,16);
555 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, bytes").split(","));
556 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
557 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
558 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
559 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
560 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
561 _uploadTable->horizontalHeader()->resizeSection( 3, 6*ww);
562 _uploadTable->horizontalHeader()->resizeSection( 4, 8*ww);
563 _uploadTable->horizontalHeader()->resizeSection( 5, 8*ww);
564 _uploadTable->horizontalHeader()->resizeSection( 6,11*ww);
565 _uploadTable->horizontalHeader()->resizeSection( 7,11*ww);
566 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
567 _uploadTable->horizontalHeader()->resizeSection( 9,15*ww);
568 _uploadTable->horizontalHeader()->resizeSection(10,15*ww);
569 _uploadTable->horizontalHeader()->resizeSection(11,15*ww);
570 _uploadTable->horizontalHeader()->resizeSection(12, 4*ww);
571 _uploadTable->horizontalHeader()->resizeSection(13, 4*ww);
572 _uploadTable->horizontalHeader()->resizeSection(14, 4*ww);
573 _uploadTable->horizontalHeader()->resizeSection(15,12*ww);
574#if QT_VERSION < 0x050000
575 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
576#else
577 _uploadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
578#endif
579 _uploadTable->horizontalHeader()->setStretchLastSection(true);
580 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
581
582 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
583 SLOT(slotBncTextChanged()));
584
585 QPushButton* addUploadRowButton = new QPushButton("Add Row");
586 QPushButton* delUploadRowButton = new QPushButton("Del Row");
587 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
588 _uploadIntrComboBox = new QComboBox;
589 _uploadIntrComboBox->setEditable(false);
590 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
591 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
592 if (ii != -1) {
593 _uploadIntrComboBox->setCurrentIndex(ii);
594 }
595
596 _uploadAntexFile = new qtFileChooser(0, qtFileChooser::File);
597 _uploadAntexFile->setFileName(settings.value("uploadAntexFile").toString());
598
599 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
600 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
601 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
602 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
603 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
604 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
605 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
606
607 _uploadSamplSp3ComboBox = new QComboBox();
608 _uploadSamplSp3ComboBox->addItems(QString("0 sec,30 sec,60 sec,300 sec,900 sec").split(","));
609 int oo = _uploadSamplSp3ComboBox->findText(settings.value("uploadSamplSp3").toString());
610 if (oo != -1) {
611 _uploadSamplSp3ComboBox->setCurrentIndex(oo);
612 }
613
614 _uploadSamplClkRnxSpinBox = new QSpinBox;
615 _uploadSamplClkRnxSpinBox->setMinimum(0);
616 _uploadSamplClkRnxSpinBox->setMaximum(60);
617 _uploadSamplClkRnxSpinBox->setSingleStep(5);
618 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
619 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
620 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
621
622 _uploadSamplBiaSnxSpinBox = new QSpinBox;
623 _uploadSamplBiaSnxSpinBox->setMinimum(0);
624 _uploadSamplBiaSnxSpinBox->setMaximum(60);
625 _uploadSamplBiaSnxSpinBox->setSingleStep(5);
626 _uploadSamplBiaSnxSpinBox->setMaximumWidth(9*ww);
627 _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
628 _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
629
630 int iRowT = _uploadTable->rowCount();
631 if (iRowT > 0) {
632 enableWidget(true, _uploadIntrComboBox);
633 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
634 enableWidget(true, _uploadSamplSp3ComboBox);
635 enableWidget(true, _uploadSamplClkRnxSpinBox);
636 enableWidget(true, _uploadSamplBiaSnxSpinBox);
637 enableWidget(true, _uploadAntexFile);
638 }
639 else {
640 enableWidget(false, _uploadIntrComboBox);
641 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
642 enableWidget(false, _uploadSamplSp3ComboBox);
643 enableWidget(false, _uploadSamplClkRnxSpinBox);
644 enableWidget(true, _uploadSamplBiaSnxSpinBox);
645 enableWidget(false, _uploadAntexFile);
646 }
647
648 // Upload RTCM3 Ephemeris
649 // ----------------------
650 _uploadEphTable = new QTableWidget(0,6);
651 _uploadEphTable->setColumnCount(8);
652 _uploadEphTable->setRowCount(0);
653 _uploadEphTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, bytes").split(","));
654 _uploadEphTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
655 _uploadEphTable->setSelectionBehavior(QAbstractItemView::SelectRows);
656 _uploadEphTable->horizontalHeader()->resizeSection( 0,13*ww);
657 _uploadEphTable->horizontalHeader()->resizeSection( 1, 5*ww);
658 _uploadEphTable->horizontalHeader()->resizeSection( 2, 8*ww);
659 _uploadEphTable->horizontalHeader()->resizeSection( 3, 6*ww);
660 _uploadEphTable->horizontalHeader()->resizeSection( 4, 8*ww);
661 _uploadEphTable->horizontalHeader()->resizeSection( 3, 8*ww);
662 _uploadEphTable->horizontalHeader()->resizeSection( 5,10*ww);
663 _uploadEphTable->horizontalHeader()->resizeSection( 6,12*ww);
664#if QT_VERSION < 0x050000
665 _uploadEphTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
666#else
667 _uploadEphTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
668#endif
669 _uploadEphTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
670
671 connect(_uploadEphTable, SIGNAL(itemSelectionChanged()),
672 SLOT(slotBncTextChanged()));
673
674 QPushButton* addUploadEphRowButton = new QPushButton("Add Row");
675 addUploadEphRowButton->setMaximumWidth(9*ww);
676 QPushButton* delUploadEphRowButton = new QPushButton("Del Row");
677 delUploadEphRowButton->setMaximumWidth(9*ww);
678
679 _uploadSamplRtcmEphSpinBox = new QSpinBox;
680 _uploadSamplRtcmEphSpinBox->setMinimum(0);
681 _uploadSamplRtcmEphSpinBox->setMaximum(60);
682 _uploadSamplRtcmEphSpinBox->setSingleStep(5);
683 _uploadSamplRtcmEphSpinBox->setMaximumWidth(9*ww);
684 _uploadSamplRtcmEphSpinBox->setValue(settings.value("uploadSamplRtcmEph").toInt());
685 _uploadSamplRtcmEphSpinBox->setSuffix(" sec");
686
687 iRowT = _uploadEphTable->rowCount();
688 if (iRowT > 0) {
689 enableWidget(true, _uploadSamplRtcmEphSpinBox);
690 }
691 else {
692 enableWidget(false, _uploadSamplRtcmEphSpinBox);
693 }
694
695 // Canvas with Editable Fields
696 // ---------------------------
697 _canvas = new QWidget;
698 setCentralWidget(_canvas);
699
700 _aogroup = new QTabWidget();
701 _aogroup->setElideMode(Qt::ElideNone);
702 _aogroup->setUsesScrollButtons(true);
703 QWidget* pgroup = new QWidget();
704 QWidget* ggroup = new QWidget();
705 QWidget* sgroup = new QWidget();
706 QWidget* egroup = new QWidget();
707 QWidget* agroup = new QWidget();
708 QWidget* cgroup = new QWidget();
709 QWidget* ogroup = new QWidget();
710 QWidget* rgroup = new QWidget();
711 QWidget* sergroup = new QWidget();
712 QWidget* pppGroup1 = new QWidget();
713 QWidget* pppGroup2 = new QWidget();
714 QWidget* pppGroup3 = new QWidget();
715 QWidget* pppGroup4 = new QWidget();
716 QWidget* reqcgroup = new QWidget();
717 QWidget* sp3CompGroup = new QWidget();
718 QWidget* cmbgroup = new QWidget();
719 QWidget* uploadgroup = new QWidget();
720 QWidget* uploadEphgroup = new QWidget();
721 _aogroup->addTab(pgroup,tr("Network"));
722 _aogroup->addTab(ggroup,tr("General"));
723 _aogroup->addTab(ogroup,tr("RINEX Observations"));
724 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
725 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
726 _aogroup->addTab(sp3CompGroup,tr("SP3 Comparison"));
727 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
728 _aogroup->addTab(sgroup,tr("Feed Engine"));
729 _aogroup->addTab(sergroup,tr("Serial Output"));
730 _aogroup->addTab(agroup,tr("Outages"));
731 _aogroup->addTab(rgroup,tr("Miscellaneous"));
732 _aogroup->addTab(pppGroup1,tr("PPP (1)"));
733 _aogroup->addTab(pppGroup2,tr("PPP (2)"));
734 _aogroup->addTab(pppGroup3,tr("PPP (3)"));
735 _aogroup->addTab(pppGroup4,tr("PPP (4)"));
736 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
737 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
738 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
739
740 // Log Tab
741 // -------
742 _loggroup = new QTabWidget();
743 _loggroup->addTab(_log,tr("Log"));
744 _loggroup->addTab(_bncFigure,tr("Throughput"));
745 _loggroup->addTab(_bncFigureLate,tr("Latency"));
746 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
747
748 // Netowork (Proxy and SSL) Tab
749 // ----------------------------
750 QGridLayout* pLayout = new QGridLayout;
751 pLayout->setColumnMinimumWidth(0,13*ww);
752 _proxyPortLineEdit->setMaximumWidth(9*ww);
753
754 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none.<br>"),0, 0, 1, 50);
755 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
756 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
757 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
758 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
759 pLayout->addWidget(new QLabel("Path to SSL certificates"), 3, 0);
760 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
761 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
762 pLayout->addWidget(new QLabel("Path to SSL client certificates"), 4, 0);
763 pLayout->addWidget(_sslClientCertPathLineEdit, 4, 1, 1,10);
764 pLayout->addWidget(new QLabel("Ignore SSL authorization errors"), 5, 0);
765 pLayout->addWidget(_sslIgnoreErrorsCheckBox, 5, 1, 1,10);
766 pLayout->addWidget(new QLabel(""), 6, 1);
767 pLayout->setRowStretch(6, 999);
768
769 pgroup->setLayout(pLayout);
770
771 // General Tab
772 // -----------
773 QGridLayout* gLayout = new QGridLayout;
774 gLayout->setColumnMinimumWidth(0,14*ww);
775 _onTheFlyComboBox->setMaximumWidth(9*ww);
776
777 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, auto-start, and raw file output.<br>"),0, 0, 1, 50);
778 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
779 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,20);
780 gLayout->addWidget(new QLabel("Append files"), 2, 0);
781 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
782 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
783 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
784 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
785 gLayout->addWidget(_autoStartCheckBox, 4, 1);
786 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
787 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,20);
788 gLayout->addWidget(new QLabel(""), 6, 1);
789 gLayout->setRowStretch(7, 999);
790
791 ggroup->setLayout(gLayout);
792
793 // RINEX Observations
794 // ------------------
795 QGridLayout* oLayout = new QGridLayout;
796 oLayout->setColumnMinimumWidth(0,14*ww);
797 _rnxIntrComboBox->setMaximumWidth(9*ww);
798 _rnxSamplComboBox->setMaximumWidth(9*ww);
799 _rnxSkelExtComboBox->setMaximumWidth(9*ww);
800
801 oLayout->addWidget(new QLabel("Saving RINEX observation files.<br>"),0, 0, 1,50);
802 oLayout->addWidget(new QLabel("Directory"), 1, 0);
803 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1, 15);
804 oLayout->addWidget(new QLabel("Interval"), 2, 0);
805 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
806 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
807 oLayout->addWidget(_rnxSamplComboBox, 2, 3, Qt::AlignRight);
808 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
809 oLayout->addWidget(_rnxSkelExtComboBox, 3, 1, Qt::AlignLeft);
810 oLayout->addWidget(new QLabel("Skeleton mandatory"), 3, 2, Qt::AlignRight);
811 oLayout->addWidget(_rnxFileCheckBox, 3, 3);
812 oLayout->addWidget(new QLabel("Skeleton Directory"), 4, 0);
813 oLayout->addWidget(_rnxSkelPathLineEdit, 4, 1, 1, 15);
814 oLayout->addWidget(new QLabel("Script (full path)"), 5, 0);
815 oLayout->addWidget(_rnxScrpLineEdit, 5, 1, 1, 15);
816 oLayout->addWidget(new QLabel("Version"), 6, 0);
817 oLayout->addWidget(_rnxVersComboBox, 6, 1);
818 oLayout->addWidget(new QLabel("Signal priority"), 6, 2, Qt::AlignRight);
819 oLayout->addWidget(_rnxV2Priority, 6, 3, 1, 13);
820 oLayout->addWidget(new QLabel(""), 7, 1);
821 oLayout->setRowStretch(8, 999);
822
823 ogroup->setLayout(oLayout);
824
825 // RINEX Ephemeris
826 // ---------------
827 QGridLayout* eLayout = new QGridLayout;
828 eLayout->setColumnMinimumWidth(0,14*ww);
829 _ephIntrComboBox->setMaximumWidth(9*ww);
830 _ephOutPortLineEdit->setMaximumWidth(9*ww);
831
832 eLayout->addWidget(new QLabel("Saving RINEX navigation files and ephemeris output through IP port.<br>"),0,0,1,70);
833 eLayout->addWidget(new QLabel("Directory"), 1, 0);
834 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
835 eLayout->addWidget(new QLabel("Interval"), 2, 0);
836 eLayout->addWidget(_ephIntrComboBox, 2, 1);
837 eLayout->addWidget(new QLabel("Port"), 3, 0);
838 eLayout->addWidget(_ephOutPortLineEdit, 3, 1);
839 eLayout->addWidget(new QLabel("Version"), 4, 0);
840 eLayout->addWidget(_ephVersComboBox, 4, 1);
841 eLayout->setRowStretch(5, 999);
842 //eLayout->addWidget(new QLabel("File per Station"), 5, 0);
843 //eLayout->addWidget(_ephFilePerStation, 5, 1);
844 //eLayout->setRowStretch(6, 999);
845
846 egroup->setLayout(eLayout);
847
848
849 // Broadcast Corrections
850 // ---------------------
851 QGridLayout* cLayout = new QGridLayout;
852 cLayout->setColumnMinimumWidth(0,14*ww);
853 _corrIntrComboBox->setMaximumWidth(9*ww);
854 _corrPortLineEdit->setMaximumWidth(9*ww);
855
856 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port.<br>"),0,0,1,70);
857 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
858 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,30);
859 cLayout->addWidget(new QLabel("Interval"), 2, 0);
860 cLayout->addWidget(_corrIntrComboBox, 2, 1);
861 cLayout->addWidget(new QLabel("Port"), 3, 0);
862 cLayout->addWidget(_corrPortLineEdit, 3, 1);
863 cLayout->addWidget(new QLabel(""), 4, 1);
864 cLayout->setRowStretch(7, 999);
865 cgroup->setLayout(cLayout);
866
867 // Feed Engine
868 // -----------
869 QGridLayout* sLayout = new QGridLayout;
870 sLayout->setColumnMinimumWidth(0,14*ww);
871 _outPortLineEdit->setMaximumWidth(9*ww);
872 _outWaitSpinBox->setMaximumWidth(9*ww);
873 _outSamplComboBox->setMaximumWidth(9*ww);
874 _outUPortLineEdit->setMaximumWidth(9*ww);
875
876 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine.<br>"),0,0,1,50);
877 sLayout->addWidget(new QLabel("Port"), 1, 0);
878 sLayout->addWidget(_outPortLineEdit, 1, 1);
879 sLayout->addWidget(new QLabel(" Wait for full obs epoch"), 1, 2, Qt::AlignRight);
880 sLayout->addWidget(_outWaitSpinBox, 1, 3, Qt::AlignLeft);
881 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
882 sLayout->addWidget(_outSamplComboBox, 2, 1, Qt::AlignLeft);
883 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
884 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 10);
885 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
886 sLayout->addWidget(_outUPortLineEdit, 4, 1);
887 sLayout->addWidget(new QLabel("Print lock time"), 5, 0);
888 sLayout->addWidget(_outLockTimeCheckBox, 5, 1);
889 sLayout->addWidget(new QLabel(""), 6, 1);
890 sLayout->setRowStretch(7, 999);
891
892 sgroup->setLayout(sLayout);
893
894 // Serial Output
895 // -------------
896 QGridLayout* serLayout = new QGridLayout;
897 serLayout->setColumnMinimumWidth(0,12*ww);
898 _serialBaudRateComboBox->setMaximumWidth(9*ww);
899 _serialFlowControlComboBox->setMaximumWidth(11*ww);
900 _serialDataBitsComboBox->setMaximumWidth(5*ww);
901 _serialParityComboBox->setMaximumWidth(9*ww);
902 _serialStopBitsComboBox->setMaximumWidth(5*ww);
903 _serialAutoNMEAComboBox->setMaximumWidth(14*ww);
904 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
905 _serialManualNMEASamplingSpinBox->setMaximumWidth(8*ww);
906
907 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver.<br>"),0,0,1,30);
908 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
909 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
910 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
911 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
912 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
913 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
914 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
915 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
916 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
917 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
918 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
919 serLayout->addWidget(_serialParityComboBox, 4, 3);
920 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
921 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
922 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
923 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
924 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
925 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,10);
926 serLayout->addWidget(new QLabel("Height"), 5,14, Qt::AlignRight);
927 serLayout->addWidget(_serialHeightNMEALineEdit, 5,15, 1,11);
928 serLayout->addWidget(new QLabel("Sampling"), 5,25, Qt::AlignRight);
929 serLayout->addWidget(_serialManualNMEASamplingSpinBox, 5,26, 1,12);
930 serLayout->addWidget(new QLabel(""), 6, 1);
931 serLayout->setRowStretch(7, 999);
932
933 sergroup->setLayout(serLayout);
934
935 // Outages
936 // -------
937 QGridLayout* aLayout = new QGridLayout;
938 aLayout->setColumnMinimumWidth(0,14*ww);
939 _adviseObsRateComboBox->setMaximumWidth(9*ww);
940 _adviseFailSpinBox->setMaximumWidth(9*ww);
941 _adviseRecoSpinBox->setMaximumWidth(9*ww);
942
943 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes.<br>"),0,0,1,50,Qt::AlignLeft);
944 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
945 aLayout->addWidget(_adviseObsRateComboBox, 1, 1);
946 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
947 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
948 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
949 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
950 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
951 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,20);
952 aLayout->addWidget(new QLabel(""), 5, 1);
953 aLayout->setRowStretch(6, 999);
954
955 agroup->setLayout(aLayout);
956
957 // Miscellaneous
958 // -------------
959 QGridLayout* rLayout = new QGridLayout;
960 rLayout->setColumnMinimumWidth(0,14*ww);
961 _miscIntrComboBox->setMaximumWidth(9*ww);
962 _miscPortLineEdit->setMaximumWidth(9*ww);
963
964 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for message types and antenna information or output raw data through TCP/IP port.<br>"),0, 0,1,50);
965 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
966 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1, 7);
967 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
968 rLayout->addWidget(_miscIntrComboBox, 2, 1);
969 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
970 rLayout->addWidget(_miscScanRTCMCheckBox, 3, 1);
971 rLayout->addWidget(new QLabel("Port"), 4, 0);
972 rLayout->addWidget(_miscPortLineEdit, 4, 1);
973 rLayout->addWidget(new QLabel(""), 5, 1);
974 rLayout->setRowStretch(6, 999);
975
976 rgroup->setLayout(rLayout);
977
978 // PPP
979 // ---
980 _pppWidgets._dataSource->setMaximumWidth(15*ww);
981 _pppWidgets._corrMount->setMaximumWidth(15*ww);
982 _pppWidgets._nmeaPath->setMaximumWidth(35*ww);
983 _pppWidgets._logPath->setMaximumWidth(35*ww);
984 _pppWidgets._snxtroPath->setMaximumWidth(35*ww);
985 _pppWidgets._snxtroIntr->setMaximumWidth(7*ww);
986 _pppWidgets._snxtroAc->setMaximumWidth(7*ww);
987 _pppWidgets._snxtroSolId->setMaximumWidth(7*ww);
988 _pppWidgets._snxtroSolType->setMaximumWidth(7*ww);
989 _pppWidgets._snxtroCampId->setMaximumWidth(7*ww);
990 _pppWidgets._ionoMount->setMaximumWidth(15*ww);
991
992
993 QGridLayout* pppLayout1 = new QGridLayout();
994 int ir = 0;
995 pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
996 ++ir;
997 pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
998 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
999 pppLayout1->addWidget(new QLabel(" Logfile directory"), ir, 4);
1000 pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
1001 ++ir;
1002 pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
1003 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
1004 pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
1005 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
1006 pppLayout1->addWidget(new QLabel(" NMEA directory"), ir, 4);
1007 pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
1008 ++ir;
1009#ifdef USE_PPP
1010 pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
1011 pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
1012 pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
1013 pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
1014#endif
1015 pppLayout1->addWidget(new QLabel(" SNX TRO directory"), ir, 4);
1016 pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
1017 ++ir;
1018 pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
1019 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
1020 pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
1021 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
1022 pppLayout1->addWidget(new QLabel(" SNX TRO interval"), ir, 4);
1023 pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
1024 pppLayout1->addWidget(new QLabel(" SNX TRO sampling"), ir, 6);
1025 pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
1026 ++ir;
1027 pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 0);
1028 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1);
1029 pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 2);
1030 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 3);
1031 pppLayout1->addWidget(new QLabel(" SNX TRO AC"), ir, 4);
1032 pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
1033 pppLayout1->addWidget(new QLabel(" SNX TRO solution ID"),ir, 6);
1034 pppLayout1->addWidget(_pppWidgets._snxtroSolId, ir, 7, Qt::AlignRight);
1035 ++ir;
1036#ifdef USE_PPP
1037 pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
1038 pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
1039 pppLayout1->addWidget(new QLabel(" SNX TRO campaign ID"), ir, 4);
1040 pppLayout1->addWidget(_pppWidgets._snxtroCampId, ir, 5);
1041 pppLayout1->addWidget(new QLabel(" SNX TRO solution type"),ir, 6);
1042 pppLayout1->addWidget(_pppWidgets._snxtroSolType, ir, 7, Qt::AlignRight);
1043#endif
1044 pppLayout1->setRowStretch(ir+1, 999);
1045 pppGroup1->setLayout(pppLayout1);
1046
1047 QGridLayout* pppLayout2 = new QGridLayout();
1048 ir = 0;
1049 pppLayout2->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
1050 ++ir;
1051 pppLayout2->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
1052 pppLayout2->addWidget(_pppWidgets._lcGPS, ir, 1);
1053 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1054 pppLayout2->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
1055 pppLayout2->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
1056 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1057 pppLayout2->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
1058 pppLayout2->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
1059 ++ir;
1060 pppLayout2->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
1061 pppLayout2->addWidget(_pppWidgets._lcGLONASS, ir, 1);
1062 pppLayout2->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
1063 pppLayout2->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8*ww);
1064 pppLayout2->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
1065 pppLayout2->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8*ww);
1066 ++ir;
1067 pppLayout2->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
1068 pppLayout2->addWidget(_pppWidgets._lcGalileo, ir, 1);
1069 pppLayout2->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
1070 pppLayout2->addWidget(_pppWidgets._eleWgtCode, ir, 4);
1071 pppLayout2->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
1072 pppLayout2->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
1073 ++ir;
1074 pppLayout2->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
1075 pppLayout2->addWidget(_pppWidgets._lcBDS, ir, 1);
1076 pppLayout2->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
1077 pppLayout2->addWidget(_pppWidgets._minObs, ir, 4);
1078 pppLayout2->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
1079 pppLayout2->addWidget(_pppWidgets._minEle, ir, 7);_pppWidgets._minEle->setMaximumWidth(8*ww);
1080 ++ir;
1081#ifdef USE_PPP
1082 pppLayout2->addWidget(new QLabel("Constraints"), ir, 0, Qt::AlignLeft);
1083 pppLayout2->addWidget(_pppWidgets._constraints, ir, 1);
1084 pppLayout2->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
1085 pppLayout2->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8*ww);
1086#endif
1087 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1088 pppLayout2->addWidget(new QLabel("Wait for clock corr."), ir, 6, Qt::AlignLeft);
1089 pppLayout2->addWidget(_pppWidgets._corrWaitTime, ir, 7);
1090 ++ir;
1091 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1092#ifdef USE_PPP
1093 pppLayout2->addWidget(new QLabel("Max Res GIM"), ir, 3, Qt::AlignLeft);
1094 pppLayout2->addWidget(_pppWidgets._maxResGIM, ir, 4); _pppWidgets._maxResGIM->setMaximumWidth(8*ww);
1095#endif
1096 pppLayout2->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
1097 pppLayout2->addWidget(_pppWidgets._seedingTime, ir, 7);_pppWidgets._seedingTime->setMaximumWidth(8*ww);
1098 ++ir;
1099 pppLayout2->addWidget(new QLabel(""), ir, 8);
1100 pppLayout2->setColumnStretch(8, 999);
1101 ++ir;
1102 pppLayout2->addWidget(new QLabel(""), ir, 1);
1103 pppLayout2->setRowStretch(ir, 999);
1104
1105 pppGroup2->setLayout(pppLayout2);
1106
1107 QVBoxLayout* pppLayout3 = new QVBoxLayout();
1108 pppLayout3->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
1109 pppLayout3->addWidget(_pppWidgets._staTable, 99);
1110 QHBoxLayout* pppLayout3sub = new QHBoxLayout();
1111 pppLayout3sub->addWidget(_pppWidgets._addStaButton);
1112 pppLayout3sub->addWidget(_pppWidgets._delStaButton);
1113 pppLayout3sub->addStretch(99);
1114
1115 pppLayout3->addLayout(pppLayout3sub);
1116
1117 pppGroup3->setLayout(pppLayout3);
1118
1119 // ------------------------
1120 connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
1121 _pppWidgets._mapSpeedSlider->setMinimumWidth(33*ww);
1122 _pppWidgets._audioResponse->setMaximumWidth(8*ww);
1123
1124 QGridLayout* pppLayout4 = new QGridLayout();
1125 ir = 0;
1126 pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
1127 ++ir;
1128 pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
1129 pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
1130 pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
1131 pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
1132 pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
1133 ++ir;
1134 pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
1135 pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
1136 ++ir;
1137 pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
1138 pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
1139 pppLayout4->addWidget(new QLabel("Size "), ir, 2, Qt::AlignLeft);
1140 pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
1141 pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
1142 ++ir;
1143 pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
1144 pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
1145 ++ir;
1146 pppLayout4->addWidget(new QLabel(""), ir, 1);
1147 pppLayout4->setRowStretch(ir, 999);
1148
1149 pppGroup4->setLayout(pppLayout4);
1150
1151 // Reqc Processing
1152 // ---------------
1153 _reqcActionComboBox = new QComboBox();
1154 _reqcActionComboBox->setEditable(false);
1155 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1156 int ip = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1157 if (ip != -1) {
1158 _reqcActionComboBox->setCurrentIndex(ip);
1159 }
1160 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1161 this, SLOT(slotBncTextChanged()));
1162
1163 QGridLayout* reqcLayout = new QGridLayout;
1164 _reqcActionComboBox->setMinimumWidth(15*ww);
1165 _reqcActionComboBox->setMaximumWidth(20*ww);
1166
1167 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1168 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1169
1170 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1171 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1172 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1173 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1174 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1175 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1176 _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
1177
1178 connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString &)),
1179 this, SLOT(slotBncTextChanged()));
1180
1181 _reqcLogSummaryOnly = new QCheckBox();
1182 _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
1183
1184 ir = 0;
1185 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"),ir, 0, 1, 8);
1186 ++ir;
1187 reqcLayout->addWidget(new QLabel("Action"), ir, 0);
1188 reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
1189 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1190 _reqcEditOptionButton->setMinimumWidth(15*ww);
1191 _reqcEditOptionButton->setMaximumWidth(20*ww);
1192
1193 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
1194 ++ir;
1195 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
1196 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
1197 _reqcObsFileChooser->setMaximumWidth(40*ww);
1198 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1199 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
1200 _reqcNavFileChooser->setMaximumWidth(40*ww);
1201 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1202 ++ir;
1203 reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
1204 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
1205 _reqcOutObsLineEdit->setMaximumWidth(40*ww);
1206 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1207 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
1208 _reqcOutNavLineEdit->setMaximumWidth(40*ww);
1209 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1210 ++ir;
1211 reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
1212 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
1213 _reqcOutLogLineEdit->setMaximumWidth(40*ww);
1214 reqcLayout->addWidget(new QLabel(" Summary only"), ir, 2);
1215 reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
1216 ++ir;
1217 reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
1218 reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
1219 _reqcSkyPlotSignals->setMaximumWidth(40*ww);
1220 ++ir;
1221 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
1222 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
1223 _reqcPlotDirLineEdit->setMaximumWidth(40*ww);
1224 ++ir;
1225 reqcLayout->setRowStretch(ir, 999);
1226
1227 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1228 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1229
1230 reqcgroup->setLayout(reqcLayout);
1231
1232 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1233 this, SLOT(slotReqcEditOption()));
1234
1235 QGridLayout* sp3CompLayout = new QGridLayout;
1236
1237 _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1238 _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
1239 _sp3CompFileChooser->setMinimumWidth(15*ww);
1240 _sp3CompFileChooser->setMaximumWidth(40*ww);
1241
1242 _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
1243 _sp3CompExclude->setMinimumWidth(18*ww);
1244 _sp3CompExclude->setMaximumWidth(18*ww);
1245
1246 _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
1247 _sp3CompLogLineEdit->setMinimumWidth(18*ww);
1248 _sp3CompLogLineEdit->setMaximumWidth(18*ww);
1249
1250 _sp3CompSummaryOnly = new QCheckBox();
1251 _sp3CompSummaryOnly->setCheckState(Qt::CheckState(settings.value("sp3CompSummaryOnly").toInt()));
1252
1253 ir = 0;
1254 sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
1255 ++ir;
1256 sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
1257 sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
1258 ++ir;
1259 sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
1260 sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
1261 ++ir;
1262 sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
1263 sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
1264 ++ir;
1265 sp3CompLayout->addWidget(new QLabel("Summary only"), ir, 0);
1266 sp3CompLayout->addWidget(_sp3CompSummaryOnly, ir, 1);
1267 ++ir;
1268 sp3CompLayout->addWidget(new QLabel(""), ir, 1);
1269 ++ir;
1270 sp3CompLayout->setRowStretch(ir, 999);
1271
1272 sp3CompLayout->setColumnMinimumWidth(2, 8*ww);
1273 sp3CompLayout->setColumnMinimumWidth(4, 8*ww);
1274
1275 sp3CompGroup->setLayout(sp3CompLayout);
1276
1277 connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString &)),
1278 this, SLOT(slotBncTextChanged()));
1279
1280 // Combine Corrections
1281 // -------------------
1282 QGridLayout* cmbLayout = new QGridLayout;
1283
1284 populateCmbTable();
1285 cmbLayout->addWidget(_cmbTable, 0, 0, 8, 6);
1286 cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams.<br>"), 1, 6, 1, 10);
1287 cmbLayout->addWidget(addCmbRowButton, 2, 6);
1288 cmbLayout->addWidget(delCmbRowButton, 2, 7);
1289 cmbLayout->addWidget(new QLabel("Method"), 3, 6, Qt::AlignLeft);
1290 cmbLayout->addWidget(_cmbMethodComboBox, 3, 7);
1291 cmbLayout->addWidget(new QLabel("BSX File"), 4, 6, Qt::AlignLeft);
1292 cmbLayout->addWidget(_cmbBsxFile, 4, 7, Qt::AlignRight);
1293 cmbLayout->addWidget(new QLabel("Max Residual"), 5, 6, Qt::AlignLeft);
1294 cmbLayout->addWidget(_cmbMaxresLineEdit, 5, 7, Qt::AlignRight);
1295 cmbLayout->addWidget(new QLabel("Sampling"), 6, 6, Qt::AlignLeft);
1296 cmbLayout->addWidget(_cmbSamplSpinBox, 6, 7, Qt::AlignRight);
1297 cmbLayout->addWidget(new QLabel("GNSS"), 7, 6, Qt::AlignLeft);
1298 cmbLayout->addWidget(new QLabel("GPS (C1W/C2W)"), 7, 7);
1299 cmbLayout->addWidget(_cmbGpsCheckBox, 7, 8);
1300 cmbLayout->addWidget(new QLabel("GLONASS (C1P/C2P)"), 7, 9);
1301 cmbLayout->addWidget(_cmbGloCheckBox, 7, 10);
1302 cmbLayout->addWidget(new QLabel("Galileo (C1C/C5Q)"), 7, 11);
1303 cmbLayout->addWidget(_cmbGalCheckBox, 7, 12);
1304 cmbLayout->addWidget(new QLabel("Beidou (C2I/C6I)"), 7, 13);
1305 cmbLayout->addWidget(_cmbBdsCheckBox, 7, 14);
1306 cmbLayout->addWidget(new QLabel("QZSS (C1C/C2L)"), 8, 7);
1307 cmbLayout->addWidget(_cmbQzssCheckBox, 8, 8);
1308 cmbLayout->addWidget(new QLabel("SBAS (C1C/C5Q)"), 8, 9);
1309 cmbLayout->addWidget(_cmbSbasCheckBox, 8, 10);
1310 cmbLayout->addWidget(new QLabel("IRNSS"), 8, 11);
1311 cmbLayout->addWidget(_cmbIrnssCheckBox, 8, 12);
1312 cmbLayout->setRowStretch(8, 999);
1313
1314 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1315 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1316
1317 cmbgroup->setLayout(cmbLayout);
1318
1319 // Upload Layout (Clocks)
1320 // ----------------------
1321 QGridLayout* uploadHlpLayout = new QGridLayout();
1322
1323 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1324 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1325 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1326
1327 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1328 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1329 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1330 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1331 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1332 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1333 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1334 uploadHlpLayout->addWidget(_uploadSamplSp3ComboBox, 0, 7);
1335 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1336 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1337 uploadHlpLayout->addWidget(new QLabel("BSX"), 0,10, Qt::AlignRight);
1338 uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox, 0,11);
1339 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,12);
1340 uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
1341 uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
1342
1343 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1344 populateUploadTable();
1345
1346 uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to caster.<br>"));
1347 uploadLayout->addWidget(_uploadTable);
1348 uploadLayout->addLayout(uploadHlpLayout);
1349
1350 uploadgroup->setLayout(uploadLayout);
1351
1352 // Upload Layout (Ephemeris)
1353 // -------------------------
1354 QGridLayout* uploadHlpLayoutEph = new QGridLayout();
1355
1356 connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
1357 connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
1358
1359 uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
1360 uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
1361 uploadHlpLayoutEph->addWidget(new QLabel(" Sampling"), 0, 2, Qt::AlignRight);
1362 uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
1363
1364 QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
1365 populateUploadEphTable();
1366
1367 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster.<br>"));
1368 uploadLayoutEph->addWidget(_uploadEphTable);
1369 uploadLayoutEph->addLayout(uploadHlpLayoutEph);
1370
1371 uploadEphgroup->setLayout(uploadLayoutEph);
1372
1373
1374 // Main Layout
1375 // -----------
1376 QGridLayout* mLayout = new QGridLayout;
1377 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1378 mLayout->addWidget(_aogroup, 0,0);
1379 mLayout->addWidget(_mountPointsTable, 1,0);
1380 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1381 mLayout->addWidget(_loggroup, 2,0);
1382
1383 _canvas->setLayout(mLayout);
1384
1385 // WhatsThis, Network
1386 // ------------------
1387 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you may 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. Without any entry, BNC will try to use the system proxies. </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 this is not possible, you may need to run BNC outside your LAN on a network that has unobstructed connection to the Internet. <i>[key: proxyHost]</i></p>"));
1388 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC. <i>[key: proxyPort]</i></p>"));
1389 _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an Ntrip Broadcaster over SSL requires the exchange of server certificates. Specify the path to a directory where you save CA certificates on your system. </p><p>BNC creates from *.crt and *.pem files a CA certificate database, which is used by the socket during the handshake phase to validate the peer's certificate. </p><p>Don't try communication via SSL if you are not sure whether this is supported by the involved Ntrip Broadcaster.</p><p>Note that SSL communication is usually done over port 443. <i>[key: sslCaCertPath]</i></p>"));
1390 _sslClientCertPathLineEdit->setWhatsThis(tr("<p>Two-sided communication with an Ntrip Broadcaster over SSL requires in addition the exchange of client certificates. Specify the full path to the client certificates on your system.</p><p></p><p>The file naming convention for client certificates in BNC is as follows: &lt;hostname&gt;.&lt;port&gt;.crt for the certificate and &lt;hostname&gt;.&lt;port&gt;.key for the private key, where &lt;hostname&gt; is without https://. </p><p> If available, the client or personal authentication certificate is presented to the peer during the SSL handshake process. Password protected key files are not supported. </p><p>Don't try communication via two sided SSL if you are not sure whether this is supported by the involved Ntrip Broadcaster. </p><p>Note that SSL communication is usually done over port 443. <i>[key: sslClientCertPath]</i></p>"));
1391 _sslIgnoreErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the Ntrip Broadcaster. Tick 'Ignore SSL authorization errors' if you don't want to be bothered with this. <i>[key: sslIgnoreErrors]</i></p>"));
1392
1393 // WhatsThis, General
1394 // ------------------
1395 _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 for that 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. <i>[key: logFile]</i></p>"));
1396 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and file content already available under the same name will be overwritten. However, users might want to append already existing files following a regular restart or a crash of BNC or its platform.</p><p>Tick 'Append files' to continue with existing files and keep what has been recorded so far. <i>[key: rnxAppend]</i></p>"));
1397 _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. The default entry is 'no' that means the reread function is switched of. <p></p>Select '1 min', '5 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, five minutes, 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 via button 'Save & Reread Configuration'. <i>[key: onTheFlyInterval]</i></p>"));
1398 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options. <i>[key: autoStart]</i></p>"));
1399 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p><p>This option is primarily meant for debugging purposes. <i>[key: rawOutFile]</i></p>"));
1400
1401 // WhatsThis, RINEX Observations
1402 // -----------------------------
1403 _rnxPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where the RINEX Observation files will be stored.</p><p>If the specified directory does not exist, BNC will not create RINEX Observation files. <i>[key: rnxPath]</i></p>"));
1404 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
1405 _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
1406 _rnxSkelExtComboBox->setWhatsThis(tr("<p>BNC allows using personal RINEX skeleton files that contain the RINEX header records you would like to include. You can derive a skeleton file from information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' skl or SKL is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream. <i>[key: rnxSkel]</i></p>"));
1407 _rnxSkelPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where local skeleton files are located.</p><p> If no directory is specified, the path is assumed to where the RINEX Observation files will stored. <i>[key: rnxSkelPath]</i></p>"));
1408 _rnxFileCheckBox->setWhatsThis(tr("<p>Tick check box 'Skeleton mandatory' in case you want that RINEX files are only produced if skeleton files are available for BNC. If no skeleton file is available for a particular source then no RINEX Observation file will be produced from the affected stream.</p><p>Note that a skeleton file contains RINEX header information such as receiver and antenna types. In case of stream conversion to RINEX Version 3, a skeleton file should also contain information on potentially available observation types. A missing skeleton file will therefore enforce BNC to only save a default set of RINEX 3 observation types. <i>[key: rnxOnlyWithSKL]</i></p>"));
1409 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is finally saved, you may want to compress, copy or upload it immediately, for example via FTP. BNC allows you to execute a script/batch file to carry out such operation.</p><p>Specify the full path of a script or batch file. BNC will pass the full RINEX Observation file path to the script as command line parameter (%1 on Windows systems, $1 on Unix/Linux/Mac systems). <i>[key: rnxScript]</i></p>"));
1410 _rnxV2Priority->setWhatsThis(tr("<p>Specify a priority list of characters defining signal attributes as defined in RINEX Version 3. Priorities will be used to map observations with RINEX Version 3 attributes from incoming streams to Version 2. The underscore character '_' stands for undefined attributes. A question mark '?' can be used as wildcard which represents any one character.</p><p>Signal priorities can be specified as equal for all systems, as system specific or as system and freq. specific. For example: </li><ul><li>'CWPX_?' (General signal priorities valid for all GNSS) </li><li>'I:ABCX' (System specific signal priorities for IRNSS) </li><li>'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX' (System and frequency specific signal priorities) </li></ul>Default is the following priority list 'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX'. <i>[key: rnxV2Priority]</i></p>"));
1411 _rnxVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Observation files. <i>[key: rnxVersion]</i></p>"));
1412
1413 // WhatsThis, RINEX Ephemeris
1414 // --------------------------
1415 _ephPathLineEdit->setWhatsThis(tr("<p>Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files.</p><p>If the specified directory does not exist, BNC will not create RINEX Navigation files. <i>[key: ephPath]</i></p>"));
1416 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
1417 _ephOutPortLineEdit->setWhatsThis(tr("<p>BNC can produce ephemeris data in RINEX Navigation ASCII format on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: ephOutPort]</i></p>"));
1418 _ephVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Navigation files. <i>[key: ephVersion]</i></p>"));
1419 //_ephFilePerStation->setWhatsThis(tr("<p>By default, all received Broadcast Ephemeris data will be stored within one File. Thick 'File per Stations' to get separate files per station/mountpoint. <i>[key: ephFilePerStation]</i></p>"));
1420
1421 // WhatsThis, RINEX Editing & QC
1422 // -----------------------------
1423 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to 'Edit or Concatenate' RINEX Version 2 or 3 files or to perform a Quality Check (QC) and 'Analyze' data following UNAVCO's famous 'teqc' program. <i>[key: reqcAction]</i></p>"));
1424 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
1425 _reqcObsFileChooser->setWhatsThis(tr("<p>Specify the full path to input observation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX observation file is mandatory. <i>[key: reqcObsFile]</i></p>"));
1426 _reqcNavFileChooser->setWhatsThis(tr("<p>Specify the full path to input navigation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX navigation file is mandatory. <i>[key: reqcNavFile]</i></p>"));
1427 _reqcOutObsLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Observation output file.</p><p>Default is an empty option field, meaning that no RINEX Observation output file will be produced. <i>[key: reqcOutObsFile]</i></p>"));
1428 _reqcOutNavLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Navigation output file.</p><p>Default is an empty option field, meaning that no RINEX Navigation output file will be produced. <i>[key: reqcOutNavFile]</i></p>"));
1429 _reqcOutLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile.</p><p>Default is an empty option field, meaning that no 'RINEX Editing & QC' logfile will be produced. <i>[key: reqcOutLogFile]</i></p>"));
1430 _reqcLogSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from editing or analyzing RINEX data. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: reqcLogSummaryOnly]</i></p>"));
1431 _reqcPlotDirLineEdit->setWhatsThis(tr("<p>Specify a directory for saving plots in PNG format.</p><p>Default is an empty option field, meaning that plots will not be saved on disk. <i>[key: reqcPlotDir]</i></p>"));
1432 _reqcSkyPlotSignals->setWhatsThis(tr("<p>BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values. The 'Plots for signals' option lets you exactly specify observation signals to be used for that and also enables the plot generation. You can specify the navigation system, the frequency, and the tracking mode or channel as defined in RINEX Version 3. Specifications for frequency and tracking mode or channel must be separated by ampersand character '&'. Specifications for navigation systems must be separated by blank character ' '.</p><p>Examples for 'Plots for signals' option:<ul><li> G:1&2&5 R:1&2&3 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
1433
1434 // WhatsThis, SP3 Comparison
1435 // -------------------------
1436 _sp3CompFileChooser->setWhatsThis(tr("<p>BNC can compare two SP3 files containing GNSS satellite orbit and clock information.</p></p>Specify the full path to two files with orbits and clocks in SP3 format, separate them by comma. <i>[key: sp3CompFile]</i></p>"));
1437 _sp3CompExclude->setWhatsThis(tr("<p>Specify satellites to exclude them from orbit and clock comparison. Example:<p>G04,G31,R</p><p>This excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from the comparison.</p><p>Default is an empty option field, meaning that no satellite is excluded from the comparison. <i>[key: sp3CompExclude]</i></p>"));
1438 _sp3CompLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile saving comparison results.</p><p>Specifying a logfile is mandatory. Comparing SP3 files and not saving comparison results on disk would be useless. <i>[key: sp3CompOutLogFile]</i></p>"));
1439 _sp3CompSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from comparing SP3 files. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: sp3CompSummaryOnly]</i></p>"));
1440
1441 // WhatsThis, Broadcast Corrections
1442 // --------------------------------
1443 _corrPathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving Broadcast Ephemeris Correction files.</p><p>If the specified directory does not exist, BNC will not create the files. <i>[key: corrPath]</i></p>"));
1444 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
1445 _corrPortLineEdit->setWhatsThis(tr("<p>BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: corrPort]</i></p>"));
1446
1447 // WhatsThis, Feed Engine
1448 // ----------------------
1449 _outPortLineEdit->setWhatsThis(tr("<p>BNC can produce synchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outPort]</i></p>"));
1450 _outWaitSpinBox->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 obs epoch' seconds.</p><p>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 product. <i>[key: outWait]</i></p>"));
1451 _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
1452 _outFileLineEdit->setWhatsThis(tr("<p>Specify the full path to a file where synchronized observations are saved in plain ASCII format.</p><p>Beware that the size of this file can rapidly increase depending on the number of incoming streams. <i>[key: outFile]</i></p>"));
1453 _outUPortLineEdit->setWhatsThis(tr("<p>BNC can produce unsynchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outUPort]</i></p>"));
1454 _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
1455
1456 // WhatsThis, Serial Output
1457 // ------------------------
1458 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p><p>Depending on the stream content, the receiver may use it for example for Differential GNSS, Precise Point Positioning or any other purpose supported by its firmware. <i>[key: serialMountPoint]</i></p>"));
1459 _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 before you start BNC, you must plug a serial cable in the port defined here. <i>[key: serialPortName]</i></p>"));
1460 _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. Using a high baud rate is recommended. <i>[key: serialBaudRate]</i></p>"));
1461 _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. <i>[key: serialFlowControl]</i></p>"));
1462 _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. <i>[key: serialDataBits]</i></p>"));
1463 _serialParityComboBox->setWhatsThis(tr("<p>Select a 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. The parity is often set to 'NONE'. <i>[key: serialParity]</i></p>"));
1464 _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. <i>[key: serialStopBits]</i></p>"));
1465 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>The 'NMEA' option supports the so-called 'Virtual Reference Station' (VRS) concept which requires the receiver to send approximate position information to the Ntrip Broadcaster. Select 'no' if you don't want BNC to forward or upload any NMEA message to the Ntrip Broadcaster in support of VRS.</p><p>Select 'Auto' to automatically forward NMEA messages of type GGA from your serial connected receiver to the Ntrip Broadcaster and/or save them in a file.</p><p>Select 'Manual GPGGA' or 'Manual GNGGA' if you want BNC to produce and upload GPGGA or GNGGA NMEA messages to the Ntrip Broadcaster because your serial connected receiver doesn't generate these messages. A Talker ID 'GP' preceding the GGA string stands for GPS solutions while a Talker ID 'GN' stands for multi constellation solutions.</p><p>Note that selecting 'Auto' or 'Manual' works only for VRS streams which show up under the 'Streams' canvas on BNC's main window with 'nmea' stream attribute set to 'yes'. This attribute is either extracted from the Ntrip Broadcaster's source-table or introduced by the user via editing the BNC configuration file. <i>[key: serialAutoNMEA]</i></p>"));
1466 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p><p>Default is an empty option field, meaning that NMEA messages will not be saved on disk. <i>[key: serialFileNMEA]</i></p>"));
1467 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meters for the reference station introduced by option 'Mountpoint'. Together with the latitude and longitude from the source-table, the height information is used to build GGA messages to be sent to the Ntrip Broadcaster.</p><p>For adjusting latitude and longitude values of a VRS stream given in the 'Streams' canvas, you can double click the latitude/longitude data fields, specify appropriate values and then hit Enter.</p><p>This option is only relevant when option 'NMEA' is set to 'Manual GPGGA' or 'Manual GNGGA' respectively. <i>[key: serialHeightNMEA]</i></p>"));
1468 _serialManualNMEASamplingSpinBox->setWhatsThis(tr("<p>Select a sampling interval in seconds for manual generation and upload of NMEA GGA sentences.</p><p>A sampling rate of '0' means, the a GGA sentence will be send only once to initialize the requested VRS stream. Note that some VRS systems need GGA sentences at regular intervals. <i>[key: serialManualNMEASampling]</i></p>"));
1469
1470 // WhatsThis, Outages
1471 // ------------------
1472 _adviseObsRateComboBox->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><p>Default is an empty option field, meaning that you don't want BNC to report on stream failures or recoveries when exceeding a threshold time span. <i>[key: adviseObsRate]</i></p>"));
1473 _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. <i>[key: adviseFail]</i></p>"));
1474 _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. <i>[key: adviseReco]</i></p>"));
1475 _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 a comment '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.</p><p>An empty option field (default) or invalid path means that you don't want to use this option. <i>[key: adviseScript]</i></p>"));
1476
1477 // WhatsThis, Miscellaneous
1478 // ------------------------
1479 _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. <i>[key: miscMount]</i></p>"));
1480 _miscIntrComboBox->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. <i>[key: miscIntr]</i></p>"));
1481 _miscScanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incoming message types as well as contained antenna coordinates, antenna height, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types. <i>[key: miscScanRTCM]</i></p>"));
1482 _miscPortLineEdit->setWhatsThis(tr("<p>BNC can output an incoming stream through an IP port of your local host.</p><p>Specify a port number to activate this function. <i>[key: miscPort]</i></p>"));
1483
1484 // WhatsThis, PPP (1)
1485 // ------------------
1486 _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations. <i>[key: PPP/dataSource]</i></p>"));
1487 _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
1488 _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
1489 _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP. <i>[key: PPP/corrMount]</i></p>"));
1490 _pppWidgets._ionoMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides VTEC informations in SSR format.</p><p>If you don't specify a corrections stream via this option, BNC will use VTEC informations from the Corrections stream 'mountpoint', if available. <i>[key: PPP/ionoMount]</i></p>"));
1491 _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP. <i>[key: PPP/corrFile]</i></p>"));
1492 _pppWidgets._ionoFile->setWhatsThis(tr("<p>Specify the VTEC file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will use VTEC informations from the Corrections file, if available. <i>[key: PPP/ionoFile]</i></p>"));
1493 _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets and variations</li><li>Satellite APC offsets and variations.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations for satellites and receiver.</p> <i>[key: PPP/antexFile]</i></p>"));
1494 _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:</p><ul><li>Specify the station either by:<ul><li>the 'Mountpoint' of the station's RTCM stream (in real-time PPP mode), or</li><li>the 9-char station ID of the RINEX Version 3 or 4 Observations file (in post processing PPP mode), or </li><li>the 4-char station ID of the RINEX Version 2 Observations file (in post processing PPP mode).</li></ul><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown). </li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored.. <i>[key: PPP/crdFile]</i></p>"));
1495 _pppWidgets._blqFile->setWhatsThis(tr("<p>Specify the full path to a 'BLQ file' containing the ocean loading coefficients for different stations. These coefficients can be obtained from the ocean loading service under request trough the web site http://holt.oso.chalmers.se/loading/. <i>[key: PPP/blqFile]</i></p>"));
1496 _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logfiles shall be produced. <i>[key: PPP/logPath]</i></p>"));
1497 _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced. <i>[key: PPP/nmeaPath]</i></p>"));
1498 _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced. <i>[key: PPP/snxtroPath]</i></p>"));
1499 _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'. <i>[key: PPP/snxtroIntr]</i></p>"));
1500 _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
1501 _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
1502 _pppWidgets._snxtroSolId->setWhatsThis(tr("<p>Specify a 1-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSolId]</i></p>"));
1503 _pppWidgets._snxtroSolType->setWhatsThis(tr("<p>Specify a 3-character solution type, e.g. real-time (RTS), unknown (UNK), .. <i>[key: PPP/snxtroSolType]</i></p>"));
1504 _pppWidgets._snxtroCampId->setWhatsThis(tr("<p>Specify a 3-character campaign ID, e.g. operational (OPS), demonstration (DEM), testing (TST), .. <i>[key: PPP/snxtroCampId]</i></p>"));
1505
1506 // WhatsThis, PPP (2)
1507 // ------------------
1508 _pppWidgets._lcGPS->setWhatsThis(tr("<p>Specify which kind of GPS observations you want to use and on which kind of linear combination the GPS ambiguity resolutions shall be based:</p><p><ul>"
1509#ifdef USE_PPP_SSR_I
1510 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1511 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1512#else
1513 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1514 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1515 "<li>'Li' means that uncombined phase data of two frequencies shall be used.</li> "
1516 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1517 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1518 "<li>'L1' means that uncombined phase data of one frequency shall be used.</li> "
1519 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1520 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1521 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1522#endif
1523 "<li>'no' means that you don't want BNC to use GPS data.</li></ul></p><p><i>[key: PPP/lcGPS]</i></p>"));
1524 _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use and on which kind of linear combination the GLONASS ambiguity resolutions shall be based:</p><p><ul>"
1525#ifdef USE_PPP_SSR_I
1526 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1527 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1528 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1529#else
1530 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1531 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1532 "<li>'Li' means that uncombined phase data of two frequencies shall be used.</li> "
1533 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1534 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1535 "<li>'L1' means that uncombined phase data of one frequency shall be used.</li> "
1536 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1537 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1538 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1539#endif
1540 "<li>'no' means that you don't want BNC to use GLONASS data.</li></ul></p><p><i>[key: PPP/lcGLONASS]</i></p>"));
1541 _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use and on which kind of linear combination the Galileo ambiguity resolutions shall be based:</p><p><ul>"
1542#ifdef USE_PPP_SSR_I
1543 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1544 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1545 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1546#else
1547 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1548 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1549 "<li>'Li' means that uncombined phase data of two frequencies shall be used.</li> "
1550 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1551 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1552 "<li>'L1' means that uncombined phase data of one frequency shall be used.</li> "
1553 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1554 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1555 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1556#endif
1557 "<li>'no' means that you don't want BNC to use Galileo data.</li></ul></p><p><i>[key: PPP/lcGalileo]</i></p>"));
1558 _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use and on which kind of linear combination the BDS ambiguity resolutions shall be based:</p><p><ul>"
1559#ifdef USE_PPP_SSR_I
1560 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1561 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1562 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1563#else
1564 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1565 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1566 "<li>'Li' means that uncombined phase data of two frequencies shall be used.</li> "
1567 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1568 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1569 "<li>'L1' means that uncombined phase data of one frequency shall be used.</li> "
1570 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1571 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1572 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1573#endif
1574 "<li>'no' means that you don't want BNC to use BDS data.</li></ul></p><p><i>[key: PPP/lcBDS]</i></p>"));
1575 _pppWidgets._constraints->setWhatsThis(tr("<p>Specify, whether ionospheric constraints in form of pseudo-observations shall be added. Please note, this is only valid, if no ionosphere-free linear-combination is used and only helpful as soon as the ionosphere information is more accurate than the code data accuracy. <i>[key: PPP/constraints]</i></p>"));
1576 _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS C1 code observations to a PPP solution from combined code and phase data. 1.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma C1 = 1.0' <i>[key: PPP/sigmaC1]</i></p>"));
1577 _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS L1 phase observations to a PPP solutions from combined code and phase data. 0.01 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma L1 = 0.01' <i>[key: PPP/sigmaL1]</i></p>"));
1578#ifdef USE_PPP
1579 _pppWidgets._sigmaGIM->setWhatsThis(tr("<p>Enter a Sigma for GIM pseudo observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GIM pseudo observations to a PPP solution. 5.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 5.0' <i>[key: PPP/sigmaGIM]</i></p>"));
1580#endif
1581 _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS C1 code observations in a PPP solution. '2.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res C1 = 2.0' <i>[key: PPP/maxResC1]</i></p>"));
1582 _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS L1 phase observations in a PPP solution. '0.02' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res L1 = 0.02' <i>[key: PPP/maxResL1]</i></p>"));
1583#ifdef USE_PPP
1584 _pppWidgets._maxResGIM->setWhatsThis(tr("<p>Specify a maximum for residuals from GIM pseudo observations in a PPP solution. '5.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res GIM = 5.0' <i>[key: PPP/maxResGIM]</i></p>"));
1585#endif
1586 _pppWidgets._eleWgtCode->setWhatsThis(tr("<p>Tic 'Ele Wgt Code' to use satellite Elevation depending Weights for Code observations in the PPP solution. <i>[key: PPP/eleWgtCode]</i></p>"));
1587 _pppWidgets._eleWgtPhase->setWhatsThis(tr("<p>Tic 'Ele Wgt Phase' to use satellite Elevation depending Weights for Phase observations in the PPP solution. <i>[key: PPP/eleWgtPhase]</i></p>"));
1588 _pppWidgets._minObs->setWhatsThis(tr("<p>Select a Minimum Number of Observations per epoch for a PPP solution.</p><p>BNC will only process epochs with observation numbers reaching or exceeding this minimum. <i>[key: PPP/minObs]</i></p>"));
1589 _pppWidgets._minEle->setWhatsThis(tr("<p>Select a Minimum satellite Elevation for observations.</p><p>BNC will ignore an observation if the associated satellite Elevation does not reach or exceed this minimum.</p><p>Selecting '10 deg' may be an appropriate choice in order to avoid too noisy observations. <i>[key: PPP/minEle]</i></p>"));
1590
1591 // WhatsThis, Combine Corrections
1592 // ------------------------------
1593 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock correction streams in real-time to produce, encode, upload and save a combination of correctors coming from different providers. To add a line to the 'Combine Corrections' table hit the 'Add Row' button, double click on the 'Mountpoint' field to specify a Broadcast Ephemeris Correction 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 Factor' field to enter a weight factor to be applied for this stream in the combination. A Factor greater than 1 will enlarge the sigma of the clock pseudo-observations and with it down-weight its contribution.</p><p>Note that the orbit information in the resulting 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 orbit and clock correction streams BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris Correction stream in the 'Combine Corrections' table. Instead of combining corrections BNC will then add the corrections to the Broadcast Ephemeris with the possibility to save final orbit and clock results in SP3 and/or Clock RINEX format. <i>[key: cmbStreams]</i></p>"));
1594 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1595 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1596 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'.</p><p>It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning. <i>[key: cmbMethod]</i></p>"));
1597 _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'. <i>[key: cmbMaxres]</i></p>"));
1598 _cmbSamplSpinBox->setWhatsThis(tr("<p>Select a combination Sampling interval for the clocks. Clock corrections will be produced following that interval.</p><p>A value of 10 sec may be an appropriate choice. A value of zero '0' tells BNC to use all available samples. <i>[key: ]</i></p>"));
1599 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGps]</i></p>"));
1600 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1601 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1602 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; BDS Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1603 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1604 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1605 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS clock corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1606 _cmbBsxFile->setWhatsThis(tr("<p> Specify a Bias SINEX File that will be used to add satellite code biases to the combined clocks. <i>[key: cmbBsxFile]</i></p>"));
1607
1608 // WhatsThis, Upload Corrections
1609 // -----------------------------
1610 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) as well as Code Biases in different SSR formats. You may have a situation where clocks, orbits and code biases 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 Host and Port</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris Corrections if you specify correction streams in the 'Combine Corrections' table.</p><p>To fill the 'Upload Corrections' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. 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. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference System (e.g. IGS20) for outgoing clock and orbit corrections.</p><p>Select a target SSR format (e.g. IGS-SSR) 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 generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.SP3.</p><p>Specify a path for saving generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.CLK.</p><p>Specify a path for saving generated Code Biases as SINEX Bias files. If the specified directory does not exist, BNC will not create SINEX Bias files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.BIA.</p><p>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
1611 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1612 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1613 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
1614 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("<p>Select a stream's orbit correction sampling interval in seconds.</p><p>A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages. <i>[key: uploadSamplRtcmEphCorr]</i></p>"));
1615 _uploadSamplSp3ComboBox->setWhatsThis(tr("<p>Select a SP3 orbit file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into SP3 orbit files. <i>[key: uploadSamplSp3]</i></p>"));
1616 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("<p>Select a Clock RINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Clock RINEX files. <i>[key: uploadSamplClkRnx]</i></p>"));
1617 _uploadSamplBiaSnxSpinBox->setWhatsThis(tr("<p>Select a Bias SINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Bias SINEX files. <i>[key: uploadSamplBiaSnx]</i></p>"));
1618 setUploadTrafoButton->setWhatsThis(tr("<p>Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation via option 'System'.</p>"));
1619 _uploadAntexFile->setWhatsThis(tr("<p>When producing SP3 files or referring orbit and clock corrections to the satellite's Center of Mass (CoM) instead Antenna Phase Center (APC), an offset has to be applied which is available from the IGS 'ANTEX file'. You must therefore specify an 'ANTEX file' path if you want to save the stream content in SP3 format and/or refer correctors to CoM.</p><p>If you don't specify an 'ANTEX file' path, the SP3 file content as well as the orbit and clock correctors will be referred to satellite APCs. <i>[key: uploadAntexFile]</i></p>"));
1620
1621 // WhatsThis, Upload Ephemeris
1622 // ---------------------------
1623 _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. 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. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphHost]</i></p>"));
1624 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1625 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1626 _uploadSamplRtcmEphSpinBox->setWhatsThis(tr("<p>Select the Broadcast Ephemeris sampling interval in seconds.</p><p>Default is '5', meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds. <i>[key: uploadSamplRtcmEph]</i></p>"));
1627
1628 // WhatsThis, Streams Canvas
1629 // -------------------------
1630 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button opens 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 source-table. 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. Accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x' and 'RTNET'.</p><p>In case you need to log raw data as is, BNC allows 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 such stream, the approximate latitude/longitude rover position is sent to the Ntrip Broadcaster together with an approximation for the height. Default values for latitude and longitude 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. <i>[key: mountPoints]</i></p>"));
1631 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1632 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1633 _actMapMountPoints->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
1634 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1635 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1636
1637 // WhatsThis, Log Canvas
1638 // ---------------------
1639 _log->setWhatsThis(tr("<p>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 problems that occur in the communication link, stream availability, stream delay, stream conversion etc.</p>"));
1640 _bncFigure->setWhatsThis(tr("<p>The bandwith consumption per stream is shown in the 'Throughput' tab in bits per second (bps) or kilobits per second (kbps).</p>"));
1641 _bncFigureLate->setWhatsThis(tr("<p>The individual latency of observations of incoming streams is shown in the 'Latency' tab. Streams not carrying observations (e.g. those providing only Broadcast Ephemeris) remain unconsidered.</p><p>Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized.</p>"));
1642 _bncFigurePPP->setWhatsThis(tr("<p>PPP time series of North (red), East (green) and Up (blue) displacements are shown in the 'PPP Plot' tab when the corresponding option is selected.</p><p>Values are referred to an XYZ a priori coordinate. The sliding PPP time series window covers the period of the latest 5 minutes.</p>"));
1643
1644
1645 // Enable/Disable all Widgets
1646 // --------------------------
1647 slotBncTextChanged();
1648 enableStartStop();
1649
1650 // Auto start
1651 // ----------
1652 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1653 slotStart();
1654 }
1655}
1656
1657// Destructor
1658////////////////////////////////////////////////////////////////////////////
1659bncWindow::~bncWindow() {
1660 if (_caster) {
1661 delete _caster; BNC_CORE->setCaster(0);
1662 }
1663 if (_casterEph) {
1664 delete _casterEph;
1665 }
1666 delete _bncFigureLate;
1667 delete _bncFigurePPP;
1668 delete _actHelp;
1669 delete _actAbout;
1670 delete _actFlowchart;
1671 delete _actFontSel;
1672 delete _actSaveOpt;
1673 delete _actQuit;
1674 delete _actAddMountPoints;
1675 delete _actDeleteMountPoints;
1676 delete _actMapMountPoints;
1677 delete _actStart;
1678 delete _actStop;
1679 delete _actwhatsthis;
1680 delete _proxyHostLineEdit;
1681 delete _proxyPortLineEdit;
1682 delete _sslCaCertPathLineEdit;
1683 delete _sslClientCertPathLineEdit;
1684 delete _sslIgnoreErrorsCheckBox;
1685 delete _logFileLineEdit;
1686 delete _rawOutFileLineEdit;
1687 delete _rnxAppendCheckBox;
1688 delete _onTheFlyComboBox;
1689 delete _autoStartCheckBox;
1690 delete _rnxPathLineEdit;
1691 delete _rnxIntrComboBox;
1692 delete _rnxSamplComboBox;
1693 delete _rnxSkelExtComboBox;
1694 delete _rnxSkelPathLineEdit;
1695 delete _rnxFileCheckBox;
1696 delete _rnxScrpLineEdit;
1697 delete _rnxVersComboBox;
1698 delete _rnxV2Priority;
1699 delete _ephPathLineEdit;
1700 //delete _ephFilePerStation;
1701 delete _ephIntrComboBox;
1702 delete _ephOutPortLineEdit;
1703 delete _ephVersComboBox;
1704 delete _corrPathLineEdit;
1705 delete _corrIntrComboBox;
1706 delete _corrPortLineEdit;
1707 delete _outPortLineEdit;
1708 delete _outWaitSpinBox;
1709 delete _outSamplComboBox;
1710 delete _outFileLineEdit;
1711 delete _outUPortLineEdit;
1712 delete _outLockTimeCheckBox;
1713 delete _serialMountPointLineEdit;
1714 delete _serialPortNameLineEdit;
1715 delete _serialBaudRateComboBox;
1716 delete _serialFlowControlComboBox;
1717 delete _serialDataBitsComboBox;
1718 delete _serialParityComboBox;
1719 delete _serialStopBitsComboBox;
1720 delete _serialAutoNMEAComboBox;
1721 delete _serialFileNMEALineEdit;
1722 delete _serialHeightNMEALineEdit;
1723 delete _serialManualNMEASamplingSpinBox;
1724 delete _adviseObsRateComboBox;
1725 delete _adviseFailSpinBox;
1726 delete _adviseRecoSpinBox;
1727 delete _adviseScriptLineEdit;
1728 delete _miscMountLineEdit;
1729 delete _miscPortLineEdit;
1730 delete _miscIntrComboBox;
1731 delete _miscScanRTCMCheckBox;
1732 _mountPointsTable->deleteLater();
1733 delete _log;
1734 delete _loggroup;
1735 _cmbTable->deleteLater();
1736 delete _cmbMaxresLineEdit;
1737 delete _cmbSamplSpinBox;
1738 delete _cmbMethodComboBox;
1739 delete _cmbGpsCheckBox;
1740 delete _cmbGloCheckBox;
1741 delete _cmbGalCheckBox;
1742 delete _cmbBdsCheckBox;
1743 delete _cmbQzssCheckBox;
1744 delete _cmbSbasCheckBox;
1745 delete _cmbIrnssCheckBox;
1746 delete _cmbBsxFile;
1747 _uploadEphTable->deleteLater();
1748 delete _uploadSamplRtcmEphCorrSpinBox;
1749 _uploadTable->deleteLater();
1750 delete _uploadIntrComboBox;
1751 delete _uploadAntexFile;
1752 delete _uploadSamplRtcmEphSpinBox;
1753 delete _uploadSamplSp3ComboBox;
1754 delete _uploadSamplClkRnxSpinBox;
1755 delete _uploadSamplBiaSnxSpinBox;
1756 delete _reqcActionComboBox;
1757 delete _reqcObsFileChooser;
1758 delete _reqcNavFileChooser;
1759 delete _reqcOutObsLineEdit;
1760 delete _reqcOutNavLineEdit;
1761 delete _reqcOutLogLineEdit;
1762 delete _reqcPlotDirLineEdit;
1763 delete _reqcSkyPlotSignals;
1764 delete _reqcLogSummaryOnly;
1765 delete _reqcEditOptionButton;
1766 delete _sp3CompFileChooser;
1767 delete _sp3CompExclude;
1768 delete _sp3CompLogLineEdit;
1769 delete _sp3CompSummaryOnly;
1770 //delete _canvas;
1771}
1772
1773//
1774////////////////////////////////////////////////////////////////////////////
1775void bncWindow::populateMountPointsTable() {
1776
1777 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1778 _mountPointsTable->removeRow(iRow);
1779 }
1780
1781 bncSettings settings;
1782
1783 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1784 int iRow = 0;
1785 while (it.hasNext()) {
1786 QStringList hlp = it.next().split(" ");
1787 if (hlp.size() < 7) continue;
1788 _mountPointsTable->insertRow(iRow);
1789
1790 QUrl url(hlp[0]);
1791
1792 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1793 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1794 QString nmea(hlp[5]);
1795 if (hlp[6] == "S") {
1796 fullPath = hlp[0].replace(0,2,"");
1797 }
1798 QString ntripVersion = "2";
1799 if (hlp.size() >= 7) {
1800 ntripVersion = (hlp[6]);
1801 }
1802
1803 QTableWidgetItem* it;
1804 it = new QTableWidgetItem(url.userInfo());
1805 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1806 _mountPointsTable->setItem(iRow, 0, it);
1807
1808 it = new QTableWidgetItem(fullPath);
1809 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1810 _mountPointsTable->setItem(iRow, 1, it);
1811
1812 it = new QTableWidgetItem(format);
1813 _mountPointsTable->setItem(iRow, 2, it);
1814
1815 it = new QTableWidgetItem(country);
1816 _mountPointsTable->setItem(iRow, 3, it);
1817
1818 if (nmea == "yes") {
1819 it = new QTableWidgetItem(latitude);
1820 _mountPointsTable->setItem(iRow, 4, it);
1821 it = new QTableWidgetItem(longitude);
1822 _mountPointsTable->setItem(iRow, 5, it);
1823 } else {
1824 it = new QTableWidgetItem(latitude);
1825 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1826 _mountPointsTable->setItem(iRow, 4, it);
1827
1828 it = new QTableWidgetItem(longitude);
1829 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1830 _mountPointsTable->setItem(iRow, 5, it);
1831 }
1832
1833 it = new QTableWidgetItem(nmea);
1834 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1835 _mountPointsTable->setItem(iRow, 6, it);
1836
1837 it = new QTableWidgetItem(ntripVersion);
1838 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1839 _mountPointsTable->setItem(iRow, 7, it);
1840
1841 bncTableItem* bncIt = new bncTableItem();
1842 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1843 _mountPointsTable->setItem(iRow, 8, bncIt);
1844
1845 iRow++;
1846 }
1847
1848 _mountPointsTable->sortItems(1);
1849
1850 enableStartStop();
1851}
1852
1853// Retrieve Table
1854////////////////////////////////////////////////////////////////////////////
1855void bncWindow::slotAddMountPoints() {
1856
1857 bncSettings settings;
1858 QString proxyHost = settings.value("proxyHost").toString();
1859 int proxyPort = settings.value("proxyPort").toInt();
1860 if (proxyHost != _proxyHostLineEdit->text() ||
1861 proxyPort != _proxyPortLineEdit->text().toInt()) {
1862 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1863 "changed. Use the new ones?",
1864 QMessageBox::Yes, QMessageBox::No,
1865 QMessageBox::NoButton);
1866 if (iRet == QMessageBox::Yes) {
1867 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1868 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1869 }
1870 }
1871
1872 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1873 settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
1874 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1875
1876 QMessageBox msgBox;
1877 msgBox.setIcon(QMessageBox::Question);
1878 msgBox.setWindowTitle("Add Stream");
1879 msgBox.setText("Add stream(s) coming from:");
1880
1881 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1882 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1883 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1884 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1885 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1886
1887 msgBox.exec();
1888
1889 if (msgBox.clickedButton() == buttonNtrip) {
1890 bncTableDlg* dlg = new bncTableDlg(this);
1891 dlg->move(this->pos().x()+50, this->pos().y()+50);
1892 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1893 this, SLOT(slotNewMountPoints(QStringList*)));
1894 dlg->exec();
1895 delete dlg;
1896 } else if (msgBox.clickedButton() == buttonIP) {
1897 bncIpPort* ipp = new bncIpPort(this);
1898 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1899 this, SLOT(slotNewMountPoints(QStringList*)));
1900 ipp->exec();
1901 delete ipp;
1902 } else if (msgBox.clickedButton() == buttonUDP) {
1903 bncUdpPort* udp = new bncUdpPort(this);
1904 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1905 this, SLOT(slotNewMountPoints(QStringList*)));
1906 udp->exec();
1907 delete udp;
1908 } else if (msgBox.clickedButton() == buttonSerial) {
1909 bncSerialPort* sep = new bncSerialPort(this);
1910 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1911 this, SLOT(slotNewMountPoints(QStringList*)));
1912 sep->exec();
1913 delete sep;
1914 } else if (msgBox.clickedButton() == buttonCancel) {
1915 // Cancel
1916 }
1917
1918 enableStartStop();
1919}
1920
1921// Delete Selected Mount Points
1922////////////////////////////////////////////////////////////////////////////
1923void bncWindow::slotDeleteMountPoints() {
1924
1925 int nRows = _mountPointsTable->rowCount();
1926 std::vector <bool> flg(nRows);
1927 for (int iRow = 0; iRow < nRows; iRow++) {
1928 if (_mountPointsTable->item(iRow,1)->isSelected()) {
1929 flg[iRow] = true;
1930 }
1931 else {
1932 flg[iRow] = false;
1933 }
1934 }
1935 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1936 if (flg[iRow]) {
1937 _mountPointsTable->removeRow(iRow);
1938 }
1939 }
1940 _actDeleteMountPoints->setEnabled(false);
1941
1942 enableStartStop();
1943}
1944
1945// New Mount Points Selected
1946////////////////////////////////////////////////////////////////////////////
1947void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1948 int iRow = 0;
1949 QListIterator<QString> it(*mountPoints);
1950 while (it.hasNext()) {
1951 QStringList hlp = it.next().split(" ");
1952 QUrl url(hlp[0]);
1953 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1954 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1955 QString nmea(hlp[5]);
1956 if (hlp[6] == "S") {
1957 fullPath = hlp[0].replace(0,2,"");
1958 }
1959 QString ntripVersion = "2";
1960 if (hlp.size() >= 7) {
1961 ntripVersion = (hlp[6]);
1962 }
1963
1964 _mountPointsTable->insertRow(iRow);
1965
1966 QTableWidgetItem* it;
1967 it = new QTableWidgetItem(url.userInfo());
1968 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1969 _mountPointsTable->setItem(iRow, 0, it);
1970
1971 it = new QTableWidgetItem(fullPath);
1972 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1973 _mountPointsTable->setItem(iRow, 1, it);
1974
1975 it = new QTableWidgetItem(format);
1976 _mountPointsTable->setItem(iRow, 2, it);
1977
1978 it = new QTableWidgetItem(country);
1979 _mountPointsTable->setItem(iRow, 3, it);
1980
1981 if (nmea == "yes") {
1982 it = new QTableWidgetItem(latitude);
1983 _mountPointsTable->setItem(iRow, 4, it);
1984 it = new QTableWidgetItem(longitude);
1985 _mountPointsTable->setItem(iRow, 5, it);
1986 } else {
1987 it = new QTableWidgetItem(latitude);
1988 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1989 _mountPointsTable->setItem(iRow, 4, it);
1990 it = new QTableWidgetItem(longitude);
1991 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1992 _mountPointsTable->setItem(iRow, 5, it);
1993 }
1994
1995 it = new QTableWidgetItem(nmea);
1996 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1997 _mountPointsTable->setItem(iRow, 6, it);
1998
1999 it = new QTableWidgetItem(ntripVersion);
2000 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
2001 _mountPointsTable->setItem(iRow, 7, it);
2002
2003 bncTableItem* bncIt = new bncTableItem();
2004 _mountPointsTable->setItem(iRow, 8, bncIt);
2005
2006 iRow++;
2007 }
2008 _mountPointsTable->hideColumn(0);
2009 _mountPointsTable->hideColumn(3);
2010 _mountPointsTable->sortItems(1);
2011 delete mountPoints;
2012
2013 enableStartStop();
2014}
2015
2016// Save Options (serialize)
2017////////////////////////////////////////////////////////////////////////////
2018void bncWindow::slotSaveOptions() {
2019 saveOptions();
2020 bncSettings settings;
2021 settings.sync();
2022}
2023
2024// Save Options (memory only)
2025////////////////////////////////////////////////////////////////////////////
2026void bncWindow::saveOptions() {
2027
2028 QStringList mountPoints;
2029 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2030
2031 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
2032 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2033 "@" + _mountPointsTable->item(iRow, 1)->text() );
2034
2035 mountPoints.append(url.toString() + " " +
2036 _mountPointsTable->item(iRow, 2)->text()
2037 + " " + _mountPointsTable->item(iRow, 3)->text()
2038 + " " + _mountPointsTable->item(iRow, 4)->text()
2039 + " " + _mountPointsTable->item(iRow, 5)->text()
2040 + " " + _mountPointsTable->item(iRow, 6)->text()
2041 + " " + _mountPointsTable->item(iRow, 7)->text());
2042 } else {
2043 mountPoints.append(
2044 "//" + _mountPointsTable->item(iRow, 1)->text()
2045 + " " + _mountPointsTable->item(iRow, 2)->text()
2046 + " " + _mountPointsTable->item(iRow, 3)->text()
2047 + " " + _mountPointsTable->item(iRow, 4)->text()
2048 + " " + _mountPointsTable->item(iRow, 5)->text()
2049 + " " + _mountPointsTable->item(iRow, 6)->text()
2050 + " " + _mountPointsTable->item(iRow, 7)->text());
2051 }
2052 }
2053
2054 QStringList cmbStreams;
2055 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
2056 QString hlp;
2057 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2058 if (_cmbTable->item(iRow, iCol)) {
2059 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
2060 }
2061 }
2062 if (!hlp.isEmpty()) {
2063 cmbStreams << hlp;
2064 }
2065 }
2066
2067 QStringList uploadMountpointsOut;
2068 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2069 QString hlp;
2070 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2071 if (_uploadTable->cellWidget(iRow, iCol) &&
2072 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
2073 if (iCol == 3) {
2074 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2075 hlp += ntripversion->currentText() + ",";
2076 }
2077 else if (iCol == 4 ) {
2078 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
2079 hlp += user->text() + ",";
2080 }
2081 else if (iCol == 5) {
2082 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
2083 hlp += passwd->text() + ",";
2084 }
2085 else if (iCol == 6) {
2086 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2087 hlp += system->currentText() + ",";
2088 }
2089 else if (iCol == 7) {
2090 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2091 hlp += format->currentText() + ",";
2092 }
2093 else if (iCol == 8) {
2094 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
2095 QString state; state.setNum(com->checkState());
2096 hlp += state + ",";
2097 }
2098 }
2099 else if (_uploadTable->item(iRow, iCol)) {
2100 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
2101 }
2102 }
2103 if (!hlp.isEmpty()) {
2104 uploadMountpointsOut << hlp;
2105 }
2106 }
2107
2108 QStringList uploadEphMountpointsOut;
2109 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
2110 QString hlp;
2111 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2112 if (_uploadEphTable->cellWidget(iRow, iCol) &&
2113 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
2114 if (iCol == 3) {
2115 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
2116 hlp += ntripversion->currentText() + ",";
2117 }
2118 else if (iCol == 4 ) {
2119 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2120 hlp += user->text() + ",";
2121 }
2122 else if (iCol == 5) {
2123 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2124 hlp += passwd->text() + ",";
2125 }
2126 else if (iCol == 6) {
2127 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2128 hlp += system->text() + ",";
2129 }
2130 }
2131 else if (_uploadEphTable->item(iRow, iCol)) {
2132 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2133 }
2134 }
2135 if (!hlp.isEmpty()) {
2136 uploadEphMountpointsOut << hlp;
2137 }
2138 }
2139
2140 bncSettings settings;
2141
2142 settings.setValue("startTab", _aogroup->currentIndex());
2143 settings.setValue("statusTab", _loggroup->currentIndex());
2144 settings.setValue("mountPoints", mountPoints);
2145// Network
2146 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2147 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2148 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2149 settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
2150 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2151// General
2152 settings.setValue("logFile", _logFileLineEdit->text());
2153 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2154 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2155 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2156 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2157// RINEX Observations
2158 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2159 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2160 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2161 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2162 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2163 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2164 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2165 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2166 settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
2167// RINEX Ephemeris
2168 settings.setValue("ephPath", _ephPathLineEdit->text());
2169 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2170 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2171 settings.setValue("ephVersion", _ephVersComboBox->currentText());
2172 //settings.setValue("ephFilePerStation", _ephFilePerStation->checkState());
2173// Broadcast Corrections
2174 settings.setValue("corrPath", _corrPathLineEdit->text());
2175 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2176 settings.setValue("corrPort", _corrPortLineEdit->text());
2177// Feed Engine
2178 settings.setValue("outPort", _outPortLineEdit->text());
2179 settings.setValue("outWait", _outWaitSpinBox->value());
2180 settings.setValue("outSampl", _outSamplComboBox->currentText());
2181 settings.setValue("outFile", _outFileLineEdit->text());
2182 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2183// Serial Output
2184 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2185 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2186 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2187 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2188 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2189 settings.setValue("serialParity", _serialParityComboBox->currentText());
2190 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2191 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2192 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2193 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2194 settings.setValue("serialManualNMEASampling", _serialManualNMEASamplingSpinBox->value());
2195// Outages
2196 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2197 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2198 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2199 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2200// Miscellaneous
2201 settings.setValue("miscMount", _miscMountLineEdit->text());
2202 settings.setValue("miscPort", _miscPortLineEdit->text());
2203 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2204 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2205// Reqc
2206 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2207 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2208 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2209 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2210 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2211 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2212 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2213 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2214 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2215// SP3 Comparison
2216 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2217 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2218 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2219 settings.setValue("sp3CompSummaryOnly",_sp3CompSummaryOnly->checkState());
2220// Combine Corrections
2221 if (!cmbStreams.isEmpty()) {
2222 settings.setValue("cmbStreams", cmbStreams);
2223 }
2224 else {
2225 settings.setValue("cmbStreams", "");
2226 }
2227 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2228 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2229 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2230 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2231 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2232 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2233 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2234 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2235 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2236 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2237 settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
2238
2239// Upload Corrections
2240 if (!uploadMountpointsOut.isEmpty()) {
2241 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2242 }
2243 else {
2244 settings.setValue("uploadMountpointsOut", "");
2245 }
2246 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2247 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2248 settings.setValue("uploadSamplSp3", _uploadSamplSp3ComboBox->currentText());
2249 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2250 settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
2251 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2252// Upload Ephemeris
2253 if (!uploadEphMountpointsOut.isEmpty()) {
2254 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2255 }
2256 else {
2257 settings.setValue("uploadEphMountpointsOut", "");
2258 }
2259 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2260
2261 if (_caster) {
2262 _caster->readMountPoints();
2263 }
2264
2265 _pppWidgets.saveOptions();
2266}
2267
2268// All get slots terminated
2269////////////////////////////////////////////////////////////////////////////
2270void bncWindow::slotGetThreadsFinished() {
2271 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2272 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2273 delete _casterEph; _casterEph = 0;
2274 _runningRealTime = false;
2275}
2276
2277// Start It!
2278////////////////////////////////////////////////////////////////////////////
2279void bncWindow::slotStart() {
2280 saveOptions();
2281 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2282 _runningPPP = true;
2283 enableStartStop();
2284 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2285 BNC_CORE->startPPP();
2286 _bncFigurePPP->reset();
2287 }
2288 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2289 if (_reqcActionComboBox->currentText() == "Analyze") {
2290 _runningQC = true;
2291 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2292 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2293 reqcAnalyze->start();
2294 }
2295 else {
2296 _runningEdit = true;
2297 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2298 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2299 reqcEdit->start();
2300 }
2301 enableStartStop();
2302 }
2303 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2304 _runningSp3Comp = true;
2305 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2306 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2307 sp3Comp->start();
2308 enableStartStop();
2309 }
2310 else {
2311 startRealTime();
2312 BNC_CORE->startPPP();
2313 }
2314}
2315
2316// Start Real-Time (Retrieve Data etc.)
2317////////////////////////////////////////////////////////////////////////////
2318void bncWindow::startRealTime() {
2319
2320 _runningRealTime = true;
2321
2322 _bncFigurePPP->reset();
2323
2324 _actDeleteMountPoints->setEnabled(false);
2325
2326 enableStartStop();
2327
2328 _caster = new bncCaster();
2329
2330 BNC_CORE->setCaster(_caster);
2331 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2332 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2333 BNC_CORE->initCombination();
2334
2335 connect(_caster, SIGNAL(getThreadsFinished()), this, SLOT(slotGetThreadsFinished()));
2336
2337 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)), this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2338
2339 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2340
2341 bncSettings settings;
2342
2343 // Active panels
2344 // -------------
2345 if (!_rnxPathLineEdit->text().isEmpty())
2346 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2347 if (!_ephPathLineEdit->text().isEmpty())
2348 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2349 if (!_corrPathLineEdit->text().isEmpty())
2350 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2351 if (!_outPortLineEdit->text().isEmpty())
2352 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2353 if (!_serialMountPointLineEdit->text().isEmpty())
2354 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2355 if (!_adviseObsRateComboBox->currentText().isEmpty())
2356 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2357 if (!_miscMountLineEdit->text().isEmpty())
2358 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2359 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2360 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2361 if (_cmbTable->rowCount() > 0)
2362 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2363 if (_uploadTable->rowCount() > 0)
2364 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2365 if (_uploadEphTable->rowCount() > 0)
2366 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2367
2368 QDir rnxdir(settings.value("rnxPath").toString());
2369 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2370
2371 QString rnx_file = settings.value("rnxScript").toString();
2372 if ( !rnx_file.isEmpty() ) {
2373 QFile rnxfile(settings.value("rnxScript").toString());
2374 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2375 }
2376
2377 QDir ephdir(settings.value("ephPath").toString());
2378 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2379
2380 QDir corrdir(settings.value("corrPath").toString());
2381 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2382
2383 QString advise_file = settings.value("adviseScript").toString();
2384 if ( !advise_file.isEmpty() ) {
2385 QFile advisefile(settings.value("adviseScript").toString());
2386 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2387 }
2388
2389 _caster->readMountPoints();
2390
2391 _casterEph = new bncEphUploadCaster();
2392}
2393
2394// Retrieve Data
2395////////////////////////////////////////////////////////////////////////////
2396void bncWindow::slotStop() {
2397 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2398 QMessageBox::Yes, QMessageBox::No,
2399 QMessageBox::NoButton);
2400 if (iRet == QMessageBox::Yes) {
2401 BNC_CORE->stopPPP();
2402 BNC_CORE->stopCombination();
2403 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2404 delete _casterEph; _casterEph = 0;
2405 _runningRealTime = false;
2406 _runningPPP = false;
2407 enableStartStop();
2408 }
2409}
2410
2411// Close Application gracefully
2412////////////////////////////////////////////////////////////////////////////
2413void bncWindow::closeEvent(QCloseEvent* event) {
2414
2415 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2416 QMessageBox::Yes, QMessageBox::No,
2417 QMessageBox::Cancel);
2418
2419 if (iRet == QMessageBox::Cancel) {
2420 event->ignore();
2421 return;
2422 }
2423 else if (iRet == QMessageBox::Yes) {
2424 slotSaveOptions();
2425 }
2426
2427 BNC_CORE->stopPPP();
2428
2429 QMainWindow::closeEvent(event);
2430}
2431
2432// User changed the selection of mountPoints
2433////////////////////////////////////////////////////////////////////////////
2434void bncWindow::slotSelectionChanged() {
2435 if (_mountPointsTable->selectedItems().isEmpty()) {
2436 _actDeleteMountPoints->setEnabled(false);
2437 }
2438 else {
2439 _actDeleteMountPoints->setEnabled(true);
2440 }
2441}
2442
2443// Display Program Messages
2444////////////////////////////////////////////////////////////////////////////
2445void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2446 if (showOnScreen ) {
2447 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2448 }
2449}
2450
2451// About Message
2452////////////////////////////////////////////////////////////////////////////
2453void bncWindow::slotAbout() {
2454 new bncAboutDlg(0);
2455}
2456
2457//Flowchart
2458////////////////////////////////////////////////////////////////////////////
2459void bncWindow::slotFlowchart() {
2460 new bncFlowchartDlg(0);
2461}
2462
2463// Help Window
2464////////////////////////////////////////////////////////////////////////////
2465void bncWindow::slotHelp() {
2466 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2467 new bncHlpDlg(0, url);
2468}
2469
2470// Select Fonts
2471////////////////////////////////////////////////////////////////////////////
2472void bncWindow::slotFontSel() {
2473 bool ok;
2474 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2475 if (ok) {
2476 bncSettings settings;
2477 settings.setValue("font", newFont.toString());
2478 QApplication::setFont(newFont);
2479 int ww = QFontMetrics(newFont).width('w');
2480 setMinimumSize(60*ww, 80*ww);
2481 resize(60*ww, 80*ww);
2482 }
2483}
2484
2485// Whats This Help
2486void bncWindow::slotWhatsThis() {
2487 QWhatsThis::enterWhatsThisMode();
2488}
2489
2490//
2491////////////////////////////////////////////////////////////////////////////
2492void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2493 _threads = threads;
2494
2495 _bncFigure->updateMountPoints();
2496 _bncFigureLate->updateMountPoints();
2497
2498 populateMountPointsTable();
2499 bncSettings settings;
2500 _outSamplComboBox->findText(settings.value("outSampl").toString());
2501 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2502 QListIterator<bncGetThread*> iTh(threads);
2503 while (iTh.hasNext()) {
2504 bncGetThread* thread = iTh.next();
2505 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2506 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2507 "@" + _mountPointsTable->item(iRow, 1)->text() );
2508 if (url == thread->mountPoint() &&
2509 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2510 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2511 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2512 disconnect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
2513 connect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
2514 disconnect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2515 connect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2516 break;
2517 }
2518 }
2519 }
2520}
2521
2522//
2523////////////////////////////////////////////////////////////////////////////
2524void bncWindow::CreateMenu() {
2525 // Create Menus
2526 // ------------
2527 _menuFile = menuBar()->addMenu(tr("&File"));
2528 _menuFile->addAction(_actFontSel);
2529 _menuFile->addSeparator();
2530 _menuFile->addAction(_actSaveOpt);
2531 _menuFile->addSeparator();
2532 _menuFile->addAction(_actQuit);
2533
2534 _menuHlp = menuBar()->addMenu(tr("&Help"));
2535 _menuHlp->addAction(_actHelp);
2536 _menuHlp->addAction(_actFlowchart);
2537 _menuHlp->addAction(_actAbout);
2538}
2539
2540// Toolbar
2541////////////////////////////////////////////////////////////////////////////
2542void bncWindow::AddToolbar() {
2543 QToolBar* toolBar = new QToolBar;
2544 addToolBar(Qt::BottomToolBarArea, toolBar);
2545 toolBar->setMovable(false);
2546 toolBar->addAction(_actAddMountPoints);
2547 toolBar->addAction(_actDeleteMountPoints);
2548 toolBar->addAction(_actMapMountPoints);
2549 toolBar->addAction(_actStart);
2550 toolBar->addAction(_actStop);
2551 toolBar->addWidget(new QLabel(" "));
2552 toolBar->addAction(_actwhatsthis);
2553}
2554
2555// About
2556////////////////////////////////////////////////////////////////////////////
2557bncAboutDlg::bncAboutDlg(QWidget* parent) :
2558 QDialog(parent) {
2559
2560 QTextBrowser* tb = new QTextBrowser;
2561 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2562 tb->setSource(url);
2563 tb->setReadOnly(true);
2564
2565 int ww = QFontMetrics(font()).width('w');
2566 QPushButton* _closeButton = new QPushButton("Close");
2567 _closeButton->setMaximumWidth(10*ww);
2568 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2569
2570 QGridLayout* dlgLayout = new QGridLayout();
2571 QLabel* img = new QLabel();
2572 img->setPixmap(QPixmap(":ntrip-logo.png"));
2573 dlgLayout->addWidget(img, 0,0);
2574 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2575 dlgLayout->addWidget(tb,1,0,1,2);
2576 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2577
2578 setLayout(dlgLayout);
2579 resize(60*ww, 60*ww);
2580 setWindowTitle("About BNC");
2581 show();
2582}
2583
2584//
2585////////////////////////////////////////////////////////////////////////////
2586bncAboutDlg::~bncAboutDlg() {
2587
2588};
2589
2590// Flowchart
2591////////////////////////////////////////////////////////////////////////////
2592bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2593 QDialog(parent) {
2594
2595 int ww = QFontMetrics(font()).width('w');
2596 QPushButton* _closeButton = new QPushButton("Close");
2597 _closeButton->setMaximumWidth(10*ww);
2598 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2599
2600 QGridLayout* dlgLayout = new QGridLayout();
2601 QLabel* img = new QLabel();
2602 img->setPixmap(QPixmap(":bncflowchart.png"));
2603 dlgLayout->addWidget(img, 0,0);
2604 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2605
2606 setLayout(dlgLayout);
2607 setWindowTitle("Flow Chart");
2608 show();
2609}
2610
2611//
2612////////////////////////////////////////////////////////////////////////////
2613bncFlowchartDlg::~bncFlowchartDlg() {
2614};
2615
2616// Enable/Disable Widget (and change its color)
2617////////////////////////////////////////////////////////////////////////////
2618void bncWindow::enableWidget(bool enable, QWidget* widget) {
2619
2620 const static QPalette paletteWhite(QColor(255, 255, 255));
2621 const static QPalette paletteGray(QColor(230, 230, 230));
2622
2623 widget->setEnabled(enable);
2624 if (enable) {
2625 widget->setPalette(paletteWhite);
2626 }
2627 else {
2628 widget->setPalette(paletteGray);
2629 }
2630}
2631
2632// Bnc Text
2633////////////////////////////////////////////////////////////////////////////
2634void bncWindow::slotBncTextChanged(){
2635
2636 const static QPalette paletteWhite(QColor(255, 255, 255));
2637 const static QPalette paletteGray(QColor(230, 230, 230));
2638
2639 bool enable = true;
2640
2641 // Proxy
2642 //------
2643 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2644 enable = !_proxyHostLineEdit->text().isEmpty();
2645 enableWidget(enable, _proxyPortLineEdit);
2646 }
2647
2648 // RINEX Observations
2649 // ------------------
2650 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2651 enable = !_rnxPathLineEdit->text().isEmpty();
2652 enableWidget(enable, _rnxIntrComboBox);
2653 enableWidget(enable, _rnxSamplComboBox);
2654 enableWidget(enable, _rnxSkelExtComboBox);
2655 enableWidget(enable, _rnxSkelPathLineEdit);
2656 enableWidget(enable, _rnxFileCheckBox);
2657 enableWidget(enable, _rnxScrpLineEdit);
2658 enableWidget(enable, _rnxV2Priority);
2659 enableWidget(enable, _rnxVersComboBox);
2660
2661 bool enable1 = true;
2662 enable1 = _rnxVersComboBox->currentText() == "2";
2663 if (enable && enable1) {
2664 enableWidget(true, _rnxV2Priority);
2665 }
2666 if (enable && !enable1) {
2667 enableWidget(false, _rnxV2Priority);
2668 }
2669 }
2670
2671 // RINEX Observations, Signal Priority
2672 // -----------------------------------
2673 if (sender() == 0 || sender() == _rnxVersComboBox) {
2674 if (!_rnxPathLineEdit->text().isEmpty()) {
2675 enableWidget(enable, _rnxIntrComboBox);
2676 enable = _rnxVersComboBox->currentText() == "2";
2677 enableWidget(enable, _rnxV2Priority);
2678 }
2679 }
2680
2681 // RINEX Ephemeris
2682 // ---------------
2683 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2684 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2685 enableWidget(enable, _ephIntrComboBox);
2686 enableWidget(enable, _ephVersComboBox);
2687 //enableWidget(enable, _ephVersComboBox);
2688 //enableWidget(enable, _ephFilePerStation);
2689 }
2690
2691 // Broadcast Corrections
2692 // ---------------------
2693 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2694 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2695 enableWidget(enable, _corrIntrComboBox);
2696 }
2697
2698 // Feed Engine
2699 // -----------
2700 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2701 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2702 enableWidget(enable, _outWaitSpinBox);
2703 enableWidget(enable, _outSamplComboBox);
2704 }
2705
2706 // Serial Output
2707 // -------------
2708 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2709 sender() == _serialAutoNMEAComboBox) {
2710 enable = !_serialMountPointLineEdit->text().isEmpty();
2711 enableWidget(enable, _serialPortNameLineEdit);
2712 enableWidget(enable, _serialBaudRateComboBox);
2713 enableWidget(enable, _serialParityComboBox);
2714 enableWidget(enable, _serialDataBitsComboBox);
2715 enableWidget(enable, _serialStopBitsComboBox);
2716 enableWidget(enable, _serialFlowControlComboBox);
2717 enableWidget(enable, _serialAutoNMEAComboBox);
2718 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() == "Auto";
2719 enableWidget(enable2, _serialFileNMEALineEdit);
2720 bool enable3 = enable && _serialAutoNMEAComboBox->currentText().contains("Manual");
2721 enableWidget(enable3, _serialHeightNMEALineEdit);
2722 enableWidget(enable3, _serialManualNMEASamplingSpinBox);
2723 }
2724
2725 // Outages
2726 // -------
2727 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2728 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2729 enableWidget(enable, _adviseFailSpinBox);
2730 enableWidget(enable, _adviseRecoSpinBox);
2731 enableWidget(enable, _adviseScriptLineEdit);
2732 }
2733
2734 // Miscellaneous
2735 // -------------
2736 if (sender() == 0 || sender() == _miscMountLineEdit) {
2737 enable = !_miscMountLineEdit->text().isEmpty();
2738 enableWidget(enable, _miscIntrComboBox);
2739 enableWidget(enable, _miscScanRTCMCheckBox);
2740 enableWidget(enable, _miscPortLineEdit);
2741 }
2742
2743 // Combine Corrections
2744 // -------------------
2745 if (sender() == 0 || sender() == _cmbTable) {
2746 int iRow = _cmbTable->rowCount();
2747 if (iRow > 0) {
2748 enableWidget(true, _cmbMethodComboBox);
2749 enableWidget(true, _cmbMaxresLineEdit);
2750 enableWidget(true, _cmbSamplSpinBox);
2751 enableWidget(true, _cmbGpsCheckBox);
2752 enableWidget(true, _cmbGloCheckBox);
2753 enableWidget(true, _cmbGalCheckBox);
2754 enableWidget(true, _cmbBdsCheckBox);
2755 enableWidget(true, _cmbQzssCheckBox);
2756 enableWidget(true, _cmbSbasCheckBox);
2757 enableWidget(true, _cmbIrnssCheckBox);
2758 enableWidget(true, _cmbBsxFile);
2759 }
2760 else {
2761 enableWidget(false, _cmbMethodComboBox);
2762 enableWidget(false, _cmbMaxresLineEdit);
2763 enableWidget(false, _cmbSamplSpinBox);
2764 enableWidget(false, _cmbGpsCheckBox);
2765 enableWidget(false, _cmbGloCheckBox);
2766 enableWidget(false, _cmbGalCheckBox);
2767 enableWidget(false, _cmbBdsCheckBox);
2768 enableWidget(false, _cmbQzssCheckBox);
2769 enableWidget(false, _cmbSbasCheckBox);
2770 enableWidget(false, _cmbIrnssCheckBox);
2771 enableWidget(false, _cmbBsxFile);
2772 }
2773 }
2774
2775 // Upload(clk)
2776 // -----------
2777 int iRow = _uploadTable->rowCount();
2778 if (iRow > 0) {
2779 enableWidget(true, _uploadIntrComboBox);
2780 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2781 enableWidget(true, _uploadSamplClkRnxSpinBox);
2782 enableWidget(true, _uploadSamplBiaSnxSpinBox);
2783 enableWidget(true, _uploadSamplSp3ComboBox);
2784 enableWidget(true, _uploadAntexFile);
2785 }
2786 else {
2787 enableWidget(false, _uploadIntrComboBox);
2788 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2789 enableWidget(false, _uploadSamplClkRnxSpinBox);
2790 enableWidget(false, _uploadSamplBiaSnxSpinBox);
2791 enableWidget(false, _uploadSamplSp3ComboBox);
2792 enableWidget(false, _uploadAntexFile);
2793 }
2794
2795 // Upload(eph)
2796 // -----------
2797 iRow = _uploadEphTable->rowCount();
2798 if (iRow > 0) {
2799 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2800 }
2801 else {
2802 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2803 }
2804
2805 // QC
2806 // --
2807 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2808 enable = !_reqcActionComboBox->currentText().isEmpty();
2809 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2810// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2811 enableWidget(enable, _reqcObsFileChooser);
2812 enableWidget(enable, _reqcNavFileChooser);
2813 enableWidget(enable, _reqcOutLogLineEdit);
2814 enableWidget(enable && enable10, _reqcEditOptionButton);
2815 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2816 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2817 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2818 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2819// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2820 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2821 }
2822
2823 // SP3 File Comparison
2824 // -------------------
2825 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2826 enable = !_sp3CompFileChooser->fileName().isEmpty();
2827 enableWidget(enable, _sp3CompLogLineEdit);
2828 enableWidget(enable, _sp3CompExclude);
2829 enableWidget(enable, _sp3CompSummaryOnly);
2830 }
2831
2832 enableStartStop();
2833}
2834
2835//
2836////////////////////////////////////////////////////////////////////////////
2837void bncWindow::slotAddCmbRow() {
2838 int iRow = _cmbTable->rowCount();
2839 _cmbTable->insertRow(iRow);
2840 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2841 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2842 }
2843}
2844
2845//
2846////////////////////////////////////////////////////////////////////////////
2847void bncWindow::slotDelCmbRow() {
2848
2849 const static QPalette paletteWhite(QColor(255, 255, 255));
2850 const static QPalette paletteGray(QColor(230, 230, 230));
2851
2852 int nRows = _cmbTable->rowCount();
2853 std::vector <bool> flg(nRows);
2854 for (int iRow = 0; iRow < nRows; iRow++) {
2855 if (_cmbTable->item(iRow,1)->isSelected()) {
2856 flg[iRow] = true;
2857 }
2858 else {
2859 flg[iRow] = false;
2860 }
2861 }
2862 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2863 if (flg[iRow]) {
2864 _cmbTable->removeRow(iRow);
2865 }
2866 }
2867 nRows = _cmbTable->rowCount();
2868 if (nRows < 1) {
2869 enableWidget(false, _cmbMethodComboBox);
2870 enableWidget(false, _cmbMaxresLineEdit);
2871 enableWidget(false, _cmbSamplSpinBox);
2872 }
2873}
2874
2875//
2876////////////////////////////////////////////////////////////////////////////
2877void bncWindow::populateCmbTable() {
2878
2879 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2880 _cmbTable->removeRow(iRow);
2881 }
2882
2883 bncSettings settings;
2884
2885 int iRow = -1;
2886 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2887 while (it.hasNext()) {
2888 QStringList hlp = it.next().split(" ");
2889 if (hlp.size() > 2) {
2890 ++iRow;
2891 _cmbTable->insertRow(iRow);
2892 }
2893 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2894 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2895 }
2896 }
2897}
2898
2899//
2900////////////////////////////////////////////////////////////////////////////
2901void bncWindow::slotAddUploadRow() {
2902 int iRow = _uploadTable->rowCount();
2903 _uploadTable->insertRow(iRow);
2904 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2905 if (iCol == 3) {
2906 QComboBox* ntripversion = new QComboBox();
2907 ntripversion->setEditable(false);
2908 ntripversion->addItems(QString("1,2,2s").split(","));
2909 ntripversion->setFrame(false);
2910 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2911
2912 }
2913 else if (iCol == 4) {
2914 QLineEdit* user = new QLineEdit();
2915 user->setFrame(false);
2916 _uploadTable->setCellWidget(iRow, iCol, user);
2917 }
2918 else if (iCol == 5) {
2919 QLineEdit* passwd = new QLineEdit();
2920 passwd->setFrame(false);
2921 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2922 _uploadTable->setCellWidget(iRow, iCol, passwd);
2923 }
2924 else if (iCol == 6) {
2925 QComboBox* system = new QComboBox();
2926 system->setEditable(false);
2927 system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2928 system->setFrame(false);
2929 _uploadTable->setCellWidget(iRow, iCol, system);
2930 }
2931 else if (iCol == 7) {
2932 QComboBox* format = new QComboBox();
2933 format->setEditable(false);
2934 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2935 format->setFrame(false);
2936 _uploadTable->setCellWidget(iRow, iCol, format);
2937 }
2938 else if (iCol == 8) {
2939 QCheckBox* com = new QCheckBox();
2940 _uploadTable->setCellWidget(iRow, iCol, com);
2941 }
2942 else if (iCol == 15) {
2943 bncTableItem* bncIt = new bncTableItem();
2944 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2945 _uploadTable->setItem(iRow, iCol, bncIt);
2946 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2947 }
2948 else {
2949 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2950 }
2951 }
2952}
2953
2954//
2955////////////////////////////////////////////////////////////////////////////
2956void bncWindow::slotDelUploadRow() {
2957 BNC_CORE->_uploadTableItems.clear();
2958 int nRows = _uploadTable->rowCount();
2959 std::vector <bool> flg(nRows);
2960 for (int iRow = 0; iRow < nRows; iRow++) {
2961 if (_uploadTable->item(iRow,1)->isSelected()) {
2962 flg[iRow] = true;
2963 }
2964 else {
2965 flg[iRow] = false;
2966 }
2967 }
2968 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2969 if (flg[iRow]) {
2970 _uploadTable->removeRow(iRow);
2971 }
2972 }
2973 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2974 BNC_CORE->_uploadTableItems[iRow] =
2975 (bncTableItem*) _uploadTable->item(iRow, 14);
2976 }
2977 nRows = _uploadTable->rowCount();
2978 if (nRows < 1) {
2979 enableWidget(false, _uploadIntrComboBox);
2980 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2981 enableWidget(false, _uploadSamplSp3ComboBox);
2982 enableWidget(false, _uploadSamplClkRnxSpinBox);
2983 enableWidget(false, _uploadAntexFile);
2984 }
2985}
2986
2987//
2988////////////////////////////////////////////////////////////////////////////
2989void bncWindow::populateUploadTable() {
2990 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2991 _uploadTable->removeRow(iRow);
2992 }
2993
2994 bncSettings settings;
2995
2996 int iRow = -1;
2997 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2998
2999 while (it.hasNext()) {
3000 QStringList hlp = it.next().split(",");
3001 if (hlp.size() > 6) {
3002 ++iRow;
3003 _uploadTable->insertRow(iRow);
3004 }
3005 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3006 if (iCol == 3) {
3007 QComboBox* ntripversion = new QComboBox();
3008 ntripversion->setEditable(false);
3009 ntripversion->addItems(QString("1,2,2s").split(","));
3010 ntripversion->setFrame(false);
3011 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3012 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
3013 }
3014 else if (iCol == 4) {
3015 QLineEdit* user = new QLineEdit();
3016 user->setFrame(false);
3017 user->setText(hlp[iCol]);
3018 _uploadTable->setCellWidget(iRow, iCol, user);
3019 }
3020 else if (iCol == 5) {
3021 QLineEdit* passwd = new QLineEdit();
3022 passwd->setFrame(false);
3023 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3024 passwd->setText(hlp[iCol]);
3025 _uploadTable->setCellWidget(iRow, iCol, passwd);
3026 }
3027 else if (iCol == 6) {
3028 QComboBox* system = new QComboBox();
3029 system->setEditable(false);
3030 system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
3031 system->setFrame(false);
3032 system->setCurrentIndex(system->findText(hlp[iCol]));
3033 _uploadTable->setCellWidget(iRow, iCol, system);
3034 }
3035 else if (iCol == 7) {
3036 QComboBox* format = new QComboBox();
3037 format->setEditable(false);
3038 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
3039 format->setFrame(false);
3040 format->setCurrentIndex(format->findText(hlp[iCol]));
3041 _uploadTable->setCellWidget(iRow, iCol, format);
3042 }
3043 else if (iCol == 8) {
3044 QCheckBox* com = new QCheckBox();
3045 if (hlp[iCol].toInt() == Qt::Checked) {
3046 com->setCheckState(Qt::Checked);
3047 }
3048 _uploadTable->setCellWidget(iRow, iCol, com);
3049 }
3050 else if (iCol == 15) {
3051 bncTableItem* bncIt = new bncTableItem();
3052 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3053 _uploadTable->setItem(iRow, iCol, bncIt);
3054 BNC_CORE->_uploadTableItems[iRow] = bncIt;
3055 }
3056 else {
3057 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3058 }
3059 }
3060 }
3061}
3062
3063//
3064////////////////////////////////////////////////////////////////////////////
3065void bncWindow::slotSetUploadTrafo() {
3066 bncCustomTrafo* dlg = new bncCustomTrafo(this);
3067 dlg->exec();
3068 delete dlg;
3069}
3070
3071//
3072////////////////////////////////////////////////////////////////////////////
3073void bncWindow::slotAddUploadEphRow() {
3074 int iRow = _uploadEphTable->rowCount();
3075 _uploadEphTable->insertRow(iRow);
3076 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
3077 if (iCol == 3) {
3078 QComboBox* ntripversion = new QComboBox();
3079 ntripversion->setEditable(false);
3080 ntripversion->addItems(QString("1,2,2s").split(","));
3081 ntripversion->setFrame(false);
3082 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3083
3084 }
3085 else if (iCol == 4) {
3086 QLineEdit* user = new QLineEdit();
3087 user->setFrame(false);
3088 _uploadEphTable->setCellWidget(iRow, iCol, user);
3089 }
3090 else if (iCol == 5) {
3091 QLineEdit* passwd = new QLineEdit();
3092 passwd->setFrame(false);
3093 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3094 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3095 }
3096 else if (iCol == 6) {
3097 QLineEdit* system = new QLineEdit("GREC");
3098 system->setFrame(false);
3099 _uploadEphTable->setCellWidget(iRow, iCol, system);
3100 }
3101 else if (iCol == 7) {
3102 bncTableItem* bncIt = new bncTableItem();
3103 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3104 _uploadEphTable->setItem(iRow, iCol, bncIt);
3105 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3106 }
3107 else {
3108 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
3109 }
3110 }
3111}
3112
3113//
3114////////////////////////////////////////////////////////////////////////////
3115void bncWindow::slotDelUploadEphRow() {
3116 BNC_CORE->_uploadTableItems.clear();
3117 int nRows = _uploadEphTable->rowCount();
3118 std::vector <bool> flg(nRows);
3119 for (int iRow = 0; iRow < nRows; iRow++) {
3120 if (_uploadEphTable->item(iRow,1)->isSelected()) {
3121 flg[iRow] = true;
3122 }
3123 else {
3124 flg[iRow] = false;
3125 }
3126 }
3127 for (int iRow = nRows-1; iRow >= 0; iRow--) {
3128 if (flg[iRow]) {
3129 _uploadEphTable->removeRow(iRow);
3130 }
3131 }
3132 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
3133 BNC_CORE->_uploadTableItems[iRow] =
3134 (bncTableItem*) _uploadEphTable->item(iRow, 7);
3135 }
3136 nRows = _uploadEphTable->rowCount();
3137 if (nRows < 1) {
3138 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3139 }
3140}
3141
3142//
3143////////////////////////////////////////////////////////////////////////////
3144void bncWindow::populateUploadEphTable() {
3145 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3146 _uploadEphTable->removeRow(iRow);
3147 }
3148
3149 bncSettings settings;
3150
3151 int iRow = -1;
3152 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3153 while (it.hasNext()) {
3154 QStringList hlp = it.next().split(",");
3155 if (hlp.size() > 6) {
3156 ++iRow;
3157 _uploadEphTable->insertRow(iRow);
3158 }
3159 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3160 if (iCol == 3) {
3161 QComboBox* ntripversion = new QComboBox();
3162 ntripversion->setEditable(false);
3163 ntripversion->addItems(QString("1,2,2s").split(","));
3164 ntripversion->setFrame(false);
3165 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3166 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3167 }
3168 else if (iCol == 4) {
3169 QLineEdit* user = new QLineEdit();
3170 user->setFrame(false);
3171 user->setText(hlp[iCol]);
3172 _uploadEphTable->setCellWidget(iRow, iCol, user);
3173 }
3174 else if (iCol == 5) {
3175 QLineEdit* passwd = new QLineEdit();
3176 passwd->setFrame(false);
3177 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3178 passwd->setText(hlp[iCol]);
3179 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3180 }
3181 else if (iCol == 6) {
3182 QLineEdit* system = new QLineEdit();
3183 system->setFrame(false);
3184 system->setText(hlp[iCol]);
3185 _uploadEphTable->setCellWidget(iRow, iCol, system);
3186 }
3187 else if (iCol == 7) {
3188 bncTableItem* bncIt = new bncTableItem();
3189 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3190 _uploadEphTable->setItem(iRow, iCol, bncIt);
3191 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3192 }
3193 else {
3194 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3195 }
3196 }
3197 }
3198}
3199
3200
3201// Progress Bar Change
3202////////////////////////////////////////////////////////////////////////////
3203void bncWindow::slotPostProcessingProgress(int nEpo) {
3204 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3205}
3206
3207// Post-Processing Reqc Finished
3208////////////////////////////////////////////////////////////////////////////
3209void bncWindow::slotPostProcessingFinished() {
3210 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3211 _runningPPP = false;
3212 _runningEdit = false;
3213 _runningQC = false;
3214 _runningSp3Comp = false;
3215 _actStart->setText(tr("Sta&rt"));
3216 enableStartStop();
3217}
3218
3219// Edit teqc-like editing options
3220////////////////////////////////////////////////////////////////////////////
3221void bncWindow::slotReqcEditOption() {
3222 saveOptions();
3223 reqcDlg* dlg = new reqcDlg(this);
3224 dlg->move(this->pos().x()+50, this->pos().y()+50);
3225 dlg->exec();
3226 delete dlg;
3227}
3228
3229// Enable/Disable Start and Stop Buttons
3230////////////////////////////////////////////////////////////////////////////
3231void bncWindow::enableStartStop() {
3232 if ( running() ) {
3233 _actStart->setEnabled(false);
3234 if (_runningRealTime || _runningPPP) {
3235 _actStop->setEnabled(true);
3236 }
3237 }
3238 else {
3239 _actStart->setEnabled(true);
3240 _actStop->setEnabled(false);
3241 }
3242}
3243
3244// Show Map
3245////////////////////////////////////////////////////////////////////////////
3246void bncWindow::slotMapMountPoints() {
3247 saveOptions();
3248 t_bncMap* bncMap = new t_bncMap(this);
3249 bncMap->setMinimumSize(800, 600);
3250 bncMap->setWindowTitle("Selected Mountpoints");
3251
3252 bncSettings settings;
3253 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3254 while (it.hasNext()) {
3255 QStringList hlp = it.next().split(" ");
3256 if (hlp.size() < 5) continue;
3257 QUrl url(hlp[0]);
3258 double latDeg = hlp[3].toDouble();
3259 double lonDeg = hlp[4].toDouble();
3260 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3261 }
3262
3263 bncMap->show();
3264}
3265
3266// Show Map
3267////////////////////////////////////////////////////////////////////////////
3268void bncWindow::slotMapPPP() {
3269#ifdef QT_WEBENGINE
3270 saveOptions();
3271 enableWidget(false, _pppWidgets._mapWinButton);
3272 enableWidget(false, _pppWidgets._mapWinDotSize);
3273 enableWidget(false, _pppWidgets._mapWinDotColor);
3274
3275 if (!_mapWin) {
3276 _mapWin = new bncMapWin(this);
3277 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3278 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3279 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3280 }
3281 _mapWin->show();
3282#else
3283 QMessageBox::information(this, "Information",
3284 "Qt Library compiled without QT_WEBENGINE");
3285#endif
3286}
3287
3288// Show Map
3289////////////////////////////////////////////////////////////////////////////
3290void bncWindow::slotMapPPPClosed() {
3291#ifdef QT_WEBENGINE
3292 enableWidget(true, _pppWidgets._mapWinButton);
3293 enableWidget(true, _pppWidgets._mapWinDotSize);
3294 enableWidget(true, _pppWidgets._mapWinDotColor);
3295 if (_mapWin) {
3296 QListIterator<bncGetThread*> it(_threads);
3297 while (it.hasNext()) {
3298 bncGetThread* thread = it.next();
3299 thread->disconnect(_mapWin);
3300 }
3301 _mapWin->deleteLater();
3302 _mapWin = 0;
3303 }
3304#endif
3305}
Note: See TracBrowser for help on using the repository browser.