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

Last change on this file since 3153 was 3153, checked in by mervart, 13 years ago
File size: 113.9 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
60using namespace std;
61
62// Constructor
63////////////////////////////////////////////////////////////////////////////
64bncWindow::bncWindow() {
65
66 _caster = 0;
67
68 _bncFigure = new bncFigure(this);
69 _bncFigureLate = new bncFigureLate(this);
70 _bncFigurePPP = new bncFigurePPP(this);
71
72 int ww = QFontMetrics(this->font()).width('w');
73
74 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
75
76 setMinimumSize(85*ww, 65*ww);
77
78 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
79
80 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
81 this, SLOT(slotWindowMessage(QByteArray,bool)));
82
83 // Create Actions
84 // --------------
85 _actHelp = new QAction(tr("&Help Contents"),this);
86 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
87
88 _actAbout = new QAction(tr("&About BNC"),this);
89 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
90
91 _actFlowchart = new QAction(tr("&Flow Chart"),this);
92 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
93
94 _actFontSel = new QAction(tr("Select &Font"),this);
95 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
96
97 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
98 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
99
100 _actQuit = new QAction(tr("&Quit"),this);
101 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
102
103 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
104 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
105
106 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
107 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
108 _actDeleteMountPoints->setEnabled(false);
109
110 _actGetData = new QAction(tr("Sta&rt"),this);
111 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
112
113 _actStop = new QAction(tr("Sto&p"),this);
114 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
115 _actStop->setEnabled(false);
116
117 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
118 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
119
120 CreateMenu();
121 AddToolbar();
122
123 bncSettings settings;
124
125 // Proxy Options
126 // -------------
127 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
128 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
129
130 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
131 this, SLOT(slotBncTextChanged()));
132
133 // General Options
134 // ---------------
135 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
136 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
137 _rnxAppendCheckBox = new QCheckBox();
138 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
139 settings.value("rnxAppend").toInt()));
140 _onTheFlyComboBox = new QComboBox();
141 _onTheFlyComboBox->setEditable(false);
142 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
143 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
144 if (ii != -1) {
145 _onTheFlyComboBox->setCurrentIndex(ii);
146 }
147 _autoStartCheckBox = new QCheckBox();
148 _autoStartCheckBox->setCheckState(Qt::CheckState(
149 settings.value("autoStart").toInt()));
150
151 // RINEX Observations Options
152 // --------------------------
153 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
154 _rnxIntrComboBox = new QComboBox();
155 _rnxIntrComboBox->setEditable(false);
156 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
157 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
158 if (ii != -1) {
159 _rnxIntrComboBox->setCurrentIndex(ii);
160 }
161 _rnxSamplSpinBox = new QSpinBox();
162 _rnxSamplSpinBox->setMinimum(0);
163 _rnxSamplSpinBox->setMaximum(60);
164 _rnxSamplSpinBox->setSingleStep(5);
165 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
166 _rnxSamplSpinBox->setSuffix(" sec");
167 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
168 _rnxSkelLineEdit->setMaximumWidth(5*ww);
169 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
170 _rnxV3CheckBox = new QCheckBox();
171 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
172
173 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
174 this, SLOT(slotBncTextChanged()));
175
176 // RINEX Ephemeris Options
177 // -----------------------
178 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
179 _ephIntrComboBox = new QComboBox();
180 _ephIntrComboBox->setEditable(false);
181 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
182 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
183 if (jj != -1) {
184 _ephIntrComboBox->setCurrentIndex(jj);
185 }
186 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
187 _ephV3CheckBox = new QCheckBox();
188 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
189
190 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
191 this, SLOT(slotBncTextChanged()));
192
193 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
194 this, SLOT(slotBncTextChanged()));
195
196 // Broadcast Corrections Options
197 // -----------------------------
198 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
199 _corrIntrComboBox = new QComboBox();
200 _corrIntrComboBox->setEditable(false);
201 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
202 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
203 if (mm != -1) {
204 _corrIntrComboBox->setCurrentIndex(mm);
205 }
206 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
207 _corrTimeSpinBox = new QSpinBox();
208 _corrTimeSpinBox->setMinimum(0);
209 _corrTimeSpinBox->setMaximum(60);
210 _corrTimeSpinBox->setSingleStep(1);
211 _corrTimeSpinBox->setSuffix(" sec");
212 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
213
214 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
215 this, SLOT(slotBncTextChanged()));
216
217 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
218 this, SLOT(slotBncTextChanged()));
219
220 // Feed Engine Options
221 // -------------------
222 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
223 _waitTimeSpinBox = new QSpinBox();
224 _waitTimeSpinBox->setMinimum(1);
225 _waitTimeSpinBox->setMaximum(30);
226 _waitTimeSpinBox->setSingleStep(1);
227 _waitTimeSpinBox->setSuffix(" sec");
228 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
229 _binSamplSpinBox = new QSpinBox();
230 _binSamplSpinBox->setMinimum(0);
231 _binSamplSpinBox->setMaximum(60);
232 _binSamplSpinBox->setSingleStep(5);
233 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
234 _binSamplSpinBox->setSuffix(" sec");
235 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
236 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
237
238 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
239 this, SLOT(slotBncTextChanged()));
240
241 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
242 this, SLOT(slotBncTextChanged()));
243
244 // Serial Output Options
245 // ---------------------
246 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
247 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
248 _serialBaudRateComboBox = new QComboBox();
249 _serialBaudRateComboBox->addItems(QString("110,300,600,"
250 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
251 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
252 if (kk != -1) {
253 _serialBaudRateComboBox->setCurrentIndex(kk);
254 }
255 _serialFlowControlComboBox = new QComboBox();
256 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
257 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
258 if (kk != -1) {
259 _serialFlowControlComboBox->setCurrentIndex(kk);
260 }
261 _serialDataBitsComboBox = new QComboBox();
262 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
263 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
264 if (kk != -1) {
265 _serialDataBitsComboBox->setCurrentIndex(kk);
266 }
267 _serialParityComboBox = new QComboBox();
268 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
269 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
270 if (kk != -1) {
271 _serialParityComboBox->setCurrentIndex(kk);
272 }
273 _serialStopBitsComboBox = new QComboBox();
274 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
275 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
276 if (kk != -1) {
277 _serialStopBitsComboBox->setCurrentIndex(kk);
278 }
279 _serialAutoNMEAComboBox = new QComboBox();
280 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
281 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
282 if (kk != -1) {
283 _serialAutoNMEAComboBox->setCurrentIndex(kk);
284 }
285 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
286 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
287
288 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
289 this, SLOT(slotBncTextChanged()));
290
291 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
292 this, SLOT(slotBncTextChanged()));
293
294 // Outages Options
295 // ---------------
296 _obsRateComboBox = new QComboBox();
297 _obsRateComboBox->setEditable(false);
298 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
299 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
300 if (kk != -1) {
301 _obsRateComboBox->setCurrentIndex(kk);
302 }
303 _adviseFailSpinBox = new QSpinBox();
304 _adviseFailSpinBox->setMinimum(0);
305 _adviseFailSpinBox->setMaximum(60);
306 _adviseFailSpinBox->setSingleStep(1);
307 _adviseFailSpinBox->setSuffix(" min");
308 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
309 _adviseRecoSpinBox = new QSpinBox();
310 _adviseRecoSpinBox->setMinimum(0);
311 _adviseRecoSpinBox->setMaximum(60);
312 _adviseRecoSpinBox->setSingleStep(1);
313 _adviseRecoSpinBox->setSuffix(" min");
314 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
315 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
316
317 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
318 this, SLOT(slotBncTextChanged()));
319
320 // Miscellaneous Options
321 // ---------------------
322 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
323 _perfIntrComboBox = new QComboBox();
324 _perfIntrComboBox->setEditable(false);
325 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
326 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
327 if (ll != -1) {
328 _perfIntrComboBox->setCurrentIndex(ll);
329 }
330 _scanRTCMCheckBox = new QCheckBox();
331 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
332 settings.value("scanRTCM").toInt()));
333
334 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
335 this, SLOT(slotBncTextChanged()));
336
337 // PPP Options
338 // -----------
339 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
340 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
341 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
342 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
343 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
344 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
345 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
346 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
347 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
348 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
349 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
350 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
351 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
352 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
353 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
354 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
355 _pppSync = new QLineEdit(settings.value("pppSync").toString());
356 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
357 _pppAntexLineEdit = new QLineEdit(settings.value("pppAntex").toString());
358
359
360 _pppSPPComboBox = new QComboBox();
361 _pppSPPComboBox->setEditable(false);
362 _pppSPPComboBox->addItems(QString("PPP,SPP").split(","));
363 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
364 if (ik != -1) {
365 _pppSPPComboBox->setCurrentIndex(ik);
366 }
367 _pppUsePhaseCheckBox = new QCheckBox();
368 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
369 settings.value("pppUsePhase").toInt()));
370 _pppEstTropoCheckBox = new QCheckBox();
371 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
372 settings.value("pppEstTropo").toInt()));
373 _pppGLONASSCheckBox = new QCheckBox();
374 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
375 settings.value("pppGLONASS").toInt()));
376 _pppGalileoCheckBox = new QCheckBox();
377 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
378 settings.value("pppGalileo").toInt()));
379
380 _pppPlotCoordinates = new QCheckBox();
381 _pppPlotCoordinates->setCheckState(Qt::CheckState(
382 settings.value("pppPlotCoordinates").toInt()));
383
384 _pppApplySatAntCheckBox = new QCheckBox();
385 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
386 settings.value("pppApplySatAnt").toInt()));
387
388 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
389 this, SLOT(slotBncTextChanged()));
390
391 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
392 this, SLOT(slotBncTextChanged()));
393
394 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
395 this, SLOT(slotBncTextChanged()));
396
397 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
398 this, SLOT(slotBncTextChanged()));
399 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
400 this, SLOT(slotBncTextChanged()));
401 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
402 this, SLOT(slotBncTextChanged()));
403
404 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
405 this, SLOT(slotBncTextChanged()));
406
407 connect(_pppSync, SIGNAL(textChanged(const QString &)),
408 this, SLOT(slotBncTextChanged()));
409
410 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
411 this, SLOT(slotBncTextChanged()));
412
413 connect(_pppAntexLineEdit, SIGNAL(textChanged(const QString &)),
414 this, SLOT(slotBncTextChanged()));
415
416 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
417 this, SLOT(slotBncTextChanged()));
418
419 // Streams
420 // -------
421 _mountPointsTable = new QTableWidget(0,8);
422
423 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
424 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
425 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
426 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
427 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
428 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
429 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
430 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
431 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
432 _mountPointsTable->setHorizontalHeaderLabels(labels);
433 _mountPointsTable->setGridStyle(Qt::NoPen);
434 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
435 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
436 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
437 _mountPointsTable->hideColumn(0);
438 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
439 SLOT(slotSelectionChanged()));
440 populateMountPointsTable();
441
442 _log = new QTextBrowser();
443 _log->setReadOnly(true);
444
445 // Combination
446 // -----------
447 _cmbTable = new QTableWidget(0,3);
448 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
449 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
450 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
451 _cmbTable->setMaximumWidth(30*ww);
452 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
453 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
454 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
455 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
456 _cmbTable->horizontalHeader()->setStretchLastSection(true);
457 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
458
459 QPushButton* addCmbRowButton = new QPushButton("Add Row");
460 QPushButton* delCmbRowButton = new QPushButton("Delete");
461 _cmbOutHostLineEdit = new QLineEdit(settings.value("cmbOutHost").toString());
462 _cmbOutPortLineEdit = new QLineEdit(settings.value("cmbOutPort").toString());
463 _cmbMountpointLineEdit = new QLineEdit(settings.value("cmbMountpoint").toString());
464 _cmbPasswordLineEdit = new QLineEdit(settings.value("cmbPassword").toString());
465 _cmbOutPathLineEdit = new QLineEdit(settings.value("cmbOutPath").toString());
466 _cmbSP3PathLineEdit = new QLineEdit(settings.value("cmbSP3Path").toString());
467
468 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
469 SLOT(slotBncTextChanged()));
470 connect(_cmbMountpointLineEdit, SIGNAL(textChanged(const QString &)),
471 this, SLOT(slotBncTextChanged()));
472
473 // RTNet Results
474 // -------------
475 _rtnetTable = new QTableWidget(0,7);
476 _rtnetTable->setHorizontalHeaderLabels(QString("Host, Port, Mountpoint, Password, System, CoM, File").split(","));
477 _rtnetTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
478 _rtnetTable->setSelectionBehavior(QAbstractItemView::SelectRows);
479 _rtnetTable->setMaximumWidth(70*ww);
480 _rtnetTable->horizontalHeader()->resizeSection(0,8*ww);
481 _rtnetTable->horizontalHeader()->resizeSection(1,8*ww);
482 _rtnetTable->horizontalHeader()->resizeSection(2,8*ww);
483 _rtnetTable->horizontalHeader()->resizeSection(3,8*ww);
484 _rtnetTable->horizontalHeader()->resizeSection(4,8*ww);
485 _rtnetTable->horizontalHeader()->resizeSection(5,8*ww);
486 _rtnetTable->horizontalHeader()->resizeSection(6,8*ww);
487 _rtnetTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
488 _rtnetTable->horizontalHeader()->setStretchLastSection(true);
489 _rtnetTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
490
491 QPushButton* addRtnetRowButton = new QPushButton("Add Row");
492 QPushButton* delRtnetRowButton = new QPushButton("Delete");
493
494 connect(_rtnetTable, SIGNAL(itemSelectionChanged()),
495 SLOT(slotBncTextChanged()));
496
497 // WhatsThis
498 // ---------
499 _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>"));
500 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
501 _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>"));
502 _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."));
503 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in binary format on your local host through an IP port. Specify a port number here to activate this function."));
504 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in binary format on your local host through an IP port. Specify a port number here to activate this function."));
505 _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."));
506 _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."));
507 _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>"));
508 _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."));
509 _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."));
510 _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."));
511 _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>"));
512 _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>"));
513 _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>"));
514 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
515 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
516
517 _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>"));
518 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
519 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
520 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
521 _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>"));
522 _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>"));
523 _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>"));
524 _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>"));
525 _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>"));
526 _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."));
527 _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>"));
528 _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>"));
529 _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 'RTIGS'.</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>"));
530 _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."));
531 _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)."));
532 _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."));
533 _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."));
534 _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."));
535 _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>"));
536 _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>"));
537 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
538 _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>"));
539 _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>"));
540 _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>"));
541 _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>"));
542 _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>"));
543 _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>"));
544 _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>"));
545 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
546 _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>"));
547 _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>"));
548 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock corrections stream by its mountpoint from the 'Streams' list compiled below. Example: 'CLK10'</p>"));
549 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
550 _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>"));
551 _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>"));
552 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
553 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for a combined processing of both, GPS and Galileo observations in PPP mode.</p>"));
554 _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."));
555 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
556 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
557 _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>"));
558 _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>"));
559 _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>"));
560 _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>"));
561 _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>"));
562 _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."));
563 _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>"));
564 _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>"));
565 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 1e-6 (default) would mean that the tropospheric effect may vary for 3600 * 1e-6 = 0.0036 meters per hour.</p>"));
566 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
567 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
568 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
569 _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."));
570 _pppSync->setWhatsThis(tr(
571 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
572 "immediately after its arrival using satellite clock corrections available at "
573 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
574 "are buffered and the processing of each epoch is postponed till the satellite clock "
575 "corrections not older than 'Sync Corr' seconds are available.<p>"));
576 _pppAntexLineEdit->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>"));
577 _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>"));
578 _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."));
579 _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 from various providers. Hit the 'Add Row' button, Double click on the 'Mountpoint' field to enter a Broadcast Ephemeris corrections mountpoint from the 'Streams' section below and hit Enter. Then double click on the 'AC Name' field to enter your choice of an abbreviation for the Analysis Center (AC) providing the stream. Finally, double click on the 'Weight' field to enter the weight to be applied for this stream in the combination.</p><p>Note that an appropriate 'Wait for full epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</p><p>Note further that the sequence of rows in the 'Combination Table' is of importance because the orbit information in the final combination stream is just copied from the stream listed in the first row. Hence the first line in the 'Combination Table' defines a kind of 'Master AC'. The update rate of the combination product follows the 'Master AC's update rate.</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>"));
580 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
581 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
582 _cmbOutHostLineEdit->setWhatsThis(tr("Specify the domain name or IP number of an Ntrip Broadcaster for uploading the combination stream."));
583 _cmbOutPortLineEdit->setWhatsThis(tr("Enter the listening IP port of the specified Ntrip Broadcaster for uploading the combination stream."));
584 _cmbMountpointLineEdit->setWhatsThis(tr("<p>Enter a mountpoint for the combination stream. If 'Host', 'Port' and 'Password' are set, the combination stream will be uploaded to the specified Ntrip Broadcaster.</p><p>Note that the mountpoint defined here can be introduce as 'Obs Mountpoint' under the 'PPP (1)' tab to carry out a Precise Point Positioning through directly using the combination stream without prior upload to the Ntrip Broadcaster."));
585 _cmbPasswordLineEdit->setWhatsThis(tr("Enter the password for uploading the combination stream to the specified Ntrip Broadcaster."));
586 _cmbOutPathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving the combined Broadcast Ephemeris corrections in a plain ASCII format on disk.</p><p>The length of the Broadcast Ephemeris corrections files is defined through option 'Interval' under the 'Broadcast Corrections' tab.</p>"));
587 _cmbSP3PathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving the combination of Broadcast Ephemeris and Broadcast Ephemeris corrections in SP3 format on disk. The SP3 file output already works with only one corrections stream specified for combination.</p><p>Note that this normally requires to also specify the full path to an 'ANTEX File' under the 'PPP (2)' tab.</p>"));
588
589 // Canvas with Editable Fields
590 // ---------------------------
591 _canvas = new QWidget;
592 setCentralWidget(_canvas);
593
594 _aogroup = new QTabWidget();
595 QWidget* pgroup = new QWidget();
596 QWidget* ggroup = new QWidget();
597 QWidget* sgroup = new QWidget();
598 QWidget* egroup = new QWidget();
599 QWidget* agroup = new QWidget();
600 QWidget* cgroup = new QWidget();
601 QWidget* ogroup = new QWidget();
602 QWidget* rgroup = new QWidget();
603 QWidget* sergroup = new QWidget();
604 QWidget* pppgroup = new QWidget();
605 QWidget* ppp2group = new QWidget();
606 QWidget* cmbgroup = new QWidget();
607 QWidget* rtnetgroup = new QWidget();
608 _aogroup->addTab(pgroup,tr("Proxy"));
609 _aogroup->addTab(ggroup,tr("General"));
610 _aogroup->addTab(ogroup,tr("RINEX Observations"));
611 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
612 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
613 _aogroup->addTab(sgroup,tr("Feed Engine"));
614 _aogroup->addTab(sergroup,tr("Serial Output"));
615 _aogroup->addTab(agroup,tr("Outages"));
616 _aogroup->addTab(rgroup,tr("Miscellaneous"));
617 _aogroup->addTab(pppgroup,tr("PPP (1)"));
618 _aogroup->addTab(ppp2group,tr("PPP (2)"));
619#ifdef USE_COMBINATION
620 _aogroup->addTab(cmbgroup,tr("Combination"));
621#endif
622 _aogroup->addTab(rtnetgroup,tr("RTNet"));
623
624 // Log Tab
625 // -------
626 _loggroup = new QTabWidget();
627 _loggroup->addTab(_log,tr("Log"));
628 _loggroup->addTab(_bncFigure,tr("Throughput"));
629 _loggroup->addTab(_bncFigureLate,tr("Latency"));
630 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
631
632 // Proxy Tab
633 // ---------
634 QGridLayout* pLayout = new QGridLayout;
635 pLayout->setColumnMinimumWidth(0,13*ww);
636 _proxyPortLineEdit->setMaximumWidth(9*ww);
637
638 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
639 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
640 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
641 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
642 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
643 pLayout->addWidget(new QLabel(" "),3,0);
644 pLayout->addWidget(new QLabel(" "),4,0);
645 pLayout->addWidget(new QLabel(" "),5,0);
646 pgroup->setLayout(pLayout);
647
648 // General Tab
649 // -----------
650 QGridLayout* gLayout = new QGridLayout;
651 gLayout->setColumnMinimumWidth(0,14*ww);
652 _onTheFlyComboBox->setMaximumWidth(9*ww);
653
654 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
655 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
656 gLayout->addWidget(new QLabel("Append files"), 1, 0);
657 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
658 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
659 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
660 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
661 gLayout->addWidget(_autoStartCheckBox, 3, 1);
662 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
663 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
664 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
665 ggroup->setLayout(gLayout);
666
667 // RINEX Observations
668 // ------------------
669 QGridLayout* oLayout = new QGridLayout;
670 oLayout->setColumnMinimumWidth(0,14*ww);
671 _rnxIntrComboBox->setMaximumWidth(9*ww);
672 _rnxSamplSpinBox->setMaximumWidth(9*ww);
673
674 oLayout->addWidget(new QLabel("Directory"), 0, 0);
675 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
676 oLayout->addWidget(new QLabel("Interval"), 1, 0);
677 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
678 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
679 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
680 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
681 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
682 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
683 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
684 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
685 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
686 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
687 ogroup->setLayout(oLayout);
688
689 // RINEX Ephemeris
690 // ---------------
691 QGridLayout* eLayout = new QGridLayout;
692 eLayout->setColumnMinimumWidth(0,14*ww);
693 _ephIntrComboBox->setMaximumWidth(9*ww);
694 _outEphPortLineEdit->setMaximumWidth(9*ww);
695
696 eLayout->addWidget(new QLabel("Directory"), 0, 0);
697 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
698 eLayout->addWidget(new QLabel("Interval"), 1, 0);
699 eLayout->addWidget(_ephIntrComboBox, 1, 1);
700 eLayout->addWidget(new QLabel("Port"), 2, 0);
701 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
702 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
703 eLayout->addWidget(_ephV3CheckBox, 3, 1);
704 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
705 eLayout->addWidget(new QLabel(" "),5,0);
706 egroup->setLayout(eLayout);
707
708
709 // Broadcast Corrections
710 // ---------------------
711 QGridLayout* cLayout = new QGridLayout;
712 cLayout->setColumnMinimumWidth(0,14*ww);
713 _corrIntrComboBox->setMaximumWidth(9*ww);
714 _corrPortLineEdit->setMaximumWidth(9*ww);
715 _corrTimeSpinBox->setMaximumWidth(9*ww);
716
717 cLayout->addWidget(new QLabel("Directory, ASCII"), 0, 0);
718 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
719 cLayout->addWidget(new QLabel("Interval"), 1, 0);
720 cLayout->addWidget(_corrIntrComboBox, 1, 1);
721 cLayout->addWidget(new QLabel("Port"), 2, 0);
722 cLayout->addWidget(_corrPortLineEdit, 2, 1);
723 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
724 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
725 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
726 cLayout->addWidget(new QLabel(" "),4,0);
727 cLayout->addWidget(new QLabel(" "),5,0);
728 cgroup->setLayout(cLayout);
729
730 // Feed Engine
731 // -----------
732 QGridLayout* sLayout = new QGridLayout;
733 sLayout->setColumnMinimumWidth(0,14*ww);
734 _outPortLineEdit->setMaximumWidth(9*ww);
735 _waitTimeSpinBox->setMaximumWidth(9*ww);
736 _binSamplSpinBox->setMaximumWidth(9*ww);
737 _outUPortLineEdit->setMaximumWidth(9*ww);
738
739 sLayout->addWidget(new QLabel("Port"), 0, 0);
740 sLayout->addWidget(_outPortLineEdit, 0, 1);
741 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
742 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
743 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
744 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
745 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
746 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
747 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
748 sLayout->addWidget(_outUPortLineEdit, 3, 1);
749 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
750 sLayout->addWidget(new QLabel(" "),5,0);
751 sgroup->setLayout(sLayout);
752
753 // Serial Output
754 // -------------
755 QGridLayout* serLayout = new QGridLayout;
756 serLayout->setColumnMinimumWidth(0,14*ww);
757 _serialBaudRateComboBox->setMaximumWidth(9*ww);
758 _serialFlowControlComboBox->setMaximumWidth(11*ww);
759 _serialDataBitsComboBox->setMaximumWidth(5*ww);
760 _serialParityComboBox->setMaximumWidth(9*ww);
761 _serialStopBitsComboBox->setMaximumWidth(5*ww);
762 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
763 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
764
765 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
766 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
767 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
768 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
769 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
770 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
771 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
772 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
773 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
774 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
775 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
776 serLayout->addWidget(_serialParityComboBox, 3,3);
777 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
778 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
779 serLayout->addWidget(new QLabel("NMEA"), 4,0);
780 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
781 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
782 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
783 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
784 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
785 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
786
787 sergroup->setLayout(serLayout);
788
789 // Outages
790 // -------
791 QGridLayout* aLayout = new QGridLayout;
792 aLayout->setColumnMinimumWidth(0,14*ww);
793 _obsRateComboBox->setMaximumWidth(9*ww);
794 _adviseFailSpinBox->setMaximumWidth(9*ww);
795 _adviseRecoSpinBox->setMaximumWidth(9*ww);
796
797 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
798 aLayout->addWidget(_obsRateComboBox, 0, 1);
799 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
800 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
801 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
802 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
803 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
804 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
805 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
806 aLayout->addWidget(new QLabel(" "), 5, 0);
807 agroup->setLayout(aLayout);
808
809 // Miscellaneous
810 // -------------
811 QGridLayout* rLayout = new QGridLayout;
812 rLayout->setColumnMinimumWidth(0,14*ww);
813 _perfIntrComboBox->setMaximumWidth(9*ww);
814
815 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
816 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
817 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
818 rLayout->addWidget(_perfIntrComboBox, 1, 1);
819 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
820 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
821 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
822 rLayout->addWidget(new QLabel(" "), 4, 0);
823 rLayout->addWidget(new QLabel(" "), 5, 0);
824 rgroup->setLayout(rLayout);
825
826 // PPP Client
827 // ----------
828 QGridLayout* pppLayout = new QGridLayout;
829 _pppSigCLineEdit->setMaximumWidth(6*ww);
830 _pppSigPLineEdit->setMaximumWidth(6*ww);
831 _pppSigCrd0->setMaximumWidth(6*ww);
832 _pppSigCrdP->setMaximumWidth(6*ww);
833 _pppSigTrp0->setMaximumWidth(6*ww);
834 _pppSigTrpP->setMaximumWidth(6*ww);
835 _pppAverageLineEdit->setMaximumWidth(6*ww);
836 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
837 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
838 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
839 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
840 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
841 _pppSync->setMaximumWidth(6*ww);
842 _pppSPPComboBox->setMaximumWidth(8*ww);
843 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
844 pppLayout->addWidget(new QLabel("Obs Mountpoint"), 0, 0);
845 pppLayout->addWidget(_pppMountLineEdit, 0, 1);
846 pppLayout->addWidget(_pppSPPComboBox, 0, 2);
847 pppLayout->addWidget(new QLabel(" X "), 0, 3, Qt::AlignRight);
848 pppLayout->addWidget(_pppRefCrdXLineEdit, 0, 4);
849 pppLayout->addWidget(new QLabel(" Y "), 0, 5, Qt::AlignRight);
850 pppLayout->addWidget(_pppRefCrdYLineEdit, 0, 6);
851 pppLayout->addWidget(new QLabel(" Z "), 0, 7, Qt::AlignRight);
852 pppLayout->addWidget(_pppRefCrdZLineEdit, 0, 8);
853 pppLayout->addWidget(new QLabel("Corr Mountpoint "), 1, 0);
854 pppLayout->addWidget(_pppCorrMountLineEdit, 1, 1);
855 pppLayout->addWidget(new QLabel("Options"), 2, 0, 1, 5);
856 pppLayout->addWidget(_pppUsePhaseCheckBox, 2, 1, Qt::AlignRight);
857 pppLayout->addWidget(new QLabel("Use phase obs"), 2, 2);
858 pppLayout->addWidget(_pppEstTropoCheckBox, 2, 3, Qt::AlignRight);
859 pppLayout->addWidget(new QLabel("Estimate tropo"), 2, 4);
860 pppLayout->addWidget(_pppGLONASSCheckBox, 2, 5, Qt::AlignRight);
861 pppLayout->addWidget(new QLabel("Use GLONASS"), 2, 6);
862 pppLayout->addWidget(_pppGalileoCheckBox, 2, 7, Qt::AlignRight);
863 pppLayout->addWidget(new QLabel("Use Galileo "), 2, 8);
864 pppLayout->addWidget(new QLabel("Options cont'd"), 3, 0);
865 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
866 pppLayout->addWidget(new QLabel("Sigma XYZ Init "), 3, 2);
867 pppLayout->addWidget(_pppSigCrdP, 3, 3, Qt::AlignRight);
868 pppLayout->addWidget(new QLabel("Sigma XYZ Noise "), 3, 4);
869 pppLayout->addWidget(_pppQuickStartLineEdit, 3, 5, Qt::AlignRight);
870 pppLayout->addWidget(new QLabel("Quick-Start (sec) "), 3, 6);
871 pppLayout->addWidget(_pppMaxSolGapLineEdit, 3, 7, Qt::AlignRight);
872 pppLayout->addWidget(new QLabel("Max Sol. Gap (sec)"), 3, 8);
873 pppLayout->addWidget(new QLabel("Output"), 4, 0);
874 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 3);
875 pppLayout->addWidget(new QLabel("NMEA File"), 4, 4);
876 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 5, Qt::AlignRight);
877 pppLayout->addWidget(new QLabel("NMEA Port"), 4, 6);
878 pppLayout->addWidget(_pppPlotCoordinates, 4, 7, Qt::AlignRight);
879 pppLayout->addWidget(new QLabel("PPP Plot"), 4, 8);
880
881
882 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
883
884 pppgroup->setLayout(pppLayout);
885
886 // PPP Client (second panel)
887 // -------------------------
888 QGridLayout* ppp2Layout = new QGridLayout;
889
890 ppp2Layout->addWidget(new QLabel("Antennas"), 0, 0);
891 ppp2Layout->addWidget(_pppAntexLineEdit, 0, 1, 1, 3);
892 ppp2Layout->addWidget(new QLabel("ANTEX File "), 0, 4);
893 ppp2Layout->addWidget(_pppAntennaLineEdit, 0, 5, 1, 3);
894 ppp2Layout->addWidget(new QLabel("Rec. Ant. Name"), 0, 8);
895 ppp2Layout->addWidget(new QLabel("Satellite Antenna "), 1, 0);
896 ppp2Layout->addWidget(_pppApplySatAntCheckBox, 1, 1, Qt::AlignRight);
897 ppp2Layout->addWidget(new QLabel("Apply Offsets"), 1, 2, Qt::AlignLeft);
898 ppp2Layout->addWidget(new QLabel("Sigmas"), 2, 0);
899 ppp2Layout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
900 ppp2Layout->addWidget(new QLabel("Code"), 2, 2);
901 ppp2Layout->addWidget(_pppSigPLineEdit, 2, 3);
902 ppp2Layout->addWidget(new QLabel("Phase"), 2, 4);
903 ppp2Layout->addWidget(_pppSigTrp0, 2, 5, Qt::AlignRight);
904 ppp2Layout->addWidget(new QLabel("Tropo Init "), 2, 6);
905 ppp2Layout->addWidget(_pppSigTrpP, 2, 7);
906 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), 2, 8);
907 ppp2Layout->addWidget(new QLabel("Options cont'd"), 3, 0);
908 ppp2Layout->addWidget(_pppSync, 3, 1);
909 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), 3, 2);
910 ppp2Layout->addWidget(_pppAverageLineEdit, 3, 3, Qt::AlignRight);
911 ppp2Layout->addWidget(new QLabel("Averaging (min)") , 3, 4);
912 ppp2Layout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP), continued."), 4, 0, 1, 6);
913 ppp2Layout->addWidget(new QLabel(" "), 5, 0);
914
915 ppp2group->setLayout(ppp2Layout);
916
917 // Combination
918 // -----------
919 QGridLayout* cmbLayout = new QGridLayout;
920
921 populateCmbTable();
922 cmbLayout->addWidget(_cmbTable,0,0,6,3);
923 cmbLayout->setColumnStretch(0,1);
924 cmbLayout->setColumnStretch(1,1);
925 cmbLayout->setColumnStretch(2,1);
926
927 cmbLayout->addWidget(addCmbRowButton,1,3);
928 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
929 cmbLayout->addWidget(delCmbRowButton,2,3);
930 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
931
932 cmbLayout->setColumnStretch(4,1);
933
934 cmbLayout->addWidget(new QLabel(" Host"), 0, 4);
935 cmbLayout->addWidget(_cmbOutHostLineEdit, 0, 5);
936 cmbLayout->addWidget(new QLabel(" Port"), 0, 6);
937 _cmbOutPortLineEdit->setMaximumWidth(9*ww);
938 cmbLayout->addWidget(_cmbOutPortLineEdit, 0, 7);
939 cmbLayout->addWidget(new QLabel(" Mountpoint"), 1, 4);
940 _cmbMountpointLineEdit->setMaximumWidth(9*ww);
941 cmbLayout->addWidget(_cmbMountpointLineEdit, 1, 5);
942 cmbLayout->addWidget(new QLabel(" Password"), 1, 6);
943 _cmbPasswordLineEdit->setEchoMode(QLineEdit::Password);
944 _cmbPasswordLineEdit->setMaximumWidth(9*ww);
945 cmbLayout->addWidget(_cmbPasswordLineEdit, 1, 7);
946 cmbLayout->addWidget(new QLabel(" Directory, ASCII"), 2, 4);
947 cmbLayout->addWidget(_cmbOutPathLineEdit, 2, 5, 1, 3);
948 cmbLayout->addWidget(new QLabel(" Directory, SP3"), 3, 4);
949 cmbLayout->addWidget(_cmbSP3PathLineEdit, 3, 5, 1, 3);
950 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,5);
951
952 cmbgroup->setLayout(cmbLayout);
953
954 // RTNet Layout
955 // ------------
956 QGridLayout* rtnetLayout = new QGridLayout;
957
958 populateRtnetTable();
959 rtnetLayout->addWidget(_rtnetTable,0,0,6,7);
960 rtnetLayout->setColumnStretch(0,1);
961 rtnetLayout->setColumnStretch(1,1);
962 rtnetLayout->setColumnStretch(2,1);
963 rtnetLayout->setColumnStretch(3,1);
964 rtnetLayout->setColumnStretch(4,1);
965 rtnetLayout->setColumnStretch(5,1);
966
967 rtnetLayout->addWidget(addRtnetRowButton,1,8);
968 connect(addRtnetRowButton, SIGNAL(clicked()), this, SLOT(slotAddRtnetRow()));
969 rtnetLayout->addWidget(delRtnetRowButton,2,8);
970 connect(delRtnetRowButton, SIGNAL(clicked()), this, SLOT(slotDelRtnetRow()));
971
972 rtnetLayout->setColumnStretch(7,1);
973
974 rtnetLayout->addWidget(new QLabel(" Upload RTNet results to NTRIP caster"),5,8,1,5);
975
976 rtnetgroup->setLayout(rtnetLayout);
977
978 // Main Layout
979 // -----------
980 QGridLayout* mLayout = new QGridLayout;
981 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
982 mLayout->addWidget(_aogroup, 0,0);
983 mLayout->addWidget(_mountPointsTable, 1,0);
984 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
985 mLayout->addWidget(_loggroup, 2,0);
986
987 _canvas->setLayout(mLayout);
988
989 // Enable/Disable all Widgets
990 // --------------------------
991 slotBncTextChanged();
992
993 // Auto start
994 // ----------
995 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
996 slotGetData();
997 }
998}
999
1000// Destructor
1001////////////////////////////////////////////////////////////////////////////
1002bncWindow::~bncWindow() {
1003 delete _caster;
1004}
1005
1006//
1007////////////////////////////////////////////////////////////////////////////
1008void bncWindow::populateMountPointsTable() {
1009
1010 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1011 _mountPointsTable->removeRow(iRow);
1012 }
1013
1014 bncSettings settings;
1015
1016 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1017 if (!it.hasNext()) {
1018 _actGetData->setEnabled(false);
1019 }
1020 int iRow = 0;
1021 while (it.hasNext()) {
1022 QStringList hlp = it.next().split(" ");
1023 if (hlp.size() < 5) continue;
1024 _mountPointsTable->insertRow(iRow);
1025
1026 QUrl url(hlp[0]);
1027
1028 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1029 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1030 QString nmea(hlp[4]);
1031 if (hlp[5] == "S") {
1032 fullPath = hlp[0].replace(0,2,"");
1033 }
1034 QString ntripVersion = "1";
1035 if (hlp.size() >= 6) {
1036 ntripVersion = (hlp[5]);
1037 }
1038
1039 QTableWidgetItem* it;
1040 it = new QTableWidgetItem(url.userInfo());
1041 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1042 _mountPointsTable->setItem(iRow, 0, it);
1043
1044 it = new QTableWidgetItem(fullPath);
1045 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1046 _mountPointsTable->setItem(iRow, 1, it);
1047
1048 it = new QTableWidgetItem(format);
1049 _mountPointsTable->setItem(iRow, 2, it);
1050
1051 if (nmea == "yes") {
1052 it = new QTableWidgetItem(latitude);
1053 _mountPointsTable->setItem(iRow, 3, it);
1054 it = new QTableWidgetItem(longitude);
1055 _mountPointsTable->setItem(iRow, 4, it);
1056 } else {
1057 it = new QTableWidgetItem(latitude);
1058 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1059 _mountPointsTable->setItem(iRow, 3, it);
1060 it = new QTableWidgetItem(longitude);
1061 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1062 _mountPointsTable->setItem(iRow, 4, it);
1063 }
1064
1065 it = new QTableWidgetItem(nmea);
1066 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1067 _mountPointsTable->setItem(iRow, 5, it);
1068
1069 it = new QTableWidgetItem(ntripVersion);
1070 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1071 _mountPointsTable->setItem(iRow, 6, it);
1072
1073 bncTableItem* bncIt = new bncTableItem();
1074 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1075 _mountPointsTable->setItem(iRow, 7, bncIt);
1076
1077 iRow++;
1078 }
1079
1080 _mountPointsTable->sortItems(1);
1081}
1082
1083// Retrieve Table
1084////////////////////////////////////////////////////////////////////////////
1085void bncWindow::slotAddMountPoints() {
1086
1087 bncSettings settings;
1088 QString proxyHost = settings.value("proxyHost").toString();
1089 int proxyPort = settings.value("proxyPort").toInt();
1090 if (proxyHost != _proxyHostLineEdit->text() ||
1091 proxyPort != _proxyPortLineEdit->text().toInt()) {
1092 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1093 "changed. Use the new ones?",
1094 QMessageBox::Yes, QMessageBox::No,
1095 QMessageBox::NoButton);
1096 if (iRet == QMessageBox::Yes) {
1097 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1098 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1099 settings.sync();
1100 }
1101 }
1102
1103 QMessageBox msgBox;
1104 msgBox.setIcon(QMessageBox::Question);
1105 msgBox.setWindowTitle("Add Stream");
1106 msgBox.setText("Add stream(s) coming from:");
1107
1108 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1109 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1110 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1111 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1112 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1113
1114 msgBox.exec();
1115
1116 if (msgBox.clickedButton() == buttonNtrip) {
1117 bncTableDlg* dlg = new bncTableDlg(this);
1118 dlg->move(this->pos().x()+50, this->pos().y()+50);
1119 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1120 this, SLOT(slotNewMountPoints(QStringList*)));
1121 dlg->exec();
1122 delete dlg;
1123 } else if (msgBox.clickedButton() == buttonIP) {
1124 bncIpPort* ipp = new bncIpPort(this);
1125 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1126 this, SLOT(slotNewMountPoints(QStringList*)));
1127 ipp->exec();
1128 delete ipp;
1129 } else if (msgBox.clickedButton() == buttonUDP) {
1130 bncUdpPort* udp = new bncUdpPort(this);
1131 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1132 this, SLOT(slotNewMountPoints(QStringList*)));
1133 udp->exec();
1134 delete udp;
1135 } else if (msgBox.clickedButton() == buttonSerial) {
1136 bncSerialPort* sep = new bncSerialPort(this);
1137 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1138 this, SLOT(slotNewMountPoints(QStringList*)));
1139 sep->exec();
1140 delete sep;
1141 } else if (msgBox.clickedButton() == buttonCancel) {
1142 // Cancel
1143 }
1144}
1145
1146// Delete Selected Mount Points
1147////////////////////////////////////////////////////////////////////////////
1148void bncWindow::slotDeleteMountPoints() {
1149
1150 int nRows = _mountPointsTable->rowCount();
1151 bool flg[nRows];
1152 for (int iRow = 0; iRow < nRows; iRow++) {
1153 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1154 flg[iRow] = true;
1155 }
1156 else {
1157 flg[iRow] = false;
1158 }
1159 }
1160 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1161 if (flg[iRow]) {
1162 _mountPointsTable->removeRow(iRow);
1163 }
1164 }
1165 _actDeleteMountPoints->setEnabled(false);
1166
1167 if (_mountPointsTable->rowCount() == 0) {
1168 _actGetData->setEnabled(false);
1169 }
1170}
1171
1172// New Mount Points Selected
1173////////////////////////////////////////////////////////////////////////////
1174void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1175 int iRow = 0;
1176 QListIterator<QString> it(*mountPoints);
1177 while (it.hasNext()) {
1178 QStringList hlp = it.next().split(" ");
1179 QUrl url(hlp[0]);
1180 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1181 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1182 QString nmea(hlp[4]);
1183 if (hlp[5] == "S") {
1184 fullPath = hlp[0].replace(0,2,"");
1185 }
1186 QString ntripVersion = "1";
1187 if (hlp.size() >= 6) {
1188 ntripVersion = (hlp[5]);
1189 }
1190
1191 _mountPointsTable->insertRow(iRow);
1192
1193 QTableWidgetItem* it;
1194 it = new QTableWidgetItem(url.userInfo());
1195 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1196 _mountPointsTable->setItem(iRow, 0, it);
1197
1198 it = new QTableWidgetItem(fullPath);
1199 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1200 _mountPointsTable->setItem(iRow, 1, it);
1201
1202 it = new QTableWidgetItem(format);
1203 _mountPointsTable->setItem(iRow, 2, it);
1204
1205 if (nmea == "yes") {
1206 it = new QTableWidgetItem(latitude);
1207 _mountPointsTable->setItem(iRow, 3, it);
1208 it = new QTableWidgetItem(longitude);
1209 _mountPointsTable->setItem(iRow, 4, it);
1210 } else {
1211 it = new QTableWidgetItem(latitude);
1212 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1213 _mountPointsTable->setItem(iRow, 3, it);
1214 it = new QTableWidgetItem(longitude);
1215 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1216 _mountPointsTable->setItem(iRow, 4, it);
1217 }
1218
1219 it = new QTableWidgetItem(nmea);
1220 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1221 _mountPointsTable->setItem(iRow, 5, it);
1222
1223 it = new QTableWidgetItem(ntripVersion);
1224 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1225 _mountPointsTable->setItem(iRow, 6, it);
1226
1227 bncTableItem* bncIt = new bncTableItem();
1228 _mountPointsTable->setItem(iRow, 7, bncIt);
1229
1230 iRow++;
1231 }
1232 _mountPointsTable->hideColumn(0);
1233 _mountPointsTable->sortItems(1);
1234 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1235 _actGetData->setEnabled(true);
1236 }
1237 delete mountPoints;
1238}
1239
1240// Save Options
1241////////////////////////////////////////////////////////////////////////////
1242void bncWindow::slotSaveOptions() {
1243
1244 QStringList mountPoints;
1245 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1246
1247 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1248 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1249 "@" + _mountPointsTable->item(iRow, 1)->text() );
1250
1251 mountPoints.append(url.toString() + " " +
1252 _mountPointsTable->item(iRow, 2)->text()
1253 + " " + _mountPointsTable->item(iRow, 3)->text()
1254 + " " + _mountPointsTable->item(iRow, 4)->text()
1255 + " " + _mountPointsTable->item(iRow, 5)->text()
1256 + " " + _mountPointsTable->item(iRow, 6)->text());
1257 } else {
1258 mountPoints.append(
1259 "//" + _mountPointsTable->item(iRow, 1)->text()
1260 + " " + _mountPointsTable->item(iRow, 2)->text()
1261 + " " + _mountPointsTable->item(iRow, 3)->text()
1262 + " " + _mountPointsTable->item(iRow, 4)->text()
1263 + " " + _mountPointsTable->item(iRow, 5)->text()
1264 + " " + _mountPointsTable->item(iRow, 6)->text());
1265 }
1266 }
1267
1268 QStringList combineStreams;
1269 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1270 QString hlp;
1271 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1272 if (_cmbTable->item(iRow, iCol)) {
1273 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1274 }
1275 }
1276 if (!hlp.isEmpty()) {
1277 combineStreams << hlp;
1278 }
1279 }
1280
1281 QStringList rtnetUploadMountpoints;
1282 for (int iRow = 0; iRow < _rtnetTable->rowCount(); iRow++) {
1283 QString hlp;
1284 for (int iCol = 0; iCol < _rtnetTable->columnCount(); iCol++) {
1285 if (_rtnetTable->item(iRow, iCol)) {
1286 hlp += _rtnetTable->item(iRow, iCol)->text() + " ";
1287 }
1288 }
1289 if (!hlp.isEmpty()) {
1290 rtnetUploadMountpoints << hlp;
1291 }
1292 }
1293
1294 bncSettings settings;
1295
1296 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1297 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1298 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1299 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1300 settings.setValue("binSampl", _binSamplSpinBox->value());
1301 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1302 settings.setValue("corrPath", _corrPathLineEdit->text());
1303 settings.setValue("corrPort", _corrPortLineEdit->text());
1304 settings.setValue("corrTime", _corrTimeSpinBox->value());
1305 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1306 settings.setValue("ephPath", _ephPathLineEdit->text());
1307 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1308 settings.setValue("logFile", _logFileLineEdit->text());
1309 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1310 settings.setValue("miscMount", _miscMountLineEdit->text());
1311 settings.setValue("pppMount", _pppMountLineEdit->text());
1312 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1313 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1314 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1315 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1316 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1317 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1318 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1319 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1320 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1321 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1322 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1323 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1324 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1325 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1326 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1327 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1328 settings.setValue("pppSync", _pppSync->text());
1329 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1330 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1331 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1332 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1333 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1334 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1335 settings.setValue("pppAntex", _pppAntexLineEdit->text());
1336 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1337 settings.setValue("mountPoints", mountPoints);
1338 settings.setValue("obsRate", _obsRateComboBox->currentText());
1339 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1340 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1341 settings.setValue("outFile", _outFileLineEdit->text());
1342 settings.setValue("outPort", _outPortLineEdit->text());
1343 settings.setValue("outUPort", _outUPortLineEdit->text());
1344 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1345 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1346 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1347 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1348 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1349 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1350 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1351 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1352 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1353 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1354 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1355 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1356 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1357 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1358 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1359 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1360 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1361 settings.setValue("serialParity", _serialParityComboBox->currentText());
1362 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1363 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1364 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1365 settings.setValue("startTab", _aogroup->currentIndex());
1366 settings.setValue("statusTab", _loggroup->currentIndex());
1367 settings.setValue("waitTime", _waitTimeSpinBox->value());
1368 if (!combineStreams.isEmpty()) {
1369 settings.setValue("combineStreams", combineStreams);
1370 }
1371 else {
1372 settings.setValue("combineStreams", "");
1373 }
1374 settings.setValue("cmbOutHost", _cmbOutHostLineEdit->text());
1375 settings.setValue("cmbOutPort", _cmbOutPortLineEdit->text());
1376 settings.setValue("cmbMountpoint", _cmbMountpointLineEdit->text());
1377 settings.setValue("cmbPassword", _cmbPasswordLineEdit->text());
1378 settings.setValue("cmbOutPath", _cmbOutPathLineEdit->text());
1379 settings.setValue("cmbSP3Path", _cmbSP3PathLineEdit->text());
1380
1381 if (!rtnetUploadMountpoints.isEmpty()) {
1382 settings.setValue("rtnetUploadMountpoints", rtnetUploadMountpoints);
1383 }
1384 else {
1385 settings.setValue("rtnetUploadMountpoints", "");
1386 }
1387
1388 if (_caster) {
1389 _caster->slotReadMountPoints();
1390 }
1391 settings.sync();
1392}
1393
1394// All get slots terminated
1395////////////////////////////////////////////////////////////////////////////
1396void bncWindow::slotGetThreadsFinished() {
1397 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1398 delete _caster; _caster = 0;
1399 _actGetData->setEnabled(true);
1400 _actStop->setEnabled(false);
1401}
1402
1403// Retrieve Data
1404////////////////////////////////////////////////////////////////////////////
1405void bncWindow::slotGetData() {
1406 slotSaveOptions();
1407
1408 _bncFigurePPP->reset();
1409
1410 _actDeleteMountPoints->setEnabled(false);
1411 _actGetData->setEnabled(false);
1412 _actStop->setEnabled(true);
1413
1414 _caster = new bncCaster(_outFileLineEdit->text(),
1415 _outPortLineEdit->text().toInt());
1416
1417 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1418 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1419 ((bncApp*)qApp)->initCombination();
1420
1421 connect(_caster, SIGNAL(getThreadsFinished()),
1422 this, SLOT(slotGetThreadsFinished()));
1423
1424 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1425 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1426
1427 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1428
1429 bncSettings settings;
1430
1431 QDir rnxdir(settings.value("rnxPath").toString());
1432 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1433
1434 QString rnx_file = settings.value("rnxScript").toString();
1435 if ( !rnx_file.isEmpty() ) {
1436 QFile rnxfile(settings.value("rnxScript").toString());
1437 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1438 }
1439
1440 QDir ephdir(settings.value("ephPath").toString());
1441 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1442
1443 QDir corrdir(settings.value("corrPath").toString());
1444 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1445
1446 QString advise_file = settings.value("adviseScript").toString();
1447 if ( !advise_file.isEmpty() ) {
1448 QFile advisefile(settings.value("adviseScript").toString());
1449 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1450 }
1451
1452 QString ant_file = settings.value("pppAntex").toString();
1453 if ( !ant_file.isEmpty() ) {
1454 QFile anxfile(settings.value("pppAntex").toString());
1455 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1456 }
1457
1458 QDir cmbOutDir(settings.value("cmbOutPath").toString());
1459 if (!cmbOutDir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find directory for saving combination results in ASCII format", true);
1460
1461 QDir cmbSP3dir(settings.value("cmbSP3Path").toString());
1462 if (!cmbSP3dir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find directory for saving combination results in SP3 format", true);
1463
1464 _caster->slotReadMountPoints();
1465}
1466
1467// Retrieve Data
1468////////////////////////////////////////////////////////////////////////////
1469void bncWindow::slotStop() {
1470 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1471 QMessageBox::Yes, QMessageBox::No,
1472 QMessageBox::NoButton);
1473 if (iRet == QMessageBox::Yes) {
1474 delete _caster; _caster = 0;
1475 _actGetData->setEnabled(true);
1476 _actStop->setEnabled(false);
1477 }
1478}
1479
1480// Close Application gracefully
1481////////////////////////////////////////////////////////////////////////////
1482void bncWindow::closeEvent(QCloseEvent* event) {
1483
1484 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1485 QMessageBox::Yes, QMessageBox::No,
1486 QMessageBox::Cancel);
1487
1488 if (iRet == QMessageBox::Cancel) {
1489 event->ignore();
1490 return;
1491 }
1492 else if (iRet == QMessageBox::Yes) {
1493 slotSaveOptions();
1494 }
1495
1496 QMainWindow::closeEvent(event);
1497}
1498
1499// User changed the selection of mountPoints
1500////////////////////////////////////////////////////////////////////////////
1501void bncWindow::slotSelectionChanged() {
1502 if (_mountPointsTable->selectedItems().isEmpty()) {
1503 _actDeleteMountPoints->setEnabled(false);
1504 }
1505 else {
1506 _actDeleteMountPoints->setEnabled(true);
1507 }
1508}
1509
1510// Display Program Messages
1511////////////////////////////////////////////////////////////////////////////
1512void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1513
1514#ifdef DEBUG_RTCM2_2021
1515 const int maxBufferSize = 1000;
1516#else
1517 const int maxBufferSize = 10000;
1518#endif
1519
1520 if (! showOnScreen ) {
1521 return;
1522 }
1523
1524 QString txt = _log->toPlainText() + "\n" +
1525 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1526 _log->clear();
1527 _log->append(txt.right(maxBufferSize));
1528}
1529
1530// About Message
1531////////////////////////////////////////////////////////////////////////////
1532void bncWindow::slotAbout() {
1533 new bncAboutDlg(0);
1534}
1535
1536//Flowchart
1537////////////////////////////////////////////////////////////////////////////
1538void bncWindow::slotFlowchart() {
1539 new bncFlowchartDlg(0);
1540}
1541
1542// Help Window
1543////////////////////////////////////////////////////////////////////////////
1544void bncWindow::slotHelp() {
1545 QUrl url;
1546 url.setPath(":bnchelp.html");
1547 new bncHlpDlg(0, url);
1548}
1549
1550// Select Fonts
1551////////////////////////////////////////////////////////////////////////////
1552void bncWindow::slotFontSel() {
1553 bool ok;
1554 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1555 if (ok) {
1556 bncSettings settings;
1557 settings.setValue("font", newFont.toString());
1558 QApplication::setFont(newFont);
1559 int ww = QFontMetrics(newFont).width('w');
1560 setMinimumSize(60*ww, 80*ww);
1561 resize(60*ww, 80*ww);
1562 }
1563}
1564
1565// Whats This Help
1566void bncWindow::slotWhatsThis() {
1567 QWhatsThis::enterWhatsThisMode();
1568}
1569
1570//
1571////////////////////////////////////////////////////////////////////////////
1572void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1573 _bncFigure->updateMountPoints();
1574 _bncFigureLate->updateMountPoints();
1575
1576 populateMountPointsTable();
1577 bncSettings settings;
1578 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1579 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1580 QListIterator<bncGetThread*> iTh(threads);
1581 while (iTh.hasNext()) {
1582 bncGetThread* thread = iTh.next();
1583 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1584 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1585 "@" + _mountPointsTable->item(iRow, 1)->text() );
1586 if (url == thread->mountPoint() &&
1587 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1588 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1589 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1590 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1591 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1592 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1593 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1594 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1595 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1596 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1597 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1598 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1599 disconnect(thread,
1600 SIGNAL(newPosition(bncTime, double, double, double)),
1601 _bncFigurePPP,
1602 SLOT(slotNewPosition(bncTime, double, double, double)));
1603 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1604 _bncFigurePPP,
1605 SLOT(slotNewPosition(bncTime, double, double, double)));
1606 }
1607 break;
1608 }
1609 }
1610 }
1611}
1612
1613//
1614////////////////////////////////////////////////////////////////////////////
1615void bncWindow::CreateMenu() {
1616 // Create Menus
1617 // ------------
1618 _menuFile = menuBar()->addMenu(tr("&File"));
1619 _menuFile->addAction(_actFontSel);
1620 _menuFile->addSeparator();
1621 _menuFile->addAction(_actSaveOpt);
1622 _menuFile->addSeparator();
1623 _menuFile->addAction(_actQuit);
1624
1625 _menuHlp = menuBar()->addMenu(tr("&Help"));
1626 _menuHlp->addAction(_actHelp);
1627 _menuHlp->addAction(_actFlowchart);
1628 _menuHlp->addAction(_actAbout);
1629}
1630
1631// Toolbar
1632////////////////////////////////////////////////////////////////////////////
1633void bncWindow::AddToolbar() {
1634 // Tool (Command) Bar
1635 // ------------------
1636 QToolBar* toolBar = new QToolBar;
1637 addToolBar(Qt::BottomToolBarArea, toolBar);
1638 toolBar->setMovable(false);
1639 toolBar->addAction(_actAddMountPoints);
1640 toolBar->addAction(_actDeleteMountPoints);
1641 toolBar->addAction(_actGetData);
1642 toolBar->addAction(_actStop);
1643 toolBar->addWidget(new QLabel(" "));
1644 toolBar->addAction(_actwhatsthis);
1645}
1646
1647// About
1648////////////////////////////////////////////////////////////////////////////
1649bncAboutDlg::bncAboutDlg(QWidget* parent) :
1650 QDialog(parent) {
1651
1652 QTextBrowser* tb = new QTextBrowser;
1653 QUrl url; url.setPath(":bncabout.html");
1654 tb->setSource(url);
1655 tb->setReadOnly(true);
1656
1657 int ww = QFontMetrics(font()).width('w');
1658 QPushButton* _closeButton = new QPushButton("Close");
1659 _closeButton->setMaximumWidth(10*ww);
1660 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1661
1662 QGridLayout* dlgLayout = new QGridLayout();
1663 QLabel* img = new QLabel();
1664 img->setPixmap(QPixmap(":ntrip-logo.png"));
1665 dlgLayout->addWidget(img, 0,0);
1666 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1667 dlgLayout->addWidget(tb,1,0,1,2);
1668 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1669
1670 setLayout(dlgLayout);
1671 resize(60*ww, 60*ww);
1672 setWindowTitle("About BNC");
1673 show();
1674}
1675
1676//
1677////////////////////////////////////////////////////////////////////////////
1678bncAboutDlg::~bncAboutDlg() {
1679};
1680
1681// Flowchart
1682////////////////////////////////////////////////////////////////////////////
1683bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1684 QDialog(parent) {
1685
1686 int ww = QFontMetrics(font()).width('w');
1687 QPushButton* _closeButton = new QPushButton("Close");
1688 _closeButton->setMaximumWidth(10*ww);
1689 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1690
1691 QGridLayout* dlgLayout = new QGridLayout();
1692 QLabel* img = new QLabel();
1693 img->setPixmap(QPixmap(":bncflowchart.png"));
1694 dlgLayout->addWidget(img, 0,0);
1695 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1696
1697 setLayout(dlgLayout);
1698 setWindowTitle("Flow Chart");
1699 show();
1700}
1701
1702//
1703////////////////////////////////////////////////////////////////////////////
1704bncFlowchartDlg::~bncFlowchartDlg() {
1705};
1706
1707// Bnc Text
1708////////////////////////////////////////////////////////////////////////////
1709void bncWindow::slotBncTextChanged(){
1710
1711 QPalette palette_white(QColor(255, 255, 255));
1712 QPalette palette_gray(QColor(230, 230, 230));
1713 bncSettings settings;
1714
1715 // Proxy
1716 //------
1717 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1718 if (!_proxyHostLineEdit->text().isEmpty()) {
1719 _proxyPortLineEdit->setStyleSheet("background-color: white");
1720 _proxyPortLineEdit->setEnabled(true);
1721 }
1722 else {
1723 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1724 _proxyPortLineEdit->setEnabled(false);
1725 }
1726 }
1727
1728 // RINEX Observations
1729 // ------------------
1730 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1731 if (!_rnxPathLineEdit->text().isEmpty()) {
1732 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1733 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1734 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1735 _rnxV3CheckBox->setPalette(palette_white);
1736 _rnxIntrComboBox->setStyleSheet("background-color: white");
1737 _rnxSamplSpinBox->setEnabled(true);
1738 _rnxSkelLineEdit->setEnabled(true);
1739 _rnxScrpLineEdit->setEnabled(true);
1740 _rnxV3CheckBox->setEnabled(true);
1741 _rnxIntrComboBox->setEnabled(true);
1742 }
1743 else {
1744 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1745 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1746 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1747 _rnxV3CheckBox->setPalette(palette_gray);
1748 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1749 _rnxSamplSpinBox->setEnabled(false);
1750 _rnxSkelLineEdit->setEnabled(false);
1751 _rnxScrpLineEdit->setEnabled(false);
1752 _rnxV3CheckBox->setEnabled(false);
1753 _rnxIntrComboBox->setEnabled(false);
1754 }
1755 }
1756
1757 // RINEX Ephemeris
1758 // ---------------
1759 if (sender() == 0 ||
1760 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1761 if (!_ephPathLineEdit->text().isEmpty() ||
1762 !_outEphPortLineEdit->text().isEmpty()) {
1763 _ephIntrComboBox->setStyleSheet("background-color: white");
1764 _ephV3CheckBox->setPalette(palette_white);
1765 _ephIntrComboBox->setEnabled(true);
1766 _ephV3CheckBox->setEnabled(true);
1767 }
1768 else {
1769 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1770 _ephV3CheckBox->setPalette(palette_gray);
1771 _ephIntrComboBox->setEnabled(false);
1772 _ephV3CheckBox->setEnabled(false);
1773 }
1774 }
1775
1776 // Broadcast Corrections
1777 // ---------------------
1778 if (sender() == 0 ||
1779 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1780 if (!_corrPathLineEdit->text().isEmpty() ||
1781 !_corrPortLineEdit->text().isEmpty()) {
1782 _corrIntrComboBox->setStyleSheet("background-color: white");
1783 _corrIntrComboBox->setEnabled(true);
1784 }
1785 else {
1786 _corrIntrComboBox->setStyleSheet("background-color: white");
1787 _corrIntrComboBox->setEnabled(true);
1788 }
1789 }
1790
1791 // Feed Engine
1792 // -----------
1793 if (sender() == 0 ||
1794 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1795 if ( !_outPortLineEdit->text().isEmpty() ||
1796 !_outFileLineEdit->text().isEmpty()) {
1797 _waitTimeSpinBox->setStyleSheet("background-color: white");
1798 _binSamplSpinBox->setStyleSheet("background-color: white");
1799 _waitTimeSpinBox->setEnabled(true);
1800 _binSamplSpinBox->setEnabled(true);
1801 }
1802 else {
1803 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1804 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1805 _waitTimeSpinBox->setEnabled(false);
1806 _binSamplSpinBox->setEnabled(false);
1807 }
1808 }
1809
1810 // Serial Output
1811 // -------------
1812 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1813 sender() == _serialAutoNMEAComboBox) {
1814 if (!_serialMountPointLineEdit->text().isEmpty()) {
1815 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1816 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1817 _serialParityComboBox->setStyleSheet("background-color: white");
1818 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1819 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1820 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1821 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1822 _serialPortNameLineEdit->setEnabled(true);
1823 _serialBaudRateComboBox->setEnabled(true);
1824 _serialParityComboBox->setEnabled(true);
1825 _serialDataBitsComboBox->setEnabled(true);
1826 _serialStopBitsComboBox->setEnabled(true);
1827 _serialFlowControlComboBox->setEnabled(true);
1828 _serialAutoNMEAComboBox->setEnabled(true);
1829 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1830 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1831 _serialHeightNMEALineEdit->setEnabled(true);
1832 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1833 _serialFileNMEALineEdit->setEnabled(false);
1834 }
1835 else {
1836 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1837 _serialHeightNMEALineEdit->setEnabled(false);
1838 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1839 _serialFileNMEALineEdit->setEnabled(true);
1840 }
1841 }
1842 else {
1843 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1844 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1845 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1846 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1847 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1848 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1849 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1850 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1851 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1852 _serialPortNameLineEdit->setEnabled(false);
1853 _serialBaudRateComboBox->setEnabled(false);
1854 _serialParityComboBox->setEnabled(false);
1855 _serialDataBitsComboBox->setEnabled(false);
1856 _serialStopBitsComboBox->setEnabled(false);
1857 _serialFlowControlComboBox->setEnabled(false);
1858 _serialAutoNMEAComboBox->setEnabled(false);
1859 _serialHeightNMEALineEdit->setEnabled(false);
1860 _serialFileNMEALineEdit->setEnabled(false);
1861 }
1862 }
1863
1864 // Outages
1865 // -------
1866 if (sender() == 0 || sender() == _obsRateComboBox) {
1867 if (!_obsRateComboBox->currentText().isEmpty()) {
1868 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1869 _adviseFailSpinBox->setStyleSheet("background-color: white");
1870 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1871 _adviseFailSpinBox->setEnabled(true);
1872 _adviseRecoSpinBox->setEnabled(true);
1873 _adviseScriptLineEdit->setEnabled(true);
1874 } else {
1875 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1876 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1877 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1878 _adviseFailSpinBox->setEnabled(false);
1879 _adviseRecoSpinBox->setEnabled(false);
1880 _adviseScriptLineEdit->setEnabled(false);
1881 }
1882 }
1883
1884 // Miscellaneous
1885 // -------------
1886 if (sender() == 0 || sender() == _miscMountLineEdit) {
1887 if (!_miscMountLineEdit->text().isEmpty()) {
1888 _perfIntrComboBox->setStyleSheet("background-color: white");
1889 _scanRTCMCheckBox->setPalette(palette_white);
1890 _perfIntrComboBox->setEnabled(true);
1891 _scanRTCMCheckBox->setEnabled(true);
1892 } else {
1893 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1894 _scanRTCMCheckBox->setPalette(palette_gray);
1895 _perfIntrComboBox->setEnabled(false);
1896 _scanRTCMCheckBox->setEnabled(false);
1897 }
1898 }
1899
1900 // PPP Client
1901 // ----------
1902 if (sender() == 0
1903 || sender() == _pppMountLineEdit
1904 || sender() == _pppCorrMountLineEdit
1905 || sender() == _pppRefCrdXLineEdit
1906 || sender() == _pppRefCrdYLineEdit
1907 || sender() == _pppRefCrdZLineEdit
1908 || sender() == _pppSync
1909 || sender() == _pppSPPComboBox
1910 || sender() == _pppQuickStartLineEdit
1911 || sender() == _pppEstTropoCheckBox
1912 || sender() == _pppUsePhaseCheckBox
1913 || sender() == _pppAntexLineEdit ) {
1914 if ((!_pppMountLineEdit->text().isEmpty() &&
1915 !_pppCorrMountLineEdit->text().isEmpty()) ||
1916 ( !_pppMountLineEdit->text().isEmpty() &&
1917 _pppSPPComboBox->currentText() == "SPP")) {
1918 _pppSPPComboBox->setPalette(palette_white);
1919 _pppNMEALineEdit->setPalette(palette_white);
1920 _pppNMEAPortLineEdit->setPalette(palette_white);
1921 _pppRefCrdXLineEdit->setPalette(palette_white);
1922 _pppRefCrdYLineEdit->setPalette(palette_white);
1923 _pppRefCrdZLineEdit->setPalette(palette_white);
1924 _pppUsePhaseCheckBox->setPalette(palette_white);
1925 _pppPlotCoordinates->setPalette(palette_white);
1926 _pppEstTropoCheckBox->setPalette(palette_white);
1927 _pppGLONASSCheckBox->setPalette(palette_white);
1928 _pppGalileoCheckBox->setPalette(palette_white);
1929 _pppAntexLineEdit->setPalette(palette_white);
1930 _pppSPPComboBox->setEnabled(true);
1931 _pppNMEALineEdit->setEnabled(true);
1932 _pppNMEAPortLineEdit->setEnabled(true);
1933 _pppRefCrdXLineEdit->setEnabled(true);
1934 _pppRefCrdYLineEdit->setEnabled(true);
1935 _pppRefCrdZLineEdit->setEnabled(true);
1936 _pppUsePhaseCheckBox->setEnabled(true);
1937 _pppPlotCoordinates->setEnabled(true);
1938 _pppEstTropoCheckBox->setEnabled(true);
1939 _pppGLONASSCheckBox->setEnabled(true);
1940 _pppGalileoCheckBox->setEnabled(true);
1941 _pppRefCrdXLineEdit->setPalette(palette_white);
1942 _pppRefCrdYLineEdit->setPalette(palette_white);
1943 _pppRefCrdZLineEdit->setPalette(palette_white);
1944 _pppAntexLineEdit->setEnabled(true);
1945 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1946 !_pppRefCrdYLineEdit->text().isEmpty() &&
1947 !_pppRefCrdZLineEdit->text().isEmpty()) {
1948 _pppAverageLineEdit->setPalette(palette_white);
1949 _pppQuickStartLineEdit->setPalette(palette_white);
1950 _pppAverageLineEdit->setEnabled(true);
1951 _pppQuickStartLineEdit->setEnabled(true);
1952 }
1953 else {
1954 _pppAverageLineEdit->setPalette(palette_gray);
1955 _pppQuickStartLineEdit->setPalette(palette_gray);
1956 _pppAverageLineEdit->setEnabled(false);
1957 _pppQuickStartLineEdit->setEnabled(false);
1958 }
1959 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1960 !_pppRefCrdYLineEdit->text().isEmpty() &&
1961 !_pppRefCrdZLineEdit->text().isEmpty() &&
1962 !_pppQuickStartLineEdit->text().isEmpty()) {
1963 _pppMaxSolGapLineEdit->setPalette(palette_white);
1964 _pppMaxSolGapLineEdit->setEnabled(true);
1965 }
1966 else {
1967 _pppMaxSolGapLineEdit->setPalette(palette_gray);
1968 _pppMaxSolGapLineEdit->setEnabled(false);
1969 }
1970 if (!_pppAntexLineEdit->text().isEmpty() ) {
1971 _pppAntennaLineEdit->setEnabled(true);
1972 _pppApplySatAntCheckBox->setEnabled(true);
1973 _pppAntennaLineEdit->setPalette(palette_white);
1974 _pppApplySatAntCheckBox->setPalette(palette_white);
1975 }
1976 else {
1977 _pppAntennaLineEdit->setEnabled(false);
1978 _pppApplySatAntCheckBox->setEnabled(false);
1979 _pppAntennaLineEdit->setPalette(palette_gray);
1980 _pppApplySatAntCheckBox->setPalette(palette_gray);
1981 }
1982 _pppSigCLineEdit->setPalette(palette_white);
1983 _pppSigCLineEdit->setEnabled(true);
1984 _pppSigCrd0->setPalette(palette_white);
1985 _pppSigCrd0->setEnabled(true);
1986 _pppSigCrdP->setPalette(palette_white);
1987 _pppSigCrdP->setEnabled(true);
1988 if (_pppEstTropoCheckBox->isChecked()
1989 && !_pppMountLineEdit->text().isEmpty()) {
1990 _pppSigTrp0->setPalette(palette_white);
1991 _pppSigTrp0->setEnabled(true);
1992 _pppSigTrpP->setPalette(palette_white);
1993 _pppSigTrpP->setEnabled(true);
1994 }
1995 else {
1996 _pppSigTrp0->setPalette(palette_gray);
1997 _pppSigTrp0->setEnabled(false);
1998 _pppSigTrpP->setPalette(palette_gray);
1999 _pppSigTrpP->setEnabled(false);
2000 }
2001 if (_pppUsePhaseCheckBox->isChecked()
2002 && !_pppMountLineEdit->text().isEmpty()) {
2003 _pppSigPLineEdit->setPalette(palette_white);
2004 _pppSigPLineEdit->setEnabled(true);
2005 }
2006 else {
2007 _pppSigPLineEdit->setPalette(palette_gray);
2008 _pppSigPLineEdit->setEnabled(false);
2009 }
2010 if (_pppSPPComboBox->currentText() == "PPP") {
2011 _pppSync->setPalette(palette_white);
2012 _pppSync->setEnabled(true);
2013 }
2014 else {
2015 _pppSync->setPalette(palette_gray);
2016 _pppSync->setEnabled(false);
2017 }
2018 } else {
2019 _pppSPPComboBox->setPalette(palette_gray);
2020 _pppNMEALineEdit->setPalette(palette_gray);
2021 _pppNMEAPortLineEdit->setPalette(palette_gray);
2022 _pppRefCrdXLineEdit->setPalette(palette_gray);
2023 _pppRefCrdYLineEdit->setPalette(palette_gray);
2024 _pppRefCrdZLineEdit->setPalette(palette_gray);
2025 _pppSync->setPalette(palette_gray);
2026 _pppUsePhaseCheckBox->setPalette(palette_gray);
2027 _pppPlotCoordinates->setPalette(palette_gray);
2028 _pppEstTropoCheckBox->setPalette(palette_gray);
2029 _pppGLONASSCheckBox->setPalette(palette_gray);
2030 _pppGalileoCheckBox->setPalette(palette_gray);
2031 _pppSigCLineEdit->setPalette(palette_gray);
2032 _pppSigPLineEdit->setPalette(palette_gray);
2033 _pppSigCrd0->setPalette(palette_gray);
2034 _pppSigCrdP->setPalette(palette_gray);
2035 _pppSigTrp0->setPalette(palette_gray);
2036 _pppSigTrpP->setPalette(palette_gray);
2037 _pppAverageLineEdit->setPalette(palette_gray);
2038 _pppQuickStartLineEdit->setPalette(palette_gray);
2039 _pppMaxSolGapLineEdit->setPalette(palette_gray);
2040 _pppAntexLineEdit->setPalette(palette_white);
2041 _pppAntennaLineEdit->setPalette(palette_gray);
2042 _pppApplySatAntCheckBox->setPalette(palette_gray);
2043 _pppSPPComboBox->setEnabled(false);
2044 _pppNMEALineEdit->setEnabled(false);
2045 _pppNMEAPortLineEdit->setEnabled(false);
2046 _pppRefCrdXLineEdit->setEnabled(false);
2047 _pppRefCrdYLineEdit->setEnabled(false);
2048 _pppRefCrdZLineEdit->setEnabled(false);
2049 _pppSync->setEnabled(false);
2050 _pppUsePhaseCheckBox->setEnabled(false);
2051 _pppPlotCoordinates->setEnabled(false);
2052 _pppEstTropoCheckBox->setEnabled(false);
2053 _pppGLONASSCheckBox->setEnabled(false);
2054 _pppGalileoCheckBox->setEnabled(false);
2055 _pppSigCLineEdit->setEnabled(false);
2056 _pppSigPLineEdit->setEnabled(false);
2057 _pppSigCrd0->setEnabled(false);
2058 _pppSigCrdP->setEnabled(false);
2059 _pppSigTrp0->setEnabled(false);
2060 _pppSigTrpP->setEnabled(false);
2061 _pppAverageLineEdit->setEnabled(false);
2062 _pppQuickStartLineEdit->setEnabled(false);
2063 _pppMaxSolGapLineEdit->setEnabled(false);
2064 _pppAntexLineEdit->setEnabled(true);
2065 _pppAntennaLineEdit->setEnabled(false);
2066 _pppApplySatAntCheckBox->setEnabled(false);
2067 }
2068//
2069 if (_pppMountLineEdit->text().isEmpty()) {
2070 _pppCorrMountLineEdit->setPalette(palette_gray);
2071 _pppCorrMountLineEdit->setEnabled(false);
2072 } else {
2073 _pppCorrMountLineEdit->setPalette(palette_white);
2074 _pppCorrMountLineEdit->setEnabled(true);
2075 if (_pppCorrMountLineEdit->text().isEmpty()) {
2076 _pppSPPComboBox->setPalette(palette_white);
2077 _pppSPPComboBox->setEnabled(true);
2078 }
2079 }
2080 if (_pppSPPComboBox->currentText() == "SPP") {
2081 _pppCorrMountLineEdit->setPalette(palette_gray);
2082 _pppCorrMountLineEdit->setEnabled(false);
2083 }
2084 }
2085
2086 // Combination
2087 // ----------
2088 if (sender() == 0
2089 || sender() == _cmbTable
2090 || sender() == _cmbMountpointLineEdit) {
2091 if (_cmbTable->rowCount() > 0) {
2092 _cmbMountpointLineEdit->setPalette(palette_white);
2093 _cmbSP3PathLineEdit->setPalette(palette_white);
2094 _cmbMountpointLineEdit->setEnabled(true);
2095 _cmbSP3PathLineEdit->setEnabled(true);
2096 if (!_cmbMountpointLineEdit->text().isEmpty()) {
2097 _cmbOutHostLineEdit->setPalette(palette_white);
2098 _cmbOutPortLineEdit->setPalette(palette_white);
2099 _cmbPasswordLineEdit->setPalette(palette_white);
2100 _cmbOutPathLineEdit->setPalette(palette_white);
2101 _cmbOutHostLineEdit->setEnabled(true);
2102 _cmbOutPortLineEdit->setEnabled(true);
2103 _cmbPasswordLineEdit->setEnabled(true);
2104 _cmbOutPathLineEdit->setEnabled(true);
2105 } else {
2106 _cmbOutHostLineEdit->setPalette(palette_gray);
2107 _cmbOutPortLineEdit->setPalette(palette_gray);
2108 _cmbPasswordLineEdit->setPalette(palette_gray);
2109 _cmbOutPathLineEdit->setPalette(palette_gray);
2110 _cmbOutHostLineEdit->setEnabled(false);
2111 _cmbOutPortLineEdit->setEnabled(false);
2112 _cmbPasswordLineEdit->setEnabled(false);
2113 _cmbOutPathLineEdit->setEnabled(false);
2114 }
2115 } else {
2116 _cmbMountpointLineEdit->setPalette(palette_gray);
2117 _cmbOutHostLineEdit->setPalette(palette_gray);
2118 _cmbOutPortLineEdit->setPalette(palette_gray);
2119 _cmbPasswordLineEdit->setPalette(palette_gray);
2120 _cmbOutPathLineEdit->setPalette(palette_gray);
2121 _cmbSP3PathLineEdit->setPalette(palette_gray);
2122 _cmbMountpointLineEdit->setEnabled(false);
2123 _cmbOutHostLineEdit->setEnabled(false);
2124 _cmbOutPortLineEdit->setEnabled(false);
2125 _cmbPasswordLineEdit->setEnabled(false);
2126 _cmbOutPathLineEdit->setEnabled(false);
2127 _cmbSP3PathLineEdit->setEnabled(false);
2128 }
2129 }
2130}
2131
2132//
2133////////////////////////////////////////////////////////////////////////////
2134void bncWindow::slotAddCmbRow() {
2135 int iRow = _cmbTable->rowCount();
2136 _cmbTable->insertRow(iRow);
2137 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2138 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2139 }
2140}
2141
2142//
2143////////////////////////////////////////////////////////////////////////////
2144void bncWindow::slotDelCmbRow() {
2145 int nRows = _cmbTable->rowCount();
2146 bool flg[nRows];
2147 for (int iRow = 0; iRow < nRows; iRow++) {
2148 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2149 flg[iRow] = true;
2150 }
2151 else {
2152 flg[iRow] = false;
2153 }
2154 }
2155 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2156 if (flg[iRow]) {
2157 _cmbTable->removeRow(iRow);
2158 }
2159 }
2160}
2161
2162//
2163////////////////////////////////////////////////////////////////////////////
2164void bncWindow::populateCmbTable() {
2165
2166 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2167 _cmbTable->removeRow(iRow);
2168 }
2169
2170 bncSettings settings;
2171
2172 int iRow = -1;
2173 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2174 while (it.hasNext()) {
2175 QStringList hlp = it.next().split(" ");
2176 if (hlp.size() > 2) {
2177 ++iRow;
2178 _cmbTable->insertRow(iRow);
2179 }
2180 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2181 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2182 }
2183 }
2184}
2185
2186//
2187////////////////////////////////////////////////////////////////////////////
2188void bncWindow::slotAddRtnetRow() {
2189 int iRow = _rtnetTable->rowCount();
2190 _rtnetTable->insertRow(iRow);
2191 for (int iCol = 0; iCol < _rtnetTable->columnCount(); iCol++) {
2192 _rtnetTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2193 }
2194}
2195
2196//
2197////////////////////////////////////////////////////////////////////////////
2198void bncWindow::slotDelRtnetRow() {
2199 int nRows = _rtnetTable->rowCount();
2200 bool flg[nRows];
2201 for (int iRow = 0; iRow < nRows; iRow++) {
2202 if (_rtnetTable->isItemSelected(_rtnetTable->item(iRow,1))) {
2203 flg[iRow] = true;
2204 }
2205 else {
2206 flg[iRow] = false;
2207 }
2208 }
2209 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2210 if (flg[iRow]) {
2211 _rtnetTable->removeRow(iRow);
2212 }
2213 }
2214}
2215
2216//
2217////////////////////////////////////////////////////////////////////////////
2218void bncWindow::populateRtnetTable() {
2219 for (int iRow = _rtnetTable->rowCount()-1; iRow >=0; iRow--) {
2220 _rtnetTable->removeRow(iRow);
2221 }
2222
2223 bncSettings settings;
2224
2225 int iRow = -1;
2226 QListIterator<QString> it(settings.value("rtnetUploadMountpoints").toStringList());
2227 while (it.hasNext()) {
2228 QStringList hlp = it.next().split(" ");
2229 if (hlp.size() > 2) {
2230 ++iRow;
2231 _rtnetTable->insertRow(iRow);
2232 }
2233 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2234 _rtnetTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2235 }
2236 }
2237}
2238
2239//
2240////////////////////////////////////////////////////////////////////////////
2241void bncWindow::slotSetRtnetTrafo() {
2242}
Note: See TracBrowser for help on using the repository browser.