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

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