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

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