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

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