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

Last change on this file since 3081 was 3075, checked in by mervart, 14 years ago
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 the weight to be applied for this stream in the combination.</p><p>Note that an appropriate 'Wait for full epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</p><p>Note further that the sequence of rows in the 'Combination Table' is of importance because the orbit information in the final combination stream is just copied from the stream listed in the first row. Hence the first line in the 'Combination Table' defines a kind of 'Master AC'. The update rate of the combination product follows the 'Master AC's update rate.</p><p>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. If 'Host', 'Port' and 'Password' are set, the combination stream will be uploaded to the specified Ntrip Broadcaster.</p><p>Note that the mountpoint defined here can be introduce as 'Obs Mountpoint' under the 'PPP (1)' tab to carry out a Precise Point Positioning through directly using the combination stream without prior upload to the Ntrip Broadcaster."));
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("Antennas"), 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("Rec. Ant. 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 else {
1300 settings.setValue("combineStreams", "");
1301 }
1302 settings.setValue("cmbOutHost", _cmbOutHostLineEdit->text());
1303 settings.setValue("cmbOutPort", _cmbOutPortLineEdit->text());
1304 settings.setValue("cmbMountpoint", _cmbMountpointLineEdit->text());
1305 settings.setValue("cmbPassword", _cmbPasswordLineEdit->text());
1306 settings.setValue("cmbOutPath", _cmbOutPathLineEdit->text());
1307 settings.setValue("cmbSP3Path", _cmbSP3PathLineEdit->text());
1308
1309 if (_caster) {
1310 _caster->slotReadMountPoints();
1311 }
1312 settings.sync();
1313}
1314
1315// All get slots terminated
1316////////////////////////////////////////////////////////////////////////////
1317void bncWindow::slotGetThreadsFinished() {
1318 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1319 delete _caster; _caster = 0;
1320 _actGetData->setEnabled(true);
1321 _actStop->setEnabled(false);
1322}
1323
1324// Retrieve Data
1325////////////////////////////////////////////////////////////////////////////
1326void bncWindow::slotGetData() {
1327 slotSaveOptions();
1328
1329 _bncFigurePPP->reset();
1330
1331 _actDeleteMountPoints->setEnabled(false);
1332 _actGetData->setEnabled(false);
1333 _actStop->setEnabled(true);
1334
1335 _caster = new bncCaster(_outFileLineEdit->text(),
1336 _outPortLineEdit->text().toInt());
1337
1338 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1339 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1340 ((bncApp*)qApp)->initCombination();
1341
1342 connect(_caster, SIGNAL(getThreadsFinished()),
1343 this, SLOT(slotGetThreadsFinished()));
1344
1345 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1346 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1347
1348 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1349
1350 bncSettings settings;
1351
1352 QDir rnxdir(settings.value("rnxPath").toString());
1353 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1354
1355 QString rnx_file = settings.value("rnxScript").toString();
1356 if ( !rnx_file.isEmpty() ) {
1357 QFile rnxfile(settings.value("rnxScript").toString());
1358 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1359 }
1360
1361 QDir ephdir(settings.value("ephPath").toString());
1362 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1363
1364 QDir corrdir(settings.value("corrPath").toString());
1365 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1366
1367 QString advise_file = settings.value("adviseScript").toString();
1368 if ( !advise_file.isEmpty() ) {
1369 QFile advisefile(settings.value("adviseScript").toString());
1370 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1371 }
1372
1373 QString ant_file = settings.value("pppAntex").toString();
1374 if ( !ant_file.isEmpty() ) {
1375 QFile anxfile(settings.value("pppAntex").toString());
1376 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1377 }
1378
1379 QDir cmbOutDir(settings.value("cmbOutPath").toString());
1380 if (!cmbOutDir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find directory for saving combination results in ASCII format", true);
1381
1382 QDir cmbSP3dir(settings.value("cmbSP3Path").toString());
1383 if (!cmbSP3dir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find directory for saving combination results in SP3 format", true);
1384
1385 _caster->slotReadMountPoints();
1386}
1387
1388// Retrieve Data
1389////////////////////////////////////////////////////////////////////////////
1390void bncWindow::slotStop() {
1391 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1392 QMessageBox::Yes, QMessageBox::No,
1393 QMessageBox::NoButton);
1394 if (iRet == QMessageBox::Yes) {
1395 delete _caster; _caster = 0;
1396 _actGetData->setEnabled(true);
1397 _actStop->setEnabled(false);
1398 }
1399}
1400
1401// Close Application gracefully
1402////////////////////////////////////////////////////////////////////////////
1403void bncWindow::closeEvent(QCloseEvent* event) {
1404
1405 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1406 QMessageBox::Yes, QMessageBox::No,
1407 QMessageBox::Cancel);
1408
1409 if (iRet == QMessageBox::Cancel) {
1410 event->ignore();
1411 return;
1412 }
1413 else if (iRet == QMessageBox::Yes) {
1414 slotSaveOptions();
1415 }
1416
1417 QMainWindow::closeEvent(event);
1418}
1419
1420// User changed the selection of mountPoints
1421////////////////////////////////////////////////////////////////////////////
1422void bncWindow::slotSelectionChanged() {
1423 if (_mountPointsTable->selectedItems().isEmpty()) {
1424 _actDeleteMountPoints->setEnabled(false);
1425 }
1426 else {
1427 _actDeleteMountPoints->setEnabled(true);
1428 }
1429}
1430
1431// Display Program Messages
1432////////////////////////////////////////////////////////////////////////////
1433void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1434
1435#ifdef DEBUG_RTCM2_2021
1436 const int maxBufferSize = 1000;
1437#else
1438 const int maxBufferSize = 10000;
1439#endif
1440
1441 if (! showOnScreen ) {
1442 return;
1443 }
1444
1445 QString txt = _log->toPlainText() + "\n" +
1446 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1447 _log->clear();
1448 _log->append(txt.right(maxBufferSize));
1449}
1450
1451// About Message
1452////////////////////////////////////////////////////////////////////////////
1453void bncWindow::slotAbout() {
1454 new bncAboutDlg(0);
1455}
1456
1457//Flowchart
1458////////////////////////////////////////////////////////////////////////////
1459void bncWindow::slotFlowchart() {
1460 new bncFlowchartDlg(0);
1461}
1462
1463// Help Window
1464////////////////////////////////////////////////////////////////////////////
1465void bncWindow::slotHelp() {
1466 QUrl url;
1467 url.setPath(":bnchelp.html");
1468 new bncHlpDlg(0, url);
1469}
1470
1471// Select Fonts
1472////////////////////////////////////////////////////////////////////////////
1473void bncWindow::slotFontSel() {
1474 bool ok;
1475 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1476 if (ok) {
1477 bncSettings settings;
1478 settings.setValue("font", newFont.toString());
1479 QApplication::setFont(newFont);
1480 int ww = QFontMetrics(newFont).width('w');
1481 setMinimumSize(60*ww, 80*ww);
1482 resize(60*ww, 80*ww);
1483 }
1484}
1485
1486// Whats This Help
1487void bncWindow::slotWhatsThis() {
1488 QWhatsThis::enterWhatsThisMode();
1489}
1490
1491//
1492////////////////////////////////////////////////////////////////////////////
1493void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1494 _bncFigure->updateMountPoints();
1495 _bncFigureLate->updateMountPoints();
1496
1497 populateMountPointsTable();
1498 bncSettings settings;
1499 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1500 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1501 QListIterator<bncGetThread*> iTh(threads);
1502 while (iTh.hasNext()) {
1503 bncGetThread* thread = iTh.next();
1504 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1505 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1506 "@" + _mountPointsTable->item(iRow, 1)->text() );
1507 if (url == thread->mountPoint() &&
1508 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1509 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1510 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1511 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1512 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1513 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1514 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1515 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1516 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1517 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1518 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1519 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1520 disconnect(thread,
1521 SIGNAL(newPosition(bncTime, double, double, double)),
1522 _bncFigurePPP,
1523 SLOT(slotNewPosition(bncTime, double, double, double)));
1524 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1525 _bncFigurePPP,
1526 SLOT(slotNewPosition(bncTime, double, double, double)));
1527 }
1528 break;
1529 }
1530 }
1531 }
1532}
1533
1534//
1535////////////////////////////////////////////////////////////////////////////
1536void bncWindow::CreateMenu() {
1537 // Create Menus
1538 // ------------
1539 _menuFile = menuBar()->addMenu(tr("&File"));
1540 _menuFile->addAction(_actFontSel);
1541 _menuFile->addSeparator();
1542 _menuFile->addAction(_actSaveOpt);
1543 _menuFile->addSeparator();
1544 _menuFile->addAction(_actQuit);
1545
1546 _menuHlp = menuBar()->addMenu(tr("&Help"));
1547 _menuHlp->addAction(_actHelp);
1548 _menuHlp->addAction(_actFlowchart);
1549 _menuHlp->addAction(_actAbout);
1550}
1551
1552// Toolbar
1553////////////////////////////////////////////////////////////////////////////
1554void bncWindow::AddToolbar() {
1555 // Tool (Command) Bar
1556 // ------------------
1557 QToolBar* toolBar = new QToolBar;
1558 addToolBar(Qt::BottomToolBarArea, toolBar);
1559 toolBar->setMovable(false);
1560 toolBar->addAction(_actAddMountPoints);
1561 toolBar->addAction(_actDeleteMountPoints);
1562 toolBar->addAction(_actGetData);
1563 toolBar->addAction(_actStop);
1564 toolBar->addWidget(new QLabel(" "));
1565 toolBar->addAction(_actwhatsthis);
1566}
1567
1568// About
1569////////////////////////////////////////////////////////////////////////////
1570bncAboutDlg::bncAboutDlg(QWidget* parent) :
1571 QDialog(parent) {
1572
1573 QTextBrowser* tb = new QTextBrowser;
1574 QUrl url; url.setPath(":bncabout.html");
1575 tb->setSource(url);
1576 tb->setReadOnly(true);
1577
1578 int ww = QFontMetrics(font()).width('w');
1579 QPushButton* _closeButton = new QPushButton("Close");
1580 _closeButton->setMaximumWidth(10*ww);
1581 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1582
1583 QGridLayout* dlgLayout = new QGridLayout();
1584 QLabel* img = new QLabel();
1585 img->setPixmap(QPixmap(":ntrip-logo.png"));
1586 dlgLayout->addWidget(img, 0,0);
1587 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1588 dlgLayout->addWidget(tb,1,0,1,2);
1589 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1590
1591 setLayout(dlgLayout);
1592 resize(60*ww, 60*ww);
1593 setWindowTitle("About BNC");
1594 show();
1595}
1596
1597//
1598////////////////////////////////////////////////////////////////////////////
1599bncAboutDlg::~bncAboutDlg() {
1600};
1601
1602// Flowchart
1603////////////////////////////////////////////////////////////////////////////
1604bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1605 QDialog(parent) {
1606
1607 int ww = QFontMetrics(font()).width('w');
1608 QPushButton* _closeButton = new QPushButton("Close");
1609 _closeButton->setMaximumWidth(10*ww);
1610 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1611
1612 QGridLayout* dlgLayout = new QGridLayout();
1613 QLabel* img = new QLabel();
1614 img->setPixmap(QPixmap(":bncflowchart.png"));
1615 dlgLayout->addWidget(img, 0,0);
1616 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1617
1618 setLayout(dlgLayout);
1619 setWindowTitle("Flow Chart");
1620 show();
1621}
1622
1623//
1624////////////////////////////////////////////////////////////////////////////
1625bncFlowchartDlg::~bncFlowchartDlg() {
1626};
1627
1628// Bnc Text
1629////////////////////////////////////////////////////////////////////////////
1630void bncWindow::slotBncTextChanged(){
1631
1632 QPalette palette_white(QColor(255, 255, 255));
1633 QPalette palette_gray(QColor(230, 230, 230));
1634 bncSettings settings;
1635
1636 // Proxy
1637 //------
1638 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1639 if (!_proxyHostLineEdit->text().isEmpty()) {
1640 _proxyPortLineEdit->setStyleSheet("background-color: white");
1641 _proxyPortLineEdit->setEnabled(true);
1642 }
1643 else {
1644 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1645 _proxyPortLineEdit->setEnabled(false);
1646 }
1647 }
1648
1649 // RINEX Observations
1650 // ------------------
1651 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1652 if (!_rnxPathLineEdit->text().isEmpty()) {
1653 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1654 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1655 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1656 _rnxV3CheckBox->setPalette(palette_white);
1657 _rnxIntrComboBox->setStyleSheet("background-color: white");
1658 _rnxSamplSpinBox->setEnabled(true);
1659 _rnxSkelLineEdit->setEnabled(true);
1660 _rnxScrpLineEdit->setEnabled(true);
1661 _rnxV3CheckBox->setEnabled(true);
1662 _rnxIntrComboBox->setEnabled(true);
1663 }
1664 else {
1665 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1666 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1667 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1668 _rnxV3CheckBox->setPalette(palette_gray);
1669 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1670 _rnxSamplSpinBox->setEnabled(false);
1671 _rnxSkelLineEdit->setEnabled(false);
1672 _rnxScrpLineEdit->setEnabled(false);
1673 _rnxV3CheckBox->setEnabled(false);
1674 _rnxIntrComboBox->setEnabled(false);
1675 }
1676 }
1677
1678 // RINEX Ephemeris
1679 // ---------------
1680 if (sender() == 0 ||
1681 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1682 if (!_ephPathLineEdit->text().isEmpty() ||
1683 !_outEphPortLineEdit->text().isEmpty()) {
1684 _ephIntrComboBox->setStyleSheet("background-color: white");
1685 _ephV3CheckBox->setPalette(palette_white);
1686 _ephIntrComboBox->setEnabled(true);
1687 _ephV3CheckBox->setEnabled(true);
1688 }
1689 else {
1690 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1691 _ephV3CheckBox->setPalette(palette_gray);
1692 _ephIntrComboBox->setEnabled(false);
1693 _ephV3CheckBox->setEnabled(false);
1694 }
1695 }
1696
1697 // Broadcast Corrections
1698 // ---------------------
1699 if (sender() == 0 ||
1700 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1701 if (!_corrPathLineEdit->text().isEmpty() ||
1702 !_corrPortLineEdit->text().isEmpty()) {
1703 _corrIntrComboBox->setStyleSheet("background-color: white");
1704 _corrIntrComboBox->setEnabled(true);
1705 }
1706 else {
1707 _corrIntrComboBox->setStyleSheet("background-color: white");
1708 _corrIntrComboBox->setEnabled(true);
1709 }
1710 }
1711
1712 // Feed Engine
1713 // -----------
1714 if (sender() == 0 ||
1715 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1716 if ( !_outPortLineEdit->text().isEmpty() ||
1717 !_outFileLineEdit->text().isEmpty()) {
1718 _waitTimeSpinBox->setStyleSheet("background-color: white");
1719 _binSamplSpinBox->setStyleSheet("background-color: white");
1720 _waitTimeSpinBox->setEnabled(true);
1721 _binSamplSpinBox->setEnabled(true);
1722 }
1723 else {
1724 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1725 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1726 _waitTimeSpinBox->setEnabled(false);
1727 _binSamplSpinBox->setEnabled(false);
1728 }
1729 }
1730
1731 // Serial Output
1732 // -------------
1733 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1734 sender() == _serialAutoNMEAComboBox) {
1735 if (!_serialMountPointLineEdit->text().isEmpty()) {
1736 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1737 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1738 _serialParityComboBox->setStyleSheet("background-color: white");
1739 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1740 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1741 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1742 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1743 _serialPortNameLineEdit->setEnabled(true);
1744 _serialBaudRateComboBox->setEnabled(true);
1745 _serialParityComboBox->setEnabled(true);
1746 _serialDataBitsComboBox->setEnabled(true);
1747 _serialStopBitsComboBox->setEnabled(true);
1748 _serialFlowControlComboBox->setEnabled(true);
1749 _serialAutoNMEAComboBox->setEnabled(true);
1750 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1751 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1752 _serialHeightNMEALineEdit->setEnabled(true);
1753 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1754 _serialFileNMEALineEdit->setEnabled(false);
1755 }
1756 else {
1757 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1758 _serialHeightNMEALineEdit->setEnabled(false);
1759 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1760 _serialFileNMEALineEdit->setEnabled(true);
1761 }
1762 }
1763 else {
1764 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1765 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1766 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1767 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1768 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1769 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1770 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1771 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1772 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1773 _serialPortNameLineEdit->setEnabled(false);
1774 _serialBaudRateComboBox->setEnabled(false);
1775 _serialParityComboBox->setEnabled(false);
1776 _serialDataBitsComboBox->setEnabled(false);
1777 _serialStopBitsComboBox->setEnabled(false);
1778 _serialFlowControlComboBox->setEnabled(false);
1779 _serialAutoNMEAComboBox->setEnabled(false);
1780 _serialHeightNMEALineEdit->setEnabled(false);
1781 _serialFileNMEALineEdit->setEnabled(false);
1782 }
1783 }
1784
1785 // Outages
1786 // -------
1787 if (sender() == 0 || sender() == _obsRateComboBox) {
1788 if (!_obsRateComboBox->currentText().isEmpty()) {
1789 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1790 _adviseFailSpinBox->setStyleSheet("background-color: white");
1791 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1792 _adviseFailSpinBox->setEnabled(true);
1793 _adviseRecoSpinBox->setEnabled(true);
1794 _adviseScriptLineEdit->setEnabled(true);
1795 } else {
1796 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1797 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1798 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1799 _adviseFailSpinBox->setEnabled(false);
1800 _adviseRecoSpinBox->setEnabled(false);
1801 _adviseScriptLineEdit->setEnabled(false);
1802 }
1803 }
1804
1805 // Miscellaneous
1806 // -------------
1807 if (sender() == 0 || sender() == _miscMountLineEdit) {
1808 if (!_miscMountLineEdit->text().isEmpty()) {
1809 _perfIntrComboBox->setStyleSheet("background-color: white");
1810 _scanRTCMCheckBox->setPalette(palette_white);
1811 _perfIntrComboBox->setEnabled(true);
1812 _scanRTCMCheckBox->setEnabled(true);
1813 } else {
1814 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1815 _scanRTCMCheckBox->setPalette(palette_gray);
1816 _perfIntrComboBox->setEnabled(false);
1817 _scanRTCMCheckBox->setEnabled(false);
1818 }
1819 }
1820
1821 // PPP Client
1822 // ----------
1823 if (sender() == 0
1824 || sender() == _pppMountLineEdit
1825 || sender() == _pppCorrMountLineEdit
1826 || sender() == _pppRefCrdXLineEdit
1827 || sender() == _pppRefCrdYLineEdit
1828 || sender() == _pppRefCrdZLineEdit
1829 || sender() == _pppSync
1830 || sender() == _pppSPPComboBox
1831 || sender() == _pppEstTropoCheckBox
1832 || sender() == _pppUsePhaseCheckBox
1833 || sender() == _pppAntexLineEdit ) {
1834 if ((!_pppMountLineEdit->text().isEmpty() &&
1835 !_pppCorrMountLineEdit->text().isEmpty()) ||
1836 ( !_pppMountLineEdit->text().isEmpty() &&
1837 _pppSPPComboBox->currentText() == "SPP")) {
1838 _pppSPPComboBox->setPalette(palette_white);
1839 _pppNMEALineEdit->setPalette(palette_white);
1840 _pppNMEAPortLineEdit->setPalette(palette_white);
1841 _pppRefCrdXLineEdit->setPalette(palette_white);
1842 _pppRefCrdYLineEdit->setPalette(palette_white);
1843 _pppRefCrdZLineEdit->setPalette(palette_white);
1844 _pppUsePhaseCheckBox->setPalette(palette_white);
1845 _pppPlotCoordinates->setPalette(palette_white);
1846 _pppEstTropoCheckBox->setPalette(palette_white);
1847 _pppGLONASSCheckBox->setPalette(palette_white);
1848 _pppGalileoCheckBox->setPalette(palette_white);
1849 _pppAntexLineEdit->setPalette(palette_white);
1850 _pppSPPComboBox->setEnabled(true);
1851 _pppNMEALineEdit->setEnabled(true);
1852 _pppNMEAPortLineEdit->setEnabled(true);
1853 _pppRefCrdXLineEdit->setEnabled(true);
1854 _pppRefCrdYLineEdit->setEnabled(true);
1855 _pppRefCrdZLineEdit->setEnabled(true);
1856 _pppUsePhaseCheckBox->setEnabled(true);
1857 _pppPlotCoordinates->setEnabled(true);
1858 _pppEstTropoCheckBox->setEnabled(true);
1859 _pppGLONASSCheckBox->setEnabled(true);
1860 _pppGalileoCheckBox->setEnabled(true);
1861 _pppRefCrdXLineEdit->setPalette(palette_white);
1862 _pppRefCrdYLineEdit->setPalette(palette_white);
1863 _pppRefCrdZLineEdit->setPalette(palette_white);
1864 _pppAntexLineEdit->setEnabled(true);
1865 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1866 !_pppRefCrdYLineEdit->text().isEmpty() &&
1867 !_pppRefCrdZLineEdit->text().isEmpty()) {
1868 _pppAverageLineEdit->setPalette(palette_white);
1869 _pppQuickStartLineEdit->setPalette(palette_white);
1870 _pppAverageLineEdit->setEnabled(true);
1871 _pppQuickStartLineEdit->setEnabled(true);
1872 }
1873 else {
1874 _pppAverageLineEdit->setPalette(palette_gray);
1875 _pppAverageLineEdit->setEnabled(false);
1876 _pppQuickStartLineEdit->setPalette(palette_gray);
1877 _pppQuickStartLineEdit->setEnabled(false);
1878 }
1879 if (!_pppAntexLineEdit->text().isEmpty() ) {
1880 _pppAntennaLineEdit->setEnabled(true);
1881 _pppApplySatAntCheckBox->setEnabled(true);
1882 _pppAntennaLineEdit->setPalette(palette_white);
1883 _pppApplySatAntCheckBox->setPalette(palette_white);
1884 }
1885 else {
1886 _pppAntennaLineEdit->setEnabled(false);
1887 _pppApplySatAntCheckBox->setEnabled(false);
1888 _pppAntennaLineEdit->setPalette(palette_gray);
1889 _pppApplySatAntCheckBox->setPalette(palette_gray);
1890 }
1891 _pppSigCLineEdit->setPalette(palette_white);
1892 _pppSigCLineEdit->setEnabled(true);
1893 _pppSigCrd0->setPalette(palette_white);
1894 _pppSigCrd0->setEnabled(true);
1895 _pppSigCrdP->setPalette(palette_white);
1896 _pppSigCrdP->setEnabled(true);
1897 if (_pppEstTropoCheckBox->isChecked()
1898 && !_pppMountLineEdit->text().isEmpty()) {
1899 _pppSigTrp0->setPalette(palette_white);
1900 _pppSigTrp0->setEnabled(true);
1901 _pppSigTrpP->setPalette(palette_white);
1902 _pppSigTrpP->setEnabled(true);
1903 }
1904 else {
1905 _pppSigTrp0->setPalette(palette_gray);
1906 _pppSigTrp0->setEnabled(false);
1907 _pppSigTrpP->setPalette(palette_gray);
1908 _pppSigTrpP->setEnabled(false);
1909 }
1910 if (_pppUsePhaseCheckBox->isChecked()
1911 && !_pppMountLineEdit->text().isEmpty()) {
1912 _pppSigPLineEdit->setPalette(palette_white);
1913 _pppSigPLineEdit->setEnabled(true);
1914 }
1915 else {
1916 _pppSigPLineEdit->setPalette(palette_gray);
1917 _pppSigPLineEdit->setEnabled(false);
1918 }
1919 if (_pppSPPComboBox->currentText() == "PPP") {
1920 _pppSync->setPalette(palette_white);
1921 _pppSync->setEnabled(true);
1922 }
1923 else {
1924 _pppSync->setPalette(palette_gray);
1925 _pppSync->setEnabled(false);
1926 }
1927 } else {
1928 _pppSPPComboBox->setPalette(palette_gray);
1929 _pppNMEALineEdit->setPalette(palette_gray);
1930 _pppNMEAPortLineEdit->setPalette(palette_gray);
1931 _pppRefCrdXLineEdit->setPalette(palette_gray);
1932 _pppRefCrdYLineEdit->setPalette(palette_gray);
1933 _pppRefCrdZLineEdit->setPalette(palette_gray);
1934 _pppSync->setPalette(palette_gray);
1935 _pppUsePhaseCheckBox->setPalette(palette_gray);
1936 _pppPlotCoordinates->setPalette(palette_gray);
1937 _pppEstTropoCheckBox->setPalette(palette_gray);
1938 _pppGLONASSCheckBox->setPalette(palette_gray);
1939 _pppGalileoCheckBox->setPalette(palette_gray);
1940 _pppSigCLineEdit->setPalette(palette_gray);
1941 _pppSigPLineEdit->setPalette(palette_gray);
1942 _pppSigCrd0->setPalette(palette_gray);
1943 _pppSigCrdP->setPalette(palette_gray);
1944 _pppSigTrp0->setPalette(palette_gray);
1945 _pppSigTrpP->setPalette(palette_gray);
1946 _pppAverageLineEdit->setPalette(palette_gray);
1947 _pppQuickStartLineEdit->setPalette(palette_gray);
1948 _pppAntexLineEdit->setPalette(palette_white);
1949 _pppAntennaLineEdit->setPalette(palette_gray);
1950 _pppApplySatAntCheckBox->setPalette(palette_gray);
1951 _pppSPPComboBox->setEnabled(false);
1952 _pppNMEALineEdit->setEnabled(false);
1953 _pppNMEAPortLineEdit->setEnabled(false);
1954 _pppRefCrdXLineEdit->setEnabled(false);
1955 _pppRefCrdYLineEdit->setEnabled(false);
1956 _pppRefCrdZLineEdit->setEnabled(false);
1957 _pppSync->setEnabled(false);
1958 _pppUsePhaseCheckBox->setEnabled(false);
1959 _pppPlotCoordinates->setEnabled(false);
1960 _pppEstTropoCheckBox->setEnabled(false);
1961 _pppGLONASSCheckBox->setEnabled(false);
1962 _pppGalileoCheckBox->setEnabled(false);
1963 _pppSigCLineEdit->setEnabled(false);
1964 _pppSigPLineEdit->setEnabled(false);
1965 _pppSigCrd0->setEnabled(false);
1966 _pppSigCrdP->setEnabled(false);
1967 _pppSigTrp0->setEnabled(false);
1968 _pppSigTrpP->setEnabled(false);
1969 _pppAverageLineEdit->setEnabled(false);
1970 _pppQuickStartLineEdit->setEnabled(false);
1971 _pppAntexLineEdit->setEnabled(true);
1972 _pppAntennaLineEdit->setEnabled(false);
1973 _pppApplySatAntCheckBox->setEnabled(false);
1974 }
1975//
1976 if (_pppMountLineEdit->text().isEmpty()) {
1977 _pppCorrMountLineEdit->setPalette(palette_gray);
1978 _pppCorrMountLineEdit->setEnabled(false);
1979 } else {
1980 _pppCorrMountLineEdit->setPalette(palette_white);
1981 _pppCorrMountLineEdit->setEnabled(true);
1982 if (_pppCorrMountLineEdit->text().isEmpty()) {
1983 _pppSPPComboBox->setPalette(palette_white);
1984 _pppSPPComboBox->setEnabled(true);
1985 }
1986 }
1987 if (_pppSPPComboBox->currentText() == "SPP") {
1988 _pppCorrMountLineEdit->setPalette(palette_gray);
1989 _pppCorrMountLineEdit->setEnabled(false);
1990 }
1991 }
1992
1993 // Combination
1994 // ----------
1995 if (sender() == 0
1996 || sender() == _cmbTable
1997 || sender() == _cmbMountpointLineEdit) {
1998 if (_cmbTable->rowCount() > 0) {
1999 _cmbMountpointLineEdit->setPalette(palette_white);
2000 _cmbSP3PathLineEdit->setPalette(palette_white);
2001 _cmbMountpointLineEdit->setEnabled(true);
2002 _cmbSP3PathLineEdit->setEnabled(true);
2003 if (!_cmbMountpointLineEdit->text().isEmpty()) {
2004 _cmbOutHostLineEdit->setPalette(palette_white);
2005 _cmbOutPortLineEdit->setPalette(palette_white);
2006 _cmbPasswordLineEdit->setPalette(palette_white);
2007 _cmbOutPathLineEdit->setPalette(palette_white);
2008 _cmbOutHostLineEdit->setEnabled(true);
2009 _cmbOutPortLineEdit->setEnabled(true);
2010 _cmbPasswordLineEdit->setEnabled(true);
2011 _cmbOutPathLineEdit->setEnabled(true);
2012 } else {
2013 _cmbOutHostLineEdit->setPalette(palette_gray);
2014 _cmbOutPortLineEdit->setPalette(palette_gray);
2015 _cmbPasswordLineEdit->setPalette(palette_gray);
2016 _cmbOutPathLineEdit->setPalette(palette_gray);
2017 _cmbOutHostLineEdit->setEnabled(false);
2018 _cmbOutPortLineEdit->setEnabled(false);
2019 _cmbPasswordLineEdit->setEnabled(false);
2020 _cmbOutPathLineEdit->setEnabled(false);
2021 }
2022 } else {
2023 _cmbMountpointLineEdit->setPalette(palette_gray);
2024 _cmbOutHostLineEdit->setPalette(palette_gray);
2025 _cmbOutPortLineEdit->setPalette(palette_gray);
2026 _cmbPasswordLineEdit->setPalette(palette_gray);
2027 _cmbOutPathLineEdit->setPalette(palette_gray);
2028 _cmbSP3PathLineEdit->setPalette(palette_gray);
2029 _cmbMountpointLineEdit->setEnabled(false);
2030 _cmbOutHostLineEdit->setEnabled(false);
2031 _cmbOutPortLineEdit->setEnabled(false);
2032 _cmbPasswordLineEdit->setEnabled(false);
2033 _cmbOutPathLineEdit->setEnabled(false);
2034 _cmbSP3PathLineEdit->setEnabled(false);
2035 }
2036 }
2037}
2038
2039//
2040////////////////////////////////////////////////////////////////////////////
2041void bncWindow::slotAddCmbRow() {
2042 int iRow = _cmbTable->rowCount();
2043 _cmbTable->insertRow(iRow);
2044 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2045 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2046 }
2047}
2048
2049//
2050////////////////////////////////////////////////////////////////////////////
2051void bncWindow::slotDelCmbRow() {
2052 int nRows = _cmbTable->rowCount();
2053 bool flg[nRows];
2054 for (int iRow = 0; iRow < nRows; iRow++) {
2055 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2056 flg[iRow] = true;
2057 }
2058 else {
2059 flg[iRow] = false;
2060 }
2061 }
2062 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2063 if (flg[iRow]) {
2064 _cmbTable->removeRow(iRow);
2065 }
2066 }
2067}
2068
2069//
2070////////////////////////////////////////////////////////////////////////////
2071void bncWindow::populateCmbTable() {
2072
2073 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2074 _cmbTable->removeRow(iRow);
2075 }
2076
2077 bncSettings settings;
2078
2079 int iRow = -1;
2080 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2081 while (it.hasNext()) {
2082 QStringList hlp = it.next().split(" ");
2083 if (hlp.size() > 2) {
2084 ++iRow;
2085 _cmbTable->insertRow(iRow);
2086 }
2087 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2088 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2089 }
2090 }
2091}
Note: See TracBrowser for help on using the repository browser.