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

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