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

Last change on this file since 9420 was 9418, checked in by stuerze, 4 years ago


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