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

Last change on this file since 10239 was 10239, checked in by stuerze, 6 months ago

An option 'Wait for full clock epoch' is added to combination procedure

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