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

Last change on this file since 9599 was 9599, checked in by stuerze, 4 months ago

additional iono mountpoint added for ppp

File size: 166.4 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 _pppWidgets._ionoMount->setMaximumWidth(15*ww);
960
961
962 QGridLayout* pppLayout1 = new QGridLayout();
963 int ir = 0;
964 pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
965 ++ir;
966 pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
967 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
968 pppLayout1->addWidget(new QLabel(" Version 2 filenames"),ir, 4);
969 pppLayout1->addWidget(_pppWidgets._v2filenames, ir, 5, 1, 3);
970 ++ir;
971 pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
972 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
973 pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
974 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
975 pppLayout1->addWidget(new QLabel(" Logfile directory"), ir, 4);
976 pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
977 ++ir;
978 pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
979 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
980 pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
981 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
982 pppLayout1->addWidget(new QLabel(" NMEA directory"), ir, 4);
983 pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
984 ++ir;
985 pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 0);
986 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 1);
987 pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 2);
988 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 3);
989 pppLayout1->addWidget(new QLabel(" SNX TRO directory"), ir, 4);
990 pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
991 ++ir;
992#ifdef USE_PPP
993 pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
994 pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
995#endif
996 pppLayout1->addWidget(new QLabel(" SNX TRO interval"), ir, 4);
997 pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
998 pppLayout1->addWidget(new QLabel(" SNX TRO sampling"), ir, 6);
999 pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
1000 ++ir;
1001 pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
1002 pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
1003 pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
1004 pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
1005 pppLayout1->addWidget(new QLabel(" SNX TRO AC"), ir, 4);
1006 pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
1007 pppLayout1->addWidget(new QLabel(" SNX TRO solution"), ir, 6);
1008 pppLayout1->addWidget(_pppWidgets._snxtroSol, ir, 7, Qt::AlignRight);
1009 pppLayout1->setRowStretch(ir+1, 999);
1010 pppGroup1->setLayout(pppLayout1);
1011
1012 QVBoxLayout* pppLayout2 = new QVBoxLayout();
1013 pppLayout2->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
1014 pppLayout2->addWidget(_pppWidgets._staTable, 99);
1015 QHBoxLayout* pppLayout2sub = new QHBoxLayout();
1016 pppLayout2sub->addWidget(_pppWidgets._addStaButton);
1017 pppLayout2sub->addWidget(_pppWidgets._delStaButton);
1018 pppLayout2sub->addStretch(99);
1019
1020 pppLayout2->addLayout(pppLayout2sub);
1021
1022 pppGroup2->setLayout(pppLayout2);
1023
1024 QGridLayout* pppLayout3 = new QGridLayout();
1025 ir = 0;
1026 pppLayout3->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
1027 ++ir;
1028 pppLayout3->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
1029 pppLayout3->addWidget(_pppWidgets._lcGPS, ir, 1);
1030 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1031 pppLayout3->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
1032 pppLayout3->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
1033 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1034 pppLayout3->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
1035 pppLayout3->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
1036 ++ir;
1037 pppLayout3->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
1038 pppLayout3->addWidget(_pppWidgets._lcGLONASS, ir, 1);
1039 pppLayout3->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
1040 pppLayout3->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8*ww);
1041 pppLayout3->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
1042 pppLayout3->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8*ww);
1043 ++ir;
1044 pppLayout3->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
1045 pppLayout3->addWidget(_pppWidgets._lcGalileo, ir, 1);
1046 pppLayout3->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
1047 pppLayout3->addWidget(_pppWidgets._eleWgtCode, ir, 4);
1048 pppLayout3->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
1049 pppLayout3->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
1050 ++ir;
1051 pppLayout3->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
1052 pppLayout3->addWidget(_pppWidgets._lcBDS, ir, 1);
1053 pppLayout3->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
1054 pppLayout3->addWidget(_pppWidgets._minObs, ir, 4);
1055 pppLayout3->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
1056 pppLayout3->addWidget(_pppWidgets._minEle, ir, 7);
1057 ++ir;
1058 pppLayout3->addWidget(new QLabel("Model Obs"), ir, 0, Qt::AlignLeft);
1059 pppLayout3->addWidget(_pppWidgets._modelObs, ir, 1);
1060 pppLayout3->addWidget(new QLabel("Wait for clock corr."), ir, 3, Qt::AlignLeft);
1061 pppLayout3->addWidget(_pppWidgets._corrWaitTime, ir, 4);
1062 pppLayout3->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
1063 pppLayout3->addWidget(_pppWidgets._seedingTime, ir, 7);
1064 ++ir;
1065 pppLayout3->addWidget(new QLabel("Pseudo Obs"), ir, 0, Qt::AlignLeft);
1066 pppLayout3->addWidget(_pppWidgets._pseudoObs, ir, 1);
1067 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1068 pppLayout3->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
1069 pppLayout3->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8*ww);
1070 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1071 pppLayout3->addWidget(new QLabel("Max Res GIM"), ir, 6, Qt::AlignLeft);
1072 pppLayout3->addWidget(_pppWidgets._maxResGIM, ir, 7); _pppWidgets._maxResGIM->setMaximumWidth(8*ww);
1073 ++ir;
1074 pppLayout3->addWidget(new QLabel(""), ir, 8);
1075 pppLayout3->setColumnStretch(8, 999);
1076 ++ir;
1077 pppLayout3->addWidget(new QLabel(""), ir, 1);
1078 pppLayout3->setRowStretch(ir, 999);
1079
1080 pppGroup3->setLayout(pppLayout3);
1081
1082 // ------------------------
1083 connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
1084 _pppWidgets._mapSpeedSlider->setMinimumWidth(33*ww);
1085 _pppWidgets._audioResponse->setMaximumWidth(8*ww);
1086
1087 QGridLayout* pppLayout4 = new QGridLayout();
1088 ir = 0;
1089 pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
1090 ++ir;
1091 pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
1092 pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
1093 pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
1094 pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
1095 pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
1096 ++ir;
1097 pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
1098 pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
1099 ++ir;
1100 pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
1101 pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
1102 pppLayout4->addWidget(new QLabel("Size "), ir, 2, Qt::AlignLeft);
1103 pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
1104 pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
1105 ++ir;
1106 pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
1107 pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
1108 ++ir;
1109 pppLayout4->addWidget(new QLabel(""), ir, 1);
1110 pppLayout4->setRowStretch(ir, 999);
1111
1112 pppGroup4->setLayout(pppLayout4);
1113
1114 // Reqc Processing
1115 // ---------------
1116 _reqcActionComboBox = new QComboBox();
1117 _reqcActionComboBox->setEditable(false);
1118 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1119 int ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1120 if (ik != -1) {
1121 _reqcActionComboBox->setCurrentIndex(ik);
1122 }
1123 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1124 this, SLOT(slotBncTextChanged()));
1125
1126 QGridLayout* reqcLayout = new QGridLayout;
1127 _reqcActionComboBox->setMinimumWidth(15*ww);
1128 _reqcActionComboBox->setMaximumWidth(20*ww);
1129
1130 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1131 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1132
1133 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1134 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1135 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1136 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1137 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1138 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1139 _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
1140
1141 connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString &)),
1142 this, SLOT(slotBncTextChanged()));
1143
1144 _reqcLogSummaryOnly = new QCheckBox();
1145 _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
1146
1147 ir = 0;
1148 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"),ir, 0, 1, 8);
1149 ++ir;
1150 reqcLayout->addWidget(new QLabel("Action"), ir, 0);
1151 reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
1152 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1153 _reqcEditOptionButton->setMinimumWidth(15*ww);
1154 _reqcEditOptionButton->setMaximumWidth(20*ww);
1155
1156 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
1157 ++ir;
1158 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
1159 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
1160 _reqcObsFileChooser->setMaximumWidth(40*ww);
1161 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1162 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
1163 _reqcNavFileChooser->setMaximumWidth(40*ww);
1164 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1165 ++ir;
1166 reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
1167 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
1168 _reqcOutObsLineEdit->setMaximumWidth(40*ww);
1169 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1170 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
1171 _reqcOutNavLineEdit->setMaximumWidth(40*ww);
1172 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1173 ++ir;
1174 reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
1175 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
1176 _reqcOutLogLineEdit->setMaximumWidth(40*ww);
1177 reqcLayout->addWidget(new QLabel(" Summary only"), ir, 2);
1178 reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
1179 ++ir;
1180 reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
1181 reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
1182 _reqcSkyPlotSignals->setMaximumWidth(40*ww);
1183 ++ir;
1184 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
1185 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
1186 _reqcPlotDirLineEdit->setMaximumWidth(40*ww);
1187 ++ir;
1188 reqcLayout->setRowStretch(ir, 999);
1189
1190 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1191 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1192
1193 reqcgroup->setLayout(reqcLayout);
1194
1195 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1196 this, SLOT(slotReqcEditOption()));
1197
1198 QGridLayout* sp3CompLayout = new QGridLayout;
1199
1200 _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1201 _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
1202 _sp3CompFileChooser->setMinimumWidth(15*ww);
1203 _sp3CompFileChooser->setMaximumWidth(40*ww);
1204
1205 _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
1206 _sp3CompExclude->setMinimumWidth(18*ww);
1207 _sp3CompExclude->setMaximumWidth(18*ww);
1208
1209 _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
1210 _sp3CompLogLineEdit->setMinimumWidth(18*ww);
1211 _sp3CompLogLineEdit->setMaximumWidth(18*ww);
1212
1213 ir = 0;
1214 sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
1215 ++ir;
1216 sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
1217 sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
1218 ++ir;
1219 sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
1220 sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
1221 ++ir;
1222 sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
1223 sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
1224 ++ir;
1225 sp3CompLayout->addWidget(new QLabel(""), ir, 1);
1226 ++ir;
1227 sp3CompLayout->setRowStretch(ir, 999);
1228
1229 sp3CompLayout->setColumnMinimumWidth(2, 8*ww);
1230 sp3CompLayout->setColumnMinimumWidth(4, 8*ww);
1231
1232 sp3CompGroup->setLayout(sp3CompLayout);
1233
1234 connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString &)),
1235 this, SLOT(slotBncTextChanged()));
1236
1237 // Combine Corrections
1238 // -------------------
1239 QGridLayout* cmbLayout = new QGridLayout;
1240
1241 populateCmbTable();
1242 cmbLayout->addWidget(_cmbTable, 0, 0, 8, 3);
1243 cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams.<br>"), 1, 6, 1, 10);
1244 cmbLayout->addWidget(addCmbRowButton, 2, 6);
1245 cmbLayout->addWidget(delCmbRowButton, 2, 7);
1246 cmbLayout->addWidget(new QLabel("Method"), 3, 6, Qt::AlignRight);
1247 cmbLayout->addWidget(_cmbMethodComboBox, 3, 7);
1248 cmbLayout->addWidget(new QLabel(" Maximal residuum"), 4, 6, Qt::AlignRight);
1249 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 7, Qt::AlignRight);
1250 cmbLayout->addWidget(new QLabel("Sampling"), 5, 6, Qt::AlignRight);
1251 cmbLayout->addWidget(_cmbSamplSpinBox, 5, 7);
1252 cmbLayout->addWidget(new QLabel("GNSS"), 6, 6, Qt::AlignRight);
1253 cmbLayout->addWidget(new QLabel("Systems"), 6, 7, Qt::AlignLeft);
1254 cmbLayout->addWidget(new QLabel("GPS"), 6, 8);
1255 cmbLayout->addWidget(_cmbGpsCheckBox, 6, 9);
1256 cmbLayout->addWidget(new QLabel("GLO"), 6, 10);
1257 cmbLayout->addWidget(_cmbGloCheckBox, 6, 11);
1258 cmbLayout->addWidget(new QLabel("Galileo"), 6, 12);
1259 cmbLayout->addWidget(_cmbGalCheckBox, 6, 13);
1260 cmbLayout->addWidget(new QLabel("Beidou"), 6, 14);
1261 cmbLayout->addWidget(_cmbBdsCheckBox, 6, 15);
1262 cmbLayout->addWidget(new QLabel("QZSS"), 7, 8);
1263 cmbLayout->addWidget(_cmbQzssCheckBox, 7, 9);
1264 cmbLayout->addWidget(new QLabel("SBAS"), 7, 10);
1265 cmbLayout->addWidget(_cmbSbasCheckBox, 7, 11);
1266 cmbLayout->addWidget(new QLabel("IRNSS"), 7, 12);
1267 cmbLayout->addWidget(_cmbIrnssCheckBox, 7, 13);
1268 cmbLayout->setRowStretch(6, 999);
1269
1270 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1271 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1272
1273 cmbgroup->setLayout(cmbLayout);
1274
1275 // Upload Layout (Clocks)
1276 // ----------------------
1277 QGridLayout* uploadHlpLayout = new QGridLayout();
1278
1279 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1280 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1281 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1282
1283 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1284 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1285 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1286 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1287 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1288 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1289 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1290 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1291 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1292 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1293 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1294 uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
1295 uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
1296
1297 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1298 populateUploadTable();
1299
1300 uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to caster.<br>"));
1301 uploadLayout->addWidget(_uploadTable);
1302 uploadLayout->addLayout(uploadHlpLayout);
1303
1304 uploadgroup->setLayout(uploadLayout);
1305
1306 // Upload Layout (Ephemeris)
1307 // -------------------------
1308 QGridLayout* uploadHlpLayoutEph = new QGridLayout();
1309
1310 connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
1311 connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
1312
1313 uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
1314 uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
1315 uploadHlpLayoutEph->addWidget(new QLabel(" Sampling"), 0, 2, Qt::AlignRight);
1316 uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
1317
1318 QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
1319 populateUploadEphTable();
1320
1321 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster.<br>"));
1322 uploadLayoutEph->addWidget(_uploadEphTable);
1323 uploadLayoutEph->addLayout(uploadHlpLayoutEph);
1324
1325 uploadEphgroup->setLayout(uploadLayoutEph);
1326
1327
1328 // Main Layout
1329 // -----------
1330 QGridLayout* mLayout = new QGridLayout;
1331 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1332 mLayout->addWidget(_aogroup, 0,0);
1333 mLayout->addWidget(_mountPointsTable, 1,0);
1334 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1335 mLayout->addWidget(_loggroup, 2,0);
1336
1337 _canvas->setLayout(mLayout);
1338
1339 // WhatsThis, Network
1340 // ------------------
1341 _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>"));
1342 _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>"));
1343 _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>"));
1344 _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>"));
1345
1346 // WhatsThis, General
1347 // ------------------
1348 _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>"));
1349 _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>"));
1350 _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>"));
1351 _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>"));
1352 _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>"));
1353
1354 // WhatsThis, RINEX Observations
1355 // -----------------------------
1356 _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>"));
1357 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
1358 _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
1359 _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>"));
1360 _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>"));
1361 _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>"));
1362 _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>"));
1363 _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>"));
1364 _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>"));
1365
1366 // WhatsThis, RINEX Ephemeris
1367 // --------------------------
1368 _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>"));
1369 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
1370 _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>"));
1371 _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>"));
1372
1373 // WhatsThis, RINEX Editing & QC
1374 // -----------------------------
1375 _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>"));
1376 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
1377 _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>"));
1378 _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>"));
1379 _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>"));
1380 _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>"));
1381 _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>"));
1382 _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>"));
1383 _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>"));
1384 _reqcSkyPlotSignals->setWhatsThis(tr("<p>BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values. The 'Plots for signals' option lets you exactly specify observation signals to be used for that and also enables the plot generation. You can specify the navigation system, the frequency, and the tracking mode or channel as defined in RINEX Version 3. Specifications for frequency and tracking mode or channel must be separated by ampersand character '&'. Specifications for navigation systems must be separated by blank character ' '.</p><p>Examples for 'Plots for signals' option:<ul><li> G:1&2&5 R:1&2&3 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
1385
1386 // WhatsThis, SP3 Comparison
1387 // -------------------------
1388 _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>"));
1389 _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>"));
1390 _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>"));
1391
1392 // WhatsThis, Broadcast Corrections
1393 // --------------------------------
1394 _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>"));
1395 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
1396 _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>"));
1397
1398 // WhatsThis, Feed Engine
1399 // ----------------------
1400 _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>"));
1401 _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>"));
1402 _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
1403 _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>"));
1404 _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>"));
1405 _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
1406
1407 // WhatsThis, Serial Output
1408 // ------------------------
1409 _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>"));
1410 _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>"));
1411 _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>"));
1412 _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>"));
1413 _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>"));
1414 _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>"));
1415 _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>"));
1416 _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>"));
1417 _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>"));
1418 _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>"));
1419 _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>"));
1420
1421 // WhatsThis, Outages
1422 // ------------------
1423 _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>"));
1424 _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>"));
1425 _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>"));
1426 _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>"));
1427
1428 // WhatsThis, Miscellaneous
1429 // ------------------------
1430 _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>"));
1431 _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>"));
1432 _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>"));
1433 _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>"));
1434
1435 // WhatsThis, PPP (1)
1436 // ------------------
1437 _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>"));
1438 _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file.</p>"));
1439 _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file.</p>"));
1440 _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>"));
1441 _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>"));
1442 _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>"));
1443 _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>"));
1444 _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>"));
1445 _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>"));
1446 _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>"));
1447 _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>"));
1448 _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>"));
1449 _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters.</p>"));
1450 _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files.</p>"));
1451 _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 4-character solution ID to allow a distingtion between different solutions per AC.</p>"));
1452 _pppWidgets._ionoMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides VTEC informations in SSR format.</p><p>If you don't specify a corrections stream via this option, BNC will use VTEC informations from the Corrections stream 'mountpoint', if available.</p>"));
1453
1454 // WhatsThis, PPP (3)
1455 // ------------------
1456 _pppWidgets._lcGPS->setWhatsThis(tr("<p>Specify which kind of GPS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying 'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying 'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GPS data. <i>[key: PPP/lcGPS]</i></p>"));
1457 _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GLONASS data. <i>[key: PPP/lcGLONASS]</i></p>"));
1458 _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use Galileo data. <i>[key: PPP/lcGalileo]</i></p>"));
1459 _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data from two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use BDS data. <i>[key: PPP/lcBDS]</i></p>"));
1460 _pppWidgets._modelObs->setWhatsThis(tr("<p>Specify which kind of PPP model you want to use:</p><p><ul><li>Iopnosphere-free PPP</li><li>Uncombined PPP</li><li>PPP-RTK (recommended for test purposes only because of an incomplete standardized SSR model)</li><li>DCM with Code or Phase Biases</li><li></p><p>[key: PPP/modelObs]</i></p>"));
1461 _pppWidgets._pseudoObs->setWhatsThis(tr("<p>Specify which kind of pseudo observations you want to use. Please note, pseudo observations regarding the Ionosphere are useful, as soon as the ionospheric information is more accurate than the code data accuracy. <i>[key: PPP/pseudoObs]</i></p>"));
1462 _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS C1 code observations to a PPP solution from combined code and phase data. 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>"));
1463 _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS L1 phase observations to a PPP solutions from combined code and phase data. 0.02 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma L1 = 0.02' <i>[key: PPP/sigmaL1]</i></p>"));
1464 _pppWidgets._sigmaGIM->setWhatsThis(tr("<p>Enter a Sigma for GIM pseudo observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GIM pseudo observations to a PPP solution. 5.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 5.0' <i>[key: PPP/sigmaGIM]</i></p>"));
1465 _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS 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 Res C1 = 3.0' <i>[key: PPP/maxResC1]</i></p>"));
1466 _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS L1 phase 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 Res L1 = 0.03' <i>[key: PPP/maxResL1]</i></p>"));
1467 _pppWidgets._maxResGIM->setWhatsThis(tr("<p>Specify a maximum for residuals from GIM pseudo 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 Res GIM = 3.0' <i>[key: PPP/maxResGIM]</i></p>"));
1468 _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>"));
1469 _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>"));
1470 _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>"));
1471 _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>"));
1472
1473 // WhatsThis, Combine Corrections
1474 // ------------------------------
1475 _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>"));
1476 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1477 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1478 _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>"));
1479 _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>"));
1480 _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>"));
1481 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS corrections shall be combined. <i>[key: cmbGps]</i></p>"));
1482 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1483 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1484 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1485 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1486 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1487 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1488
1489 // WhatsThis, Upload Corrections
1490 // -----------------------------
1491 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) in different SSR formats. 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>Select a target SSR format (e.g. IGS-SSR) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BNCOUTPUT${V3PROD}.sp3<br>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</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/BNCOUTPUT${V3PROD}.clk<br>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
1492 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1493 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1494 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3 and Clock RINEX files. <i>[key: uploadIntr]</i></p>"));
1495 _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>"));
1496 _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>"));
1497 _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>"));
1498 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>"));
1499 _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>"));
1500
1501 // WhatsThis, Upload Ephemeris
1502 // ---------------------------
1503 _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', '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. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphHost]</i></p>"));
1504 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1505 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1506 _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>"));
1507
1508 // WhatsThis, Streams Canvas
1509 // -------------------------
1510 _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>"));
1511 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1512 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1513 _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>"));
1514 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1515 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1516
1517 // WhatsThis, Log Canvas
1518 // ---------------------
1519 _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>"));
1520 _bncFigure->setWhatsThis(tr("<p>The bandwith consumption per stream is shown in the 'Throughput' tab in bits per second (bps) or kilobits per second (kbps).</p>"));
1521 _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>"));
1522 _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>"));
1523
1524
1525 // Enable/Disable all Widgets
1526 // --------------------------
1527 slotBncTextChanged();
1528 enableStartStop();
1529
1530 // Auto start
1531 // ----------
1532 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1533 slotStart();
1534 }
1535}
1536
1537// Destructor
1538////////////////////////////////////////////////////////////////////////////
1539bncWindow::~bncWindow() {
1540 if (_caster) {
1541 delete _caster; BNC_CORE->setCaster(0);
1542 }
1543 if (_casterEph) {
1544 delete _casterEph;
1545 }
1546 delete _bncFigureLate;
1547 delete _bncFigurePPP;
1548 delete _actHelp;
1549 delete _actAbout;
1550 delete _actFlowchart;
1551 delete _actFontSel;
1552 delete _actSaveOpt;
1553 delete _actQuit;
1554 delete _actAddMountPoints;
1555 delete _actDeleteMountPoints;
1556 delete _actMapMountPoints;
1557 delete _actStart;
1558 delete _actStop;
1559 delete _actwhatsthis;
1560 delete _proxyHostLineEdit;
1561 delete _proxyPortLineEdit;
1562 delete _sslCaCertPathLineEdit;
1563 delete _sslIgnoreErrorsCheckBox;
1564 delete _logFileLineEdit;
1565 delete _rawOutFileLineEdit;
1566 delete _rnxAppendCheckBox;
1567 delete _onTheFlyComboBox;
1568 delete _autoStartCheckBox;
1569 delete _rnxPathLineEdit;
1570 delete _rnxIntrComboBox;
1571 delete _rnxSamplComboBox;
1572 delete _rnxSkelExtComboBox;
1573 delete _rnxSkelPathLineEdit;
1574 delete _rnxFileCheckBox;
1575 delete _rnxScrpLineEdit;
1576 delete _rnxV2CheckBox;
1577 delete _rnxV2Priority;
1578 delete _ephPathLineEdit;
1579 delete _ephIntrComboBox;
1580 delete _ephOutPortLineEdit;
1581 delete _ephV2CheckBox;
1582 delete _corrPathLineEdit;
1583 delete _corrIntrComboBox;
1584 delete _corrPortLineEdit;
1585 delete _outPortLineEdit;
1586 delete _outWaitSpinBox;
1587 delete _outSamplComboBox;
1588 delete _outFileLineEdit;
1589 delete _outUPortLineEdit;
1590 delete _outLockTimeCheckBox;
1591 delete _serialMountPointLineEdit;
1592 delete _serialPortNameLineEdit;
1593 delete _serialBaudRateComboBox;
1594 delete _serialFlowControlComboBox;
1595 delete _serialDataBitsComboBox;
1596 delete _serialParityComboBox;
1597 delete _serialStopBitsComboBox;
1598 delete _serialAutoNMEAComboBox;
1599 delete _serialFileNMEALineEdit;
1600 delete _serialHeightNMEALineEdit;
1601 delete _serialManualNMEASamplingSpinBox;
1602 delete _adviseObsRateComboBox;
1603 delete _adviseFailSpinBox;
1604 delete _adviseRecoSpinBox;
1605 delete _adviseScriptLineEdit;
1606 delete _miscMountLineEdit;
1607 delete _miscPortLineEdit;
1608 delete _miscIntrComboBox;
1609 delete _miscScanRTCMCheckBox;
1610 _mountPointsTable->deleteLater();
1611 delete _log;
1612 delete _loggroup;
1613 _cmbTable->deleteLater();
1614 delete _cmbMaxresLineEdit;
1615 delete _cmbSamplSpinBox;
1616 delete _cmbMethodComboBox;
1617 delete _cmbGpsCheckBox;
1618 delete _cmbGloCheckBox;
1619 delete _cmbGalCheckBox;
1620 delete _cmbBdsCheckBox;
1621 delete _cmbQzssCheckBox;
1622 delete _cmbSbasCheckBox;
1623 delete _cmbIrnssCheckBox;
1624 _uploadEphTable->deleteLater();
1625 delete _uploadSamplRtcmEphCorrSpinBox;
1626 _uploadTable->deleteLater();
1627 delete _uploadIntrComboBox;
1628 delete _uploadAntexFile;
1629 delete _uploadSamplRtcmEphSpinBox;
1630 delete _uploadSamplSp3SpinBox;
1631 delete _uploadSamplClkRnxSpinBox;
1632 delete _reqcActionComboBox;
1633 delete _reqcObsFileChooser;
1634 delete _reqcNavFileChooser;
1635 delete _reqcOutObsLineEdit;
1636 delete _reqcOutNavLineEdit;
1637 delete _reqcOutLogLineEdit;
1638 delete _reqcPlotDirLineEdit;
1639 delete _reqcSkyPlotSignals;
1640 delete _reqcLogSummaryOnly;
1641 delete _reqcEditOptionButton;
1642 delete _sp3CompFileChooser;
1643 delete _sp3CompExclude;
1644 delete _sp3CompLogLineEdit;
1645 //delete _canvas;
1646}
1647
1648//
1649////////////////////////////////////////////////////////////////////////////
1650void bncWindow::populateMountPointsTable() {
1651
1652 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1653 _mountPointsTable->removeRow(iRow);
1654 }
1655
1656 bncSettings settings;
1657
1658 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1659 int iRow = 0;
1660 while (it.hasNext()) {
1661 QStringList hlp = it.next().split(" ");
1662 if (hlp.size() < 7) continue;
1663 _mountPointsTable->insertRow(iRow);
1664
1665 QUrl url(hlp[0]);
1666
1667 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1668 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1669 QString nmea(hlp[5]);
1670 if (hlp[6] == "S") {
1671 fullPath = hlp[0].replace(0,2,"");
1672 }
1673 QString ntripVersion = "2";
1674 if (hlp.size() >= 7) {
1675 ntripVersion = (hlp[6]);
1676 }
1677
1678 QTableWidgetItem* it;
1679 it = new QTableWidgetItem(url.userInfo());
1680 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1681 _mountPointsTable->setItem(iRow, 0, it);
1682
1683 it = new QTableWidgetItem(fullPath);
1684 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1685 _mountPointsTable->setItem(iRow, 1, it);
1686
1687 it = new QTableWidgetItem(format);
1688 _mountPointsTable->setItem(iRow, 2, it);
1689
1690 it = new QTableWidgetItem(country);
1691 _mountPointsTable->setItem(iRow, 3, it);
1692
1693 if (nmea == "yes") {
1694 it = new QTableWidgetItem(latitude);
1695 _mountPointsTable->setItem(iRow, 4, it);
1696 it = new QTableWidgetItem(longitude);
1697 _mountPointsTable->setItem(iRow, 5, it);
1698 } else {
1699 it = new QTableWidgetItem(latitude);
1700 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1701 _mountPointsTable->setItem(iRow, 4, it);
1702
1703 it = new QTableWidgetItem(longitude);
1704 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1705 _mountPointsTable->setItem(iRow, 5, it);
1706 }
1707
1708 it = new QTableWidgetItem(nmea);
1709 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1710 _mountPointsTable->setItem(iRow, 6, it);
1711
1712 it = new QTableWidgetItem(ntripVersion);
1713 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1714 _mountPointsTable->setItem(iRow, 7, it);
1715
1716 bncTableItem* bncIt = new bncTableItem();
1717 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1718 _mountPointsTable->setItem(iRow, 8, bncIt);
1719
1720 iRow++;
1721 }
1722
1723 _mountPointsTable->sortItems(1);
1724
1725 enableStartStop();
1726}
1727
1728// Retrieve Table
1729////////////////////////////////////////////////////////////////////////////
1730void bncWindow::slotAddMountPoints() {
1731
1732 bncSettings settings;
1733 QString proxyHost = settings.value("proxyHost").toString();
1734 int proxyPort = settings.value("proxyPort").toInt();
1735 if (proxyHost != _proxyHostLineEdit->text() ||
1736 proxyPort != _proxyPortLineEdit->text().toInt()) {
1737 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1738 "changed. Use the new ones?",
1739 QMessageBox::Yes, QMessageBox::No,
1740 QMessageBox::NoButton);
1741 if (iRet == QMessageBox::Yes) {
1742 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1743 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1744 }
1745 }
1746
1747 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1748 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1749
1750 QMessageBox msgBox;
1751 msgBox.setIcon(QMessageBox::Question);
1752 msgBox.setWindowTitle("Add Stream");
1753 msgBox.setText("Add stream(s) coming from:");
1754
1755 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1756 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1757 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1758 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1759 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1760
1761 msgBox.exec();
1762
1763 if (msgBox.clickedButton() == buttonNtrip) {
1764 bncTableDlg* dlg = new bncTableDlg(this);
1765 dlg->move(this->pos().x()+50, this->pos().y()+50);
1766 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1767 this, SLOT(slotNewMountPoints(QStringList*)));
1768 dlg->exec();
1769 delete dlg;
1770 } else if (msgBox.clickedButton() == buttonIP) {
1771 bncIpPort* ipp = new bncIpPort(this);
1772 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1773 this, SLOT(slotNewMountPoints(QStringList*)));
1774 ipp->exec();
1775 delete ipp;
1776 } else if (msgBox.clickedButton() == buttonUDP) {
1777 bncUdpPort* udp = new bncUdpPort(this);
1778 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1779 this, SLOT(slotNewMountPoints(QStringList*)));
1780 udp->exec();
1781 delete udp;
1782 } else if (msgBox.clickedButton() == buttonSerial) {
1783 bncSerialPort* sep = new bncSerialPort(this);
1784 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1785 this, SLOT(slotNewMountPoints(QStringList*)));
1786 sep->exec();
1787 delete sep;
1788 } else if (msgBox.clickedButton() == buttonCancel) {
1789 // Cancel
1790 }
1791
1792 enableStartStop();
1793}
1794
1795// Delete Selected Mount Points
1796////////////////////////////////////////////////////////////////////////////
1797void bncWindow::slotDeleteMountPoints() {
1798
1799 int nRows = _mountPointsTable->rowCount();
1800 bool flg[nRows];
1801 for (int iRow = 0; iRow < nRows; iRow++) {
1802 if (_mountPointsTable->item(iRow,1)->isSelected()) {
1803 flg[iRow] = true;
1804 }
1805 else {
1806 flg[iRow] = false;
1807 }
1808 }
1809 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1810 if (flg[iRow]) {
1811 _mountPointsTable->removeRow(iRow);
1812 }
1813 }
1814 _actDeleteMountPoints->setEnabled(false);
1815
1816 enableStartStop();
1817}
1818
1819// New Mount Points Selected
1820////////////////////////////////////////////////////////////////////////////
1821void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1822 int iRow = 0;
1823 QListIterator<QString> it(*mountPoints);
1824 while (it.hasNext()) {
1825 QStringList hlp = it.next().split(" ");
1826 QUrl url(hlp[0]);
1827 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1828 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1829 QString nmea(hlp[5]);
1830 if (hlp[6] == "S") {
1831 fullPath = hlp[0].replace(0,2,"");
1832 }
1833 QString ntripVersion = "2";
1834 if (hlp.size() >= 7) {
1835 ntripVersion = (hlp[6]);
1836 }
1837
1838 _mountPointsTable->insertRow(iRow);
1839
1840 QTableWidgetItem* it;
1841 it = new QTableWidgetItem(url.userInfo());
1842 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1843 _mountPointsTable->setItem(iRow, 0, it);
1844
1845 it = new QTableWidgetItem(fullPath);
1846 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1847 _mountPointsTable->setItem(iRow, 1, it);
1848
1849 it = new QTableWidgetItem(format);
1850 _mountPointsTable->setItem(iRow, 2, it);
1851
1852 it = new QTableWidgetItem(country);
1853 _mountPointsTable->setItem(iRow, 3, it);
1854
1855 if (nmea == "yes") {
1856 it = new QTableWidgetItem(latitude);
1857 _mountPointsTable->setItem(iRow, 4, it);
1858 it = new QTableWidgetItem(longitude);
1859 _mountPointsTable->setItem(iRow, 5, it);
1860 } else {
1861 it = new QTableWidgetItem(latitude);
1862 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1863 _mountPointsTable->setItem(iRow, 4, it);
1864 it = new QTableWidgetItem(longitude);
1865 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1866 _mountPointsTable->setItem(iRow, 5, it);
1867 }
1868
1869 it = new QTableWidgetItem(nmea);
1870 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1871 _mountPointsTable->setItem(iRow, 6, it);
1872
1873 it = new QTableWidgetItem(ntripVersion);
1874 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1875 _mountPointsTable->setItem(iRow, 7, it);
1876
1877 bncTableItem* bncIt = new bncTableItem();
1878 _mountPointsTable->setItem(iRow, 8, bncIt);
1879
1880 iRow++;
1881 }
1882 _mountPointsTable->hideColumn(0);
1883 _mountPointsTable->hideColumn(3);
1884 _mountPointsTable->sortItems(1);
1885 delete mountPoints;
1886
1887 enableStartStop();
1888}
1889
1890// Save Options (serialize)
1891////////////////////////////////////////////////////////////////////////////
1892void bncWindow::slotSaveOptions() {
1893 saveOptions();
1894 bncSettings settings;
1895 settings.sync();
1896}
1897
1898// Save Options (memory only)
1899////////////////////////////////////////////////////////////////////////////
1900void bncWindow::saveOptions() {
1901
1902 QStringList mountPoints;
1903 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1904
1905 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1906 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1907 "@" + _mountPointsTable->item(iRow, 1)->text() );
1908
1909 mountPoints.append(url.toString() + " " +
1910 _mountPointsTable->item(iRow, 2)->text()
1911 + " " + _mountPointsTable->item(iRow, 3)->text()
1912 + " " + _mountPointsTable->item(iRow, 4)->text()
1913 + " " + _mountPointsTable->item(iRow, 5)->text()
1914 + " " + _mountPointsTable->item(iRow, 6)->text()
1915 + " " + _mountPointsTable->item(iRow, 7)->text());
1916 } else {
1917 mountPoints.append(
1918 "//" + _mountPointsTable->item(iRow, 1)->text()
1919 + " " + _mountPointsTable->item(iRow, 2)->text()
1920 + " " + _mountPointsTable->item(iRow, 3)->text()
1921 + " " + _mountPointsTable->item(iRow, 4)->text()
1922 + " " + _mountPointsTable->item(iRow, 5)->text()
1923 + " " + _mountPointsTable->item(iRow, 6)->text()
1924 + " " + _mountPointsTable->item(iRow, 7)->text());
1925 }
1926 }
1927
1928 QStringList cmbStreams;
1929 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1930 QString hlp;
1931 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1932 if (_cmbTable->item(iRow, iCol)) {
1933 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1934 }
1935 }
1936 if (!hlp.isEmpty()) {
1937 cmbStreams << hlp;
1938 }
1939 }
1940
1941 QStringList uploadMountpointsOut;
1942 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1943 QString hlp;
1944 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1945 if (_uploadTable->cellWidget(iRow, iCol) &&
1946 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
1947 if (iCol == 3) {
1948 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1949 hlp += ntripversion->currentText() + ",";
1950 }
1951 else if (iCol == 4 ) {
1952 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1953 hlp += user->text() + ",";
1954 }
1955 else if (iCol == 5) {
1956 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1957 hlp += passwd->text() + ",";
1958 }
1959 else if (iCol == 6) {
1960 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1961 hlp += system->currentText() + ",";
1962 }
1963 else if (iCol == 7) {
1964 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1965 hlp += format->currentText() + ",";
1966 }
1967 else if (iCol == 8) {
1968 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1969 QString state; state.setNum(com->checkState());
1970 hlp += state + ",";
1971 }
1972 }
1973 else if (_uploadTable->item(iRow, iCol)) {
1974 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1975 }
1976 }
1977 if (!hlp.isEmpty()) {
1978 uploadMountpointsOut << hlp;
1979 }
1980 }
1981
1982 QStringList uploadEphMountpointsOut;
1983 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
1984 QString hlp;
1985 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
1986 if (_uploadEphTable->cellWidget(iRow, iCol) &&
1987 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
1988 if (iCol == 3) {
1989 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
1990 hlp += ntripversion->currentText() + ",";
1991 }
1992 else if (iCol == 4 ) {
1993 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
1994 hlp += user->text() + ",";
1995 }
1996 else if (iCol == 5) {
1997 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
1998 hlp += passwd->text() + ",";
1999 }
2000 else if (iCol == 6) {
2001 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2002 hlp += system->text() + ",";
2003 }
2004 }
2005 else if (_uploadEphTable->item(iRow, iCol)) {
2006 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2007 }
2008 }
2009 if (!hlp.isEmpty()) {
2010 uploadEphMountpointsOut << hlp;
2011 }
2012 }
2013
2014 bncSettings settings;
2015
2016 settings.setValue("startTab", _aogroup->currentIndex());
2017 settings.setValue("statusTab", _loggroup->currentIndex());
2018 settings.setValue("mountPoints", mountPoints);
2019// Network
2020 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2021 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2022 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2023 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2024// General
2025 settings.setValue("logFile", _logFileLineEdit->text());
2026 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2027 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2028 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2029 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2030// RINEX Observations
2031 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2032 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2033 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2034 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2035 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2036 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2037 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2038 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2039 settings.setValue("rnxV2", _rnxV2CheckBox->checkState());
2040// RINEX Ephemeris
2041 settings.setValue("ephPath", _ephPathLineEdit->text());
2042 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2043 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2044 settings.setValue("ephV2", _ephV2CheckBox->checkState());
2045// Broadcast Corrections
2046 settings.setValue("corrPath", _corrPathLineEdit->text());
2047 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2048 settings.setValue("corrPort", _corrPortLineEdit->text());
2049// Feed Engine
2050 settings.setValue("outPort", _outPortLineEdit->text());
2051 settings.setValue("outWait", _outWaitSpinBox->value());
2052 settings.setValue("outSampl", _outSamplComboBox->currentText());
2053 settings.setValue("outFile", _outFileLineEdit->text());
2054 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2055// Serial Output
2056 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2057 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2058 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2059 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2060 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2061 settings.setValue("serialParity", _serialParityComboBox->currentText());
2062 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2063 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2064 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2065 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2066 settings.setValue("serialManualNMEASampling", _serialManualNMEASamplingSpinBox->value());
2067// Outages
2068 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2069 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2070 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2071 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2072// Miscellaneous
2073 settings.setValue("miscMount", _miscMountLineEdit->text());
2074 settings.setValue("miscPort", _miscPortLineEdit->text());
2075 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2076 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2077// Reqc
2078 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2079 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2080 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2081 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2082 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2083 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2084 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2085 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2086 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2087// SP3 Comparison
2088 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2089 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2090 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2091// Combine Corrections
2092 if (!cmbStreams.isEmpty()) {
2093 settings.setValue("cmbStreams", cmbStreams);
2094 }
2095 else {
2096 settings.setValue("cmbStreams", "");
2097 }
2098 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2099 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2100 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2101 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2102 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2103 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2104 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2105 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2106 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2107 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2108
2109// Upload Corrections
2110 if (!uploadMountpointsOut.isEmpty()) {
2111 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2112 }
2113 else {
2114 settings.setValue("uploadMountpointsOut", "");
2115 }
2116 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2117 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2118 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
2119 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2120 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2121// Upload Ephemeris
2122 if (!uploadEphMountpointsOut.isEmpty()) {
2123 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2124 }
2125 else {
2126 settings.setValue("uploadEphMountpointsOut", "");
2127 }
2128 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2129
2130 if (_caster) {
2131 _caster->readMountPoints();
2132 }
2133
2134 _pppWidgets.saveOptions();
2135}
2136
2137// All get slots terminated
2138////////////////////////////////////////////////////////////////////////////
2139void bncWindow::slotGetThreadsFinished() {
2140 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2141 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2142 delete _casterEph; _casterEph = 0;
2143 _runningRealTime = false;
2144}
2145
2146// Start It!
2147////////////////////////////////////////////////////////////////////////////
2148void bncWindow::slotStart() {
2149 saveOptions();
2150 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2151 _runningPPP = true;
2152 enableStartStop();
2153 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2154 BNC_CORE->startPPP();
2155 _bncFigurePPP->reset();
2156 }
2157 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2158 if (_reqcActionComboBox->currentText() == "Analyze") {
2159 _runningQC = true;
2160 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2161 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2162 reqcAnalyze->start();
2163 }
2164 else {
2165 _runningEdit = true;
2166 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2167 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2168 reqcEdit->start();
2169 }
2170 enableStartStop();
2171 }
2172 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2173 _runningSp3Comp = true;
2174 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2175 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2176 sp3Comp->start();
2177 enableStartStop();
2178 }
2179 else {
2180 startRealTime();
2181 BNC_CORE->startPPP();
2182 }
2183}
2184
2185// Start Real-Time (Retrieve Data etc.)
2186////////////////////////////////////////////////////////////////////////////
2187void bncWindow::startRealTime() {
2188
2189 _runningRealTime = true;
2190
2191 _bncFigurePPP->reset();
2192
2193 _actDeleteMountPoints->setEnabled(false);
2194
2195 enableStartStop();
2196
2197 _caster = new bncCaster();
2198
2199 BNC_CORE->setCaster(_caster);
2200 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2201 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2202 BNC_CORE->initCombination();
2203
2204 connect(_caster, SIGNAL(getThreadsFinished()),
2205 this, SLOT(slotGetThreadsFinished()));
2206
2207 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
2208 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2209
2210 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2211
2212 bncSettings settings;
2213
2214 // Active panels
2215 // -------------
2216 if (!_rnxPathLineEdit->text().isEmpty())
2217 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2218 if (!_ephPathLineEdit->text().isEmpty())
2219 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2220 if (!_corrPathLineEdit->text().isEmpty())
2221 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2222 if (!_outPortLineEdit->text().isEmpty())
2223 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2224 if (!_serialMountPointLineEdit->text().isEmpty())
2225 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2226 if (!_adviseObsRateComboBox->currentText().isEmpty())
2227 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2228 if (!_miscMountLineEdit->text().isEmpty())
2229 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2230 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2231 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2232 if (_cmbTable->rowCount() > 0)
2233 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2234 if (_uploadTable->rowCount() > 0)
2235 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2236 if (_uploadEphTable->rowCount() > 0)
2237 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2238
2239 QDir rnxdir(settings.value("rnxPath").toString());
2240 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2241
2242 QString rnx_file = settings.value("rnxScript").toString();
2243 if ( !rnx_file.isEmpty() ) {
2244 QFile rnxfile(settings.value("rnxScript").toString());
2245 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2246 }
2247
2248 QDir ephdir(settings.value("ephPath").toString());
2249 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2250
2251 QDir corrdir(settings.value("corrPath").toString());
2252 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2253
2254 QString advise_file = settings.value("adviseScript").toString();
2255 if ( !advise_file.isEmpty() ) {
2256 QFile advisefile(settings.value("adviseScript").toString());
2257 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2258 }
2259
2260 _caster->readMountPoints();
2261
2262 _casterEph = new bncEphUploadCaster();
2263}
2264
2265// Retrieve Data
2266////////////////////////////////////////////////////////////////////////////
2267void bncWindow::slotStop() {
2268 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2269 QMessageBox::Yes, QMessageBox::No,
2270 QMessageBox::NoButton);
2271 if (iRet == QMessageBox::Yes) {
2272 BNC_CORE->stopPPP();
2273 BNC_CORE->stopCombination();
2274 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2275 delete _casterEph; _casterEph = 0;
2276 _runningRealTime = false;
2277 _runningPPP = false;
2278 enableStartStop();
2279 }
2280}
2281
2282// Close Application gracefully
2283////////////////////////////////////////////////////////////////////////////
2284void bncWindow::closeEvent(QCloseEvent* event) {
2285
2286 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2287 QMessageBox::Yes, QMessageBox::No,
2288 QMessageBox::Cancel);
2289
2290 if (iRet == QMessageBox::Cancel) {
2291 event->ignore();
2292 return;
2293 }
2294 else if (iRet == QMessageBox::Yes) {
2295 slotSaveOptions();
2296 }
2297
2298 BNC_CORE->stopPPP();
2299
2300 QMainWindow::closeEvent(event);
2301}
2302
2303// User changed the selection of mountPoints
2304////////////////////////////////////////////////////////////////////////////
2305void bncWindow::slotSelectionChanged() {
2306 if (_mountPointsTable->selectedItems().isEmpty()) {
2307 _actDeleteMountPoints->setEnabled(false);
2308 }
2309 else {
2310 _actDeleteMountPoints->setEnabled(true);
2311 }
2312}
2313
2314// Display Program Messages
2315////////////////////////////////////////////////////////////////////////////
2316void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2317 if (showOnScreen ) {
2318 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2319 }
2320}
2321
2322// About Message
2323////////////////////////////////////////////////////////////////////////////
2324void bncWindow::slotAbout() {
2325 new bncAboutDlg(0);
2326}
2327
2328//Flowchart
2329////////////////////////////////////////////////////////////////////////////
2330void bncWindow::slotFlowchart() {
2331 new bncFlowchartDlg(0);
2332}
2333
2334// Help Window
2335////////////////////////////////////////////////////////////////////////////
2336void bncWindow::slotHelp() {
2337 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2338 new bncHlpDlg(0, url);
2339}
2340
2341// Select Fonts
2342////////////////////////////////////////////////////////////////////////////
2343void bncWindow::slotFontSel() {
2344 bool ok;
2345 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2346 if (ok) {
2347 bncSettings settings;
2348 settings.setValue("font", newFont.toString());
2349 QApplication::setFont(newFont);
2350 int ww = QFontMetrics(newFont).width('w');
2351 setMinimumSize(60*ww, 80*ww);
2352 resize(60*ww, 80*ww);
2353 }
2354}
2355
2356// Whats This Help
2357void bncWindow::slotWhatsThis() {
2358 QWhatsThis::enterWhatsThisMode();
2359}
2360
2361//
2362////////////////////////////////////////////////////////////////////////////
2363void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2364 _threads = threads;
2365
2366 _bncFigure->updateMountPoints();
2367 _bncFigureLate->updateMountPoints();
2368
2369 populateMountPointsTable();
2370 bncSettings settings;
2371 _outSamplComboBox->findText(settings.value("outSampl").toString());
2372 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2373 QListIterator<bncGetThread*> iTh(threads);
2374 while (iTh.hasNext()) {
2375 bncGetThread* thread = iTh.next();
2376 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2377 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2378 "@" + _mountPointsTable->item(iRow, 1)->text() );
2379 if (url == thread->mountPoint() &&
2380 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2381 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2382 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2383 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2384 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2385 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2386 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2387 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2388 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2389 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2390 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2391 break;
2392 }
2393 }
2394 }
2395}
2396
2397//
2398////////////////////////////////////////////////////////////////////////////
2399void bncWindow::CreateMenu() {
2400 // Create Menus
2401 // ------------
2402 _menuFile = menuBar()->addMenu(tr("&File"));
2403 _menuFile->addAction(_actFontSel);
2404 _menuFile->addSeparator();
2405 _menuFile->addAction(_actSaveOpt);
2406 _menuFile->addSeparator();
2407 _menuFile->addAction(_actQuit);
2408
2409 _menuHlp = menuBar()->addMenu(tr("&Help"));
2410 _menuHlp->addAction(_actHelp);
2411 _menuHlp->addAction(_actFlowchart);
2412 _menuHlp->addAction(_actAbout);
2413}
2414
2415// Toolbar
2416////////////////////////////////////////////////////////////////////////////
2417void bncWindow::AddToolbar() {
2418 QToolBar* toolBar = new QToolBar;
2419 addToolBar(Qt::BottomToolBarArea, toolBar);
2420 toolBar->setMovable(false);
2421 toolBar->addAction(_actAddMountPoints);
2422 toolBar->addAction(_actDeleteMountPoints);
2423 toolBar->addAction(_actMapMountPoints);
2424 toolBar->addAction(_actStart);
2425 toolBar->addAction(_actStop);
2426 toolBar->addWidget(new QLabel(" "));
2427 toolBar->addAction(_actwhatsthis);
2428}
2429
2430// About
2431////////////////////////////////////////////////////////////////////////////
2432bncAboutDlg::bncAboutDlg(QWidget* parent) :
2433 QDialog(parent) {
2434
2435 QTextBrowser* tb = new QTextBrowser;
2436 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2437 tb->setSource(url);
2438 tb->setReadOnly(true);
2439
2440 int ww = QFontMetrics(font()).width('w');
2441 QPushButton* _closeButton = new QPushButton("Close");
2442 _closeButton->setMaximumWidth(10*ww);
2443 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2444
2445 QGridLayout* dlgLayout = new QGridLayout();
2446 QLabel* img = new QLabel();
2447 img->setPixmap(QPixmap(":ntrip-logo.png"));
2448 dlgLayout->addWidget(img, 0,0);
2449 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2450 dlgLayout->addWidget(tb,1,0,1,2);
2451 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2452
2453 setLayout(dlgLayout);
2454 resize(60*ww, 60*ww);
2455 setWindowTitle("About BNC");
2456 show();
2457}
2458
2459//
2460////////////////////////////////////////////////////////////////////////////
2461bncAboutDlg::~bncAboutDlg() {
2462
2463};
2464
2465// Flowchart
2466////////////////////////////////////////////////////////////////////////////
2467bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2468 QDialog(parent) {
2469
2470 int ww = QFontMetrics(font()).width('w');
2471 QPushButton* _closeButton = new QPushButton("Close");
2472 _closeButton->setMaximumWidth(10*ww);
2473 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2474
2475 QGridLayout* dlgLayout = new QGridLayout();
2476 QLabel* img = new QLabel();
2477 img->setPixmap(QPixmap(":bncflowchart.png"));
2478 dlgLayout->addWidget(img, 0,0);
2479 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2480
2481 setLayout(dlgLayout);
2482 setWindowTitle("Flow Chart");
2483 show();
2484}
2485
2486//
2487////////////////////////////////////////////////////////////////////////////
2488bncFlowchartDlg::~bncFlowchartDlg() {
2489};
2490
2491// Enable/Disable Widget (and change its color)
2492////////////////////////////////////////////////////////////////////////////
2493void bncWindow::enableWidget(bool enable, QWidget* widget) {
2494
2495 const static QPalette paletteWhite(QColor(255, 255, 255));
2496 const static QPalette paletteGray(QColor(230, 230, 230));
2497
2498 widget->setEnabled(enable);
2499 if (enable) {
2500 widget->setPalette(paletteWhite);
2501 }
2502 else {
2503 widget->setPalette(paletteGray);
2504 }
2505}
2506
2507// Bnc Text
2508////////////////////////////////////////////////////////////////////////////
2509void bncWindow::slotBncTextChanged(){
2510
2511 const static QPalette paletteWhite(QColor(255, 255, 255));
2512 const static QPalette paletteGray(QColor(230, 230, 230));
2513
2514 bool enable = true;
2515
2516 // Proxy
2517 //------
2518 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2519 enable = !_proxyHostLineEdit->text().isEmpty();
2520 enableWidget(enable, _proxyPortLineEdit);
2521 }
2522
2523 // RINEX Observations
2524 // ------------------
2525 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2526 enable = !_rnxPathLineEdit->text().isEmpty();
2527 enableWidget(enable, _rnxIntrComboBox);
2528 enableWidget(enable, _rnxSamplComboBox);
2529 enableWidget(enable, _rnxSkelExtComboBox);
2530 enableWidget(enable, _rnxSkelPathLineEdit);
2531 enableWidget(enable, _rnxFileCheckBox);
2532 enableWidget(enable, _rnxScrpLineEdit);
2533 enableWidget(enable, _rnxV2Priority);
2534 enableWidget(enable, _rnxV2CheckBox);
2535
2536 bool enable1 = true;
2537 enable1 = _rnxV2CheckBox->isChecked();
2538 if (enable && enable1) {
2539 enableWidget(true, _rnxV2Priority);
2540 }
2541 if (enable && !enable1) {
2542 enableWidget(false, _rnxV2Priority);
2543 }
2544 }
2545
2546 // RINEX Observations, Signal Priority
2547 // -----------------------------------
2548 if (sender() == 0 || sender() == _rnxV2CheckBox) {
2549 if (!_rnxPathLineEdit->text().isEmpty()) {
2550 enableWidget(enable, _rnxIntrComboBox);
2551 enable = _rnxV2CheckBox->isChecked();
2552 enableWidget(enable, _rnxV2Priority);
2553 }
2554 }
2555
2556 // RINEX Ephemeris
2557 // ---------------
2558 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2559 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2560 enableWidget(enable, _ephIntrComboBox);
2561 enableWidget(enable, _ephV2CheckBox);
2562 }
2563
2564 // Broadcast Corrections
2565 // ---------------------
2566 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2567 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2568 enableWidget(enable, _corrIntrComboBox);
2569 }
2570
2571 // Feed Engine
2572 // -----------
2573 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2574 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2575 enableWidget(enable, _outWaitSpinBox);
2576 enableWidget(enable, _outSamplComboBox);
2577 }
2578
2579 // Serial Output
2580 // -------------
2581 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2582 sender() == _serialAutoNMEAComboBox) {
2583 enable = !_serialMountPointLineEdit->text().isEmpty();
2584 enableWidget(enable, _serialPortNameLineEdit);
2585 enableWidget(enable, _serialBaudRateComboBox);
2586 enableWidget(enable, _serialParityComboBox);
2587 enableWidget(enable, _serialDataBitsComboBox);
2588 enableWidget(enable, _serialStopBitsComboBox);
2589 enableWidget(enable, _serialFlowControlComboBox);
2590 enableWidget(enable, _serialAutoNMEAComboBox);
2591 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() == "Auto";
2592 enableWidget(enable2, _serialFileNMEALineEdit);
2593 bool enable3 = enable && _serialAutoNMEAComboBox->currentText().contains("Manual");
2594 enableWidget(enable3, _serialHeightNMEALineEdit);
2595 enableWidget(enable3, _serialManualNMEASamplingSpinBox);
2596 }
2597
2598 // Outages
2599 // -------
2600 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2601 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2602 enableWidget(enable, _adviseFailSpinBox);
2603 enableWidget(enable, _adviseRecoSpinBox);
2604 enableWidget(enable, _adviseScriptLineEdit);
2605 }
2606
2607 // Miscellaneous
2608 // -------------
2609 if (sender() == 0 || sender() == _miscMountLineEdit) {
2610 enable = !_miscMountLineEdit->text().isEmpty();
2611 enableWidget(enable, _miscIntrComboBox);
2612 enableWidget(enable, _miscScanRTCMCheckBox);
2613 enableWidget(enable, _miscPortLineEdit);
2614 }
2615
2616 // Combine Corrections
2617 // -------------------
2618 if (sender() == 0 || sender() == _cmbTable) {
2619 int iRow = _cmbTable->rowCount();
2620 if (iRow > 0) {
2621 enableWidget(true, _cmbMethodComboBox);
2622 enableWidget(true, _cmbMaxresLineEdit);
2623 enableWidget(true, _cmbSamplSpinBox);
2624 enableWidget(true, _cmbGpsCheckBox);
2625 enableWidget(true, _cmbGloCheckBox);
2626 enableWidget(true, _cmbGalCheckBox);
2627 enableWidget(true, _cmbBdsCheckBox);
2628 enableWidget(true, _cmbQzssCheckBox);
2629 enableWidget(true, _cmbSbasCheckBox);
2630 enableWidget(true, _cmbIrnssCheckBox);
2631 }
2632 else {
2633 enableWidget(false, _cmbMethodComboBox);
2634 enableWidget(false, _cmbMaxresLineEdit);
2635 enableWidget(false, _cmbSamplSpinBox);
2636 enableWidget(false, _cmbGpsCheckBox);
2637 enableWidget(false, _cmbGloCheckBox);
2638 enableWidget(false, _cmbGalCheckBox);
2639 enableWidget(false, _cmbBdsCheckBox);
2640 enableWidget(false, _cmbQzssCheckBox);
2641 enableWidget(false, _cmbSbasCheckBox);
2642 enableWidget(false, _cmbIrnssCheckBox);
2643 }
2644 }
2645
2646 // Upload(clk)
2647 // -----------
2648 int iRow = _uploadTable->rowCount();
2649 if (iRow > 0) {
2650 enableWidget(true, _uploadIntrComboBox);
2651 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2652 enableWidget(true, _uploadSamplClkRnxSpinBox);
2653 enableWidget(true, _uploadSamplSp3SpinBox);
2654 enableWidget(true, _uploadAntexFile);
2655 }
2656 else {
2657 enableWidget(false, _uploadIntrComboBox);
2658 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2659 enableWidget(false, _uploadSamplClkRnxSpinBox);
2660 enableWidget(false, _uploadSamplSp3SpinBox);
2661 enableWidget(false, _uploadAntexFile);
2662 }
2663
2664 // Upload(eph)
2665 // -----------
2666 iRow = _uploadEphTable->rowCount();
2667 if (iRow > 0) {
2668 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2669 }
2670 else {
2671 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2672 }
2673
2674 // QC
2675 // --
2676 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2677 enable = !_reqcActionComboBox->currentText().isEmpty();
2678 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2679// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2680 enableWidget(enable, _reqcObsFileChooser);
2681 enableWidget(enable, _reqcNavFileChooser);
2682 enableWidget(enable, _reqcOutLogLineEdit);
2683 enableWidget(enable && enable10, _reqcEditOptionButton);
2684 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2685 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2686 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2687 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2688// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2689 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2690 }
2691
2692 // SP3 File Comparison
2693 // -------------------
2694 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2695 enable = !_sp3CompFileChooser->fileName().isEmpty();
2696 enableWidget(enable, _sp3CompLogLineEdit);
2697 enableWidget(enable, _sp3CompExclude);
2698 }
2699
2700 enableStartStop();
2701}
2702
2703//
2704////////////////////////////////////////////////////////////////////////////
2705void bncWindow::slotAddCmbRow() {
2706 int iRow = _cmbTable->rowCount();
2707 _cmbTable->insertRow(iRow);
2708 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2709 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2710 }
2711}
2712
2713//
2714////////////////////////////////////////////////////////////////////////////
2715void bncWindow::slotDelCmbRow() {
2716
2717 const static QPalette paletteWhite(QColor(255, 255, 255));
2718 const static QPalette paletteGray(QColor(230, 230, 230));
2719
2720 int nRows = _cmbTable->rowCount();
2721 bool flg[nRows];
2722 for (int iRow = 0; iRow < nRows; iRow++) {
2723 if (_cmbTable->item(iRow,1)->isSelected()) {
2724 flg[iRow] = true;
2725 }
2726 else {
2727 flg[iRow] = false;
2728 }
2729 }
2730 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2731 if (flg[iRow]) {
2732 _cmbTable->removeRow(iRow);
2733 }
2734 }
2735 nRows = _cmbTable->rowCount();
2736 if (nRows < 1) {
2737 enableWidget(false, _cmbMethodComboBox);
2738 enableWidget(false, _cmbMaxresLineEdit);
2739 enableWidget(false, _cmbSamplSpinBox);
2740 }
2741}
2742
2743//
2744////////////////////////////////////////////////////////////////////////////
2745void bncWindow::populateCmbTable() {
2746
2747 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2748 _cmbTable->removeRow(iRow);
2749 }
2750
2751 bncSettings settings;
2752
2753 int iRow = -1;
2754 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2755 while (it.hasNext()) {
2756 QStringList hlp = it.next().split(" ");
2757 if (hlp.size() > 2) {
2758 ++iRow;
2759 _cmbTable->insertRow(iRow);
2760 }
2761 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2762 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2763 }
2764 }
2765}
2766
2767//
2768////////////////////////////////////////////////////////////////////////////
2769void bncWindow::slotAddUploadRow() {
2770 int iRow = _uploadTable->rowCount();
2771 _uploadTable->insertRow(iRow);
2772 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2773 if (iCol == 3) {
2774 QComboBox* ntripversion = new QComboBox();
2775 ntripversion->setEditable(false);
2776 ntripversion->addItems(QString("1,2,2s").split(","));
2777 ntripversion->setFrame(false);
2778 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2779
2780 }
2781 else if (iCol == 4) {
2782 QLineEdit* user = new QLineEdit();
2783 user->setFrame(false);
2784 _uploadTable->setCellWidget(iRow, iCol, user);
2785 }
2786 else if (iCol == 5) {
2787 QLineEdit* passwd = new QLineEdit();
2788 passwd->setFrame(false);
2789 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2790 _uploadTable->setCellWidget(iRow, iCol, passwd);
2791 }
2792 else if (iCol == 6) {
2793 QComboBox* system = new QComboBox();
2794 system->setEditable(false);
2795 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2796 system->setFrame(false);
2797 _uploadTable->setCellWidget(iRow, iCol, system);
2798 }
2799 else if (iCol == 7) {
2800 QComboBox* format = new QComboBox();
2801 format->setEditable(false);
2802 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2803 format->setFrame(false);
2804 _uploadTable->setCellWidget(iRow, iCol, format);
2805 }
2806 else if (iCol == 8) {
2807 QCheckBox* com = new QCheckBox();
2808 _uploadTable->setCellWidget(iRow, iCol, com);
2809 }
2810 else if (iCol == 14) {
2811 bncTableItem* bncIt = new bncTableItem();
2812 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2813 _uploadTable->setItem(iRow, iCol, bncIt);
2814 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2815 }
2816 else {
2817 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2818 }
2819 }
2820}
2821
2822//
2823////////////////////////////////////////////////////////////////////////////
2824void bncWindow::slotDelUploadRow() {
2825 BNC_CORE->_uploadTableItems.clear();
2826 int nRows = _uploadTable->rowCount();
2827 bool flg[nRows];
2828 for (int iRow = 0; iRow < nRows; iRow++) {
2829 if (_uploadTable->item(iRow,1)->isSelected()) {
2830 flg[iRow] = true;
2831 }
2832 else {
2833 flg[iRow] = false;
2834 }
2835 }
2836 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2837 if (flg[iRow]) {
2838 _uploadTable->removeRow(iRow);
2839 }
2840 }
2841 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2842 BNC_CORE->_uploadTableItems[iRow] =
2843 (bncTableItem*) _uploadTable->item(iRow, 14);
2844 }
2845 nRows = _uploadTable->rowCount();
2846 if (nRows < 1) {
2847 enableWidget(false, _uploadIntrComboBox);
2848 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2849 enableWidget(false, _uploadSamplSp3SpinBox);
2850 enableWidget(false, _uploadSamplClkRnxSpinBox);
2851 enableWidget(false, _uploadAntexFile);
2852 }
2853}
2854
2855//
2856////////////////////////////////////////////////////////////////////////////
2857void bncWindow::populateUploadTable() {
2858 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2859 _uploadTable->removeRow(iRow);
2860 }
2861
2862 bncSettings settings;
2863
2864 int iRow = -1;
2865 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2866
2867 while (it.hasNext()) {
2868 QStringList hlp = it.next().split(",");
2869 if (hlp.size() > 6) {
2870 ++iRow;
2871 _uploadTable->insertRow(iRow);
2872 }
2873 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2874 if (iCol == 3) {
2875 QComboBox* ntripversion = new QComboBox();
2876 ntripversion->setEditable(false);
2877 ntripversion->addItems(QString("1,2,2s").split(","));
2878 ntripversion->setFrame(false);
2879 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
2880 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2881 }
2882 else if (iCol == 4) {
2883 QLineEdit* user = new QLineEdit();
2884 user->setFrame(false);
2885 user->setText(hlp[iCol]);
2886 _uploadTable->setCellWidget(iRow, iCol, user);
2887 }
2888 else if (iCol == 5) {
2889 QLineEdit* passwd = new QLineEdit();
2890 passwd->setFrame(false);
2891 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2892 passwd->setText(hlp[iCol]);
2893 _uploadTable->setCellWidget(iRow, iCol, passwd);
2894 }
2895 else if (iCol == 6) {
2896 QComboBox* system = new QComboBox();
2897 system->setEditable(false);
2898 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2899 system->setFrame(false);
2900 system->setCurrentIndex(system->findText(hlp[iCol]));
2901 _uploadTable->setCellWidget(iRow, iCol, system);
2902 }
2903 else if (iCol == 7) {
2904 QComboBox* format = new QComboBox();
2905 format->setEditable(false);
2906 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2907 format->setFrame(false);
2908 format->setCurrentIndex(format->findText(hlp[iCol]));
2909 _uploadTable->setCellWidget(iRow, iCol, format);
2910 }
2911 else if (iCol == 8) {
2912 QCheckBox* com = new QCheckBox();
2913 if (hlp[iCol].toInt() == Qt::Checked) {
2914 com->setCheckState(Qt::Checked);
2915 }
2916 _uploadTable->setCellWidget(iRow, iCol, com);
2917 }
2918 else if (iCol == 14) {
2919 bncTableItem* bncIt = new bncTableItem();
2920 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2921 _uploadTable->setItem(iRow, iCol, bncIt);
2922 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2923 }
2924 else {
2925 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2926 }
2927 }
2928 }
2929}
2930
2931//
2932////////////////////////////////////////////////////////////////////////////
2933void bncWindow::slotSetUploadTrafo() {
2934 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2935 dlg->exec();
2936 delete dlg;
2937}
2938
2939//
2940////////////////////////////////////////////////////////////////////////////
2941void bncWindow::slotAddUploadEphRow() {
2942 int iRow = _uploadEphTable->rowCount();
2943 _uploadEphTable->insertRow(iRow);
2944 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2945 if (iCol == 3) {
2946 QComboBox* ntripversion = new QComboBox();
2947 ntripversion->setEditable(false);
2948 ntripversion->addItems(QString("1,2,2s").split(","));
2949 ntripversion->setFrame(false);
2950 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
2951
2952 }
2953 else if (iCol == 4) {
2954 QLineEdit* user = new QLineEdit();
2955 user->setFrame(false);
2956 _uploadEphTable->setCellWidget(iRow, iCol, user);
2957 }
2958 else if (iCol == 5) {
2959 QLineEdit* passwd = new QLineEdit();
2960 passwd->setFrame(false);
2961 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2962 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
2963 }
2964 else if (iCol == 6) {
2965 QLineEdit* system = new QLineEdit();
2966 system->setFrame(false);
2967 _uploadEphTable->setCellWidget(iRow, iCol, system);
2968 }
2969 else if (iCol == 7) {
2970 bncTableItem* bncIt = new bncTableItem();
2971 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2972 _uploadEphTable->setItem(iRow, iCol, bncIt);
2973 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
2974 }
2975 else {
2976 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2977 }
2978 }
2979}
2980
2981//
2982////////////////////////////////////////////////////////////////////////////
2983void bncWindow::slotDelUploadEphRow() {
2984 BNC_CORE->_uploadTableItems.clear();
2985 int nRows = _uploadEphTable->rowCount();
2986 bool flg[nRows];
2987 for (int iRow = 0; iRow < nRows; iRow++) {
2988 if (_uploadEphTable->item(iRow,1)->isSelected()) {
2989 flg[iRow] = true;
2990 }
2991 else {
2992 flg[iRow] = false;
2993 }
2994 }
2995 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2996 if (flg[iRow]) {
2997 _uploadEphTable->removeRow(iRow);
2998 }
2999 }
3000 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
3001 BNC_CORE->_uploadTableItems[iRow] =
3002 (bncTableItem*) _uploadEphTable->item(iRow, 7);
3003 }
3004 nRows = _uploadEphTable->rowCount();
3005 if (nRows < 1) {
3006 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3007 }
3008}
3009
3010//
3011////////////////////////////////////////////////////////////////////////////
3012void bncWindow::populateUploadEphTable() {
3013 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3014 _uploadEphTable->removeRow(iRow);
3015 }
3016
3017 bncSettings settings;
3018
3019 int iRow = -1;
3020 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3021 while (it.hasNext()) {
3022 QStringList hlp = it.next().split(",");
3023 if (hlp.size() > 6) {
3024 ++iRow;
3025 _uploadEphTable->insertRow(iRow);
3026 }
3027 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3028 if (iCol == 3) {
3029 QComboBox* ntripversion = new QComboBox();
3030 ntripversion->setEditable(false);
3031 ntripversion->addItems(QString("1,2,2s").split(","));
3032 ntripversion->setFrame(false);
3033 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3034 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3035 }
3036 else if (iCol == 4) {
3037 QLineEdit* user = new QLineEdit();
3038 user->setFrame(false);
3039 _uploadEphTable->setCellWidget(iRow, iCol, user);
3040 }
3041 else if (iCol == 5) {
3042 QLineEdit* passwd = new QLineEdit();
3043 passwd->setFrame(false);
3044 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3045 passwd->setText(hlp[iCol]);
3046 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3047 }
3048 else if (iCol == 6) {
3049 QLineEdit* system = new QLineEdit();
3050 system->setFrame(false);
3051 system->setText(hlp[iCol]);
3052 _uploadEphTable->setCellWidget(iRow, iCol, system);
3053 }
3054 else if (iCol == 7) {
3055 bncTableItem* bncIt = new bncTableItem();
3056 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3057 _uploadEphTable->setItem(iRow, iCol, bncIt);
3058 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3059 }
3060 else {
3061 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3062 }
3063 }
3064 }
3065}
3066
3067
3068// Progress Bar Change
3069////////////////////////////////////////////////////////////////////////////
3070void bncWindow::slotPostProcessingProgress(int nEpo) {
3071 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3072}
3073
3074// Post-Processing Reqc Finished
3075////////////////////////////////////////////////////////////////////////////
3076void bncWindow::slotPostProcessingFinished() {
3077 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3078 _runningPPP = false;
3079 _runningEdit = false;
3080 _runningQC = false;
3081 _runningSp3Comp = false;
3082 _actStart->setText(tr("Sta&rt"));
3083 enableStartStop();
3084}
3085
3086// Edit teqc-like editing options
3087////////////////////////////////////////////////////////////////////////////
3088void bncWindow::slotReqcEditOption() {
3089 saveOptions();
3090 reqcDlg* dlg = new reqcDlg(this);
3091 dlg->move(this->pos().x()+50, this->pos().y()+50);
3092 dlg->exec();
3093 delete dlg;
3094}
3095
3096// Enable/Disable Start and Stop Buttons
3097////////////////////////////////////////////////////////////////////////////
3098void bncWindow::enableStartStop() {
3099 if ( running() ) {
3100 _actStart->setEnabled(false);
3101 if (_runningRealTime || _runningPPP) {
3102 _actStop->setEnabled(true);
3103 }
3104 }
3105 else {
3106 _actStart->setEnabled(true);
3107 _actStop->setEnabled(false);
3108 }
3109}
3110
3111// Show Map
3112////////////////////////////////////////////////////////////////////////////
3113void bncWindow::slotMapMountPoints() {
3114 saveOptions();
3115 t_bncMap* bncMap = new t_bncMap(this);
3116 bncMap->setMinimumSize(800, 600);
3117 bncMap->setWindowTitle("Selected Mountpoints");
3118
3119 bncSettings settings;
3120 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3121 while (it.hasNext()) {
3122 QStringList hlp = it.next().split(" ");
3123 if (hlp.size() < 5) continue;
3124 QUrl url(hlp[0]);
3125 double latDeg = hlp[3].toDouble();
3126 double lonDeg = hlp[4].toDouble();
3127 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3128 }
3129
3130 bncMap->show();
3131}
3132
3133// Show Map
3134////////////////////////////////////////////////////////////////////////////
3135void bncWindow::slotMapPPP() {
3136#ifdef QT_WEBENGINE
3137 saveOptions();
3138 enableWidget(false, _pppWidgets._mapWinButton);
3139 enableWidget(false, _pppWidgets._mapWinDotSize);
3140 enableWidget(false, _pppWidgets._mapWinDotColor);
3141
3142 if (!_mapWin) {
3143 _mapWin = new bncMapWin(this);
3144 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3145 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3146 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3147 }
3148 _mapWin->show();
3149#else
3150 QMessageBox::information(this, "Information",
3151 "Qt Library compiled without QT_WEBENGINE");
3152#endif
3153}
3154
3155// Show Map
3156////////////////////////////////////////////////////////////////////////////
3157void bncWindow::slotMapPPPClosed() {
3158#ifdef QT_WEBENGINE
3159 enableWidget(true, _pppWidgets._mapWinButton);
3160 enableWidget(true, _pppWidgets._mapWinDotSize);
3161 enableWidget(true, _pppWidgets._mapWinDotColor);
3162 if (_mapWin) {
3163 QListIterator<bncGetThread*> it(_threads);
3164 while (it.hasNext()) {
3165 bncGetThread* thread = it.next();
3166 thread->disconnect(_mapWin);
3167 }
3168 _mapWin->deleteLater();
3169 _mapWin = 0;
3170 }
3171#endif
3172}
Note: See TracBrowser for help on using the repository browser.