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

Last change on this file was 10667, checked in by stuerze, 4 weeks ago

minor changes

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