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

Last change on this file since 11087 was 11087, checked in by stuerze, 28 hours ago

Bias check is added in ssrQC, refernce signals are configurable now

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