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

Last change on this file since 2798 was 2794, checked in by mervart, 14 years ago
File size: 89.7 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59
60using namespace std;
61
62// Constructor
63////////////////////////////////////////////////////////////////////////////
64bncWindow::bncWindow() {
65
66 _caster = 0;
67
68 _bncFigure = new bncFigure(this);
69 _bncFigureLate = new bncFigureLate(this);
70 _bncFigurePPP = new bncFigurePPP(this);
71
72 int ww = QFontMetrics(this->font()).width('w');
73
74 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
75
76 setMinimumSize(95*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
354 _pppSPPComboBox = new QComboBox();
355 _pppSPPComboBox->setEditable(false);
356 _pppSPPComboBox->addItems(QString("PPP,SPP").split(","));
357 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
358 if (ik != -1) {
359 _pppSPPComboBox->setCurrentIndex(ik);
360 }
361 _pppUsePhaseCheckBox = new QCheckBox();
362 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
363 settings.value("pppUsePhase").toInt()));
364 _pppEstTropoCheckBox = new QCheckBox();
365 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
366 settings.value("pppEstTropo").toInt()));
367 _pppGLONASSCheckBox = new QCheckBox();
368 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
369 settings.value("pppGLONASS").toInt()));
370 _pppGalileoCheckBox = new QCheckBox();
371 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
372 settings.value("pppGalileo").toInt()));
373
374 _pppPlotCoordinates = new QCheckBox();
375 _pppPlotCoordinates->setCheckState(Qt::CheckState(
376 settings.value("pppPlotCoordinates").toInt()));
377
378 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
379 this, SLOT(slotBncTextChanged()));
380
381 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
382 this, SLOT(slotBncTextChanged()));
383
384 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
385 this, SLOT(slotBncTextChanged()));
386 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
387 this, SLOT(slotBncTextChanged()));
388 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
389 this, SLOT(slotBncTextChanged()));
390
391 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
392 this, SLOT(slotBncTextChanged()));
393
394 // Streams
395 // -------
396 _mountPointsTable = new QTableWidget(0,8);
397
398 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
399 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
400 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
401 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
402 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
403 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
404 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
405 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
406 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
407 _mountPointsTable->setHorizontalHeaderLabels(labels);
408 _mountPointsTable->setGridStyle(Qt::NoPen);
409 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
410 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
411 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
412 _mountPointsTable->hideColumn(0);
413 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
414 SLOT(slotSelectionChanged()));
415 populateMountPointsTable();
416
417 _log = new QTextBrowser();
418 _log->setReadOnly(true);
419
420 // WhatsThis
421 // ---------
422 _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>"));
423 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
424 _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>"));
425 _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."));
426 _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."));
427 _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."));
428 _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."));
429 _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."));
430 _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."));
431 _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."));
432 _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."));
433 _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."));
434 _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>"));
435 _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>"));
436 _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>"));
437 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
438 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
439
440 _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>"));
441 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
442 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
443 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
444 _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>"));
445 _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>"));
446 _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>"));
447 _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>"));
448 _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>"));
449 _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."));
450 _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>"));
451 _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>"));
452 _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>"));
453 _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."));
454 _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)."));
455 _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."));
456 _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."));
457 _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."));
458 _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>"));
459 _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>"));
460 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
461 _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>"));
462 _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>"));
463 _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>"));
464 _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>"));
465 _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>"));
466 _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>"));
467 _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>"));
468 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
469 _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>"));
470 _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>"));
471 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
472 _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>"));
473 _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>"));
474 _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>"));
475 _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>"));
476 _pppPlotCoordinates->setWhatsThis(tr("<p>PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab 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."));
477 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
478 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
479 _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>"));
480 _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 'XYZ White 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>"));
481 _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>"));
482 _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>"));
483 _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."));
484 _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>"));
485 _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>"));
486 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the 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>"));
487 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
488 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
489 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
490 _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."));
491
492 // Canvas with Editable Fields
493 // ---------------------------
494 _canvas = new QWidget;
495 setCentralWidget(_canvas);
496
497 _aogroup = new QTabWidget();
498 QWidget* pgroup = new QWidget();
499 QWidget* ggroup = new QWidget();
500 QWidget* sgroup = new QWidget();
501 QWidget* egroup = new QWidget();
502 QWidget* agroup = new QWidget();
503 QWidget* cgroup = new QWidget();
504 QWidget* ogroup = new QWidget();
505 QWidget* rgroup = new QWidget();
506 QWidget* sergroup = new QWidget();
507 QWidget* pppgroup = new QWidget();
508 _aogroup->addTab(pgroup,tr("Proxy"));
509 _aogroup->addTab(ggroup,tr("General"));
510 _aogroup->addTab(ogroup,tr("RINEX Observations"));
511 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
512 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
513 _aogroup->addTab(sgroup,tr("Feed Engine"));
514 _aogroup->addTab(sergroup,tr("Serial Output"));
515 _aogroup->addTab(agroup,tr("Outages"));
516 _aogroup->addTab(rgroup,tr("Miscellaneous"));
517 _aogroup->addTab(pppgroup,tr("PPP Client"));
518
519 // Log Tab
520 // -------
521 _loggroup = new QTabWidget();
522 _loggroup->addTab(_log,tr("Log"));
523 _loggroup->addTab(_bncFigure,tr("Throughput"));
524 _loggroup->addTab(_bncFigureLate,tr("Latency"));
525 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
526
527 // Proxy Tab
528 // ---------
529 QGridLayout* pLayout = new QGridLayout;
530 pLayout->setColumnMinimumWidth(0,13*ww);
531 _proxyPortLineEdit->setMaximumWidth(9*ww);
532
533 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
534 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
535 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
536 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
537 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
538 pLayout->addWidget(new QLabel(" "),3,0);
539 pLayout->addWidget(new QLabel(" "),4,0);
540 pLayout->addWidget(new QLabel(" "),5,0);
541 pgroup->setLayout(pLayout);
542
543 // General Tab
544 // -----------
545 QGridLayout* gLayout = new QGridLayout;
546 gLayout->setColumnMinimumWidth(0,14*ww);
547 _onTheFlyComboBox->setMaximumWidth(9*ww);
548
549 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
550 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
551 gLayout->addWidget(new QLabel("Append files"), 1, 0);
552 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
553 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
554 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
555 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
556 gLayout->addWidget(_autoStartCheckBox, 3, 1);
557 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
558 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
559 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
560 ggroup->setLayout(gLayout);
561
562 // RINEX Observations
563 // ------------------
564 QGridLayout* oLayout = new QGridLayout;
565 oLayout->setColumnMinimumWidth(0,14*ww);
566 _rnxIntrComboBox->setMaximumWidth(9*ww);
567 _rnxSamplSpinBox->setMaximumWidth(9*ww);
568
569 oLayout->addWidget(new QLabel("Directory"), 0, 0);
570 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
571 oLayout->addWidget(new QLabel("Interval"), 1, 0);
572 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
573 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
574 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
575 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
576 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
577 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
578 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
579 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
580 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
581 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
582 ogroup->setLayout(oLayout);
583
584 // RINEX Ephemeris
585 // ---------------
586 QGridLayout* eLayout = new QGridLayout;
587 eLayout->setColumnMinimumWidth(0,14*ww);
588 _ephIntrComboBox->setMaximumWidth(9*ww);
589 _outEphPortLineEdit->setMaximumWidth(9*ww);
590
591 eLayout->addWidget(new QLabel("Directory"), 0, 0);
592 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
593 eLayout->addWidget(new QLabel("Interval"), 1, 0);
594 eLayout->addWidget(_ephIntrComboBox, 1, 1);
595 eLayout->addWidget(new QLabel("Port"), 2, 0);
596 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
597 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
598 eLayout->addWidget(_ephV3CheckBox, 3, 1);
599 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
600 eLayout->addWidget(new QLabel(" "),5,0);
601 egroup->setLayout(eLayout);
602
603
604 // Broadcast Corrections
605 // ---------------------
606 QGridLayout* cLayout = new QGridLayout;
607 cLayout->setColumnMinimumWidth(0,14*ww);
608 _corrIntrComboBox->setMaximumWidth(9*ww);
609 _corrPortLineEdit->setMaximumWidth(9*ww);
610 _corrTimeSpinBox->setMaximumWidth(9*ww);
611
612 cLayout->addWidget(new QLabel("Directory"), 0, 0);
613 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
614 cLayout->addWidget(new QLabel("Interval"), 1, 0);
615 cLayout->addWidget(_corrIntrComboBox, 1, 1);
616 cLayout->addWidget(new QLabel("Port"), 2, 0);
617 cLayout->addWidget(_corrPortLineEdit, 2, 1);
618 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
619 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
620 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
621 cLayout->addWidget(new QLabel(" "),4,0);
622 cLayout->addWidget(new QLabel(" "),5,0);
623 cgroup->setLayout(cLayout);
624
625 // Feed Engine
626 // -----------
627 QGridLayout* sLayout = new QGridLayout;
628 sLayout->setColumnMinimumWidth(0,14*ww);
629 _outPortLineEdit->setMaximumWidth(9*ww);
630 _waitTimeSpinBox->setMaximumWidth(9*ww);
631 _binSamplSpinBox->setMaximumWidth(9*ww);
632 _outUPortLineEdit->setMaximumWidth(9*ww);
633
634 sLayout->addWidget(new QLabel("Port"), 0, 0);
635 sLayout->addWidget(_outPortLineEdit, 0, 1);
636 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
637 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
638 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
639 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
640 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
641 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
642 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
643 sLayout->addWidget(_outUPortLineEdit, 3, 1);
644 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
645 sLayout->addWidget(new QLabel(" "),5,0);
646 sgroup->setLayout(sLayout);
647
648 // Serial Output
649 // -------------
650 QGridLayout* serLayout = new QGridLayout;
651 serLayout->setColumnMinimumWidth(0,14*ww);
652 _serialBaudRateComboBox->setMaximumWidth(9*ww);
653 _serialFlowControlComboBox->setMaximumWidth(11*ww);
654 _serialDataBitsComboBox->setMaximumWidth(5*ww);
655 _serialParityComboBox->setMaximumWidth(9*ww);
656 _serialStopBitsComboBox->setMaximumWidth(5*ww);
657 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
658 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
659
660 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
661 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
662 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
663 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
664 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
665 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
666 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
667 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
668 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
669 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
670 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
671 serLayout->addWidget(_serialParityComboBox, 3,3);
672 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
673 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
674 serLayout->addWidget(new QLabel("NMEA"), 4,0);
675 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
676 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
677 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
678 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
679 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
680 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
681
682 sergroup->setLayout(serLayout);
683
684 // Outages
685 // -------
686 QGridLayout* aLayout = new QGridLayout;
687 aLayout->setColumnMinimumWidth(0,14*ww);
688 _obsRateComboBox->setMaximumWidth(9*ww);
689 _adviseFailSpinBox->setMaximumWidth(9*ww);
690 _adviseRecoSpinBox->setMaximumWidth(9*ww);
691
692 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
693 aLayout->addWidget(_obsRateComboBox, 0, 1);
694 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
695 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
696 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
697 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
698 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
699 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
700 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
701 aLayout->addWidget(new QLabel(" "), 5, 0);
702 agroup->setLayout(aLayout);
703
704 // Miscellaneous
705 // -------------
706 QGridLayout* rLayout = new QGridLayout;
707 rLayout->setColumnMinimumWidth(0,14*ww);
708 _perfIntrComboBox->setMaximumWidth(9*ww);
709
710 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
711 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
712 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
713 rLayout->addWidget(_perfIntrComboBox, 1, 1);
714 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
715 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
716 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
717 rLayout->addWidget(new QLabel(" "), 4, 0);
718 rLayout->addWidget(new QLabel(" "), 5, 0);
719 rgroup->setLayout(rLayout);
720
721 // PPP Client
722 // ----------
723 QGridLayout* pppLayout = new QGridLayout;
724 _pppSigCLineEdit->setMaximumWidth(6*ww);
725 _pppSigPLineEdit->setMaximumWidth(6*ww);
726 _pppSigCrd0->setMaximumWidth(6*ww);
727 _pppSigCrdP->setMaximumWidth(6*ww);
728 _pppSigTrp0->setMaximumWidth(6*ww);
729 _pppSigTrpP->setMaximumWidth(6*ww);
730 _pppAverageLineEdit->setMaximumWidth(6*ww);
731 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
732 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
733 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
734 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
735 _pppNMEAPortLineEdit->setMaximumWidth(14*ww);
736 _pppSPPComboBox->setMaximumWidth(8*ww);
737//pppLayout->setColumnMinimumWidth(0,12*ww);
738 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
739 pppLayout->addWidget(_pppMountLineEdit, 0, 1);
740 pppLayout->addWidget(_pppSPPComboBox, 0, 2);
741 pppLayout->addWidget(new QLabel(" X "), 0, 3, Qt::AlignRight);
742 pppLayout->addWidget(_pppRefCrdXLineEdit, 0, 4);
743 pppLayout->addWidget(new QLabel(" Y "), 0, 5, Qt::AlignRight);
744 pppLayout->addWidget(_pppRefCrdYLineEdit, 0, 6);
745 pppLayout->addWidget(new QLabel(" Z "), 0, 7, Qt::AlignRight);
746 pppLayout->addWidget(_pppRefCrdZLineEdit, 0, 8);
747 pppLayout->addWidget(new QLabel("Options"), 1, 0, 1, 5);
748 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 1, Qt::AlignRight);
749 pppLayout->addWidget(new QLabel("Use phase obs"), 1, 2);
750 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 3, Qt::AlignRight);
751 pppLayout->addWidget(new QLabel("Estimate tropo"), 1, 4);
752 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 5, Qt::AlignRight);
753 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 6);
754 pppLayout->addWidget(_pppGalileoCheckBox, 1, 7, Qt::AlignRight);
755 pppLayout->addWidget(new QLabel("Use Galileo"), 1, 8);
756 pppLayout->addWidget(_pppPlotCoordinates, 1, 9, Qt::AlignRight);
757 pppLayout->addWidget(new QLabel("PPP Plot "),1,10);
758 pppLayout->addWidget(new QLabel("Options cont'd"), 2, 0);
759 pppLayout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
760 pppLayout->addWidget(new QLabel("Sigma Code"), 2, 2);
761 pppLayout->addWidget(_pppSigPLineEdit, 2, 3);
762 pppLayout->addWidget(new QLabel("Sigma Phase"), 2, 4);
763 pppLayout->addWidget(_pppQuickStartLineEdit, 2, 5);
764 pppLayout->addWidget(new QLabel("Quick-Start (sec)") , 2, 6);
765 pppLayout->addWidget(_pppAverageLineEdit, 2, 7);
766 pppLayout->addWidget(new QLabel("Averaging (min)") , 2, 8);
767 pppLayout->addWidget(new QLabel("Parameter sigmas"), 3, 0);
768 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
769 pppLayout->addWidget(new QLabel("XYZ Init"), 3, 2);
770 pppLayout->addWidget(_pppSigCrdP, 3, 3);
771 pppLayout->addWidget(new QLabel("XYZ White Noise"), 3, 4);
772 pppLayout->addWidget(_pppSigTrp0, 3, 5);
773 pppLayout->addWidget(new QLabel("Tropo Init"), 3, 6);
774 pppLayout->addWidget(_pppSigTrpP, 3, 7);
775 pppLayout->addWidget(new QLabel("Tropo White Noise"), 3, 8);
776 pppLayout->addWidget(new QLabel("NMEA file (full path) "),4, 0);
777 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 4);
778 pppLayout->addWidget(new QLabel("Port"), 4, 5, Qt::AlignRight);
779 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 6);
780
781 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
782 pppgroup->setLayout(pppLayout);
783
784 // Main Layout
785 // -----------
786 QGridLayout* mLayout = new QGridLayout;
787 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
788 mLayout->addWidget(_aogroup, 0,0);
789 mLayout->addWidget(_mountPointsTable, 1,0);
790 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
791 mLayout->addWidget(_loggroup, 2,0);
792
793 _canvas->setLayout(mLayout);
794
795 // Enable/Disable all Widgets
796 // --------------------------
797 slotBncTextChanged();
798
799 // Auto start
800 // ----------
801 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
802 slotGetData();
803 }
804}
805
806// Destructor
807////////////////////////////////////////////////////////////////////////////
808bncWindow::~bncWindow() {
809 delete _caster;
810}
811
812//
813////////////////////////////////////////////////////////////////////////////
814void bncWindow::populateMountPointsTable() {
815
816 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
817 _mountPointsTable->removeRow(iRow);
818 }
819
820 bncSettings settings;
821
822 QListIterator<QString> it(settings.value("mountPoints").toStringList());
823 if (!it.hasNext()) {
824 _actGetData->setEnabled(false);
825 }
826 int iRow = 0;
827 while (it.hasNext()) {
828 QStringList hlp = it.next().split(" ");
829 if (hlp.size() < 5) continue;
830 _mountPointsTable->insertRow(iRow);
831
832 QUrl url(hlp[0]);
833
834 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
835 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
836 QString nmea(hlp[4]);
837 if (hlp[5] == "S") {
838 fullPath = hlp[0].replace(0,2,"");
839 }
840 QString ntripVersion = "1";
841 if (hlp.size() >= 6) {
842 ntripVersion = (hlp[5]);
843 }
844
845 QTableWidgetItem* it;
846 it = new QTableWidgetItem(url.userInfo());
847 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
848 _mountPointsTable->setItem(iRow, 0, it);
849
850 it = new QTableWidgetItem(fullPath);
851 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
852 _mountPointsTable->setItem(iRow, 1, it);
853
854 it = new QTableWidgetItem(format);
855 _mountPointsTable->setItem(iRow, 2, it);
856
857 if (nmea == "yes") {
858 it = new QTableWidgetItem(latitude);
859 _mountPointsTable->setItem(iRow, 3, it);
860 it = new QTableWidgetItem(longitude);
861 _mountPointsTable->setItem(iRow, 4, it);
862 } else {
863 it = new QTableWidgetItem(latitude);
864 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
865 _mountPointsTable->setItem(iRow, 3, it);
866 it = new QTableWidgetItem(longitude);
867 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
868 _mountPointsTable->setItem(iRow, 4, it);
869 }
870
871 it = new QTableWidgetItem(nmea);
872 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
873 _mountPointsTable->setItem(iRow, 5, it);
874
875 it = new QTableWidgetItem(ntripVersion);
876 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
877 _mountPointsTable->setItem(iRow, 6, it);
878
879 bncTableItem* bncIt = new bncTableItem();
880 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
881 _mountPointsTable->setItem(iRow, 7, bncIt);
882
883 iRow++;
884 }
885
886 _mountPointsTable->sortItems(1);
887}
888
889// Retrieve Table
890////////////////////////////////////////////////////////////////////////////
891void bncWindow::slotAddMountPoints() {
892
893 bncSettings settings;
894 QString proxyHost = settings.value("proxyHost").toString();
895 int proxyPort = settings.value("proxyPort").toInt();
896 if (proxyHost != _proxyHostLineEdit->text() ||
897 proxyPort != _proxyPortLineEdit->text().toInt()) {
898 int iRet = QMessageBox::question(this, "Question", "Proxy options "
899 "changed. Use the new ones?",
900 QMessageBox::Yes, QMessageBox::No,
901 QMessageBox::NoButton);
902 if (iRet == QMessageBox::Yes) {
903 settings.setValue("proxyHost", _proxyHostLineEdit->text());
904 settings.setValue("proxyPort", _proxyPortLineEdit->text());
905 settings.sync();
906 }
907 }
908
909 QMessageBox msgBox;
910 msgBox.setIcon(QMessageBox::Question);
911 msgBox.setWindowTitle("Add Stream");
912 msgBox.setText("Add stream(s) coming from:");
913
914 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
915 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
916 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
917 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
918 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
919
920 msgBox.exec();
921
922 if (msgBox.clickedButton() == buttonNtrip) {
923 bncTableDlg* dlg = new bncTableDlg(this);
924 dlg->move(this->pos().x()+50, this->pos().y()+50);
925 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
926 this, SLOT(slotNewMountPoints(QStringList*)));
927 dlg->exec();
928 delete dlg;
929 } else if (msgBox.clickedButton() == buttonIP) {
930 bncIpPort* ipp = new bncIpPort(this);
931 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
932 this, SLOT(slotNewMountPoints(QStringList*)));
933 ipp->exec();
934 delete ipp;
935 } else if (msgBox.clickedButton() == buttonUDP) {
936 bncUdpPort* udp = new bncUdpPort(this);
937 connect(udp, SIGNAL(newMountPoints(QStringList*)),
938 this, SLOT(slotNewMountPoints(QStringList*)));
939 udp->exec();
940 delete udp;
941 } else if (msgBox.clickedButton() == buttonSerial) {
942 bncSerialPort* sep = new bncSerialPort(this);
943 connect(sep, SIGNAL(newMountPoints(QStringList*)),
944 this, SLOT(slotNewMountPoints(QStringList*)));
945 sep->exec();
946 delete sep;
947 } else if (msgBox.clickedButton() == buttonCancel) {
948 // Cancel
949 }
950}
951
952// Delete Selected Mount Points
953////////////////////////////////////////////////////////////////////////////
954void bncWindow::slotDeleteMountPoints() {
955
956 int nRows = _mountPointsTable->rowCount();
957 bool flg[nRows];
958 for (int iRow = 0; iRow < nRows; iRow++) {
959 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
960 flg[iRow] = true;
961 }
962 else {
963 flg[iRow] = false;
964 }
965 }
966 for (int iRow = nRows-1; iRow >= 0; iRow--) {
967 if (flg[iRow]) {
968 _mountPointsTable->removeRow(iRow);
969 }
970 }
971 _actDeleteMountPoints->setEnabled(false);
972
973 if (_mountPointsTable->rowCount() == 0) {
974 _actGetData->setEnabled(false);
975 }
976}
977
978// New Mount Points Selected
979////////////////////////////////////////////////////////////////////////////
980void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
981 int iRow = 0;
982 QListIterator<QString> it(*mountPoints);
983 while (it.hasNext()) {
984 QStringList hlp = it.next().split(" ");
985 QUrl url(hlp[0]);
986 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
987 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
988 QString nmea(hlp[4]);
989 if (hlp[5] == "S") {
990 fullPath = hlp[0].replace(0,2,"");
991 }
992 QString ntripVersion = "1";
993 if (hlp.size() >= 6) {
994 ntripVersion = (hlp[5]);
995 }
996
997 _mountPointsTable->insertRow(iRow);
998
999 QTableWidgetItem* it;
1000 it = new QTableWidgetItem(url.userInfo());
1001 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1002 _mountPointsTable->setItem(iRow, 0, it);
1003
1004 it = new QTableWidgetItem(fullPath);
1005 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1006 _mountPointsTable->setItem(iRow, 1, it);
1007
1008 it = new QTableWidgetItem(format);
1009 _mountPointsTable->setItem(iRow, 2, it);
1010
1011 if (nmea == "yes") {
1012 it = new QTableWidgetItem(latitude);
1013 _mountPointsTable->setItem(iRow, 3, it);
1014 it = new QTableWidgetItem(longitude);
1015 _mountPointsTable->setItem(iRow, 4, it);
1016 } else {
1017 it = new QTableWidgetItem(latitude);
1018 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1019 _mountPointsTable->setItem(iRow, 3, it);
1020 it = new QTableWidgetItem(longitude);
1021 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1022 _mountPointsTable->setItem(iRow, 4, it);
1023 }
1024
1025 it = new QTableWidgetItem(nmea);
1026 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1027 _mountPointsTable->setItem(iRow, 5, it);
1028
1029 it = new QTableWidgetItem(ntripVersion);
1030 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1031 _mountPointsTable->setItem(iRow, 6, it);
1032
1033 bncTableItem* bncIt = new bncTableItem();
1034 _mountPointsTable->setItem(iRow, 7, bncIt);
1035
1036 iRow++;
1037 }
1038 _mountPointsTable->hideColumn(0);
1039 _mountPointsTable->sortItems(1);
1040 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1041 _actGetData->setEnabled(true);
1042 }
1043 delete mountPoints;
1044}
1045
1046// Save Options
1047////////////////////////////////////////////////////////////////////////////
1048void bncWindow::slotSaveOptions() {
1049
1050 QStringList mountPoints;
1051 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1052
1053 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1054 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1055 "@" + _mountPointsTable->item(iRow, 1)->text() );
1056
1057 mountPoints.append(url.toString() + " " +
1058 _mountPointsTable->item(iRow, 2)->text()
1059 + " " + _mountPointsTable->item(iRow, 3)->text()
1060 + " " + _mountPointsTable->item(iRow, 4)->text()
1061 + " " + _mountPointsTable->item(iRow, 5)->text()
1062 + " " + _mountPointsTable->item(iRow, 6)->text());
1063 } else {
1064 mountPoints.append(
1065 "//" + _mountPointsTable->item(iRow, 1)->text()
1066 + " " + _mountPointsTable->item(iRow, 2)->text()
1067 + " " + _mountPointsTable->item(iRow, 3)->text()
1068 + " " + _mountPointsTable->item(iRow, 4)->text()
1069 + " " + _mountPointsTable->item(iRow, 5)->text()
1070 + " " + _mountPointsTable->item(iRow, 6)->text());
1071 }
1072 }
1073
1074 bncSettings settings;
1075
1076 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1077 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1078 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1079 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1080 settings.setValue("binSampl", _binSamplSpinBox->value());
1081 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1082 settings.setValue("corrPath", _corrPathLineEdit->text());
1083 settings.setValue("corrPort", _corrPortLineEdit->text());
1084 settings.setValue("corrTime", _corrTimeSpinBox->value());
1085 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1086 settings.setValue("ephPath", _ephPathLineEdit->text());
1087 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1088 settings.setValue("logFile", _logFileLineEdit->text());
1089 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1090 settings.setValue("miscMount", _miscMountLineEdit->text());
1091 settings.setValue("pppMount", _pppMountLineEdit->text());
1092 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1093 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1094 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1095 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1096 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1097 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1098 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1099 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1100 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1101 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1102 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1103 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1104 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1105 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1106 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1107 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1108 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1109 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1110 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1111 settings.setValue("mountPoints", mountPoints);
1112 settings.setValue("obsRate", _obsRateComboBox->currentText());
1113 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1114 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1115 settings.setValue("outFile", _outFileLineEdit->text());
1116 settings.setValue("outPort", _outPortLineEdit->text());
1117 settings.setValue("outUPort", _outUPortLineEdit->text());
1118 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1119 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1120 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1121 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1122 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1123 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1124 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1125 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1126 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1127 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1128 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1129 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1130 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1131 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1132 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1133 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1134 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1135 settings.setValue("serialParity", _serialParityComboBox->currentText());
1136 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1137 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1138 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1139 settings.setValue("startTab", _aogroup->currentIndex());
1140 settings.setValue("statusTab", _loggroup->currentIndex());
1141 settings.setValue("waitTime", _waitTimeSpinBox->value());
1142
1143 if (_caster) {
1144 _caster->slotReadMountPoints();
1145 }
1146 settings.sync();
1147}
1148
1149// All get slots terminated
1150////////////////////////////////////////////////////////////////////////////
1151void bncWindow::slotGetThreadsFinished() {
1152 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1153 delete _caster; _caster = 0;
1154 _actGetData->setEnabled(true);
1155 _actStop->setEnabled(false);
1156}
1157
1158// Retrieve Data
1159////////////////////////////////////////////////////////////////////////////
1160void bncWindow::slotGetData() {
1161 slotSaveOptions();
1162
1163 _bncFigurePPP->reset();
1164
1165 _actDeleteMountPoints->setEnabled(false);
1166 _actGetData->setEnabled(false);
1167 _actStop->setEnabled(true);
1168
1169 _caster = new bncCaster(_outFileLineEdit->text(),
1170 _outPortLineEdit->text().toInt());
1171
1172 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1173 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1174
1175 connect(_caster, SIGNAL(getThreadsFinished()),
1176 this, SLOT(slotGetThreadsFinished()));
1177
1178 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1179 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1180
1181 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1182
1183 bncSettings settings;
1184
1185 QDir rnxdir(settings.value("rnxPath").toString());
1186 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1187
1188 QString rnx_file = settings.value("rnxScript").toString();
1189 if ( !rnx_file.isEmpty() ) {
1190 QFile rnxfile(settings.value("rnxScript").toString());
1191 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1192 }
1193
1194 QDir ephdir(settings.value("ephPath").toString());
1195 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1196
1197 QDir corrdir(settings.value("corrPath").toString());
1198 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1199
1200 QString advise_file = settings.value("adviseScript").toString();
1201 if ( !advise_file.isEmpty() ) {
1202 QFile advisefile(settings.value("adviseScript").toString());
1203 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1204 }
1205
1206 _caster->slotReadMountPoints();
1207}
1208
1209// Retrieve Data
1210////////////////////////////////////////////////////////////////////////////
1211void bncWindow::slotStop() {
1212 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1213 QMessageBox::Yes, QMessageBox::No,
1214 QMessageBox::NoButton);
1215 if (iRet == QMessageBox::Yes) {
1216 delete _caster; _caster = 0;
1217 _actGetData->setEnabled(true);
1218 _actStop->setEnabled(false);
1219 }
1220}
1221
1222// Close Application gracefully
1223////////////////////////////////////////////////////////////////////////////
1224void bncWindow::closeEvent(QCloseEvent* event) {
1225
1226 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1227 QMessageBox::Yes, QMessageBox::No,
1228 QMessageBox::Cancel);
1229
1230 if (iRet == QMessageBox::Cancel) {
1231 event->ignore();
1232 return;
1233 }
1234 else if (iRet == QMessageBox::Yes) {
1235 slotSaveOptions();
1236 }
1237
1238 QMainWindow::closeEvent(event);
1239}
1240
1241// User changed the selection of mountPoints
1242////////////////////////////////////////////////////////////////////////////
1243void bncWindow::slotSelectionChanged() {
1244 if (_mountPointsTable->selectedItems().isEmpty()) {
1245 _actDeleteMountPoints->setEnabled(false);
1246 }
1247 else {
1248 _actDeleteMountPoints->setEnabled(true);
1249 }
1250}
1251
1252// Display Program Messages
1253////////////////////////////////////////////////////////////////////////////
1254void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1255
1256#ifdef DEBUG_RTCM2_2021
1257 const int maxBufferSize = 1000;
1258#else
1259 const int maxBufferSize = 10000;
1260#endif
1261
1262 if (! showOnScreen ) {
1263 return;
1264 }
1265
1266 QString txt = _log->toPlainText() + "\n" +
1267 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1268 _log->clear();
1269 _log->append(txt.right(maxBufferSize));
1270}
1271
1272// About Message
1273////////////////////////////////////////////////////////////////////////////
1274void bncWindow::slotAbout() {
1275 new bncAboutDlg(0);
1276}
1277
1278//Flowchart
1279////////////////////////////////////////////////////////////////////////////
1280void bncWindow::slotFlowchart() {
1281 new bncFlowchartDlg(0);
1282}
1283
1284// Help Window
1285////////////////////////////////////////////////////////////////////////////
1286void bncWindow::slotHelp() {
1287 QUrl url;
1288 url.setPath(":bnchelp.html");
1289 new bncHlpDlg(0, url);
1290}
1291
1292// Select Fonts
1293////////////////////////////////////////////////////////////////////////////
1294void bncWindow::slotFontSel() {
1295 bool ok;
1296 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1297 if (ok) {
1298 bncSettings settings;
1299 settings.setValue("font", newFont.toString());
1300 QApplication::setFont(newFont);
1301 int ww = QFontMetrics(newFont).width('w');
1302 setMinimumSize(60*ww, 80*ww);
1303 resize(60*ww, 80*ww);
1304 }
1305}
1306
1307// Whats This Help
1308void bncWindow::slotWhatsThis() {
1309 QWhatsThis::enterWhatsThisMode();
1310}
1311
1312//
1313////////////////////////////////////////////////////////////////////////////
1314void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1315 _bncFigure->updateMountPoints();
1316 _bncFigureLate->updateMountPoints();
1317
1318 populateMountPointsTable();
1319 bncSettings settings;
1320 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1321 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1322 QListIterator<bncGetThread*> iTh(threads);
1323 while (iTh.hasNext()) {
1324 bncGetThread* thread = iTh.next();
1325 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1326 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1327 "@" + _mountPointsTable->item(iRow, 1)->text() );
1328 if (url == thread->mountPoint() &&
1329 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1330 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1331 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1332 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1333 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1334 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1335 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1336 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1337 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1338 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1339 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1340 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1341 disconnect(thread,
1342 SIGNAL(newPosition(bncTime, double, double, double)),
1343 _bncFigurePPP,
1344 SLOT(slotNewPosition(bncTime, double, double, double)));
1345 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1346 _bncFigurePPP,
1347 SLOT(slotNewPosition(bncTime, double, double, double)));
1348 }
1349 break;
1350 }
1351 }
1352 }
1353}
1354
1355//
1356////////////////////////////////////////////////////////////////////////////
1357void bncWindow::CreateMenu() {
1358 // Create Menus
1359 // ------------
1360 _menuFile = menuBar()->addMenu(tr("&File"));
1361 _menuFile->addAction(_actFontSel);
1362 _menuFile->addSeparator();
1363 _menuFile->addAction(_actSaveOpt);
1364 _menuFile->addSeparator();
1365 _menuFile->addAction(_actQuit);
1366
1367 _menuHlp = menuBar()->addMenu(tr("&Help"));
1368 _menuHlp->addAction(_actHelp);
1369 _menuHlp->addAction(_actFlowchart);
1370 _menuHlp->addAction(_actAbout);
1371}
1372
1373// Toolbar
1374////////////////////////////////////////////////////////////////////////////
1375void bncWindow::AddToolbar() {
1376 // Tool (Command) Bar
1377 // ------------------
1378 QToolBar* toolBar = new QToolBar;
1379 addToolBar(Qt::BottomToolBarArea, toolBar);
1380 toolBar->setMovable(false);
1381 toolBar->addAction(_actAddMountPoints);
1382 toolBar->addAction(_actDeleteMountPoints);
1383 toolBar->addAction(_actGetData);
1384 toolBar->addAction(_actStop);
1385 toolBar->addWidget(new QLabel(" "));
1386 toolBar->addAction(_actwhatsthis);
1387}
1388
1389// About
1390////////////////////////////////////////////////////////////////////////////
1391bncAboutDlg::bncAboutDlg(QWidget* parent) :
1392 QDialog(parent) {
1393
1394 QTextBrowser* tb = new QTextBrowser;
1395 QUrl url; url.setPath(":bncabout.html");
1396 tb->setSource(url);
1397 tb->setReadOnly(true);
1398
1399 int ww = QFontMetrics(font()).width('w');
1400 QPushButton* _closeButton = new QPushButton("Close");
1401 _closeButton->setMaximumWidth(10*ww);
1402 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1403
1404 QGridLayout* dlgLayout = new QGridLayout();
1405 QLabel* img = new QLabel();
1406 img->setPixmap(QPixmap(":ntrip-logo.png"));
1407 dlgLayout->addWidget(img, 0,0);
1408 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1409 dlgLayout->addWidget(tb,1,0,1,2);
1410 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1411
1412 setLayout(dlgLayout);
1413 resize(60*ww, 60*ww);
1414 setWindowTitle("About BNC");
1415 show();
1416}
1417
1418//
1419////////////////////////////////////////////////////////////////////////////
1420bncAboutDlg::~bncAboutDlg() {
1421};
1422
1423// Flowchart
1424////////////////////////////////////////////////////////////////////////////
1425bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1426 QDialog(parent) {
1427
1428 int ww = QFontMetrics(font()).width('w');
1429 QPushButton* _closeButton = new QPushButton("Close");
1430 _closeButton->setMaximumWidth(10*ww);
1431 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1432
1433 QGridLayout* dlgLayout = new QGridLayout();
1434 QLabel* img = new QLabel();
1435 img->setPixmap(QPixmap(":bncflowchart.png"));
1436 dlgLayout->addWidget(img, 0,0);
1437 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1438
1439 setLayout(dlgLayout);
1440 setWindowTitle("Flow Chart");
1441 show();
1442}
1443
1444//
1445////////////////////////////////////////////////////////////////////////////
1446bncFlowchartDlg::~bncFlowchartDlg() {
1447};
1448
1449// Bnc Text
1450////////////////////////////////////////////////////////////////////////////
1451void bncWindow::slotBncTextChanged(){
1452
1453 QPalette palette_white(QColor(255, 255, 255));
1454 QPalette palette_gray(QColor(230, 230, 230));
1455 bncSettings settings;
1456
1457 // Proxy
1458 //------
1459 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1460 if (!_proxyHostLineEdit->text().isEmpty()) {
1461 _proxyPortLineEdit->setStyleSheet("background-color: white");
1462 _proxyPortLineEdit->setEnabled(true);
1463 }
1464 else {
1465 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1466 _proxyPortLineEdit->setEnabled(false);
1467 }
1468 }
1469
1470 // RINEX Observations
1471 // ------------------
1472 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1473 if (!_rnxPathLineEdit->text().isEmpty()) {
1474 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1475 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1476 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1477 _rnxV3CheckBox->setPalette(palette_white);
1478 _rnxIntrComboBox->setStyleSheet("background-color: white");
1479 _rnxSamplSpinBox->setEnabled(true);
1480 _rnxSkelLineEdit->setEnabled(true);
1481 _rnxScrpLineEdit->setEnabled(true);
1482 _rnxV3CheckBox->setEnabled(true);
1483 _rnxIntrComboBox->setEnabled(true);
1484 }
1485 else {
1486 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1487 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1488 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1489 _rnxV3CheckBox->setPalette(palette_gray);
1490 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1491 _rnxSamplSpinBox->setEnabled(false);
1492 _rnxSkelLineEdit->setEnabled(false);
1493 _rnxScrpLineEdit->setEnabled(false);
1494 _rnxV3CheckBox->setEnabled(false);
1495 _rnxIntrComboBox->setEnabled(false);
1496 }
1497 }
1498
1499 // RINEX Ephemeris
1500 // ---------------
1501 if (sender() == 0 ||
1502 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1503 if (!_ephPathLineEdit->text().isEmpty() ||
1504 !_outEphPortLineEdit->text().isEmpty()) {
1505 _ephIntrComboBox->setStyleSheet("background-color: white");
1506 _ephV3CheckBox->setPalette(palette_white);
1507 _ephIntrComboBox->setEnabled(true);
1508 _ephV3CheckBox->setEnabled(true);
1509 }
1510 else {
1511 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1512 _ephV3CheckBox->setPalette(palette_gray);
1513 _ephIntrComboBox->setEnabled(false);
1514 _ephV3CheckBox->setEnabled(false);
1515 }
1516 }
1517
1518 // Broadcast Corrections
1519 // ---------------------
1520 if (sender() == 0 ||
1521 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1522 if (!_corrPathLineEdit->text().isEmpty() ||
1523 !_corrPortLineEdit->text().isEmpty()) {
1524 _corrIntrComboBox->setStyleSheet("background-color: white");
1525 _corrIntrComboBox->setEnabled(true);
1526 }
1527 else {
1528 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1529 _corrIntrComboBox->setEnabled(false);
1530 }
1531 }
1532
1533 // Feed Engine
1534 // -----------
1535 if (sender() == 0 ||
1536 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1537 if ( !_outPortLineEdit->text().isEmpty() ||
1538 !_outFileLineEdit->text().isEmpty()) {
1539 _waitTimeSpinBox->setStyleSheet("background-color: white");
1540 _binSamplSpinBox->setStyleSheet("background-color: white");
1541 _waitTimeSpinBox->setEnabled(true);
1542 _binSamplSpinBox->setEnabled(true);
1543 }
1544 else {
1545 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1546 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1547 _waitTimeSpinBox->setEnabled(false);
1548 _binSamplSpinBox->setEnabled(false);
1549 }
1550 }
1551
1552 // Serial Output
1553 // -------------
1554 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1555 sender() == _serialAutoNMEAComboBox) {
1556 if (!_serialMountPointLineEdit->text().isEmpty()) {
1557 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1558 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1559 _serialParityComboBox->setStyleSheet("background-color: white");
1560 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1561 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1562 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1563 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1564 _serialPortNameLineEdit->setEnabled(true);
1565 _serialBaudRateComboBox->setEnabled(true);
1566 _serialParityComboBox->setEnabled(true);
1567 _serialDataBitsComboBox->setEnabled(true);
1568 _serialStopBitsComboBox->setEnabled(true);
1569 _serialFlowControlComboBox->setEnabled(true);
1570 _serialAutoNMEAComboBox->setEnabled(true);
1571 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1572 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1573 _serialHeightNMEALineEdit->setEnabled(true);
1574 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1575 _serialFileNMEALineEdit->setEnabled(false);
1576 }
1577 else {
1578 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1579 _serialHeightNMEALineEdit->setEnabled(false);
1580 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1581 _serialFileNMEALineEdit->setEnabled(true);
1582 }
1583 }
1584 else {
1585 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1586 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1587 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1588 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1589 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1590 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1591 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1592 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1593 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1594 _serialPortNameLineEdit->setEnabled(false);
1595 _serialBaudRateComboBox->setEnabled(false);
1596 _serialParityComboBox->setEnabled(false);
1597 _serialDataBitsComboBox->setEnabled(false);
1598 _serialStopBitsComboBox->setEnabled(false);
1599 _serialFlowControlComboBox->setEnabled(false);
1600 _serialAutoNMEAComboBox->setEnabled(false);
1601 _serialHeightNMEALineEdit->setEnabled(false);
1602 _serialFileNMEALineEdit->setEnabled(false);
1603 }
1604 }
1605
1606 // Outages
1607 // -------
1608 if (sender() == 0 || sender() == _obsRateComboBox) {
1609 if (!_obsRateComboBox->currentText().isEmpty()) {
1610 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1611 _adviseFailSpinBox->setStyleSheet("background-color: white");
1612 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1613 _adviseFailSpinBox->setEnabled(true);
1614 _adviseRecoSpinBox->setEnabled(true);
1615 _adviseScriptLineEdit->setEnabled(true);
1616 } else {
1617 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1618 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1619 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1620 _adviseFailSpinBox->setEnabled(false);
1621 _adviseRecoSpinBox->setEnabled(false);
1622 _adviseScriptLineEdit->setEnabled(false);
1623 }
1624 }
1625
1626 // Miscellaneous
1627 // -------------
1628 if (sender() == 0 || sender() == _miscMountLineEdit) {
1629 if (!_miscMountLineEdit->text().isEmpty()) {
1630 _perfIntrComboBox->setStyleSheet("background-color: white");
1631 _scanRTCMCheckBox->setPalette(palette_white);
1632 _perfIntrComboBox->setEnabled(true);
1633 _scanRTCMCheckBox->setEnabled(true);
1634 } else {
1635 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1636 _scanRTCMCheckBox->setPalette(palette_gray);
1637 _perfIntrComboBox->setEnabled(false);
1638 _scanRTCMCheckBox->setEnabled(false);
1639 }
1640 }
1641
1642 // PPP Client
1643 // ----------
1644 if (sender() == 0
1645 || sender() == _pppMountLineEdit
1646 || sender() == _pppRefCrdXLineEdit
1647 || sender() == _pppRefCrdYLineEdit
1648 || sender() == _pppRefCrdZLineEdit
1649 || sender() == _pppEstTropoCheckBox
1650 || sender() == _pppUsePhaseCheckBox ) {
1651 if (!_pppMountLineEdit->text().isEmpty()) {
1652 _pppSPPComboBox->setPalette(palette_white);
1653 _pppNMEALineEdit->setPalette(palette_white);
1654 _pppNMEAPortLineEdit->setPalette(palette_white);
1655 _pppRefCrdXLineEdit->setPalette(palette_white);
1656 _pppRefCrdYLineEdit->setPalette(palette_white);
1657 _pppRefCrdZLineEdit->setPalette(palette_white);
1658 _pppUsePhaseCheckBox->setPalette(palette_white);
1659 _pppPlotCoordinates->setPalette(palette_white);
1660 _pppEstTropoCheckBox->setPalette(palette_white);
1661 _pppGLONASSCheckBox->setPalette(palette_white);
1662 _pppGalileoCheckBox->setPalette(palette_white);
1663 _pppSPPComboBox->setEnabled(true);
1664 _pppNMEALineEdit->setEnabled(true);
1665 _pppNMEAPortLineEdit->setEnabled(true);
1666 _pppRefCrdXLineEdit->setEnabled(true);
1667 _pppRefCrdYLineEdit->setEnabled(true);
1668 _pppRefCrdZLineEdit->setEnabled(true);
1669 _pppUsePhaseCheckBox->setEnabled(true);
1670 _pppPlotCoordinates->setEnabled(true);
1671 _pppEstTropoCheckBox->setEnabled(true);
1672 _pppGLONASSCheckBox->setEnabled(true);
1673 _pppGalileoCheckBox->setEnabled(true);
1674 _pppRefCrdXLineEdit->setPalette(palette_white);
1675 _pppRefCrdXLineEdit->setEnabled(true);
1676 _pppRefCrdYLineEdit->setPalette(palette_white);
1677 _pppRefCrdYLineEdit->setEnabled(true);
1678 _pppRefCrdZLineEdit->setPalette(palette_white);
1679 _pppRefCrdZLineEdit->setEnabled(true);
1680
1681 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1682 !_pppRefCrdYLineEdit->text().isEmpty() &&
1683 !_pppRefCrdZLineEdit->text().isEmpty()) {
1684 _pppAverageLineEdit->setPalette(palette_white);
1685 _pppAverageLineEdit->setEnabled(true);
1686 _pppQuickStartLineEdit->setPalette(palette_white);
1687 _pppQuickStartLineEdit->setEnabled(true);
1688 }
1689 else {
1690 _pppAverageLineEdit->setPalette(palette_gray);
1691 _pppAverageLineEdit->setEnabled(false);
1692 _pppQuickStartLineEdit->setPalette(palette_gray);
1693 _pppQuickStartLineEdit->setEnabled(false);
1694 }
1695 _pppSigCLineEdit->setPalette(palette_white);
1696 _pppSigCLineEdit->setEnabled(true);
1697 _pppSigCrd0->setPalette(palette_white);
1698 _pppSigCrd0->setEnabled(true);
1699 _pppSigCrdP->setPalette(palette_white);
1700 _pppSigCrdP->setEnabled(true);
1701 if (_pppEstTropoCheckBox->isChecked()
1702 && !_pppMountLineEdit->text().isEmpty()) {
1703 _pppSigTrp0->setPalette(palette_white);
1704 _pppSigTrp0->setEnabled(true);
1705 _pppSigTrpP->setPalette(palette_white);
1706 _pppSigTrpP->setEnabled(true);
1707 }
1708 else {
1709 _pppSigTrp0->setPalette(palette_gray);
1710 _pppSigTrp0->setEnabled(false);
1711 _pppSigTrpP->setPalette(palette_gray);
1712 _pppSigTrpP->setEnabled(false);
1713 }
1714 if (_pppUsePhaseCheckBox->isChecked()
1715 && !_pppMountLineEdit->text().isEmpty()) {
1716 _pppSigPLineEdit->setPalette(palette_white);
1717 _pppSigPLineEdit->setEnabled(true);
1718 }
1719 else {
1720 _pppSigPLineEdit->setPalette(palette_gray);
1721 _pppSigPLineEdit->setEnabled(false);
1722 }
1723 } else {
1724 _pppSPPComboBox->setPalette(palette_gray);
1725 _pppNMEALineEdit->setPalette(palette_gray);
1726 _pppNMEAPortLineEdit->setPalette(palette_gray);
1727 _pppRefCrdXLineEdit->setPalette(palette_gray);
1728 _pppRefCrdYLineEdit->setPalette(palette_gray);
1729 _pppRefCrdZLineEdit->setPalette(palette_gray);
1730 _pppUsePhaseCheckBox->setPalette(palette_gray);
1731 _pppPlotCoordinates->setPalette(palette_gray);
1732 _pppEstTropoCheckBox->setPalette(palette_gray);
1733 _pppGLONASSCheckBox->setPalette(palette_gray);
1734 _pppGalileoCheckBox->setPalette(palette_gray);
1735 _pppSigCLineEdit->setPalette(palette_gray);
1736 _pppSigPLineEdit->setPalette(palette_gray);
1737 _pppSigCrd0->setPalette(palette_gray);
1738 _pppSigCrdP->setPalette(palette_gray);
1739 _pppSigTrp0->setPalette(palette_gray);
1740 _pppSigTrpP->setPalette(palette_gray);
1741 _pppAverageLineEdit->setPalette(palette_gray);
1742 _pppQuickStartLineEdit->setPalette(palette_gray);
1743 _pppSPPComboBox->setEnabled(false);
1744 _pppNMEALineEdit->setEnabled(false);
1745 _pppNMEAPortLineEdit->setEnabled(false);
1746 _pppRefCrdXLineEdit->setEnabled(false);
1747 _pppRefCrdYLineEdit->setEnabled(false);
1748 _pppRefCrdZLineEdit->setEnabled(false);
1749 _pppUsePhaseCheckBox->setEnabled(false);
1750 _pppPlotCoordinates->setEnabled(false);
1751 _pppEstTropoCheckBox->setEnabled(false);
1752 _pppGLONASSCheckBox->setEnabled(false);
1753 _pppGalileoCheckBox->setEnabled(false);
1754 _pppSigCLineEdit->setEnabled(false);
1755 _pppSigPLineEdit->setEnabled(false);
1756 _pppSigCrd0->setEnabled(false);
1757 _pppSigCrdP->setEnabled(false);
1758 _pppSigTrp0->setEnabled(false);
1759 _pppSigTrpP->setEnabled(false);
1760 _pppAverageLineEdit->setEnabled(false);
1761 _pppQuickStartLineEdit->setEnabled(false);
1762 }
1763 }
1764}
Note: See TracBrowser for help on using the repository browser.