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

Last change on this file since 3071 was 3071, checked in by weber, 13 years ago

WhatsThis for combination options added

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