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

Last change on this file since 9909 was 9908, checked in by stuerze, 2 years ago

minor changes towards IGS20

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