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

Last change on this file since 3618 was 3618, checked in by mervart, 12 years ago
File size: 112.9 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 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
938
939 int ir = 0;
940 pppLayout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 1)</b>"), ir, 0, 1, 8);
941 ++ir;
942 pppLayout->addWidget(new QLabel("Obs Mountpoint"), ir, 0);
943 pppLayout->addWidget(_pppMountLineEdit, ir, 1);
944 pppLayout->addWidget(_pppSPPComboBox, ir, 2);
945 pppLayout->addWidget(new QLabel(" X "), ir, 3, Qt::AlignRight);
946 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 4);
947 pppLayout->addWidget(new QLabel(" Y "), ir, 5, Qt::AlignRight);
948 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 6);
949 pppLayout->addWidget(new QLabel(" Z "), ir, 7, Qt::AlignRight);
950 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 8);
951 ++ir;
952 pppLayout->addWidget(new QLabel("Corr Mountpoint "), ir, 0);
953 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 1);
954 pppLayout->addWidget(new QLabel(" dN "), ir, 3, Qt::AlignRight);
955 pppLayout->addWidget(_pppRefdNLineEdit, ir, 4);
956 pppLayout->addWidget(new QLabel(" dE "), ir, 5, Qt::AlignRight);
957 pppLayout->addWidget(_pppRefdELineEdit, ir, 6);
958 pppLayout->addWidget(new QLabel(" dU "), ir, 7, Qt::AlignRight);
959 pppLayout->addWidget(_pppRefdULineEdit, ir, 8);
960 ++ir;
961 pppLayout->addWidget(new QLabel("Output"), ir, 0);
962 pppLayout->addWidget(_pppNMEALineEdit, ir, 1, 1, 3);
963 pppLayout->addWidget(new QLabel("NMEA File"), ir, 4);
964 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 5, Qt::AlignRight);
965 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 6);
966 pppLayout->addWidget(_pppPlotCoordinates, ir, 7, Qt::AlignRight);
967 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 8);
968 ++ir;
969 pppLayout->addWidget(new QLabel("<b>Post-Processing</b>"));
970 QHBoxLayout* hlpLayout = new QHBoxLayout;
971 {
972 hlpLayout->addWidget(_postObsFileChooser);
973 hlpLayout->addWidget(new QLabel("Obs"));
974 hlpLayout->addWidget(_postNavFileChooser);
975 hlpLayout->addWidget(new QLabel("Nav"));
976 hlpLayout->addWidget(_postCorrFileChooser);
977 hlpLayout->addWidget(new QLabel("Corr"));
978 }
979 pppLayout->addLayout(hlpLayout, ir, 1, 1, 7);
980 ++ir;
981 pppLayout->addWidget(_postOutLineEdit);
982 pppLayout->addWidget(new QLabel("Output"));
983
984 pppgroup->setLayout(pppLayout);
985
986 // PPP Client (second panel)
987 // -------------------------
988 QGridLayout* ppp2Layout = new QGridLayout;
989 ir = 0;
990 ppp2Layout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 2)</b>"), ir, 0, 1, 8);
991 ++ir;
992 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
993 ppp2Layout->addWidget(_pppAntexLineEdit, ir, 1, 1, 3);
994 ppp2Layout->addWidget(new QLabel("ANTEX File "), ir, 4);
995 ppp2Layout->addWidget(_pppAntennaLineEdit, ir, 5, 1, 3);
996 ppp2Layout->addWidget(new QLabel("Rec. Ant. Name"), ir, 8);
997 ++ir;
998 ppp2Layout->addWidget(new QLabel("Satellite Antenna "), ir, 0);
999 ppp2Layout->addWidget(_pppApplySatAntCheckBox, ir, 1, Qt::AlignRight);
1000 ppp2Layout->addWidget(new QLabel("Apply Offsets"), ir, 2, Qt::AlignLeft);
1001 ++ir;
1002 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
1003 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1004 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1005 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1006 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1007 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1008 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1009 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1010 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1011 ++ir;
1012 ppp2Layout->addWidget(new QLabel("Options"), ir, 0, 1, 5);
1013 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
1014 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
1015 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
1016 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
1017 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
1018 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
1019 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
1020 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
1021 ++ir;
1022 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1023 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1024 ppp2Layout->addWidget(new QLabel("Sigma XYZ Init "), ir, 2);
1025 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1026 ppp2Layout->addWidget(new QLabel("Sigma XYZ Noise "), ir, 4);
1027 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
1028 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
1029 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
1030 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
1031 ++ir;
1032 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1033 ppp2Layout->addWidget(_pppSync, ir, 1);
1034 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
1035 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
1036 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
1037
1038 ppp2group->setLayout(ppp2Layout);
1039
1040 // Combination
1041 // -----------
1042 QGridLayout* cmbLayout = new QGridLayout;
1043
1044 populateCmbTable();
1045 cmbLayout->addWidget(_cmbTable,0,0,6,3);
1046
1047 cmbLayout->addWidget(addCmbRowButton,1,3);
1048 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1049 cmbLayout->addWidget(delCmbRowButton,2,3);
1050 cmbLayout->addWidget(new QLabel("Method"), 3, 3);
1051 cmbLayout->addWidget(_cmbMethodComboBox, 3, 4, Qt::AlignRight);
1052 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 4, 3);
1053 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 4, Qt::AlignRight);
1054 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1055
1056 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,3);
1057
1058 cmbgroup->setLayout(cmbLayout);
1059
1060 // Upload Layout (Clocks)
1061 // ----------------------
1062 QGridLayout* uploadHlpLayout = new QGridLayout();
1063
1064 uploadHlpLayout->addWidget(new QLabel("Upload RTNet or Combination Results"),0,0);
1065
1066 uploadHlpLayout->addWidget(addUploadRowButton,0,1);
1067 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1068
1069 uploadHlpLayout->addWidget(delUploadRowButton,0,2);
1070 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1071
1072 uploadHlpLayout->addWidget(setUploadTrafoButton,1,1);
1073 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1074
1075 uploadHlpLayout->addWidget(new QLabel("Interval"),0,3, Qt::AlignRight);
1076 uploadHlpLayout->addWidget(_uploadIntrComboBox,0,4);
1077
1078 uploadHlpLayout->addWidget(new QLabel("Sampling"),1,3, Qt::AlignRight);
1079 uploadHlpLayout->addWidget(_uploadSamplSpinBox,1,4);
1080
1081 uploadHlpLayout->addWidget(new QLabel("Sampling (Orb)"),1,5, Qt::AlignRight);
1082 uploadHlpLayout->addWidget(_uploadSamplOrbSpinBox,1,6);
1083
1084 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1085 populateUploadTable();
1086 uploadLayout->addWidget(_uploadTable);
1087 uploadLayout->addLayout(uploadHlpLayout);
1088
1089 uploadgroup->setLayout(uploadLayout);
1090
1091 // Upload Layout (Ephemeris)
1092 // -------------------------
1093 QGridLayout* uploadLayoutEph = new QGridLayout;
1094
1095 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1096 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1097 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1098 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1099
1100 uploadLayoutEph->addWidget(new QLabel("Host"), 0, 0);
1101 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 0, 1, 1, 3);
1102 uploadLayoutEph->addWidget(new QLabel(" Port"), 0, 4, Qt::AlignRight);
1103 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 0, 5, 1, 1);
1104 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 1, 0);
1105 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 1, 1);
1106 uploadLayoutEph->addWidget(new QLabel(" Password"), 1, 2, Qt::AlignRight);
1107 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 1, 3);
1108 uploadLayoutEph->addWidget(new QLabel("Sampling"), 2, 0);
1109 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 2, 1);
1110 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 3, 0, 1, 5);
1111 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 3, 5);
1112
1113 uploadEphgroup->setLayout(uploadLayoutEph);
1114
1115 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1116 this, SLOT(slotBncTextChanged()));
1117
1118 // Main Layout
1119 // -----------
1120 QGridLayout* mLayout = new QGridLayout;
1121 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1122 mLayout->addWidget(_aogroup, 0,0);
1123 mLayout->addWidget(_mountPointsTable, 1,0);
1124 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1125 mLayout->addWidget(_loggroup, 2,0);
1126
1127 _canvas->setLayout(mLayout);
1128
1129 // Enable/Disable all Widgets
1130 // --------------------------
1131 slotBncTextChanged();
1132
1133 // Auto start
1134 // ----------
1135 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1136 slotGetData();
1137 }
1138}
1139
1140// Destructor
1141////////////////////////////////////////////////////////////////////////////
1142bncWindow::~bncWindow() {
1143 delete _caster;
1144 delete _casterEph;
1145}
1146
1147//
1148////////////////////////////////////////////////////////////////////////////
1149void bncWindow::populateMountPointsTable() {
1150
1151 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1152 _mountPointsTable->removeRow(iRow);
1153 }
1154
1155 bncSettings settings;
1156
1157 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1158 if (!it.hasNext()) {
1159 _actGetData->setEnabled(false);
1160 }
1161 int iRow = 0;
1162 while (it.hasNext()) {
1163 QStringList hlp = it.next().split(" ");
1164 if (hlp.size() < 5) continue;
1165 _mountPointsTable->insertRow(iRow);
1166
1167 QUrl url(hlp[0]);
1168
1169 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1170 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1171 QString nmea(hlp[4]);
1172 if (hlp[5] == "S") {
1173 fullPath = hlp[0].replace(0,2,"");
1174 }
1175 QString ntripVersion = "2";
1176 if (hlp.size() >= 6) {
1177 ntripVersion = (hlp[5]);
1178 }
1179
1180 QTableWidgetItem* it;
1181 it = new QTableWidgetItem(url.userInfo());
1182 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1183 _mountPointsTable->setItem(iRow, 0, it);
1184
1185 it = new QTableWidgetItem(fullPath);
1186 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1187 _mountPointsTable->setItem(iRow, 1, it);
1188
1189 it = new QTableWidgetItem(format);
1190 _mountPointsTable->setItem(iRow, 2, it);
1191
1192 if (nmea == "yes") {
1193 it = new QTableWidgetItem(latitude);
1194 _mountPointsTable->setItem(iRow, 3, it);
1195 it = new QTableWidgetItem(longitude);
1196 _mountPointsTable->setItem(iRow, 4, it);
1197 } else {
1198 it = new QTableWidgetItem(latitude);
1199 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1200 _mountPointsTable->setItem(iRow, 3, it);
1201 it = new QTableWidgetItem(longitude);
1202 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1203 _mountPointsTable->setItem(iRow, 4, it);
1204 }
1205
1206 it = new QTableWidgetItem(nmea);
1207 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1208 _mountPointsTable->setItem(iRow, 5, it);
1209
1210 it = new QTableWidgetItem(ntripVersion);
1211 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1212 _mountPointsTable->setItem(iRow, 6, it);
1213
1214 bncTableItem* bncIt = new bncTableItem();
1215 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1216 _mountPointsTable->setItem(iRow, 7, bncIt);
1217
1218 iRow++;
1219 }
1220
1221 _mountPointsTable->sortItems(1);
1222}
1223
1224// Retrieve Table
1225////////////////////////////////////////////////////////////////////////////
1226void bncWindow::slotAddMountPoints() {
1227
1228 bncSettings settings;
1229 QString proxyHost = settings.value("proxyHost").toString();
1230 int proxyPort = settings.value("proxyPort").toInt();
1231 if (proxyHost != _proxyHostLineEdit->text() ||
1232 proxyPort != _proxyPortLineEdit->text().toInt()) {
1233 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1234 "changed. Use the new ones?",
1235 QMessageBox::Yes, QMessageBox::No,
1236 QMessageBox::NoButton);
1237 if (iRet == QMessageBox::Yes) {
1238 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1239 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1240 settings.sync();
1241 }
1242 }
1243
1244 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1245 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1246 settings.sync();
1247
1248 QMessageBox msgBox;
1249 msgBox.setIcon(QMessageBox::Question);
1250 msgBox.setWindowTitle("Add Stream");
1251 msgBox.setText("Add stream(s) coming from:");
1252
1253 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1254 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1255 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1256 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1257 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1258
1259 msgBox.exec();
1260
1261 if (msgBox.clickedButton() == buttonNtrip) {
1262 bncTableDlg* dlg = new bncTableDlg(this);
1263 dlg->move(this->pos().x()+50, this->pos().y()+50);
1264 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1265 this, SLOT(slotNewMountPoints(QStringList*)));
1266 dlg->exec();
1267 delete dlg;
1268 } else if (msgBox.clickedButton() == buttonIP) {
1269 bncIpPort* ipp = new bncIpPort(this);
1270 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1271 this, SLOT(slotNewMountPoints(QStringList*)));
1272 ipp->exec();
1273 delete ipp;
1274 } else if (msgBox.clickedButton() == buttonUDP) {
1275 bncUdpPort* udp = new bncUdpPort(this);
1276 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1277 this, SLOT(slotNewMountPoints(QStringList*)));
1278 udp->exec();
1279 delete udp;
1280 } else if (msgBox.clickedButton() == buttonSerial) {
1281 bncSerialPort* sep = new bncSerialPort(this);
1282 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1283 this, SLOT(slotNewMountPoints(QStringList*)));
1284 sep->exec();
1285 delete sep;
1286 } else if (msgBox.clickedButton() == buttonCancel) {
1287 // Cancel
1288 }
1289}
1290
1291// Delete Selected Mount Points
1292////////////////////////////////////////////////////////////////////////////
1293void bncWindow::slotDeleteMountPoints() {
1294
1295 int nRows = _mountPointsTable->rowCount();
1296 bool flg[nRows];
1297 for (int iRow = 0; iRow < nRows; iRow++) {
1298 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1299 flg[iRow] = true;
1300 }
1301 else {
1302 flg[iRow] = false;
1303 }
1304 }
1305 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1306 if (flg[iRow]) {
1307 _mountPointsTable->removeRow(iRow);
1308 }
1309 }
1310 _actDeleteMountPoints->setEnabled(false);
1311
1312 if (_mountPointsTable->rowCount() == 0) {
1313 _actGetData->setEnabled(false);
1314 }
1315}
1316
1317// New Mount Points Selected
1318////////////////////////////////////////////////////////////////////////////
1319void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1320 int iRow = 0;
1321 QListIterator<QString> it(*mountPoints);
1322 while (it.hasNext()) {
1323 QStringList hlp = it.next().split(" ");
1324 QUrl url(hlp[0]);
1325 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1326 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1327 QString nmea(hlp[4]);
1328 if (hlp[5] == "S") {
1329 fullPath = hlp[0].replace(0,2,"");
1330 }
1331 QString ntripVersion = "2";
1332 if (hlp.size() >= 6) {
1333 ntripVersion = (hlp[5]);
1334 }
1335
1336 _mountPointsTable->insertRow(iRow);
1337
1338 QTableWidgetItem* it;
1339 it = new QTableWidgetItem(url.userInfo());
1340 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1341 _mountPointsTable->setItem(iRow, 0, it);
1342
1343 it = new QTableWidgetItem(fullPath);
1344 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1345 _mountPointsTable->setItem(iRow, 1, it);
1346
1347 it = new QTableWidgetItem(format);
1348 _mountPointsTable->setItem(iRow, 2, it);
1349
1350 if (nmea == "yes") {
1351 it = new QTableWidgetItem(latitude);
1352 _mountPointsTable->setItem(iRow, 3, it);
1353 it = new QTableWidgetItem(longitude);
1354 _mountPointsTable->setItem(iRow, 4, it);
1355 } else {
1356 it = new QTableWidgetItem(latitude);
1357 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1358 _mountPointsTable->setItem(iRow, 3, it);
1359 it = new QTableWidgetItem(longitude);
1360 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1361 _mountPointsTable->setItem(iRow, 4, it);
1362 }
1363
1364 it = new QTableWidgetItem(nmea);
1365 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1366 _mountPointsTable->setItem(iRow, 5, it);
1367
1368 it = new QTableWidgetItem(ntripVersion);
1369 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1370 _mountPointsTable->setItem(iRow, 6, it);
1371
1372 bncTableItem* bncIt = new bncTableItem();
1373 _mountPointsTable->setItem(iRow, 7, bncIt);
1374
1375 iRow++;
1376 }
1377 _mountPointsTable->hideColumn(0);
1378 _mountPointsTable->sortItems(1);
1379 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1380 _actGetData->setEnabled(true);
1381 }
1382 delete mountPoints;
1383}
1384
1385// Save Options
1386////////////////////////////////////////////////////////////////////////////
1387void bncWindow::slotSaveOptions() {
1388
1389 QStringList mountPoints;
1390 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1391
1392 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1393 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1394 "@" + _mountPointsTable->item(iRow, 1)->text() );
1395
1396 mountPoints.append(url.toString() + " " +
1397 _mountPointsTable->item(iRow, 2)->text()
1398 + " " + _mountPointsTable->item(iRow, 3)->text()
1399 + " " + _mountPointsTable->item(iRow, 4)->text()
1400 + " " + _mountPointsTable->item(iRow, 5)->text()
1401 + " " + _mountPointsTable->item(iRow, 6)->text());
1402 } else {
1403 mountPoints.append(
1404 "//" + _mountPointsTable->item(iRow, 1)->text()
1405 + " " + _mountPointsTable->item(iRow, 2)->text()
1406 + " " + _mountPointsTable->item(iRow, 3)->text()
1407 + " " + _mountPointsTable->item(iRow, 4)->text()
1408 + " " + _mountPointsTable->item(iRow, 5)->text()
1409 + " " + _mountPointsTable->item(iRow, 6)->text());
1410 }
1411 }
1412
1413 QStringList combineStreams;
1414 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1415 QString hlp;
1416 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1417 if (_cmbTable->item(iRow, iCol)) {
1418 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1419 }
1420 }
1421 if (!hlp.isEmpty()) {
1422 combineStreams << hlp;
1423 }
1424 }
1425
1426 QStringList uploadMountpointsOut;
1427 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1428 QString hlp;
1429 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1430 if (_uploadTable->cellWidget(iRow, iCol) &&
1431 (iCol == 3 || iCol == 4 || iCol == 5)) {
1432 if (iCol == 3) {
1433 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1434 hlp += passwd->text() + ",";
1435 }
1436 else if (iCol == 4) {
1437 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1438 hlp += system->currentText() + ",";
1439 }
1440 else if (iCol == 5) {
1441 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1442 QString state; state.setNum(com->checkState());
1443 hlp += state + ",";
1444 }
1445 }
1446 else if (_uploadTable->item(iRow, iCol)) {
1447 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1448 }
1449 }
1450 if (!hlp.isEmpty()) {
1451 uploadMountpointsOut << hlp;
1452 }
1453 }
1454
1455 bncSettings settings;
1456
1457 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1458 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1459 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1460 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1461 settings.setValue("binSampl", _binSamplSpinBox->value());
1462 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1463 settings.setValue("corrPath", _corrPathLineEdit->text());
1464 settings.setValue("corrPort", _corrPortLineEdit->text());
1465 settings.setValue("corrTime", _corrTimeSpinBox->value());
1466 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1467 settings.setValue("ephPath", _ephPathLineEdit->text());
1468 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1469 settings.setValue("logFile", _logFileLineEdit->text());
1470 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1471 settings.setValue("miscMount", _miscMountLineEdit->text());
1472 settings.setValue("pppMount", _pppMountLineEdit->text());
1473 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1474 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1475 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1476 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1477 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1478 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1479 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1480 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1481 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1482 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1483 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1484 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1485 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1486 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1487 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1488 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1489 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1490 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1491 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1492 settings.setValue("pppSync", _pppSync->text());
1493 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1494 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1495 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1496 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1497 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1498 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1499 settings.setValue("pppAntex", _pppAntexLineEdit->text());
1500 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1501 settings.setValue("mountPoints", mountPoints);
1502 settings.setValue("obsRate", _obsRateComboBox->currentText());
1503 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1504 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1505 settings.setValue("outFile", _outFileLineEdit->text());
1506 settings.setValue("outPort", _outPortLineEdit->text());
1507 settings.setValue("outUPort", _outUPortLineEdit->text());
1508 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1509 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1510 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1511 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1512 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1513 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1514 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1515 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1516 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1517 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1518 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1519 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1520 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1521 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1522 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1523 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1524 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1525 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1526 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1527 settings.setValue("serialParity", _serialParityComboBox->currentText());
1528 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1529 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1530 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1531 settings.setValue("startTab", _aogroup->currentIndex());
1532 settings.setValue("statusTab", _loggroup->currentIndex());
1533 settings.setValue("waitTime", _waitTimeSpinBox->value());
1534 if (!combineStreams.isEmpty()) {
1535 settings.setValue("combineStreams", combineStreams);
1536 }
1537 else {
1538 settings.setValue("combineStreams", "");
1539 }
1540 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1541 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1542
1543 if (!uploadMountpointsOut.isEmpty()) {
1544 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1545 }
1546 else {
1547 settings.setValue("uploadMountpointsOut", "");
1548 }
1549 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1550 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1551 settings.setValue("uploadSamplOrb", _uploadSamplOrbSpinBox->value());
1552
1553 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1554 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1555 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1556 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1557 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1558
1559 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1560 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1561 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1562 settings.setValue("postOutFile", _postOutLineEdit->text());
1563
1564 if (_caster) {
1565 _caster->slotReadMountPoints();
1566 }
1567 settings.sync();
1568}
1569
1570// All get slots terminated
1571////////////////////////////////////////////////////////////////////////////
1572void bncWindow::slotGetThreadsFinished() {
1573 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1574 delete _caster; _caster = 0;
1575 delete _casterEph; _casterEph = 0;
1576 _actGetData->setEnabled(true);
1577 _actStop->setEnabled(false);
1578}
1579
1580// Retrieve Data
1581////////////////////////////////////////////////////////////////////////////
1582void bncWindow::slotGetData() {
1583 slotSaveOptions();
1584
1585 _bncFigurePPP->reset();
1586
1587 _actDeleteMountPoints->setEnabled(false);
1588 _actGetData->setEnabled(false);
1589 _actStop->setEnabled(true);
1590
1591 _caster = new bncCaster(_outFileLineEdit->text(),
1592 _outPortLineEdit->text().toInt());
1593
1594 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1595 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1596 ((bncApp*)qApp)->initCombination();
1597
1598 connect(_caster, SIGNAL(getThreadsFinished()),
1599 this, SLOT(slotGetThreadsFinished()));
1600
1601 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1602 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1603
1604 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1605
1606 bncSettings settings;
1607
1608 QDir rnxdir(settings.value("rnxPath").toString());
1609 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1610
1611 QString rnx_file = settings.value("rnxScript").toString();
1612 if ( !rnx_file.isEmpty() ) {
1613 QFile rnxfile(settings.value("rnxScript").toString());
1614 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1615 }
1616
1617 QDir ephdir(settings.value("ephPath").toString());
1618 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1619
1620 QDir corrdir(settings.value("corrPath").toString());
1621 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1622
1623 QString advise_file = settings.value("adviseScript").toString();
1624 if ( !advise_file.isEmpty() ) {
1625 QFile advisefile(settings.value("adviseScript").toString());
1626 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1627 }
1628
1629 QString ant_file = settings.value("pppAntex").toString();
1630 if ( !ant_file.isEmpty() ) {
1631 QFile anxfile(settings.value("pppAntex").toString());
1632 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1633 }
1634
1635 _caster->slotReadMountPoints();
1636
1637 _casterEph = new bncEphUploadCaster();
1638 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1639 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1640}
1641
1642// Retrieve Data
1643////////////////////////////////////////////////////////////////////////////
1644void bncWindow::slotStop() {
1645 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1646 QMessageBox::Yes, QMessageBox::No,
1647 QMessageBox::NoButton);
1648 if (iRet == QMessageBox::Yes) {
1649 ((bncApp*)qApp)->stopCombination();
1650 delete _caster; _caster = 0;
1651 delete _casterEph; _casterEph = 0;
1652 _actGetData->setEnabled(true);
1653 _actStop->setEnabled(false);
1654 }
1655}
1656
1657// Close Application gracefully
1658////////////////////////////////////////////////////////////////////////////
1659void bncWindow::closeEvent(QCloseEvent* event) {
1660
1661 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1662 QMessageBox::Yes, QMessageBox::No,
1663 QMessageBox::Cancel);
1664
1665 if (iRet == QMessageBox::Cancel) {
1666 event->ignore();
1667 return;
1668 }
1669 else if (iRet == QMessageBox::Yes) {
1670 slotSaveOptions();
1671 }
1672
1673 QMainWindow::closeEvent(event);
1674}
1675
1676// User changed the selection of mountPoints
1677////////////////////////////////////////////////////////////////////////////
1678void bncWindow::slotSelectionChanged() {
1679 if (_mountPointsTable->selectedItems().isEmpty()) {
1680 _actDeleteMountPoints->setEnabled(false);
1681 }
1682 else {
1683 _actDeleteMountPoints->setEnabled(true);
1684 }
1685}
1686
1687// Display Program Messages
1688////////////////////////////////////////////////////////////////////////////
1689void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1690
1691#ifdef DEBUG_RTCM2_2021
1692 const int maxBufferSize = 1000;
1693#else
1694 const int maxBufferSize = 10000;
1695#endif
1696
1697 if (! showOnScreen ) {
1698 return;
1699 }
1700
1701 QString txt = _log->toPlainText() + "\n" +
1702 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1703 _log->clear();
1704 _log->append(txt.right(maxBufferSize));
1705}
1706
1707// About Message
1708////////////////////////////////////////////////////////////////////////////
1709void bncWindow::slotAbout() {
1710 new bncAboutDlg(0);
1711}
1712
1713//Flowchart
1714////////////////////////////////////////////////////////////////////////////
1715void bncWindow::slotFlowchart() {
1716 new bncFlowchartDlg(0);
1717}
1718
1719// Help Window
1720////////////////////////////////////////////////////////////////////////////
1721void bncWindow::slotHelp() {
1722 QUrl url;
1723 url.setPath(":bnchelp.html");
1724 new bncHlpDlg(0, url);
1725}
1726
1727// Select Fonts
1728////////////////////////////////////////////////////////////////////////////
1729void bncWindow::slotFontSel() {
1730 bool ok;
1731 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1732 if (ok) {
1733 bncSettings settings;
1734 settings.setValue("font", newFont.toString());
1735 QApplication::setFont(newFont);
1736 int ww = QFontMetrics(newFont).width('w');
1737 setMinimumSize(60*ww, 80*ww);
1738 resize(60*ww, 80*ww);
1739 }
1740}
1741
1742// Whats This Help
1743void bncWindow::slotWhatsThis() {
1744 QWhatsThis::enterWhatsThisMode();
1745}
1746
1747//
1748////////////////////////////////////////////////////////////////////////////
1749void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1750 _bncFigure->updateMountPoints();
1751 _bncFigureLate->updateMountPoints();
1752
1753 populateMountPointsTable();
1754 bncSettings settings;
1755 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1756 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1757 QListIterator<bncGetThread*> iTh(threads);
1758 while (iTh.hasNext()) {
1759 bncGetThread* thread = iTh.next();
1760 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1761 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1762 "@" + _mountPointsTable->item(iRow, 1)->text() );
1763 if (url == thread->mountPoint() &&
1764 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1765 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1766 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1767 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1768 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1769 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1770 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1771 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1772 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1773 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1774 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1775 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1776 disconnect(thread,
1777 SIGNAL(newPosition(bncTime, double, double, double)),
1778 _bncFigurePPP,
1779 SLOT(slotNewPosition(bncTime, double, double, double)));
1780 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1781 _bncFigurePPP,
1782 SLOT(slotNewPosition(bncTime, double, double, double)));
1783 }
1784 break;
1785 }
1786 }
1787 }
1788}
1789
1790//
1791////////////////////////////////////////////////////////////////////////////
1792void bncWindow::CreateMenu() {
1793 // Create Menus
1794 // ------------
1795 _menuFile = menuBar()->addMenu(tr("&File"));
1796 _menuFile->addAction(_actFontSel);
1797 _menuFile->addSeparator();
1798 _menuFile->addAction(_actSaveOpt);
1799 _menuFile->addSeparator();
1800 _menuFile->addAction(_actQuit);
1801
1802 _menuHlp = menuBar()->addMenu(tr("&Help"));
1803 _menuHlp->addAction(_actHelp);
1804 _menuHlp->addAction(_actFlowchart);
1805 _menuHlp->addAction(_actAbout);
1806}
1807
1808// Toolbar
1809////////////////////////////////////////////////////////////////////////////
1810void bncWindow::AddToolbar() {
1811 // Tool (Command) Bar
1812 // ------------------
1813 QToolBar* toolBar = new QToolBar;
1814 addToolBar(Qt::BottomToolBarArea, toolBar);
1815 toolBar->setMovable(false);
1816 toolBar->addAction(_actAddMountPoints);
1817 toolBar->addAction(_actDeleteMountPoints);
1818 toolBar->addAction(_actGetData);
1819 toolBar->addAction(_actStop);
1820 toolBar->addAction(_actPostProcessing);
1821 _postProgressLabel = new QLabel(" Progress");
1822 toolBar->addWidget(_postProgressLabel);
1823 toolBar->addWidget(_postProgressBar);
1824 enableWidget(false, _postProgressLabel);
1825 enableWidget(false, _postProgressBar);
1826 toolBar->addWidget(new QLabel(" "));
1827 toolBar->addAction(_actwhatsthis);
1828}
1829
1830// About
1831////////////////////////////////////////////////////////////////////////////
1832bncAboutDlg::bncAboutDlg(QWidget* parent) :
1833 QDialog(parent) {
1834
1835 QTextBrowser* tb = new QTextBrowser;
1836 QUrl url; url.setPath(":bncabout.html");
1837 tb->setSource(url);
1838 tb->setReadOnly(true);
1839
1840 int ww = QFontMetrics(font()).width('w');
1841 QPushButton* _closeButton = new QPushButton("Close");
1842 _closeButton->setMaximumWidth(10*ww);
1843 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1844
1845 QGridLayout* dlgLayout = new QGridLayout();
1846 QLabel* img = new QLabel();
1847 img->setPixmap(QPixmap(":ntrip-logo.png"));
1848 dlgLayout->addWidget(img, 0,0);
1849 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1850 dlgLayout->addWidget(tb,1,0,1,2);
1851 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1852
1853 setLayout(dlgLayout);
1854 resize(60*ww, 60*ww);
1855 setWindowTitle("About BNC");
1856 show();
1857}
1858
1859//
1860////////////////////////////////////////////////////////////////////////////
1861bncAboutDlg::~bncAboutDlg() {
1862};
1863
1864// Flowchart
1865////////////////////////////////////////////////////////////////////////////
1866bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1867 QDialog(parent) {
1868
1869 int ww = QFontMetrics(font()).width('w');
1870 QPushButton* _closeButton = new QPushButton("Close");
1871 _closeButton->setMaximumWidth(10*ww);
1872 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1873
1874 QGridLayout* dlgLayout = new QGridLayout();
1875 QLabel* img = new QLabel();
1876 img->setPixmap(QPixmap(":bncflowchart.png"));
1877 dlgLayout->addWidget(img, 0,0);
1878 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1879
1880 setLayout(dlgLayout);
1881 setWindowTitle("Flow Chart");
1882 show();
1883}
1884
1885//
1886////////////////////////////////////////////////////////////////////////////
1887bncFlowchartDlg::~bncFlowchartDlg() {
1888};
1889
1890// Enable/Disable Widget (and change its color)
1891////////////////////////////////////////////////////////////////////////////
1892void bncWindow::enableWidget(bool enable, QWidget* widget) {
1893 const static QPalette paletteWhite(QColor(255, 255, 255));
1894 const static QPalette paletteGray(QColor(230, 230, 230));
1895
1896 widget->setEnabled(enable);
1897 if (enable) {
1898 widget->setPalette(paletteWhite);
1899 }
1900 else {
1901 widget->setPalette(paletteGray);
1902 }
1903}
1904
1905// Bnc Text
1906////////////////////////////////////////////////////////////////////////////
1907void bncWindow::slotBncTextChanged(){
1908
1909 bool enable = true;
1910
1911 // Proxy
1912 //------
1913 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1914 enable = !_proxyHostLineEdit->text().isEmpty();
1915 enableWidget(enable, _proxyPortLineEdit);
1916 }
1917
1918 // RINEX Observations
1919 // ------------------
1920 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1921 enable = !_rnxPathLineEdit->text().isEmpty();
1922 enableWidget(enable, _rnxSamplSpinBox);
1923 enableWidget(enable, _rnxSkelLineEdit);
1924 enableWidget(enable, _rnxScrpLineEdit);
1925 enableWidget(enable, _rnxV3CheckBox);
1926 enableWidget(enable, _rnxIntrComboBox);
1927 }
1928
1929 // RINEX Ephemeris
1930 // ---------------
1931 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1932 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
1933 enableWidget(enable, _ephIntrComboBox);
1934 enableWidget(enable, _ephV3CheckBox);
1935 }
1936
1937 // Broadcast Corrections
1938 // ---------------------
1939 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1940 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
1941 enableWidget(enable, _corrIntrComboBox);
1942 }
1943
1944 // Feed Engine
1945 // -----------
1946 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1947 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
1948 enableWidget(enable, _waitTimeSpinBox);
1949 enableWidget(enable, _binSamplSpinBox);
1950 }
1951
1952 // Serial Output
1953 // -------------
1954 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1955 sender() == _serialAutoNMEAComboBox) {
1956 enable = !_serialMountPointLineEdit->text().isEmpty();
1957 enableWidget(enable, _serialPortNameLineEdit);
1958 enableWidget(enable, _serialBaudRateComboBox);
1959 enableWidget(enable, _serialParityComboBox);
1960 enableWidget(enable, _serialDataBitsComboBox);
1961 enableWidget(enable, _serialStopBitsComboBox);
1962 enableWidget(enable, _serialFlowControlComboBox);
1963 enableWidget(enable, _serialAutoNMEAComboBox);
1964
1965 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
1966 enableWidget(enable2, _serialFileNMEALineEdit);
1967 }
1968
1969 // Outages
1970 // -------
1971 if (sender() == 0 || sender() == _obsRateComboBox) {
1972 enable = !_obsRateComboBox->currentText().isEmpty();
1973 enableWidget(enable, _adviseFailSpinBox);
1974 enableWidget(enable, _adviseRecoSpinBox);
1975 enableWidget(enable, _adviseScriptLineEdit);
1976 }
1977
1978 // Miscellaneous
1979 // -------------
1980 if (sender() == 0 || sender() == _miscMountLineEdit) {
1981 enable = !_miscMountLineEdit->text().isEmpty();
1982 enableWidget(enable, _perfIntrComboBox);
1983 enableWidget(enable, _scanRTCMCheckBox);
1984 }
1985
1986 // PPP Client
1987 // ----------
1988 if (sender() == 0
1989 || sender() == _pppMountLineEdit
1990 || sender() == _pppCorrMountLineEdit
1991 || sender() == _pppRefCrdXLineEdit
1992 || sender() == _pppRefCrdYLineEdit
1993 || sender() == _pppRefCrdZLineEdit
1994 || sender() == _pppRefdNLineEdit
1995 || sender() == _pppRefdELineEdit
1996 || sender() == _pppRefdULineEdit
1997 || sender() == _pppSync
1998 || sender() == _pppSPPComboBox
1999 || sender() == _pppQuickStartLineEdit
2000 || sender() == _pppEstTropoCheckBox
2001 || sender() == _pppUsePhaseCheckBox
2002 || sender() == _pppAntexLineEdit ) {
2003
2004 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2005 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "SPP") ||
2006 (_pppSPPComboBox->currentText() == "Post-Processing");
2007
2008 enableWidget(enable, _pppNMEALineEdit);
2009 enableWidget(enable, _pppNMEAPortLineEdit);
2010 enableWidget(enable, _pppRefCrdXLineEdit);
2011 enableWidget(enable, _pppRefCrdYLineEdit);
2012 enableWidget(enable, _pppRefCrdZLineEdit);
2013 enableWidget(enable, _pppRefdNLineEdit);
2014 enableWidget(enable, _pppRefdELineEdit);
2015 enableWidget(enable, _pppRefdULineEdit);
2016 enableWidget(enable, _pppUsePhaseCheckBox);
2017 enableWidget(enable, _pppPlotCoordinates);
2018 enableWidget(enable, _pppEstTropoCheckBox);
2019 enableWidget(enable, _pppGLONASSCheckBox);
2020 enableWidget(enable, _pppGalileoCheckBox);
2021 enableWidget(enable, _pppAntexLineEdit);
2022 enableWidget(enable, _pppSigCLineEdit);
2023 enableWidget(enable, _pppSigCrd0);
2024 enableWidget(enable, _pppSigCrdP);
2025
2026 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2027 !_pppRefCrdYLineEdit->text().isEmpty() &&
2028 !_pppRefCrdZLineEdit->text().isEmpty();
2029
2030 enableWidget(enable2, _pppAverageLineEdit);
2031 enableWidget(enable2, _pppQuickStartLineEdit);
2032
2033 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2034 enableWidget(enable3, _pppMaxSolGapLineEdit);
2035
2036 bool enable4 = enable && !_pppAntexLineEdit->text().isEmpty();
2037 enableWidget(enable4, _pppAntennaLineEdit);
2038 enableWidget(enable4, _pppApplySatAntCheckBox);
2039
2040 bool enable5 = enable && _pppEstTropoCheckBox->isChecked() && !_pppMountLineEdit->text().isEmpty();
2041 enableWidget(enable5, _pppSigTrp0);
2042 enableWidget(enable5, _pppSigTrpP);
2043
2044 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2045 enableWidget(enable6, _pppSigPLineEdit);
2046
2047 bool enable7 = enable && _pppSPPComboBox->currentText() == "PPP";
2048 enableWidget(enable7, _pppSync);
2049 enableWidget(enable7, _pppCorrMountLineEdit);
2050
2051 bool enable8 = _pppSPPComboBox->currentText() == "Post-Processing";
2052 enableWidget(enable8, _postObsFileChooser);
2053 enableWidget(enable8, _postNavFileChooser);
2054 enableWidget(enable8, _postCorrFileChooser);
2055 _actPostProcessing->setEnabled(enable8);
2056
2057 enableWidget(!enable8, _pppMountLineEdit);
2058 }
2059}
2060
2061//
2062////////////////////////////////////////////////////////////////////////////
2063void bncWindow::slotAddCmbRow() {
2064 int iRow = _cmbTable->rowCount();
2065 _cmbTable->insertRow(iRow);
2066 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2067 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2068 }
2069}
2070
2071//
2072////////////////////////////////////////////////////////////////////////////
2073void bncWindow::slotDelCmbRow() {
2074 int nRows = _cmbTable->rowCount();
2075 bool flg[nRows];
2076 for (int iRow = 0; iRow < nRows; iRow++) {
2077 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2078 flg[iRow] = true;
2079 }
2080 else {
2081 flg[iRow] = false;
2082 }
2083 }
2084 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2085 if (flg[iRow]) {
2086 _cmbTable->removeRow(iRow);
2087 }
2088 }
2089}
2090
2091//
2092////////////////////////////////////////////////////////////////////////////
2093void bncWindow::populateCmbTable() {
2094
2095 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2096 _cmbTable->removeRow(iRow);
2097 }
2098
2099 bncSettings settings;
2100
2101 int iRow = -1;
2102 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2103 while (it.hasNext()) {
2104 QStringList hlp = it.next().split(" ");
2105 if (hlp.size() > 2) {
2106 ++iRow;
2107 _cmbTable->insertRow(iRow);
2108 }
2109 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2110 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2111 }
2112 }
2113}
2114
2115//
2116////////////////////////////////////////////////////////////////////////////
2117void bncWindow::slotAddUploadRow() {
2118 int iRow = _uploadTable->rowCount();
2119 _uploadTable->insertRow(iRow);
2120 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2121 if (iCol == 3) {
2122 QLineEdit* passwd = new QLineEdit();
2123 passwd->setFrame(false);
2124 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2125 _uploadTable->setCellWidget(iRow, iCol, passwd);
2126 }
2127 else if (iCol == 4) {
2128 QComboBox* system = new QComboBox();
2129 system->setEditable(false);
2130 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2131 system->setFrame(false);
2132 _uploadTable->setCellWidget(iRow, iCol, system);
2133 }
2134 else if (iCol == 5) {
2135 QCheckBox* com = new QCheckBox();
2136 _uploadTable->setCellWidget(iRow, iCol, com);
2137 }
2138 else if (iCol == 8) {
2139 bncTableItem* bncIt = new bncTableItem();
2140 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2141 _uploadTable->setItem(iRow, iCol, bncIt);
2142 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2143 }
2144 else {
2145 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2146 }
2147 }
2148}
2149
2150//
2151////////////////////////////////////////////////////////////////////////////
2152void bncWindow::slotDelUploadRow() {
2153 ((bncApp*)qApp)->_uploadTableItems.clear();
2154 int nRows = _uploadTable->rowCount();
2155 bool flg[nRows];
2156 for (int iRow = 0; iRow < nRows; iRow++) {
2157 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2158 flg[iRow] = true;
2159 }
2160 else {
2161 flg[iRow] = false;
2162 }
2163 }
2164 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2165 if (flg[iRow]) {
2166 _uploadTable->removeRow(iRow);
2167 }
2168 }
2169 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2170 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2171 (bncTableItem*) _uploadTable->item(iRow, 8);
2172 }
2173}
2174
2175//
2176////////////////////////////////////////////////////////////////////////////
2177void bncWindow::populateUploadTable() {
2178 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2179 _uploadTable->removeRow(iRow);
2180 }
2181
2182 bncSettings settings;
2183
2184 int iRow = -1;
2185 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2186 while (it.hasNext()) {
2187 QStringList hlp = it.next().split(",");
2188 if (hlp.size() > 6) {
2189 ++iRow;
2190 _uploadTable->insertRow(iRow);
2191 }
2192 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2193 if (iCol == 3) {
2194 QLineEdit* passwd = new QLineEdit();
2195 passwd->setFrame(false);
2196 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2197 passwd->setText(hlp[iCol]);
2198 _uploadTable->setCellWidget(iRow, iCol, passwd);
2199 }
2200 else if (iCol == 4) {
2201 QComboBox* system = new QComboBox();
2202 system->setEditable(false);
2203 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2204 system->setFrame(false);
2205 system->setCurrentIndex(system->findText(hlp[iCol]));
2206 _uploadTable->setCellWidget(iRow, iCol, system);
2207 }
2208 else if (iCol == 5) {
2209 QCheckBox* com = new QCheckBox();
2210 if (hlp[iCol].toInt() == Qt::Checked) {
2211 com->setCheckState(Qt::Checked);
2212 }
2213 _uploadTable->setCellWidget(iRow, iCol, com);
2214 }
2215 else if (iCol == 8) {
2216 bncTableItem* bncIt = new bncTableItem();
2217 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2218 _uploadTable->setItem(iRow, iCol, bncIt);
2219 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2220 }
2221 else {
2222 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2223 }
2224 }
2225 }
2226}
2227
2228//
2229////////////////////////////////////////////////////////////////////////////
2230void bncWindow::slotSetUploadTrafo() {
2231 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2232 dlg->exec();
2233 delete dlg;
2234}
2235
2236// Post-Processing
2237////////////////////////////////////////////////////////////////////////////
2238void bncWindow::slotPostProcessing() {
2239 _actPostProcessing->setEnabled(false);
2240 slotSaveOptions();
2241 _postProgressBar->reset();
2242 enableWidget(true, _postProgressLabel);
2243 enableWidget(true, _postProgressBar);
2244
2245 bncSettings settings;
2246
2247 t_postInput input;
2248 input.obsFileName = settings.value("postObsFile").toString();
2249 input.navFileName = settings.value("postNavFile").toString();
2250 input.corrFileName = settings.value("postcorrFile").toString();
2251
2252 QFuture<void> future = QtConcurrent::run(postProcessing, input);
2253
2254 enableWidget(false, _postProgressLabel);
2255 enableWidget(false, _postProgressBar);
2256 _postProgressBar->reset();
2257 _actPostProcessing->setEnabled(true);
2258}
Note: See TracBrowser for help on using the repository browser.