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

Last change on this file since 10911 was 10911, checked in by stuerze, 7 days ago

minor changes to solve an issue under windows operation system

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