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

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