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

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

Changed desing of combination tab

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