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

Last change on this file since 10950 was 10945, checked in by stuerze, 8 days ago

Added a Minimum Elevation parameter to BNC's RINEX Editing & QC feature

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