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

Last change on this file since 9292 was 9292, checked in by stuerze, 3 years ago

parameter added to be able to chose the corrections to be combined

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