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

Last change on this file since 3250 was 3250, checked in by mervart, 13 years ago
File size: 115.5 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "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 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").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(0);
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}
1518
1519// Retrieve Data
1520////////////////////////////////////////////////////////////////////////////
1521void bncWindow::slotStop() {
1522 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1523 QMessageBox::Yes, QMessageBox::No,
1524 QMessageBox::NoButton);
1525 if (iRet == QMessageBox::Yes) {
1526 ((bncApp*)qApp)->stopCombination();
1527 delete _caster; _caster = 0;
1528 delete _casterEph; _casterEph = 0;
1529 _actGetData->setEnabled(true);
1530 _actStop->setEnabled(false);
1531 }
1532}
1533
1534// Close Application gracefully
1535////////////////////////////////////////////////////////////////////////////
1536void bncWindow::closeEvent(QCloseEvent* event) {
1537
1538 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1539 QMessageBox::Yes, QMessageBox::No,
1540 QMessageBox::Cancel);
1541
1542 if (iRet == QMessageBox::Cancel) {
1543 event->ignore();
1544 return;
1545 }
1546 else if (iRet == QMessageBox::Yes) {
1547 slotSaveOptions();
1548 }
1549
1550 QMainWindow::closeEvent(event);
1551}
1552
1553// User changed the selection of mountPoints
1554////////////////////////////////////////////////////////////////////////////
1555void bncWindow::slotSelectionChanged() {
1556 if (_mountPointsTable->selectedItems().isEmpty()) {
1557 _actDeleteMountPoints->setEnabled(false);
1558 }
1559 else {
1560 _actDeleteMountPoints->setEnabled(true);
1561 }
1562}
1563
1564// Display Program Messages
1565////////////////////////////////////////////////////////////////////////////
1566void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1567
1568#ifdef DEBUG_RTCM2_2021
1569 const int maxBufferSize = 1000;
1570#else
1571 const int maxBufferSize = 10000;
1572#endif
1573
1574 if (! showOnScreen ) {
1575 return;
1576 }
1577
1578 QString txt = _log->toPlainText() + "\n" +
1579 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1580 _log->clear();
1581 _log->append(txt.right(maxBufferSize));
1582}
1583
1584// About Message
1585////////////////////////////////////////////////////////////////////////////
1586void bncWindow::slotAbout() {
1587 new bncAboutDlg(0);
1588}
1589
1590//Flowchart
1591////////////////////////////////////////////////////////////////////////////
1592void bncWindow::slotFlowchart() {
1593 new bncFlowchartDlg(0);
1594}
1595
1596// Help Window
1597////////////////////////////////////////////////////////////////////////////
1598void bncWindow::slotHelp() {
1599 QUrl url;
1600 url.setPath(":bnchelp.html");
1601 new bncHlpDlg(0, url);
1602}
1603
1604// Select Fonts
1605////////////////////////////////////////////////////////////////////////////
1606void bncWindow::slotFontSel() {
1607 bool ok;
1608 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1609 if (ok) {
1610 bncSettings settings;
1611 settings.setValue("font", newFont.toString());
1612 QApplication::setFont(newFont);
1613 int ww = QFontMetrics(newFont).width('w');
1614 setMinimumSize(60*ww, 80*ww);
1615 resize(60*ww, 80*ww);
1616 }
1617}
1618
1619// Whats This Help
1620void bncWindow::slotWhatsThis() {
1621 QWhatsThis::enterWhatsThisMode();
1622}
1623
1624//
1625////////////////////////////////////////////////////////////////////////////
1626void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1627 _bncFigure->updateMountPoints();
1628 _bncFigureLate->updateMountPoints();
1629
1630 populateMountPointsTable();
1631 bncSettings settings;
1632 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1633 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1634 QListIterator<bncGetThread*> iTh(threads);
1635 while (iTh.hasNext()) {
1636 bncGetThread* thread = iTh.next();
1637 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1638 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1639 "@" + _mountPointsTable->item(iRow, 1)->text() );
1640 if (url == thread->mountPoint() &&
1641 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1642 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1643 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1644 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1645 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1646 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1647 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1648 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1649 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1650 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1651 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1652 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1653 disconnect(thread,
1654 SIGNAL(newPosition(bncTime, double, double, double)),
1655 _bncFigurePPP,
1656 SLOT(slotNewPosition(bncTime, double, double, double)));
1657 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1658 _bncFigurePPP,
1659 SLOT(slotNewPosition(bncTime, double, double, double)));
1660 }
1661 break;
1662 }
1663 }
1664 }
1665}
1666
1667//
1668////////////////////////////////////////////////////////////////////////////
1669void bncWindow::CreateMenu() {
1670 // Create Menus
1671 // ------------
1672 _menuFile = menuBar()->addMenu(tr("&File"));
1673 _menuFile->addAction(_actFontSel);
1674 _menuFile->addSeparator();
1675 _menuFile->addAction(_actSaveOpt);
1676 _menuFile->addSeparator();
1677 _menuFile->addAction(_actQuit);
1678
1679 _menuHlp = menuBar()->addMenu(tr("&Help"));
1680 _menuHlp->addAction(_actHelp);
1681 _menuHlp->addAction(_actFlowchart);
1682 _menuHlp->addAction(_actAbout);
1683}
1684
1685// Toolbar
1686////////////////////////////////////////////////////////////////////////////
1687void bncWindow::AddToolbar() {
1688 // Tool (Command) Bar
1689 // ------------------
1690 QToolBar* toolBar = new QToolBar;
1691 addToolBar(Qt::BottomToolBarArea, toolBar);
1692 toolBar->setMovable(false);
1693 toolBar->addAction(_actAddMountPoints);
1694 toolBar->addAction(_actDeleteMountPoints);
1695 toolBar->addAction(_actGetData);
1696 toolBar->addAction(_actStop);
1697 toolBar->addWidget(new QLabel(" "));
1698 toolBar->addAction(_actwhatsthis);
1699}
1700
1701// About
1702////////////////////////////////////////////////////////////////////////////
1703bncAboutDlg::bncAboutDlg(QWidget* parent) :
1704 QDialog(parent) {
1705
1706 QTextBrowser* tb = new QTextBrowser;
1707 QUrl url; url.setPath(":bncabout.html");
1708 tb->setSource(url);
1709 tb->setReadOnly(true);
1710
1711 int ww = QFontMetrics(font()).width('w');
1712 QPushButton* _closeButton = new QPushButton("Close");
1713 _closeButton->setMaximumWidth(10*ww);
1714 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1715
1716 QGridLayout* dlgLayout = new QGridLayout();
1717 QLabel* img = new QLabel();
1718 img->setPixmap(QPixmap(":ntrip-logo.png"));
1719 dlgLayout->addWidget(img, 0,0);
1720 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1721 dlgLayout->addWidget(tb,1,0,1,2);
1722 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1723
1724 setLayout(dlgLayout);
1725 resize(60*ww, 60*ww);
1726 setWindowTitle("About BNC");
1727 show();
1728}
1729
1730//
1731////////////////////////////////////////////////////////////////////////////
1732bncAboutDlg::~bncAboutDlg() {
1733};
1734
1735// Flowchart
1736////////////////////////////////////////////////////////////////////////////
1737bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1738 QDialog(parent) {
1739
1740 int ww = QFontMetrics(font()).width('w');
1741 QPushButton* _closeButton = new QPushButton("Close");
1742 _closeButton->setMaximumWidth(10*ww);
1743 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1744
1745 QGridLayout* dlgLayout = new QGridLayout();
1746 QLabel* img = new QLabel();
1747 img->setPixmap(QPixmap(":bncflowchart.png"));
1748 dlgLayout->addWidget(img, 0,0);
1749 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1750
1751 setLayout(dlgLayout);
1752 setWindowTitle("Flow Chart");
1753 show();
1754}
1755
1756//
1757////////////////////////////////////////////////////////////////////////////
1758bncFlowchartDlg::~bncFlowchartDlg() {
1759};
1760
1761// Bnc Text
1762////////////////////////////////////////////////////////////////////////////
1763void bncWindow::slotBncTextChanged(){
1764
1765 QPalette palette_white(QColor(255, 255, 255));
1766 QPalette palette_gray(QColor(230, 230, 230));
1767 bncSettings settings;
1768
1769 // Proxy
1770 //------
1771 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1772 if (!_proxyHostLineEdit->text().isEmpty()) {
1773 _proxyPortLineEdit->setStyleSheet("background-color: white");
1774 _proxyPortLineEdit->setEnabled(true);
1775 }
1776 else {
1777 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1778 _proxyPortLineEdit->setEnabled(false);
1779 }
1780 }
1781
1782 // RINEX Observations
1783 // ------------------
1784 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1785 if (!_rnxPathLineEdit->text().isEmpty()) {
1786 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1787 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1788 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1789 _rnxV3CheckBox->setPalette(palette_white);
1790 _rnxIntrComboBox->setStyleSheet("background-color: white");
1791 _rnxSamplSpinBox->setEnabled(true);
1792 _rnxSkelLineEdit->setEnabled(true);
1793 _rnxScrpLineEdit->setEnabled(true);
1794 _rnxV3CheckBox->setEnabled(true);
1795 _rnxIntrComboBox->setEnabled(true);
1796 }
1797 else {
1798 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1799 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1800 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1801 _rnxV3CheckBox->setPalette(palette_gray);
1802 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1803 _rnxSamplSpinBox->setEnabled(false);
1804 _rnxSkelLineEdit->setEnabled(false);
1805 _rnxScrpLineEdit->setEnabled(false);
1806 _rnxV3CheckBox->setEnabled(false);
1807 _rnxIntrComboBox->setEnabled(false);
1808 }
1809 }
1810
1811 // RINEX Ephemeris
1812 // ---------------
1813 if (sender() == 0 ||
1814 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1815 if (!_ephPathLineEdit->text().isEmpty() ||
1816 !_outEphPortLineEdit->text().isEmpty()) {
1817 _ephIntrComboBox->setStyleSheet("background-color: white");
1818 _ephV3CheckBox->setPalette(palette_white);
1819 _ephIntrComboBox->setEnabled(true);
1820 _ephV3CheckBox->setEnabled(true);
1821 }
1822 else {
1823 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1824 _ephV3CheckBox->setPalette(palette_gray);
1825 _ephIntrComboBox->setEnabled(false);
1826 _ephV3CheckBox->setEnabled(false);
1827 }
1828 }
1829
1830 // Broadcast Corrections
1831 // ---------------------
1832 if (sender() == 0 ||
1833 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1834 if (!_corrPathLineEdit->text().isEmpty() ||
1835 !_corrPortLineEdit->text().isEmpty()) {
1836 _corrIntrComboBox->setStyleSheet("background-color: white");
1837 _corrIntrComboBox->setEnabled(true);
1838 }
1839 else {
1840 _corrIntrComboBox->setStyleSheet("background-color: white");
1841 _corrIntrComboBox->setEnabled(true);
1842 }
1843 }
1844
1845 // Feed Engine
1846 // -----------
1847 if (sender() == 0 ||
1848 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1849 if ( !_outPortLineEdit->text().isEmpty() ||
1850 !_outFileLineEdit->text().isEmpty()) {
1851 _waitTimeSpinBox->setStyleSheet("background-color: white");
1852 _binSamplSpinBox->setStyleSheet("background-color: white");
1853 _waitTimeSpinBox->setEnabled(true);
1854 _binSamplSpinBox->setEnabled(true);
1855 }
1856 else {
1857 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1858 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1859 _waitTimeSpinBox->setEnabled(false);
1860 _binSamplSpinBox->setEnabled(false);
1861 }
1862 }
1863
1864 // Serial Output
1865 // -------------
1866 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1867 sender() == _serialAutoNMEAComboBox) {
1868 if (!_serialMountPointLineEdit->text().isEmpty()) {
1869 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1870 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1871 _serialParityComboBox->setStyleSheet("background-color: white");
1872 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1873 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1874 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1875 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1876 _serialPortNameLineEdit->setEnabled(true);
1877 _serialBaudRateComboBox->setEnabled(true);
1878 _serialParityComboBox->setEnabled(true);
1879 _serialDataBitsComboBox->setEnabled(true);
1880 _serialStopBitsComboBox->setEnabled(true);
1881 _serialFlowControlComboBox->setEnabled(true);
1882 _serialAutoNMEAComboBox->setEnabled(true);
1883 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1884 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1885 _serialHeightNMEALineEdit->setEnabled(true);
1886 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1887 _serialFileNMEALineEdit->setEnabled(false);
1888 }
1889 else {
1890 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1891 _serialHeightNMEALineEdit->setEnabled(false);
1892 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1893 _serialFileNMEALineEdit->setEnabled(true);
1894 }
1895 }
1896 else {
1897 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1898 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1899 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1900 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1901 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1902 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1903 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1904 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1905 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1906 _serialPortNameLineEdit->setEnabled(false);
1907 _serialBaudRateComboBox->setEnabled(false);
1908 _serialParityComboBox->setEnabled(false);
1909 _serialDataBitsComboBox->setEnabled(false);
1910 _serialStopBitsComboBox->setEnabled(false);
1911 _serialFlowControlComboBox->setEnabled(false);
1912 _serialAutoNMEAComboBox->setEnabled(false);
1913 _serialHeightNMEALineEdit->setEnabled(false);
1914 _serialFileNMEALineEdit->setEnabled(false);
1915 }
1916 }
1917
1918 // Outages
1919 // -------
1920 if (sender() == 0 || sender() == _obsRateComboBox) {
1921 if (!_obsRateComboBox->currentText().isEmpty()) {
1922 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1923 _adviseFailSpinBox->setStyleSheet("background-color: white");
1924 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1925 _adviseFailSpinBox->setEnabled(true);
1926 _adviseRecoSpinBox->setEnabled(true);
1927 _adviseScriptLineEdit->setEnabled(true);
1928 } else {
1929 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1930 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1931 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1932 _adviseFailSpinBox->setEnabled(false);
1933 _adviseRecoSpinBox->setEnabled(false);
1934 _adviseScriptLineEdit->setEnabled(false);
1935 }
1936 }
1937
1938 // Miscellaneous
1939 // -------------
1940 if (sender() == 0 || sender() == _miscMountLineEdit) {
1941 if (!_miscMountLineEdit->text().isEmpty()) {
1942 _perfIntrComboBox->setStyleSheet("background-color: white");
1943 _scanRTCMCheckBox->setPalette(palette_white);
1944 _perfIntrComboBox->setEnabled(true);
1945 _scanRTCMCheckBox->setEnabled(true);
1946 } else {
1947 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1948 _scanRTCMCheckBox->setPalette(palette_gray);
1949 _perfIntrComboBox->setEnabled(false);
1950 _scanRTCMCheckBox->setEnabled(false);
1951 }
1952 }
1953
1954 // PPP Client
1955 // ----------
1956 if (sender() == 0
1957 || sender() == _pppMountLineEdit
1958 || sender() == _pppCorrMountLineEdit
1959 || sender() == _pppRefCrdXLineEdit
1960 || sender() == _pppRefCrdYLineEdit
1961 || sender() == _pppRefCrdZLineEdit
1962 || sender() == _pppSync
1963 || sender() == _pppSPPComboBox
1964 || sender() == _pppQuickStartLineEdit
1965 || sender() == _pppEstTropoCheckBox
1966 || sender() == _pppUsePhaseCheckBox
1967 || sender() == _pppAntexLineEdit ) {
1968 if ((!_pppMountLineEdit->text().isEmpty() &&
1969 !_pppCorrMountLineEdit->text().isEmpty()) ||
1970 ( !_pppMountLineEdit->text().isEmpty() &&
1971 _pppSPPComboBox->currentText() == "SPP")) {
1972 _pppSPPComboBox->setPalette(palette_white);
1973 _pppNMEALineEdit->setPalette(palette_white);
1974 _pppNMEAPortLineEdit->setPalette(palette_white);
1975 _pppRefCrdXLineEdit->setPalette(palette_white);
1976 _pppRefCrdYLineEdit->setPalette(palette_white);
1977 _pppRefCrdZLineEdit->setPalette(palette_white);
1978 _pppUsePhaseCheckBox->setPalette(palette_white);
1979 _pppPlotCoordinates->setPalette(palette_white);
1980 _pppEstTropoCheckBox->setPalette(palette_white);
1981 _pppGLONASSCheckBox->setPalette(palette_white);
1982 _pppGalileoCheckBox->setPalette(palette_white);
1983 _pppAntexLineEdit->setPalette(palette_white);
1984 _pppSPPComboBox->setEnabled(true);
1985 _pppNMEALineEdit->setEnabled(true);
1986 _pppNMEAPortLineEdit->setEnabled(true);
1987 _pppRefCrdXLineEdit->setEnabled(true);
1988 _pppRefCrdYLineEdit->setEnabled(true);
1989 _pppRefCrdZLineEdit->setEnabled(true);
1990 _pppUsePhaseCheckBox->setEnabled(true);
1991 _pppPlotCoordinates->setEnabled(true);
1992 _pppEstTropoCheckBox->setEnabled(true);
1993 _pppGLONASSCheckBox->setEnabled(true);
1994 _pppGalileoCheckBox->setEnabled(true);
1995 _pppRefCrdXLineEdit->setPalette(palette_white);
1996 _pppRefCrdYLineEdit->setPalette(palette_white);
1997 _pppRefCrdZLineEdit->setPalette(palette_white);
1998 _pppAntexLineEdit->setEnabled(true);
1999 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
2000 !_pppRefCrdYLineEdit->text().isEmpty() &&
2001 !_pppRefCrdZLineEdit->text().isEmpty()) {
2002 _pppAverageLineEdit->setPalette(palette_white);
2003 _pppQuickStartLineEdit->setPalette(palette_white);
2004 _pppAverageLineEdit->setEnabled(true);
2005 _pppQuickStartLineEdit->setEnabled(true);
2006 }
2007 else {
2008 _pppAverageLineEdit->setPalette(palette_gray);
2009 _pppQuickStartLineEdit->setPalette(palette_gray);
2010 _pppAverageLineEdit->setEnabled(false);
2011 _pppQuickStartLineEdit->setEnabled(false);
2012 }
2013 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
2014 !_pppRefCrdYLineEdit->text().isEmpty() &&
2015 !_pppRefCrdZLineEdit->text().isEmpty() &&
2016 !_pppQuickStartLineEdit->text().isEmpty()) {
2017 _pppMaxSolGapLineEdit->setPalette(palette_white);
2018 _pppMaxSolGapLineEdit->setEnabled(true);
2019 }
2020 else {
2021 _pppMaxSolGapLineEdit->setPalette(palette_gray);
2022 _pppMaxSolGapLineEdit->setEnabled(false);
2023 }
2024 if (!_pppAntexLineEdit->text().isEmpty() ) {
2025 _pppAntennaLineEdit->setEnabled(true);
2026 _pppApplySatAntCheckBox->setEnabled(true);
2027 _pppAntennaLineEdit->setPalette(palette_white);
2028 _pppApplySatAntCheckBox->setPalette(palette_white);
2029 }
2030 else {
2031 _pppAntennaLineEdit->setEnabled(false);
2032 _pppApplySatAntCheckBox->setEnabled(false);
2033 _pppAntennaLineEdit->setPalette(palette_gray);
2034 _pppApplySatAntCheckBox->setPalette(palette_gray);
2035 }
2036 _pppSigCLineEdit->setPalette(palette_white);
2037 _pppSigCLineEdit->setEnabled(true);
2038 _pppSigCrd0->setPalette(palette_white);
2039 _pppSigCrd0->setEnabled(true);
2040 _pppSigCrdP->setPalette(palette_white);
2041 _pppSigCrdP->setEnabled(true);
2042 if (_pppEstTropoCheckBox->isChecked()
2043 && !_pppMountLineEdit->text().isEmpty()) {
2044 _pppSigTrp0->setPalette(palette_white);
2045 _pppSigTrp0->setEnabled(true);
2046 _pppSigTrpP->setPalette(palette_white);
2047 _pppSigTrpP->setEnabled(true);
2048 }
2049 else {
2050 _pppSigTrp0->setPalette(palette_gray);
2051 _pppSigTrp0->setEnabled(false);
2052 _pppSigTrpP->setPalette(palette_gray);
2053 _pppSigTrpP->setEnabled(false);
2054 }
2055 if (_pppUsePhaseCheckBox->isChecked()
2056 && !_pppMountLineEdit->text().isEmpty()) {
2057 _pppSigPLineEdit->setPalette(palette_white);
2058 _pppSigPLineEdit->setEnabled(true);
2059 }
2060 else {
2061 _pppSigPLineEdit->setPalette(palette_gray);
2062 _pppSigPLineEdit->setEnabled(false);
2063 }
2064 if (_pppSPPComboBox->currentText() == "PPP") {
2065 _pppSync->setPalette(palette_white);
2066 _pppSync->setEnabled(true);
2067 }
2068 else {
2069 _pppSync->setPalette(palette_gray);
2070 _pppSync->setEnabled(false);
2071 }
2072 } else {
2073 _pppSPPComboBox->setPalette(palette_gray);
2074 _pppNMEALineEdit->setPalette(palette_gray);
2075 _pppNMEAPortLineEdit->setPalette(palette_gray);
2076 _pppRefCrdXLineEdit->setPalette(palette_gray);
2077 _pppRefCrdYLineEdit->setPalette(palette_gray);
2078 _pppRefCrdZLineEdit->setPalette(palette_gray);
2079 _pppSync->setPalette(palette_gray);
2080 _pppUsePhaseCheckBox->setPalette(palette_gray);
2081 _pppPlotCoordinates->setPalette(palette_gray);
2082 _pppEstTropoCheckBox->setPalette(palette_gray);
2083 _pppGLONASSCheckBox->setPalette(palette_gray);
2084 _pppGalileoCheckBox->setPalette(palette_gray);
2085 _pppSigCLineEdit->setPalette(palette_gray);
2086 _pppSigPLineEdit->setPalette(palette_gray);
2087 _pppSigCrd0->setPalette(palette_gray);
2088 _pppSigCrdP->setPalette(palette_gray);
2089 _pppSigTrp0->setPalette(palette_gray);
2090 _pppSigTrpP->setPalette(palette_gray);
2091 _pppAverageLineEdit->setPalette(palette_gray);
2092 _pppQuickStartLineEdit->setPalette(palette_gray);
2093 _pppMaxSolGapLineEdit->setPalette(palette_gray);
2094 _pppAntexLineEdit->setPalette(palette_white);
2095 _pppAntennaLineEdit->setPalette(palette_gray);
2096 _pppApplySatAntCheckBox->setPalette(palette_gray);
2097 _pppSPPComboBox->setEnabled(false);
2098 _pppNMEALineEdit->setEnabled(false);
2099 _pppNMEAPortLineEdit->setEnabled(false);
2100 _pppRefCrdXLineEdit->setEnabled(false);
2101 _pppRefCrdYLineEdit->setEnabled(false);
2102 _pppRefCrdZLineEdit->setEnabled(false);
2103 _pppSync->setEnabled(false);
2104 _pppUsePhaseCheckBox->setEnabled(false);
2105 _pppPlotCoordinates->setEnabled(false);
2106 _pppEstTropoCheckBox->setEnabled(false);
2107 _pppGLONASSCheckBox->setEnabled(false);
2108 _pppGalileoCheckBox->setEnabled(false);
2109 _pppSigCLineEdit->setEnabled(false);
2110 _pppSigPLineEdit->setEnabled(false);
2111 _pppSigCrd0->setEnabled(false);
2112 _pppSigCrdP->setEnabled(false);
2113 _pppSigTrp0->setEnabled(false);
2114 _pppSigTrpP->setEnabled(false);
2115 _pppAverageLineEdit->setEnabled(false);
2116 _pppQuickStartLineEdit->setEnabled(false);
2117 _pppMaxSolGapLineEdit->setEnabled(false);
2118 _pppAntexLineEdit->setEnabled(true);
2119 _pppAntennaLineEdit->setEnabled(false);
2120 _pppApplySatAntCheckBox->setEnabled(false);
2121 }
2122//
2123 if (_pppMountLineEdit->text().isEmpty()) {
2124 _pppCorrMountLineEdit->setPalette(palette_gray);
2125 _pppCorrMountLineEdit->setEnabled(false);
2126 } else {
2127 _pppCorrMountLineEdit->setPalette(palette_white);
2128 _pppCorrMountLineEdit->setEnabled(true);
2129 if (_pppCorrMountLineEdit->text().isEmpty()) {
2130 _pppSPPComboBox->setPalette(palette_white);
2131 _pppSPPComboBox->setEnabled(true);
2132 }
2133 }
2134 if (_pppSPPComboBox->currentText() == "SPP") {
2135 _pppCorrMountLineEdit->setPalette(palette_gray);
2136 _pppCorrMountLineEdit->setEnabled(false);
2137 }
2138 }
2139}
2140
2141//
2142////////////////////////////////////////////////////////////////////////////
2143void bncWindow::slotAddCmbRow() {
2144 int iRow = _cmbTable->rowCount();
2145 _cmbTable->insertRow(iRow);
2146 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2147 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2148 }
2149}
2150
2151//
2152////////////////////////////////////////////////////////////////////////////
2153void bncWindow::slotDelCmbRow() {
2154 int nRows = _cmbTable->rowCount();
2155 bool flg[nRows];
2156 for (int iRow = 0; iRow < nRows; iRow++) {
2157 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2158 flg[iRow] = true;
2159 }
2160 else {
2161 flg[iRow] = false;
2162 }
2163 }
2164 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2165 if (flg[iRow]) {
2166 _cmbTable->removeRow(iRow);
2167 }
2168 }
2169}
2170
2171//
2172////////////////////////////////////////////////////////////////////////////
2173void bncWindow::populateCmbTable() {
2174
2175 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2176 _cmbTable->removeRow(iRow);
2177 }
2178
2179 bncSettings settings;
2180
2181 int iRow = -1;
2182 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2183 while (it.hasNext()) {
2184 QStringList hlp = it.next().split(" ");
2185 if (hlp.size() > 2) {
2186 ++iRow;
2187 _cmbTable->insertRow(iRow);
2188 }
2189 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2190 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2191 }
2192 }
2193}
2194
2195//
2196////////////////////////////////////////////////////////////////////////////
2197void bncWindow::slotAddUploadRow() {
2198 int iRow = _uploadTable->rowCount();
2199 _uploadTable->insertRow(iRow);
2200 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2201 if (iCol == 3) {
2202 QLineEdit* passwd = new QLineEdit();
2203 passwd->setFrame(false);
2204 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2205 _uploadTable->setCellWidget(iRow, iCol, passwd);
2206 }
2207 else if (iCol == 4) {
2208 QComboBox* system = new QComboBox();
2209 system->setEditable(false);
2210 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2211 system->setFrame(false);
2212 _uploadTable->setCellWidget(iRow, iCol, system);
2213 }
2214 else if (iCol == 5) {
2215 QCheckBox* com = new QCheckBox();
2216 _uploadTable->setCellWidget(iRow, iCol, com);
2217 }
2218 else if (iCol == 8) {
2219 bncTableItem* bncIt = new bncTableItem();
2220 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2221 _uploadTable->setItem(iRow, iCol, bncIt);
2222 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2223 }
2224 else {
2225 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2226 }
2227 }
2228}
2229
2230//
2231////////////////////////////////////////////////////////////////////////////
2232void bncWindow::slotDelUploadRow() {
2233 ((bncApp*)qApp)->_uploadTableItems.clear();
2234 int nRows = _uploadTable->rowCount();
2235 bool flg[nRows];
2236 for (int iRow = 0; iRow < nRows; iRow++) {
2237 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2238 flg[iRow] = true;
2239 }
2240 else {
2241 flg[iRow] = false;
2242 }
2243 }
2244 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2245 if (flg[iRow]) {
2246 _uploadTable->removeRow(iRow);
2247 }
2248 }
2249 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2250 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2251 (bncTableItem*) _uploadTable->item(iRow, 8);
2252 }
2253}
2254
2255//
2256////////////////////////////////////////////////////////////////////////////
2257void bncWindow::populateUploadTable() {
2258 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2259 _uploadTable->removeRow(iRow);
2260 }
2261
2262 bncSettings settings;
2263
2264 int iRow = -1;
2265 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2266 while (it.hasNext()) {
2267 QStringList hlp = it.next().split(",");
2268 if (hlp.size() > 6) {
2269 ++iRow;
2270 _uploadTable->insertRow(iRow);
2271 }
2272 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2273 if (iCol == 3) {
2274 QLineEdit* passwd = new QLineEdit();
2275 passwd->setFrame(false);
2276 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2277 passwd->setText(hlp[iCol]);
2278 _uploadTable->setCellWidget(iRow, iCol, passwd);
2279 }
2280 else if (iCol == 4) {
2281 QComboBox* system = new QComboBox();
2282 system->setEditable(false);
2283 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2284 system->setFrame(false);
2285 system->setCurrentIndex(system->findText(hlp[iCol]));
2286 _uploadTable->setCellWidget(iRow, iCol, system);
2287 }
2288 else if (iCol == 5) {
2289 QCheckBox* com = new QCheckBox();
2290 if (hlp[iCol].toInt() == Qt::Checked) {
2291 com->setCheckState(Qt::Checked);
2292 }
2293 _uploadTable->setCellWidget(iRow, iCol, com);
2294 }
2295 else if (iCol == 8) {
2296 bncTableItem* bncIt = new bncTableItem();
2297 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2298 _uploadTable->setItem(iRow, iCol, bncIt);
2299 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2300 }
2301 else {
2302 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2303 }
2304 }
2305 }
2306}
2307
2308//
2309////////////////////////////////////////////////////////////////////////////
2310void bncWindow::slotSetUploadTrafo() {
2311 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2312 dlg->exec();
2313 delete dlg;
2314}
Note: See TracBrowser for help on using the repository browser.