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

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