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

Last change on this file was 10800, checked in by stuerze, 12 days ago

Version increased and documentation updated

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