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

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