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

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