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

Last change on this file since 9538 was 9538, checked in by stuerze, 2 years ago

update regarding PPP: pseudo obs tropo completely removed

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