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

Last change on this file since 10757 was 10753, checked in by stuerze, 6 months ago

NtripSever functionallity added

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