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

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

consideration of incoming Code Biases during clock combination

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