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

Last change on this file was 10452, checked in by stuerze, 29 hours ago

small bugs fixed

File size: 177.9 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <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 _serialNMEASamplingSpinBox = new QSpinBox();
383 _serialNMEASamplingSpinBox->setMinimum(0);
384 _serialNMEASamplingSpinBox->setMaximum(300);
385 _serialNMEASamplingSpinBox->setSingleStep(10);
386 _serialNMEASamplingSpinBox->setValue(settings.value("serialNMEASampling").toInt());
387 _serialNMEASamplingSpinBox->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,4);
477 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight Factor, Exclude Satellites").split(","));
478 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
479 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
480 _cmbTable->setMaximumWidth(40*ww);
481 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
482 _cmbTable->horizontalHeader()->resizeSection(1,6*ww);
483 _cmbTable->horizontalHeader()->resizeSection(2,9*ww);
484 _cmbTable->horizontalHeader()->resizeSection(3,9*ww);
485#if QT_VERSION < 0x050000
486 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
487#else
488 _cmbTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
489#endif
490 _cmbTable->horizontalHeader()->setStretchLastSection(true);
491 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
492
493 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
494 _cmbMaxdisplacementLineEdit = new QLineEdit(settings.value("cmbMaxdisplacement").toString());
495
496 _cmbSamplSpinBox = new QSpinBox;
497 _cmbSamplSpinBox->setMinimum(0);
498 _cmbSamplSpinBox->setMaximum(60);
499 _cmbSamplSpinBox->setSingleStep(5);
500 _cmbSamplSpinBox->setMaximumWidth(9*ww);
501 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
502 _cmbSamplSpinBox->setSuffix(" sec");
503
504 QPushButton* addCmbRowButton = new QPushButton("Add Row");
505 QPushButton* delCmbRowButton = new QPushButton("Delete");
506
507 connect(_cmbTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
508
509 _cmbMethodComboBox = new QComboBox();
510 _cmbMethodComboBox->setEditable(false);
511 _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
512 int cm = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
513 if (cm != -1) {
514 _cmbMethodComboBox->setCurrentIndex(cm);
515 }
516
517 int iRow = _cmbTable->rowCount();
518 if (iRow > 0) {
519 enableWidget(true, _cmbMethodComboBox);
520 enableWidget(true, _cmbMaxresLineEdit);
521 enableWidget(true, _cmbMaxdisplacementLineEdit);
522 enableWidget(true, _cmbSamplSpinBox);
523 }
524 else {
525 enableWidget(false, _cmbMethodComboBox);
526 enableWidget(false, _cmbMaxresLineEdit);
527 enableWidget(false, _cmbMaxdisplacementLineEdit);
528 enableWidget(false, _cmbSamplSpinBox);
529 }
530 _cmbGpsCheckBox = new QCheckBox();
531 _cmbGpsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGps").toInt()));
532 _cmbGloCheckBox = new QCheckBox();
533 _cmbGloCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGlo").toInt()));
534 _cmbGalCheckBox = new QCheckBox();
535 _cmbGalCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGal").toInt()));
536 _cmbBdsCheckBox = new QCheckBox();
537 _cmbBdsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbBds").toInt()));
538 _cmbQzssCheckBox = new QCheckBox();
539 _cmbQzssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbQzss").toInt()));
540 _cmbSbasCheckBox = new QCheckBox();
541 _cmbSbasCheckBox->setCheckState(Qt::CheckState(settings.value("cmbSbas").toInt()));
542 _cmbIrnssCheckBox = new QCheckBox();
543 _cmbIrnssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbIrnss").toInt()));
544
545 connect(_cmbGpsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
546 connect(_cmbGloCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
547 connect(_cmbGalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
548 connect(_cmbBdsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
549 connect(_cmbQzssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
550 connect(_cmbSbasCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
551 connect(_cmbIrnssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
552
553 _cmbBsxFile = new qtFileChooser(0, qtFileChooser::File);
554 _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
555
556 // Upload Results
557 // -------------
558 _uploadTable = new QTableWidget(0,16);
559 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, bytes").split(","));
560 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
561 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
562 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
563 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
564 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
565 _uploadTable->horizontalHeader()->resizeSection( 3, 6*ww);
566 _uploadTable->horizontalHeader()->resizeSection( 4, 8*ww);
567 _uploadTable->horizontalHeader()->resizeSection( 5, 8*ww);
568 _uploadTable->horizontalHeader()->resizeSection( 6,11*ww);
569 _uploadTable->horizontalHeader()->resizeSection( 7,11*ww);
570 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
571 _uploadTable->horizontalHeader()->resizeSection( 9,15*ww);
572 _uploadTable->horizontalHeader()->resizeSection(10,15*ww);
573 _uploadTable->horizontalHeader()->resizeSection(11,15*ww);
574 _uploadTable->horizontalHeader()->resizeSection(12, 4*ww);
575 _uploadTable->horizontalHeader()->resizeSection(13, 4*ww);
576 _uploadTable->horizontalHeader()->resizeSection(14, 4*ww);
577 _uploadTable->horizontalHeader()->resizeSection(15,12*ww);
578#if QT_VERSION < 0x050000
579 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
580#else
581 _uploadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
582#endif
583 _uploadTable->horizontalHeader()->setStretchLastSection(true);
584 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
585
586 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
587 SLOT(slotBncTextChanged()));
588
589 QPushButton* addUploadRowButton = new QPushButton("Add Row");
590 QPushButton* delUploadRowButton = new QPushButton("Del Row");
591 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
592 _uploadIntrComboBox = new QComboBox;
593 _uploadIntrComboBox->setEditable(false);
594 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
595 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
596 if (ii != -1) {
597 _uploadIntrComboBox->setCurrentIndex(ii);
598 }
599
600 _uploadAntexFile = new qtFileChooser(0, qtFileChooser::File);
601 _uploadAntexFile->setFileName(settings.value("uploadAntexFile").toString());
602
603 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
604 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
605 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
606 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
607 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
608 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
609 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
610
611 _uploadSamplSp3ComboBox = new QComboBox();
612 _uploadSamplSp3ComboBox->addItems(QString("0 sec,30 sec,60 sec,300 sec,900 sec").split(","));
613 int oo = _uploadSamplSp3ComboBox->findText(settings.value("uploadSamplSp3").toString());
614 if (oo != -1) {
615 _uploadSamplSp3ComboBox->setCurrentIndex(oo);
616 }
617
618 _uploadSamplClkRnxSpinBox = new QSpinBox;
619 _uploadSamplClkRnxSpinBox->setMinimum(0);
620 _uploadSamplClkRnxSpinBox->setMaximum(60);
621 _uploadSamplClkRnxSpinBox->setSingleStep(5);
622 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
623 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
624 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
625
626 _uploadSamplBiaSnxSpinBox = new QSpinBox;
627 _uploadSamplBiaSnxSpinBox->setMinimum(0);
628 _uploadSamplBiaSnxSpinBox->setMaximum(60);
629 _uploadSamplBiaSnxSpinBox->setSingleStep(5);
630 _uploadSamplBiaSnxSpinBox->setMaximumWidth(9*ww);
631 _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
632 _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
633
634 int iRowT = _uploadTable->rowCount();
635 if (iRowT > 0) {
636 enableWidget(true, _uploadIntrComboBox);
637 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
638 enableWidget(true, _uploadSamplSp3ComboBox);
639 enableWidget(true, _uploadSamplClkRnxSpinBox);
640 enableWidget(true, _uploadSamplBiaSnxSpinBox);
641 enableWidget(true, _uploadAntexFile);
642 }
643 else {
644 enableWidget(false, _uploadIntrComboBox);
645 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
646 enableWidget(false, _uploadSamplSp3ComboBox);
647 enableWidget(false, _uploadSamplClkRnxSpinBox);
648 enableWidget(true, _uploadSamplBiaSnxSpinBox);
649 enableWidget(false, _uploadAntexFile);
650 }
651
652 // Upload RTCM3 Ephemeris
653 // ----------------------
654 _uploadEphTable = new QTableWidget(0,6);
655 _uploadEphTable->setColumnCount(8);
656 _uploadEphTable->setRowCount(0);
657 _uploadEphTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, bytes").split(","));
658 _uploadEphTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
659 _uploadEphTable->setSelectionBehavior(QAbstractItemView::SelectRows);
660 _uploadEphTable->horizontalHeader()->resizeSection( 0,13*ww);
661 _uploadEphTable->horizontalHeader()->resizeSection( 1, 5*ww);
662 _uploadEphTable->horizontalHeader()->resizeSection( 2, 8*ww);
663 _uploadEphTable->horizontalHeader()->resizeSection( 3, 6*ww);
664 _uploadEphTable->horizontalHeader()->resizeSection( 4, 8*ww);
665 _uploadEphTable->horizontalHeader()->resizeSection( 3, 8*ww);
666 _uploadEphTable->horizontalHeader()->resizeSection( 5,10*ww);
667 _uploadEphTable->horizontalHeader()->resizeSection( 6,12*ww);
668#if QT_VERSION < 0x050000
669 _uploadEphTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
670#else
671 _uploadEphTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
672#endif
673 _uploadEphTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
674
675 connect(_uploadEphTable, SIGNAL(itemSelectionChanged()),
676 SLOT(slotBncTextChanged()));
677
678 QPushButton* addUploadEphRowButton = new QPushButton("Add Row");
679 addUploadEphRowButton->setMaximumWidth(9*ww);
680 QPushButton* delUploadEphRowButton = new QPushButton("Del Row");
681 delUploadEphRowButton->setMaximumWidth(9*ww);
682
683 _uploadSamplRtcmEphSpinBox = new QSpinBox;
684 _uploadSamplRtcmEphSpinBox->setMinimum(0);
685 _uploadSamplRtcmEphSpinBox->setMaximum(60);
686 _uploadSamplRtcmEphSpinBox->setSingleStep(5);
687 _uploadSamplRtcmEphSpinBox->setMaximumWidth(9*ww);
688 _uploadSamplRtcmEphSpinBox->setValue(settings.value("uploadSamplRtcmEph").toInt());
689 _uploadSamplRtcmEphSpinBox->setSuffix(" sec");
690
691 iRowT = _uploadEphTable->rowCount();
692 if (iRowT > 0) {
693 enableWidget(true, _uploadSamplRtcmEphSpinBox);
694 }
695 else {
696 enableWidget(false, _uploadSamplRtcmEphSpinBox);
697 }
698
699 // Canvas with Editable Fields
700 // ---------------------------
701 _canvas = new QWidget;
702 setCentralWidget(_canvas);
703
704 _aogroup = new QTabWidget();
705 _aogroup->setElideMode(Qt::ElideNone);
706 _aogroup->setUsesScrollButtons(true);
707 QWidget* pgroup = new QWidget();
708 QWidget* ggroup = new QWidget();
709 QWidget* sgroup = new QWidget();
710 QWidget* egroup = new QWidget();
711 QWidget* agroup = new QWidget();
712 QWidget* cgroup = new QWidget();
713 QWidget* ogroup = new QWidget();
714 QWidget* rgroup = new QWidget();
715 QWidget* sergroup = new QWidget();
716 QWidget* pppGroup1 = new QWidget();
717 QWidget* pppGroup2 = new QWidget();
718 QWidget* pppGroup3 = new QWidget();
719 QWidget* pppGroup4 = new QWidget();
720 QWidget* reqcgroup = new QWidget();
721 QWidget* sp3CompGroup = new QWidget();
722 QWidget* cmbgroup = new QWidget();
723 QWidget* uploadgroup = new QWidget();
724 QWidget* uploadEphgroup = new QWidget();
725 _aogroup->addTab(pgroup,tr("Network"));
726 _aogroup->addTab(ggroup,tr("General"));
727 _aogroup->addTab(ogroup,tr("RINEX Observations"));
728 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
729 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
730 _aogroup->addTab(sp3CompGroup,tr("SP3 Comparison"));
731 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
732 _aogroup->addTab(sgroup,tr("Feed Engine"));
733 _aogroup->addTab(sergroup,tr("Serial Output"));
734 _aogroup->addTab(agroup,tr("Outages"));
735 _aogroup->addTab(rgroup,tr("Miscellaneous"));
736 _aogroup->addTab(pppGroup1,tr("PPP (1)"));
737 _aogroup->addTab(pppGroup2,tr("PPP (2)"));
738 _aogroup->addTab(pppGroup3,tr("PPP (3)"));
739 _aogroup->addTab(pppGroup4,tr("PPP (4)"));
740 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
741 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
742 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
743
744 // Log Tab
745 // -------
746 _loggroup = new QTabWidget();
747 _loggroup->addTab(_log,tr("Log"));
748 _loggroup->addTab(_bncFigure,tr("Throughput"));
749 _loggroup->addTab(_bncFigureLate,tr("Latency"));
750 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
751
752 // Netowork (Proxy and SSL) Tab
753 // ----------------------------
754 QGridLayout* pLayout = new QGridLayout;
755 pLayout->setColumnMinimumWidth(0,13*ww);
756 _proxyPortLineEdit->setMaximumWidth(9*ww);
757
758 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none.<br>"),0, 0, 1, 50);
759 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
760 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
761 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
762 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
763 pLayout->addWidget(new QLabel("Path to SSL certificates"), 3, 0);
764 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
765 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
766 pLayout->addWidget(new QLabel("Path to SSL client certificates"), 4, 0);
767 pLayout->addWidget(_sslClientCertPathLineEdit, 4, 1, 1,10);
768 pLayout->addWidget(new QLabel("Ignore SSL authorization errors"), 5, 0);
769 pLayout->addWidget(_sslIgnoreErrorsCheckBox, 5, 1, 1,10);
770 pLayout->addWidget(new QLabel(""), 6, 1);
771 pLayout->setRowStretch(6, 999);
772
773 pgroup->setLayout(pLayout);
774
775 // General Tab
776 // -----------
777 QGridLayout* gLayout = new QGridLayout;
778 gLayout->setColumnMinimumWidth(0,14*ww);
779 _onTheFlyComboBox->setMaximumWidth(9*ww);
780
781 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);
782 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
783 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,20);
784 gLayout->addWidget(new QLabel("Append files"), 2, 0);
785 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
786 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
787 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
788 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
789 gLayout->addWidget(_autoStartCheckBox, 4, 1);
790 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
791 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,20);
792 gLayout->addWidget(new QLabel(""), 6, 1);
793 gLayout->setRowStretch(7, 999);
794
795 ggroup->setLayout(gLayout);
796
797 // RINEX Observations
798 // ------------------
799 QGridLayout* oLayout = new QGridLayout;
800 oLayout->setColumnMinimumWidth(0,14*ww);
801 _rnxIntrComboBox->setMaximumWidth(9*ww);
802 _rnxSamplComboBox->setMaximumWidth(9*ww);
803 _rnxSkelExtComboBox->setMaximumWidth(9*ww);
804
805 oLayout->addWidget(new QLabel("Saving RINEX observation files.<br>"),0, 0, 1,50);
806 oLayout->addWidget(new QLabel("Directory"), 1, 0);
807 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1, 15);
808 oLayout->addWidget(new QLabel("Interval"), 2, 0);
809 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
810 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
811 oLayout->addWidget(_rnxSamplComboBox, 2, 3, Qt::AlignRight);
812 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
813 oLayout->addWidget(_rnxSkelExtComboBox, 3, 1, Qt::AlignLeft);
814 oLayout->addWidget(new QLabel("Skeleton mandatory"), 3, 2, Qt::AlignRight);
815 oLayout->addWidget(_rnxFileCheckBox, 3, 3);
816 oLayout->addWidget(new QLabel("Skeleton Directory"), 4, 0);
817 oLayout->addWidget(_rnxSkelPathLineEdit, 4, 1, 1, 15);
818 oLayout->addWidget(new QLabel("Script (full path)"), 5, 0);
819 oLayout->addWidget(_rnxScrpLineEdit, 5, 1, 1, 15);
820 oLayout->addWidget(new QLabel("Version"), 6, 0);
821 oLayout->addWidget(_rnxVersComboBox, 6, 1);
822 oLayout->addWidget(new QLabel("Signal priority"), 6, 2, Qt::AlignRight);
823 oLayout->addWidget(_rnxV2Priority, 6, 3, 1, 13);
824 oLayout->addWidget(new QLabel(""), 7, 1);
825 oLayout->setRowStretch(8, 999);
826
827 ogroup->setLayout(oLayout);
828
829 // RINEX Ephemeris
830 // ---------------
831 QGridLayout* eLayout = new QGridLayout;
832 eLayout->setColumnMinimumWidth(0,14*ww);
833 _ephIntrComboBox->setMaximumWidth(9*ww);
834 _ephOutPortLineEdit->setMaximumWidth(9*ww);
835
836 eLayout->addWidget(new QLabel("Saving RINEX navigation files and ephemeris output through IP port.<br>"),0,0,1,70);
837 eLayout->addWidget(new QLabel("Directory"), 1, 0);
838 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
839 eLayout->addWidget(new QLabel("Interval"), 2, 0);
840 eLayout->addWidget(_ephIntrComboBox, 2, 1);
841 eLayout->addWidget(new QLabel("Port"), 3, 0);
842 eLayout->addWidget(_ephOutPortLineEdit, 3, 1);
843 eLayout->addWidget(new QLabel("Version"), 4, 0);
844 eLayout->addWidget(_ephVersComboBox, 4, 1);
845 eLayout->setRowStretch(5, 999);
846 //eLayout->addWidget(new QLabel("File per Station"), 5, 0);
847 //eLayout->addWidget(_ephFilePerStation, 5, 1);
848 //eLayout->setRowStretch(6, 999);
849
850 egroup->setLayout(eLayout);
851
852
853 // Broadcast Corrections
854 // ---------------------
855 QGridLayout* cLayout = new QGridLayout;
856 cLayout->setColumnMinimumWidth(0,14*ww);
857 _corrIntrComboBox->setMaximumWidth(9*ww);
858 _corrPortLineEdit->setMaximumWidth(9*ww);
859
860 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port.<br>"),0,0,1,70);
861 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
862 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,30);
863 cLayout->addWidget(new QLabel("Interval"), 2, 0);
864 cLayout->addWidget(_corrIntrComboBox, 2, 1);
865 cLayout->addWidget(new QLabel("Port"), 3, 0);
866 cLayout->addWidget(_corrPortLineEdit, 3, 1);
867 cLayout->addWidget(new QLabel(""), 4, 1);
868 cLayout->setRowStretch(7, 999);
869 cgroup->setLayout(cLayout);
870
871 // Feed Engine
872 // -----------
873 QGridLayout* sLayout = new QGridLayout;
874 sLayout->setColumnMinimumWidth(0,14*ww);
875 _outPortLineEdit->setMaximumWidth(9*ww);
876 _outWaitSpinBox->setMaximumWidth(9*ww);
877 _outSamplComboBox->setMaximumWidth(9*ww);
878 _outUPortLineEdit->setMaximumWidth(9*ww);
879
880 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine.<br>"),0,0,1,50);
881 sLayout->addWidget(new QLabel("Port"), 1, 0);
882 sLayout->addWidget(_outPortLineEdit, 1, 1);
883 sLayout->addWidget(new QLabel(" Wait for full obs epoch"), 1, 2, Qt::AlignRight);
884 sLayout->addWidget(_outWaitSpinBox, 1, 3, Qt::AlignLeft);
885 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
886 sLayout->addWidget(_outSamplComboBox, 2, 1, Qt::AlignLeft);
887 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
888 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 10);
889 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
890 sLayout->addWidget(_outUPortLineEdit, 4, 1);
891 sLayout->addWidget(new QLabel("Print lock time"), 5, 0);
892 sLayout->addWidget(_outLockTimeCheckBox, 5, 1);
893 sLayout->addWidget(new QLabel(""), 6, 1);
894 sLayout->setRowStretch(7, 999);
895
896 sgroup->setLayout(sLayout);
897
898 // Serial Output
899 // -------------
900 QGridLayout* serLayout = new QGridLayout;
901 serLayout->setColumnMinimumWidth(0,12*ww);
902 _serialBaudRateComboBox->setMaximumWidth(9*ww);
903 _serialFlowControlComboBox->setMaximumWidth(11*ww);
904 _serialDataBitsComboBox->setMaximumWidth(5*ww);
905 _serialParityComboBox->setMaximumWidth(9*ww);
906 _serialStopBitsComboBox->setMaximumWidth(5*ww);
907 _serialAutoNMEAComboBox->setMaximumWidth(14*ww);
908 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
909 _serialNMEASamplingSpinBox->setMaximumWidth(8*ww);
910
911 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver.<br>"),0,0,1,30);
912 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
913 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
914 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
915 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
916 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
917 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
918 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
919 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
920 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
921 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
922 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
923 serLayout->addWidget(_serialParityComboBox, 4, 3);
924 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
925 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
926 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
927 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
928 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
929 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,10);
930 serLayout->addWidget(new QLabel("Height"), 5,14, Qt::AlignRight);
931 serLayout->addWidget(_serialHeightNMEALineEdit, 5,15, 1,11);
932 serLayout->addWidget(new QLabel("Sampling"), 5,25, Qt::AlignRight);
933 serLayout->addWidget(_serialNMEASamplingSpinBox, 5,26, 1,12);
934 serLayout->addWidget(new QLabel(""), 6, 1);
935 serLayout->setRowStretch(7, 999);
936
937 sergroup->setLayout(serLayout);
938
939 // Outages
940 // -------
941 QGridLayout* aLayout = new QGridLayout;
942 aLayout->setColumnMinimumWidth(0,14*ww);
943 _adviseObsRateComboBox->setMaximumWidth(9*ww);
944 _adviseFailSpinBox->setMaximumWidth(9*ww);
945 _adviseRecoSpinBox->setMaximumWidth(9*ww);
946
947 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes.<br>"),0,0,1,50,Qt::AlignLeft);
948 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
949 aLayout->addWidget(_adviseObsRateComboBox, 1, 1);
950 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
951 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
952 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
953 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
954 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
955 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,20);
956 aLayout->addWidget(new QLabel(""), 5, 1);
957 aLayout->setRowStretch(6, 999);
958
959 agroup->setLayout(aLayout);
960
961 // Miscellaneous
962 // -------------
963 QGridLayout* rLayout = new QGridLayout;
964 rLayout->setColumnMinimumWidth(0,14*ww);
965 _miscIntrComboBox->setMaximumWidth(9*ww);
966 _miscPortLineEdit->setMaximumWidth(9*ww);
967
968 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);
969 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
970 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1, 7);
971 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
972 rLayout->addWidget(_miscIntrComboBox, 2, 1);
973 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
974 rLayout->addWidget(_miscScanRTCMCheckBox, 3, 1);
975 rLayout->addWidget(new QLabel("Port"), 4, 0);
976 rLayout->addWidget(_miscPortLineEdit, 4, 1);
977 rLayout->addWidget(new QLabel(""), 5, 1);
978 rLayout->setRowStretch(6, 999);
979
980 rgroup->setLayout(rLayout);
981
982 // PPP
983 // ---
984 _pppWidgets._dataSource->setMaximumWidth(15*ww);
985 _pppWidgets._corrMount->setMaximumWidth(15*ww);
986 _pppWidgets._nmeaPath->setMaximumWidth(35*ww);
987 _pppWidgets._logPath->setMaximumWidth(35*ww);
988 _pppWidgets._snxtroPath->setMaximumWidth(35*ww);
989 _pppWidgets._snxtroIntr->setMaximumWidth(7*ww);
990 _pppWidgets._snxtroAc->setMaximumWidth(7*ww);
991 _pppWidgets._snxtroSolId->setMaximumWidth(7*ww);
992 _pppWidgets._snxtroSolType->setMaximumWidth(7*ww);
993 _pppWidgets._snxtroCampId->setMaximumWidth(7*ww);
994 _pppWidgets._ionoMount->setMaximumWidth(15*ww);
995
996
997 QGridLayout* pppLayout1 = new QGridLayout();
998 int ir = 0;
999 pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
1000 ++ir;
1001 pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
1002 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
1003 pppLayout1->addWidget(new QLabel(" Logfile directory"), ir, 4);
1004 pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
1005 ++ir;
1006 pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
1007 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
1008 pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
1009 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
1010 pppLayout1->addWidget(new QLabel(" NMEA directory"), ir, 4);
1011 pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
1012 ++ir;
1013#ifdef USE_PPP
1014 pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
1015 pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
1016 pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
1017 pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
1018#endif
1019 pppLayout1->addWidget(new QLabel(" SNX TRO directory"), ir, 4);
1020 pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
1021 ++ir;
1022 pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
1023 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
1024 pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
1025 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
1026 pppLayout1->addWidget(new QLabel(" SNX TRO interval"), ir, 4);
1027 pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
1028 pppLayout1->addWidget(new QLabel(" SNX TRO sampling"), ir, 6);
1029 pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
1030 ++ir;
1031 pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 0);
1032 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1);
1033 pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 2);
1034 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 3);
1035 pppLayout1->addWidget(new QLabel(" SNX TRO AC"), ir, 4);
1036 pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
1037 pppLayout1->addWidget(new QLabel(" SNX TRO solution ID"),ir, 6);
1038 pppLayout1->addWidget(_pppWidgets._snxtroSolId, ir, 7, Qt::AlignRight);
1039 ++ir;
1040#ifdef USE_PPP
1041 pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
1042 pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
1043 pppLayout1->addWidget(new QLabel(" SNX TRO campaign ID"), ir, 4);
1044 pppLayout1->addWidget(_pppWidgets._snxtroCampId, ir, 5);
1045 pppLayout1->addWidget(new QLabel(" SNX TRO solution type"),ir, 6);
1046 pppLayout1->addWidget(_pppWidgets._snxtroSolType, ir, 7, Qt::AlignRight);
1047#endif
1048 pppLayout1->setRowStretch(ir+1, 999);
1049 pppGroup1->setLayout(pppLayout1);
1050
1051 QGridLayout* pppLayout2 = new QGridLayout();
1052 ir = 0;
1053 pppLayout2->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
1054 ++ir;
1055 pppLayout2->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
1056 pppLayout2->addWidget(_pppWidgets._lcGPS, ir, 1);
1057 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1058 pppLayout2->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
1059 pppLayout2->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
1060 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1061 pppLayout2->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
1062 pppLayout2->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
1063 ++ir;
1064 pppLayout2->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
1065 pppLayout2->addWidget(_pppWidgets._lcGLONASS, ir, 1);
1066 pppLayout2->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
1067 pppLayout2->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8*ww);
1068 pppLayout2->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
1069 pppLayout2->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8*ww);
1070 ++ir;
1071 pppLayout2->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
1072 pppLayout2->addWidget(_pppWidgets._lcGalileo, ir, 1);
1073 pppLayout2->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
1074 pppLayout2->addWidget(_pppWidgets._eleWgtCode, ir, 4);
1075 pppLayout2->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
1076 pppLayout2->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
1077 ++ir;
1078 pppLayout2->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
1079 pppLayout2->addWidget(_pppWidgets._lcBDS, ir, 1);
1080 pppLayout2->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
1081 pppLayout2->addWidget(_pppWidgets._minObs, ir, 4);
1082 pppLayout2->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
1083 pppLayout2->addWidget(_pppWidgets._minEle, ir, 7);_pppWidgets._minEle->setMaximumWidth(8*ww);
1084 ++ir;
1085#ifdef USE_PPP
1086 pppLayout2->addWidget(new QLabel("Constraints"), ir, 0, Qt::AlignLeft);
1087 pppLayout2->addWidget(_pppWidgets._constraints, ir, 1);
1088 pppLayout2->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
1089 pppLayout2->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8*ww);
1090#endif
1091 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1092 pppLayout2->addWidget(new QLabel("Wait for clock corr."), ir, 6, Qt::AlignLeft);
1093 pppLayout2->addWidget(_pppWidgets._corrWaitTime, ir, 7);
1094 ++ir;
1095 pppLayout2->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1096#ifdef USE_PPP
1097 pppLayout2->addWidget(new QLabel("Max Res GIM"), ir, 3, Qt::AlignLeft);
1098 pppLayout2->addWidget(_pppWidgets._maxResGIM, ir, 4); _pppWidgets._maxResGIM->setMaximumWidth(8*ww);
1099#endif
1100 pppLayout2->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
1101 pppLayout2->addWidget(_pppWidgets._seedingTime, ir, 7);_pppWidgets._seedingTime->setMaximumWidth(8*ww);
1102 ++ir;
1103 pppLayout2->addWidget(new QLabel(""), ir, 8);
1104 pppLayout2->setColumnStretch(8, 999);
1105 ++ir;
1106 pppLayout2->addWidget(new QLabel(""), ir, 1);
1107 pppLayout2->setRowStretch(ir, 999);
1108
1109 pppGroup2->setLayout(pppLayout2);
1110
1111 QVBoxLayout* pppLayout3 = new QVBoxLayout();
1112 pppLayout3->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
1113 pppLayout3->addWidget(_pppWidgets._staTable, 99);
1114 QHBoxLayout* pppLayout3sub = new QHBoxLayout();
1115 pppLayout3sub->addWidget(_pppWidgets._addStaButton);
1116 pppLayout3sub->addWidget(_pppWidgets._delStaButton);
1117 pppLayout3sub->addStretch(99);
1118
1119 pppLayout3->addLayout(pppLayout3sub);
1120
1121 pppGroup3->setLayout(pppLayout3);
1122
1123 // ------------------------
1124 connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
1125 _pppWidgets._mapSpeedSlider->setMinimumWidth(33*ww);
1126 _pppWidgets._audioResponse->setMaximumWidth(8*ww);
1127
1128 QGridLayout* pppLayout4 = new QGridLayout();
1129 ir = 0;
1130 pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
1131 ++ir;
1132 pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
1133 pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
1134 pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
1135 pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
1136 pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
1137 ++ir;
1138 pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
1139 pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
1140 ++ir;
1141 pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
1142 pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
1143 pppLayout4->addWidget(new QLabel("Size "), ir, 2, Qt::AlignLeft);
1144 pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
1145 pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
1146 ++ir;
1147 pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
1148 pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
1149 ++ir;
1150 pppLayout4->addWidget(new QLabel(""), ir, 1);
1151 pppLayout4->setRowStretch(ir, 999);
1152
1153 pppGroup4->setLayout(pppLayout4);
1154
1155 // Reqc Processing
1156 // ---------------
1157 _reqcActionComboBox = new QComboBox();
1158 _reqcActionComboBox->setEditable(false);
1159 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1160 int ip = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1161 if (ip != -1) {
1162 _reqcActionComboBox->setCurrentIndex(ip);
1163 }
1164 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1165 this, SLOT(slotBncTextChanged()));
1166
1167 QGridLayout* reqcLayout = new QGridLayout;
1168 _reqcActionComboBox->setMinimumWidth(15*ww);
1169 _reqcActionComboBox->setMaximumWidth(20*ww);
1170
1171 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1172 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1173
1174 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1175 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1176 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1177 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1178 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1179 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1180 _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
1181
1182 connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString &)),
1183 this, SLOT(slotBncTextChanged()));
1184
1185 _reqcLogSummaryOnly = new QCheckBox();
1186 _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
1187
1188 ir = 0;
1189 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"),ir, 0, 1, 8);
1190 ++ir;
1191 reqcLayout->addWidget(new QLabel("Action"), ir, 0);
1192 reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
1193 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1194 _reqcEditOptionButton->setMinimumWidth(15*ww);
1195 _reqcEditOptionButton->setMaximumWidth(20*ww);
1196
1197 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
1198 ++ir;
1199 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
1200 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
1201 _reqcObsFileChooser->setMaximumWidth(40*ww);
1202 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1203 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
1204 _reqcNavFileChooser->setMaximumWidth(40*ww);
1205 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1206 ++ir;
1207 reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
1208 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
1209 _reqcOutObsLineEdit->setMaximumWidth(40*ww);
1210 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1211 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
1212 _reqcOutNavLineEdit->setMaximumWidth(40*ww);
1213 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1214 ++ir;
1215 reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
1216 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
1217 _reqcOutLogLineEdit->setMaximumWidth(40*ww);
1218 reqcLayout->addWidget(new QLabel(" Summary only"), ir, 2);
1219 reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
1220 ++ir;
1221 reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
1222 reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
1223 _reqcSkyPlotSignals->setMaximumWidth(40*ww);
1224 ++ir;
1225 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
1226 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
1227 _reqcPlotDirLineEdit->setMaximumWidth(40*ww);
1228 ++ir;
1229 reqcLayout->setRowStretch(ir, 999);
1230
1231 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1232 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1233
1234 reqcgroup->setLayout(reqcLayout);
1235
1236 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1237 this, SLOT(slotReqcEditOption()));
1238
1239 QGridLayout* sp3CompLayout = new QGridLayout;
1240
1241 _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1242 _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
1243 _sp3CompFileChooser->setMinimumWidth(15*ww);
1244 _sp3CompFileChooser->setMaximumWidth(40*ww);
1245
1246 _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
1247 _sp3CompExclude->setMinimumWidth(18*ww);
1248 _sp3CompExclude->setMaximumWidth(18*ww);
1249
1250 _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
1251 _sp3CompLogLineEdit->setMinimumWidth(18*ww);
1252 _sp3CompLogLineEdit->setMaximumWidth(18*ww);
1253
1254 _sp3CompSummaryOnly = new QCheckBox();
1255 _sp3CompSummaryOnly->setCheckState(Qt::CheckState(settings.value("sp3CompSummaryOnly").toInt()));
1256
1257 ir = 0;
1258 sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
1259 ++ir;
1260 sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
1261 sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
1262 ++ir;
1263 sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
1264 sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
1265 ++ir;
1266 sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
1267 sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
1268 ++ir;
1269 sp3CompLayout->addWidget(new QLabel("Summary only"), ir, 0);
1270 sp3CompLayout->addWidget(_sp3CompSummaryOnly, ir, 1);
1271 ++ir;
1272 sp3CompLayout->addWidget(new QLabel(""), ir, 1);
1273 ++ir;
1274 sp3CompLayout->setRowStretch(ir, 999);
1275
1276 sp3CompLayout->setColumnMinimumWidth(2, 8*ww);
1277 sp3CompLayout->setColumnMinimumWidth(4, 8*ww);
1278
1279 sp3CompGroup->setLayout(sp3CompLayout);
1280
1281 connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString &)),
1282 this, SLOT(slotBncTextChanged()));
1283
1284 // Combine Corrections
1285 // -------------------
1286 QGridLayout* cmbLayout = new QGridLayout;
1287
1288 populateCmbTable();
1289 cmbLayout->addWidget(_cmbTable, 0, 0, 8, 10);
1290 cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams.<br>"), 0, 10, 1, 10);
1291 cmbLayout->addWidget(addCmbRowButton, 1, 10);
1292 cmbLayout->addWidget(delCmbRowButton, 1, 11);
1293 cmbLayout->addWidget(new QLabel("Method"), 2, 10, Qt::AlignLeft);
1294 cmbLayout->addWidget(_cmbMethodComboBox, 2, 11);
1295 cmbLayout->addWidget(new QLabel("BSX File"), 3, 10, Qt::AlignLeft);
1296 cmbLayout->addWidget(_cmbBsxFile, 3, 11, Qt::AlignRight);
1297 cmbLayout->addWidget(new QLabel("Max Clk Residual"), 4, 10, Qt::AlignLeft);
1298 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 11, Qt::AlignRight);
1299 cmbLayout->addWidget(new QLabel("Max Orb Displacement"), 5, 10, Qt::AlignLeft);
1300 cmbLayout->addWidget(_cmbMaxdisplacementLineEdit, 5, 11, Qt::AlignRight);
1301 cmbLayout->addWidget(new QLabel("Sampling"), 6, 10, Qt::AlignLeft);
1302 cmbLayout->addWidget(_cmbSamplSpinBox, 6, 11, Qt::AlignRight);
1303
1304 cmbLayout->addWidget(new QLabel("GNSS"), 0, 14, Qt::AlignLeft);
1305 cmbLayout->addWidget(new QLabel("GPS (C1W/C2W)"), 1, 14);
1306 cmbLayout->addWidget(_cmbGpsCheckBox, 1, 15);
1307
1308 cmbLayout->addWidget(new QLabel("GLONASS (C1P/C2P)"), 2, 14);
1309 cmbLayout->addWidget(_cmbGloCheckBox, 2, 15);
1310
1311 cmbLayout->addWidget(new QLabel("Galileo (C1C/C5Q)"), 3, 14);
1312 cmbLayout->addWidget(_cmbGalCheckBox, 3, 15);
1313
1314 cmbLayout->addWidget(new QLabel("Beidou (C2I/C6I)"), 4, 14);
1315 cmbLayout->addWidget(_cmbBdsCheckBox, 4, 15);
1316
1317 cmbLayout->addWidget(new QLabel("QZSS (C1C/C2L)"), 5, 14);
1318 cmbLayout->addWidget(_cmbQzssCheckBox, 5, 15);
1319
1320 cmbLayout->addWidget(new QLabel("SBAS (C1C/C5Q)"), 6, 14);
1321 cmbLayout->addWidget(_cmbSbasCheckBox, 6, 15);
1322
1323 cmbLayout->addWidget(new QLabel("IRNSS"), 7, 14);
1324 cmbLayout->addWidget(_cmbIrnssCheckBox, 7, 15);
1325 cmbLayout->setRowStretch(9, 999);
1326
1327 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1328 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1329
1330 cmbgroup->setLayout(cmbLayout);
1331
1332 // Upload Layout (Clocks)
1333 // ----------------------
1334 QGridLayout* uploadHlpLayout = new QGridLayout();
1335
1336 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1337 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1338 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1339
1340 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1341 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1342 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1343 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1344 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1345 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1346 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1347 uploadHlpLayout->addWidget(_uploadSamplSp3ComboBox, 0, 7);
1348 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1349 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1350 uploadHlpLayout->addWidget(new QLabel("BSX"), 0,10, Qt::AlignRight);
1351 uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox, 0,11);
1352 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,12);
1353 uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
1354 uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
1355
1356 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1357 populateUploadTable();
1358
1359 uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to caster.<br>"));
1360 uploadLayout->addWidget(_uploadTable);
1361 uploadLayout->addLayout(uploadHlpLayout);
1362
1363 uploadgroup->setLayout(uploadLayout);
1364
1365 // Upload Layout (Ephemeris)
1366 // -------------------------
1367 QGridLayout* uploadHlpLayoutEph = new QGridLayout();
1368
1369 connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
1370 connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
1371
1372 uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
1373 uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
1374 uploadHlpLayoutEph->addWidget(new QLabel(" Sampling"), 0, 2, Qt::AlignRight);
1375 uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
1376
1377 QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
1378 populateUploadEphTable();
1379
1380 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster.<br>"));
1381 uploadLayoutEph->addWidget(_uploadEphTable);
1382 uploadLayoutEph->addLayout(uploadHlpLayoutEph);
1383
1384 uploadEphgroup->setLayout(uploadLayoutEph);
1385
1386
1387 // Main Layout
1388 // -----------
1389 QGridLayout* mLayout = new QGridLayout;
1390 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1391 mLayout->addWidget(_aogroup, 0,0);
1392 mLayout->addWidget(_mountPointsTable, 1,0);
1393 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1394 mLayout->addWidget(_loggroup, 2,0);
1395
1396 _canvas->setLayout(mLayout);
1397
1398 // WhatsThis, Network
1399 // ------------------
1400 _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>"));
1401 _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>"));
1402 _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>"));
1403 _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>"));
1404 _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>"));
1405
1406 // WhatsThis, General
1407 // ------------------
1408 _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>"));
1409 _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>"));
1410 _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>"));
1411 _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>"));
1412 _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>"));
1413
1414 // WhatsThis, RINEX Observations
1415 // -----------------------------
1416 _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>"));
1417 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
1418 _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
1419 _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>"));
1420 _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>"));
1421 _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>"));
1422 _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>"));
1423 _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>"));
1424 _rnxVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Observation files. <i>[key: rnxVersion]</i></p>"));
1425
1426 // WhatsThis, RINEX Ephemeris
1427 // --------------------------
1428 _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>"));
1429 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
1430 _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>"));
1431 _ephVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Navigation files. <i>[key: ephVersion]</i></p>"));
1432 //_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>"));
1433
1434 // WhatsThis, RINEX Editing & QC
1435 // -----------------------------
1436 _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>"));
1437 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
1438 _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>"));
1439 _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>"));
1440 _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>"));
1441 _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>"));
1442 _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>"));
1443 _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>"));
1444 _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>"));
1445 _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>"));
1446
1447 // WhatsThis, SP3 Comparison
1448 // -------------------------
1449 _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>"));
1450 _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>"));
1451 _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>"));
1452 _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>"));
1453
1454 // WhatsThis, Broadcast Corrections
1455 // --------------------------------
1456 _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>"));
1457 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
1458 _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>"));
1459
1460 // WhatsThis, Feed Engine
1461 // ----------------------
1462 _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>"));
1463 _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>"));
1464 _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
1465 _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>"));
1466 _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>"));
1467 _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
1468
1469 // WhatsThis, Serial Output
1470 // ------------------------
1471 _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>"));
1472 _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>"));
1473 _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>"));
1474 _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>"));
1475 _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>"));
1476 _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>"));
1477 _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>"));
1478 _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>"));
1479 _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>"));
1480 _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>"));
1481 _serialNMEASamplingSpinBox->setWhatsThis(tr("<p>Select a sampling interval in seconds for manual or receiver generated NMEA GGA sentences and their upload.</p><p>A sampling rate of '0' means, 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: serialNMEASampling]</i></p>"));
1482
1483 // WhatsThis, Outages
1484 // ------------------
1485 _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>"));
1486 _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>"));
1487 _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>"));
1488 _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>"));
1489
1490 // WhatsThis, Miscellaneous
1491 // ------------------------
1492 _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>"));
1493 _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>"));
1494 _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>"));
1495 _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>"));
1496
1497 // WhatsThis, PPP (1)
1498 // ------------------
1499 _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>"));
1500 _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
1501 _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
1502 _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>"));
1503 _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>"));
1504 _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>"));
1505 _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>"));
1506 _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>"));
1507 _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>"));
1508 _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>"));
1509 _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>"));
1510 _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>"));
1511 _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>"));
1512 _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>"));
1513 _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
1514 _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>"));
1515 _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>"));
1516 _pppWidgets._snxtroSolType->setWhatsThis(tr("<p>Specify a 3-character solution type, e.g. real-time (RTS), unknown (UNK), .. <i>[key: PPP/snxtroSolType]</i></p>"));
1517 _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>"));
1518
1519 // WhatsThis, PPP (2)
1520 // ------------------
1521 _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>"
1522#ifdef USE_PPP_SSR_I
1523 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1524 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1525#else
1526 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1527 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1528 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1529 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1530 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1531 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1532 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1533#endif
1534 "<li>'no' means that you don't want BNC to use GPS data.</li></ul></p><p><i>[key: PPP/lcGPS]</i></p>"));
1535 _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>"
1536#ifdef USE_PPP_SSR_I
1537 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1538 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1539 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1540#else
1541 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1542 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1543 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1544 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1545 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1546 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1547 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1548#endif
1549 "<li>'no' means that you don't want BNC to use GLONASS data.</li></ul></p><p><i>[key: PPP/lcGLONASS]</i></p>"));
1550 _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>"
1551#ifdef USE_PPP_SSR_I
1552 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1553 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1554 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1555#else
1556 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1557 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1558 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1559 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
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#endif
1564 "<li>'no' means that you don't want BNC to use Galileo data.</li></ul></p><p><i>[key: PPP/lcGalileo]</i></p>"));
1565 _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>"
1566#ifdef USE_PPP_SSR_I
1567 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1568 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1569 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1570#else
1571 "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
1572 "<li>'Pi' means that uncombined code data of two frequencies shall be used.</li>"
1573 "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
1574 "<li>'P1' means that uncombined code data of one frequency shall be used.</li>"
1575 "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
1576 "<li>'P3' means that the inonosphere-free linear combination of code data shall be used.</li>"
1577 "<li>'L3' means that the inonosphere-free linear combination of phase data shall be used.</li> "
1578#endif
1579 "<li>'no' means that you don't want BNC to use BDS data.</li></ul></p><p><i>[key: PPP/lcBDS]</i></p>"));
1580 _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>"));
1581 _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>"));
1582 _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>"));
1583#ifdef USE_PPP
1584 _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>"));
1585#endif
1586 _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>"));
1587 _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>"));
1588#ifdef USE_PPP
1589 _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>"));
1590#endif
1591 _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>"));
1592 _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>"));
1593 _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>"));
1594 _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>"));
1595
1596 // WhatsThis, Combine Corrections
1597 // ------------------------------
1598 _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. 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. Finally, double click on the 'Exclude Satellites' field and specify satellites, to exclude them for an individual AC. An entry 'G04,G31,R' means to excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from one individual AC. Default is an empty option field, meaning that no satellite is excluded from this individual AC.</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>"));
1599 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1600 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1601 _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>"));
1602 _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Clk 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>"));
1603 _cmbMaxdisplacementLineEdit->setWhatsThis(tr("<p>BNC builds mean values for all incoming orbit corrections per satellite. Individual orbit corrections that differ by more than 'Maximal Orb Displacement' meters from the average of all orbit corrections per satellite will be ignored.<p></p>It is suggested to specify a value of about 0.5 m.</p><p>Default is a value of '2.0'. <i>[key: cmbMaxdisplacement]</i></p>"));
1604 _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>"));
1605 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGps]</i></p>"));
1606 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1607 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1608 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; BDS Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1609 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1610 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1611 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS clock corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1612 _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>"));
1613
1614 // WhatsThis, Upload Corrections
1615 // -----------------------------
1616 _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>"));
1617 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1618 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1619 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
1620 _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>"));
1621 _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>"));
1622 _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>"));
1623 _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>"));
1624 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>"));
1625 _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>"));
1626
1627 // WhatsThis, Upload Ephemeris
1628 // ---------------------------
1629 _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>"));
1630 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1631 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1632 _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>"));
1633
1634 // WhatsThis, Streams Canvas
1635 // -------------------------
1636 _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>"));
1637 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1638 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1639 _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>"));
1640 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1641 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1642
1643 // WhatsThis, Log Canvas
1644 // ---------------------
1645 _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>"));
1646 _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>"));
1647 _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>"));
1648 _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>"));
1649
1650
1651 // Enable/Disable all Widgets
1652 // --------------------------
1653 slotBncTextChanged();
1654 enableStartStop();
1655
1656 // Auto start
1657 // ----------
1658 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1659 slotStart();
1660 }
1661}
1662
1663// Destructor
1664////////////////////////////////////////////////////////////////////////////
1665bncWindow::~bncWindow() {
1666 if (_caster) {
1667 delete _caster; BNC_CORE->setCaster(0);
1668 }
1669 if (_casterEph) {
1670 delete _casterEph;
1671 }
1672 delete _bncFigureLate;
1673 delete _bncFigurePPP;
1674 delete _actHelp;
1675 delete _actAbout;
1676 delete _actFlowchart;
1677 delete _actFontSel;
1678 delete _actSaveOpt;
1679 delete _actQuit;
1680 delete _actAddMountPoints;
1681 delete _actDeleteMountPoints;
1682 delete _actMapMountPoints;
1683 delete _actStart;
1684 delete _actStop;
1685 delete _actwhatsthis;
1686 delete _proxyHostLineEdit;
1687 delete _proxyPortLineEdit;
1688 delete _sslCaCertPathLineEdit;
1689 delete _sslClientCertPathLineEdit;
1690 delete _sslIgnoreErrorsCheckBox;
1691 delete _logFileLineEdit;
1692 delete _rawOutFileLineEdit;
1693 delete _rnxAppendCheckBox;
1694 delete _onTheFlyComboBox;
1695 delete _autoStartCheckBox;
1696 delete _rnxPathLineEdit;
1697 delete _rnxIntrComboBox;
1698 delete _rnxSamplComboBox;
1699 delete _rnxSkelExtComboBox;
1700 delete _rnxSkelPathLineEdit;
1701 delete _rnxFileCheckBox;
1702 delete _rnxScrpLineEdit;
1703 delete _rnxVersComboBox;
1704 delete _rnxV2Priority;
1705 delete _ephPathLineEdit;
1706 //delete _ephFilePerStation;
1707 delete _ephIntrComboBox;
1708 delete _ephOutPortLineEdit;
1709 delete _ephVersComboBox;
1710 delete _corrPathLineEdit;
1711 delete _corrIntrComboBox;
1712 delete _corrPortLineEdit;
1713 delete _outPortLineEdit;
1714 delete _outWaitSpinBox;
1715 delete _outSamplComboBox;
1716 delete _outFileLineEdit;
1717 delete _outUPortLineEdit;
1718 delete _outLockTimeCheckBox;
1719 delete _serialMountPointLineEdit;
1720 delete _serialPortNameLineEdit;
1721 delete _serialBaudRateComboBox;
1722 delete _serialFlowControlComboBox;
1723 delete _serialDataBitsComboBox;
1724 delete _serialParityComboBox;
1725 delete _serialStopBitsComboBox;
1726 delete _serialAutoNMEAComboBox;
1727 delete _serialFileNMEALineEdit;
1728 delete _serialHeightNMEALineEdit;
1729 delete _serialNMEASamplingSpinBox;
1730 delete _adviseObsRateComboBox;
1731 delete _adviseFailSpinBox;
1732 delete _adviseRecoSpinBox;
1733 delete _adviseScriptLineEdit;
1734 delete _miscMountLineEdit;
1735 delete _miscPortLineEdit;
1736 delete _miscIntrComboBox;
1737 delete _miscScanRTCMCheckBox;
1738 _mountPointsTable->deleteLater();
1739 delete _log;
1740 delete _loggroup;
1741 _cmbTable->deleteLater();
1742 delete _cmbMaxresLineEdit;
1743 delete _cmbMaxdisplacementLineEdit;
1744 delete _cmbSamplSpinBox;
1745 delete _cmbMethodComboBox;
1746 delete _cmbGpsCheckBox;
1747 delete _cmbGloCheckBox;
1748 delete _cmbGalCheckBox;
1749 delete _cmbBdsCheckBox;
1750 delete _cmbQzssCheckBox;
1751 delete _cmbSbasCheckBox;
1752 delete _cmbIrnssCheckBox;
1753 delete _cmbBsxFile;
1754 _uploadEphTable->deleteLater();
1755 delete _uploadSamplRtcmEphCorrSpinBox;
1756 _uploadTable->deleteLater();
1757 delete _uploadIntrComboBox;
1758 delete _uploadAntexFile;
1759 delete _uploadSamplRtcmEphSpinBox;
1760 delete _uploadSamplSp3ComboBox;
1761 delete _uploadSamplClkRnxSpinBox;
1762 delete _uploadSamplBiaSnxSpinBox;
1763 delete _reqcActionComboBox;
1764 delete _reqcObsFileChooser;
1765 delete _reqcNavFileChooser;
1766 delete _reqcOutObsLineEdit;
1767 delete _reqcOutNavLineEdit;
1768 delete _reqcOutLogLineEdit;
1769 delete _reqcPlotDirLineEdit;
1770 delete _reqcSkyPlotSignals;
1771 delete _reqcLogSummaryOnly;
1772 delete _reqcEditOptionButton;
1773 delete _sp3CompFileChooser;
1774 delete _sp3CompExclude;
1775 delete _sp3CompLogLineEdit;
1776 delete _sp3CompSummaryOnly;
1777 //delete _canvas;
1778}
1779
1780//
1781////////////////////////////////////////////////////////////////////////////
1782void bncWindow::populateMountPointsTable() {
1783
1784 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1785 _mountPointsTable->removeRow(iRow);
1786 }
1787
1788 bncSettings settings;
1789
1790 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1791 int iRow = 0;
1792 while (it.hasNext()) {
1793 QStringList hlp = it.next().split(" ");
1794 if (hlp.size() < 7) continue;
1795 _mountPointsTable->insertRow(iRow);
1796
1797 QUrl url(hlp[0]);
1798
1799 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1800 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1801 QString nmea(hlp[5]);
1802 if (hlp[6] == "S") {
1803 fullPath = hlp[0].replace(0,2,"");
1804 }
1805 QString ntripVersion = "2";
1806 if (hlp.size() >= 7) {
1807 ntripVersion = (hlp[6]);
1808 }
1809
1810 QTableWidgetItem* it;
1811 it = new QTableWidgetItem(url.userInfo());
1812 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1813 _mountPointsTable->setItem(iRow, 0, it);
1814
1815 it = new QTableWidgetItem(fullPath);
1816 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1817 _mountPointsTable->setItem(iRow, 1, it);
1818
1819 it = new QTableWidgetItem(format);
1820 _mountPointsTable->setItem(iRow, 2, it);
1821
1822 it = new QTableWidgetItem(country);
1823 _mountPointsTable->setItem(iRow, 3, it);
1824
1825 if (nmea == "yes") {
1826 it = new QTableWidgetItem(latitude);
1827 _mountPointsTable->setItem(iRow, 4, it);
1828 it = new QTableWidgetItem(longitude);
1829 _mountPointsTable->setItem(iRow, 5, it);
1830 } else {
1831 it = new QTableWidgetItem(latitude);
1832 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1833 _mountPointsTable->setItem(iRow, 4, it);
1834
1835 it = new QTableWidgetItem(longitude);
1836 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1837 _mountPointsTable->setItem(iRow, 5, it);
1838 }
1839
1840 it = new QTableWidgetItem(nmea);
1841 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1842 _mountPointsTable->setItem(iRow, 6, it);
1843
1844 it = new QTableWidgetItem(ntripVersion);
1845 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1846 _mountPointsTable->setItem(iRow, 7, it);
1847
1848 bncTableItem* bncIt = new bncTableItem();
1849 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1850 _mountPointsTable->setItem(iRow, 8, bncIt);
1851
1852 iRow++;
1853 }
1854
1855 _mountPointsTable->sortItems(1);
1856
1857 enableStartStop();
1858}
1859
1860// Retrieve Table
1861////////////////////////////////////////////////////////////////////////////
1862void bncWindow::slotAddMountPoints() {
1863
1864 bncSettings settings;
1865 QString proxyHost = settings.value("proxyHost").toString();
1866 int proxyPort = settings.value("proxyPort").toInt();
1867 if (proxyHost != _proxyHostLineEdit->text() ||
1868 proxyPort != _proxyPortLineEdit->text().toInt()) {
1869 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1870 "changed. Use the new ones?",
1871 QMessageBox::Yes, QMessageBox::No,
1872 QMessageBox::NoButton);
1873 if (iRet == QMessageBox::Yes) {
1874 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1875 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1876 }
1877 }
1878
1879 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1880 settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
1881 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1882
1883 QMessageBox msgBox;
1884 msgBox.setIcon(QMessageBox::Question);
1885 msgBox.setWindowTitle("Add Stream");
1886 msgBox.setText("Add stream(s) coming from:");
1887
1888 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1889 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1890 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1891 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1892 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1893
1894 msgBox.exec();
1895
1896 if (msgBox.clickedButton() == buttonNtrip) {
1897 bncTableDlg* dlg = new bncTableDlg(this);
1898 dlg->move(this->pos().x()+50, this->pos().y()+50);
1899 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1900 this, SLOT(slotNewMountPoints(QStringList*)));
1901 dlg->exec();
1902 delete dlg;
1903 } else if (msgBox.clickedButton() == buttonIP) {
1904 bncIpPort* ipp = new bncIpPort(this);
1905 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1906 this, SLOT(slotNewMountPoints(QStringList*)));
1907 ipp->exec();
1908 delete ipp;
1909 } else if (msgBox.clickedButton() == buttonUDP) {
1910 bncUdpPort* udp = new bncUdpPort(this);
1911 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1912 this, SLOT(slotNewMountPoints(QStringList*)));
1913 udp->exec();
1914 delete udp;
1915 } else if (msgBox.clickedButton() == buttonSerial) {
1916 bncSerialPort* sep = new bncSerialPort(this);
1917 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1918 this, SLOT(slotNewMountPoints(QStringList*)));
1919 sep->exec();
1920 delete sep;
1921 } else if (msgBox.clickedButton() == buttonCancel) {
1922 // Cancel
1923 }
1924
1925 enableStartStop();
1926}
1927
1928// Delete Selected Mount Points
1929////////////////////////////////////////////////////////////////////////////
1930void bncWindow::slotDeleteMountPoints() {
1931
1932 int nRows = _mountPointsTable->rowCount();
1933 std::vector <bool> flg(nRows);
1934 for (int iRow = 0; iRow < nRows; iRow++) {
1935 if (_mountPointsTable->item(iRow,1)->isSelected()) {
1936 flg[iRow] = true;
1937 }
1938 else {
1939 flg[iRow] = false;
1940 }
1941 }
1942 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1943 if (flg[iRow]) {
1944 _mountPointsTable->removeRow(iRow);
1945 }
1946 }
1947 _actDeleteMountPoints->setEnabled(false);
1948
1949 enableStartStop();
1950}
1951
1952// New Mount Points Selected
1953////////////////////////////////////////////////////////////////////////////
1954void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1955 int iRow = 0;
1956 QListIterator<QString> it(*mountPoints);
1957 while (it.hasNext()) {
1958 QStringList hlp = it.next().split(" ");
1959 QUrl url(hlp[0]);
1960 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1961 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1962 QString nmea(hlp[5]);
1963 if (hlp[6] == "S") {
1964 fullPath = hlp[0].replace(0,2,"");
1965 }
1966 QString ntripVersion = "2";
1967 if (hlp.size() >= 7) {
1968 ntripVersion = (hlp[6]);
1969 }
1970
1971 _mountPointsTable->insertRow(iRow);
1972
1973 QTableWidgetItem* it;
1974 it = new QTableWidgetItem(url.userInfo());
1975 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1976 _mountPointsTable->setItem(iRow, 0, it);
1977
1978 it = new QTableWidgetItem(fullPath);
1979 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1980 _mountPointsTable->setItem(iRow, 1, it);
1981
1982 it = new QTableWidgetItem(format);
1983 _mountPointsTable->setItem(iRow, 2, it);
1984
1985 it = new QTableWidgetItem(country);
1986 _mountPointsTable->setItem(iRow, 3, it);
1987
1988 if (nmea == "yes") {
1989 it = new QTableWidgetItem(latitude);
1990 _mountPointsTable->setItem(iRow, 4, it);
1991 it = new QTableWidgetItem(longitude);
1992 _mountPointsTable->setItem(iRow, 5, it);
1993 } else {
1994 it = new QTableWidgetItem(latitude);
1995 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1996 _mountPointsTable->setItem(iRow, 4, it);
1997 it = new QTableWidgetItem(longitude);
1998 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1999 _mountPointsTable->setItem(iRow, 5, it);
2000 }
2001
2002 it = new QTableWidgetItem(nmea);
2003 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
2004 _mountPointsTable->setItem(iRow, 6, it);
2005
2006 it = new QTableWidgetItem(ntripVersion);
2007 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
2008 _mountPointsTable->setItem(iRow, 7, it);
2009
2010 bncTableItem* bncIt = new bncTableItem();
2011 _mountPointsTable->setItem(iRow, 8, bncIt);
2012
2013 iRow++;
2014 }
2015 _mountPointsTable->hideColumn(0);
2016 _mountPointsTable->hideColumn(3);
2017 _mountPointsTable->sortItems(1);
2018 delete mountPoints;
2019
2020 enableStartStop();
2021}
2022
2023// Save Options (serialize)
2024////////////////////////////////////////////////////////////////////////////
2025void bncWindow::slotSaveOptions() {
2026 saveOptions();
2027 bncSettings settings;
2028 settings.sync();
2029}
2030
2031// Save Options (memory only)
2032////////////////////////////////////////////////////////////////////////////
2033void bncWindow::saveOptions() {
2034
2035 QStringList mountPoints;
2036 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2037
2038 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
2039 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2040 "@" + _mountPointsTable->item(iRow, 1)->text() );
2041
2042 mountPoints.append(url.toString() + " " +
2043 _mountPointsTable->item(iRow, 2)->text()
2044 + " " + _mountPointsTable->item(iRow, 3)->text()
2045 + " " + _mountPointsTable->item(iRow, 4)->text()
2046 + " " + _mountPointsTable->item(iRow, 5)->text()
2047 + " " + _mountPointsTable->item(iRow, 6)->text()
2048 + " " + _mountPointsTable->item(iRow, 7)->text());
2049 } else {
2050 mountPoints.append(
2051 "//" + _mountPointsTable->item(iRow, 1)->text()
2052 + " " + _mountPointsTable->item(iRow, 2)->text()
2053 + " " + _mountPointsTable->item(iRow, 3)->text()
2054 + " " + _mountPointsTable->item(iRow, 4)->text()
2055 + " " + _mountPointsTable->item(iRow, 5)->text()
2056 + " " + _mountPointsTable->item(iRow, 6)->text()
2057 + " " + _mountPointsTable->item(iRow, 7)->text());
2058 }
2059 }
2060
2061 QStringList cmbStreams;
2062 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
2063 QString hlp;
2064 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2065 if (_cmbTable->item(iRow, iCol)) {
2066 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
2067 }
2068 }
2069 if (!hlp.isEmpty()) {
2070 cmbStreams << hlp;
2071 }
2072 }
2073
2074 QStringList uploadMountpointsOut;
2075 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2076 QString hlp;
2077 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2078 if (_uploadTable->cellWidget(iRow, iCol) &&
2079 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
2080 if (iCol == 3) {
2081 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2082 hlp += ntripversion->currentText() + ",";
2083 }
2084 else if (iCol == 4 ) {
2085 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
2086 hlp += user->text() + ",";
2087 }
2088 else if (iCol == 5) {
2089 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
2090 hlp += passwd->text() + ",";
2091 }
2092 else if (iCol == 6) {
2093 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2094 hlp += system->currentText() + ",";
2095 }
2096 else if (iCol == 7) {
2097 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
2098 hlp += format->currentText() + ",";
2099 }
2100 else if (iCol == 8) {
2101 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
2102 QString state; state.setNum(com->checkState());
2103 hlp += state + ",";
2104 }
2105 }
2106 else if (_uploadTable->item(iRow, iCol)) {
2107 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
2108 }
2109 }
2110 if (!hlp.isEmpty()) {
2111 uploadMountpointsOut << hlp;
2112 }
2113 }
2114
2115 QStringList uploadEphMountpointsOut;
2116 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
2117 QString hlp;
2118 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2119 if (_uploadEphTable->cellWidget(iRow, iCol) &&
2120 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
2121 if (iCol == 3) {
2122 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
2123 hlp += ntripversion->currentText() + ",";
2124 }
2125 else if (iCol == 4 ) {
2126 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2127 hlp += user->text() + ",";
2128 }
2129 else if (iCol == 5) {
2130 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2131 hlp += passwd->text() + ",";
2132 }
2133 else if (iCol == 6) {
2134 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2135 hlp += system->text() + ",";
2136 }
2137 }
2138 else if (_uploadEphTable->item(iRow, iCol)) {
2139 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2140 }
2141 }
2142 if (!hlp.isEmpty()) {
2143 uploadEphMountpointsOut << hlp;
2144 }
2145 }
2146
2147 bncSettings settings;
2148
2149 settings.setValue("startTab", _aogroup->currentIndex());
2150 settings.setValue("statusTab", _loggroup->currentIndex());
2151 settings.setValue("mountPoints", mountPoints);
2152// Network
2153 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2154 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2155 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2156 settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
2157 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2158// General
2159 settings.setValue("logFile", _logFileLineEdit->text());
2160 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2161 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2162 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2163 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2164// RINEX Observations
2165 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2166 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2167 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2168 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2169 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2170 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2171 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2172 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2173 settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
2174// RINEX Ephemeris
2175 settings.setValue("ephPath", _ephPathLineEdit->text());
2176 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2177 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2178 settings.setValue("ephVersion", _ephVersComboBox->currentText());
2179 //settings.setValue("ephFilePerStation", _ephFilePerStation->checkState());
2180// Broadcast Corrections
2181 settings.setValue("corrPath", _corrPathLineEdit->text());
2182 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2183 settings.setValue("corrPort", _corrPortLineEdit->text());
2184// Feed Engine
2185 settings.setValue("outPort", _outPortLineEdit->text());
2186 settings.setValue("outWait", _outWaitSpinBox->value());
2187 settings.setValue("outSampl", _outSamplComboBox->currentText());
2188 settings.setValue("outFile", _outFileLineEdit->text());
2189 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2190// Serial Output
2191 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2192 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2193 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2194 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2195 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2196 settings.setValue("serialParity", _serialParityComboBox->currentText());
2197 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2198 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2199 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2200 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2201 settings.setValue("serialNMEASampling", _serialNMEASamplingSpinBox->value());
2202// Outages
2203 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2204 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2205 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2206 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2207// Miscellaneous
2208 settings.setValue("miscMount", _miscMountLineEdit->text());
2209 settings.setValue("miscPort", _miscPortLineEdit->text());
2210 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2211 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2212// Reqc
2213 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2214 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2215 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2216 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2217 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2218 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2219 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2220 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2221 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2222// SP3 Comparison
2223 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2224 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2225 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2226 settings.setValue("sp3CompSummaryOnly",_sp3CompSummaryOnly->checkState());
2227// Combine Corrections
2228 if (!cmbStreams.isEmpty()) {
2229 settings.setValue("cmbStreams", cmbStreams);
2230 }
2231 else {
2232 settings.setValue("cmbStreams", "");
2233 }
2234 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2235 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2236 settings.setValue("cmbMaxdisplacement", _cmbMaxdisplacementLineEdit->text());
2237 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2238 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2239 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2240 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2241 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2242 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2243 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2244 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2245 settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
2246
2247// Upload Corrections
2248 if (!uploadMountpointsOut.isEmpty()) {
2249 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2250 }
2251 else {
2252 settings.setValue("uploadMountpointsOut", "");
2253 }
2254 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2255 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2256 settings.setValue("uploadSamplSp3", _uploadSamplSp3ComboBox->currentText());
2257 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2258 settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
2259 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2260// Upload Ephemeris
2261 if (!uploadEphMountpointsOut.isEmpty()) {
2262 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2263 }
2264 else {
2265 settings.setValue("uploadEphMountpointsOut", "");
2266 }
2267 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2268
2269 if (_caster) {
2270 _caster->readMountPoints();
2271 }
2272
2273 _pppWidgets.saveOptions();
2274}
2275
2276// All get slots terminated
2277////////////////////////////////////////////////////////////////////////////
2278void bncWindow::slotGetThreadsFinished() {
2279 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2280 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2281 delete _casterEph; _casterEph = 0;
2282 _runningRealTime = false;
2283 enableStartStop();
2284}
2285
2286// Start It!
2287////////////////////////////////////////////////////////////////////////////
2288void bncWindow::slotStart() {
2289 saveOptions();
2290 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2291 _runningPPP = true;
2292 enableStartStop();
2293 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2294 BNC_CORE->startPPP();
2295 _bncFigurePPP->reset();
2296 }
2297 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2298 if (_reqcActionComboBox->currentText() == "Analyze") {
2299 _runningQC = true;
2300 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2301 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2302 reqcAnalyze->start();
2303 }
2304 else {
2305 _runningEdit = true;
2306 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2307 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2308 reqcEdit->start();
2309 }
2310 enableStartStop();
2311 }
2312 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2313 _runningSp3Comp = true;
2314 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2315 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2316 sp3Comp->start();
2317 enableStartStop();
2318 }
2319 else {
2320 startRealTime();
2321 BNC_CORE->startPPP();
2322 }
2323}
2324
2325// Start Real-Time (Retrieve Data etc.)
2326////////////////////////////////////////////////////////////////////////////
2327void bncWindow::startRealTime() {
2328
2329 _runningRealTime = true;
2330
2331 _bncFigurePPP->reset();
2332
2333 _actDeleteMountPoints->setEnabled(false);
2334
2335 enableStartStop();
2336
2337 _caster = new bncCaster();
2338
2339 BNC_CORE->setCaster(_caster);
2340 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2341 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2342 BNC_CORE->initCombination();
2343
2344 connect(_caster, SIGNAL(getThreadsFinished()), this, SLOT(slotGetThreadsFinished()));
2345
2346 connect(_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)), this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2347
2348 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2349
2350 bncSettings settings;
2351
2352 // Active panels
2353 // -------------
2354 if (!_rnxPathLineEdit->text().isEmpty())
2355 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2356 if (!_ephPathLineEdit->text().isEmpty())
2357 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2358 if (!_corrPathLineEdit->text().isEmpty())
2359 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2360 if (!_outPortLineEdit->text().isEmpty())
2361 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2362 if (!_serialMountPointLineEdit->text().isEmpty())
2363 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2364 if (!_adviseObsRateComboBox->currentText().isEmpty())
2365 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2366 if (!_miscMountLineEdit->text().isEmpty())
2367 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2368 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2369 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2370 if (_cmbTable->rowCount() > 0)
2371 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2372 if (_uploadTable->rowCount() > 0)
2373 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2374 if (_uploadEphTable->rowCount() > 0)
2375 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2376
2377 QDir rnxdir(settings.value("rnxPath").toString());
2378 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2379
2380 QString rnx_file = settings.value("rnxScript").toString();
2381 if ( !rnx_file.isEmpty() ) {
2382 QFile rnxfile(settings.value("rnxScript").toString());
2383 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2384 }
2385
2386 QDir ephdir(settings.value("ephPath").toString());
2387 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2388
2389 QDir corrdir(settings.value("corrPath").toString());
2390 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2391
2392 QString advise_file = settings.value("adviseScript").toString();
2393 if ( !advise_file.isEmpty() ) {
2394 QFile advisefile(settings.value("adviseScript").toString());
2395 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2396 }
2397
2398 _caster->readMountPoints();
2399
2400 _casterEph = new bncEphUploadCaster();
2401}
2402
2403// Retrieve Data
2404////////////////////////////////////////////////////////////////////////////
2405void bncWindow::slotStop() {
2406 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2407 QMessageBox::Yes, QMessageBox::No,
2408 QMessageBox::NoButton);
2409 if (iRet == QMessageBox::Yes) {
2410 BNC_CORE->stopPPP();
2411 BNC_CORE->stopCombination();
2412 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2413 delete _casterEph; _casterEph = 0;
2414 _runningRealTime = false;
2415 _runningPPP = false;
2416 enableStartStop();
2417 }
2418}
2419
2420// Close Application gracefully
2421////////////////////////////////////////////////////////////////////////////
2422void bncWindow::closeEvent(QCloseEvent* event) {
2423
2424 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2425 QMessageBox::Yes, QMessageBox::No,
2426 QMessageBox::Cancel);
2427
2428 if (iRet == QMessageBox::Cancel) {
2429 event->ignore();
2430 return;
2431 }
2432 else if (iRet == QMessageBox::Yes) {
2433 slotSaveOptions();
2434 }
2435
2436 BNC_CORE->stopPPP();
2437
2438 QMainWindow::closeEvent(event);
2439}
2440
2441// User changed the selection of mountPoints
2442////////////////////////////////////////////////////////////////////////////
2443void bncWindow::slotSelectionChanged() {
2444 if (_mountPointsTable->selectedItems().isEmpty()) {
2445 _actDeleteMountPoints->setEnabled(false);
2446 }
2447 else {
2448 _actDeleteMountPoints->setEnabled(true);
2449 }
2450}
2451
2452// Display Program Messages
2453////////////////////////////////////////////////////////////////////////////
2454void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2455 if (showOnScreen ) {
2456 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2457 }
2458}
2459
2460// About Message
2461////////////////////////////////////////////////////////////////////////////
2462void bncWindow::slotAbout() {
2463 new bncAboutDlg(0);
2464}
2465
2466//Flowchart
2467////////////////////////////////////////////////////////////////////////////
2468void bncWindow::slotFlowchart() {
2469 new bncFlowchartDlg(0);
2470}
2471
2472// Help Window
2473////////////////////////////////////////////////////////////////////////////
2474void bncWindow::slotHelp() {
2475 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2476 new bncHlpDlg(0, url);
2477}
2478
2479// Select Fonts
2480////////////////////////////////////////////////////////////////////////////
2481void bncWindow::slotFontSel() {
2482 bool ok;
2483 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2484 if (ok) {
2485 bncSettings settings;
2486 settings.setValue("font", newFont.toString());
2487 QApplication::setFont(newFont);
2488 int ww = QFontMetrics(newFont).width('w');
2489 setMinimumSize(60*ww, 80*ww);
2490 resize(60*ww, 80*ww);
2491 }
2492}
2493
2494// Whats This Help
2495void bncWindow::slotWhatsThis() {
2496 QWhatsThis::enterWhatsThisMode();
2497}
2498
2499//
2500////////////////////////////////////////////////////////////////////////////
2501void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2502 _threads = threads;
2503
2504 _bncFigure->updateMountPoints();
2505 _bncFigureLate->updateMountPoints();
2506
2507 populateMountPointsTable();
2508 bncSettings settings;
2509 _outSamplComboBox->findText(settings.value("outSampl").toString());
2510 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2511 QListIterator<bncGetThread*> iTh(threads);
2512 while (iTh.hasNext()) {
2513 bncGetThread* thread = iTh.next();
2514 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2515 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2516 "@" + _mountPointsTable->item(iRow, 1)->text() );
2517 if (url == thread->mountPoint() &&
2518 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2519 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2520 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2521 disconnect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
2522 connect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
2523 disconnect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2524 connect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2525 break;
2526 }
2527 }
2528 }
2529}
2530
2531//
2532////////////////////////////////////////////////////////////////////////////
2533void bncWindow::CreateMenu() {
2534 // Create Menus
2535 // ------------
2536 _menuFile = menuBar()->addMenu(tr("&File"));
2537 _menuFile->addAction(_actFontSel);
2538 _menuFile->addSeparator();
2539 _menuFile->addAction(_actSaveOpt);
2540 _menuFile->addSeparator();
2541 _menuFile->addAction(_actQuit);
2542
2543 _menuHlp = menuBar()->addMenu(tr("&Help"));
2544 _menuHlp->addAction(_actHelp);
2545 _menuHlp->addAction(_actFlowchart);
2546 _menuHlp->addAction(_actAbout);
2547}
2548
2549// Toolbar
2550////////////////////////////////////////////////////////////////////////////
2551void bncWindow::AddToolbar() {
2552 QToolBar* toolBar = new QToolBar;
2553 addToolBar(Qt::BottomToolBarArea, toolBar);
2554 toolBar->setMovable(false);
2555 toolBar->addAction(_actAddMountPoints);
2556 toolBar->addAction(_actDeleteMountPoints);
2557 toolBar->addAction(_actMapMountPoints);
2558 toolBar->addAction(_actStart);
2559 toolBar->addAction(_actStop);
2560 toolBar->addWidget(new QLabel(" "));
2561 toolBar->addAction(_actwhatsthis);
2562}
2563
2564// About
2565////////////////////////////////////////////////////////////////////////////
2566bncAboutDlg::bncAboutDlg(QWidget* parent) :
2567 QDialog(parent) {
2568
2569 QTextBrowser* tb = new QTextBrowser;
2570 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2571 tb->setSource(url);
2572 tb->setReadOnly(true);
2573
2574 int ww = QFontMetrics(font()).width('w');
2575 QPushButton* _closeButton = new QPushButton("Close");
2576 _closeButton->setMaximumWidth(10*ww);
2577 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2578
2579 QGridLayout* dlgLayout = new QGridLayout();
2580 QLabel* img = new QLabel();
2581 img->setPixmap(QPixmap(":ntrip-logo.png"));
2582 dlgLayout->addWidget(img, 0,0);
2583 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2584 dlgLayout->addWidget(tb,1,0,1,2);
2585 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2586
2587 setLayout(dlgLayout);
2588 resize(60*ww, 60*ww);
2589 setWindowTitle("About BNC");
2590 show();
2591}
2592
2593//
2594////////////////////////////////////////////////////////////////////////////
2595bncAboutDlg::~bncAboutDlg() {
2596
2597};
2598
2599// Flowchart
2600////////////////////////////////////////////////////////////////////////////
2601bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2602 QDialog(parent) {
2603
2604 int ww = QFontMetrics(font()).width('w');
2605 QPushButton* _closeButton = new QPushButton("Close");
2606 _closeButton->setMaximumWidth(10*ww);
2607 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2608
2609 QGridLayout* dlgLayout = new QGridLayout();
2610 QLabel* img = new QLabel();
2611 img->setPixmap(QPixmap(":bncflowchart.png"));
2612 dlgLayout->addWidget(img, 0,0);
2613 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2614
2615 setLayout(dlgLayout);
2616 setWindowTitle("Flow Chart");
2617 show();
2618}
2619
2620//
2621////////////////////////////////////////////////////////////////////////////
2622bncFlowchartDlg::~bncFlowchartDlg() {
2623};
2624
2625// Enable/Disable Widget (and change its color)
2626////////////////////////////////////////////////////////////////////////////
2627void bncWindow::enableWidget(bool enable, QWidget* widget) {
2628
2629 const static QPalette paletteWhite(QColor(255, 255, 255));
2630 const static QPalette paletteGray(QColor(230, 230, 230));
2631
2632 widget->setEnabled(enable);
2633 if (enable) {
2634 widget->setPalette(paletteWhite);
2635 }
2636 else {
2637 widget->setPalette(paletteGray);
2638 }
2639}
2640
2641// Bnc Text
2642////////////////////////////////////////////////////////////////////////////
2643void bncWindow::slotBncTextChanged(){
2644
2645 const static QPalette paletteWhite(QColor(255, 255, 255));
2646 const static QPalette paletteGray(QColor(230, 230, 230));
2647
2648 bool enable = true;
2649
2650 // Proxy
2651 //------
2652 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2653 enable = !_proxyHostLineEdit->text().isEmpty();
2654 enableWidget(enable, _proxyPortLineEdit);
2655 }
2656
2657 // RINEX Observations
2658 // ------------------
2659 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2660 enable = !_rnxPathLineEdit->text().isEmpty();
2661 enableWidget(enable, _rnxIntrComboBox);
2662 enableWidget(enable, _rnxSamplComboBox);
2663 enableWidget(enable, _rnxSkelExtComboBox);
2664 enableWidget(enable, _rnxSkelPathLineEdit);
2665 enableWidget(enable, _rnxFileCheckBox);
2666 enableWidget(enable, _rnxScrpLineEdit);
2667 enableWidget(enable, _rnxV2Priority);
2668 enableWidget(enable, _rnxVersComboBox);
2669
2670 bool enable1 = true;
2671 enable1 = _rnxVersComboBox->currentText() == "2";
2672 if (enable && enable1) {
2673 enableWidget(true, _rnxV2Priority);
2674 }
2675 if (enable && !enable1) {
2676 enableWidget(false, _rnxV2Priority);
2677 }
2678 }
2679
2680 // RINEX Observations, Signal Priority
2681 // -----------------------------------
2682 if (sender() == 0 || sender() == _rnxVersComboBox) {
2683 if (!_rnxPathLineEdit->text().isEmpty()) {
2684 enableWidget(enable, _rnxIntrComboBox);
2685 enable = _rnxVersComboBox->currentText() == "2";
2686 enableWidget(enable, _rnxV2Priority);
2687 }
2688 }
2689
2690 // RINEX Ephemeris
2691 // ---------------
2692 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2693 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2694 enableWidget(enable, _ephIntrComboBox);
2695 enableWidget(enable, _ephVersComboBox);
2696 //enableWidget(enable, _ephVersComboBox);
2697 //enableWidget(enable, _ephFilePerStation);
2698 }
2699
2700 // Broadcast Corrections
2701 // ---------------------
2702 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2703 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2704 enableWidget(enable, _corrIntrComboBox);
2705 }
2706
2707 // Feed Engine
2708 // -----------
2709 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2710 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2711 enableWidget(enable, _outWaitSpinBox);
2712 enableWidget(enable, _outSamplComboBox);
2713 }
2714
2715 // Serial Output
2716 // -------------
2717 if (sender() == 0 ||
2718 sender() == _serialMountPointLineEdit ||
2719 sender() == _serialAutoNMEAComboBox) {
2720 enable = !_serialMountPointLineEdit->text().isEmpty();
2721 enableWidget(enable, _serialPortNameLineEdit);
2722 enableWidget(enable, _serialBaudRateComboBox);
2723 enableWidget(enable, _serialParityComboBox);
2724 enableWidget(enable, _serialDataBitsComboBox);
2725 enableWidget(enable, _serialStopBitsComboBox);
2726 enableWidget(enable, _serialFlowControlComboBox);
2727 enableWidget(enable, _serialAutoNMEAComboBox);
2728 if (enable && _serialAutoNMEAComboBox->currentText() == "Auto") {
2729 enableWidget(true, _serialFileNMEALineEdit);
2730 enableWidget(false, _serialHeightNMEALineEdit);
2731 enableWidget(true, _serialNMEASamplingSpinBox);
2732 }
2733 else if (enable && _serialAutoNMEAComboBox->currentText().contains("Manual")) {
2734 enableWidget(false, _serialFileNMEALineEdit);
2735 enableWidget(true, _serialHeightNMEALineEdit);
2736 enableWidget(true, _serialNMEASamplingSpinBox);
2737 }
2738 else {
2739 enableWidget(false, _serialFileNMEALineEdit);
2740 enableWidget(false, _serialHeightNMEALineEdit);
2741 enableWidget(false, _serialNMEASamplingSpinBox);
2742 }
2743 }
2744
2745 // Outages
2746 // -------
2747 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2748 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2749 enableWidget(enable, _adviseFailSpinBox);
2750 enableWidget(enable, _adviseRecoSpinBox);
2751 enableWidget(enable, _adviseScriptLineEdit);
2752 }
2753
2754 // Miscellaneous
2755 // -------------
2756 if (sender() == 0 || sender() == _miscMountLineEdit) {
2757 enable = !_miscMountLineEdit->text().isEmpty();
2758 enableWidget(enable, _miscIntrComboBox);
2759 enableWidget(enable, _miscScanRTCMCheckBox);
2760 enableWidget(enable, _miscPortLineEdit);
2761 }
2762
2763 // Combine Corrections
2764 // -------------------
2765 if (sender() == 0 || sender() == _cmbTable) {
2766 int iRow = _cmbTable->rowCount();
2767 if (iRow > 0) {
2768 enableWidget(true, _cmbMethodComboBox);
2769 enableWidget(true, _cmbMaxresLineEdit);
2770 enableWidget(true, _cmbMaxdisplacementLineEdit);
2771 enableWidget(true, _cmbSamplSpinBox);
2772 enableWidget(true, _cmbGpsCheckBox);
2773 enableWidget(true, _cmbGloCheckBox);
2774 enableWidget(true, _cmbGalCheckBox);
2775 enableWidget(true, _cmbBdsCheckBox);
2776 enableWidget(true, _cmbQzssCheckBox);
2777 enableWidget(true, _cmbSbasCheckBox);
2778 enableWidget(true, _cmbIrnssCheckBox);
2779 enableWidget(true, _cmbBsxFile);
2780 }
2781 else {
2782 enableWidget(false, _cmbMethodComboBox);
2783 enableWidget(false, _cmbMaxresLineEdit);
2784 enableWidget(false, _cmbMaxdisplacementLineEdit);
2785 enableWidget(false, _cmbSamplSpinBox);
2786 enableWidget(false, _cmbGpsCheckBox);
2787 enableWidget(false, _cmbGloCheckBox);
2788 enableWidget(false, _cmbGalCheckBox);
2789 enableWidget(false, _cmbBdsCheckBox);
2790 enableWidget(false, _cmbQzssCheckBox);
2791 enableWidget(false, _cmbSbasCheckBox);
2792 enableWidget(false, _cmbIrnssCheckBox);
2793 enableWidget(false, _cmbBsxFile);
2794 }
2795 }
2796
2797 // Upload(clk)
2798 // -----------
2799 int iRow = _uploadTable->rowCount();
2800 if (iRow > 0) {
2801 enableWidget(true, _uploadIntrComboBox);
2802 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2803 enableWidget(true, _uploadSamplClkRnxSpinBox);
2804 enableWidget(true, _uploadSamplBiaSnxSpinBox);
2805 enableWidget(true, _uploadSamplSp3ComboBox);
2806 enableWidget(true, _uploadAntexFile);
2807 }
2808 else {
2809 enableWidget(false, _uploadIntrComboBox);
2810 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2811 enableWidget(false, _uploadSamplClkRnxSpinBox);
2812 enableWidget(false, _uploadSamplBiaSnxSpinBox);
2813 enableWidget(false, _uploadSamplSp3ComboBox);
2814 enableWidget(false, _uploadAntexFile);
2815 }
2816
2817 // Upload(eph)
2818 // -----------
2819 iRow = _uploadEphTable->rowCount();
2820 if (iRow > 0) {
2821 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2822 }
2823 else {
2824 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2825 }
2826
2827 // QC
2828 // --
2829 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2830 enable = !_reqcActionComboBox->currentText().isEmpty();
2831 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2832// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2833 enableWidget(enable, _reqcObsFileChooser);
2834 enableWidget(enable, _reqcNavFileChooser);
2835 enableWidget(enable, _reqcOutLogLineEdit);
2836 enableWidget(enable && enable10, _reqcEditOptionButton);
2837 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2838 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2839 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2840 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2841// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2842 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2843 }
2844
2845 // SP3 File Comparison
2846 // -------------------
2847 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2848 enable = !_sp3CompFileChooser->fileName().isEmpty();
2849 enableWidget(enable, _sp3CompLogLineEdit);
2850 enableWidget(enable, _sp3CompExclude);
2851 enableWidget(enable, _sp3CompSummaryOnly);
2852 }
2853
2854 enableStartStop();
2855}
2856
2857//
2858////////////////////////////////////////////////////////////////////////////
2859void bncWindow::slotAddCmbRow() {
2860 int iRow = _cmbTable->rowCount();
2861 _cmbTable->insertRow(iRow);
2862 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2863 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2864 }
2865}
2866
2867//
2868////////////////////////////////////////////////////////////////////////////
2869void bncWindow::slotDelCmbRow() {
2870
2871 const static QPalette paletteWhite(QColor(255, 255, 255));
2872 const static QPalette paletteGray(QColor(230, 230, 230));
2873
2874 int nRows = _cmbTable->rowCount();
2875 std::vector <bool> flg(nRows);
2876 for (int iRow = 0; iRow < nRows; iRow++) {
2877 if (_cmbTable->item(iRow,1)->isSelected()) {
2878 flg[iRow] = true;
2879 }
2880 else {
2881 flg[iRow] = false;
2882 }
2883 }
2884 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2885 if (flg[iRow]) {
2886 _cmbTable->removeRow(iRow);
2887 }
2888 }
2889 nRows = _cmbTable->rowCount();
2890 if (nRows < 1) {
2891 enableWidget(false, _cmbMethodComboBox);
2892 enableWidget(false, _cmbMaxresLineEdit);
2893 enableWidget(false, _cmbMaxdisplacementLineEdit);
2894 enableWidget(false, _cmbSamplSpinBox);
2895 }
2896}
2897
2898//
2899////////////////////////////////////////////////////////////////////////////
2900void bncWindow::populateCmbTable() {
2901
2902 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2903 _cmbTable->removeRow(iRow);
2904 }
2905
2906 bncSettings settings;
2907
2908 int iRow = -1;
2909 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2910 while (it.hasNext()) {
2911 QStringList hlp = it.next().split(" ");
2912 if (hlp.size() > 2) {
2913 ++iRow;
2914 _cmbTable->insertRow(iRow);
2915 }
2916 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2917 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2918 }
2919 }
2920}
2921
2922//
2923////////////////////////////////////////////////////////////////////////////
2924void bncWindow::slotAddUploadRow() {
2925 int iRow = _uploadTable->rowCount();
2926 _uploadTable->insertRow(iRow);
2927 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2928 if (iCol == 3) {
2929 QComboBox* ntripversion = new QComboBox();
2930 ntripversion->setEditable(false);
2931 ntripversion->addItems(QString("1,2,2s").split(","));
2932 ntripversion->setFrame(false);
2933 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2934
2935 }
2936 else if (iCol == 4) {
2937 QLineEdit* user = new QLineEdit();
2938 user->setFrame(false);
2939 _uploadTable->setCellWidget(iRow, iCol, user);
2940 }
2941 else if (iCol == 5) {
2942 QLineEdit* passwd = new QLineEdit();
2943 passwd->setFrame(false);
2944 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2945 _uploadTable->setCellWidget(iRow, iCol, passwd);
2946 }
2947 else if (iCol == 6) {
2948 QComboBox* system = new QComboBox();
2949 system->setEditable(false);
2950 system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2951 system->setFrame(false);
2952 _uploadTable->setCellWidget(iRow, iCol, system);
2953 }
2954 else if (iCol == 7) {
2955 QComboBox* format = new QComboBox();
2956 format->setEditable(false);
2957 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2958 format->setFrame(false);
2959 _uploadTable->setCellWidget(iRow, iCol, format);
2960 }
2961 else if (iCol == 8) {
2962 QCheckBox* com = new QCheckBox();
2963 _uploadTable->setCellWidget(iRow, iCol, com);
2964 }
2965 else if (iCol == 15) {
2966 bncTableItem* bncIt = new bncTableItem();
2967 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2968 _uploadTable->setItem(iRow, iCol, bncIt);
2969 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2970 }
2971 else {
2972 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2973 }
2974 }
2975}
2976
2977//
2978////////////////////////////////////////////////////////////////////////////
2979void bncWindow::slotDelUploadRow() {
2980 BNC_CORE->_uploadTableItems.clear();
2981 int nRows = _uploadTable->rowCount();
2982 std::vector <bool> flg(nRows);
2983 for (int iRow = 0; iRow < nRows; iRow++) {
2984 if (_uploadTable->item(iRow,1)->isSelected()) {
2985 flg[iRow] = true;
2986 }
2987 else {
2988 flg[iRow] = false;
2989 }
2990 }
2991 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2992 if (flg[iRow]) {
2993 _uploadTable->removeRow(iRow);
2994 }
2995 }
2996 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2997 BNC_CORE->_uploadTableItems[iRow] =
2998 (bncTableItem*) _uploadTable->item(iRow, 14);
2999 }
3000 nRows = _uploadTable->rowCount();
3001 if (nRows < 1) {
3002 enableWidget(false, _uploadIntrComboBox);
3003 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
3004 enableWidget(false, _uploadSamplSp3ComboBox);
3005 enableWidget(false, _uploadSamplClkRnxSpinBox);
3006 enableWidget(false, _uploadAntexFile);
3007 }
3008}
3009
3010//
3011////////////////////////////////////////////////////////////////////////////
3012void bncWindow::populateUploadTable() {
3013 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
3014 _uploadTable->removeRow(iRow);
3015 }
3016
3017 bncSettings settings;
3018
3019 int iRow = -1;
3020 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
3021
3022 while (it.hasNext()) {
3023 QStringList hlp = it.next().split(",");
3024 if (hlp.size() > 6) {
3025 ++iRow;
3026 _uploadTable->insertRow(iRow);
3027 }
3028 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3029 if (iCol == 3) {
3030 QComboBox* ntripversion = new QComboBox();
3031 ntripversion->setEditable(false);
3032 ntripversion->addItems(QString("1,2,2s").split(","));
3033 ntripversion->setFrame(false);
3034 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3035 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
3036 }
3037 else if (iCol == 4) {
3038 QLineEdit* user = new QLineEdit();
3039 user->setFrame(false);
3040 user->setText(hlp[iCol]);
3041 _uploadTable->setCellWidget(iRow, iCol, user);
3042 }
3043 else if (iCol == 5) {
3044 QLineEdit* passwd = new QLineEdit();
3045 passwd->setFrame(false);
3046 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3047 passwd->setText(hlp[iCol]);
3048 _uploadTable->setCellWidget(iRow, iCol, passwd);
3049 }
3050 else if (iCol == 6) {
3051 QComboBox* system = new QComboBox();
3052 system->setEditable(false);
3053 system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
3054 system->setFrame(false);
3055 system->setCurrentIndex(system->findText(hlp[iCol]));
3056 _uploadTable->setCellWidget(iRow, iCol, system);
3057 }
3058 else if (iCol == 7) {
3059 QComboBox* format = new QComboBox();
3060 format->setEditable(false);
3061 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
3062 format->setFrame(false);
3063 format->setCurrentIndex(format->findText(hlp[iCol]));
3064 _uploadTable->setCellWidget(iRow, iCol, format);
3065 }
3066 else if (iCol == 8) {
3067 QCheckBox* com = new QCheckBox();
3068 if (hlp[iCol].toInt() == Qt::Checked) {
3069 com->setCheckState(Qt::Checked);
3070 }
3071 _uploadTable->setCellWidget(iRow, iCol, com);
3072 }
3073 else if (iCol == 15) {
3074 bncTableItem* bncIt = new bncTableItem();
3075 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3076 _uploadTable->setItem(iRow, iCol, bncIt);
3077 BNC_CORE->_uploadTableItems[iRow] = bncIt;
3078 }
3079 else {
3080 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3081 }
3082 }
3083 }
3084}
3085
3086//
3087////////////////////////////////////////////////////////////////////////////
3088void bncWindow::slotSetUploadTrafo() {
3089 bncCustomTrafo* dlg = new bncCustomTrafo(this);
3090 dlg->exec();
3091 delete dlg;
3092}
3093
3094//
3095////////////////////////////////////////////////////////////////////////////
3096void bncWindow::slotAddUploadEphRow() {
3097 int iRow = _uploadEphTable->rowCount();
3098 _uploadEphTable->insertRow(iRow);
3099 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
3100 if (iCol == 3) {
3101 QComboBox* ntripversion = new QComboBox();
3102 ntripversion->setEditable(false);
3103 ntripversion->addItems(QString("1,2,2s").split(","));
3104 ntripversion->setFrame(false);
3105 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3106
3107 }
3108 else if (iCol == 4) {
3109 QLineEdit* user = new QLineEdit();
3110 user->setFrame(false);
3111 _uploadEphTable->setCellWidget(iRow, iCol, user);
3112 }
3113 else if (iCol == 5) {
3114 QLineEdit* passwd = new QLineEdit();
3115 passwd->setFrame(false);
3116 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3117 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3118 }
3119 else if (iCol == 6) {
3120 QLineEdit* system = new QLineEdit("GREC");
3121 system->setFrame(false);
3122 _uploadEphTable->setCellWidget(iRow, iCol, system);
3123 }
3124 else if (iCol == 7) {
3125 bncTableItem* bncIt = new bncTableItem();
3126 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3127 _uploadEphTable->setItem(iRow, iCol, bncIt);
3128 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3129 }
3130 else {
3131 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
3132 }
3133 }
3134}
3135
3136//
3137////////////////////////////////////////////////////////////////////////////
3138void bncWindow::slotDelUploadEphRow() {
3139 BNC_CORE->_uploadTableItems.clear();
3140 int nRows = _uploadEphTable->rowCount();
3141 std::vector <bool> flg(nRows);
3142 for (int iRow = 0; iRow < nRows; iRow++) {
3143 if (_uploadEphTable->item(iRow,1)->isSelected()) {
3144 flg[iRow] = true;
3145 }
3146 else {
3147 flg[iRow] = false;
3148 }
3149 }
3150 for (int iRow = nRows-1; iRow >= 0; iRow--) {
3151 if (flg[iRow]) {
3152 _uploadEphTable->removeRow(iRow);
3153 }
3154 }
3155 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
3156 BNC_CORE->_uploadTableItems[iRow] =
3157 (bncTableItem*) _uploadEphTable->item(iRow, 7);
3158 }
3159 nRows = _uploadEphTable->rowCount();
3160 if (nRows < 1) {
3161 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3162 }
3163}
3164
3165//
3166////////////////////////////////////////////////////////////////////////////
3167void bncWindow::populateUploadEphTable() {
3168 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3169 _uploadEphTable->removeRow(iRow);
3170 }
3171
3172 bncSettings settings;
3173
3174 int iRow = -1;
3175 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3176 while (it.hasNext()) {
3177 QStringList hlp = it.next().split(",");
3178 if (hlp.size() > 6) {
3179 ++iRow;
3180 _uploadEphTable->insertRow(iRow);
3181 }
3182 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3183 if (iCol == 3) {
3184 QComboBox* ntripversion = new QComboBox();
3185 ntripversion->setEditable(false);
3186 ntripversion->addItems(QString("1,2,2s").split(","));
3187 ntripversion->setFrame(false);
3188 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3189 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3190 }
3191 else if (iCol == 4) {
3192 QLineEdit* user = new QLineEdit();
3193 user->setFrame(false);
3194 user->setText(hlp[iCol]);
3195 _uploadEphTable->setCellWidget(iRow, iCol, user);
3196 }
3197 else if (iCol == 5) {
3198 QLineEdit* passwd = new QLineEdit();
3199 passwd->setFrame(false);
3200 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3201 passwd->setText(hlp[iCol]);
3202 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3203 }
3204 else if (iCol == 6) {
3205 QLineEdit* system = new QLineEdit();
3206 system->setFrame(false);
3207 system->setText(hlp[iCol]);
3208 _uploadEphTable->setCellWidget(iRow, iCol, system);
3209 }
3210 else if (iCol == 7) {
3211 bncTableItem* bncIt = new bncTableItem();
3212 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3213 _uploadEphTable->setItem(iRow, iCol, bncIt);
3214 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3215 }
3216 else {
3217 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3218 }
3219 }
3220 }
3221}
3222
3223
3224// Progress Bar Change
3225////////////////////////////////////////////////////////////////////////////
3226void bncWindow::slotPostProcessingProgress(int nEpo) {
3227 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3228}
3229
3230// Post-Processing Reqc Finished
3231////////////////////////////////////////////////////////////////////////////
3232void bncWindow::slotPostProcessingFinished() {
3233 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3234 _runningPPP = false;
3235 _runningEdit = false;
3236 _runningQC = false;
3237 _runningSp3Comp = false;
3238 _actStart->setText(tr("Sta&rt"));
3239 enableStartStop();
3240}
3241
3242// Edit teqc-like editing options
3243////////////////////////////////////////////////////////////////////////////
3244void bncWindow::slotReqcEditOption() {
3245 saveOptions();
3246 reqcDlg* dlg = new reqcDlg(this);
3247 dlg->move(this->pos().x()+50, this->pos().y()+50);
3248 dlg->exec();
3249 delete dlg;
3250}
3251
3252// Enable/Disable Start and Stop Buttons
3253////////////////////////////////////////////////////////////////////////////
3254void bncWindow::enableStartStop() {
3255
3256 if ( running() ) {
3257 _actStart->setEnabled(false);
3258 if (_runningRealTime || _runningPPP) {
3259 _actStop->setEnabled(true);
3260 }
3261 }
3262 else {
3263 _actStart->setEnabled(true);
3264 _actStop->setEnabled(false);
3265 }
3266}
3267
3268// Show Map
3269////////////////////////////////////////////////////////////////////////////
3270void bncWindow::slotMapMountPoints() {
3271 saveOptions();
3272 t_bncMap* bncMap = new t_bncMap(this);
3273 bncMap->setMinimumSize(800, 600);
3274 bncMap->setWindowTitle("Selected Mountpoints");
3275
3276 bncSettings settings;
3277 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3278 while (it.hasNext()) {
3279 QStringList hlp = it.next().split(" ");
3280 if (hlp.size() < 5) continue;
3281 QUrl url(hlp[0]);
3282 double latDeg = hlp[3].toDouble();
3283 double lonDeg = hlp[4].toDouble();
3284 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3285 }
3286
3287 bncMap->show();
3288}
3289
3290// Show Map
3291////////////////////////////////////////////////////////////////////////////
3292void bncWindow::slotMapPPP() {
3293#ifdef QT_WEBENGINE
3294 saveOptions();
3295 enableWidget(false, _pppWidgets._mapWinButton);
3296 enableWidget(false, _pppWidgets._mapWinDotSize);
3297 enableWidget(false, _pppWidgets._mapWinDotColor);
3298
3299 if (!_mapWin) {
3300 _mapWin = new bncMapWin(this);
3301 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3302 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3303 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3304 }
3305 _mapWin->show();
3306#else
3307 QMessageBox::information(this, "Information",
3308 "Qt Library compiled without QT_WEBENGINE");
3309#endif
3310}
3311
3312// Show Map
3313////////////////////////////////////////////////////////////////////////////
3314void bncWindow::slotMapPPPClosed() {
3315#ifdef QT_WEBENGINE
3316 enableWidget(true, _pppWidgets._mapWinButton);
3317 enableWidget(true, _pppWidgets._mapWinDotSize);
3318 enableWidget(true, _pppWidgets._mapWinDotColor);
3319 if (_mapWin) {
3320 QListIterator<bncGetThread*> it(_threads);
3321 while (it.hasNext()) {
3322 bncGetThread* thread = it.next();
3323 thread->disconnect(_mapWin);
3324 }
3325 _mapWin->deleteLater();
3326 _mapWin = 0;
3327 }
3328#endif
3329}
Note: See TracBrowser for help on using the repository browser.