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

Last change on this file since 10911 was 10911, checked in by stuerze, 4 months ago

minor changes to solve an issue under windows operation system

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