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

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

minor changes regarding PPP

File size: 165.8 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <QAction>
44#include <QApplication>
45#include <QCheckBox>
46#include <QCloseEvent>
47#include <QComboBox>
48#include <QDialog>
49#include <QFontDialog>
50#include <QGridLayout>
51#include <QHeaderView>
52#include <QLabel>
53#include <QLineEdit>
54#include <QMenu>
55#include <QMenuBar>
56#include <QMessageBox>
57#include <QPushButton>
58#include <QRadioButton>
59#include <QSpinBox>
60#include <QTableWidgetItem>
61#include <QTextEdit>
62#include <QToolBar>
63
64#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 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
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</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying 'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying 'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GPS data. <i>[key: PPP/lcGPS]</i></p>"));
1450 _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GLONASS data. <i>[key: PPP/lcGLONASS]</i></p>"));
1451 _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use Galileo data. <i>[key: PPP/lcGalileo]</i></p>"));
1452 _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data from two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use BDS data. <i>[key: PPP/lcBDS]</i></p>"));
1453 _pppWidgets._modelObs->setWhatsThis(tr("<p>Specify which kind of PPP model you want to use:</p><p><ul><li>Iopnosphere-free PPP</li><li>Uncombined PPP</li><li>PPP-RTK (recommended for test purposes only because of an incomplete standardized SSR model)</li><li>DCM with Code or Phase Biases</li><li></p><p>[key: PPP/modelObs]</i></p>"));
1454 _pppWidgets._pseudoObs->setWhatsThis(tr("<p>Specify which kind of pseudo observations you want to use. Please note, pseudo observations regarding the Ionosphere are useful, as soon as the ionospheric information is more accurate than the code data accuracy. <i>[key: PPP/pseudoObs]</i></p>"));
1455 _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of C1 code observations to a PPP solution from combined code and phase data. 1.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma C1 = 1.0' <i>[key: PPP/sigmaC1]</i></p>"));
1456 _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of 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>"));
1457 _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. 3.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 3.0' <i>[key: PPP/sigmaGIM]</i></p>"));
1458 _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>"));
1459 _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS C1 code observations in a PPP solution. '3.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Rex C1 = 3.0' <i>[key: PPP/maxResC1]</i></p>"));
1460 _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS 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>"));
1461 _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>"));
1462 _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>"));
1463 _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>"));
1464 _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>"));
1465
1466 // WhatsThis, Combine Corrections
1467 // ------------------------------
1468 _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>"));
1469 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1470 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1471 _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>"));
1472 _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>"));
1473 _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>"));
1474 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS corrections shall be combined. <i>[key: cmbGps]</i></p>"));
1475 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1476 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1477 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1478 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1479 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1480 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1481
1482 // WhatsThis, Upload Corrections
1483 // -----------------------------
1484 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) in different SSR formats. You may have a situation where clocks and orbits come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified Ntrip Broadcaster Host and Port</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris Corrections if you specify correction streams in the 'Combine Corrections' table.</p><p>To fill the 'Upload Corrections' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the Ntrip Broadcaster IP port (default is 80), the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference System (e.g. IGS14) for outgoing clock and orbit corrections.</p><p>Select a target SSR format (e.g. IGS-SSR) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BNCOUTPUT${V3PROD}.sp3<br>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Specify a path for saving generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system: /home/user/BNCOUTPUT${V3PROD}.clk<br>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
1485 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1486 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1487 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3 and Clock RINEX files. <i>[key: uploadIntr]</i></p>"));
1488 _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>"));
1489 _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>"));
1490 _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>"));
1491 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>"));
1492 _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>"));
1493
1494 // WhatsThis, Upload Ephemeris
1495 // ---------------------------
1496 _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the Ntrip Broadcaster IP port (default is 80), the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphHost]</i></p>"));
1497 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1498 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1499 _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>"));
1500
1501 // WhatsThis, Streams Canvas
1502 // -------------------------
1503 _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>"));
1504 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1505 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1506 _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>"));
1507 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1508 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1509
1510 // WhatsThis, Log Canvas
1511 // ---------------------
1512 _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>"));
1513 _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>"));
1514 _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>"));
1515 _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>"));
1516
1517
1518 // Enable/Disable all Widgets
1519 // --------------------------
1520 slotBncTextChanged();
1521 enableStartStop();
1522
1523 // Auto start
1524 // ----------
1525 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1526 slotStart();
1527 }
1528}
1529
1530// Destructor
1531////////////////////////////////////////////////////////////////////////////
1532bncWindow::~bncWindow() {
1533 if (_caster) {
1534 delete _caster; BNC_CORE->setCaster(0);
1535 }
1536 if (_casterEph) {
1537 delete _casterEph;
1538 }
1539 delete _bncFigureLate;
1540 delete _bncFigurePPP;
1541 delete _actHelp;
1542 delete _actAbout;
1543 delete _actFlowchart;
1544 delete _actFontSel;
1545 delete _actSaveOpt;
1546 delete _actQuit;
1547 delete _actAddMountPoints;
1548 delete _actDeleteMountPoints;
1549 delete _actMapMountPoints;
1550 delete _actStart;
1551 delete _actStop;
1552 delete _actwhatsthis;
1553 delete _proxyHostLineEdit;
1554 delete _proxyPortLineEdit;
1555 delete _sslCaCertPathLineEdit;
1556 delete _sslIgnoreErrorsCheckBox;
1557 delete _logFileLineEdit;
1558 delete _rawOutFileLineEdit;
1559 delete _rnxAppendCheckBox;
1560 delete _onTheFlyComboBox;
1561 delete _autoStartCheckBox;
1562 delete _rnxPathLineEdit;
1563 delete _rnxIntrComboBox;
1564 delete _rnxSamplComboBox;
1565 delete _rnxSkelExtComboBox;
1566 delete _rnxSkelPathLineEdit;
1567 delete _rnxFileCheckBox;
1568 delete _rnxScrpLineEdit;
1569 delete _rnxV2CheckBox;
1570 delete _rnxV2Priority;
1571 delete _ephPathLineEdit;
1572 delete _ephIntrComboBox;
1573 delete _ephOutPortLineEdit;
1574 delete _ephV2CheckBox;
1575 delete _corrPathLineEdit;
1576 delete _corrIntrComboBox;
1577 delete _corrPortLineEdit;
1578 delete _outPortLineEdit;
1579 delete _outWaitSpinBox;
1580 delete _outSamplComboBox;
1581 delete _outFileLineEdit;
1582 delete _outUPortLineEdit;
1583 delete _outLockTimeCheckBox;
1584 delete _serialMountPointLineEdit;
1585 delete _serialPortNameLineEdit;
1586 delete _serialBaudRateComboBox;
1587 delete _serialFlowControlComboBox;
1588 delete _serialDataBitsComboBox;
1589 delete _serialParityComboBox;
1590 delete _serialStopBitsComboBox;
1591 delete _serialAutoNMEAComboBox;
1592 delete _serialFileNMEALineEdit;
1593 delete _serialHeightNMEALineEdit;
1594 delete _serialManualNMEASamplingSpinBox;
1595 delete _adviseObsRateComboBox;
1596 delete _adviseFailSpinBox;
1597 delete _adviseRecoSpinBox;
1598 delete _adviseScriptLineEdit;
1599 delete _miscMountLineEdit;
1600 delete _miscPortLineEdit;
1601 delete _miscIntrComboBox;
1602 delete _miscScanRTCMCheckBox;
1603 _mountPointsTable->deleteLater();
1604 delete _log;
1605 delete _loggroup;
1606 _cmbTable->deleteLater();
1607 delete _cmbMaxresLineEdit;
1608 delete _cmbSamplSpinBox;
1609 delete _cmbMethodComboBox;
1610 delete _cmbGpsCheckBox;
1611 delete _cmbGloCheckBox;
1612 delete _cmbGalCheckBox;
1613 delete _cmbBdsCheckBox;
1614 delete _cmbQzssCheckBox;
1615 delete _cmbSbasCheckBox;
1616 delete _cmbIrnssCheckBox;
1617 _uploadEphTable->deleteLater();
1618 delete _uploadSamplRtcmEphCorrSpinBox;
1619 _uploadTable->deleteLater();
1620 delete _uploadIntrComboBox;
1621 delete _uploadAntexFile;
1622 delete _uploadSamplRtcmEphSpinBox;
1623 delete _uploadSamplSp3SpinBox;
1624 delete _uploadSamplClkRnxSpinBox;
1625 delete _reqcActionComboBox;
1626 delete _reqcObsFileChooser;
1627 delete _reqcNavFileChooser;
1628 delete _reqcOutObsLineEdit;
1629 delete _reqcOutNavLineEdit;
1630 delete _reqcOutLogLineEdit;
1631 delete _reqcPlotDirLineEdit;
1632 delete _reqcSkyPlotSignals;
1633 delete _reqcLogSummaryOnly;
1634 delete _reqcEditOptionButton;
1635 delete _sp3CompFileChooser;
1636 delete _sp3CompExclude;
1637 delete _sp3CompLogLineEdit;
1638 //delete _canvas;
1639}
1640
1641//
1642////////////////////////////////////////////////////////////////////////////
1643void bncWindow::populateMountPointsTable() {
1644
1645 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1646 _mountPointsTable->removeRow(iRow);
1647 }
1648
1649 bncSettings settings;
1650
1651 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1652 int iRow = 0;
1653 while (it.hasNext()) {
1654 QStringList hlp = it.next().split(" ");
1655 if (hlp.size() < 7) continue;
1656 _mountPointsTable->insertRow(iRow);
1657
1658 QUrl url(hlp[0]);
1659
1660 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1661 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1662 QString nmea(hlp[5]);
1663 if (hlp[6] == "S") {
1664 fullPath = hlp[0].replace(0,2,"");
1665 }
1666 QString ntripVersion = "2";
1667 if (hlp.size() >= 7) {
1668 ntripVersion = (hlp[6]);
1669 }
1670
1671 QTableWidgetItem* it;
1672 it = new QTableWidgetItem(url.userInfo());
1673 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1674 _mountPointsTable->setItem(iRow, 0, it);
1675
1676 it = new QTableWidgetItem(fullPath);
1677 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1678 _mountPointsTable->setItem(iRow, 1, it);
1679
1680 it = new QTableWidgetItem(format);
1681 _mountPointsTable->setItem(iRow, 2, it);
1682
1683 it = new QTableWidgetItem(country);
1684 _mountPointsTable->setItem(iRow, 3, it);
1685
1686 if (nmea == "yes") {
1687 it = new QTableWidgetItem(latitude);
1688 _mountPointsTable->setItem(iRow, 4, it);
1689 it = new QTableWidgetItem(longitude);
1690 _mountPointsTable->setItem(iRow, 5, it);
1691 } else {
1692 it = new QTableWidgetItem(latitude);
1693 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1694 _mountPointsTable->setItem(iRow, 4, it);
1695
1696 it = new QTableWidgetItem(longitude);
1697 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1698 _mountPointsTable->setItem(iRow, 5, it);
1699 }
1700
1701 it = new QTableWidgetItem(nmea);
1702 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1703 _mountPointsTable->setItem(iRow, 6, it);
1704
1705 it = new QTableWidgetItem(ntripVersion);
1706 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1707 _mountPointsTable->setItem(iRow, 7, it);
1708
1709 bncTableItem* bncIt = new bncTableItem();
1710 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1711 _mountPointsTable->setItem(iRow, 8, bncIt);
1712
1713 iRow++;
1714 }
1715
1716 _mountPointsTable->sortItems(1);
1717
1718 enableStartStop();
1719}
1720
1721// Retrieve Table
1722////////////////////////////////////////////////////////////////////////////
1723void bncWindow::slotAddMountPoints() {
1724
1725 bncSettings settings;
1726 QString proxyHost = settings.value("proxyHost").toString();
1727 int proxyPort = settings.value("proxyPort").toInt();
1728 if (proxyHost != _proxyHostLineEdit->text() ||
1729 proxyPort != _proxyPortLineEdit->text().toInt()) {
1730 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1731 "changed. Use the new ones?",
1732 QMessageBox::Yes, QMessageBox::No,
1733 QMessageBox::NoButton);
1734 if (iRet == QMessageBox::Yes) {
1735 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1736 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1737 }
1738 }
1739
1740 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1741 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1742
1743 QMessageBox msgBox;
1744 msgBox.setIcon(QMessageBox::Question);
1745 msgBox.setWindowTitle("Add Stream");
1746 msgBox.setText("Add stream(s) coming from:");
1747
1748 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1749 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1750 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1751 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1752 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1753
1754 msgBox.exec();
1755
1756 if (msgBox.clickedButton() == buttonNtrip) {
1757 bncTableDlg* dlg = new bncTableDlg(this);
1758 dlg->move(this->pos().x()+50, this->pos().y()+50);
1759 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1760 this, SLOT(slotNewMountPoints(QStringList*)));
1761 dlg->exec();
1762 delete dlg;
1763 } else if (msgBox.clickedButton() == buttonIP) {
1764 bncIpPort* ipp = new bncIpPort(this);
1765 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1766 this, SLOT(slotNewMountPoints(QStringList*)));
1767 ipp->exec();
1768 delete ipp;
1769 } else if (msgBox.clickedButton() == buttonUDP) {
1770 bncUdpPort* udp = new bncUdpPort(this);
1771 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1772 this, SLOT(slotNewMountPoints(QStringList*)));
1773 udp->exec();
1774 delete udp;
1775 } else if (msgBox.clickedButton() == buttonSerial) {
1776 bncSerialPort* sep = new bncSerialPort(this);
1777 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1778 this, SLOT(slotNewMountPoints(QStringList*)));
1779 sep->exec();
1780 delete sep;
1781 } else if (msgBox.clickedButton() == buttonCancel) {
1782 // Cancel
1783 }
1784
1785 enableStartStop();
1786}
1787
1788// Delete Selected Mount Points
1789////////////////////////////////////////////////////////////////////////////
1790void bncWindow::slotDeleteMountPoints() {
1791
1792 int nRows = _mountPointsTable->rowCount();
1793 bool flg[nRows];
1794 for (int iRow = 0; iRow < nRows; iRow++) {
1795 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1796 flg[iRow] = true;
1797 }
1798 else {
1799 flg[iRow] = false;
1800 }
1801 }
1802 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1803 if (flg[iRow]) {
1804 _mountPointsTable->removeRow(iRow);
1805 }
1806 }
1807 _actDeleteMountPoints->setEnabled(false);
1808
1809 enableStartStop();
1810}
1811
1812// New Mount Points Selected
1813////////////////////////////////////////////////////////////////////////////
1814void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1815 int iRow = 0;
1816 QListIterator<QString> it(*mountPoints);
1817 while (it.hasNext()) {
1818 QStringList hlp = it.next().split(" ");
1819 QUrl url(hlp[0]);
1820 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1821 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1822 QString nmea(hlp[5]);
1823 if (hlp[6] == "S") {
1824 fullPath = hlp[0].replace(0,2,"");
1825 }
1826 QString ntripVersion = "2";
1827 if (hlp.size() >= 7) {
1828 ntripVersion = (hlp[6]);
1829 }
1830
1831 _mountPointsTable->insertRow(iRow);
1832
1833 QTableWidgetItem* it;
1834 it = new QTableWidgetItem(url.userInfo());
1835 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1836 _mountPointsTable->setItem(iRow, 0, it);
1837
1838 it = new QTableWidgetItem(fullPath);
1839 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1840 _mountPointsTable->setItem(iRow, 1, it);
1841
1842 it = new QTableWidgetItem(format);
1843 _mountPointsTable->setItem(iRow, 2, it);
1844
1845 it = new QTableWidgetItem(country);
1846 _mountPointsTable->setItem(iRow, 3, it);
1847
1848 if (nmea == "yes") {
1849 it = new QTableWidgetItem(latitude);
1850 _mountPointsTable->setItem(iRow, 4, it);
1851 it = new QTableWidgetItem(longitude);
1852 _mountPointsTable->setItem(iRow, 5, it);
1853 } else {
1854 it = new QTableWidgetItem(latitude);
1855 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1856 _mountPointsTable->setItem(iRow, 4, it);
1857 it = new QTableWidgetItem(longitude);
1858 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1859 _mountPointsTable->setItem(iRow, 5, it);
1860 }
1861
1862 it = new QTableWidgetItem(nmea);
1863 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1864 _mountPointsTable->setItem(iRow, 6, it);
1865
1866 it = new QTableWidgetItem(ntripVersion);
1867 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1868 _mountPointsTable->setItem(iRow, 7, it);
1869
1870 bncTableItem* bncIt = new bncTableItem();
1871 _mountPointsTable->setItem(iRow, 8, bncIt);
1872
1873 iRow++;
1874 }
1875 _mountPointsTable->hideColumn(0);
1876 _mountPointsTable->hideColumn(3);
1877 _mountPointsTable->sortItems(1);
1878 delete mountPoints;
1879
1880 enableStartStop();
1881}
1882
1883// Save Options (serialize)
1884////////////////////////////////////////////////////////////////////////////
1885void bncWindow::slotSaveOptions() {
1886 saveOptions();
1887 bncSettings settings;
1888 settings.sync();
1889}
1890
1891// Save Options (memory only)
1892////////////////////////////////////////////////////////////////////////////
1893void bncWindow::saveOptions() {
1894
1895 QStringList mountPoints;
1896 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1897
1898 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1899 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1900 "@" + _mountPointsTable->item(iRow, 1)->text() );
1901
1902 mountPoints.append(url.toString() + " " +
1903 _mountPointsTable->item(iRow, 2)->text()
1904 + " " + _mountPointsTable->item(iRow, 3)->text()
1905 + " " + _mountPointsTable->item(iRow, 4)->text()
1906 + " " + _mountPointsTable->item(iRow, 5)->text()
1907 + " " + _mountPointsTable->item(iRow, 6)->text()
1908 + " " + _mountPointsTable->item(iRow, 7)->text());
1909 } else {
1910 mountPoints.append(
1911 "//" + _mountPointsTable->item(iRow, 1)->text()
1912 + " " + _mountPointsTable->item(iRow, 2)->text()
1913 + " " + _mountPointsTable->item(iRow, 3)->text()
1914 + " " + _mountPointsTable->item(iRow, 4)->text()
1915 + " " + _mountPointsTable->item(iRow, 5)->text()
1916 + " " + _mountPointsTable->item(iRow, 6)->text()
1917 + " " + _mountPointsTable->item(iRow, 7)->text());
1918 }
1919 }
1920
1921 QStringList cmbStreams;
1922 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1923 QString hlp;
1924 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1925 if (_cmbTable->item(iRow, iCol)) {
1926 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1927 }
1928 }
1929 if (!hlp.isEmpty()) {
1930 cmbStreams << hlp;
1931 }
1932 }
1933
1934 QStringList uploadMountpointsOut;
1935 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1936 QString hlp;
1937 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1938 if (_uploadTable->cellWidget(iRow, iCol) &&
1939 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
1940 if (iCol == 3) {
1941 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1942 hlp += ntripversion->currentText() + ",";
1943 }
1944 else if (iCol == 4 ) {
1945 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1946 hlp += user->text() + ",";
1947 }
1948 else if (iCol == 5) {
1949 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1950 hlp += passwd->text() + ",";
1951 }
1952 else if (iCol == 6) {
1953 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1954 hlp += system->currentText() + ",";
1955 }
1956 else if (iCol == 7) {
1957 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1958 hlp += format->currentText() + ",";
1959 }
1960 else if (iCol == 8) {
1961 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1962 QString state; state.setNum(com->checkState());
1963 hlp += state + ",";
1964 }
1965 }
1966 else if (_uploadTable->item(iRow, iCol)) {
1967 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1968 }
1969 }
1970 if (!hlp.isEmpty()) {
1971 uploadMountpointsOut << hlp;
1972 }
1973 }
1974
1975 QStringList uploadEphMountpointsOut;
1976 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
1977 QString hlp;
1978 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
1979 if (_uploadEphTable->cellWidget(iRow, iCol) &&
1980 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
1981 if (iCol == 3) {
1982 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
1983 hlp += ntripversion->currentText() + ",";
1984 }
1985 else if (iCol == 4 ) {
1986 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
1987 hlp += user->text() + ",";
1988 }
1989 else if (iCol == 5) {
1990 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
1991 hlp += passwd->text() + ",";
1992 }
1993 else if (iCol == 6) {
1994 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
1995 hlp += system->text() + ",";
1996 }
1997 }
1998 else if (_uploadEphTable->item(iRow, iCol)) {
1999 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2000 }
2001 }
2002 if (!hlp.isEmpty()) {
2003 uploadEphMountpointsOut << hlp;
2004 }
2005 }
2006
2007 bncSettings settings;
2008
2009 settings.setValue("startTab", _aogroup->currentIndex());
2010 settings.setValue("statusTab", _loggroup->currentIndex());
2011 settings.setValue("mountPoints", mountPoints);
2012// Network
2013 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2014 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2015 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2016 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2017// General
2018 settings.setValue("logFile", _logFileLineEdit->text());
2019 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2020 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2021 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2022 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2023// RINEX Observations
2024 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2025 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2026 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2027 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2028 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2029 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2030 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2031 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2032 settings.setValue("rnxV2", _rnxV2CheckBox->checkState());
2033// RINEX Ephemeris
2034 settings.setValue("ephPath", _ephPathLineEdit->text());
2035 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2036 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2037 settings.setValue("ephV2", _ephV2CheckBox->checkState());
2038// Broadcast Corrections
2039 settings.setValue("corrPath", _corrPathLineEdit->text());
2040 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2041 settings.setValue("corrPort", _corrPortLineEdit->text());
2042// Feed Engine
2043 settings.setValue("outPort", _outPortLineEdit->text());
2044 settings.setValue("outWait", _outWaitSpinBox->value());
2045 settings.setValue("outSampl", _outSamplComboBox->currentText());
2046 settings.setValue("outFile", _outFileLineEdit->text());
2047 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2048// Serial Output
2049 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2050 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2051 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2052 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2053 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2054 settings.setValue("serialParity", _serialParityComboBox->currentText());
2055 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2056 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2057 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2058 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2059 settings.setValue("serialManualNMEASampling", _serialManualNMEASamplingSpinBox->value());
2060// Outages
2061 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2062 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2063 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2064 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2065// Miscellaneous
2066 settings.setValue("miscMount", _miscMountLineEdit->text());
2067 settings.setValue("miscPort", _miscPortLineEdit->text());
2068 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2069 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2070// Reqc
2071 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2072 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2073 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2074 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2075 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2076 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2077 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2078 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2079 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2080// SP3 Comparison
2081 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2082 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2083 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2084// Combine Corrections
2085 if (!cmbStreams.isEmpty()) {
2086 settings.setValue("cmbStreams", cmbStreams);
2087 }
2088 else {
2089 settings.setValue("cmbStreams", "");
2090 }
2091 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2092 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2093 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2094 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2095 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2096 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2097 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2098 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2099 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2100 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2101
2102// Upload Corrections
2103 if (!uploadMountpointsOut.isEmpty()) {
2104 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2105 }
2106 else {
2107 settings.setValue("uploadMountpointsOut", "");
2108 }
2109 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2110 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2111 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
2112 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2113 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2114// Upload Ephemeris
2115 if (!uploadEphMountpointsOut.isEmpty()) {
2116 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2117 }
2118 else {
2119 settings.setValue("uploadEphMountpointsOut", "");
2120 }
2121 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2122
2123 if (_caster) {
2124 _caster->readMountPoints();
2125 }
2126
2127 _pppWidgets.saveOptions();
2128}
2129
2130// All get slots terminated
2131////////////////////////////////////////////////////////////////////////////
2132void bncWindow::slotGetThreadsFinished() {
2133 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2134 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2135 delete _casterEph; _casterEph = 0;
2136 _runningRealTime = false;
2137}
2138
2139// Start It!
2140////////////////////////////////////////////////////////////////////////////
2141void bncWindow::slotStart() {
2142 saveOptions();
2143 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2144 _runningPPP = true;
2145 enableStartStop();
2146 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2147 BNC_CORE->startPPP();
2148 _bncFigurePPP->reset();
2149 }
2150 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2151 if (_reqcActionComboBox->currentText() == "Analyze") {
2152 _runningQC = true;
2153 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2154 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2155 reqcAnalyze->start();
2156 }
2157 else {
2158 _runningEdit = true;
2159 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2160 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2161 reqcEdit->start();
2162 }
2163 enableStartStop();
2164 }
2165 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2166 _runningSp3Comp = true;
2167 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2168 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2169 sp3Comp->start();
2170 enableStartStop();
2171 }
2172 else {
2173 startRealTime();
2174 BNC_CORE->startPPP();
2175 }
2176}
2177
2178// Start Real-Time (Retrieve Data etc.)
2179////////////////////////////////////////////////////////////////////////////
2180void bncWindow::startRealTime() {
2181
2182 _runningRealTime = true;
2183
2184 _bncFigurePPP->reset();
2185
2186 _actDeleteMountPoints->setEnabled(false);
2187
2188 enableStartStop();
2189
2190 _caster = new bncCaster();
2191
2192 BNC_CORE->setCaster(_caster);
2193 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2194 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2195 BNC_CORE->initCombination();
2196
2197 connect(_caster, SIGNAL(getThreadsFinished()),
2198 this, SLOT(slotGetThreadsFinished()));
2199
2200 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
2201 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2202
2203 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2204
2205 bncSettings settings;
2206
2207 // Active panels
2208 // -------------
2209 if (!_rnxPathLineEdit->text().isEmpty())
2210 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2211 if (!_ephPathLineEdit->text().isEmpty())
2212 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2213 if (!_corrPathLineEdit->text().isEmpty())
2214 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2215 if (!_outPortLineEdit->text().isEmpty())
2216 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2217 if (!_serialMountPointLineEdit->text().isEmpty())
2218 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2219 if (!_adviseObsRateComboBox->currentText().isEmpty())
2220 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2221 if (!_miscMountLineEdit->text().isEmpty())
2222 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2223 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2224 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2225 if (_cmbTable->rowCount() > 0)
2226 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2227 if (_uploadTable->rowCount() > 0)
2228 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2229 if (_uploadEphTable->rowCount() > 0)
2230 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2231
2232 QDir rnxdir(settings.value("rnxPath").toString());
2233 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2234
2235 QString rnx_file = settings.value("rnxScript").toString();
2236 if ( !rnx_file.isEmpty() ) {
2237 QFile rnxfile(settings.value("rnxScript").toString());
2238 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2239 }
2240
2241 QDir ephdir(settings.value("ephPath").toString());
2242 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2243
2244 QDir corrdir(settings.value("corrPath").toString());
2245 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2246
2247 QString advise_file = settings.value("adviseScript").toString();
2248 if ( !advise_file.isEmpty() ) {
2249 QFile advisefile(settings.value("adviseScript").toString());
2250 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2251 }
2252
2253 _caster->readMountPoints();
2254
2255 _casterEph = new bncEphUploadCaster();
2256}
2257
2258// Retrieve Data
2259////////////////////////////////////////////////////////////////////////////
2260void bncWindow::slotStop() {
2261 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2262 QMessageBox::Yes, QMessageBox::No,
2263 QMessageBox::NoButton);
2264 if (iRet == QMessageBox::Yes) {
2265 BNC_CORE->stopPPP();
2266 BNC_CORE->stopCombination();
2267 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2268 delete _casterEph; _casterEph = 0;
2269 _runningRealTime = false;
2270 _runningPPP = false;
2271 enableStartStop();
2272 }
2273}
2274
2275// Close Application gracefully
2276////////////////////////////////////////////////////////////////////////////
2277void bncWindow::closeEvent(QCloseEvent* event) {
2278
2279 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2280 QMessageBox::Yes, QMessageBox::No,
2281 QMessageBox::Cancel);
2282
2283 if (iRet == QMessageBox::Cancel) {
2284 event->ignore();
2285 return;
2286 }
2287 else if (iRet == QMessageBox::Yes) {
2288 slotSaveOptions();
2289 }
2290
2291 BNC_CORE->stopPPP();
2292
2293 QMainWindow::closeEvent(event);
2294}
2295
2296// User changed the selection of mountPoints
2297////////////////////////////////////////////////////////////////////////////
2298void bncWindow::slotSelectionChanged() {
2299 if (_mountPointsTable->selectedItems().isEmpty()) {
2300 _actDeleteMountPoints->setEnabled(false);
2301 }
2302 else {
2303 _actDeleteMountPoints->setEnabled(true);
2304 }
2305}
2306
2307// Display Program Messages
2308////////////////////////////////////////////////////////////////////////////
2309void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2310 if (showOnScreen ) {
2311 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2312 }
2313}
2314
2315// About Message
2316////////////////////////////////////////////////////////////////////////////
2317void bncWindow::slotAbout() {
2318 new bncAboutDlg(0);
2319}
2320
2321//Flowchart
2322////////////////////////////////////////////////////////////////////////////
2323void bncWindow::slotFlowchart() {
2324 new bncFlowchartDlg(0);
2325}
2326
2327// Help Window
2328////////////////////////////////////////////////////////////////////////////
2329void bncWindow::slotHelp() {
2330 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2331 new bncHlpDlg(0, url);
2332}
2333
2334// Select Fonts
2335////////////////////////////////////////////////////////////////////////////
2336void bncWindow::slotFontSel() {
2337 bool ok;
2338 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2339 if (ok) {
2340 bncSettings settings;
2341 settings.setValue("font", newFont.toString());
2342 QApplication::setFont(newFont);
2343 int ww = QFontMetrics(newFont).width('w');
2344 setMinimumSize(60*ww, 80*ww);
2345 resize(60*ww, 80*ww);
2346 }
2347}
2348
2349// Whats This Help
2350void bncWindow::slotWhatsThis() {
2351 QWhatsThis::enterWhatsThisMode();
2352}
2353
2354//
2355////////////////////////////////////////////////////////////////////////////
2356void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2357 _threads = threads;
2358
2359 _bncFigure->updateMountPoints();
2360 _bncFigureLate->updateMountPoints();
2361
2362 populateMountPointsTable();
2363 bncSettings settings;
2364 _outSamplComboBox->findText(settings.value("outSampl").toString());
2365 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2366 QListIterator<bncGetThread*> iTh(threads);
2367 while (iTh.hasNext()) {
2368 bncGetThread* thread = iTh.next();
2369 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2370 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2371 "@" + _mountPointsTable->item(iRow, 1)->text() );
2372 if (url == thread->mountPoint() &&
2373 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2374 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2375 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2376 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2377 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2378 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2379 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2380 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2381 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2382 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2383 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2384 break;
2385 }
2386 }
2387 }
2388}
2389
2390//
2391////////////////////////////////////////////////////////////////////////////
2392void bncWindow::CreateMenu() {
2393 // Create Menus
2394 // ------------
2395 _menuFile = menuBar()->addMenu(tr("&File"));
2396 _menuFile->addAction(_actFontSel);
2397 _menuFile->addSeparator();
2398 _menuFile->addAction(_actSaveOpt);
2399 _menuFile->addSeparator();
2400 _menuFile->addAction(_actQuit);
2401
2402 _menuHlp = menuBar()->addMenu(tr("&Help"));
2403 _menuHlp->addAction(_actHelp);
2404 _menuHlp->addAction(_actFlowchart);
2405 _menuHlp->addAction(_actAbout);
2406}
2407
2408// Toolbar
2409////////////////////////////////////////////////////////////////////////////
2410void bncWindow::AddToolbar() {
2411 QToolBar* toolBar = new QToolBar;
2412 addToolBar(Qt::BottomToolBarArea, toolBar);
2413 toolBar->setMovable(false);
2414 toolBar->addAction(_actAddMountPoints);
2415 toolBar->addAction(_actDeleteMountPoints);
2416 toolBar->addAction(_actMapMountPoints);
2417 toolBar->addAction(_actStart);
2418 toolBar->addAction(_actStop);
2419 toolBar->addWidget(new QLabel(" "));
2420 toolBar->addAction(_actwhatsthis);
2421}
2422
2423// About
2424////////////////////////////////////////////////////////////////////////////
2425bncAboutDlg::bncAboutDlg(QWidget* parent) :
2426 QDialog(parent) {
2427
2428 QTextBrowser* tb = new QTextBrowser;
2429 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2430 tb->setSource(url);
2431 tb->setReadOnly(true);
2432
2433 int ww = QFontMetrics(font()).width('w');
2434 QPushButton* _closeButton = new QPushButton("Close");
2435 _closeButton->setMaximumWidth(10*ww);
2436 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2437
2438 QGridLayout* dlgLayout = new QGridLayout();
2439 QLabel* img = new QLabel();
2440 img->setPixmap(QPixmap(":ntrip-logo.png"));
2441 dlgLayout->addWidget(img, 0,0);
2442 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2443 dlgLayout->addWidget(tb,1,0,1,2);
2444 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2445
2446 setLayout(dlgLayout);
2447 resize(60*ww, 60*ww);
2448 setWindowTitle("About BNC");
2449 show();
2450}
2451
2452//
2453////////////////////////////////////////////////////////////////////////////
2454bncAboutDlg::~bncAboutDlg() {
2455
2456};
2457
2458// Flowchart
2459////////////////////////////////////////////////////////////////////////////
2460bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2461 QDialog(parent) {
2462
2463 int ww = QFontMetrics(font()).width('w');
2464 QPushButton* _closeButton = new QPushButton("Close");
2465 _closeButton->setMaximumWidth(10*ww);
2466 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2467
2468 QGridLayout* dlgLayout = new QGridLayout();
2469 QLabel* img = new QLabel();
2470 img->setPixmap(QPixmap(":bncflowchart.png"));
2471 dlgLayout->addWidget(img, 0,0);
2472 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2473
2474 setLayout(dlgLayout);
2475 setWindowTitle("Flow Chart");
2476 show();
2477}
2478
2479//
2480////////////////////////////////////////////////////////////////////////////
2481bncFlowchartDlg::~bncFlowchartDlg() {
2482};
2483
2484// Enable/Disable Widget (and change its color)
2485////////////////////////////////////////////////////////////////////////////
2486void bncWindow::enableWidget(bool enable, QWidget* widget) {
2487
2488 const static QPalette paletteWhite(QColor(255, 255, 255));
2489 const static QPalette paletteGray(QColor(230, 230, 230));
2490
2491 widget->setEnabled(enable);
2492 if (enable) {
2493 widget->setPalette(paletteWhite);
2494 }
2495 else {
2496 widget->setPalette(paletteGray);
2497 }
2498}
2499
2500// Bnc Text
2501////////////////////////////////////////////////////////////////////////////
2502void bncWindow::slotBncTextChanged(){
2503
2504 const static QPalette paletteWhite(QColor(255, 255, 255));
2505 const static QPalette paletteGray(QColor(230, 230, 230));
2506
2507 bool enable = true;
2508
2509 // Proxy
2510 //------
2511 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2512 enable = !_proxyHostLineEdit->text().isEmpty();
2513 enableWidget(enable, _proxyPortLineEdit);
2514 }
2515
2516 // RINEX Observations
2517 // ------------------
2518 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2519 enable = !_rnxPathLineEdit->text().isEmpty();
2520 enableWidget(enable, _rnxIntrComboBox);
2521 enableWidget(enable, _rnxSamplComboBox);
2522 enableWidget(enable, _rnxSkelExtComboBox);
2523 enableWidget(enable, _rnxSkelPathLineEdit);
2524 enableWidget(enable, _rnxFileCheckBox);
2525 enableWidget(enable, _rnxScrpLineEdit);
2526 enableWidget(enable, _rnxV2Priority);
2527 enableWidget(enable, _rnxV2CheckBox);
2528
2529 bool enable1 = true;
2530 enable1 = _rnxV2CheckBox->isChecked();
2531 if (enable && enable1) {
2532 enableWidget(true, _rnxV2Priority);
2533 }
2534 if (enable && !enable1) {
2535 enableWidget(false, _rnxV2Priority);
2536 }
2537 }
2538
2539 // RINEX Observations, Signal Priority
2540 // -----------------------------------
2541 if (sender() == 0 || sender() == _rnxV2CheckBox) {
2542 if (!_rnxPathLineEdit->text().isEmpty()) {
2543 enableWidget(enable, _rnxIntrComboBox);
2544 enable = _rnxV2CheckBox->isChecked();
2545 enableWidget(enable, _rnxV2Priority);
2546 }
2547 }
2548
2549 // RINEX Ephemeris
2550 // ---------------
2551 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2552 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2553 enableWidget(enable, _ephIntrComboBox);
2554 enableWidget(enable, _ephV2CheckBox);
2555 }
2556
2557 // Broadcast Corrections
2558 // ---------------------
2559 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2560 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2561 enableWidget(enable, _corrIntrComboBox);
2562 }
2563
2564 // Feed Engine
2565 // -----------
2566 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2567 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2568 enableWidget(enable, _outWaitSpinBox);
2569 enableWidget(enable, _outSamplComboBox);
2570 }
2571
2572 // Serial Output
2573 // -------------
2574 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2575 sender() == _serialAutoNMEAComboBox) {
2576 enable = !_serialMountPointLineEdit->text().isEmpty();
2577 enableWidget(enable, _serialPortNameLineEdit);
2578 enableWidget(enable, _serialBaudRateComboBox);
2579 enableWidget(enable, _serialParityComboBox);
2580 enableWidget(enable, _serialDataBitsComboBox);
2581 enableWidget(enable, _serialStopBitsComboBox);
2582 enableWidget(enable, _serialFlowControlComboBox);
2583 enableWidget(enable, _serialAutoNMEAComboBox);
2584 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() == "Auto";
2585 enableWidget(enable2, _serialFileNMEALineEdit);
2586 bool enable3 = enable && _serialAutoNMEAComboBox->currentText().contains("Manual");
2587 enableWidget(enable3, _serialHeightNMEALineEdit);
2588 enableWidget(enable3, _serialManualNMEASamplingSpinBox);
2589 }
2590
2591 // Outages
2592 // -------
2593 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2594 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2595 enableWidget(enable, _adviseFailSpinBox);
2596 enableWidget(enable, _adviseRecoSpinBox);
2597 enableWidget(enable, _adviseScriptLineEdit);
2598 }
2599
2600 // Miscellaneous
2601 // -------------
2602 if (sender() == 0 || sender() == _miscMountLineEdit) {
2603 enable = !_miscMountLineEdit->text().isEmpty();
2604 enableWidget(enable, _miscIntrComboBox);
2605 enableWidget(enable, _miscScanRTCMCheckBox);
2606 enableWidget(enable, _miscPortLineEdit);
2607 }
2608
2609 // Combine Corrections
2610 // -------------------
2611 if (sender() == 0 || sender() == _cmbTable) {
2612 int iRow = _cmbTable->rowCount();
2613 if (iRow > 0) {
2614 enableWidget(true, _cmbMethodComboBox);
2615 enableWidget(true, _cmbMaxresLineEdit);
2616 enableWidget(true, _cmbSamplSpinBox);
2617 enableWidget(true, _cmbGpsCheckBox);
2618 enableWidget(true, _cmbGloCheckBox);
2619 enableWidget(true, _cmbGalCheckBox);
2620 enableWidget(true, _cmbBdsCheckBox);
2621 enableWidget(true, _cmbQzssCheckBox);
2622 enableWidget(true, _cmbSbasCheckBox);
2623 enableWidget(true, _cmbIrnssCheckBox);
2624 }
2625 else {
2626 enableWidget(false, _cmbMethodComboBox);
2627 enableWidget(false, _cmbMaxresLineEdit);
2628 enableWidget(false, _cmbSamplSpinBox);
2629 enableWidget(false, _cmbGpsCheckBox);
2630 enableWidget(false, _cmbGloCheckBox);
2631 enableWidget(false, _cmbGalCheckBox);
2632 enableWidget(false, _cmbBdsCheckBox);
2633 enableWidget(false, _cmbQzssCheckBox);
2634 enableWidget(false, _cmbSbasCheckBox);
2635 enableWidget(false, _cmbIrnssCheckBox);
2636 }
2637 }
2638
2639 // Upload(clk)
2640 // -----------
2641 int iRow = _uploadTable->rowCount();
2642 if (iRow > 0) {
2643 enableWidget(true, _uploadIntrComboBox);
2644 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2645 enableWidget(true, _uploadSamplClkRnxSpinBox);
2646 enableWidget(true, _uploadSamplSp3SpinBox);
2647 enableWidget(true, _uploadAntexFile);
2648 }
2649 else {
2650 enableWidget(false, _uploadIntrComboBox);
2651 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2652 enableWidget(false, _uploadSamplClkRnxSpinBox);
2653 enableWidget(false, _uploadSamplSp3SpinBox);
2654 enableWidget(false, _uploadAntexFile);
2655 }
2656
2657 // Upload(eph)
2658 // -----------
2659 iRow = _uploadEphTable->rowCount();
2660 if (iRow > 0) {
2661 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2662 }
2663 else {
2664 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2665 }
2666
2667 // QC
2668 // --
2669 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2670 enable = !_reqcActionComboBox->currentText().isEmpty();
2671 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2672// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2673 enableWidget(enable, _reqcObsFileChooser);
2674 enableWidget(enable, _reqcNavFileChooser);
2675 enableWidget(enable, _reqcOutLogLineEdit);
2676 enableWidget(enable && enable10, _reqcEditOptionButton);
2677 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2678 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2679 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2680 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2681// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2682 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2683 }
2684
2685 // SP3 File Comparison
2686 // -------------------
2687 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2688 enable = !_sp3CompFileChooser->fileName().isEmpty();
2689 enableWidget(enable, _sp3CompLogLineEdit);
2690 enableWidget(enable, _sp3CompExclude);
2691 }
2692
2693 enableStartStop();
2694}
2695
2696//
2697////////////////////////////////////////////////////////////////////////////
2698void bncWindow::slotAddCmbRow() {
2699 int iRow = _cmbTable->rowCount();
2700 _cmbTable->insertRow(iRow);
2701 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2702 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2703 }
2704}
2705
2706//
2707////////////////////////////////////////////////////////////////////////////
2708void bncWindow::slotDelCmbRow() {
2709
2710 const static QPalette paletteWhite(QColor(255, 255, 255));
2711 const static QPalette paletteGray(QColor(230, 230, 230));
2712
2713 int nRows = _cmbTable->rowCount();
2714 bool flg[nRows];
2715 for (int iRow = 0; iRow < nRows; iRow++) {
2716 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2717 flg[iRow] = true;
2718 }
2719 else {
2720 flg[iRow] = false;
2721 }
2722 }
2723 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2724 if (flg[iRow]) {
2725 _cmbTable->removeRow(iRow);
2726 }
2727 }
2728 nRows = _cmbTable->rowCount();
2729 if (nRows < 1) {
2730 enableWidget(false, _cmbMethodComboBox);
2731 enableWidget(false, _cmbMaxresLineEdit);
2732 enableWidget(false, _cmbSamplSpinBox);
2733 }
2734}
2735
2736//
2737////////////////////////////////////////////////////////////////////////////
2738void bncWindow::populateCmbTable() {
2739
2740 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2741 _cmbTable->removeRow(iRow);
2742 }
2743
2744 bncSettings settings;
2745
2746 int iRow = -1;
2747 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2748 while (it.hasNext()) {
2749 QStringList hlp = it.next().split(" ");
2750 if (hlp.size() > 2) {
2751 ++iRow;
2752 _cmbTable->insertRow(iRow);
2753 }
2754 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2755 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2756 }
2757 }
2758}
2759
2760//
2761////////////////////////////////////////////////////////////////////////////
2762void bncWindow::slotAddUploadRow() {
2763 int iRow = _uploadTable->rowCount();
2764 _uploadTable->insertRow(iRow);
2765 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2766 if (iCol == 3) {
2767 QComboBox* ntripversion = new QComboBox();
2768 ntripversion->setEditable(false);
2769 ntripversion->addItems(QString("1,2,2s").split(","));
2770 ntripversion->setFrame(false);
2771 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2772
2773 }
2774 else if (iCol == 4) {
2775 QLineEdit* user = new QLineEdit();
2776 user->setFrame(false);
2777 _uploadTable->setCellWidget(iRow, iCol, user);
2778 }
2779 else if (iCol == 5) {
2780 QLineEdit* passwd = new QLineEdit();
2781 passwd->setFrame(false);
2782 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2783 _uploadTable->setCellWidget(iRow, iCol, passwd);
2784 }
2785 else if (iCol == 6) {
2786 QComboBox* system = new QComboBox();
2787 system->setEditable(false);
2788 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2789 system->setFrame(false);
2790 _uploadTable->setCellWidget(iRow, iCol, system);
2791 }
2792 else if (iCol == 7) {
2793 QComboBox* format = new QComboBox();
2794 format->setEditable(false);
2795 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2796 format->setFrame(false);
2797 _uploadTable->setCellWidget(iRow, iCol, format);
2798 }
2799 else if (iCol == 8) {
2800 QCheckBox* com = new QCheckBox();
2801 _uploadTable->setCellWidget(iRow, iCol, com);
2802 }
2803 else if (iCol == 14) {
2804 bncTableItem* bncIt = new bncTableItem();
2805 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2806 _uploadTable->setItem(iRow, iCol, bncIt);
2807 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2808 }
2809 else {
2810 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2811 }
2812 }
2813}
2814
2815//
2816////////////////////////////////////////////////////////////////////////////
2817void bncWindow::slotDelUploadRow() {
2818 BNC_CORE->_uploadTableItems.clear();
2819 int nRows = _uploadTable->rowCount();
2820 bool flg[nRows];
2821 for (int iRow = 0; iRow < nRows; iRow++) {
2822 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2823 flg[iRow] = true;
2824 }
2825 else {
2826 flg[iRow] = false;
2827 }
2828 }
2829 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2830 if (flg[iRow]) {
2831 _uploadTable->removeRow(iRow);
2832 }
2833 }
2834 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2835 BNC_CORE->_uploadTableItems[iRow] =
2836 (bncTableItem*) _uploadTable->item(iRow, 14);
2837 }
2838 nRows = _uploadTable->rowCount();
2839 if (nRows < 1) {
2840 enableWidget(false, _uploadIntrComboBox);
2841 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2842 enableWidget(false, _uploadSamplSp3SpinBox);
2843 enableWidget(false, _uploadSamplClkRnxSpinBox);
2844 enableWidget(false, _uploadAntexFile);
2845 }
2846}
2847
2848//
2849////////////////////////////////////////////////////////////////////////////
2850void bncWindow::populateUploadTable() {
2851 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2852 _uploadTable->removeRow(iRow);
2853 }
2854
2855 bncSettings settings;
2856
2857 int iRow = -1;
2858 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2859
2860 while (it.hasNext()) {
2861 QStringList hlp = it.next().split(",");
2862 if (hlp.size() > 6) {
2863 ++iRow;
2864 _uploadTable->insertRow(iRow);
2865 }
2866 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2867 if (iCol == 3) {
2868 QComboBox* ntripversion = new QComboBox();
2869 ntripversion->setEditable(false);
2870 ntripversion->addItems(QString("1,2,2s").split(","));
2871 ntripversion->setFrame(false);
2872 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
2873 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2874 }
2875 else if (iCol == 4) {
2876 QLineEdit* user = new QLineEdit();
2877 user->setFrame(false);
2878 user->setText(hlp[iCol]);
2879 _uploadTable->setCellWidget(iRow, iCol, user);
2880 }
2881 else if (iCol == 5) {
2882 QLineEdit* passwd = new QLineEdit();
2883 passwd->setFrame(false);
2884 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2885 passwd->setText(hlp[iCol]);
2886 _uploadTable->setCellWidget(iRow, iCol, passwd);
2887 }
2888 else if (iCol == 6) {
2889 QComboBox* system = new QComboBox();
2890 system->setEditable(false);
2891 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2892 system->setFrame(false);
2893 system->setCurrentIndex(system->findText(hlp[iCol]));
2894 _uploadTable->setCellWidget(iRow, iCol, system);
2895 }
2896 else if (iCol == 7) {
2897 QComboBox* format = new QComboBox();
2898 format->setEditable(false);
2899 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2900 format->setFrame(false);
2901 format->setCurrentIndex(format->findText(hlp[iCol]));
2902 _uploadTable->setCellWidget(iRow, iCol, format);
2903 }
2904 else if (iCol == 8) {
2905 QCheckBox* com = new QCheckBox();
2906 if (hlp[iCol].toInt() == Qt::Checked) {
2907 com->setCheckState(Qt::Checked);
2908 }
2909 _uploadTable->setCellWidget(iRow, iCol, com);
2910 }
2911 else if (iCol == 14) {
2912 bncTableItem* bncIt = new bncTableItem();
2913 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2914 _uploadTable->setItem(iRow, iCol, bncIt);
2915 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2916 }
2917 else {
2918 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2919 }
2920 }
2921 }
2922}
2923
2924//
2925////////////////////////////////////////////////////////////////////////////
2926void bncWindow::slotSetUploadTrafo() {
2927 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2928 dlg->exec();
2929 delete dlg;
2930}
2931
2932//
2933////////////////////////////////////////////////////////////////////////////
2934void bncWindow::slotAddUploadEphRow() {
2935 int iRow = _uploadEphTable->rowCount();
2936 _uploadEphTable->insertRow(iRow);
2937 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2938 if (iCol == 3) {
2939 QComboBox* ntripversion = new QComboBox();
2940 ntripversion->setEditable(false);
2941 ntripversion->addItems(QString("1,2,2s").split(","));
2942 ntripversion->setFrame(false);
2943 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
2944
2945 }
2946 else if (iCol == 4) {
2947 QLineEdit* user = new QLineEdit();
2948 user->setFrame(false);
2949 _uploadEphTable->setCellWidget(iRow, iCol, user);
2950 }
2951 else if (iCol == 5) {
2952 QLineEdit* passwd = new QLineEdit();
2953 passwd->setFrame(false);
2954 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2955 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
2956 }
2957 else if (iCol == 6) {
2958 QLineEdit* system = new QLineEdit();
2959 system->setFrame(false);
2960 _uploadEphTable->setCellWidget(iRow, iCol, system);
2961 }
2962 else if (iCol == 7) {
2963 bncTableItem* bncIt = new bncTableItem();
2964 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2965 _uploadEphTable->setItem(iRow, iCol, bncIt);
2966 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
2967 }
2968 else {
2969 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2970 }
2971 }
2972}
2973
2974//
2975////////////////////////////////////////////////////////////////////////////
2976void bncWindow::slotDelUploadEphRow() {
2977 BNC_CORE->_uploadTableItems.clear();
2978 int nRows = _uploadEphTable->rowCount();
2979 bool flg[nRows];
2980 for (int iRow = 0; iRow < nRows; iRow++) {
2981 if (_uploadEphTable->isItemSelected(_uploadEphTable->item(iRow,1))) {
2982 flg[iRow] = true;
2983 }
2984 else {
2985 flg[iRow] = false;
2986 }
2987 }
2988 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2989 if (flg[iRow]) {
2990 _uploadEphTable->removeRow(iRow);
2991 }
2992 }
2993 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2994 BNC_CORE->_uploadTableItems[iRow] =
2995 (bncTableItem*) _uploadEphTable->item(iRow, 7);
2996 }
2997 nRows = _uploadEphTable->rowCount();
2998 if (nRows < 1) {
2999 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3000 }
3001}
3002
3003//
3004////////////////////////////////////////////////////////////////////////////
3005void bncWindow::populateUploadEphTable() {
3006 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3007 _uploadEphTable->removeRow(iRow);
3008 }
3009
3010 bncSettings settings;
3011
3012 int iRow = -1;
3013 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3014 while (it.hasNext()) {
3015 QStringList hlp = it.next().split(",");
3016 if (hlp.size() > 6) {
3017 ++iRow;
3018 _uploadEphTable->insertRow(iRow);
3019 }
3020 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3021 if (iCol == 3) {
3022 QComboBox* ntripversion = new QComboBox();
3023 ntripversion->setEditable(false);
3024 ntripversion->addItems(QString("1,2,2s").split(","));
3025 ntripversion->setFrame(false);
3026 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3027 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3028 }
3029 else if (iCol == 4) {
3030 QLineEdit* user = new QLineEdit();
3031 user->setFrame(false);
3032 _uploadEphTable->setCellWidget(iRow, iCol, user);
3033 }
3034 else if (iCol == 5) {
3035 QLineEdit* passwd = new QLineEdit();
3036 passwd->setFrame(false);
3037 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3038 passwd->setText(hlp[iCol]);
3039 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3040 }
3041 else if (iCol == 6) {
3042 QLineEdit* system = new QLineEdit();
3043 system->setFrame(false);
3044 system->setText(hlp[iCol]);
3045 _uploadEphTable->setCellWidget(iRow, iCol, system);
3046 }
3047 else if (iCol == 7) {
3048 bncTableItem* bncIt = new bncTableItem();
3049 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3050 _uploadEphTable->setItem(iRow, iCol, bncIt);
3051 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3052 }
3053 else {
3054 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3055 }
3056 }
3057 }
3058}
3059
3060
3061// Progress Bar Change
3062////////////////////////////////////////////////////////////////////////////
3063void bncWindow::slotPostProcessingProgress(int nEpo) {
3064 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3065}
3066
3067// Post-Processing Reqc Finished
3068////////////////////////////////////////////////////////////////////////////
3069void bncWindow::slotPostProcessingFinished() {
3070 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3071 _runningPPP = false;
3072 _runningEdit = false;
3073 _runningQC = false;
3074 _runningSp3Comp = false;
3075 _actStart->setText(tr("Sta&rt"));
3076 enableStartStop();
3077}
3078
3079// Edit teqc-like editing options
3080////////////////////////////////////////////////////////////////////////////
3081void bncWindow::slotReqcEditOption() {
3082 saveOptions();
3083 reqcDlg* dlg = new reqcDlg(this);
3084 dlg->move(this->pos().x()+50, this->pos().y()+50);
3085 dlg->exec();
3086 delete dlg;
3087}
3088
3089// Enable/Disable Start and Stop Buttons
3090////////////////////////////////////////////////////////////////////////////
3091void bncWindow::enableStartStop() {
3092 if ( running() ) {
3093 _actStart->setEnabled(false);
3094 if (_runningRealTime || _runningPPP) {
3095 _actStop->setEnabled(true);
3096 }
3097 }
3098 else {
3099 _actStart->setEnabled(true);
3100 _actStop->setEnabled(false);
3101 }
3102}
3103
3104// Show Map
3105////////////////////////////////////////////////////////////////////////////
3106void bncWindow::slotMapMountPoints() {
3107 saveOptions();
3108 t_bncMap* bncMap = new t_bncMap(this);
3109 bncMap->setMinimumSize(800, 600);
3110 bncMap->setWindowTitle("Selected Mountpoints");
3111
3112 bncSettings settings;
3113 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3114 while (it.hasNext()) {
3115 QStringList hlp = it.next().split(" ");
3116 if (hlp.size() < 5) continue;
3117 QUrl url(hlp[0]);
3118 double latDeg = hlp[3].toDouble();
3119 double lonDeg = hlp[4].toDouble();
3120 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3121 }
3122
3123 bncMap->show();
3124}
3125
3126// Show Map
3127////////////////////////////////////////////////////////////////////////////
3128void bncWindow::slotMapPPP() {
3129#ifdef QT_WEBENGINE
3130 saveOptions();
3131 enableWidget(false, _pppWidgets._mapWinButton);
3132 enableWidget(false, _pppWidgets._mapWinDotSize);
3133 enableWidget(false, _pppWidgets._mapWinDotColor);
3134
3135 if (!_mapWin) {
3136 _mapWin = new bncMapWin(this);
3137 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3138 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3139 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3140 }
3141 _mapWin->show();
3142#else
3143 QMessageBox::information(this, "Information",
3144 "Qt Library compiled without QT_WEBENGINE");
3145#endif
3146}
3147
3148// Show Map
3149////////////////////////////////////////////////////////////////////////////
3150void bncWindow::slotMapPPPClosed() {
3151#ifdef QT_WEBENGINE
3152 enableWidget(true, _pppWidgets._mapWinButton);
3153 enableWidget(true, _pppWidgets._mapWinDotSize);
3154 enableWidget(true, _pppWidgets._mapWinDotColor);
3155 if (_mapWin) {
3156 QListIterator<bncGetThread*> it(_threads);
3157 while (it.hasNext()) {
3158 bncGetThread* thread = it.next();
3159 thread->disconnect(_mapWin);
3160 }
3161 _mapWin->deleteLater();
3162 _mapWin = 0;
3163 }
3164#endif
3165}
Note: See TracBrowser for help on using the repository browser.