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

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

Editorial changes

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