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

Last change on this file since 3810 was 3810, checked in by weber, 13 years ago

Online help completed

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