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

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