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

Last change on this file since 4352 was 4305, checked in by mervart, 12 years ago
File size: 136.9 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "reqcdlg.h"
65#ifdef USE_POSTPROCESSING
66# include "rinex/bncpostprocess.h"
67# include "rinex/reqcedit.h"
68# include "rinex/reqcanalyze.h"
69#endif
70
71using namespace std;
72
73// Constructor
74////////////////////////////////////////////////////////////////////////////
75bncWindow::bncWindow() {
76
77 _caster = 0;
78 _casterEph = 0;
79
80 _bncFigure = new bncFigure(this);
81 _bncFigureLate = new bncFigureLate(this);
82 _bncFigurePPP = new bncFigurePPP(this);
83 _runningRealTime = false;
84 _runningPostProcessingPPP = false;
85 _runningPostProcessingReqc = false;
86
87 _pppSPPComboBox = 0; // necessary for enableStartStop()
88 _reqcActionComboBox = 0; // necessary for enableStartStop()
89
90 int ww = QFontMetrics(this->font()).width('w');
91
92 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
93
94 setMinimumSize(85*ww, 65*ww);
95
96 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
97
98 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
99 this, SLOT(slotWindowMessage(QByteArray,bool)));
100
101 // Create Actions
102 // --------------
103 _actHelp = new QAction(tr("&Help Contents"),this);
104 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
105
106 _actAbout = new QAction(tr("&About BNC"),this);
107 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
108
109 _actFlowchart = new QAction(tr("&Flow Chart"),this);
110 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
111
112 _actFontSel = new QAction(tr("Select &Font"),this);
113 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
114
115 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
116 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
117
118 _actQuit = new QAction(tr("&Quit"),this);
119 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
120
121 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
122 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
123
124 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
125 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
126 _actDeleteMountPoints->setEnabled(false);
127
128 _actStart = new QAction(tr("Sta&rt"),this);
129 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
130
131 _actStop = new QAction(tr("Sto&p"),this);
132 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
133
134 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
135 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
136
137 CreateMenu();
138 AddToolbar();
139
140 bncSettings settings;
141
142 // Network Options
143 // ---------------
144 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
145 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
146
147 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
148 this, SLOT(slotBncTextChanged()));
149
150 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
151 _ignoreSslErrorsCheckBox = new QCheckBox();
152 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
153 settings.value("ignoreSslErrors").toInt()));
154
155 // General Options
156 // ---------------
157 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
158 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
159 _rnxAppendCheckBox = new QCheckBox();
160 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
161 settings.value("rnxAppend").toInt()));
162 _onTheFlyComboBox = new QComboBox();
163 _onTheFlyComboBox->setEditable(false);
164 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
165 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
166 if (ii != -1) {
167 _onTheFlyComboBox->setCurrentIndex(ii);
168 }
169 _autoStartCheckBox = new QCheckBox();
170 _autoStartCheckBox->setCheckState(Qt::CheckState(
171 settings.value("autoStart").toInt()));
172
173 // RINEX Observations Options
174 // --------------------------
175 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
176 _rnxIntrComboBox = new QComboBox();
177 _rnxIntrComboBox->setEditable(false);
178 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
179 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
180 if (ii != -1) {
181 _rnxIntrComboBox->setCurrentIndex(ii);
182 }
183 _rnxSamplSpinBox = new QSpinBox();
184 _rnxSamplSpinBox->setMinimum(0);
185 _rnxSamplSpinBox->setMaximum(60);
186 _rnxSamplSpinBox->setSingleStep(5);
187 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
188 _rnxSamplSpinBox->setSuffix(" sec");
189 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
190 _rnxSkelLineEdit->setMaximumWidth(5*ww);
191 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
192 _rnxV3CheckBox = new QCheckBox();
193 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
194
195 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
196 this, SLOT(slotBncTextChanged()));
197
198 // RINEX Ephemeris Options
199 // -----------------------
200 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
201 _ephIntrComboBox = new QComboBox();
202 _ephIntrComboBox->setEditable(false);
203 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
204 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
205 if (jj != -1) {
206 _ephIntrComboBox->setCurrentIndex(jj);
207 }
208 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
209 _ephV3CheckBox = new QCheckBox();
210 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
211
212 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
213 this, SLOT(slotBncTextChanged()));
214
215 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
216 this, SLOT(slotBncTextChanged()));
217
218 // Broadcast Corrections Options
219 // -----------------------------
220 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
221 _corrIntrComboBox = new QComboBox();
222 _corrIntrComboBox->setEditable(false);
223 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
224 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
225 if (mm != -1) {
226 _corrIntrComboBox->setCurrentIndex(mm);
227 }
228 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
229 _corrTimeSpinBox = new QSpinBox();
230 _corrTimeSpinBox->setMinimum(0);
231 _corrTimeSpinBox->setMaximum(60);
232 _corrTimeSpinBox->setSingleStep(1);
233 _corrTimeSpinBox->setSuffix(" sec");
234 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
235
236 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
237 this, SLOT(slotBncTextChanged()));
238
239 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
240 this, SLOT(slotBncTextChanged()));
241
242 // Feed Engine Options
243 // -------------------
244 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
245 _waitTimeSpinBox = new QSpinBox();
246 _waitTimeSpinBox->setMinimum(1);
247 _waitTimeSpinBox->setMaximum(30);
248 _waitTimeSpinBox->setSingleStep(1);
249 _waitTimeSpinBox->setSuffix(" sec");
250 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
251 _binSamplSpinBox = new QSpinBox();
252 _binSamplSpinBox->setMinimum(0);
253 _binSamplSpinBox->setMaximum(60);
254 _binSamplSpinBox->setSingleStep(5);
255 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
256 _binSamplSpinBox->setSuffix(" sec");
257 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
258 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
259
260 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
261 this, SLOT(slotBncTextChanged()));
262
263 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
264 this, SLOT(slotBncTextChanged()));
265
266 // Serial Output Options
267 // ---------------------
268 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
269 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
270 _serialBaudRateComboBox = new QComboBox();
271 _serialBaudRateComboBox->addItems(QString("110,300,600,"
272 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
273 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
274 if (kk != -1) {
275 _serialBaudRateComboBox->setCurrentIndex(kk);
276 }
277 _serialFlowControlComboBox = new QComboBox();
278 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
279 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
280 if (kk != -1) {
281 _serialFlowControlComboBox->setCurrentIndex(kk);
282 }
283 _serialDataBitsComboBox = new QComboBox();
284 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
285 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
286 if (kk != -1) {
287 _serialDataBitsComboBox->setCurrentIndex(kk);
288 }
289 _serialParityComboBox = new QComboBox();
290 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
291 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
292 if (kk != -1) {
293 _serialParityComboBox->setCurrentIndex(kk);
294 }
295 _serialStopBitsComboBox = new QComboBox();
296 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
297 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
298 if (kk != -1) {
299 _serialStopBitsComboBox->setCurrentIndex(kk);
300 }
301 _serialAutoNMEAComboBox = new QComboBox();
302 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
303 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
304 if (kk != -1) {
305 _serialAutoNMEAComboBox->setCurrentIndex(kk);
306 }
307 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
308 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
309
310 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
311 this, SLOT(slotBncTextChanged()));
312
313 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
314 this, SLOT(slotBncTextChanged()));
315
316 // Outages Options
317 // ---------------
318 _obsRateComboBox = new QComboBox();
319 _obsRateComboBox->setEditable(false);
320 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
321 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
322 if (kk != -1) {
323 _obsRateComboBox->setCurrentIndex(kk);
324 }
325 _adviseFailSpinBox = new QSpinBox();
326 _adviseFailSpinBox->setMinimum(0);
327 _adviseFailSpinBox->setMaximum(60);
328 _adviseFailSpinBox->setSingleStep(1);
329 _adviseFailSpinBox->setSuffix(" min");
330 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
331 _adviseRecoSpinBox = new QSpinBox();
332 _adviseRecoSpinBox->setMinimum(0);
333 _adviseRecoSpinBox->setMaximum(60);
334 _adviseRecoSpinBox->setSingleStep(1);
335 _adviseRecoSpinBox->setSuffix(" min");
336 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
337 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
338
339 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
340 this, SLOT(slotBncTextChanged()));
341
342 // Miscellaneous Options
343 // ---------------------
344 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
345 _perfIntrComboBox = new QComboBox();
346 _perfIntrComboBox->setEditable(false);
347 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
348 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
349 if (ll != -1) {
350 _perfIntrComboBox->setCurrentIndex(ll);
351 }
352 _scanRTCMCheckBox = new QCheckBox();
353 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
354 settings.value("scanRTCM").toInt()));
355
356 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
357 this, SLOT(slotBncTextChanged()));
358
359 // PPP Options
360 // -----------
361 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
362 _pppMountLineEdit->setMaximumWidth(8*ww);
363 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
364 _pppMountLineEdit->setMinimumWidth(8*ww);
365 _pppCorrMountLineEdit->setMinimumWidth(8*ww);
366 _pppCorrMountLineEdit->setMaximumWidth(8*ww);
367 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
368 _pppNMEALineEdit->setMinimumWidth(15*ww);
369 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
370 _pppNMEAPortLineEdit->setMaximumWidth(8*ww);
371 _pppNMEAPortLineEdit->setMinimumWidth(8*ww);
372 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
373 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
374 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
375 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
376 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
377 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
378 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
379 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
380 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
381 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
382 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
383 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
384 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
385 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
386 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
387 _pppSync = new QLineEdit(settings.value("pppSync").toString());
388 _pppAntexFileChooser = new qtFileChooser;
389 _pppAntexFileChooser->setMinimumWidth(12*ww);
390 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
391 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
392
393 _pppSPPComboBox = new QComboBox();
394 _pppSPPComboBox->setEditable(false);
395 _pppSPPComboBox->addItems(QString(",Realtime-PPP,Realtime-SPP,Post-Processing").split(","));
396 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
397 if (ik != -1) {
398 _pppSPPComboBox->setCurrentIndex(ik);
399 }
400 _pppUsePhaseCheckBox = new QCheckBox();
401 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
402 settings.value("pppUsePhase").toInt()));
403 _pppEstTropoCheckBox = new QCheckBox();
404 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
405 settings.value("pppEstTropo").toInt()));
406 _pppGLONASSCheckBox = new QCheckBox();
407 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
408 settings.value("pppGLONASS").toInt()));
409 _pppGalileoCheckBox = new QCheckBox();
410 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
411 settings.value("pppGalileo").toInt()));
412
413 _pppPlotCoordinates = new QCheckBox();
414 _pppPlotCoordinates->setCheckState(Qt::CheckState(
415 settings.value("pppPlotCoordinates").toInt()));
416
417 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
418 this, SLOT(slotBncTextChanged()));
419
420 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
421 this, SLOT(slotBncTextChanged()));
422
423 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
424 this, SLOT(slotBncTextChanged()));
425
426 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
427 this, SLOT(slotBncTextChanged()));
428 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
429 this, SLOT(slotBncTextChanged()));
430 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
431 this, SLOT(slotBncTextChanged()));
432 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
433 this, SLOT(slotBncTextChanged()));
434 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
435 this, SLOT(slotBncTextChanged()));
436 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
437 this, SLOT(slotBncTextChanged()));
438
439 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
440 this, SLOT(slotBncTextChanged()));
441
442 connect(_pppSync, SIGNAL(textChanged(const QString &)),
443 this, SLOT(slotBncTextChanged()));
444
445 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
446 this, SLOT(slotBncTextChanged()));
447
448 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
449 this, SLOT(slotBncTextChanged()));
450
451 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
452 this, SLOT(slotBncTextChanged()));
453
454 // Streams
455 // -------
456 _mountPointsTable = new QTableWidget(0,8);
457
458 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
459 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
460 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
461 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
462 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
463 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
464 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
465 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
466 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
467_mountPointsTable->setHorizontalHeaderLabels(labels);
468 _mountPointsTable->setGridStyle(Qt::NoPen);
469 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
470 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
471 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
472 _mountPointsTable->hideColumn(0);
473 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
474 SLOT(slotSelectionChanged()));
475 populateMountPointsTable();
476
477 _log = new QTextBrowser();
478 _log->setReadOnly(true);
479
480 // Combine Corrections
481 // -------------------
482 _cmbTable = new QTableWidget(0,3);
483 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
484 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
485 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
486 _cmbTable->setMaximumWidth(30*ww);
487 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
488 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
489 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
490 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
491 _cmbTable->horizontalHeader()->setStretchLastSection(true);
492 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
493
494 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
495
496 _cmbSamplSpinBox = new QSpinBox;
497 _cmbSamplSpinBox->setMinimum(10);
498 _cmbSamplSpinBox->setMaximum(60);
499 _cmbSamplSpinBox->setSingleStep(10);
500 _cmbSamplSpinBox->setMaximumWidth(9*ww);
501 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
502 _cmbSamplSpinBox->setSuffix(" sec");
503
504 QPushButton* addCmbRowButton = new QPushButton("Add Row");
505 QPushButton* delCmbRowButton = new QPushButton("Delete");
506
507 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
508 SLOT(slotBncTextChanged()));
509
510 _cmbMethodComboBox = new QComboBox();
511 _cmbMethodComboBox->setEditable(false);
512 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
513 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
514 if (im != -1) {
515 _cmbMethodComboBox->setCurrentIndex(im);
516 }
517
518 int iRow = _cmbTable->rowCount();
519 if (iRow > 0) {
520 enableWidget(true, _cmbMethodComboBox);
521 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
522 _cmbMaxresLineEdit->setEnabled(true);
523 _cmbSamplSpinBox->setEnabled(true);
524 }
525 else {
526 enableWidget(false, _cmbMethodComboBox);
527 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
528 _cmbMaxresLineEdit->setEnabled(false);
529 _cmbSamplSpinBox->setEnabled(false);
530 }
531
532 // Upload Results
533 // -------------
534 _uploadTable = new QTableWidget(0,12);
535 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, PID, SID, IOD, bytes").split(","));
536 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
537 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
538 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
539 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
540 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
541 _uploadTable->horizontalHeader()->resizeSection( 3, 8*ww);
542 _uploadTable->horizontalHeader()->resizeSection( 4,11*ww);
543 _uploadTable->horizontalHeader()->resizeSection( 5, 4*ww);
544 _uploadTable->horizontalHeader()->resizeSection( 6,15*ww);
545 _uploadTable->horizontalHeader()->resizeSection( 7,15*ww);
546 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
547 _uploadTable->horizontalHeader()->resizeSection( 9, 4*ww);
548 _uploadTable->horizontalHeader()->resizeSection(10, 4*ww);
549 _uploadTable->horizontalHeader()->resizeSection(11,12*ww);
550 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
551 _uploadTable->horizontalHeader()->setStretchLastSection(true);
552 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
553
554 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
555 SLOT(slotBncTextChanged()));
556
557 QPushButton* addUploadRowButton = new QPushButton("Add Row");
558 QPushButton* delUploadRowButton = new QPushButton("Del Row");
559 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
560 _uploadIntrComboBox = new QComboBox;
561 _uploadIntrComboBox->setEditable(false);
562 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
563 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
564 if (ii != -1) {
565 _uploadIntrComboBox->setCurrentIndex(ii);
566 }
567
568 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
569 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
570 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
571 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
572 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
573 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
574 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
575
576 _uploadSamplSp3SpinBox = new QSpinBox;
577 _uploadSamplSp3SpinBox->setMinimum(0);
578 _uploadSamplSp3SpinBox->setMaximum(15);
579 _uploadSamplSp3SpinBox->setSingleStep(1);
580 _uploadSamplSp3SpinBox->setMaximumWidth(9*ww);
581 _uploadSamplSp3SpinBox->setValue(settings.value("uploadSamplSp3").toInt());
582 _uploadSamplSp3SpinBox->setSuffix(" min");
583
584 _uploadSamplClkRnxSpinBox = new QSpinBox;
585 _uploadSamplClkRnxSpinBox->setMinimum(0);
586 _uploadSamplClkRnxSpinBox->setMaximum(60);
587 _uploadSamplClkRnxSpinBox->setSingleStep(5);
588 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
589 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
590 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
591
592 int iRowT = _uploadTable->rowCount();
593 if (iRowT > 0) {
594 enableWidget(true, _uploadIntrComboBox);
595 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
596 enableWidget(true, _uploadSamplSp3SpinBox);
597 enableWidget(true, _uploadSamplClkRnxSpinBox);
598 }
599 else {
600 enableWidget(false, _uploadIntrComboBox);
601 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
602 enableWidget(false, _uploadSamplSp3SpinBox);
603 enableWidget(false, _uploadSamplClkRnxSpinBox);
604 }
605
606 // Upload RTCM3 Ephemeris
607 // ----------------------
608 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
609 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
610 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
611 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
612 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
613 _uploadEphSampleSpinBox = new QSpinBox;
614 _uploadEphSampleSpinBox->setMinimum(5);
615 _uploadEphSampleSpinBox->setMaximum(60);
616 _uploadEphSampleSpinBox->setSingleStep(5);
617 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
618 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
619 _uploadEphSampleSpinBox->setSuffix(" sec");
620 _uploadEphBytesCounter = new bncBytesCounter;
621
622 // Canvas with Editable Fields
623 // ---------------------------
624 _canvas = new QWidget;
625 setCentralWidget(_canvas);
626
627 _aogroup = new QTabWidget();
628 QWidget* pgroup = new QWidget();
629 QWidget* ggroup = new QWidget();
630 QWidget* sgroup = new QWidget();
631 QWidget* egroup = new QWidget();
632 QWidget* agroup = new QWidget();
633 QWidget* cgroup = new QWidget();
634 QWidget* ogroup = new QWidget();
635 QWidget* rgroup = new QWidget();
636 QWidget* sergroup = new QWidget();
637 QWidget* pppgroup = new QWidget();
638 QWidget* ppp2group = new QWidget();
639 QWidget* reqcgroup = new QWidget();
640 QWidget* cmbgroup = new QWidget();
641 QWidget* uploadgroup = new QWidget();
642 QWidget* uploadEphgroup = new QWidget();
643 _aogroup->addTab(pgroup,tr("Network"));
644 _aogroup->addTab(ggroup,tr("General"));
645 _aogroup->addTab(ogroup,tr("RINEX Observations"));
646 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
647 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
648 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
649 _aogroup->addTab(sgroup,tr("Feed Engine"));
650 _aogroup->addTab(sergroup,tr("Serial Output"));
651 _aogroup->addTab(agroup,tr("Outages"));
652 _aogroup->addTab(rgroup,tr("Miscellaneous"));
653 _aogroup->addTab(pppgroup,tr("PPP (1)"));
654 _aogroup->addTab(ppp2group,tr("PPP (2)"));
655#ifdef USE_COMBINATION
656 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
657#endif
658 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
659 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
660
661 // Log Tab
662 // -------
663 _loggroup = new QTabWidget();
664 _loggroup->addTab(_log,tr("Log"));
665 _loggroup->addTab(_bncFigure,tr("Throughput"));
666 _loggroup->addTab(_bncFigureLate,tr("Latency"));
667 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
668
669 // Netowork (Proxy and SSL) Tab
670 // ----------------------------
671 QGridLayout* pLayout = new QGridLayout;
672 pLayout->setColumnMinimumWidth(0,13*ww);
673 _proxyPortLineEdit->setMaximumWidth(9*ww);
674
675 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
676 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
677 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
678 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
679 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
680 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
681 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
682 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
683 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
684 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
685 pLayout->addWidget(new QLabel(" "), 4, 0);
686 pLayout->addWidget(new QLabel(" "), 5, 0);
687 pLayout->addWidget(new QLabel(" "), 6, 0);
688 pgroup->setLayout(pLayout);
689
690 // General Tab
691 // -----------
692 QGridLayout* gLayout = new QGridLayout;
693 gLayout->setColumnMinimumWidth(0,14*ww);
694 _onTheFlyComboBox->setMaximumWidth(9*ww);
695
696 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
697 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
698 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
699 gLayout->addWidget(new QLabel("Append files"), 2, 0);
700 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
701 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
702 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
703 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
704 gLayout->addWidget(_autoStartCheckBox, 4, 1);
705 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
706 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
707 gLayout->addWidget(new QLabel(" "), 6, 0);
708 ggroup->setLayout(gLayout);
709
710 // RINEX Observations
711 // ------------------
712 QGridLayout* oLayout = new QGridLayout;
713 oLayout->setColumnMinimumWidth(0,14*ww);
714 _rnxIntrComboBox->setMaximumWidth(9*ww);
715 _rnxSamplSpinBox->setMaximumWidth(9*ww);
716
717 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
718 oLayout->addWidget(new QLabel("Directory"), 1, 0);
719 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
720 oLayout->addWidget(new QLabel("Interval"), 2, 0);
721 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
722 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
723 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
724 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
725 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
726 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
727 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
728 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
729 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
730 oLayout->addWidget(new QLabel(" "), 6, 0);
731 ogroup->setLayout(oLayout);
732
733 // RINEX Ephemeris
734 // ---------------
735 QGridLayout* eLayout = new QGridLayout;
736 eLayout->setColumnMinimumWidth(0,14*ww);
737 _ephIntrComboBox->setMaximumWidth(9*ww);
738 _outEphPortLineEdit->setMaximumWidth(9*ww);
739
740 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
741 eLayout->addWidget(new QLabel("Directory"), 1, 0);
742 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
743 eLayout->addWidget(new QLabel("Interval"), 2, 0);
744 eLayout->addWidget(_ephIntrComboBox, 2, 1);
745 eLayout->addWidget(new QLabel("Port"), 3, 0);
746 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
747 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
748 eLayout->addWidget(_ephV3CheckBox, 4, 1);
749 eLayout->addWidget(new QLabel(" "), 5, 0);
750 eLayout->addWidget(new QLabel(" "), 6, 0);
751 egroup->setLayout(eLayout);
752
753
754 // Broadcast Corrections
755 // ---------------------
756 QGridLayout* cLayout = new QGridLayout;
757 cLayout->setColumnMinimumWidth(0,14*ww);
758 _corrIntrComboBox->setMaximumWidth(9*ww);
759 _corrPortLineEdit->setMaximumWidth(9*ww);
760 _corrTimeSpinBox->setMaximumWidth(9*ww);
761
762 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
763 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
764 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
765 cLayout->addWidget(new QLabel("Interval"), 2, 0);
766 cLayout->addWidget(_corrIntrComboBox, 2, 1);
767 cLayout->addWidget(new QLabel("Port"), 3, 0);
768 cLayout->addWidget(_corrPortLineEdit, 3, 1);
769 cLayout->addWidget(new QLabel(" Wait for full corr epoch"), 3, 2, Qt::AlignRight);
770 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
771 cLayout->addWidget(new QLabel(" "), 4, 0);
772 cLayout->addWidget(new QLabel(" "), 5, 0);
773 cLayout->addWidget(new QLabel(" "), 6, 0);
774 cgroup->setLayout(cLayout);
775
776 // Feed Engine
777 // -----------
778 QGridLayout* sLayout = new QGridLayout;
779 sLayout->setColumnMinimumWidth(0,14*ww);
780 _outPortLineEdit->setMaximumWidth(9*ww);
781 _waitTimeSpinBox->setMaximumWidth(9*ww);
782 _binSamplSpinBox->setMaximumWidth(9*ww);
783 _outUPortLineEdit->setMaximumWidth(9*ww);
784
785 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine."),0,0,1,50);
786 sLayout->addWidget(new QLabel("Port"), 1, 0);
787 sLayout->addWidget(_outPortLineEdit, 1, 1);
788 sLayout->addWidget(new QLabel("Wait for full obs epoch"), 1, 2, Qt::AlignRight);
789 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
790 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
791 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
792 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
793 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
794 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
795 sLayout->addWidget(_outUPortLineEdit, 4, 1);
796 sLayout->addWidget(new QLabel(" "), 5, 0);
797 sLayout->addWidget(new QLabel(" "), 6, 0);
798 sgroup->setLayout(sLayout);
799
800 // Serial Output
801 // -------------
802 QGridLayout* serLayout = new QGridLayout;
803 serLayout->setColumnMinimumWidth(0,14*ww);
804 _serialBaudRateComboBox->setMaximumWidth(9*ww);
805 _serialFlowControlComboBox->setMaximumWidth(11*ww);
806 _serialDataBitsComboBox->setMaximumWidth(5*ww);
807 _serialParityComboBox->setMaximumWidth(9*ww);
808 _serialStopBitsComboBox->setMaximumWidth(5*ww);
809 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
810 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
811
812 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
813 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
814 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
815 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
816 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
817 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
818 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
819 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
820 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
821 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
822 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
823 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
824 serLayout->addWidget(_serialParityComboBox, 4, 3);
825 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
826 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
827 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
828 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
829 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
830 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
831 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
832 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
833 serLayout->addWidget(new QLabel(" "), 6, 0);
834
835 sergroup->setLayout(serLayout);
836
837 // Outages
838 // -------
839 QGridLayout* aLayout = new QGridLayout;
840 aLayout->setColumnMinimumWidth(0,14*ww);
841 _obsRateComboBox->setMaximumWidth(9*ww);
842 _adviseFailSpinBox->setMaximumWidth(9*ww);
843 _adviseRecoSpinBox->setMaximumWidth(9*ww);
844
845 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
846 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
847 aLayout->addWidget(_obsRateComboBox, 1, 1);
848 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
849 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
850 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
851 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
852 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
853 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
854 aLayout->addWidget(new QLabel(" "), 5, 0);
855 aLayout->addWidget(new QLabel(" "), 6, 0);
856 agroup->setLayout(aLayout);
857
858 // Miscellaneous
859 // -------------
860 QGridLayout* rLayout = new QGridLayout;
861 rLayout->setColumnMinimumWidth(0,14*ww);
862 _perfIntrComboBox->setMaximumWidth(9*ww);
863
864 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),0, 0,1,30);
865 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
866 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
867 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
868 rLayout->addWidget(_perfIntrComboBox, 2, 1);
869 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
870 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
871 rLayout->addWidget(new QLabel(" "), 4, 0);
872 rLayout->addWidget(new QLabel(" "), 5, 0);
873 rLayout->addWidget(new QLabel(" "), 6, 0);
874 rgroup->setLayout(rLayout);
875
876 // PPP Client
877 // ----------
878 QGridLayout* pppLayout = new QGridLayout;
879 pppLayout->setColumnMinimumWidth(0,14*ww);
880 _pppSigCLineEdit->setMaximumWidth(6*ww);
881 _pppSigPLineEdit->setMaximumWidth(6*ww);
882 _pppSigCrd0->setMaximumWidth(6*ww);
883 _pppSigCrdP->setMaximumWidth(6*ww);
884 _pppSigTrp0->setMaximumWidth(6*ww);
885 _pppSigTrpP->setMaximumWidth(6*ww);
886 _pppAverageLineEdit->setMaximumWidth(6*ww);
887 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
888 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
889 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
890 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
891 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
892 _pppRefdNLineEdit->setMaximumWidth(6*ww);
893 _pppRefdELineEdit->setMaximumWidth(6*ww);
894 _pppRefdULineEdit->setMaximumWidth(6*ww);
895 _pppSync->setMaximumWidth(6*ww);
896 _pppSPPComboBox->setMinimumWidth(15*ww);
897
898 _postObsFileChooser = new qtFileChooser;
899 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
900 _postObsFileChooser->setMinimumWidth(15*ww);
901 _postNavFileChooser = new qtFileChooser;
902 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
903 _postNavFileChooser->setMinimumWidth(15*ww);
904 _postCorrFileChooser = new qtFileChooser;
905 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
906 _postCorrFileChooser->setMinimumWidth(15*ww);
907 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
908 _postOutLineEdit->setMinimumWidth(15*ww);
909
910 int ir = 0;
911 pppLayout->addWidget(new QLabel("Precise Point Positioning, Panel 1."), ir, 0, 1, 2, Qt::AlignLeft);
912 ++ir;
913 pppLayout->addWidget(new QLabel("Mode & mountpoints"),ir, 0, Qt::AlignLeft);
914 pppLayout->addWidget(_pppSPPComboBox, ir, 1, Qt::AlignRight);
915 pppLayout->addWidget(_pppMountLineEdit, ir, 3, Qt::AlignRight);
916 pppLayout->addWidget(new QLabel("Obs."), ir, 4, Qt::AlignLeft);
917 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 5, Qt::AlignRight);
918 pppLayout->addWidget(new QLabel("Corr."), ir, 6, Qt::AlignLeft);
919 ++ir;
920 pppLayout->addWidget(new QLabel("Marker coordinates"), ir, 0, Qt::AlignLeft);
921 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 1, Qt::AlignRight);
922 pppLayout->addWidget(new QLabel("X "), ir, 2, Qt::AlignLeft);
923 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 3, Qt::AlignRight);
924 pppLayout->addWidget(new QLabel("Y"), ir, 4, Qt::AlignLeft);
925 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 5, Qt::AlignRight);
926 pppLayout->addWidget(new QLabel("Z"), ir, 6, Qt::AlignLeft);
927 ++ir;
928 pppLayout->addWidget(new QLabel("Antenna excentricity"), ir, 0, Qt::AlignLeft);
929 pppLayout->addWidget(_pppRefdNLineEdit, ir, 1, Qt::AlignRight);
930 pppLayout->addWidget(new QLabel("dN"), ir, 2, Qt::AlignLeft);
931 pppLayout->addWidget(_pppRefdELineEdit, ir, 3, Qt::AlignRight);
932 pppLayout->addWidget(new QLabel("dE"), ir, 4, Qt::AlignLeft);
933 pppLayout->addWidget(_pppRefdULineEdit, ir, 5, Qt::AlignRight);
934 pppLayout->addWidget(new QLabel("dU"), ir, 6, Qt::AlignLeft);
935 ++ir;
936 pppLayout->addWidget(new QLabel("NMEA & plot output"),ir, 0, Qt::AlignLeft);
937 pppLayout->addWidget(_pppNMEALineEdit, ir, 1, Qt::AlignRight);
938 pppLayout->addWidget(new QLabel("NMEA File"), ir, 2, Qt::AlignLeft);
939 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 3, Qt::AlignRight);
940 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 4, Qt::AlignLeft);
941 pppLayout->addWidget(_pppPlotCoordinates, ir, 5, Qt::AlignRight);
942 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 6, Qt::AlignLeft);
943 ++ir;
944 pppLayout->addWidget(new QLabel("Post-processing"), ir, 0, Qt::AlignLeft);
945 pppLayout->addWidget(_postObsFileChooser, ir, 1, Qt::AlignRight);
946 pppLayout->addWidget(new QLabel("Obs "), ir, 2, Qt::AlignLeft);
947 pppLayout->addWidget(_postNavFileChooser, ir, 3, Qt::AlignRight);
948 pppLayout->addWidget(new QLabel("Nav "), ir, 4, Qt::AlignLeft);
949 ++ir;
950 pppLayout->addWidget(_postCorrFileChooser, ir, 1, Qt::AlignRight);
951 pppLayout->addWidget(new QLabel("Corr"), ir, 2, Qt::AlignLeft);
952 pppLayout->addWidget(_postOutLineEdit, ir, 3, Qt::AlignRight);
953 pppLayout->addWidget(new QLabel("Log (full path)"), ir, 4, Qt::AlignLeft);
954
955 pppgroup->setLayout(pppLayout);
956
957 // PPP Client (second panel)
958 // -------------------------
959 QGridLayout* ppp2Layout = new QGridLayout;
960 ppp2Layout->setColumnMinimumWidth(0,14*ww);
961 ir = 0;
962 ppp2Layout->addWidget(new QLabel("Precise Point Positioning, Panel 2."), ir, 0, 1, 10);
963 ++ir;
964 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
965 ppp2Layout->addWidget(_pppAntexFileChooser, ir, 1,1,3);
966 ppp2Layout->addWidget(new QLabel("ANTEX File"), ir, 4);
967 ppp2Layout->addWidget(_pppAntennaLineEdit, ir, 5,1,3);
968 ppp2Layout->addWidget(new QLabel("Antenna Name"), ir, 8);
969 ++ir;
970 ppp2Layout->addWidget(new QLabel("Basics"), ir, 0, 1, 5);
971 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
972 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
973 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
974 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
975 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
976 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
977 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
978 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
979 ++ir;
980 ppp2Layout->addWidget(new QLabel("Basics cont'd"), ir, 0);
981 ppp2Layout->addWidget(_pppSync, ir, 1);
982 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
983 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
984 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
985 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
986 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
987 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
988 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
989 ++ir;
990 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
991 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
992 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
993 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
994 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
995 ++ir;
996 ppp2Layout->addWidget(new QLabel("Sigmas cont'd"), ir, 0);
997 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
998 ppp2Layout->addWidget(new QLabel("XYZ Init "), ir, 2);
999 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1000 ppp2Layout->addWidget(new QLabel("XYZ White Noise "), ir, 4);
1001 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1002 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1003 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1004 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1005 ++ir;
1006 ppp2Layout->addWidget(new QLabel(""), ir, 0);
1007
1008 ppp2group->setLayout(ppp2Layout);
1009
1010 // Reqc Processing
1011 // ---------------
1012 _reqcActionComboBox = new QComboBox();
1013 _reqcActionComboBox->setEditable(false);
1014 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1015 ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1016 if (ik != -1) {
1017 _reqcActionComboBox->setCurrentIndex(ik);
1018 }
1019 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1020 this, SLOT(slotBncTextChanged()));
1021
1022 QGridLayout* reqcLayout = new QGridLayout;
1023 _reqcActionComboBox->setMinimumWidth(15*ww);
1024 _reqcActionComboBox->setMaximumWidth(15*ww);
1025
1026 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1027 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1028 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
1029 _reqcObsFileChooser->setMinimumWidth(15*ww);
1030 _reqcObsFileChooser->setMaximumWidth(15*ww);
1031
1032 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1033 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1034 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
1035 _reqcNavFileChooser->setMinimumWidth(15*ww);
1036 _reqcNavFileChooser->setMaximumWidth(15*ww);
1037
1038 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1039 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1040 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
1041 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
1042
1043 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1044 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1045 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
1046 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
1047
1048 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1049 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
1050 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
1051 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
1052
1053 ir = 0;
1054 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1055 ++ir;
1056 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1057 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1058 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1059 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1060 ++ir;
1061 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1062 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1063 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1064 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1065 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1066 ++ir;
1067 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1068 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1069 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1070 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1071 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1072 ++ir;
1073 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1074 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1075 ++ir;
1076 reqcLayout->addWidget(new QLabel(""), ir, 1);
1077 reqcLayout->setRowStretch(ir, 999);
1078
1079 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1080 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1081
1082 reqcgroup->setLayout(reqcLayout);
1083
1084 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1085 this, SLOT(slotReqcEditOption()));
1086
1087 // Combine Corrections
1088 // -------------------
1089 QGridLayout* cmbLayout = new QGridLayout;
1090
1091 populateCmbTable();
1092 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1093 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1094 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1095 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1096 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1097 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1098 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1099 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1100 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1101 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1102 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1103 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1104 cmbLayout->addWidget(new QLabel(" "), 4, 5);
1105 cmbLayout->addWidget(new QLabel("Sampling"), 4, 6, Qt::AlignRight);
1106 cmbLayout->addWidget(_cmbSamplSpinBox, 4, 7, Qt::AlignRight);
1107 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1108
1109 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1110 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1111
1112 cmbgroup->setLayout(cmbLayout);
1113
1114 // Upload Layout (Clocks)
1115 // ----------------------
1116 QGridLayout* uploadHlpLayout = new QGridLayout();
1117
1118 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1119 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1120 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1121
1122 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1123 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1124 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1125 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1126 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1127 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1128 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1129 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1130 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1131 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1132 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1133
1134 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1135 populateUploadTable();
1136
1137 uploadLayout->addWidget(new QLabel("Upload RTCMv3 Broadcast Corrections to caster."));
1138 uploadLayout->addWidget(_uploadTable);
1139 uploadLayout->addLayout(uploadHlpLayout);
1140
1141 uploadgroup->setLayout(uploadLayout);
1142
1143 // Upload Layout (Ephemeris)
1144 // -------------------------
1145 QGridLayout* uploadLayoutEph = new QGridLayout;
1146
1147 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1148 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1149 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1150 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1151
1152 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1153 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1154 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1155 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1156 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1157 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1158 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1159 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1160 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1161 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1162 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1163 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1164 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1165 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1166 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1167
1168 uploadEphgroup->setLayout(uploadLayoutEph);
1169
1170 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1171 this, SLOT(slotBncTextChanged()));
1172
1173 // Main Layout
1174 // -----------
1175 QGridLayout* mLayout = new QGridLayout;
1176 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1177 mLayout->addWidget(_aogroup, 0,0);
1178 mLayout->addWidget(_mountPointsTable, 1,0);
1179 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1180 mLayout->addWidget(_loggroup, 2,0);
1181
1182 _canvas->setLayout(mLayout);
1183
1184 // WhatsThis
1185 // ---------
1186 _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>"));
1187 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1188 _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an NTRIP broadcaster over SSL requires the exchange of client and/or server certificates. Specify the path to a directory where you save certificates on your system. Don't try communication via SSL if you are not sure wheter this is supported by the involved NTRIP broadcaster. Note that SSL communication is usually done over port 443.</p>"));
1189 _ignoreSslErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the NTRIP broadcaster. Tick 'Ignore SSL authorization erros' if you don't want to be bothered with this.</p>"));
1190 _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 obs 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>"));
1191 _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."));
1192 _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."));
1193 _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."));
1194 _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."));
1195 _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."));
1196 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full corr 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>"));
1197 _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."));
1198 _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."));
1199 _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."));
1200 _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>"));
1201 _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>"));
1202 _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>"));
1203 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1204 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1205
1206 _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>"));
1207 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1208 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1209 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1210 _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>"));
1211 _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>"));
1212 _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>"));
1213 _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>"));
1214 _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>"));
1215 _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."));
1216 _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>"));
1217 _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>"));
1218 _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', 'RTCM_3.x' and 'RTNET'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate 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>"));
1219 _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."));
1220 _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)."));
1221 _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."));
1222 _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."));
1223 _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."));
1224 _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>"));
1225 _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>"));
1226 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1227 _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>"));
1228 _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>"));
1229 _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>"));
1230 _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>"));
1231 _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>"));
1232 _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>"));
1233 _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>"));
1234 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1235 _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>"));
1236 _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>"));
1237 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock Broadcast Ephemeris corrections stream by its mountpoint from the 'Streams' list below. Example: 'CLK10'</p><p>Note that BNC can produce an internal PPP solution from combined Broadcast Ephemeris corrections as specified under 'Combine Corrections' if you introduce keyword 'INTERNAL' as the corrections mountpoint.</p>"));
1238 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP) in 'Realtime' or 'Post-Processing' mode.</p><p>When in 'Post-Processing mode:<ul><li>Specifying a RINEX Observation, a RINEX Navigation and a Broadcast Correction file leads to a PPP solution.</li><li>Specifying only a RINEX Observation and a RINEX Navigation file and no Broadcast Correction file leads to a SPP solution.</ul></p>"));
1239 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to edit or concatenate RINEX v2 or v3 files or to perform a quality check.</p><p>In this it follows UNAVCO's famous 'teqc' program.</p>"));
1240 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1241 _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>"));
1242 _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>"));
1243 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for adding GLONASS observations to GPS and Galileo (optional) in a PPP solution.</p>"));
1244 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for adding Galileo observations to GPS and GLONASS (optional) in a PPP solution.</p>"));
1245 _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."));
1246 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
1247 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
1248 _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>"));
1249 _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>"));
1250 _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 Quick-Start mode and fixes the introduced reference coordinate for the specified period. A value of '60' 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>"));
1251 _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>"));
1252 _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>"));
1253 _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."));
1254 _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>"));
1255 _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>"));
1256 _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 3e-6 (default) would mean that the tropospheric effect may vary for 3600 * 3e-6 = 0.01 meters per hour.</p>"));
1257 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p><p>This option only makes sense in static observation conditions.</p>"));
1258 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1259 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1260 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
1261 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
1262 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
1263 _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."));
1264 _pppSync->setWhatsThis(tr(
1265 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
1266 "immediately after its arrival using satellite clock corrections available at "
1267 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
1268 "are buffered and the processing of each epoch is postponed till the satellite clock "
1269 "corrections not older than 'Sync Corr' seconds are available.<p>"));
1270 _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>"));
1271 _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>"));
1272 _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 coming 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.<ul><li>Note that an appropriate 'Wait for full corr 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.</li><li>Note also that you need to tick 'Use GLONASS' which is part ot the 'PPP (2)' panel in case you want to produce an GPS plus GLONASS combination.</li></ul></p><p>Note further that the orbit information in the final combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris corrections stream in the combination table. Instead of combining corrections BNC will then merge them with Broadcast Ephemeris to save results in SP3 and/or Clock RINEX format."));
1273 _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Residuum' meters from the average of all clocks will be ignored.<p></p>It is suggested to specify a value of about 0.2 m for the Kalman filter combination approach and a value of about 3.0 meters for the Single-Epoch combination approach.</p><p>Default is a value of '999.0'.</p>"));
1274 _cmbSamplSpinBox->setWhatsThis(tr("<p>Specify a combination sampling interval. Clock and orbit corrections will be produced following that interval. A value of 10 sec may be an appropriate choice.</p>"));
1275 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'. It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning.</p>"));
1276 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to broadcast ephemeris (Broadcast Corrections) in RTCM Version 3 SSR format. You may have a situation where clocks and orbits come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified NTRIP broadcaster</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris corrections if you specify correction streams in the 'Combine Corrections' stream table.</p><p>Hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an NTRIP broadcaster and hit Enter. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the NTRIP broadcaster IP port (default is 80), the mountpoint and the stream upload password. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference system (e.g. IGS08) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving the generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create SP3 orbit files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.sp3<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><ul><li>As an SP3 file contents should be referred to the satellites Center of Mass (CoM) while correctors are referred to the satellites Antenna Phase Center (APC), an offset has to be applied which is available from an IGS ANTEX file. You should therefore specify the 'ANTEX File' path under tab 'PPP (2)' if you want to save the stream contents in SP3 format. If you don't specify an 'ANTEX File' path there, the SP3 file contents will be referred to the satellites APCs.</li></ul></p><p>Specify a path for saving the generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.clk<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><p>Specify finally an SSR Provider ID number, an SSR Solution ID number and an Issue of Data SSR number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Corrections stream, BNC will merge that stream with Broadcast Ephemeris to save results in files specified here through SP3 and/or Clock RINEX file path. In such a case you should define only the SP3 and Clock RINEX file path and no further options in the 'Upload Corrections' table.</p>"));
1277 _postObsFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Observation file."));
1278 _postNavFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Navigation file."));
1279 _postCorrFileChooser->setWhatsThis(tr("Full path to Broadcast Corrections file as previously saved with BNC in plain ASCII format."));
1280 _postOutLineEdit->setWhatsThis(tr("Full path to file with post processing PPP results. "));
1281 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1282 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1283 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1284 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1285 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1286 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("Select the stream's orbit correction sampling interval in seconds. A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages."));
1287 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("Select the Clock RINEX file sampling interval in seconds. A value of zero '0' tells BNC to store all available samples into Clock RINEX files."));
1288 _uploadSamplSp3SpinBox->setWhatsThis(tr("Select the SP3 orbit file sampling interval in minutes. A value of zero '0' tells BNC to store all available samples into SP3 orbit files."));
1289 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1290
1291 _uploadEphHostLineEdit->setWhatsThis(tr("BNC can upload a Broadcast Ephemeris stream in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload Broadcast Ephemeris."));
1292 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1293 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1294 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1295 _uploadEphSampleSpinBox->setWhatsThis(tr("Select the Broadcast Ephemeris sampling interval in seconds. Defaut is '5' meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds."));
1296 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1297
1298 // Enable/Disable all Widgets
1299 // --------------------------
1300 slotBncTextChanged();
1301 enableStartStop();
1302
1303 // Auto start
1304 // ----------
1305 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1306 slotStart();
1307 }
1308}
1309
1310// Destructor
1311////////////////////////////////////////////////////////////////////////////
1312bncWindow::~bncWindow() {
1313 delete _caster;
1314 delete _casterEph;
1315}
1316
1317//
1318////////////////////////////////////////////////////////////////////////////
1319void bncWindow::populateMountPointsTable() {
1320
1321 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1322 _mountPointsTable->removeRow(iRow);
1323 }
1324
1325 bncSettings settings;
1326
1327 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1328 int iRow = 0;
1329 while (it.hasNext()) {
1330 QStringList hlp = it.next().split(" ");
1331 if (hlp.size() < 5) continue;
1332 _mountPointsTable->insertRow(iRow);
1333
1334 QUrl url(hlp[0]);
1335
1336 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1337 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1338 QString nmea(hlp[4]);
1339 if (hlp[5] == "S") {
1340 fullPath = hlp[0].replace(0,2,"");
1341 }
1342 QString ntripVersion = "2";
1343 if (hlp.size() >= 6) {
1344 ntripVersion = (hlp[5]);
1345 }
1346
1347 QTableWidgetItem* it;
1348 it = new QTableWidgetItem(url.userInfo());
1349 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1350 _mountPointsTable->setItem(iRow, 0, it);
1351
1352 it = new QTableWidgetItem(fullPath);
1353 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1354 _mountPointsTable->setItem(iRow, 1, it);
1355
1356 it = new QTableWidgetItem(format);
1357 _mountPointsTable->setItem(iRow, 2, it);
1358
1359 if (nmea == "yes") {
1360 it = new QTableWidgetItem(latitude);
1361 _mountPointsTable->setItem(iRow, 3, it);
1362 it = new QTableWidgetItem(longitude);
1363 _mountPointsTable->setItem(iRow, 4, it);
1364 } else {
1365 it = new QTableWidgetItem(latitude);
1366 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1367 _mountPointsTable->setItem(iRow, 3, it);
1368 it = new QTableWidgetItem(longitude);
1369 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1370 _mountPointsTable->setItem(iRow, 4, it);
1371 }
1372
1373 it = new QTableWidgetItem(nmea);
1374 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1375 _mountPointsTable->setItem(iRow, 5, it);
1376
1377 it = new QTableWidgetItem(ntripVersion);
1378 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1379 _mountPointsTable->setItem(iRow, 6, it);
1380
1381 bncTableItem* bncIt = new bncTableItem();
1382 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1383 _mountPointsTable->setItem(iRow, 7, bncIt);
1384
1385 iRow++;
1386 }
1387
1388 _mountPointsTable->sortItems(1);
1389
1390 enableStartStop();
1391}
1392
1393// Retrieve Table
1394////////////////////////////////////////////////////////////////////////////
1395void bncWindow::slotAddMountPoints() {
1396
1397 bncSettings settings;
1398 QString proxyHost = settings.value("proxyHost").toString();
1399 int proxyPort = settings.value("proxyPort").toInt();
1400 if (proxyHost != _proxyHostLineEdit->text() ||
1401 proxyPort != _proxyPortLineEdit->text().toInt()) {
1402 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1403 "changed. Use the new ones?",
1404 QMessageBox::Yes, QMessageBox::No,
1405 QMessageBox::NoButton);
1406 if (iRet == QMessageBox::Yes) {
1407 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1408 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1409 }
1410 }
1411
1412 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1413 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1414
1415 QMessageBox msgBox;
1416 msgBox.setIcon(QMessageBox::Question);
1417 msgBox.setWindowTitle("Add Stream");
1418 msgBox.setText("Add stream(s) coming from:");
1419
1420 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1421 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1422 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1423 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1424 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1425
1426 msgBox.exec();
1427
1428 if (msgBox.clickedButton() == buttonNtrip) {
1429 bncTableDlg* dlg = new bncTableDlg(this);
1430 dlg->move(this->pos().x()+50, this->pos().y()+50);
1431 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1432 this, SLOT(slotNewMountPoints(QStringList*)));
1433 dlg->exec();
1434 delete dlg;
1435 } else if (msgBox.clickedButton() == buttonIP) {
1436 bncIpPort* ipp = new bncIpPort(this);
1437 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1438 this, SLOT(slotNewMountPoints(QStringList*)));
1439 ipp->exec();
1440 delete ipp;
1441 } else if (msgBox.clickedButton() == buttonUDP) {
1442 bncUdpPort* udp = new bncUdpPort(this);
1443 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1444 this, SLOT(slotNewMountPoints(QStringList*)));
1445 udp->exec();
1446 delete udp;
1447 } else if (msgBox.clickedButton() == buttonSerial) {
1448 bncSerialPort* sep = new bncSerialPort(this);
1449 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1450 this, SLOT(slotNewMountPoints(QStringList*)));
1451 sep->exec();
1452 delete sep;
1453 } else if (msgBox.clickedButton() == buttonCancel) {
1454 // Cancel
1455 }
1456
1457 enableStartStop();
1458}
1459
1460// Delete Selected Mount Points
1461////////////////////////////////////////////////////////////////////////////
1462void bncWindow::slotDeleteMountPoints() {
1463
1464 int nRows = _mountPointsTable->rowCount();
1465 bool flg[nRows];
1466 for (int iRow = 0; iRow < nRows; iRow++) {
1467 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1468 flg[iRow] = true;
1469 }
1470 else {
1471 flg[iRow] = false;
1472 }
1473 }
1474 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1475 if (flg[iRow]) {
1476 _mountPointsTable->removeRow(iRow);
1477 }
1478 }
1479 _actDeleteMountPoints->setEnabled(false);
1480
1481 enableStartStop();
1482}
1483
1484// New Mount Points Selected
1485////////////////////////////////////////////////////////////////////////////
1486void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1487 int iRow = 0;
1488 QListIterator<QString> it(*mountPoints);
1489 while (it.hasNext()) {
1490 QStringList hlp = it.next().split(" ");
1491 QUrl url(hlp[0]);
1492 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1493 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1494 QString nmea(hlp[4]);
1495 if (hlp[5] == "S") {
1496 fullPath = hlp[0].replace(0,2,"");
1497 }
1498 QString ntripVersion = "2";
1499 if (hlp.size() >= 6) {
1500 ntripVersion = (hlp[5]);
1501 }
1502
1503 _mountPointsTable->insertRow(iRow);
1504
1505 QTableWidgetItem* it;
1506 it = new QTableWidgetItem(url.userInfo());
1507 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1508 _mountPointsTable->setItem(iRow, 0, it);
1509
1510 it = new QTableWidgetItem(fullPath);
1511 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1512 _mountPointsTable->setItem(iRow, 1, it);
1513
1514 it = new QTableWidgetItem(format);
1515 _mountPointsTable->setItem(iRow, 2, it);
1516
1517 if (nmea == "yes") {
1518 it = new QTableWidgetItem(latitude);
1519 _mountPointsTable->setItem(iRow, 3, it);
1520 it = new QTableWidgetItem(longitude);
1521 _mountPointsTable->setItem(iRow, 4, it);
1522 } else {
1523 it = new QTableWidgetItem(latitude);
1524 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1525 _mountPointsTable->setItem(iRow, 3, it);
1526 it = new QTableWidgetItem(longitude);
1527 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1528 _mountPointsTable->setItem(iRow, 4, it);
1529 }
1530
1531 it = new QTableWidgetItem(nmea);
1532 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1533 _mountPointsTable->setItem(iRow, 5, it);
1534
1535 it = new QTableWidgetItem(ntripVersion);
1536 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1537 _mountPointsTable->setItem(iRow, 6, it);
1538
1539 bncTableItem* bncIt = new bncTableItem();
1540 _mountPointsTable->setItem(iRow, 7, bncIt);
1541
1542 iRow++;
1543 }
1544 _mountPointsTable->hideColumn(0);
1545 _mountPointsTable->sortItems(1);
1546 delete mountPoints;
1547
1548 enableStartStop();
1549}
1550
1551// Save Options (serialize)
1552////////////////////////////////////////////////////////////////////////////
1553void bncWindow::slotSaveOptions() {
1554 saveOptions();
1555 bncSettings settings;
1556 settings.sync();
1557}
1558
1559// Save Options (memory only)
1560////////////////////////////////////////////////////////////////////////////
1561void bncWindow::saveOptions() {
1562
1563 QStringList mountPoints;
1564 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1565
1566 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1567 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1568 "@" + _mountPointsTable->item(iRow, 1)->text() );
1569
1570 mountPoints.append(url.toString() + " " +
1571 _mountPointsTable->item(iRow, 2)->text()
1572 + " " + _mountPointsTable->item(iRow, 3)->text()
1573 + " " + _mountPointsTable->item(iRow, 4)->text()
1574 + " " + _mountPointsTable->item(iRow, 5)->text()
1575 + " " + _mountPointsTable->item(iRow, 6)->text());
1576 } else {
1577 mountPoints.append(
1578 "//" + _mountPointsTable->item(iRow, 1)->text()
1579 + " " + _mountPointsTable->item(iRow, 2)->text()
1580 + " " + _mountPointsTable->item(iRow, 3)->text()
1581 + " " + _mountPointsTable->item(iRow, 4)->text()
1582 + " " + _mountPointsTable->item(iRow, 5)->text()
1583 + " " + _mountPointsTable->item(iRow, 6)->text());
1584 }
1585 }
1586
1587 QStringList combineStreams;
1588 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1589 QString hlp;
1590 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1591 if (_cmbTable->item(iRow, iCol)) {
1592 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1593 }
1594 }
1595 if (!hlp.isEmpty()) {
1596 combineStreams << hlp;
1597 }
1598 }
1599
1600 QStringList uploadMountpointsOut;
1601 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1602 QString hlp;
1603 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1604 if (_uploadTable->cellWidget(iRow, iCol) &&
1605 (iCol == 3 || iCol == 4 || iCol == 5)) {
1606 if (iCol == 3) {
1607 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1608 hlp += passwd->text() + ",";
1609 }
1610 else if (iCol == 4) {
1611 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1612 hlp += system->currentText() + ",";
1613 }
1614 else if (iCol == 5) {
1615 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1616 QString state; state.setNum(com->checkState());
1617 hlp += state + ",";
1618 }
1619 }
1620 else if (_uploadTable->item(iRow, iCol)) {
1621 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1622 }
1623 }
1624 if (!hlp.isEmpty()) {
1625 uploadMountpointsOut << hlp;
1626 }
1627 }
1628
1629 bncSettings settings;
1630
1631 settings.setValue("startTab", _aogroup->currentIndex());
1632 settings.setValue("statusTab", _loggroup->currentIndex());
1633 settings.setValue("mountPoints", mountPoints);
1634// Network
1635 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1636 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1637 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1638 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1639// General
1640 settings.setValue("logFile", _logFileLineEdit->text());
1641 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1642 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1643 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1644 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1645// RINEX Observations
1646 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1647 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1648 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1649 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1650 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1651 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1652// RINEX Ephemeris
1653 settings.setValue("ephPath", _ephPathLineEdit->text());
1654 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1655 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1656 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1657// Broadcast Corrections
1658 settings.setValue("corrPath", _corrPathLineEdit->text());
1659 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1660 settings.setValue("corrPort", _corrPortLineEdit->text());
1661 settings.setValue("corrTime", _corrTimeSpinBox->value());
1662// Feed Engine
1663 settings.setValue("outPort", _outPortLineEdit->text());
1664 settings.setValue("waitTime", _waitTimeSpinBox->value());
1665 settings.setValue("binSampl", _binSamplSpinBox->value());
1666 settings.setValue("outFile", _outFileLineEdit->text());
1667 settings.setValue("outUPort", _outUPortLineEdit->text());
1668// Serial Output
1669 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1670 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1671 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1672 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1673 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1674 settings.setValue("serialParity", _serialParityComboBox->currentText());
1675 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1676 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1677 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1678 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1679// Outages
1680 settings.setValue("obsRate", _obsRateComboBox->currentText());
1681 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1682 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1683 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1684// Miscellaneous
1685 settings.setValue("miscMount", _miscMountLineEdit->text());
1686 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1687 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1688// PPPP
1689 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1690 settings.setValue("pppMount", _pppMountLineEdit->text());
1691 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1692 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1693 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1694 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1695 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1696 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1697 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1698 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1699 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1700 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1701 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1702 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1703 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1704 settings.setValue("postOutFile", _postOutLineEdit->text());
1705 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1706 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1707 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1708 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1709 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1710 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1711 settings.setValue("pppSync", _pppSync->text());
1712 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1713 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1714 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1715 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1716 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1717 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1718 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1719 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1720 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1721// Reqc
1722 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1723 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1724 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1725 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1726 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1727 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1728// Combine Corrections
1729 if (!combineStreams.isEmpty()) {
1730 settings.setValue("combineStreams", combineStreams);
1731 }
1732 else {
1733 settings.setValue("combineStreams", "");
1734 }
1735 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1736 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1737 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1738// Upload Corrections
1739 if (!uploadMountpointsOut.isEmpty()) {
1740 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1741 }
1742 else {
1743 settings.setValue("uploadMountpointsOut", "");
1744 }
1745 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1746 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1747 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1748 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1749// Upload Ephemeris
1750 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1751 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1752 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1753 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1754 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1755 if (_caster) {
1756 _caster->readMountPoints();
1757 }
1758}
1759
1760// All get slots terminated
1761////////////////////////////////////////////////////////////////////////////
1762void bncWindow::slotGetThreadsFinished() {
1763 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1764 delete _caster; _caster = 0;
1765 delete _casterEph; _casterEph = 0;
1766 _runningRealTime = false;
1767}
1768
1769// Start It!
1770////////////////////////////////////////////////////////////////////////////
1771void bncWindow::slotStart() {
1772 saveOptions();
1773 if ( _pppSPPComboBox->currentText() == "Post-Processing" ) {
1774 startPostProcessingPPP();
1775 }
1776 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1777 startPostProcessingReqc();
1778 }
1779 else {
1780 startRealTime();
1781 }
1782}
1783
1784// Start Real-Time (Retrieve Data etc.)
1785////////////////////////////////////////////////////////////////////////////
1786void bncWindow::startRealTime() {
1787
1788 _runningRealTime = true;
1789
1790 _bncFigurePPP->reset();
1791
1792 _actDeleteMountPoints->setEnabled(false);
1793
1794 enableStartStop();
1795
1796 _caster = new bncCaster(_outFileLineEdit->text(),
1797 _outPortLineEdit->text().toInt());
1798
1799 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1800 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1801 ((bncApp*)qApp)->initCombination();
1802
1803 connect(_caster, SIGNAL(getThreadsFinished()),
1804 this, SLOT(slotGetThreadsFinished()));
1805
1806 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1807 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1808
1809 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1810
1811 bncSettings settings;
1812
1813 QDir rnxdir(settings.value("rnxPath").toString());
1814 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1815
1816 QString rnx_file = settings.value("rnxScript").toString();
1817 if ( !rnx_file.isEmpty() ) {
1818 QFile rnxfile(settings.value("rnxScript").toString());
1819 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1820 }
1821
1822 QDir ephdir(settings.value("ephPath").toString());
1823 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1824
1825 QDir corrdir(settings.value("corrPath").toString());
1826 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1827
1828 QString advise_file = settings.value("adviseScript").toString();
1829 if ( !advise_file.isEmpty() ) {
1830 QFile advisefile(settings.value("adviseScript").toString());
1831 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1832 }
1833
1834 QString ant_file = settings.value("pppAntex").toString();
1835 if ( !ant_file.isEmpty() ) {
1836 QFile anxfile(settings.value("pppAntex").toString());
1837 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1838 }
1839
1840 _caster->readMountPoints();
1841
1842 _casterEph = new bncEphUploadCaster();
1843 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1844 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1845}
1846
1847// Retrieve Data
1848////////////////////////////////////////////////////////////////////////////
1849void bncWindow::slotStop() {
1850 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1851 QMessageBox::Yes, QMessageBox::No,
1852 QMessageBox::NoButton);
1853 if (iRet == QMessageBox::Yes) {
1854 ((bncApp*)qApp)->stopCombination();
1855 delete _caster; _caster = 0;
1856 delete _casterEph; _casterEph = 0;
1857 _runningRealTime = false;
1858 enableStartStop();
1859 }
1860}
1861
1862// Close Application gracefully
1863////////////////////////////////////////////////////////////////////////////
1864void bncWindow::closeEvent(QCloseEvent* event) {
1865
1866 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1867 QMessageBox::Yes, QMessageBox::No,
1868 QMessageBox::Cancel);
1869
1870 if (iRet == QMessageBox::Cancel) {
1871 event->ignore();
1872 return;
1873 }
1874 else if (iRet == QMessageBox::Yes) {
1875 slotSaveOptions();
1876 }
1877
1878 QMainWindow::closeEvent(event);
1879}
1880
1881// User changed the selection of mountPoints
1882////////////////////////////////////////////////////////////////////////////
1883void bncWindow::slotSelectionChanged() {
1884 if (_mountPointsTable->selectedItems().isEmpty()) {
1885 _actDeleteMountPoints->setEnabled(false);
1886 }
1887 else {
1888 _actDeleteMountPoints->setEnabled(true);
1889 }
1890}
1891
1892// Display Program Messages
1893////////////////////////////////////////////////////////////////////////////
1894void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1895
1896#ifdef DEBUG_RTCM2_2021
1897 const int maxBufferSize = 1000;
1898#else
1899 const int maxBufferSize = 10000;
1900#endif
1901
1902 if (! showOnScreen ) {
1903 return;
1904 }
1905
1906 QString txt = _log->toPlainText() + "\n" +
1907 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1908 _log->clear();
1909 _log->append(txt.right(maxBufferSize));
1910}
1911
1912// About Message
1913////////////////////////////////////////////////////////////////////////////
1914void bncWindow::slotAbout() {
1915 new bncAboutDlg(0);
1916}
1917
1918//Flowchart
1919////////////////////////////////////////////////////////////////////////////
1920void bncWindow::slotFlowchart() {
1921 new bncFlowchartDlg(0);
1922}
1923
1924// Help Window
1925////////////////////////////////////////////////////////////////////////////
1926void bncWindow::slotHelp() {
1927 QUrl url;
1928 url.setPath(":bnchelp.html");
1929 new bncHlpDlg(0, url);
1930}
1931
1932// Select Fonts
1933////////////////////////////////////////////////////////////////////////////
1934void bncWindow::slotFontSel() {
1935 bool ok;
1936 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1937 if (ok) {
1938 bncSettings settings;
1939 settings.setValue("font", newFont.toString());
1940 QApplication::setFont(newFont);
1941 int ww = QFontMetrics(newFont).width('w');
1942 setMinimumSize(60*ww, 80*ww);
1943 resize(60*ww, 80*ww);
1944 }
1945}
1946
1947// Whats This Help
1948void bncWindow::slotWhatsThis() {
1949 QWhatsThis::enterWhatsThisMode();
1950}
1951
1952//
1953////////////////////////////////////////////////////////////////////////////
1954void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1955 _bncFigure->updateMountPoints();
1956 _bncFigureLate->updateMountPoints();
1957
1958 populateMountPointsTable();
1959 bncSettings settings;
1960 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1961 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1962 QListIterator<bncGetThread*> iTh(threads);
1963 while (iTh.hasNext()) {
1964 bncGetThread* thread = iTh.next();
1965 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1966 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1967 "@" + _mountPointsTable->item(iRow, 1)->text() );
1968 if (url == thread->mountPoint() &&
1969 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1970 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1971 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1972 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1973 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1974 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1975 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1976 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1977 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1978 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1979 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1980 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1981 disconnect(thread,
1982 SIGNAL(newPosition(bncTime, double, double, double)),
1983 _bncFigurePPP,
1984 SLOT(slotNewPosition(bncTime, double, double, double)));
1985 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1986 _bncFigurePPP,
1987 SLOT(slotNewPosition(bncTime, double, double, double)));
1988 }
1989 break;
1990 }
1991 }
1992 }
1993}
1994
1995//
1996////////////////////////////////////////////////////////////////////////////
1997void bncWindow::CreateMenu() {
1998 // Create Menus
1999 // ------------
2000 _menuFile = menuBar()->addMenu(tr("&File"));
2001 _menuFile->addAction(_actFontSel);
2002 _menuFile->addSeparator();
2003 _menuFile->addAction(_actSaveOpt);
2004 _menuFile->addSeparator();
2005 _menuFile->addAction(_actQuit);
2006
2007 _menuHlp = menuBar()->addMenu(tr("&Help"));
2008 _menuHlp->addAction(_actHelp);
2009 _menuHlp->addAction(_actFlowchart);
2010 _menuHlp->addAction(_actAbout);
2011}
2012
2013// Toolbar
2014////////////////////////////////////////////////////////////////////////////
2015void bncWindow::AddToolbar() {
2016 QToolBar* toolBar = new QToolBar;
2017 addToolBar(Qt::BottomToolBarArea, toolBar);
2018 toolBar->setMovable(false);
2019 toolBar->addAction(_actAddMountPoints);
2020 toolBar->addAction(_actDeleteMountPoints);
2021 toolBar->addAction(_actStart);
2022 toolBar->addAction(_actStop);
2023 toolBar->addWidget(new QLabel(" "));
2024 toolBar->addAction(_actwhatsthis);
2025}
2026
2027// About
2028////////////////////////////////////////////////////////////////////////////
2029bncAboutDlg::bncAboutDlg(QWidget* parent) :
2030 QDialog(parent) {
2031
2032 QTextBrowser* tb = new QTextBrowser;
2033 QUrl url; url.setPath(":bncabout.html");
2034 tb->setSource(url);
2035 tb->setReadOnly(true);
2036
2037 int ww = QFontMetrics(font()).width('w');
2038 QPushButton* _closeButton = new QPushButton("Close");
2039 _closeButton->setMaximumWidth(10*ww);
2040 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2041
2042 QGridLayout* dlgLayout = new QGridLayout();
2043 QLabel* img = new QLabel();
2044 img->setPixmap(QPixmap(":ntrip-logo.png"));
2045 dlgLayout->addWidget(img, 0,0);
2046 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
2047 dlgLayout->addWidget(tb,1,0,1,2);
2048 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2049
2050 setLayout(dlgLayout);
2051 resize(60*ww, 60*ww);
2052 setWindowTitle("About BNC");
2053 show();
2054}
2055
2056//
2057////////////////////////////////////////////////////////////////////////////
2058bncAboutDlg::~bncAboutDlg() {
2059};
2060
2061// Flowchart
2062////////////////////////////////////////////////////////////////////////////
2063bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2064 QDialog(parent) {
2065
2066 int ww = QFontMetrics(font()).width('w');
2067 QPushButton* _closeButton = new QPushButton("Close");
2068 _closeButton->setMaximumWidth(10*ww);
2069 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2070
2071 QGridLayout* dlgLayout = new QGridLayout();
2072 QLabel* img = new QLabel();
2073 img->setPixmap(QPixmap(":bncflowchart.png"));
2074 dlgLayout->addWidget(img, 0,0);
2075 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2076
2077 setLayout(dlgLayout);
2078 setWindowTitle("Flow Chart");
2079 show();
2080}
2081
2082//
2083////////////////////////////////////////////////////////////////////////////
2084bncFlowchartDlg::~bncFlowchartDlg() {
2085};
2086
2087// Enable/Disable Widget (and change its color)
2088////////////////////////////////////////////////////////////////////////////
2089void bncWindow::enableWidget(bool enable, QWidget* widget) {
2090 const static QPalette paletteWhite(QColor(255, 255, 255));
2091 const static QPalette paletteGray(QColor(230, 230, 230));
2092
2093 widget->setEnabled(enable);
2094 if (enable) {
2095 widget->setPalette(paletteWhite);
2096 }
2097 else {
2098 widget->setPalette(paletteGray);
2099 }
2100}
2101
2102// Bnc Text
2103////////////////////////////////////////////////////////////////////////////
2104void bncWindow::slotBncTextChanged(){
2105
2106 bool enable = true;
2107
2108 // Proxy
2109 //------
2110 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2111 enable = !_proxyHostLineEdit->text().isEmpty();
2112 enableWidget(enable, _proxyPortLineEdit);
2113 }
2114
2115 // RINEX Observations
2116 // ------------------
2117 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2118 enable = !_rnxPathLineEdit->text().isEmpty();
2119 enableWidget(enable, _rnxSamplSpinBox);
2120 enableWidget(enable, _rnxSkelLineEdit);
2121 enableWidget(enable, _rnxScrpLineEdit);
2122 enableWidget(enable, _rnxV3CheckBox);
2123 enableWidget(enable, _rnxIntrComboBox);
2124 }
2125
2126 // RINEX Ephemeris
2127 // ---------------
2128 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2129 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2130 enableWidget(enable, _ephIntrComboBox);
2131 enableWidget(enable, _ephV3CheckBox);
2132 }
2133
2134 // Broadcast Corrections
2135 // ---------------------
2136 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2137 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2138 enableWidget(enable, _corrIntrComboBox);
2139 }
2140
2141 // Feed Engine
2142 // -----------
2143 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2144 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2145 enableWidget(enable, _waitTimeSpinBox);
2146 enableWidget(enable, _binSamplSpinBox);
2147 }
2148
2149 // Serial Output
2150 // -------------
2151 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2152 sender() == _serialAutoNMEAComboBox) {
2153 enable = !_serialMountPointLineEdit->text().isEmpty();
2154 enableWidget(enable, _serialPortNameLineEdit);
2155 enableWidget(enable, _serialBaudRateComboBox);
2156 enableWidget(enable, _serialParityComboBox);
2157 enableWidget(enable, _serialDataBitsComboBox);
2158 enableWidget(enable, _serialStopBitsComboBox);
2159 enableWidget(enable, _serialFlowControlComboBox);
2160 enableWidget(enable, _serialAutoNMEAComboBox);
2161
2162 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2163 enableWidget(enable2, _serialFileNMEALineEdit);
2164 }
2165
2166 // Outages
2167 // -------
2168 if (sender() == 0 || sender() == _obsRateComboBox) {
2169 enable = !_obsRateComboBox->currentText().isEmpty();
2170 enableWidget(enable, _adviseFailSpinBox);
2171 enableWidget(enable, _adviseRecoSpinBox);
2172 enableWidget(enable, _adviseScriptLineEdit);
2173 }
2174
2175 // Miscellaneous
2176 // -------------
2177 if (sender() == 0 || sender() == _miscMountLineEdit) {
2178 enable = !_miscMountLineEdit->text().isEmpty();
2179 enableWidget(enable, _perfIntrComboBox);
2180 enableWidget(enable, _scanRTCMCheckBox);
2181 }
2182
2183 // Enable/disable Broadcast Ephemerides
2184 // ------------------------------------
2185 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2186 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2187 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2188 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2189 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2190 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2191 _uploadEphPortLineEdit->setEnabled(true);
2192 _uploadEphMountpointLineEdit->setEnabled(true);
2193 _uploadEphPasswordLineEdit->setEnabled(true);
2194 _uploadEphSampleSpinBox->setEnabled(true);
2195 }
2196 else {
2197 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2198 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2199 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2200 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2201 _uploadEphPortLineEdit->setEnabled(false);
2202 _uploadEphMountpointLineEdit->setEnabled(false);
2203 _uploadEphPasswordLineEdit->setEnabled(false);
2204 _uploadEphSampleSpinBox->setEnabled(false);
2205 }
2206 }
2207
2208 // Combine Corrections
2209 // -------------------
2210 if (sender() == 0 || sender() == _cmbTable) {
2211 int iRow = _cmbTable->rowCount();
2212 if (iRow > 0) {
2213 enableWidget(true, _cmbMethodComboBox);
2214 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2215 _cmbMaxresLineEdit->setEnabled(true);
2216 _cmbSamplSpinBox->setEnabled(true);
2217 }
2218 else {
2219 enableWidget(false, _cmbMethodComboBox);
2220 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2221 _cmbMaxresLineEdit->setEnabled(false);
2222 _cmbSamplSpinBox->setEnabled(false);
2223 }
2224 }
2225
2226 // Upload(clk)
2227 // -----------
2228 int iRow = _uploadTable->rowCount();
2229 if (iRow > 0) {
2230 enableWidget(true, _uploadIntrComboBox);
2231 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2232 enableWidget(true, _uploadSamplClkRnxSpinBox);
2233 enableWidget(true, _uploadSamplSp3SpinBox);
2234 }
2235 else {
2236 enableWidget(false, _uploadIntrComboBox);
2237 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2238 enableWidget(false, _uploadSamplClkRnxSpinBox);
2239 enableWidget(false, _uploadSamplSp3SpinBox);
2240 }
2241
2242 // PPP Client
2243 // ----------
2244 if (sender() == 0
2245 || sender() == _pppMountLineEdit
2246 || sender() == _pppCorrMountLineEdit
2247 || sender() == _pppRefCrdXLineEdit
2248 || sender() == _pppRefCrdYLineEdit
2249 || sender() == _pppRefCrdZLineEdit
2250 || sender() == _pppRefdNLineEdit
2251 || sender() == _pppRefdELineEdit
2252 || sender() == _pppRefdULineEdit
2253 || sender() == _pppSync
2254 || sender() == _pppSPPComboBox
2255 || sender() == _pppQuickStartLineEdit
2256 || sender() == _pppEstTropoCheckBox
2257 || sender() == _pppUsePhaseCheckBox
2258 || sender() == _pppAntexFileChooser ) {
2259
2260 enable = !_pppSPPComboBox->currentText().isEmpty();
2261 if (enable) {
2262 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2263 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "Realtime-SPP") ||
2264 (_pppSPPComboBox->currentText() == "Post-Processing");
2265 }
2266
2267 enableWidget(enable, _pppNMEALineEdit);
2268 enableWidget(enable, _pppNMEAPortLineEdit);
2269 enableWidget(enable, _pppRefCrdXLineEdit);
2270 enableWidget(enable, _pppRefCrdYLineEdit);
2271 enableWidget(enable, _pppRefCrdZLineEdit);
2272 enableWidget(enable, _pppRefdNLineEdit);
2273 enableWidget(enable, _pppRefdELineEdit);
2274 enableWidget(enable, _pppRefdULineEdit);
2275 enableWidget(enable, _pppUsePhaseCheckBox);
2276 enableWidget(enable, _pppPlotCoordinates);
2277 enableWidget(enable, _pppEstTropoCheckBox);
2278// enableWidget(enable, _pppGLONASSCheckBox);
2279 enableWidget(enable, _pppGalileoCheckBox);
2280// enableWidget(enable, _pppAntexFileChooser);
2281 enableWidget(enable, _pppSigCLineEdit);
2282 enableWidget(enable, _pppSigCrd0);
2283 enableWidget(enable, _pppSigCrdP);
2284
2285 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2286 !_pppRefCrdYLineEdit->text().isEmpty() &&
2287 !_pppRefCrdZLineEdit->text().isEmpty();
2288
2289 enableWidget(enable2, _pppAverageLineEdit);
2290 enableWidget(enable2, _pppQuickStartLineEdit);
2291
2292 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2293 enableWidget(enable3, _pppMaxSolGapLineEdit);
2294
2295 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2296 enableWidget(enable4, _pppAntennaLineEdit);
2297
2298 bool enable5 = enable && _pppEstTropoCheckBox->isChecked();
2299 enableWidget(enable5, _pppSigTrp0);
2300 enableWidget(enable5, _pppSigTrpP);
2301
2302 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2303 enableWidget(enable6, _pppSigPLineEdit);
2304
2305 bool enable7 = enable && _pppSPPComboBox->currentText() == "Realtime-PPP";
2306 enableWidget(enable7, _pppSync);
2307
2308 bool enable8 = _pppSPPComboBox->currentText() == "Realtime-PPP";
2309 enableWidget(enable8, _pppCorrMountLineEdit);
2310
2311 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2312 enableWidget(enable9, _postObsFileChooser);
2313 enableWidget(enable9, _postNavFileChooser);
2314 enableWidget(enable9, _postCorrFileChooser);
2315 enableWidget(enable9, _postOutLineEdit);
2316
2317 bool enable10 = !_pppSPPComboBox->currentText().isEmpty() && !enable9;
2318 enableWidget(enable10, _pppMountLineEdit);
2319 }
2320
2321 if (sender() == 0 || sender() == _reqcActionComboBox) {
2322 enable = !_reqcActionComboBox->currentText().isEmpty();
2323 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2324 enableWidget(enable && enable10, _reqcEditOptionButton);
2325 enableWidget(enable, _reqcObsFileChooser);
2326 enableWidget(enable, _reqcNavFileChooser);
2327 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2328 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2329 enableWidget(enable && !enable10, _reqcOutLogLineEdit);
2330 }
2331
2332 enableStartStop();
2333}
2334
2335//
2336////////////////////////////////////////////////////////////////////////////
2337void bncWindow::slotAddCmbRow() {
2338 int iRow = _cmbTable->rowCount();
2339 _cmbTable->insertRow(iRow);
2340 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2341 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2342 }
2343}
2344
2345//
2346////////////////////////////////////////////////////////////////////////////
2347void bncWindow::slotDelCmbRow() {
2348 int nRows = _cmbTable->rowCount();
2349 bool flg[nRows];
2350 for (int iRow = 0; iRow < nRows; iRow++) {
2351 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2352 flg[iRow] = true;
2353 }
2354 else {
2355 flg[iRow] = false;
2356 }
2357 }
2358 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2359 if (flg[iRow]) {
2360 _cmbTable->removeRow(iRow);
2361 }
2362 }
2363 nRows = _cmbTable->rowCount();
2364 if (nRows < 1) {
2365 enableWidget(false, _cmbMethodComboBox);
2366 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2367 _cmbMaxresLineEdit->setEnabled(false);
2368 _cmbSamplSpinBox->setEnabled(false);
2369 }
2370}
2371
2372//
2373////////////////////////////////////////////////////////////////////////////
2374void bncWindow::populateCmbTable() {
2375
2376 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2377 _cmbTable->removeRow(iRow);
2378 }
2379
2380 bncSettings settings;
2381
2382 int iRow = -1;
2383 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2384 while (it.hasNext()) {
2385 QStringList hlp = it.next().split(" ");
2386 if (hlp.size() > 2) {
2387 ++iRow;
2388 _cmbTable->insertRow(iRow);
2389 }
2390 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2391 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2392 }
2393 }
2394}
2395
2396//
2397////////////////////////////////////////////////////////////////////////////
2398void bncWindow::slotAddUploadRow() {
2399 int iRow = _uploadTable->rowCount();
2400 _uploadTable->insertRow(iRow);
2401 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2402 if (iCol == 3) {
2403 QLineEdit* passwd = new QLineEdit();
2404 passwd->setFrame(false);
2405 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2406 _uploadTable->setCellWidget(iRow, iCol, passwd);
2407 }
2408 else if (iCol == 4) {
2409 QComboBox* system = new QComboBox();
2410 system->setEditable(false);
2411 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2412 system->setFrame(false);
2413 _uploadTable->setCellWidget(iRow, iCol, system);
2414 }
2415 else if (iCol == 5) {
2416 QCheckBox* com = new QCheckBox();
2417 _uploadTable->setCellWidget(iRow, iCol, com);
2418 }
2419 else if (iCol == 11) {
2420 bncTableItem* bncIt = new bncTableItem();
2421 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2422 _uploadTable->setItem(iRow, iCol, bncIt);
2423 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2424 }
2425 else {
2426 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2427 }
2428 }
2429}
2430
2431//
2432////////////////////////////////////////////////////////////////////////////
2433void bncWindow::slotDelUploadRow() {
2434 ((bncApp*)qApp)->_uploadTableItems.clear();
2435 int nRows = _uploadTable->rowCount();
2436 bool flg[nRows];
2437 for (int iRow = 0; iRow < nRows; iRow++) {
2438 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2439 flg[iRow] = true;
2440 }
2441 else {
2442 flg[iRow] = false;
2443 }
2444 }
2445 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2446 if (flg[iRow]) {
2447 _uploadTable->removeRow(iRow);
2448 }
2449 }
2450 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2451 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2452 (bncTableItem*) _uploadTable->item(iRow, 11);
2453 }
2454 nRows = _uploadTable->rowCount();
2455 if (nRows < 1) {
2456 enableWidget(false, _uploadIntrComboBox);
2457 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2458 enableWidget(false, _uploadSamplSp3SpinBox);
2459 enableWidget(false, _uploadSamplClkRnxSpinBox);
2460 }
2461}
2462
2463//
2464////////////////////////////////////////////////////////////////////////////
2465void bncWindow::populateUploadTable() {
2466 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2467 _uploadTable->removeRow(iRow);
2468 }
2469
2470 bncSettings settings;
2471
2472 int iRow = -1;
2473 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2474 while (it.hasNext()) {
2475 QStringList hlp = it.next().split(",");
2476 if (hlp.size() > 6) {
2477 ++iRow;
2478 _uploadTable->insertRow(iRow);
2479 }
2480 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2481 if (iCol == 3) {
2482 QLineEdit* passwd = new QLineEdit();
2483 passwd->setFrame(false);
2484 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2485 passwd->setText(hlp[iCol]);
2486 _uploadTable->setCellWidget(iRow, iCol, passwd);
2487 }
2488 else if (iCol == 4) {
2489 QComboBox* system = new QComboBox();
2490 system->setEditable(false);
2491 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2492 system->setFrame(false);
2493 system->setCurrentIndex(system->findText(hlp[iCol]));
2494 _uploadTable->setCellWidget(iRow, iCol, system);
2495 }
2496 else if (iCol == 5) {
2497 QCheckBox* com = new QCheckBox();
2498 if (hlp[iCol].toInt() == Qt::Checked) {
2499 com->setCheckState(Qt::Checked);
2500 }
2501 _uploadTable->setCellWidget(iRow, iCol, com);
2502 }
2503 else if (iCol == 11) {
2504 bncTableItem* bncIt = new bncTableItem();
2505 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2506 _uploadTable->setItem(iRow, iCol, bncIt);
2507 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2508 }
2509 else {
2510 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2511 }
2512 }
2513 }
2514}
2515
2516//
2517////////////////////////////////////////////////////////////////////////////
2518void bncWindow::slotSetUploadTrafo() {
2519 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2520 dlg->exec();
2521 delete dlg;
2522}
2523
2524// Start Post-Processing PPP
2525////////////////////////////////////////////////////////////////////////////
2526void bncWindow::startPostProcessingPPP() {
2527#ifdef USE_POSTPROCESSING
2528 _runningPostProcessingPPP = true;
2529 _actStart->setText("0 Epochs");
2530 enableStartStop();
2531
2532 t_postProcessing* postProcessing = new t_postProcessing(this);
2533 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessingPPP()));
2534 connect(postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2535
2536 postProcessing->start();
2537#else
2538 QMessageBox::information(this, "Information",
2539 "Post-Processing Not Permitted");
2540#endif
2541}
2542
2543// Post-Processing PPP Finished
2544////////////////////////////////////////////////////////////////////////////
2545void bncWindow::slotFinishedPostProcessingPPP() {
2546 _runningPostProcessingPPP = false;
2547 QMessageBox::information(this, "Information",
2548 "Post-Processing Thread Finished");
2549 _actStart->setText("Start");
2550 enableStartStop();
2551}
2552
2553// Progress Bar Change
2554////////////////////////////////////////////////////////////////////////////
2555void bncWindow::slotPostProgress(int nEpo) {
2556 if (_actStart) {
2557 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2558 }
2559}
2560
2561// Start Post-Processing Reqc
2562////////////////////////////////////////////////////////////////////////////
2563void bncWindow::startPostProcessingReqc() {
2564#ifdef USE_POSTPROCESSING
2565 _runningPostProcessingReqc = true;
2566 enableStartStop();
2567 if (_reqcActionComboBox->currentText() == "Analyze") {
2568 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2569 connect(reqcAnalyze, SIGNAL(finished()),
2570 this, SLOT(slotFinishedPostProcessingReqc()));
2571 reqcAnalyze->start();
2572 }
2573 else {
2574 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2575 connect(reqcEdit, SIGNAL(finished()),
2576 this, SLOT(slotFinishedPostProcessingReqc()));
2577 reqcEdit->start();
2578 }
2579#else
2580 QMessageBox::information(this, "Information",
2581 "Post-Processing Not Permitted");
2582#endif
2583}
2584
2585// Post-Processing Reqc Finished
2586////////////////////////////////////////////////////////////////////////////
2587void bncWindow::slotFinishedPostProcessingReqc() {
2588 _runningPostProcessingReqc = false;
2589 if (_reqcActionComboBox->currentText() != "Analyze") {
2590 QMessageBox::information(this, "Information",
2591 "RINEX Processing Thread Finished");
2592 }
2593 enableStartStop();
2594}
2595
2596// Edit teqc-like editing options
2597////////////////////////////////////////////////////////////////////////////
2598void bncWindow::slotReqcEditOption() {
2599 reqcDlg* dlg = new reqcDlg(this);
2600 dlg->move(this->pos().x()+50, this->pos().y()+50);
2601 dlg->exec();
2602 delete dlg;
2603}
2604
2605// Enable/Disable Start and Stop Buttons
2606////////////////////////////////////////////////////////////////////////////
2607void bncWindow::enableStartStop() {
2608
2609 if ( _pppSPPComboBox && _pppSPPComboBox->currentText() == "Post-Processing" ) {
2610 if (_runningPostProcessingPPP) {
2611 _actStart->setEnabled(false);
2612 }
2613 else {
2614 _actStart->setEnabled(true);
2615 }
2616 _actStop->setEnabled(false);
2617 }
2618 else if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2619 if (_runningPostProcessingReqc) {
2620 _actStart->setEnabled(false);
2621 }
2622 else {
2623 _actStart->setEnabled(true);
2624 }
2625 _actStop->setEnabled(false);
2626 }
2627 else {
2628 if (_runningRealTime) {
2629 _actStart->setEnabled(false);
2630 _actStop->setEnabled(true);
2631 }
2632 else {
2633 _actStop->setEnabled(false);
2634 if (_mountPointsTable->rowCount() == 0) {
2635 _actStart->setEnabled(false);
2636 }
2637 else {
2638 _actStart->setEnabled(true);
2639 }
2640 }
2641 }
2642}
Note: See TracBrowser for help on using the repository browser.