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

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