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

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

Online help extended for options unter combination tab

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