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

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

minor changes

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