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

Last change on this file since 11075 was 11075, checked in by stuerze, 5 days ago

ssr qc

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