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

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