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

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

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