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

Last change on this file since 11136 was 11136, checked in by stuerze, 2 weeks ago

Added:
EPH RINEX files can be written now per station like observation files and in PPP mode the Broadcast stream can be specified

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