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

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

consideration of client SSL certificates, if they are available

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