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

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