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

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

Design modified

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