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

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