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

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

Online help completed

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