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

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