source: ntrip/trunk/BNC/bncwindow.cpp@ 3635

Last change on this file since 3635 was 3631, checked in by mervart, 12 years ago
File size: 113.4 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 <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "bncpostprocess.h"
65
66using namespace std;
67
68// Constructor
69////////////////////////////////////////////////////////////////////////////
70bncWindow::bncWindow() {
71
72 _caster = 0;
73 _casterEph = 0;
74
75 _bncFigure = new bncFigure(this);
76 _bncFigureLate = new bncFigureLate(this);
77 _bncFigurePPP = new bncFigurePPP(this);
78
79 int ww = QFontMetrics(this->font()).width('w');
80
81 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
82
83 setMinimumSize(85*ww, 65*ww);
84
85 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
86
87 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
88 this, SLOT(slotWindowMessage(QByteArray,bool)));
89
90 // Create Actions
91 // --------------
92 _actHelp = new QAction(tr("&Help Contents"),this);
93 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
94
95 _actAbout = new QAction(tr("&About BNC"),this);
96 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
97
98 _actFlowchart = new QAction(tr("&Flow Chart"),this);
99 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
100
101 _actFontSel = new QAction(tr("Select &Font"),this);
102 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
103
104 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
105 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
106
107 _actQuit = new QAction(tr("&Quit"),this);
108 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
109
110 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
111 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
112
113 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
114 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
115 _actDeleteMountPoints->setEnabled(false);
116
117 _actGetData = new QAction(tr("Sta&rt"),this);
118 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
119
120 _actPostProcessing = new QAction(tr("Start PP"),this);
121 connect(_actPostProcessing, SIGNAL(triggered()), SLOT(slotStartPostProcessing()));
122
123 _postProgressBar = new QProgressBar;
124 _postProgressBar->setMinimum(0);
125 _postProgressBar->setMaximum(100);
126 _postProgressBar->setMinimumWidth(15*ww);
127 _postProgressBar->setMaximumWidth(15*ww);
128
129 _actStop = new QAction(tr("Sto&p"),this);
130 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
131 _actStop->setEnabled(false);
132
133 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
134 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
135
136 CreateMenu();
137 AddToolbar();
138
139 bncSettings settings;
140
141 // Netowrk Options
142 // ---------------
143 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
144 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
145
146 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
147 this, SLOT(slotBncTextChanged()));
148
149 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
150 _ignoreSslErrorsCheckBox = new QCheckBox();
151 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
152 settings.value("ignoreSslErrors").toInt()));
153
154 // General Options
155 // ---------------
156 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
157 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
158 _rnxAppendCheckBox = new QCheckBox();
159 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
160 settings.value("rnxAppend").toInt()));
161 _onTheFlyComboBox = new QComboBox();
162 _onTheFlyComboBox->setEditable(false);
163 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
164 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
165 if (ii != -1) {
166 _onTheFlyComboBox->setCurrentIndex(ii);
167 }
168 _autoStartCheckBox = new QCheckBox();
169 _autoStartCheckBox->setCheckState(Qt::CheckState(
170 settings.value("autoStart").toInt()));
171
172 // RINEX Observations Options
173 // --------------------------
174 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
175 _rnxIntrComboBox = new QComboBox();
176 _rnxIntrComboBox->setEditable(false);
177 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
178 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
179 if (ii != -1) {
180 _rnxIntrComboBox->setCurrentIndex(ii);
181 }
182 _rnxSamplSpinBox = new QSpinBox();
183 _rnxSamplSpinBox->setMinimum(0);
184 _rnxSamplSpinBox->setMaximum(60);
185 _rnxSamplSpinBox->setSingleStep(5);
186 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
187 _rnxSamplSpinBox->setSuffix(" sec");
188 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
189 _rnxSkelLineEdit->setMaximumWidth(5*ww);
190 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
191 _rnxV3CheckBox = new QCheckBox();
192 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
193
194 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
195 this, SLOT(slotBncTextChanged()));
196
197 // RINEX Ephemeris Options
198 // -----------------------
199 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
200 _ephIntrComboBox = new QComboBox();
201 _ephIntrComboBox->setEditable(false);
202 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
203 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
204 if (jj != -1) {
205 _ephIntrComboBox->setCurrentIndex(jj);
206 }
207 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
208 _ephV3CheckBox = new QCheckBox();
209 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
210
211 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
212 this, SLOT(slotBncTextChanged()));
213
214 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
215 this, SLOT(slotBncTextChanged()));
216
217 // Broadcast Corrections Options
218 // -----------------------------
219 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
220 _corrIntrComboBox = new QComboBox();
221 _corrIntrComboBox->setEditable(false);
222 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
223 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
224 if (mm != -1) {
225 _corrIntrComboBox->setCurrentIndex(mm);
226 }
227 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
228 _corrTimeSpinBox = new QSpinBox();
229 _corrTimeSpinBox->setMinimum(0);
230 _corrTimeSpinBox->setMaximum(60);
231 _corrTimeSpinBox->setSingleStep(1);
232 _corrTimeSpinBox->setSuffix(" sec");
233 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
234
235 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
236 this, SLOT(slotBncTextChanged()));
237
238 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
239 this, SLOT(slotBncTextChanged()));
240
241 // Feed Engine Options
242 // -------------------
243 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
244 _waitTimeSpinBox = new QSpinBox();
245 _waitTimeSpinBox->setMinimum(1);
246 _waitTimeSpinBox->setMaximum(30);
247 _waitTimeSpinBox->setSingleStep(1);
248 _waitTimeSpinBox->setSuffix(" sec");
249 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
250 _binSamplSpinBox = new QSpinBox();
251 _binSamplSpinBox->setMinimum(0);
252 _binSamplSpinBox->setMaximum(60);
253 _binSamplSpinBox->setSingleStep(5);
254 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
255 _binSamplSpinBox->setSuffix(" sec");
256 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
257 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
258
259 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
260 this, SLOT(slotBncTextChanged()));
261
262 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
263 this, SLOT(slotBncTextChanged()));
264
265 // Serial Output Options
266 // ---------------------
267 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
268 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
269 _serialBaudRateComboBox = new QComboBox();
270 _serialBaudRateComboBox->addItems(QString("110,300,600,"
271 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
272 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
273 if (kk != -1) {
274 _serialBaudRateComboBox->setCurrentIndex(kk);
275 }
276 _serialFlowControlComboBox = new QComboBox();
277 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
278 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
279 if (kk != -1) {
280 _serialFlowControlComboBox->setCurrentIndex(kk);
281 }
282 _serialDataBitsComboBox = new QComboBox();
283 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
284 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
285 if (kk != -1) {
286 _serialDataBitsComboBox->setCurrentIndex(kk);
287 }
288 _serialParityComboBox = new QComboBox();
289 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
290 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
291 if (kk != -1) {
292 _serialParityComboBox->setCurrentIndex(kk);
293 }
294 _serialStopBitsComboBox = new QComboBox();
295 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
296 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
297 if (kk != -1) {
298 _serialStopBitsComboBox->setCurrentIndex(kk);
299 }
300 _serialAutoNMEAComboBox = new QComboBox();
301 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
302 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
303 if (kk != -1) {
304 _serialAutoNMEAComboBox->setCurrentIndex(kk);
305 }
306 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
307 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
308
309 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
310 this, SLOT(slotBncTextChanged()));
311
312 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
313 this, SLOT(slotBncTextChanged()));
314
315 // Outages Options
316 // ---------------
317 _obsRateComboBox = new QComboBox();
318 _obsRateComboBox->setEditable(false);
319 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
320 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
321 if (kk != -1) {
322 _obsRateComboBox->setCurrentIndex(kk);
323 }
324 _adviseFailSpinBox = new QSpinBox();
325 _adviseFailSpinBox->setMinimum(0);
326 _adviseFailSpinBox->setMaximum(60);
327 _adviseFailSpinBox->setSingleStep(1);
328 _adviseFailSpinBox->setSuffix(" min");
329 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
330 _adviseRecoSpinBox = new QSpinBox();
331 _adviseRecoSpinBox->setMinimum(0);
332 _adviseRecoSpinBox->setMaximum(60);
333 _adviseRecoSpinBox->setSingleStep(1);
334 _adviseRecoSpinBox->setSuffix(" min");
335 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
336 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
337
338 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
339 this, SLOT(slotBncTextChanged()));
340
341 // Miscellaneous Options
342 // ---------------------
343 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
344 _perfIntrComboBox = new QComboBox();
345 _perfIntrComboBox->setEditable(false);
346 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
347 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
348 if (ll != -1) {
349 _perfIntrComboBox->setCurrentIndex(ll);
350 }
351 _scanRTCMCheckBox = new QCheckBox();
352 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
353 settings.value("scanRTCM").toInt()));
354
355 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
356 this, SLOT(slotBncTextChanged()));
357
358 // PPP Options
359 // -----------
360 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
361 _pppMountLineEdit->setMaximumWidth(6*ww);
362 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
363 _pppCorrMountLineEdit->setMaximumWidth(6*ww);
364 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
365 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
366 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
367 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
368 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
369 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
370 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
371 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
372 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
373 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
374 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
375 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
376 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
377 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
378 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
379 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
380 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
381 _pppSync = new QLineEdit(settings.value("pppSync").toString());
382 _pppAntexFileChooser = new qtFileChooser;
383 _pppAntexFileChooser->setMinimumWidth(12*ww);
384 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
385 _pppAntennaLineEdit->setMinimumWidth(14*ww);
386 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
387
388
389 _pppSPPComboBox = new QComboBox();
390 _pppSPPComboBox->setEditable(false);
391 _pppSPPComboBox->addItems(QString("PPP,SPP,Post-Processing").split(","));
392 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
393 if (ik != -1) {
394 _pppSPPComboBox->setCurrentIndex(ik);
395 }
396 _pppUsePhaseCheckBox = new QCheckBox();
397 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
398 settings.value("pppUsePhase").toInt()));
399 _pppEstTropoCheckBox = new QCheckBox();
400 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
401 settings.value("pppEstTropo").toInt()));
402 _pppGLONASSCheckBox = new QCheckBox();
403 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
404 settings.value("pppGLONASS").toInt()));
405 _pppGalileoCheckBox = new QCheckBox();
406 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
407 settings.value("pppGalileo").toInt()));
408
409 _pppPlotCoordinates = new QCheckBox();
410 _pppPlotCoordinates->setCheckState(Qt::CheckState(
411 settings.value("pppPlotCoordinates").toInt()));
412
413 _pppApplySatAntCheckBox = new QCheckBox();
414 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
415 settings.value("pppApplySatAnt").toInt()));
416
417 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
418 this, SLOT(slotBncTextChanged()));
419
420 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
421 this, SLOT(slotBncTextChanged()));
422
423 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
424 this, SLOT(slotBncTextChanged()));
425
426 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
427 this, SLOT(slotBncTextChanged()));
428 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
429 this, SLOT(slotBncTextChanged()));
430 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
431 this, SLOT(slotBncTextChanged()));
432 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
433 this, SLOT(slotBncTextChanged()));
434 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
435 this, SLOT(slotBncTextChanged()));
436 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
437 this, SLOT(slotBncTextChanged()));
438
439 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
440 this, SLOT(slotBncTextChanged()));
441
442 connect(_pppSync, SIGNAL(textChanged(const QString &)),
443 this, SLOT(slotBncTextChanged()));
444
445 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
446 this, SLOT(slotBncTextChanged()));
447
448 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
449 this, SLOT(slotBncTextChanged()));
450
451 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
452 this, SLOT(slotBncTextChanged()));
453
454 // Streams
455 // -------
456 _mountPointsTable = new QTableWidget(0,8);
457
458 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
459 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
460 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
461 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
462 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
463 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
464 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
465 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
466 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
467 _mountPointsTable->setHorizontalHeaderLabels(labels);
468 _mountPointsTable->setGridStyle(Qt::NoPen);
469 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
470 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
471 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
472 _mountPointsTable->hideColumn(0);
473 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
474 SLOT(slotSelectionChanged()));
475 populateMountPointsTable();
476
477 _log = new QTextBrowser();
478 _log->setReadOnly(true);
479
480 // Combination
481 // -----------
482 _cmbTable = new QTableWidget(0,3);
483 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
484 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
485 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
486 _cmbTable->setMaximumWidth(30*ww);
487 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
488 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
489 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
490 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
491 _cmbTable->horizontalHeader()->setStretchLastSection(true);
492 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
493
494 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
495
496 QPushButton* addCmbRowButton = new QPushButton("Add Row");
497 QPushButton* delCmbRowButton = new QPushButton("Delete");
498
499 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
500 SLOT(slotBncTextChanged()));
501
502 _cmbMethodComboBox = new QComboBox();
503 _cmbMethodComboBox->setEditable(false);
504 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
505 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
506 if (im != -1) {
507 _cmbMethodComboBox->setCurrentIndex(im);
508 }
509
510 // Upload Results
511 // -------------
512 _uploadTable = new QTableWidget(0,9);
513 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, bytes").split(","));
514 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
515 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
516 _uploadTable->horizontalHeader()->resizeSection(0,13*ww);
517 _uploadTable->horizontalHeader()->resizeSection(1,5*ww);
518 _uploadTable->horizontalHeader()->resizeSection(2,6*ww);
519 _uploadTable->horizontalHeader()->resizeSection(3,8*ww);
520 _uploadTable->horizontalHeader()->resizeSection(4,11*ww);
521 _uploadTable->horizontalHeader()->resizeSection(5,4*ww);
522 _uploadTable->horizontalHeader()->resizeSection(6,15*ww);
523 _uploadTable->horizontalHeader()->resizeSection(7,15*ww);
524 _uploadTable->horizontalHeader()->resizeSection(8,10*ww);
525 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
526 _uploadTable->horizontalHeader()->setStretchLastSection(true);
527 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
528
529 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
530 SLOT(slotBncTextChanged()));
531
532 QPushButton* addUploadRowButton = new QPushButton("Add Row");
533 QPushButton* delUploadRowButton = new QPushButton("Del Row");
534 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
535 _uploadIntrComboBox = new QComboBox;
536 _uploadIntrComboBox->setEditable(false);
537 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
538 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
539 if (ii != -1) {
540 _uploadIntrComboBox->setCurrentIndex(ii);
541 }
542 _uploadSamplSpinBox = new QSpinBox;
543 _uploadSamplSpinBox->setMinimum(5);
544 _uploadSamplSpinBox->setMaximum(60);
545 _uploadSamplSpinBox->setSingleStep(5);
546 _uploadSamplSpinBox->setMaximumWidth(9*ww);
547 _uploadSamplSpinBox->setValue(settings.value("uploadSampl").toInt());
548 _uploadSamplSpinBox->setSuffix(" sec");
549
550 _uploadSamplOrbSpinBox = new QSpinBox;
551 _uploadSamplOrbSpinBox->setMinimum(0);
552 _uploadSamplOrbSpinBox->setMaximum(60);
553 _uploadSamplOrbSpinBox->setSingleStep(5);
554 _uploadSamplOrbSpinBox->setMaximumWidth(9*ww);
555 _uploadSamplOrbSpinBox->setValue(settings.value("uploadSamplOrb").toInt());
556 _uploadSamplOrbSpinBox->setSuffix(" sec");
557
558 // Upload RTCM3 Ephemeris
559 // ----------------------
560 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
561 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
562 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
563 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
564 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
565 _uploadEphSampleSpinBox = new QSpinBox;
566 _uploadEphSampleSpinBox->setMinimum(5);
567 _uploadEphSampleSpinBox->setMaximum(60);
568 _uploadEphSampleSpinBox->setSingleStep(5);
569 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
570 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
571 _uploadEphSampleSpinBox->setSuffix(" sec");
572 _uploadEphBytesCounter = new bncBytesCounter;
573
574 // WhatsThis
575 // ---------
576 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you might 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.</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 these are not possible, you might need to run BNC outside your LAN on a network that has unobstructed connection to the Internet.</p>"));
577 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
578 _waitTimeSpinBox->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 epoch' seconds. 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 products.</p>"));
579 _outFileLineEdit->setWhatsThis(tr("Specify the full path to a file where synchronized observations are saved in plain ASCII format. Beware that the size of this file can rapidly increase depending on the number of incoming streams."));
580 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
581 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
582 _outEphPortLineEdit->setWhatsThis(tr("BNC can produce ephemeris data in RINEX ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
583 _corrPortLineEdit->setWhatsThis(tr("BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port. Specify a port number here to activate this function."));
584 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application.</p><p>Specifying a value of '0' means that BNC immediately outputs all incoming Broadcast Epemeris Corrections and does not drop any of them for latency reasons.</p>"));
585 _rnxPathLineEdit->setWhatsThis(tr("Here you specify the path to where the RINEX Observation files will be stored. If the specified directory does not exist, BNC will not create RINEX Observation files."));
586 _ephPathLineEdit->setWhatsThis(tr("Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files. If the specified directory does not exist, BNC will not create RINEX Navigation files."));
587 _corrPathLineEdit->setWhatsThis(tr("Specify a directory for saving Broadcast Ephemeris Correction files. If the specified directory does not exist, BNC will not create the files."));
588 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is saved, you might want to compress, copy or upload it immediately via FTP. BNC allows you to execute a script/batch file to carry out these operations. To do that specify the full path of the script/batch file here. BNC will pass the full RINEX Observation file path to the script as a command line parameter (%1 on Windows systems, $1 onUnix/Linux systems).</p>"));
589 _rnxSkelLineEdit->setWhatsThis(tr("<p>BNC allows using personal skeleton files that contain the header records you would like to include. You can derive a personal RINEX header skeleton file from the information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' suffix is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream.</p>"));
590 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and any existing files with the same name will be overwritten. However, users might want to append already existing files following a restart of BNC, a system crash or when BNC crashed. Tick 'Append files' to continue with existing files and keep what has been recorded so far.</p>"));
591 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
592 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
593
594 _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.<p></p>Select '1 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, 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 through 'Save & Reread Configuration'.</p>"));
595 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
596 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
597 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
598 _rnxSamplSpinBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. A value of zero '0' tells BNC to store all received epochs into RINEX.</p>"));
599 _binSamplSpinBox->setWhatsThis(tr("<p>Select the synchronized observation sampling interval in seconds. A value of zero '0' tells BNC to send/store all received epochs.</p>"));
600 _obsRateComboBox->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>"));
601 _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.</p>"));
602 _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.</p>"));
603 _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 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."));
604 _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 one of the comments '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. An empty option field (default) or invalid path means that you don't want to use this option.</p>"));
605 _perfIntrComboBox->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.</p>"));
606 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button will open 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 sourcetable. 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. The accepted decoder strings are 'RTCM_2.x' and 'RTCM_3.x'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and 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 these streams, the approximate latitude/longitude rover position is sent to the NTRIP broadcaster. The default values 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.</p>"));
607 _log->setWhatsThis(tr("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 any problems that occur in the communication link, stream availability, stream delay, stream conversion etc."));
608 _bncFigure->setWhatsThis(tr("The bandwidth consumtion per stream is shown in the 'Throughput' tab in bits per second (bps) or kilo bits per second (kbps)."));
609 _bncFigureLate->setWhatsThis(tr("The individual latency of observations in each incoming stream is shown in the 'Latency' tab. Streams not carrying observations (i.e. those providing only broadcast ephemeris messages) are not considered here. Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized."));
610 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
611 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
612 _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.</p>"));
613 _scanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incomming message types as well as contained antenna coordinates, antenna heigt, and antenna descriptor.</p>"));
614 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
615 _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 you must plug a serial cable in the port defined here before you start BNC.</p>"));
616 _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. Note further that using a high baud rate is recommended.</p>"));
617 _serialParityComboBox->setWhatsThis(tr("<p>Select the 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. Note further that parity is often set to 'NONE'.</p>"));
618 _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.</p>"));
619 _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.</p>"));
620 _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.</p>"));
621 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>Select 'Auto' to automatically forward NMEA-GGA messages coming from your serial connected receiver to the NTRIP broadcaster and/or save them in a file.</p><p>Select 'Manual' only when handling a VRS stream and your serial connected receiver doesn't generate NMEA-GGA messages.</p>"));
622 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
623 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meter for your VRS to simulate an inital NMEA-GGA message.</p><p>The setting of this option is ignored in case of streams coming from physical reference stations.</p>"));
624 _pppMountLineEdit->setWhatsThis(tr("<p>Specify an observations stream by its mountpoint from the 'Streams' list compiled below if you want BNC to estimate coordinates for the affected receiver position through a PPP solution. Example: 'FFMJ1'</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
625 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock corrections stream by its mountpoint from the 'Streams' list compiled below. Example: 'CLK10'</p>"));
626 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
627 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
628 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
629 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
630 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for a combined processing of both, GPS and Galileo observations in PPP mode.</p>"));
631 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
632 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
633 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
634 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
635 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'Sigma XYZ Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
636 _pppMaxSolGapLineEdit->setWhatsThis(tr("<p>Specify a 'Maximum Solution Gap' in seconds. Should the time span between two consecutive solutions exceed this limit, the algorithm returns into the Quick-Start mode and fixes the introduced reference coordinate for the specified Quick-Start period. A value of '120' seconds could be an appropriate choice.</p><p>This option makes only sense for a stationary operated receiver where solution convergence can be enforced because a good approximation for the rover position is known. Default is an empty option field, meaning that you don't want BNC to return into the Quick-Start mode after failures caused i.e. by longer lasting outages.</p>"));
637 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
638 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
639 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
640 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the white noise of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
641 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
642 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 1e-6 (default) would mean that the tropospheric effect may vary for 3600 * 1e-6 = 0.0036 meters per hour.</p>"));
643 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
644 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
645 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
646 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
647 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
648 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
649 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when the corresponting option is selected above. Values are either referred to an XYZ reference coordinate (if specified) or referred to the first estimated set of coordinate compoments. The sliding PPP time series window covers the period of the latest 5 minutes."));
650 _pppSync->setWhatsThis(tr(
651 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
652 "immediately after its arrival using satellite clock corrections available at "
653 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
654 "are buffered and the processing of each epoch is postponed till the satellite clock "
655 "corrections not older than 'Sync Corr' seconds are available.<p>"));
656 _pppAntexFileChooser->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
657 _pppAntennaLineEdit->setWhatsThis(tr("<p>Specify the receiver's antenna name as defined in your ANTEX file. Observations will be corrected for the antenna phase center's offset which may result in a reduction of a few centimeters at max. Corrections for phase center variations are not yet applied by BNC. The specified name must consist of 20 characters. Add trailing blanks if the antenna name has less then 20 characters.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets.</p>"));
658 _pppApplySatAntCheckBox->setWhatsThis(tr("<p>This option is not yet working.</p><p>Satellite orbit and clock corrections refer to the satellite's antenna phase centers and hence observations are actually <u>not</u> to be corrected for satellite antenna phase center offsets. However, you may like to tick 'Apply Offsets' to force BNC to correct observations for satellite antenna phase center offsets.</p><p>Default is to <u>not</u> correct observations for satellite antenna phase center offsets."));
659 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock corrections streams in real-time to produce, encode, upload and save a combination of correctors from various providers. Hit the 'Add Row' button, Double click on the 'Mountpoint' field to enter a Broadcast Ephemeris corrections 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' field to enter the weight to be applied for this stream in the combination.</p><p>Note that an appropriate 'Wait for full epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</p><p>Note further that the sequence of rows in the 'Combination Table' is of importance because the orbit information in the final combination stream is just copied from the stream listed in the first row. Hence the first line in the 'Combination Table' defines a kind of 'Master AC'. The update rate of the combination product follows the 'Master AC's update rate.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC must therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p>"));
660 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
661 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
662
663 // Canvas with Editable Fields
664 // ---------------------------
665 _canvas = new QWidget;
666 setCentralWidget(_canvas);
667
668 _aogroup = new QTabWidget();
669 QWidget* pgroup = new QWidget();
670 QWidget* ggroup = new QWidget();
671 QWidget* sgroup = new QWidget();
672 QWidget* egroup = new QWidget();
673 QWidget* agroup = new QWidget();
674 QWidget* cgroup = new QWidget();
675 QWidget* ogroup = new QWidget();
676 QWidget* rgroup = new QWidget();
677 QWidget* sergroup = new QWidget();
678 QWidget* pppgroup = new QWidget();
679 QWidget* ppp2group = new QWidget();
680 QWidget* cmbgroup = new QWidget();
681 QWidget* uploadgroup = new QWidget();
682 QWidget* uploadEphgroup = new QWidget();
683 _aogroup->addTab(pgroup,tr("Network"));
684 _aogroup->addTab(ggroup,tr("General"));
685 _aogroup->addTab(ogroup,tr("RINEX Observations"));
686 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
687 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
688 _aogroup->addTab(sgroup,tr("Feed Engine"));
689 _aogroup->addTab(sergroup,tr("Serial Output"));
690 _aogroup->addTab(agroup,tr("Outages"));
691 _aogroup->addTab(rgroup,tr("Miscellaneous"));
692 _aogroup->addTab(pppgroup,tr("PPP (1)"));
693 _aogroup->addTab(ppp2group,tr("PPP (2)"));
694#ifdef USE_COMBINATION
695 _aogroup->addTab(cmbgroup,tr("Combination"));
696#endif
697 _aogroup->addTab(uploadgroup,tr("Upload (clk)"));
698 _aogroup->addTab(uploadEphgroup,tr("Upload (eph)"));
699
700 // Log Tab
701 // -------
702 _loggroup = new QTabWidget();
703 _loggroup->addTab(_log,tr("Log"));
704 _loggroup->addTab(_bncFigure,tr("Throughput"));
705 _loggroup->addTab(_bncFigureLate,tr("Latency"));
706 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
707
708 // Netowork (Proxy and SSL) Tab
709 // ----------------------------
710 QGridLayout* pLayout = new QGridLayout;
711 pLayout->setColumnMinimumWidth(0,13*ww);
712 _proxyPortLineEdit->setMaximumWidth(9*ww);
713
714 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
715 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
716 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
717 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
718 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
719 pLayout->addWidget(new QLabel(" "),3,0);
720 pLayout->addWidget(new QLabel(" "),4,0);
721 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 5, 0);
722 pLayout->addWidget(_sslCaCertPathLineEdit, 5, 1, 1,10);
723 pLayout->addWidget(new QLabel("default: " + bncSslConfig::defaultPath()), 5, 12, 1,20);
724 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 6,0);
725 pLayout->addWidget(_ignoreSslErrorsCheckBox, 6, 1, 1,10);
726 pLayout->addWidget(new QLabel("Settings for SSL Authorization."),7, 0, 1, 50, Qt::AlignLeft);
727 pgroup->setLayout(pLayout);
728
729 // General Tab
730 // -----------
731 QGridLayout* gLayout = new QGridLayout;
732 gLayout->setColumnMinimumWidth(0,14*ww);
733 _onTheFlyComboBox->setMaximumWidth(9*ww);
734
735 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
736 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
737 gLayout->addWidget(new QLabel("Append files"), 1, 0);
738 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
739 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
740 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
741 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
742 gLayout->addWidget(_autoStartCheckBox, 3, 1);
743 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
744 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
745 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
746 ggroup->setLayout(gLayout);
747
748 // RINEX Observations
749 // ------------------
750 QGridLayout* oLayout = new QGridLayout;
751 oLayout->setColumnMinimumWidth(0,14*ww);
752 _rnxIntrComboBox->setMaximumWidth(9*ww);
753 _rnxSamplSpinBox->setMaximumWidth(9*ww);
754
755 oLayout->addWidget(new QLabel("Directory"), 0, 0);
756 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
757 oLayout->addWidget(new QLabel("Interval"), 1, 0);
758 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
759 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
760 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
761 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
762 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
763 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
764 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
765 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
766 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
767 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
768 ogroup->setLayout(oLayout);
769
770 // RINEX Ephemeris
771 // ---------------
772 QGridLayout* eLayout = new QGridLayout;
773 eLayout->setColumnMinimumWidth(0,14*ww);
774 _ephIntrComboBox->setMaximumWidth(9*ww);
775 _outEphPortLineEdit->setMaximumWidth(9*ww);
776
777 eLayout->addWidget(new QLabel("Directory"), 0, 0);
778 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
779 eLayout->addWidget(new QLabel("Interval"), 1, 0);
780 eLayout->addWidget(_ephIntrComboBox, 1, 1);
781 eLayout->addWidget(new QLabel("Port"), 2, 0);
782 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
783 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
784 eLayout->addWidget(_ephV3CheckBox, 3, 1);
785 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
786 eLayout->addWidget(new QLabel(" "),5,0);
787 egroup->setLayout(eLayout);
788
789
790 // Broadcast Corrections
791 // ---------------------
792 QGridLayout* cLayout = new QGridLayout;
793 cLayout->setColumnMinimumWidth(0,14*ww);
794 _corrIntrComboBox->setMaximumWidth(9*ww);
795 _corrPortLineEdit->setMaximumWidth(9*ww);
796 _corrTimeSpinBox->setMaximumWidth(9*ww);
797
798 cLayout->addWidget(new QLabel("Directory, ASCII"), 0, 0);
799 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
800 cLayout->addWidget(new QLabel("Interval"), 1, 0);
801 cLayout->addWidget(_corrIntrComboBox, 1, 1);
802 cLayout->addWidget(new QLabel("Port"), 2, 0);
803 cLayout->addWidget(_corrPortLineEdit, 2, 1);
804 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
805 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
806 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
807 cLayout->addWidget(new QLabel(" "),4,0);
808 cLayout->addWidget(new QLabel(" "),5,0);
809 cgroup->setLayout(cLayout);
810
811 // Feed Engine
812 // -----------
813 QGridLayout* sLayout = new QGridLayout;
814 sLayout->setColumnMinimumWidth(0,14*ww);
815 _outPortLineEdit->setMaximumWidth(9*ww);
816 _waitTimeSpinBox->setMaximumWidth(9*ww);
817 _binSamplSpinBox->setMaximumWidth(9*ww);
818 _outUPortLineEdit->setMaximumWidth(9*ww);
819
820 sLayout->addWidget(new QLabel("Port"), 0, 0);
821 sLayout->addWidget(_outPortLineEdit, 0, 1);
822 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
823 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
824 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
825 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
826 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
827 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
828 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
829 sLayout->addWidget(_outUPortLineEdit, 3, 1);
830 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
831 sLayout->addWidget(new QLabel(" "),5,0);
832 sgroup->setLayout(sLayout);
833
834 // Serial Output
835 // -------------
836 QGridLayout* serLayout = new QGridLayout;
837 serLayout->setColumnMinimumWidth(0,14*ww);
838 _serialBaudRateComboBox->setMaximumWidth(9*ww);
839 _serialFlowControlComboBox->setMaximumWidth(11*ww);
840 _serialDataBitsComboBox->setMaximumWidth(5*ww);
841 _serialParityComboBox->setMaximumWidth(9*ww);
842 _serialStopBitsComboBox->setMaximumWidth(5*ww);
843 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
844 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
845
846 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
847 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
848 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
849 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
850 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
851 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
852 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
853 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
854 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
855 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
856 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
857 serLayout->addWidget(_serialParityComboBox, 3,3);
858 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
859 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
860 serLayout->addWidget(new QLabel("NMEA"), 4,0);
861 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
862 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
863 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
864 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
865 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
866 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
867
868 sergroup->setLayout(serLayout);
869
870 // Outages
871 // -------
872 QGridLayout* aLayout = new QGridLayout;
873 aLayout->setColumnMinimumWidth(0,14*ww);
874 _obsRateComboBox->setMaximumWidth(9*ww);
875 _adviseFailSpinBox->setMaximumWidth(9*ww);
876 _adviseRecoSpinBox->setMaximumWidth(9*ww);
877
878 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
879 aLayout->addWidget(_obsRateComboBox, 0, 1);
880 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
881 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
882 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
883 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
884 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
885 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
886 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
887 aLayout->addWidget(new QLabel(" "), 5, 0);
888 agroup->setLayout(aLayout);
889
890 // Miscellaneous
891 // -------------
892 QGridLayout* rLayout = new QGridLayout;
893 rLayout->setColumnMinimumWidth(0,14*ww);
894 _perfIntrComboBox->setMaximumWidth(9*ww);
895
896 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
897 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
898 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
899 rLayout->addWidget(_perfIntrComboBox, 1, 1);
900 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
901 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
902 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
903 rLayout->addWidget(new QLabel(" "), 4, 0);
904 rLayout->addWidget(new QLabel(" "), 5, 0);
905 rgroup->setLayout(rLayout);
906
907 // PPP Client
908 // ----------
909 QGridLayout* pppLayout = new QGridLayout;
910 _pppSigCLineEdit->setMaximumWidth(6*ww);
911 _pppSigPLineEdit->setMaximumWidth(6*ww);
912 _pppSigCrd0->setMaximumWidth(6*ww);
913 _pppSigCrdP->setMaximumWidth(6*ww);
914 _pppSigTrp0->setMaximumWidth(6*ww);
915 _pppSigTrpP->setMaximumWidth(6*ww);
916 _pppAverageLineEdit->setMaximumWidth(6*ww);
917 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
918 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
919 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
920 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
921 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
922 _pppRefdNLineEdit->setMaximumWidth(5*ww);
923 _pppRefdELineEdit->setMaximumWidth(5*ww);
924 _pppRefdULineEdit->setMaximumWidth(5*ww);
925 _pppSync->setMaximumWidth(6*ww);
926 _pppSPPComboBox->setMaximumWidth(15*ww);
927 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
928
929 _postObsFileChooser = new qtFileChooser;
930 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
931 _postObsFileChooser->setWhatsThis(tr("Full Path to RINEX Observation File"));
932
933 _postNavFileChooser = new qtFileChooser;
934 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
935 _postNavFileChooser->setWhatsThis(tr("Full Path to RINEX Navigation File"));
936
937 _postCorrFileChooser = new qtFileChooser;
938 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
939 _postCorrFileChooser->setWhatsThis(tr("Full Path to DGPS Correction File"));
940
941 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
942 _postOutLineEdit->setWhatsThis(tr("Full Path to DGPS Correction File"));
943
944 int ir = 0;
945 pppLayout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 1)</b>"), ir, 0, 1, 8);
946 ++ir;
947 pppLayout->addWidget(new QLabel("Obs Mountpoint"), ir, 0);
948 pppLayout->addWidget(_pppMountLineEdit, ir, 1);
949 pppLayout->addWidget(_pppSPPComboBox, ir, 2);
950 pppLayout->addWidget(new QLabel(" X "), ir, 3, Qt::AlignRight);
951 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 4);
952 pppLayout->addWidget(new QLabel(" Y "), ir, 5, Qt::AlignRight);
953 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 6);
954 pppLayout->addWidget(new QLabel(" Z "), ir, 7, Qt::AlignRight);
955 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 8);
956 ++ir;
957 pppLayout->addWidget(new QLabel("Corr Mountpoint "), ir, 0);
958 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 1);
959 pppLayout->addWidget(new QLabel(" dN "), ir, 3, Qt::AlignRight);
960 pppLayout->addWidget(_pppRefdNLineEdit, ir, 4);
961 pppLayout->addWidget(new QLabel(" dE "), ir, 5, Qt::AlignRight);
962 pppLayout->addWidget(_pppRefdELineEdit, ir, 6);
963 pppLayout->addWidget(new QLabel(" dU "), ir, 7, Qt::AlignRight);
964 pppLayout->addWidget(_pppRefdULineEdit, ir, 8);
965 ++ir;
966 pppLayout->addWidget(new QLabel("Output"), ir, 0);
967 pppLayout->addWidget(new QLabel("NMEA File"), ir, 1, Qt::AlignRight);
968 pppLayout->addWidget(_pppNMEALineEdit, ir, 2, 1, 2);
969 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 5, Qt::AlignRight);
970 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 6);
971 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 7, Qt::AlignRight);
972 pppLayout->addWidget(_pppPlotCoordinates, ir, 8);
973 ++ir;
974 pppLayout->addWidget(new QLabel("<b>Post-Processing </b>"));
975 {
976 QHBoxLayout* hlpLayout = new QHBoxLayout;
977 hlpLayout->addWidget(new QLabel("Obs"));
978 hlpLayout->addWidget(_postObsFileChooser);
979 hlpLayout->addWidget(new QLabel(" Nav"));
980 hlpLayout->addWidget(_postNavFileChooser);
981 hlpLayout->addWidget(new QLabel(" Corr"));
982 hlpLayout->addWidget(_postCorrFileChooser);
983 pppLayout->addLayout(hlpLayout, ir, 1, 1, 8);
984 }
985 ++ir;
986 pppLayout->addWidget(new QLabel("Output"), ir, 1);
987 pppLayout->addWidget(_postOutLineEdit, ir, 2, 1, 2);
988
989 pppgroup->setLayout(pppLayout);
990
991 // PPP Client (second panel)
992 // -------------------------
993 QGridLayout* ppp2Layout = new QGridLayout;
994 ir = 0;
995 ppp2Layout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 2)</b>"), ir, 0, 1, 8);
996 ++ir;
997 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
998 {
999 QHBoxLayout* hlpLayout = new QHBoxLayout;
1000 hlpLayout->addWidget(_pppAntexFileChooser);
1001 hlpLayout->addWidget(new QLabel("ANTEX File"));
1002 hlpLayout->addWidget(_pppAntennaLineEdit);
1003 hlpLayout->addWidget(new QLabel("Antenna Name"));
1004 hlpLayout->addWidget(_pppApplySatAntCheckBox);
1005 hlpLayout->addWidget(new QLabel("Apply Sat. Ant. Offsets"));
1006 ppp2Layout->addLayout(hlpLayout, ir, 1, 1, 8);
1007 }
1008 ++ir;
1009 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
1010 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1011 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1012 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1013 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1014 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1015 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1016 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1017 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1018 ++ir;
1019 ppp2Layout->addWidget(new QLabel("Options"), ir, 0, 1, 5);
1020 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
1021 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
1022 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
1023 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
1024 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
1025 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
1026 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
1027 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
1028 ++ir;
1029 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1030 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1031 ppp2Layout->addWidget(new QLabel("Sigma XYZ Init "), ir, 2);
1032 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1033 ppp2Layout->addWidget(new QLabel("Sigma XYZ Noise "), ir, 4);
1034 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
1035 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
1036 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
1037 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
1038 ++ir;
1039 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1040 ppp2Layout->addWidget(_pppSync, ir, 1);
1041 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
1042 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
1043 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
1044
1045 ppp2group->setLayout(ppp2Layout);
1046
1047 // Combination
1048 // -----------
1049 QGridLayout* cmbLayout = new QGridLayout;
1050
1051 populateCmbTable();
1052 cmbLayout->addWidget(_cmbTable,0,0,6,3);
1053
1054 cmbLayout->addWidget(addCmbRowButton,1,3);
1055 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1056 cmbLayout->addWidget(delCmbRowButton,2,3);
1057 cmbLayout->addWidget(new QLabel("Method"), 3, 3);
1058 cmbLayout->addWidget(_cmbMethodComboBox, 3, 4, Qt::AlignRight);
1059 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 4, 3);
1060 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 4, Qt::AlignRight);
1061 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1062
1063 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,3);
1064
1065 cmbgroup->setLayout(cmbLayout);
1066
1067 // Upload Layout (Clocks)
1068 // ----------------------
1069 QGridLayout* uploadHlpLayout = new QGridLayout();
1070
1071 uploadHlpLayout->addWidget(new QLabel("Upload RTNet or Combination Results"),0,0);
1072
1073 uploadHlpLayout->addWidget(addUploadRowButton,0,1);
1074 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1075
1076 uploadHlpLayout->addWidget(delUploadRowButton,0,2);
1077 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1078
1079 uploadHlpLayout->addWidget(setUploadTrafoButton,1,1);
1080 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1081
1082 uploadHlpLayout->addWidget(new QLabel("Interval"),0,3, Qt::AlignRight);
1083 uploadHlpLayout->addWidget(_uploadIntrComboBox,0,4);
1084
1085 uploadHlpLayout->addWidget(new QLabel("Sampling"),1,3, Qt::AlignRight);
1086 uploadHlpLayout->addWidget(_uploadSamplSpinBox,1,4);
1087
1088 uploadHlpLayout->addWidget(new QLabel("Sampling (Orb)"),1,5, Qt::AlignRight);
1089 uploadHlpLayout->addWidget(_uploadSamplOrbSpinBox,1,6);
1090
1091 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1092 populateUploadTable();
1093 uploadLayout->addWidget(_uploadTable);
1094 uploadLayout->addLayout(uploadHlpLayout);
1095
1096 uploadgroup->setLayout(uploadLayout);
1097
1098 // Upload Layout (Ephemeris)
1099 // -------------------------
1100 QGridLayout* uploadLayoutEph = new QGridLayout;
1101
1102 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1103 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1104 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1105 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1106
1107 uploadLayoutEph->addWidget(new QLabel("Host"), 0, 0);
1108 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 0, 1, 1, 3);
1109 uploadLayoutEph->addWidget(new QLabel(" Port"), 0, 4, Qt::AlignRight);
1110 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 0, 5, 1, 1);
1111 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 1, 0);
1112 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 1, 1);
1113 uploadLayoutEph->addWidget(new QLabel(" Password"), 1, 2, Qt::AlignRight);
1114 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 1, 3);
1115 uploadLayoutEph->addWidget(new QLabel("Sampling"), 2, 0);
1116 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 2, 1);
1117 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 3, 0, 1, 5);
1118 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 3, 5);
1119
1120 uploadEphgroup->setLayout(uploadLayoutEph);
1121
1122 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1123 this, SLOT(slotBncTextChanged()));
1124
1125 // Main Layout
1126 // -----------
1127 QGridLayout* mLayout = new QGridLayout;
1128 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1129 mLayout->addWidget(_aogroup, 0,0);
1130 mLayout->addWidget(_mountPointsTable, 1,0);
1131 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1132 mLayout->addWidget(_loggroup, 2,0);
1133
1134 _canvas->setLayout(mLayout);
1135
1136 // Enable/Disable all Widgets
1137 // --------------------------
1138 slotBncTextChanged();
1139
1140 // Auto start
1141 // ----------
1142 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1143 slotGetData();
1144 }
1145}
1146
1147// Destructor
1148////////////////////////////////////////////////////////////////////////////
1149bncWindow::~bncWindow() {
1150 delete _caster;
1151 delete _casterEph;
1152}
1153
1154//
1155////////////////////////////////////////////////////////////////////////////
1156void bncWindow::populateMountPointsTable() {
1157
1158 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1159 _mountPointsTable->removeRow(iRow);
1160 }
1161
1162 bncSettings settings;
1163
1164 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1165 if (!it.hasNext()) {
1166 _actGetData->setEnabled(false);
1167 }
1168 int iRow = 0;
1169 while (it.hasNext()) {
1170 QStringList hlp = it.next().split(" ");
1171 if (hlp.size() < 5) continue;
1172 _mountPointsTable->insertRow(iRow);
1173
1174 QUrl url(hlp[0]);
1175
1176 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1177 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1178 QString nmea(hlp[4]);
1179 if (hlp[5] == "S") {
1180 fullPath = hlp[0].replace(0,2,"");
1181 }
1182 QString ntripVersion = "2";
1183 if (hlp.size() >= 6) {
1184 ntripVersion = (hlp[5]);
1185 }
1186
1187 QTableWidgetItem* it;
1188 it = new QTableWidgetItem(url.userInfo());
1189 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1190 _mountPointsTable->setItem(iRow, 0, it);
1191
1192 it = new QTableWidgetItem(fullPath);
1193 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1194 _mountPointsTable->setItem(iRow, 1, it);
1195
1196 it = new QTableWidgetItem(format);
1197 _mountPointsTable->setItem(iRow, 2, it);
1198
1199 if (nmea == "yes") {
1200 it = new QTableWidgetItem(latitude);
1201 _mountPointsTable->setItem(iRow, 3, it);
1202 it = new QTableWidgetItem(longitude);
1203 _mountPointsTable->setItem(iRow, 4, it);
1204 } else {
1205 it = new QTableWidgetItem(latitude);
1206 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1207 _mountPointsTable->setItem(iRow, 3, it);
1208 it = new QTableWidgetItem(longitude);
1209 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1210 _mountPointsTable->setItem(iRow, 4, it);
1211 }
1212
1213 it = new QTableWidgetItem(nmea);
1214 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1215 _mountPointsTable->setItem(iRow, 5, it);
1216
1217 it = new QTableWidgetItem(ntripVersion);
1218 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1219 _mountPointsTable->setItem(iRow, 6, it);
1220
1221 bncTableItem* bncIt = new bncTableItem();
1222 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1223 _mountPointsTable->setItem(iRow, 7, bncIt);
1224
1225 iRow++;
1226 }
1227
1228 _mountPointsTable->sortItems(1);
1229}
1230
1231// Retrieve Table
1232////////////////////////////////////////////////////////////////////////////
1233void bncWindow::slotAddMountPoints() {
1234
1235 bncSettings settings;
1236 QString proxyHost = settings.value("proxyHost").toString();
1237 int proxyPort = settings.value("proxyPort").toInt();
1238 if (proxyHost != _proxyHostLineEdit->text() ||
1239 proxyPort != _proxyPortLineEdit->text().toInt()) {
1240 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1241 "changed. Use the new ones?",
1242 QMessageBox::Yes, QMessageBox::No,
1243 QMessageBox::NoButton);
1244 if (iRet == QMessageBox::Yes) {
1245 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1246 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1247 settings.sync();
1248 }
1249 }
1250
1251 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1252 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1253 settings.sync();
1254
1255 QMessageBox msgBox;
1256 msgBox.setIcon(QMessageBox::Question);
1257 msgBox.setWindowTitle("Add Stream");
1258 msgBox.setText("Add stream(s) coming from:");
1259
1260 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1261 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1262 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1263 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1264 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1265
1266 msgBox.exec();
1267
1268 if (msgBox.clickedButton() == buttonNtrip) {
1269 bncTableDlg* dlg = new bncTableDlg(this);
1270 dlg->move(this->pos().x()+50, this->pos().y()+50);
1271 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1272 this, SLOT(slotNewMountPoints(QStringList*)));
1273 dlg->exec();
1274 delete dlg;
1275 } else if (msgBox.clickedButton() == buttonIP) {
1276 bncIpPort* ipp = new bncIpPort(this);
1277 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1278 this, SLOT(slotNewMountPoints(QStringList*)));
1279 ipp->exec();
1280 delete ipp;
1281 } else if (msgBox.clickedButton() == buttonUDP) {
1282 bncUdpPort* udp = new bncUdpPort(this);
1283 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1284 this, SLOT(slotNewMountPoints(QStringList*)));
1285 udp->exec();
1286 delete udp;
1287 } else if (msgBox.clickedButton() == buttonSerial) {
1288 bncSerialPort* sep = new bncSerialPort(this);
1289 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1290 this, SLOT(slotNewMountPoints(QStringList*)));
1291 sep->exec();
1292 delete sep;
1293 } else if (msgBox.clickedButton() == buttonCancel) {
1294 // Cancel
1295 }
1296}
1297
1298// Delete Selected Mount Points
1299////////////////////////////////////////////////////////////////////////////
1300void bncWindow::slotDeleteMountPoints() {
1301
1302 int nRows = _mountPointsTable->rowCount();
1303 bool flg[nRows];
1304 for (int iRow = 0; iRow < nRows; iRow++) {
1305 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1306 flg[iRow] = true;
1307 }
1308 else {
1309 flg[iRow] = false;
1310 }
1311 }
1312 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1313 if (flg[iRow]) {
1314 _mountPointsTable->removeRow(iRow);
1315 }
1316 }
1317 _actDeleteMountPoints->setEnabled(false);
1318
1319 if (_mountPointsTable->rowCount() == 0) {
1320 _actGetData->setEnabled(false);
1321 }
1322}
1323
1324// New Mount Points Selected
1325////////////////////////////////////////////////////////////////////////////
1326void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1327 int iRow = 0;
1328 QListIterator<QString> it(*mountPoints);
1329 while (it.hasNext()) {
1330 QStringList hlp = it.next().split(" ");
1331 QUrl url(hlp[0]);
1332 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1333 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1334 QString nmea(hlp[4]);
1335 if (hlp[5] == "S") {
1336 fullPath = hlp[0].replace(0,2,"");
1337 }
1338 QString ntripVersion = "2";
1339 if (hlp.size() >= 6) {
1340 ntripVersion = (hlp[5]);
1341 }
1342
1343 _mountPointsTable->insertRow(iRow);
1344
1345 QTableWidgetItem* it;
1346 it = new QTableWidgetItem(url.userInfo());
1347 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1348 _mountPointsTable->setItem(iRow, 0, it);
1349
1350 it = new QTableWidgetItem(fullPath);
1351 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1352 _mountPointsTable->setItem(iRow, 1, it);
1353
1354 it = new QTableWidgetItem(format);
1355 _mountPointsTable->setItem(iRow, 2, it);
1356
1357 if (nmea == "yes") {
1358 it = new QTableWidgetItem(latitude);
1359 _mountPointsTable->setItem(iRow, 3, it);
1360 it = new QTableWidgetItem(longitude);
1361 _mountPointsTable->setItem(iRow, 4, it);
1362 } else {
1363 it = new QTableWidgetItem(latitude);
1364 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1365 _mountPointsTable->setItem(iRow, 3, it);
1366 it = new QTableWidgetItem(longitude);
1367 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1368 _mountPointsTable->setItem(iRow, 4, it);
1369 }
1370
1371 it = new QTableWidgetItem(nmea);
1372 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1373 _mountPointsTable->setItem(iRow, 5, it);
1374
1375 it = new QTableWidgetItem(ntripVersion);
1376 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1377 _mountPointsTable->setItem(iRow, 6, it);
1378
1379 bncTableItem* bncIt = new bncTableItem();
1380 _mountPointsTable->setItem(iRow, 7, bncIt);
1381
1382 iRow++;
1383 }
1384 _mountPointsTable->hideColumn(0);
1385 _mountPointsTable->sortItems(1);
1386 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1387 _actGetData->setEnabled(true);
1388 }
1389 delete mountPoints;
1390}
1391
1392// Save Options
1393////////////////////////////////////////////////////////////////////////////
1394void bncWindow::slotSaveOptions() {
1395
1396 QStringList mountPoints;
1397 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1398
1399 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1400 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1401 "@" + _mountPointsTable->item(iRow, 1)->text() );
1402
1403 mountPoints.append(url.toString() + " " +
1404 _mountPointsTable->item(iRow, 2)->text()
1405 + " " + _mountPointsTable->item(iRow, 3)->text()
1406 + " " + _mountPointsTable->item(iRow, 4)->text()
1407 + " " + _mountPointsTable->item(iRow, 5)->text()
1408 + " " + _mountPointsTable->item(iRow, 6)->text());
1409 } else {
1410 mountPoints.append(
1411 "//" + _mountPointsTable->item(iRow, 1)->text()
1412 + " " + _mountPointsTable->item(iRow, 2)->text()
1413 + " " + _mountPointsTable->item(iRow, 3)->text()
1414 + " " + _mountPointsTable->item(iRow, 4)->text()
1415 + " " + _mountPointsTable->item(iRow, 5)->text()
1416 + " " + _mountPointsTable->item(iRow, 6)->text());
1417 }
1418 }
1419
1420 QStringList combineStreams;
1421 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1422 QString hlp;
1423 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1424 if (_cmbTable->item(iRow, iCol)) {
1425 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1426 }
1427 }
1428 if (!hlp.isEmpty()) {
1429 combineStreams << hlp;
1430 }
1431 }
1432
1433 QStringList uploadMountpointsOut;
1434 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1435 QString hlp;
1436 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1437 if (_uploadTable->cellWidget(iRow, iCol) &&
1438 (iCol == 3 || iCol == 4 || iCol == 5)) {
1439 if (iCol == 3) {
1440 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1441 hlp += passwd->text() + ",";
1442 }
1443 else if (iCol == 4) {
1444 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1445 hlp += system->currentText() + ",";
1446 }
1447 else if (iCol == 5) {
1448 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1449 QString state; state.setNum(com->checkState());
1450 hlp += state + ",";
1451 }
1452 }
1453 else if (_uploadTable->item(iRow, iCol)) {
1454 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1455 }
1456 }
1457 if (!hlp.isEmpty()) {
1458 uploadMountpointsOut << hlp;
1459 }
1460 }
1461
1462 bncSettings settings;
1463
1464 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1465 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1466 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1467 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1468 settings.setValue("binSampl", _binSamplSpinBox->value());
1469 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1470 settings.setValue("corrPath", _corrPathLineEdit->text());
1471 settings.setValue("corrPort", _corrPortLineEdit->text());
1472 settings.setValue("corrTime", _corrTimeSpinBox->value());
1473 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1474 settings.setValue("ephPath", _ephPathLineEdit->text());
1475 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1476 settings.setValue("logFile", _logFileLineEdit->text());
1477 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1478 settings.setValue("miscMount", _miscMountLineEdit->text());
1479 settings.setValue("pppMount", _pppMountLineEdit->text());
1480 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1481 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1482 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1483 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1484 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1485 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1486 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1487 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1488 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1489 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1490 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1491 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1492 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1493 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1494 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1495 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1496 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1497 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1498 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1499 settings.setValue("pppSync", _pppSync->text());
1500 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1501 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1502 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1503 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1504 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1505 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1506 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1507 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1508 settings.setValue("mountPoints", mountPoints);
1509 settings.setValue("obsRate", _obsRateComboBox->currentText());
1510 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1511 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1512 settings.setValue("outFile", _outFileLineEdit->text());
1513 settings.setValue("outPort", _outPortLineEdit->text());
1514 settings.setValue("outUPort", _outUPortLineEdit->text());
1515 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1516 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1517 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1518 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1519 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1520 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1521 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1522 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1523 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1524 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1525 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1526 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1527 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1528 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1529 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1530 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1531 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1532 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1533 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1534 settings.setValue("serialParity", _serialParityComboBox->currentText());
1535 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1536 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1537 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1538 settings.setValue("startTab", _aogroup->currentIndex());
1539 settings.setValue("statusTab", _loggroup->currentIndex());
1540 settings.setValue("waitTime", _waitTimeSpinBox->value());
1541 if (!combineStreams.isEmpty()) {
1542 settings.setValue("combineStreams", combineStreams);
1543 }
1544 else {
1545 settings.setValue("combineStreams", "");
1546 }
1547 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1548 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1549
1550 if (!uploadMountpointsOut.isEmpty()) {
1551 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1552 }
1553 else {
1554 settings.setValue("uploadMountpointsOut", "");
1555 }
1556 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1557 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1558 settings.setValue("uploadSamplOrb", _uploadSamplOrbSpinBox->value());
1559
1560 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1561 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1562 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1563 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1564 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1565
1566 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1567 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1568 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1569 settings.setValue("postOutFile", _postOutLineEdit->text());
1570
1571 if (_caster) {
1572 _caster->slotReadMountPoints();
1573 }
1574 settings.sync();
1575}
1576
1577// All get slots terminated
1578////////////////////////////////////////////////////////////////////////////
1579void bncWindow::slotGetThreadsFinished() {
1580 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1581 delete _caster; _caster = 0;
1582 delete _casterEph; _casterEph = 0;
1583 _actGetData->setEnabled(true);
1584 _actStop->setEnabled(false);
1585}
1586
1587// Retrieve Data
1588////////////////////////////////////////////////////////////////////////////
1589void bncWindow::slotGetData() {
1590 slotSaveOptions();
1591
1592 _bncFigurePPP->reset();
1593
1594 _actDeleteMountPoints->setEnabled(false);
1595 _actGetData->setEnabled(false);
1596 _actStop->setEnabled(true);
1597
1598 _caster = new bncCaster(_outFileLineEdit->text(),
1599 _outPortLineEdit->text().toInt());
1600
1601 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1602 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1603 ((bncApp*)qApp)->initCombination();
1604
1605 connect(_caster, SIGNAL(getThreadsFinished()),
1606 this, SLOT(slotGetThreadsFinished()));
1607
1608 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1609 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1610
1611 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1612
1613 bncSettings settings;
1614
1615 QDir rnxdir(settings.value("rnxPath").toString());
1616 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1617
1618 QString rnx_file = settings.value("rnxScript").toString();
1619 if ( !rnx_file.isEmpty() ) {
1620 QFile rnxfile(settings.value("rnxScript").toString());
1621 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1622 }
1623
1624 QDir ephdir(settings.value("ephPath").toString());
1625 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1626
1627 QDir corrdir(settings.value("corrPath").toString());
1628 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1629
1630 QString advise_file = settings.value("adviseScript").toString();
1631 if ( !advise_file.isEmpty() ) {
1632 QFile advisefile(settings.value("adviseScript").toString());
1633 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1634 }
1635
1636 QString ant_file = settings.value("pppAntex").toString();
1637 if ( !ant_file.isEmpty() ) {
1638 QFile anxfile(settings.value("pppAntex").toString());
1639 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1640 }
1641
1642 _caster->slotReadMountPoints();
1643
1644 _casterEph = new bncEphUploadCaster();
1645 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1646 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1647}
1648
1649// Retrieve Data
1650////////////////////////////////////////////////////////////////////////////
1651void bncWindow::slotStop() {
1652 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1653 QMessageBox::Yes, QMessageBox::No,
1654 QMessageBox::NoButton);
1655 if (iRet == QMessageBox::Yes) {
1656 ((bncApp*)qApp)->stopCombination();
1657 delete _caster; _caster = 0;
1658 delete _casterEph; _casterEph = 0;
1659 _actGetData->setEnabled(true);
1660 _actStop->setEnabled(false);
1661 }
1662}
1663
1664// Close Application gracefully
1665////////////////////////////////////////////////////////////////////////////
1666void bncWindow::closeEvent(QCloseEvent* event) {
1667
1668 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1669 QMessageBox::Yes, QMessageBox::No,
1670 QMessageBox::Cancel);
1671
1672 if (iRet == QMessageBox::Cancel) {
1673 event->ignore();
1674 return;
1675 }
1676 else if (iRet == QMessageBox::Yes) {
1677 slotSaveOptions();
1678 }
1679
1680 QMainWindow::closeEvent(event);
1681}
1682
1683// User changed the selection of mountPoints
1684////////////////////////////////////////////////////////////////////////////
1685void bncWindow::slotSelectionChanged() {
1686 if (_mountPointsTable->selectedItems().isEmpty()) {
1687 _actDeleteMountPoints->setEnabled(false);
1688 }
1689 else {
1690 _actDeleteMountPoints->setEnabled(true);
1691 }
1692}
1693
1694// Display Program Messages
1695////////////////////////////////////////////////////////////////////////////
1696void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1697
1698#ifdef DEBUG_RTCM2_2021
1699 const int maxBufferSize = 1000;
1700#else
1701 const int maxBufferSize = 10000;
1702#endif
1703
1704 if (! showOnScreen ) {
1705 return;
1706 }
1707
1708 QString txt = _log->toPlainText() + "\n" +
1709 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1710 _log->clear();
1711 _log->append(txt.right(maxBufferSize));
1712}
1713
1714// About Message
1715////////////////////////////////////////////////////////////////////////////
1716void bncWindow::slotAbout() {
1717 new bncAboutDlg(0);
1718}
1719
1720//Flowchart
1721////////////////////////////////////////////////////////////////////////////
1722void bncWindow::slotFlowchart() {
1723 new bncFlowchartDlg(0);
1724}
1725
1726// Help Window
1727////////////////////////////////////////////////////////////////////////////
1728void bncWindow::slotHelp() {
1729 QUrl url;
1730 url.setPath(":bnchelp.html");
1731 new bncHlpDlg(0, url);
1732}
1733
1734// Select Fonts
1735////////////////////////////////////////////////////////////////////////////
1736void bncWindow::slotFontSel() {
1737 bool ok;
1738 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1739 if (ok) {
1740 bncSettings settings;
1741 settings.setValue("font", newFont.toString());
1742 QApplication::setFont(newFont);
1743 int ww = QFontMetrics(newFont).width('w');
1744 setMinimumSize(60*ww, 80*ww);
1745 resize(60*ww, 80*ww);
1746 }
1747}
1748
1749// Whats This Help
1750void bncWindow::slotWhatsThis() {
1751 QWhatsThis::enterWhatsThisMode();
1752}
1753
1754//
1755////////////////////////////////////////////////////////////////////////////
1756void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1757 _bncFigure->updateMountPoints();
1758 _bncFigureLate->updateMountPoints();
1759
1760 populateMountPointsTable();
1761 bncSettings settings;
1762 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1763 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1764 QListIterator<bncGetThread*> iTh(threads);
1765 while (iTh.hasNext()) {
1766 bncGetThread* thread = iTh.next();
1767 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1768 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1769 "@" + _mountPointsTable->item(iRow, 1)->text() );
1770 if (url == thread->mountPoint() &&
1771 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1772 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1773 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1774 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1775 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1776 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1777 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1778 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1779 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1780 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1781 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1782 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1783 disconnect(thread,
1784 SIGNAL(newPosition(bncTime, double, double, double)),
1785 _bncFigurePPP,
1786 SLOT(slotNewPosition(bncTime, double, double, double)));
1787 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1788 _bncFigurePPP,
1789 SLOT(slotNewPosition(bncTime, double, double, double)));
1790 }
1791 break;
1792 }
1793 }
1794 }
1795}
1796
1797//
1798////////////////////////////////////////////////////////////////////////////
1799void bncWindow::CreateMenu() {
1800 // Create Menus
1801 // ------------
1802 _menuFile = menuBar()->addMenu(tr("&File"));
1803 _menuFile->addAction(_actFontSel);
1804 _menuFile->addSeparator();
1805 _menuFile->addAction(_actSaveOpt);
1806 _menuFile->addSeparator();
1807 _menuFile->addAction(_actQuit);
1808
1809 _menuHlp = menuBar()->addMenu(tr("&Help"));
1810 _menuHlp->addAction(_actHelp);
1811 _menuHlp->addAction(_actFlowchart);
1812 _menuHlp->addAction(_actAbout);
1813}
1814
1815// Toolbar
1816////////////////////////////////////////////////////////////////////////////
1817void bncWindow::AddToolbar() {
1818 // Tool (Command) Bar
1819 // ------------------
1820 QToolBar* toolBar = new QToolBar;
1821 addToolBar(Qt::BottomToolBarArea, toolBar);
1822 toolBar->setMovable(false);
1823 toolBar->addAction(_actAddMountPoints);
1824 toolBar->addAction(_actDeleteMountPoints);
1825 toolBar->addAction(_actGetData);
1826 toolBar->addAction(_actStop);
1827 toolBar->addAction(_actPostProcessing);
1828 _postProgressLabel = new QLabel(" Progress");
1829 toolBar->addWidget(_postProgressLabel);
1830 toolBar->addWidget(_postProgressBar);
1831 enableWidget(false, _postProgressLabel);
1832 toolBar->addWidget(new QLabel(" "));
1833 toolBar->addAction(_actwhatsthis);
1834}
1835
1836// About
1837////////////////////////////////////////////////////////////////////////////
1838bncAboutDlg::bncAboutDlg(QWidget* parent) :
1839 QDialog(parent) {
1840
1841 QTextBrowser* tb = new QTextBrowser;
1842 QUrl url; url.setPath(":bncabout.html");
1843 tb->setSource(url);
1844 tb->setReadOnly(true);
1845
1846 int ww = QFontMetrics(font()).width('w');
1847 QPushButton* _closeButton = new QPushButton("Close");
1848 _closeButton->setMaximumWidth(10*ww);
1849 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1850
1851 QGridLayout* dlgLayout = new QGridLayout();
1852 QLabel* img = new QLabel();
1853 img->setPixmap(QPixmap(":ntrip-logo.png"));
1854 dlgLayout->addWidget(img, 0,0);
1855 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1856 dlgLayout->addWidget(tb,1,0,1,2);
1857 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1858
1859 setLayout(dlgLayout);
1860 resize(60*ww, 60*ww);
1861 setWindowTitle("About BNC");
1862 show();
1863}
1864
1865//
1866////////////////////////////////////////////////////////////////////////////
1867bncAboutDlg::~bncAboutDlg() {
1868};
1869
1870// Flowchart
1871////////////////////////////////////////////////////////////////////////////
1872bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1873 QDialog(parent) {
1874
1875 int ww = QFontMetrics(font()).width('w');
1876 QPushButton* _closeButton = new QPushButton("Close");
1877 _closeButton->setMaximumWidth(10*ww);
1878 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1879
1880 QGridLayout* dlgLayout = new QGridLayout();
1881 QLabel* img = new QLabel();
1882 img->setPixmap(QPixmap(":bncflowchart.png"));
1883 dlgLayout->addWidget(img, 0,0);
1884 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1885
1886 setLayout(dlgLayout);
1887 setWindowTitle("Flow Chart");
1888 show();
1889}
1890
1891//
1892////////////////////////////////////////////////////////////////////////////
1893bncFlowchartDlg::~bncFlowchartDlg() {
1894};
1895
1896// Enable/Disable Widget (and change its color)
1897////////////////////////////////////////////////////////////////////////////
1898void bncWindow::enableWidget(bool enable, QWidget* widget) {
1899 const static QPalette paletteWhite(QColor(255, 255, 255));
1900 const static QPalette paletteGray(QColor(230, 230, 230));
1901
1902 widget->setEnabled(enable);
1903 if (enable) {
1904 widget->setPalette(paletteWhite);
1905 }
1906 else {
1907 widget->setPalette(paletteGray);
1908 }
1909}
1910
1911// Bnc Text
1912////////////////////////////////////////////////////////////////////////////
1913void bncWindow::slotBncTextChanged(){
1914
1915 bool enable = true;
1916
1917 // Proxy
1918 //------
1919 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1920 enable = !_proxyHostLineEdit->text().isEmpty();
1921 enableWidget(enable, _proxyPortLineEdit);
1922 }
1923
1924 // RINEX Observations
1925 // ------------------
1926 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1927 enable = !_rnxPathLineEdit->text().isEmpty();
1928 enableWidget(enable, _rnxSamplSpinBox);
1929 enableWidget(enable, _rnxSkelLineEdit);
1930 enableWidget(enable, _rnxScrpLineEdit);
1931 enableWidget(enable, _rnxV3CheckBox);
1932 enableWidget(enable, _rnxIntrComboBox);
1933 }
1934
1935 // RINEX Ephemeris
1936 // ---------------
1937 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1938 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
1939 enableWidget(enable, _ephIntrComboBox);
1940 enableWidget(enable, _ephV3CheckBox);
1941 }
1942
1943 // Broadcast Corrections
1944 // ---------------------
1945 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1946 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
1947 enableWidget(enable, _corrIntrComboBox);
1948 }
1949
1950 // Feed Engine
1951 // -----------
1952 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1953 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
1954 enableWidget(enable, _waitTimeSpinBox);
1955 enableWidget(enable, _binSamplSpinBox);
1956 }
1957
1958 // Serial Output
1959 // -------------
1960 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1961 sender() == _serialAutoNMEAComboBox) {
1962 enable = !_serialMountPointLineEdit->text().isEmpty();
1963 enableWidget(enable, _serialPortNameLineEdit);
1964 enableWidget(enable, _serialBaudRateComboBox);
1965 enableWidget(enable, _serialParityComboBox);
1966 enableWidget(enable, _serialDataBitsComboBox);
1967 enableWidget(enable, _serialStopBitsComboBox);
1968 enableWidget(enable, _serialFlowControlComboBox);
1969 enableWidget(enable, _serialAutoNMEAComboBox);
1970
1971 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
1972 enableWidget(enable2, _serialFileNMEALineEdit);
1973 }
1974
1975 // Outages
1976 // -------
1977 if (sender() == 0 || sender() == _obsRateComboBox) {
1978 enable = !_obsRateComboBox->currentText().isEmpty();
1979 enableWidget(enable, _adviseFailSpinBox);
1980 enableWidget(enable, _adviseRecoSpinBox);
1981 enableWidget(enable, _adviseScriptLineEdit);
1982 }
1983
1984 // Miscellaneous
1985 // -------------
1986 if (sender() == 0 || sender() == _miscMountLineEdit) {
1987 enable = !_miscMountLineEdit->text().isEmpty();
1988 enableWidget(enable, _perfIntrComboBox);
1989 enableWidget(enable, _scanRTCMCheckBox);
1990 }
1991
1992 // PPP Client
1993 // ----------
1994 if (sender() == 0
1995 || sender() == _pppMountLineEdit
1996 || sender() == _pppCorrMountLineEdit
1997 || sender() == _pppRefCrdXLineEdit
1998 || sender() == _pppRefCrdYLineEdit
1999 || sender() == _pppRefCrdZLineEdit
2000 || sender() == _pppRefdNLineEdit
2001 || sender() == _pppRefdELineEdit
2002 || sender() == _pppRefdULineEdit
2003 || sender() == _pppSync
2004 || sender() == _pppSPPComboBox
2005 || sender() == _pppQuickStartLineEdit
2006 || sender() == _pppEstTropoCheckBox
2007 || sender() == _pppUsePhaseCheckBox
2008 || sender() == _pppAntexFileChooser ) {
2009
2010 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2011 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "SPP") ||
2012 (_pppSPPComboBox->currentText() == "Post-Processing");
2013
2014 enableWidget(enable, _pppNMEALineEdit);
2015 enableWidget(enable, _pppNMEAPortLineEdit);
2016 enableWidget(enable, _pppRefCrdXLineEdit);
2017 enableWidget(enable, _pppRefCrdYLineEdit);
2018 enableWidget(enable, _pppRefCrdZLineEdit);
2019 enableWidget(enable, _pppRefdNLineEdit);
2020 enableWidget(enable, _pppRefdELineEdit);
2021 enableWidget(enable, _pppRefdULineEdit);
2022 enableWidget(enable, _pppUsePhaseCheckBox);
2023 enableWidget(enable, _pppPlotCoordinates);
2024 enableWidget(enable, _pppEstTropoCheckBox);
2025 enableWidget(enable, _pppGLONASSCheckBox);
2026 enableWidget(enable, _pppGalileoCheckBox);
2027 enableWidget(enable, _pppAntexFileChooser);
2028 enableWidget(enable, _pppSigCLineEdit);
2029 enableWidget(enable, _pppSigCrd0);
2030 enableWidget(enable, _pppSigCrdP);
2031
2032 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2033 !_pppRefCrdYLineEdit->text().isEmpty() &&
2034 !_pppRefCrdZLineEdit->text().isEmpty();
2035
2036 enableWidget(enable2, _pppAverageLineEdit);
2037 enableWidget(enable2, _pppQuickStartLineEdit);
2038
2039 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2040 enableWidget(enable3, _pppMaxSolGapLineEdit);
2041
2042 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2043 enableWidget(enable4, _pppAntennaLineEdit);
2044 enableWidget(enable4, _pppApplySatAntCheckBox);
2045
2046 bool enable5 = enable && _pppEstTropoCheckBox->isChecked() && !_pppMountLineEdit->text().isEmpty();
2047 enableWidget(enable5, _pppSigTrp0);
2048 enableWidget(enable5, _pppSigTrpP);
2049
2050 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2051 enableWidget(enable6, _pppSigPLineEdit);
2052
2053 bool enable7 = enable && _pppSPPComboBox->currentText() == "PPP";
2054 enableWidget(enable7, _pppSync);
2055 enableWidget(enable7, _pppCorrMountLineEdit);
2056
2057 bool enable8 = _pppSPPComboBox->currentText() == "Post-Processing";
2058 enableWidget(enable8, _postObsFileChooser);
2059 enableWidget(enable8, _postNavFileChooser);
2060 enableWidget(enable8, _postCorrFileChooser);
2061 enableWidget(enable8, _postOutLineEdit);
2062 _actPostProcessing->setEnabled(enable8);
2063
2064 enableWidget(!enable8, _pppMountLineEdit);
2065 }
2066}
2067
2068//
2069////////////////////////////////////////////////////////////////////////////
2070void bncWindow::slotAddCmbRow() {
2071 int iRow = _cmbTable->rowCount();
2072 _cmbTable->insertRow(iRow);
2073 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2074 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2075 }
2076}
2077
2078//
2079////////////////////////////////////////////////////////////////////////////
2080void bncWindow::slotDelCmbRow() {
2081 int nRows = _cmbTable->rowCount();
2082 bool flg[nRows];
2083 for (int iRow = 0; iRow < nRows; iRow++) {
2084 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2085 flg[iRow] = true;
2086 }
2087 else {
2088 flg[iRow] = false;
2089 }
2090 }
2091 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2092 if (flg[iRow]) {
2093 _cmbTable->removeRow(iRow);
2094 }
2095 }
2096}
2097
2098//
2099////////////////////////////////////////////////////////////////////////////
2100void bncWindow::populateCmbTable() {
2101
2102 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2103 _cmbTable->removeRow(iRow);
2104 }
2105
2106 bncSettings settings;
2107
2108 int iRow = -1;
2109 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2110 while (it.hasNext()) {
2111 QStringList hlp = it.next().split(" ");
2112 if (hlp.size() > 2) {
2113 ++iRow;
2114 _cmbTable->insertRow(iRow);
2115 }
2116 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2117 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2118 }
2119 }
2120}
2121
2122//
2123////////////////////////////////////////////////////////////////////////////
2124void bncWindow::slotAddUploadRow() {
2125 int iRow = _uploadTable->rowCount();
2126 _uploadTable->insertRow(iRow);
2127 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2128 if (iCol == 3) {
2129 QLineEdit* passwd = new QLineEdit();
2130 passwd->setFrame(false);
2131 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2132 _uploadTable->setCellWidget(iRow, iCol, passwd);
2133 }
2134 else if (iCol == 4) {
2135 QComboBox* system = new QComboBox();
2136 system->setEditable(false);
2137 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2138 system->setFrame(false);
2139 _uploadTable->setCellWidget(iRow, iCol, system);
2140 }
2141 else if (iCol == 5) {
2142 QCheckBox* com = new QCheckBox();
2143 _uploadTable->setCellWidget(iRow, iCol, com);
2144 }
2145 else if (iCol == 8) {
2146 bncTableItem* bncIt = new bncTableItem();
2147 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2148 _uploadTable->setItem(iRow, iCol, bncIt);
2149 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2150 }
2151 else {
2152 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2153 }
2154 }
2155}
2156
2157//
2158////////////////////////////////////////////////////////////////////////////
2159void bncWindow::slotDelUploadRow() {
2160 ((bncApp*)qApp)->_uploadTableItems.clear();
2161 int nRows = _uploadTable->rowCount();
2162 bool flg[nRows];
2163 for (int iRow = 0; iRow < nRows; iRow++) {
2164 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2165 flg[iRow] = true;
2166 }
2167 else {
2168 flg[iRow] = false;
2169 }
2170 }
2171 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2172 if (flg[iRow]) {
2173 _uploadTable->removeRow(iRow);
2174 }
2175 }
2176 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2177 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2178 (bncTableItem*) _uploadTable->item(iRow, 8);
2179 }
2180}
2181
2182//
2183////////////////////////////////////////////////////////////////////////////
2184void bncWindow::populateUploadTable() {
2185 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2186 _uploadTable->removeRow(iRow);
2187 }
2188
2189 bncSettings settings;
2190
2191 int iRow = -1;
2192 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2193 while (it.hasNext()) {
2194 QStringList hlp = it.next().split(",");
2195 if (hlp.size() > 6) {
2196 ++iRow;
2197 _uploadTable->insertRow(iRow);
2198 }
2199 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2200 if (iCol == 3) {
2201 QLineEdit* passwd = new QLineEdit();
2202 passwd->setFrame(false);
2203 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2204 passwd->setText(hlp[iCol]);
2205 _uploadTable->setCellWidget(iRow, iCol, passwd);
2206 }
2207 else if (iCol == 4) {
2208 QComboBox* system = new QComboBox();
2209 system->setEditable(false);
2210 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2211 system->setFrame(false);
2212 system->setCurrentIndex(system->findText(hlp[iCol]));
2213 _uploadTable->setCellWidget(iRow, iCol, system);
2214 }
2215 else if (iCol == 5) {
2216 QCheckBox* com = new QCheckBox();
2217 if (hlp[iCol].toInt() == Qt::Checked) {
2218 com->setCheckState(Qt::Checked);
2219 }
2220 _uploadTable->setCellWidget(iRow, iCol, com);
2221 }
2222 else if (iCol == 8) {
2223 bncTableItem* bncIt = new bncTableItem();
2224 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2225 _uploadTable->setItem(iRow, iCol, bncIt);
2226 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2227 }
2228 else {
2229 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2230 }
2231 }
2232 }
2233}
2234
2235//
2236////////////////////////////////////////////////////////////////////////////
2237void bncWindow::slotSetUploadTrafo() {
2238 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2239 dlg->exec();
2240 delete dlg;
2241}
2242
2243// Start Post-Processing
2244////////////////////////////////////////////////////////////////////////////
2245void bncWindow::slotStartPostProcessing() {
2246
2247 _actPostProcessing->setEnabled(false);
2248
2249 slotSaveOptions();
2250
2251 _postProgressBar->reset();
2252 enableWidget(true, _postProgressLabel);
2253
2254 t_postProcessing* postProcessing = new t_postProcessing(this);
2255 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessing()));
2256 connect(postProcessing, SIGNAL(progress(float)), this, SLOT(slotPostProgress(float)));
2257
2258 postProcessing->start();
2259}
2260
2261// Post-Processing Finished
2262////////////////////////////////////////////////////////////////////////////
2263void bncWindow::slotFinishedPostProcessing() {
2264 enableWidget(false, _postProgressLabel);
2265 _postProgressBar->reset();
2266 _actPostProcessing->setEnabled(true);
2267}
2268
2269// Progress Bar Change
2270////////////////////////////////////////////////////////////////////////////
2271void bncWindow::slotPostProgress(float progress) {
2272 if (_postProgressBar) {
2273 _postProgressBar->setValue(int(progress*100.0));
2274 }
2275}
Note: See TracBrowser for help on using the repository browser.