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

Last change on this file was 10773, checked in by stuerze, 3 days ago

minor changes

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