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

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