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

Last change on this file since 3726 was 3726, checked in by mervart, 12 years ago
File size: 113.4 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#ifdef USE_POSTPROCESSING
65# include "rinex/bncpostprocess.h"
66#endif
67
68using namespace std;
69
70// Constructor
71////////////////////////////////////////////////////////////////////////////
72bncWindow::bncWindow() {
73
74 _caster = 0;
75 _casterEph = 0;
76
77 _bncFigure = new bncFigure(this);
78 _bncFigureLate = new bncFigureLate(this);
79 _bncFigurePPP = new bncFigurePPP(this);
80
81 int ww = QFontMetrics(this->font()).width('w');
82
83 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
84
85 setMinimumSize(85*ww, 65*ww);
86
87 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
88
89 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
90 this, SLOT(slotWindowMessage(QByteArray,bool)));
91
92 // Create Actions
93 // --------------
94 _actHelp = new QAction(tr("&Help Contents"),this);
95 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
96
97 _actAbout = new QAction(tr("&About BNC"),this);
98 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
99
100 _actFlowchart = new QAction(tr("&Flow Chart"),this);
101 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
102
103 _actFontSel = new QAction(tr("Select &Font"),this);
104 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
105
106 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
107 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
108
109 _actQuit = new QAction(tr("&Quit"),this);
110 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
111
112 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
113 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
114
115 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
116 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
117 _actDeleteMountPoints->setEnabled(false);
118
119 _actGetData = new QAction(tr("Sta&rt"),this);
120 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
121
122 _actPostProcessing = new QAction(tr("Start Post-Processing"),this);
123 connect(_actPostProcessing, SIGNAL(triggered()), SLOT(slotStartPostProcessing()));
124
125 _actStop = new QAction(tr("Sto&p"),this);
126 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
127 _actStop->setEnabled(false);
128
129 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
130 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
131
132 CreateMenu();
133 AddToolbar();
134
135 bncSettings settings;
136
137 // Netowrk Options
138 // ---------------
139 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
140 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
141
142 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
143 this, SLOT(slotBncTextChanged()));
144
145 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
146 _ignoreSslErrorsCheckBox = new QCheckBox();
147 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
148 settings.value("ignoreSslErrors").toInt()));
149
150 // General Options
151 // ---------------
152 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
153 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
154 _rnxAppendCheckBox = new QCheckBox();
155 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
156 settings.value("rnxAppend").toInt()));
157 _onTheFlyComboBox = new QComboBox();
158 _onTheFlyComboBox->setEditable(false);
159 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
160 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
161 if (ii != -1) {
162 _onTheFlyComboBox->setCurrentIndex(ii);
163 }
164 _autoStartCheckBox = new QCheckBox();
165 _autoStartCheckBox->setCheckState(Qt::CheckState(
166 settings.value("autoStart").toInt()));
167
168 // RINEX Observations Options
169 // --------------------------
170 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
171 _rnxIntrComboBox = new QComboBox();
172 _rnxIntrComboBox->setEditable(false);
173 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
174 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
175 if (ii != -1) {
176 _rnxIntrComboBox->setCurrentIndex(ii);
177 }
178 _rnxSamplSpinBox = new QSpinBox();
179 _rnxSamplSpinBox->setMinimum(0);
180 _rnxSamplSpinBox->setMaximum(60);
181 _rnxSamplSpinBox->setSingleStep(5);
182 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
183 _rnxSamplSpinBox->setSuffix(" sec");
184 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
185 _rnxSkelLineEdit->setMaximumWidth(5*ww);
186 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
187 _rnxV3CheckBox = new QCheckBox();
188 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
189
190 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
191 this, SLOT(slotBncTextChanged()));
192
193 // RINEX Ephemeris Options
194 // -----------------------
195 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
196 _ephIntrComboBox = new QComboBox();
197 _ephIntrComboBox->setEditable(false);
198 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
199 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
200 if (jj != -1) {
201 _ephIntrComboBox->setCurrentIndex(jj);
202 }
203 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
204 _ephV3CheckBox = new QCheckBox();
205 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
206
207 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
208 this, SLOT(slotBncTextChanged()));
209
210 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
211 this, SLOT(slotBncTextChanged()));
212
213 // Broadcast Corrections Options
214 // -----------------------------
215 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
216 _corrIntrComboBox = new QComboBox();
217 _corrIntrComboBox->setEditable(false);
218 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
219 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
220 if (mm != -1) {
221 _corrIntrComboBox->setCurrentIndex(mm);
222 }
223 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
224 _corrTimeSpinBox = new QSpinBox();
225 _corrTimeSpinBox->setMinimum(0);
226 _corrTimeSpinBox->setMaximum(60);
227 _corrTimeSpinBox->setSingleStep(1);
228 _corrTimeSpinBox->setSuffix(" sec");
229 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
230
231 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
232 this, SLOT(slotBncTextChanged()));
233
234 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
235 this, SLOT(slotBncTextChanged()));
236
237 // Feed Engine Options
238 // -------------------
239 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
240 _waitTimeSpinBox = new QSpinBox();
241 _waitTimeSpinBox->setMinimum(1);
242 _waitTimeSpinBox->setMaximum(30);
243 _waitTimeSpinBox->setSingleStep(1);
244 _waitTimeSpinBox->setSuffix(" sec");
245 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
246 _binSamplSpinBox = new QSpinBox();
247 _binSamplSpinBox->setMinimum(0);
248 _binSamplSpinBox->setMaximum(60);
249 _binSamplSpinBox->setSingleStep(5);
250 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
251 _binSamplSpinBox->setSuffix(" sec");
252 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
253 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
254
255 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
256 this, SLOT(slotBncTextChanged()));
257
258 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
259 this, SLOT(slotBncTextChanged()));
260
261 // Serial Output Options
262 // ---------------------
263 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
264 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
265 _serialBaudRateComboBox = new QComboBox();
266 _serialBaudRateComboBox->addItems(QString("110,300,600,"
267 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
268 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
269 if (kk != -1) {
270 _serialBaudRateComboBox->setCurrentIndex(kk);
271 }
272 _serialFlowControlComboBox = new QComboBox();
273 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
274 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
275 if (kk != -1) {
276 _serialFlowControlComboBox->setCurrentIndex(kk);
277 }
278 _serialDataBitsComboBox = new QComboBox();
279 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
280 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
281 if (kk != -1) {
282 _serialDataBitsComboBox->setCurrentIndex(kk);
283 }
284 _serialParityComboBox = new QComboBox();
285 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
286 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
287 if (kk != -1) {
288 _serialParityComboBox->setCurrentIndex(kk);
289 }
290 _serialStopBitsComboBox = new QComboBox();
291 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
292 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
293 if (kk != -1) {
294 _serialStopBitsComboBox->setCurrentIndex(kk);
295 }
296 _serialAutoNMEAComboBox = new QComboBox();
297 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
298 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
299 if (kk != -1) {
300 _serialAutoNMEAComboBox->setCurrentIndex(kk);
301 }
302 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
303 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
304
305 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
306 this, SLOT(slotBncTextChanged()));
307
308 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
309 this, SLOT(slotBncTextChanged()));
310
311 // Outages Options
312 // ---------------
313 _obsRateComboBox = new QComboBox();
314 _obsRateComboBox->setEditable(false);
315 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
316 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
317 if (kk != -1) {
318 _obsRateComboBox->setCurrentIndex(kk);
319 }
320 _adviseFailSpinBox = new QSpinBox();
321 _adviseFailSpinBox->setMinimum(0);
322 _adviseFailSpinBox->setMaximum(60);
323 _adviseFailSpinBox->setSingleStep(1);
324 _adviseFailSpinBox->setSuffix(" min");
325 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
326 _adviseRecoSpinBox = new QSpinBox();
327 _adviseRecoSpinBox->setMinimum(0);
328 _adviseRecoSpinBox->setMaximum(60);
329 _adviseRecoSpinBox->setSingleStep(1);
330 _adviseRecoSpinBox->setSuffix(" min");
331 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
332 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
333
334 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
335 this, SLOT(slotBncTextChanged()));
336
337 // Miscellaneous Options
338 // ---------------------
339 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
340 _perfIntrComboBox = new QComboBox();
341 _perfIntrComboBox->setEditable(false);
342 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
343 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
344 if (ll != -1) {
345 _perfIntrComboBox->setCurrentIndex(ll);
346 }
347 _scanRTCMCheckBox = new QCheckBox();
348 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
349 settings.value("scanRTCM").toInt()));
350
351 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
352 this, SLOT(slotBncTextChanged()));
353
354 // PPP Options
355 // -----------
356 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
357 _pppMountLineEdit->setMaximumWidth(6*ww);
358 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
359 _pppCorrMountLineEdit->setMaximumWidth(6*ww);
360 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
361 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
362 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
363 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
364 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
365 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
366 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
367 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
368 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
369 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
370 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
371 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
372 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
373 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
374 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
375 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
376 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
377 _pppSync = new QLineEdit(settings.value("pppSync").toString());
378 _pppAntexFileChooser = new qtFileChooser;
379 _pppAntexFileChooser->setMinimumWidth(12*ww);
380 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
381 _pppAntennaLineEdit->setMinimumWidth(14*ww);
382 _pppAntexFileChooser->setFileName(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(_pppAntexFileChooser, SIGNAL(fileNameChanged(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 _pppAntexFileChooser->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
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 _postOutLineEdit->setWhatsThis(tr("Full Path to DGPS Correction File"));
939
940 int ir = 0;
941 pppLayout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 1)</b>"), ir, 0, 1, 8);
942 ++ir;
943 pppLayout->addWidget(new QLabel("Obs Mountpoint"), ir, 0);
944 pppLayout->addWidget(_pppMountLineEdit, ir, 1);
945 pppLayout->addWidget(_pppSPPComboBox, ir, 2);
946 pppLayout->addWidget(new QLabel(" X "), ir, 3, Qt::AlignRight);
947 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 4);
948 pppLayout->addWidget(new QLabel(" Y "), ir, 5, Qt::AlignRight);
949 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 6);
950 pppLayout->addWidget(new QLabel(" Z "), ir, 7, Qt::AlignRight);
951 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 8);
952 ++ir;
953 pppLayout->addWidget(new QLabel("Corr Mountpoint "), ir, 0);
954 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 1);
955 pppLayout->addWidget(new QLabel(" dN "), ir, 3, Qt::AlignRight);
956 pppLayout->addWidget(_pppRefdNLineEdit, ir, 4);
957 pppLayout->addWidget(new QLabel(" dE "), ir, 5, Qt::AlignRight);
958 pppLayout->addWidget(_pppRefdELineEdit, ir, 6);
959 pppLayout->addWidget(new QLabel(" dU "), ir, 7, Qt::AlignRight);
960 pppLayout->addWidget(_pppRefdULineEdit, ir, 8);
961 ++ir;
962 pppLayout->addWidget(new QLabel("Output"), ir, 0);
963 pppLayout->addWidget(new QLabel("NMEA File"), ir, 1, Qt::AlignRight);
964 pppLayout->addWidget(_pppNMEALineEdit, ir, 2, 1, 2);
965 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 5, Qt::AlignRight);
966 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 6);
967 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 7, Qt::AlignRight);
968 pppLayout->addWidget(_pppPlotCoordinates, ir, 8);
969 ++ir;
970 pppLayout->addWidget(new QLabel("<b>Post-Processing </b>"));
971 {
972 QHBoxLayout* hlpLayout = new QHBoxLayout;
973 hlpLayout->addWidget(new QLabel("Obs"));
974 hlpLayout->addWidget(_postObsFileChooser);
975 hlpLayout->addWidget(new QLabel(" Nav"));
976 hlpLayout->addWidget(_postNavFileChooser);
977 hlpLayout->addWidget(new QLabel(" Corr"));
978 hlpLayout->addWidget(_postCorrFileChooser);
979 pppLayout->addLayout(hlpLayout, ir, 1, 1, 8);
980 }
981 ++ir;
982 pppLayout->addWidget(new QLabel("Output"), ir, 1);
983 pppLayout->addWidget(_postOutLineEdit, ir, 2, 1, 2);
984
985 pppgroup->setLayout(pppLayout);
986
987 // PPP Client (second panel)
988 // -------------------------
989 QGridLayout* ppp2Layout = new QGridLayout;
990 ir = 0;
991 ppp2Layout->addWidget(new QLabel("<b>Precise Point Positioning (Panel 2)</b>"), ir, 0, 1, 8);
992 ++ir;
993 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
994 {
995 QHBoxLayout* hlpLayout = new QHBoxLayout;
996 hlpLayout->addWidget(_pppAntexFileChooser);
997 hlpLayout->addWidget(new QLabel("ANTEX File"));
998 hlpLayout->addWidget(_pppAntennaLineEdit);
999 hlpLayout->addWidget(new QLabel("Antenna Name"));
1000 hlpLayout->addWidget(_pppApplySatAntCheckBox);
1001 hlpLayout->addWidget(new QLabel("Apply Sat. Ant. Offsets"));
1002 ppp2Layout->addLayout(hlpLayout, ir, 1, 1, 8);
1003 }
1004 ++ir;
1005 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
1006 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1007 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1008 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1009 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1010 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1011 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1012 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1013 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1014 ++ir;
1015 ppp2Layout->addWidget(new QLabel("Options"), ir, 0, 1, 5);
1016 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
1017 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
1018 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
1019 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
1020 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
1021 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
1022 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
1023 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
1024 ++ir;
1025 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1026 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1027 ppp2Layout->addWidget(new QLabel("Sigma XYZ Init "), ir, 2);
1028 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1029 ppp2Layout->addWidget(new QLabel("Sigma XYZ Noise "), ir, 4);
1030 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
1031 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
1032 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
1033 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
1034 ++ir;
1035 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
1036 ppp2Layout->addWidget(_pppSync, ir, 1);
1037 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
1038 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
1039 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
1040
1041 ppp2group->setLayout(ppp2Layout);
1042
1043 // Combination
1044 // -----------
1045 QGridLayout* cmbLayout = new QGridLayout;
1046
1047 populateCmbTable();
1048 cmbLayout->addWidget(_cmbTable,0,0,6,3);
1049
1050 cmbLayout->addWidget(addCmbRowButton,1,3);
1051 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1052 cmbLayout->addWidget(delCmbRowButton,2,3);
1053 cmbLayout->addWidget(new QLabel("Method"), 3, 3);
1054 cmbLayout->addWidget(_cmbMethodComboBox, 3, 4, Qt::AlignRight);
1055 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 4, 3);
1056 cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 4, Qt::AlignRight);
1057 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1058
1059 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,3);
1060
1061 cmbgroup->setLayout(cmbLayout);
1062
1063 // Upload Layout (Clocks)
1064 // ----------------------
1065 QGridLayout* uploadHlpLayout = new QGridLayout();
1066
1067 uploadHlpLayout->addWidget(new QLabel("Upload RTNet or Combination Results"),0,0);
1068
1069 uploadHlpLayout->addWidget(addUploadRowButton,0,1);
1070 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1071
1072 uploadHlpLayout->addWidget(delUploadRowButton,0,2);
1073 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1074
1075 uploadHlpLayout->addWidget(setUploadTrafoButton,1,1);
1076 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1077
1078 uploadHlpLayout->addWidget(new QLabel("Interval"),0,3, Qt::AlignRight);
1079 uploadHlpLayout->addWidget(_uploadIntrComboBox,0,4);
1080
1081 uploadHlpLayout->addWidget(new QLabel("Sampling"),1,3, Qt::AlignRight);
1082 uploadHlpLayout->addWidget(_uploadSamplSpinBox,1,4);
1083
1084 uploadHlpLayout->addWidget(new QLabel("Sampling (Orb)"),1,5, Qt::AlignRight);
1085 uploadHlpLayout->addWidget(_uploadSamplOrbSpinBox,1,6);
1086
1087 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1088 populateUploadTable();
1089 uploadLayout->addWidget(_uploadTable);
1090 uploadLayout->addLayout(uploadHlpLayout);
1091
1092 uploadgroup->setLayout(uploadLayout);
1093
1094 // Upload Layout (Ephemeris)
1095 // -------------------------
1096 QGridLayout* uploadLayoutEph = new QGridLayout;
1097
1098 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1099 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1100 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1101 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1102
1103 uploadLayoutEph->addWidget(new QLabel("Host"), 0, 0);
1104 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 0, 1, 1, 3);
1105 uploadLayoutEph->addWidget(new QLabel(" Port"), 0, 4, Qt::AlignRight);
1106 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 0, 5, 1, 1);
1107 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 1, 0);
1108 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 1, 1);
1109 uploadLayoutEph->addWidget(new QLabel(" Password"), 1, 2, Qt::AlignRight);
1110 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 1, 3);
1111 uploadLayoutEph->addWidget(new QLabel("Sampling"), 2, 0);
1112 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 2, 1);
1113 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 3, 0, 1, 5);
1114 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 3, 5);
1115
1116 uploadEphgroup->setLayout(uploadLayoutEph);
1117
1118 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1119 this, SLOT(slotBncTextChanged()));
1120
1121 // Main Layout
1122 // -----------
1123 QGridLayout* mLayout = new QGridLayout;
1124 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1125 mLayout->addWidget(_aogroup, 0,0);
1126 mLayout->addWidget(_mountPointsTable, 1,0);
1127 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1128 mLayout->addWidget(_loggroup, 2,0);
1129
1130 _canvas->setLayout(mLayout);
1131
1132 // Enable/Disable all Widgets
1133 // --------------------------
1134 slotBncTextChanged();
1135
1136 // Auto start
1137 // ----------
1138 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1139 slotGetData();
1140 }
1141}
1142
1143// Destructor
1144////////////////////////////////////////////////////////////////////////////
1145bncWindow::~bncWindow() {
1146 delete _caster;
1147 delete _casterEph;
1148}
1149
1150//
1151////////////////////////////////////////////////////////////////////////////
1152void bncWindow::populateMountPointsTable() {
1153
1154 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1155 _mountPointsTable->removeRow(iRow);
1156 }
1157
1158 bncSettings settings;
1159
1160 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1161 if (!it.hasNext()) {
1162 _actGetData->setEnabled(false);
1163 }
1164 int iRow = 0;
1165 while (it.hasNext()) {
1166 QStringList hlp = it.next().split(" ");
1167 if (hlp.size() < 5) continue;
1168 _mountPointsTable->insertRow(iRow);
1169
1170 QUrl url(hlp[0]);
1171
1172 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1173 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1174 QString nmea(hlp[4]);
1175 if (hlp[5] == "S") {
1176 fullPath = hlp[0].replace(0,2,"");
1177 }
1178 QString ntripVersion = "2";
1179 if (hlp.size() >= 6) {
1180 ntripVersion = (hlp[5]);
1181 }
1182
1183 QTableWidgetItem* it;
1184 it = new QTableWidgetItem(url.userInfo());
1185 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1186 _mountPointsTable->setItem(iRow, 0, it);
1187
1188 it = new QTableWidgetItem(fullPath);
1189 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1190 _mountPointsTable->setItem(iRow, 1, it);
1191
1192 it = new QTableWidgetItem(format);
1193 _mountPointsTable->setItem(iRow, 2, it);
1194
1195 if (nmea == "yes") {
1196 it = new QTableWidgetItem(latitude);
1197 _mountPointsTable->setItem(iRow, 3, it);
1198 it = new QTableWidgetItem(longitude);
1199 _mountPointsTable->setItem(iRow, 4, it);
1200 } else {
1201 it = new QTableWidgetItem(latitude);
1202 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1203 _mountPointsTable->setItem(iRow, 3, it);
1204 it = new QTableWidgetItem(longitude);
1205 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1206 _mountPointsTable->setItem(iRow, 4, it);
1207 }
1208
1209 it = new QTableWidgetItem(nmea);
1210 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1211 _mountPointsTable->setItem(iRow, 5, it);
1212
1213 it = new QTableWidgetItem(ntripVersion);
1214 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1215 _mountPointsTable->setItem(iRow, 6, it);
1216
1217 bncTableItem* bncIt = new bncTableItem();
1218 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1219 _mountPointsTable->setItem(iRow, 7, bncIt);
1220
1221 iRow++;
1222 }
1223
1224 _mountPointsTable->sortItems(1);
1225}
1226
1227// Retrieve Table
1228////////////////////////////////////////////////////////////////////////////
1229void bncWindow::slotAddMountPoints() {
1230
1231 bncSettings settings;
1232 QString proxyHost = settings.value("proxyHost").toString();
1233 int proxyPort = settings.value("proxyPort").toInt();
1234 if (proxyHost != _proxyHostLineEdit->text() ||
1235 proxyPort != _proxyPortLineEdit->text().toInt()) {
1236 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1237 "changed. Use the new ones?",
1238 QMessageBox::Yes, QMessageBox::No,
1239 QMessageBox::NoButton);
1240 if (iRet == QMessageBox::Yes) {
1241 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1242 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1243 settings.sync();
1244 }
1245 }
1246
1247 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1248 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1249 settings.sync();
1250
1251 QMessageBox msgBox;
1252 msgBox.setIcon(QMessageBox::Question);
1253 msgBox.setWindowTitle("Add Stream");
1254 msgBox.setText("Add stream(s) coming from:");
1255
1256 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1257 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1258 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1259 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1260 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1261
1262 msgBox.exec();
1263
1264 if (msgBox.clickedButton() == buttonNtrip) {
1265 bncTableDlg* dlg = new bncTableDlg(this);
1266 dlg->move(this->pos().x()+50, this->pos().y()+50);
1267 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1268 this, SLOT(slotNewMountPoints(QStringList*)));
1269 dlg->exec();
1270 delete dlg;
1271 } else if (msgBox.clickedButton() == buttonIP) {
1272 bncIpPort* ipp = new bncIpPort(this);
1273 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1274 this, SLOT(slotNewMountPoints(QStringList*)));
1275 ipp->exec();
1276 delete ipp;
1277 } else if (msgBox.clickedButton() == buttonUDP) {
1278 bncUdpPort* udp = new bncUdpPort(this);
1279 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1280 this, SLOT(slotNewMountPoints(QStringList*)));
1281 udp->exec();
1282 delete udp;
1283 } else if (msgBox.clickedButton() == buttonSerial) {
1284 bncSerialPort* sep = new bncSerialPort(this);
1285 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1286 this, SLOT(slotNewMountPoints(QStringList*)));
1287 sep->exec();
1288 delete sep;
1289 } else if (msgBox.clickedButton() == buttonCancel) {
1290 // Cancel
1291 }
1292}
1293
1294// Delete Selected Mount Points
1295////////////////////////////////////////////////////////////////////////////
1296void bncWindow::slotDeleteMountPoints() {
1297
1298 int nRows = _mountPointsTable->rowCount();
1299 bool flg[nRows];
1300 for (int iRow = 0; iRow < nRows; iRow++) {
1301 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1302 flg[iRow] = true;
1303 }
1304 else {
1305 flg[iRow] = false;
1306 }
1307 }
1308 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1309 if (flg[iRow]) {
1310 _mountPointsTable->removeRow(iRow);
1311 }
1312 }
1313 _actDeleteMountPoints->setEnabled(false);
1314
1315 if (_mountPointsTable->rowCount() == 0) {
1316 _actGetData->setEnabled(false);
1317 }
1318}
1319
1320// New Mount Points Selected
1321////////////////////////////////////////////////////////////////////////////
1322void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1323 int iRow = 0;
1324 QListIterator<QString> it(*mountPoints);
1325 while (it.hasNext()) {
1326 QStringList hlp = it.next().split(" ");
1327 QUrl url(hlp[0]);
1328 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1329 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1330 QString nmea(hlp[4]);
1331 if (hlp[5] == "S") {
1332 fullPath = hlp[0].replace(0,2,"");
1333 }
1334 QString ntripVersion = "2";
1335 if (hlp.size() >= 6) {
1336 ntripVersion = (hlp[5]);
1337 }
1338
1339 _mountPointsTable->insertRow(iRow);
1340
1341 QTableWidgetItem* it;
1342 it = new QTableWidgetItem(url.userInfo());
1343 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1344 _mountPointsTable->setItem(iRow, 0, it);
1345
1346 it = new QTableWidgetItem(fullPath);
1347 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1348 _mountPointsTable->setItem(iRow, 1, it);
1349
1350 it = new QTableWidgetItem(format);
1351 _mountPointsTable->setItem(iRow, 2, it);
1352
1353 if (nmea == "yes") {
1354 it = new QTableWidgetItem(latitude);
1355 _mountPointsTable->setItem(iRow, 3, it);
1356 it = new QTableWidgetItem(longitude);
1357 _mountPointsTable->setItem(iRow, 4, it);
1358 } else {
1359 it = new QTableWidgetItem(latitude);
1360 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1361 _mountPointsTable->setItem(iRow, 3, it);
1362 it = new QTableWidgetItem(longitude);
1363 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1364 _mountPointsTable->setItem(iRow, 4, it);
1365 }
1366
1367 it = new QTableWidgetItem(nmea);
1368 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1369 _mountPointsTable->setItem(iRow, 5, it);
1370
1371 it = new QTableWidgetItem(ntripVersion);
1372 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1373 _mountPointsTable->setItem(iRow, 6, it);
1374
1375 bncTableItem* bncIt = new bncTableItem();
1376 _mountPointsTable->setItem(iRow, 7, bncIt);
1377
1378 iRow++;
1379 }
1380 _mountPointsTable->hideColumn(0);
1381 _mountPointsTable->sortItems(1);
1382 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1383 _actGetData->setEnabled(true);
1384 }
1385 delete mountPoints;
1386}
1387
1388// Save Options
1389////////////////////////////////////////////////////////////////////////////
1390void bncWindow::slotSaveOptions() {
1391
1392 QStringList mountPoints;
1393 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1394
1395 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1396 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1397 "@" + _mountPointsTable->item(iRow, 1)->text() );
1398
1399 mountPoints.append(url.toString() + " " +
1400 _mountPointsTable->item(iRow, 2)->text()
1401 + " " + _mountPointsTable->item(iRow, 3)->text()
1402 + " " + _mountPointsTable->item(iRow, 4)->text()
1403 + " " + _mountPointsTable->item(iRow, 5)->text()
1404 + " " + _mountPointsTable->item(iRow, 6)->text());
1405 } else {
1406 mountPoints.append(
1407 "//" + _mountPointsTable->item(iRow, 1)->text()
1408 + " " + _mountPointsTable->item(iRow, 2)->text()
1409 + " " + _mountPointsTable->item(iRow, 3)->text()
1410 + " " + _mountPointsTable->item(iRow, 4)->text()
1411 + " " + _mountPointsTable->item(iRow, 5)->text()
1412 + " " + _mountPointsTable->item(iRow, 6)->text());
1413 }
1414 }
1415
1416 QStringList combineStreams;
1417 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1418 QString hlp;
1419 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1420 if (_cmbTable->item(iRow, iCol)) {
1421 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1422 }
1423 }
1424 if (!hlp.isEmpty()) {
1425 combineStreams << hlp;
1426 }
1427 }
1428
1429 QStringList uploadMountpointsOut;
1430 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1431 QString hlp;
1432 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1433 if (_uploadTable->cellWidget(iRow, iCol) &&
1434 (iCol == 3 || iCol == 4 || iCol == 5)) {
1435 if (iCol == 3) {
1436 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1437 hlp += passwd->text() + ",";
1438 }
1439 else if (iCol == 4) {
1440 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1441 hlp += system->currentText() + ",";
1442 }
1443 else if (iCol == 5) {
1444 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1445 QString state; state.setNum(com->checkState());
1446 hlp += state + ",";
1447 }
1448 }
1449 else if (_uploadTable->item(iRow, iCol)) {
1450 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1451 }
1452 }
1453 if (!hlp.isEmpty()) {
1454 uploadMountpointsOut << hlp;
1455 }
1456 }
1457
1458 bncSettings settings;
1459
1460 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1461 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1462 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1463 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1464 settings.setValue("binSampl", _binSamplSpinBox->value());
1465 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1466 settings.setValue("corrPath", _corrPathLineEdit->text());
1467 settings.setValue("corrPort", _corrPortLineEdit->text());
1468 settings.setValue("corrTime", _corrTimeSpinBox->value());
1469 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1470 settings.setValue("ephPath", _ephPathLineEdit->text());
1471 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1472 settings.setValue("logFile", _logFileLineEdit->text());
1473 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1474 settings.setValue("miscMount", _miscMountLineEdit->text());
1475 settings.setValue("pppMount", _pppMountLineEdit->text());
1476 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1477 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1478 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1479 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1480 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1481 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1482 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1483 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1484 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1485 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1486 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1487 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1488 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1489 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1490 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1491 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1492 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1493 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1494 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1495 settings.setValue("pppSync", _pppSync->text());
1496 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1497 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1498 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1499 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1500 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1501 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1502 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1503 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1504 settings.setValue("mountPoints", mountPoints);
1505 settings.setValue("obsRate", _obsRateComboBox->currentText());
1506 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1507 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1508 settings.setValue("outFile", _outFileLineEdit->text());
1509 settings.setValue("outPort", _outPortLineEdit->text());
1510 settings.setValue("outUPort", _outUPortLineEdit->text());
1511 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1512 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1513 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1514 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1515 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1516 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1517 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1518 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1519 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1520 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1521 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1522 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1523 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1524 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1525 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1526 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1527 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1528 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1529 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1530 settings.setValue("serialParity", _serialParityComboBox->currentText());
1531 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1532 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1533 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1534 settings.setValue("startTab", _aogroup->currentIndex());
1535 settings.setValue("statusTab", _loggroup->currentIndex());
1536 settings.setValue("waitTime", _waitTimeSpinBox->value());
1537 if (!combineStreams.isEmpty()) {
1538 settings.setValue("combineStreams", combineStreams);
1539 }
1540 else {
1541 settings.setValue("combineStreams", "");
1542 }
1543 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1544 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1545
1546 if (!uploadMountpointsOut.isEmpty()) {
1547 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1548 }
1549 else {
1550 settings.setValue("uploadMountpointsOut", "");
1551 }
1552 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1553 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1554 settings.setValue("uploadSamplOrb", _uploadSamplOrbSpinBox->value());
1555
1556 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1557 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1558 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1559 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1560 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1561
1562 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1563 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1564 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1565 settings.setValue("postOutFile", _postOutLineEdit->text());
1566
1567 if (_caster) {
1568 _caster->slotReadMountPoints();
1569 }
1570 settings.sync();
1571}
1572
1573// All get slots terminated
1574////////////////////////////////////////////////////////////////////////////
1575void bncWindow::slotGetThreadsFinished() {
1576 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1577 delete _caster; _caster = 0;
1578 delete _casterEph; _casterEph = 0;
1579 _actGetData->setEnabled(true);
1580 _actStop->setEnabled(false);
1581}
1582
1583// Retrieve Data
1584////////////////////////////////////////////////////////////////////////////
1585void bncWindow::slotGetData() {
1586 slotSaveOptions();
1587
1588 _bncFigurePPP->reset();
1589
1590 _actDeleteMountPoints->setEnabled(false);
1591 _actGetData->setEnabled(false);
1592 _actStop->setEnabled(true);
1593
1594 _caster = new bncCaster(_outFileLineEdit->text(),
1595 _outPortLineEdit->text().toInt());
1596
1597 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1598 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1599 ((bncApp*)qApp)->initCombination();
1600
1601 connect(_caster, SIGNAL(getThreadsFinished()),
1602 this, SLOT(slotGetThreadsFinished()));
1603
1604 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1605 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1606
1607 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1608
1609 bncSettings settings;
1610
1611 QDir rnxdir(settings.value("rnxPath").toString());
1612 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1613
1614 QString rnx_file = settings.value("rnxScript").toString();
1615 if ( !rnx_file.isEmpty() ) {
1616 QFile rnxfile(settings.value("rnxScript").toString());
1617 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1618 }
1619
1620 QDir ephdir(settings.value("ephPath").toString());
1621 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1622
1623 QDir corrdir(settings.value("corrPath").toString());
1624 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1625
1626 QString advise_file = settings.value("adviseScript").toString();
1627 if ( !advise_file.isEmpty() ) {
1628 QFile advisefile(settings.value("adviseScript").toString());
1629 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1630 }
1631
1632 QString ant_file = settings.value("pppAntex").toString();
1633 if ( !ant_file.isEmpty() ) {
1634 QFile anxfile(settings.value("pppAntex").toString());
1635 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1636 }
1637
1638 _caster->slotReadMountPoints();
1639
1640 _casterEph = new bncEphUploadCaster();
1641 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1642 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1643}
1644
1645// Retrieve Data
1646////////////////////////////////////////////////////////////////////////////
1647void bncWindow::slotStop() {
1648 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1649 QMessageBox::Yes, QMessageBox::No,
1650 QMessageBox::NoButton);
1651 if (iRet == QMessageBox::Yes) {
1652 ((bncApp*)qApp)->stopCombination();
1653 delete _caster; _caster = 0;
1654 delete _casterEph; _casterEph = 0;
1655 _actGetData->setEnabled(true);
1656 _actStop->setEnabled(false);
1657 }
1658}
1659
1660// Close Application gracefully
1661////////////////////////////////////////////////////////////////////////////
1662void bncWindow::closeEvent(QCloseEvent* event) {
1663
1664 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1665 QMessageBox::Yes, QMessageBox::No,
1666 QMessageBox::Cancel);
1667
1668 if (iRet == QMessageBox::Cancel) {
1669 event->ignore();
1670 return;
1671 }
1672 else if (iRet == QMessageBox::Yes) {
1673 slotSaveOptions();
1674 }
1675
1676 QMainWindow::closeEvent(event);
1677}
1678
1679// User changed the selection of mountPoints
1680////////////////////////////////////////////////////////////////////////////
1681void bncWindow::slotSelectionChanged() {
1682 if (_mountPointsTable->selectedItems().isEmpty()) {
1683 _actDeleteMountPoints->setEnabled(false);
1684 }
1685 else {
1686 _actDeleteMountPoints->setEnabled(true);
1687 }
1688}
1689
1690// Display Program Messages
1691////////////////////////////////////////////////////////////////////////////
1692void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1693
1694#ifdef DEBUG_RTCM2_2021
1695 const int maxBufferSize = 1000;
1696#else
1697 const int maxBufferSize = 10000;
1698#endif
1699
1700 if (! showOnScreen ) {
1701 return;
1702 }
1703
1704 QString txt = _log->toPlainText() + "\n" +
1705 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1706 _log->clear();
1707 _log->append(txt.right(maxBufferSize));
1708}
1709
1710// About Message
1711////////////////////////////////////////////////////////////////////////////
1712void bncWindow::slotAbout() {
1713 new bncAboutDlg(0);
1714}
1715
1716//Flowchart
1717////////////////////////////////////////////////////////////////////////////
1718void bncWindow::slotFlowchart() {
1719 new bncFlowchartDlg(0);
1720}
1721
1722// Help Window
1723////////////////////////////////////////////////////////////////////////////
1724void bncWindow::slotHelp() {
1725 QUrl url;
1726 url.setPath(":bnchelp.html");
1727 new bncHlpDlg(0, url);
1728}
1729
1730// Select Fonts
1731////////////////////////////////////////////////////////////////////////////
1732void bncWindow::slotFontSel() {
1733 bool ok;
1734 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1735 if (ok) {
1736 bncSettings settings;
1737 settings.setValue("font", newFont.toString());
1738 QApplication::setFont(newFont);
1739 int ww = QFontMetrics(newFont).width('w');
1740 setMinimumSize(60*ww, 80*ww);
1741 resize(60*ww, 80*ww);
1742 }
1743}
1744
1745// Whats This Help
1746void bncWindow::slotWhatsThis() {
1747 QWhatsThis::enterWhatsThisMode();
1748}
1749
1750//
1751////////////////////////////////////////////////////////////////////////////
1752void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1753 _bncFigure->updateMountPoints();
1754 _bncFigureLate->updateMountPoints();
1755
1756 populateMountPointsTable();
1757 bncSettings settings;
1758 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1759 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1760 QListIterator<bncGetThread*> iTh(threads);
1761 while (iTh.hasNext()) {
1762 bncGetThread* thread = iTh.next();
1763 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1764 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1765 "@" + _mountPointsTable->item(iRow, 1)->text() );
1766 if (url == thread->mountPoint() &&
1767 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1768 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1769 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1770 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1771 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1772 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1773 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1774 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1775 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1776 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1777 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1778 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1779 disconnect(thread,
1780 SIGNAL(newPosition(bncTime, double, double, double)),
1781 _bncFigurePPP,
1782 SLOT(slotNewPosition(bncTime, double, double, double)));
1783 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1784 _bncFigurePPP,
1785 SLOT(slotNewPosition(bncTime, double, double, double)));
1786 }
1787 break;
1788 }
1789 }
1790 }
1791}
1792
1793//
1794////////////////////////////////////////////////////////////////////////////
1795void bncWindow::CreateMenu() {
1796 // Create Menus
1797 // ------------
1798 _menuFile = menuBar()->addMenu(tr("&File"));
1799 _menuFile->addAction(_actFontSel);
1800 _menuFile->addSeparator();
1801 _menuFile->addAction(_actSaveOpt);
1802 _menuFile->addSeparator();
1803 _menuFile->addAction(_actQuit);
1804
1805 _menuHlp = menuBar()->addMenu(tr("&Help"));
1806 _menuHlp->addAction(_actHelp);
1807 _menuHlp->addAction(_actFlowchart);
1808 _menuHlp->addAction(_actAbout);
1809}
1810
1811// Toolbar
1812////////////////////////////////////////////////////////////////////////////
1813void bncWindow::AddToolbar() {
1814 QToolBar* toolBar = new QToolBar;
1815 addToolBar(Qt::BottomToolBarArea, toolBar);
1816 toolBar->setMovable(false);
1817 toolBar->addAction(_actAddMountPoints);
1818 toolBar->addAction(_actDeleteMountPoints);
1819 toolBar->addAction(_actGetData);
1820 toolBar->addAction(_actStop);
1821 toolBar->addAction(_actPostProcessing);
1822 toolBar->addWidget(new QLabel(" "));
1823 toolBar->addAction(_actwhatsthis);
1824}
1825
1826// About
1827////////////////////////////////////////////////////////////////////////////
1828bncAboutDlg::bncAboutDlg(QWidget* parent) :
1829 QDialog(parent) {
1830
1831 QTextBrowser* tb = new QTextBrowser;
1832 QUrl url; url.setPath(":bncabout.html");
1833 tb->setSource(url);
1834 tb->setReadOnly(true);
1835
1836 int ww = QFontMetrics(font()).width('w');
1837 QPushButton* _closeButton = new QPushButton("Close");
1838 _closeButton->setMaximumWidth(10*ww);
1839 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1840
1841 QGridLayout* dlgLayout = new QGridLayout();
1842 QLabel* img = new QLabel();
1843 img->setPixmap(QPixmap(":ntrip-logo.png"));
1844 dlgLayout->addWidget(img, 0,0);
1845 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1846 dlgLayout->addWidget(tb,1,0,1,2);
1847 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1848
1849 setLayout(dlgLayout);
1850 resize(60*ww, 60*ww);
1851 setWindowTitle("About BNC");
1852 show();
1853}
1854
1855//
1856////////////////////////////////////////////////////////////////////////////
1857bncAboutDlg::~bncAboutDlg() {
1858};
1859
1860// Flowchart
1861////////////////////////////////////////////////////////////////////////////
1862bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1863 QDialog(parent) {
1864
1865 int ww = QFontMetrics(font()).width('w');
1866 QPushButton* _closeButton = new QPushButton("Close");
1867 _closeButton->setMaximumWidth(10*ww);
1868 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1869
1870 QGridLayout* dlgLayout = new QGridLayout();
1871 QLabel* img = new QLabel();
1872 img->setPixmap(QPixmap(":bncflowchart.png"));
1873 dlgLayout->addWidget(img, 0,0);
1874 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1875
1876 setLayout(dlgLayout);
1877 setWindowTitle("Flow Chart");
1878 show();
1879}
1880
1881//
1882////////////////////////////////////////////////////////////////////////////
1883bncFlowchartDlg::~bncFlowchartDlg() {
1884};
1885
1886// Enable/Disable Widget (and change its color)
1887////////////////////////////////////////////////////////////////////////////
1888void bncWindow::enableWidget(bool enable, QWidget* widget) {
1889 const static QPalette paletteWhite(QColor(255, 255, 255));
1890 const static QPalette paletteGray(QColor(230, 230, 230));
1891
1892 widget->setEnabled(enable);
1893 if (enable) {
1894 widget->setPalette(paletteWhite);
1895 }
1896 else {
1897 widget->setPalette(paletteGray);
1898 }
1899}
1900
1901// Bnc Text
1902////////////////////////////////////////////////////////////////////////////
1903void bncWindow::slotBncTextChanged(){
1904
1905 bool enable = true;
1906
1907 // Proxy
1908 //------
1909 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1910 enable = !_proxyHostLineEdit->text().isEmpty();
1911 enableWidget(enable, _proxyPortLineEdit);
1912 }
1913
1914 // RINEX Observations
1915 // ------------------
1916 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1917 enable = !_rnxPathLineEdit->text().isEmpty();
1918 enableWidget(enable, _rnxSamplSpinBox);
1919 enableWidget(enable, _rnxSkelLineEdit);
1920 enableWidget(enable, _rnxScrpLineEdit);
1921 enableWidget(enable, _rnxV3CheckBox);
1922 enableWidget(enable, _rnxIntrComboBox);
1923 }
1924
1925 // RINEX Ephemeris
1926 // ---------------
1927 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1928 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
1929 enableWidget(enable, _ephIntrComboBox);
1930 enableWidget(enable, _ephV3CheckBox);
1931 }
1932
1933 // Broadcast Corrections
1934 // ---------------------
1935 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1936 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
1937 enableWidget(enable, _corrIntrComboBox);
1938 }
1939
1940 // Feed Engine
1941 // -----------
1942 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1943 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
1944 enableWidget(enable, _waitTimeSpinBox);
1945 enableWidget(enable, _binSamplSpinBox);
1946 }
1947
1948 // Serial Output
1949 // -------------
1950 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1951 sender() == _serialAutoNMEAComboBox) {
1952 enable = !_serialMountPointLineEdit->text().isEmpty();
1953 enableWidget(enable, _serialPortNameLineEdit);
1954 enableWidget(enable, _serialBaudRateComboBox);
1955 enableWidget(enable, _serialParityComboBox);
1956 enableWidget(enable, _serialDataBitsComboBox);
1957 enableWidget(enable, _serialStopBitsComboBox);
1958 enableWidget(enable, _serialFlowControlComboBox);
1959 enableWidget(enable, _serialAutoNMEAComboBox);
1960
1961 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
1962 enableWidget(enable2, _serialFileNMEALineEdit);
1963 }
1964
1965 // Outages
1966 // -------
1967 if (sender() == 0 || sender() == _obsRateComboBox) {
1968 enable = !_obsRateComboBox->currentText().isEmpty();
1969 enableWidget(enable, _adviseFailSpinBox);
1970 enableWidget(enable, _adviseRecoSpinBox);
1971 enableWidget(enable, _adviseScriptLineEdit);
1972 }
1973
1974 // Miscellaneous
1975 // -------------
1976 if (sender() == 0 || sender() == _miscMountLineEdit) {
1977 enable = !_miscMountLineEdit->text().isEmpty();
1978 enableWidget(enable, _perfIntrComboBox);
1979 enableWidget(enable, _scanRTCMCheckBox);
1980 }
1981
1982 // PPP Client
1983 // ----------
1984 if (sender() == 0
1985 || sender() == _pppMountLineEdit
1986 || sender() == _pppCorrMountLineEdit
1987 || sender() == _pppRefCrdXLineEdit
1988 || sender() == _pppRefCrdYLineEdit
1989 || sender() == _pppRefCrdZLineEdit
1990 || sender() == _pppRefdNLineEdit
1991 || sender() == _pppRefdELineEdit
1992 || sender() == _pppRefdULineEdit
1993 || sender() == _pppSync
1994 || sender() == _pppSPPComboBox
1995 || sender() == _pppQuickStartLineEdit
1996 || sender() == _pppEstTropoCheckBox
1997 || sender() == _pppUsePhaseCheckBox
1998 || sender() == _pppAntexFileChooser ) {
1999
2000 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2001 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "SPP") ||
2002 (_pppSPPComboBox->currentText() == "Post-Processing");
2003
2004 enableWidget(enable, _pppNMEALineEdit);
2005 enableWidget(enable, _pppNMEAPortLineEdit);
2006 enableWidget(enable, _pppRefCrdXLineEdit);
2007 enableWidget(enable, _pppRefCrdYLineEdit);
2008 enableWidget(enable, _pppRefCrdZLineEdit);
2009 enableWidget(enable, _pppRefdNLineEdit);
2010 enableWidget(enable, _pppRefdELineEdit);
2011 enableWidget(enable, _pppRefdULineEdit);
2012 enableWidget(enable, _pppUsePhaseCheckBox);
2013 enableWidget(enable, _pppPlotCoordinates);
2014 enableWidget(enable, _pppEstTropoCheckBox);
2015 enableWidget(enable, _pppGLONASSCheckBox);
2016 enableWidget(enable, _pppGalileoCheckBox);
2017 enableWidget(enable, _pppAntexFileChooser);
2018 enableWidget(enable, _pppSigCLineEdit);
2019 enableWidget(enable, _pppSigCrd0);
2020 enableWidget(enable, _pppSigCrdP);
2021
2022 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2023 !_pppRefCrdYLineEdit->text().isEmpty() &&
2024 !_pppRefCrdZLineEdit->text().isEmpty();
2025
2026 enableWidget(enable2, _pppAverageLineEdit);
2027 enableWidget(enable2, _pppQuickStartLineEdit);
2028
2029 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2030 enableWidget(enable3, _pppMaxSolGapLineEdit);
2031
2032 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2033 enableWidget(enable4, _pppAntennaLineEdit);
2034 enableWidget(enable4, _pppApplySatAntCheckBox);
2035
2036 bool enable5 = enable && _pppEstTropoCheckBox->isChecked() && !_pppMountLineEdit->text().isEmpty();
2037 enableWidget(enable5, _pppSigTrp0);
2038 enableWidget(enable5, _pppSigTrpP);
2039
2040 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2041 enableWidget(enable6, _pppSigPLineEdit);
2042
2043 bool enable7 = enable && _pppSPPComboBox->currentText() == "PPP";
2044 enableWidget(enable7, _pppSync);
2045
2046 bool enable8 = _pppSPPComboBox->currentText() == "PPP";
2047 enableWidget(enable8, _pppCorrMountLineEdit);
2048
2049 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2050 enableWidget(enable9, _postObsFileChooser);
2051 enableWidget(enable9, _postNavFileChooser);
2052 enableWidget(enable9, _postCorrFileChooser);
2053 enableWidget(enable9, _postOutLineEdit);
2054 _actPostProcessing->setEnabled(enable9);
2055
2056 enableWidget(!enable9, _pppMountLineEdit);
2057 }
2058}
2059
2060//
2061////////////////////////////////////////////////////////////////////////////
2062void bncWindow::slotAddCmbRow() {
2063 int iRow = _cmbTable->rowCount();
2064 _cmbTable->insertRow(iRow);
2065 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2066 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2067 }
2068}
2069
2070//
2071////////////////////////////////////////////////////////////////////////////
2072void bncWindow::slotDelCmbRow() {
2073 int nRows = _cmbTable->rowCount();
2074 bool flg[nRows];
2075 for (int iRow = 0; iRow < nRows; iRow++) {
2076 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2077 flg[iRow] = true;
2078 }
2079 else {
2080 flg[iRow] = false;
2081 }
2082 }
2083 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2084 if (flg[iRow]) {
2085 _cmbTable->removeRow(iRow);
2086 }
2087 }
2088}
2089
2090//
2091////////////////////////////////////////////////////////////////////////////
2092void bncWindow::populateCmbTable() {
2093
2094 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2095 _cmbTable->removeRow(iRow);
2096 }
2097
2098 bncSettings settings;
2099
2100 int iRow = -1;
2101 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2102 while (it.hasNext()) {
2103 QStringList hlp = it.next().split(" ");
2104 if (hlp.size() > 2) {
2105 ++iRow;
2106 _cmbTable->insertRow(iRow);
2107 }
2108 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2109 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2110 }
2111 }
2112}
2113
2114//
2115////////////////////////////////////////////////////////////////////////////
2116void bncWindow::slotAddUploadRow() {
2117 int iRow = _uploadTable->rowCount();
2118 _uploadTable->insertRow(iRow);
2119 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2120 if (iCol == 3) {
2121 QLineEdit* passwd = new QLineEdit();
2122 passwd->setFrame(false);
2123 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2124 _uploadTable->setCellWidget(iRow, iCol, passwd);
2125 }
2126 else if (iCol == 4) {
2127 QComboBox* system = new QComboBox();
2128 system->setEditable(false);
2129 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2130 system->setFrame(false);
2131 _uploadTable->setCellWidget(iRow, iCol, system);
2132 }
2133 else if (iCol == 5) {
2134 QCheckBox* com = new QCheckBox();
2135 _uploadTable->setCellWidget(iRow, iCol, com);
2136 }
2137 else if (iCol == 8) {
2138 bncTableItem* bncIt = new bncTableItem();
2139 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2140 _uploadTable->setItem(iRow, iCol, bncIt);
2141 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2142 }
2143 else {
2144 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2145 }
2146 }
2147}
2148
2149//
2150////////////////////////////////////////////////////////////////////////////
2151void bncWindow::slotDelUploadRow() {
2152 ((bncApp*)qApp)->_uploadTableItems.clear();
2153 int nRows = _uploadTable->rowCount();
2154 bool flg[nRows];
2155 for (int iRow = 0; iRow < nRows; iRow++) {
2156 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2157 flg[iRow] = true;
2158 }
2159 else {
2160 flg[iRow] = false;
2161 }
2162 }
2163 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2164 if (flg[iRow]) {
2165 _uploadTable->removeRow(iRow);
2166 }
2167 }
2168 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2169 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2170 (bncTableItem*) _uploadTable->item(iRow, 8);
2171 }
2172}
2173
2174//
2175////////////////////////////////////////////////////////////////////////////
2176void bncWindow::populateUploadTable() {
2177 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2178 _uploadTable->removeRow(iRow);
2179 }
2180
2181 bncSettings settings;
2182
2183 int iRow = -1;
2184 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2185 while (it.hasNext()) {
2186 QStringList hlp = it.next().split(",");
2187 if (hlp.size() > 6) {
2188 ++iRow;
2189 _uploadTable->insertRow(iRow);
2190 }
2191 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2192 if (iCol == 3) {
2193 QLineEdit* passwd = new QLineEdit();
2194 passwd->setFrame(false);
2195 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2196 passwd->setText(hlp[iCol]);
2197 _uploadTable->setCellWidget(iRow, iCol, passwd);
2198 }
2199 else if (iCol == 4) {
2200 QComboBox* system = new QComboBox();
2201 system->setEditable(false);
2202 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2203 system->setFrame(false);
2204 system->setCurrentIndex(system->findText(hlp[iCol]));
2205 _uploadTable->setCellWidget(iRow, iCol, system);
2206 }
2207 else if (iCol == 5) {
2208 QCheckBox* com = new QCheckBox();
2209 if (hlp[iCol].toInt() == Qt::Checked) {
2210 com->setCheckState(Qt::Checked);
2211 }
2212 _uploadTable->setCellWidget(iRow, iCol, com);
2213 }
2214 else if (iCol == 8) {
2215 bncTableItem* bncIt = new bncTableItem();
2216 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2217 _uploadTable->setItem(iRow, iCol, bncIt);
2218 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2219 }
2220 else {
2221 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2222 }
2223 }
2224 }
2225}
2226
2227//
2228////////////////////////////////////////////////////////////////////////////
2229void bncWindow::slotSetUploadTrafo() {
2230 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2231 dlg->exec();
2232 delete dlg;
2233}
2234
2235// Start Post-Processing
2236////////////////////////////////////////////////////////////////////////////
2237void bncWindow::slotStartPostProcessing() {
2238#ifdef USE_POSTPROCESSING
2239 _actPostProcessing->setEnabled(false);
2240 _actPostProcessing->setText("0 Epochs");
2241
2242 slotSaveOptions();
2243
2244 t_postProcessing* postProcessing = new t_postProcessing(this);
2245 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessing()));
2246 connect(postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2247
2248 postProcessing->start();
2249#else
2250 QMessageBox::information(this, "Information",
2251 "Post-Processing Not Permitted");
2252#endif
2253}
2254
2255// Post-Processing Finished
2256////////////////////////////////////////////////////////////////////////////
2257void bncWindow::slotFinishedPostProcessing() {
2258 QMessageBox::information(this, "Information",
2259 "Post-Processing Thread Finished");
2260 _actPostProcessing->setText("Start Post-Processing");
2261 _actPostProcessing->setEnabled(true);
2262}
2263
2264// Progress Bar Change
2265////////////////////////////////////////////////////////////////////////////
2266void bncWindow::slotPostProgress(int nEpo) {
2267 if (_actPostProcessing) {
2268 _actPostProcessing->setText(QString("%1 Epochs").arg(nEpo));
2269 }
2270}
Note: See TracBrowser for help on using the repository browser.