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

Last change on this file since 9960 was 9960, checked in by stuerze, 15 months ago

minor changes to be msvc compatible

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