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

Last change on this file since 10091 was 10091, checked in by stuerze, 11 months ago

same changes for future developments towards station individual navigation files

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