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

Last change on this file since 3777 was 3777, checked in by weber, 12 years ago

Layout modified

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