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

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

PPP Client tab layout changed

File size: 89.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 _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>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
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 _pppSPPComboBox->setMaximumWidth(8*ww);
736 _pppNMEAPortLineEdit->setMaximumWidth(6*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(new QLabel("Options cont'd"), 2, 0);
757 pppLayout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
758 pppLayout->addWidget(new QLabel("Sigma Code"), 2, 2);
759 pppLayout->addWidget(_pppSigPLineEdit, 2, 3);
760 pppLayout->addWidget(new QLabel("Sigma Phase"), 2, 4);
761 pppLayout->addWidget(_pppQuickStartLineEdit, 2, 5, Qt::AlignRight);
762 pppLayout->addWidget(new QLabel("Quick-Start (sec) ") , 2, 6);
763 pppLayout->addWidget(_pppAverageLineEdit, 2, 7);
764 pppLayout->addWidget(new QLabel("Averaging (min)") , 2, 8);
765 pppLayout->addWidget(new QLabel("Parameter sigmas"), 3, 0);
766 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
767 pppLayout->addWidget(new QLabel("XYZ Init"), 3, 2);
768 pppLayout->addWidget(_pppSigCrdP, 3, 3);
769 pppLayout->addWidget(new QLabel("XYZ White Noise "), 3, 4);
770 pppLayout->addWidget(_pppSigTrp0, 3, 5, Qt::AlignRight);
771 pppLayout->addWidget(new QLabel("Tropo Init"), 3, 6);
772 pppLayout->addWidget(_pppSigTrpP, 3, 7);
773 pppLayout->addWidget(new QLabel("Tropo White Noise"), 3, 8);
774 pppLayout->addWidget(new QLabel("Output"), 4, 0);
775 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 3);
776 pppLayout->addWidget(new QLabel("NMEA file"), 4, 4);
777 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 5);
778 pppLayout->addWidget(new QLabel("NMEA port"), 4, 6);
779 pppLayout->addWidget(_pppPlotCoordinates, 4, 7, Qt::AlignRight);
780 pppLayout->addWidget(new QLabel("PPP Plot"), 4, 8);
781
782 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
783 pppgroup->setLayout(pppLayout);
784
785 // Main Layout
786 // -----------
787 QGridLayout* mLayout = new QGridLayout;
788 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
789 mLayout->addWidget(_aogroup, 0,0);
790 mLayout->addWidget(_mountPointsTable, 1,0);
791 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
792 mLayout->addWidget(_loggroup, 2,0);
793
794 _canvas->setLayout(mLayout);
795
796 // Enable/Disable all Widgets
797 // --------------------------
798 slotBncTextChanged();
799
800 // Auto start
801 // ----------
802 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
803 slotGetData();
804 }
805}
806
807// Destructor
808////////////////////////////////////////////////////////////////////////////
809bncWindow::~bncWindow() {
810 delete _caster;
811}
812
813//
814////////////////////////////////////////////////////////////////////////////
815void bncWindow::populateMountPointsTable() {
816
817 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
818 _mountPointsTable->removeRow(iRow);
819 }
820
821 bncSettings settings;
822
823 QListIterator<QString> it(settings.value("mountPoints").toStringList());
824 if (!it.hasNext()) {
825 _actGetData->setEnabled(false);
826 }
827 int iRow = 0;
828 while (it.hasNext()) {
829 QStringList hlp = it.next().split(" ");
830 if (hlp.size() < 5) continue;
831 _mountPointsTable->insertRow(iRow);
832
833 QUrl url(hlp[0]);
834
835 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
836 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
837 QString nmea(hlp[4]);
838 if (hlp[5] == "S") {
839 fullPath = hlp[0].replace(0,2,"");
840 }
841 QString ntripVersion = "1";
842 if (hlp.size() >= 6) {
843 ntripVersion = (hlp[5]);
844 }
845
846 QTableWidgetItem* it;
847 it = new QTableWidgetItem(url.userInfo());
848 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
849 _mountPointsTable->setItem(iRow, 0, it);
850
851 it = new QTableWidgetItem(fullPath);
852 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
853 _mountPointsTable->setItem(iRow, 1, it);
854
855 it = new QTableWidgetItem(format);
856 _mountPointsTable->setItem(iRow, 2, it);
857
858 if (nmea == "yes") {
859 it = new QTableWidgetItem(latitude);
860 _mountPointsTable->setItem(iRow, 3, it);
861 it = new QTableWidgetItem(longitude);
862 _mountPointsTable->setItem(iRow, 4, it);
863 } else {
864 it = new QTableWidgetItem(latitude);
865 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
866 _mountPointsTable->setItem(iRow, 3, it);
867 it = new QTableWidgetItem(longitude);
868 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
869 _mountPointsTable->setItem(iRow, 4, it);
870 }
871
872 it = new QTableWidgetItem(nmea);
873 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
874 _mountPointsTable->setItem(iRow, 5, it);
875
876 it = new QTableWidgetItem(ntripVersion);
877 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
878 _mountPointsTable->setItem(iRow, 6, it);
879
880 bncTableItem* bncIt = new bncTableItem();
881 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
882 _mountPointsTable->setItem(iRow, 7, bncIt);
883
884 iRow++;
885 }
886
887 _mountPointsTable->sortItems(1);
888}
889
890// Retrieve Table
891////////////////////////////////////////////////////////////////////////////
892void bncWindow::slotAddMountPoints() {
893
894 bncSettings settings;
895 QString proxyHost = settings.value("proxyHost").toString();
896 int proxyPort = settings.value("proxyPort").toInt();
897 if (proxyHost != _proxyHostLineEdit->text() ||
898 proxyPort != _proxyPortLineEdit->text().toInt()) {
899 int iRet = QMessageBox::question(this, "Question", "Proxy options "
900 "changed. Use the new ones?",
901 QMessageBox::Yes, QMessageBox::No,
902 QMessageBox::NoButton);
903 if (iRet == QMessageBox::Yes) {
904 settings.setValue("proxyHost", _proxyHostLineEdit->text());
905 settings.setValue("proxyPort", _proxyPortLineEdit->text());
906 settings.sync();
907 }
908 }
909
910 QMessageBox msgBox;
911 msgBox.setIcon(QMessageBox::Question);
912 msgBox.setWindowTitle("Add Stream");
913 msgBox.setText("Add stream(s) coming from:");
914
915 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
916 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
917 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
918 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
919 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
920
921 msgBox.exec();
922
923 if (msgBox.clickedButton() == buttonNtrip) {
924 bncTableDlg* dlg = new bncTableDlg(this);
925 dlg->move(this->pos().x()+50, this->pos().y()+50);
926 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
927 this, SLOT(slotNewMountPoints(QStringList*)));
928 dlg->exec();
929 delete dlg;
930 } else if (msgBox.clickedButton() == buttonIP) {
931 bncIpPort* ipp = new bncIpPort(this);
932 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
933 this, SLOT(slotNewMountPoints(QStringList*)));
934 ipp->exec();
935 delete ipp;
936 } else if (msgBox.clickedButton() == buttonUDP) {
937 bncUdpPort* udp = new bncUdpPort(this);
938 connect(udp, SIGNAL(newMountPoints(QStringList*)),
939 this, SLOT(slotNewMountPoints(QStringList*)));
940 udp->exec();
941 delete udp;
942 } else if (msgBox.clickedButton() == buttonSerial) {
943 bncSerialPort* sep = new bncSerialPort(this);
944 connect(sep, SIGNAL(newMountPoints(QStringList*)),
945 this, SLOT(slotNewMountPoints(QStringList*)));
946 sep->exec();
947 delete sep;
948 } else if (msgBox.clickedButton() == buttonCancel) {
949 // Cancel
950 }
951}
952
953// Delete Selected Mount Points
954////////////////////////////////////////////////////////////////////////////
955void bncWindow::slotDeleteMountPoints() {
956
957 int nRows = _mountPointsTable->rowCount();
958 bool flg[nRows];
959 for (int iRow = 0; iRow < nRows; iRow++) {
960 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
961 flg[iRow] = true;
962 }
963 else {
964 flg[iRow] = false;
965 }
966 }
967 for (int iRow = nRows-1; iRow >= 0; iRow--) {
968 if (flg[iRow]) {
969 _mountPointsTable->removeRow(iRow);
970 }
971 }
972 _actDeleteMountPoints->setEnabled(false);
973
974 if (_mountPointsTable->rowCount() == 0) {
975 _actGetData->setEnabled(false);
976 }
977}
978
979// New Mount Points Selected
980////////////////////////////////////////////////////////////////////////////
981void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
982 int iRow = 0;
983 QListIterator<QString> it(*mountPoints);
984 while (it.hasNext()) {
985 QStringList hlp = it.next().split(" ");
986 QUrl url(hlp[0]);
987 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
988 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
989 QString nmea(hlp[4]);
990 if (hlp[5] == "S") {
991 fullPath = hlp[0].replace(0,2,"");
992 }
993 QString ntripVersion = "1";
994 if (hlp.size() >= 6) {
995 ntripVersion = (hlp[5]);
996 }
997
998 _mountPointsTable->insertRow(iRow);
999
1000 QTableWidgetItem* it;
1001 it = new QTableWidgetItem(url.userInfo());
1002 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1003 _mountPointsTable->setItem(iRow, 0, it);
1004
1005 it = new QTableWidgetItem(fullPath);
1006 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1007 _mountPointsTable->setItem(iRow, 1, it);
1008
1009 it = new QTableWidgetItem(format);
1010 _mountPointsTable->setItem(iRow, 2, it);
1011
1012 if (nmea == "yes") {
1013 it = new QTableWidgetItem(latitude);
1014 _mountPointsTable->setItem(iRow, 3, it);
1015 it = new QTableWidgetItem(longitude);
1016 _mountPointsTable->setItem(iRow, 4, it);
1017 } else {
1018 it = new QTableWidgetItem(latitude);
1019 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1020 _mountPointsTable->setItem(iRow, 3, it);
1021 it = new QTableWidgetItem(longitude);
1022 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1023 _mountPointsTable->setItem(iRow, 4, it);
1024 }
1025
1026 it = new QTableWidgetItem(nmea);
1027 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1028 _mountPointsTable->setItem(iRow, 5, it);
1029
1030 it = new QTableWidgetItem(ntripVersion);
1031 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1032 _mountPointsTable->setItem(iRow, 6, it);
1033
1034 bncTableItem* bncIt = new bncTableItem();
1035 _mountPointsTable->setItem(iRow, 7, bncIt);
1036
1037 iRow++;
1038 }
1039 _mountPointsTable->hideColumn(0);
1040 _mountPointsTable->sortItems(1);
1041 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1042 _actGetData->setEnabled(true);
1043 }
1044 delete mountPoints;
1045}
1046
1047// Save Options
1048////////////////////////////////////////////////////////////////////////////
1049void bncWindow::slotSaveOptions() {
1050
1051 QStringList mountPoints;
1052 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1053
1054 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1055 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1056 "@" + _mountPointsTable->item(iRow, 1)->text() );
1057
1058 mountPoints.append(url.toString() + " " +
1059 _mountPointsTable->item(iRow, 2)->text()
1060 + " " + _mountPointsTable->item(iRow, 3)->text()
1061 + " " + _mountPointsTable->item(iRow, 4)->text()
1062 + " " + _mountPointsTable->item(iRow, 5)->text()
1063 + " " + _mountPointsTable->item(iRow, 6)->text());
1064 } else {
1065 mountPoints.append(
1066 "//" + _mountPointsTable->item(iRow, 1)->text()
1067 + " " + _mountPointsTable->item(iRow, 2)->text()
1068 + " " + _mountPointsTable->item(iRow, 3)->text()
1069 + " " + _mountPointsTable->item(iRow, 4)->text()
1070 + " " + _mountPointsTable->item(iRow, 5)->text()
1071 + " " + _mountPointsTable->item(iRow, 6)->text());
1072 }
1073 }
1074
1075 bncSettings settings;
1076
1077 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1078 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1079 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1080 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1081 settings.setValue("binSampl", _binSamplSpinBox->value());
1082 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1083 settings.setValue("corrPath", _corrPathLineEdit->text());
1084 settings.setValue("corrPort", _corrPortLineEdit->text());
1085 settings.setValue("corrTime", _corrTimeSpinBox->value());
1086 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1087 settings.setValue("ephPath", _ephPathLineEdit->text());
1088 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1089 settings.setValue("logFile", _logFileLineEdit->text());
1090 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1091 settings.setValue("miscMount", _miscMountLineEdit->text());
1092 settings.setValue("pppMount", _pppMountLineEdit->text());
1093 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1094 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1095 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1096 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1097 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1098 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1099 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1100 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1101 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1102 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1103 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1104 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1105 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1106 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1107 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1108 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1109 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1110 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1111 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1112 settings.setValue("mountPoints", mountPoints);
1113 settings.setValue("obsRate", _obsRateComboBox->currentText());
1114 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1115 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1116 settings.setValue("outFile", _outFileLineEdit->text());
1117 settings.setValue("outPort", _outPortLineEdit->text());
1118 settings.setValue("outUPort", _outUPortLineEdit->text());
1119 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1120 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1121 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1122 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1123 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1124 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1125 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1126 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1127 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1128 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1129 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1130 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1131 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1132 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1133 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1134 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1135 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1136 settings.setValue("serialParity", _serialParityComboBox->currentText());
1137 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1138 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1139 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1140 settings.setValue("startTab", _aogroup->currentIndex());
1141 settings.setValue("statusTab", _loggroup->currentIndex());
1142 settings.setValue("waitTime", _waitTimeSpinBox->value());
1143
1144 if (_caster) {
1145 _caster->slotReadMountPoints();
1146 }
1147 settings.sync();
1148}
1149
1150// All get slots terminated
1151////////////////////////////////////////////////////////////////////////////
1152void bncWindow::slotGetThreadsFinished() {
1153 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1154 delete _caster; _caster = 0;
1155 _actGetData->setEnabled(true);
1156 _actStop->setEnabled(false);
1157}
1158
1159// Retrieve Data
1160////////////////////////////////////////////////////////////////////////////
1161void bncWindow::slotGetData() {
1162 slotSaveOptions();
1163
1164 _bncFigurePPP->reset();
1165
1166 _actDeleteMountPoints->setEnabled(false);
1167 _actGetData->setEnabled(false);
1168 _actStop->setEnabled(true);
1169
1170 _caster = new bncCaster(_outFileLineEdit->text(),
1171 _outPortLineEdit->text().toInt());
1172
1173 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1174 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1175
1176 connect(_caster, SIGNAL(getThreadsFinished()),
1177 this, SLOT(slotGetThreadsFinished()));
1178
1179 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1180 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1181
1182 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1183
1184 bncSettings settings;
1185
1186 QDir rnxdir(settings.value("rnxPath").toString());
1187 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1188
1189 QString rnx_file = settings.value("rnxScript").toString();
1190 if ( !rnx_file.isEmpty() ) {
1191 QFile rnxfile(settings.value("rnxScript").toString());
1192 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1193 }
1194
1195 QDir ephdir(settings.value("ephPath").toString());
1196 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1197
1198 QDir corrdir(settings.value("corrPath").toString());
1199 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1200
1201 QString advise_file = settings.value("adviseScript").toString();
1202 if ( !advise_file.isEmpty() ) {
1203 QFile advisefile(settings.value("adviseScript").toString());
1204 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1205 }
1206
1207 _caster->slotReadMountPoints();
1208}
1209
1210// Retrieve Data
1211////////////////////////////////////////////////////////////////////////////
1212void bncWindow::slotStop() {
1213 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1214 QMessageBox::Yes, QMessageBox::No,
1215 QMessageBox::NoButton);
1216 if (iRet == QMessageBox::Yes) {
1217 delete _caster; _caster = 0;
1218 _actGetData->setEnabled(true);
1219 _actStop->setEnabled(false);
1220 }
1221}
1222
1223// Close Application gracefully
1224////////////////////////////////////////////////////////////////////////////
1225void bncWindow::closeEvent(QCloseEvent* event) {
1226
1227 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1228 QMessageBox::Yes, QMessageBox::No,
1229 QMessageBox::Cancel);
1230
1231 if (iRet == QMessageBox::Cancel) {
1232 event->ignore();
1233 return;
1234 }
1235 else if (iRet == QMessageBox::Yes) {
1236 slotSaveOptions();
1237 }
1238
1239 QMainWindow::closeEvent(event);
1240}
1241
1242// User changed the selection of mountPoints
1243////////////////////////////////////////////////////////////////////////////
1244void bncWindow::slotSelectionChanged() {
1245 if (_mountPointsTable->selectedItems().isEmpty()) {
1246 _actDeleteMountPoints->setEnabled(false);
1247 }
1248 else {
1249 _actDeleteMountPoints->setEnabled(true);
1250 }
1251}
1252
1253// Display Program Messages
1254////////////////////////////////////////////////////////////////////////////
1255void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1256
1257#ifdef DEBUG_RTCM2_2021
1258 const int maxBufferSize = 1000;
1259#else
1260 const int maxBufferSize = 10000;
1261#endif
1262
1263 if (! showOnScreen ) {
1264 return;
1265 }
1266
1267 QString txt = _log->toPlainText() + "\n" +
1268 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1269 _log->clear();
1270 _log->append(txt.right(maxBufferSize));
1271}
1272
1273// About Message
1274////////////////////////////////////////////////////////////////////////////
1275void bncWindow::slotAbout() {
1276 new bncAboutDlg(0);
1277}
1278
1279//Flowchart
1280////////////////////////////////////////////////////////////////////////////
1281void bncWindow::slotFlowchart() {
1282 new bncFlowchartDlg(0);
1283}
1284
1285// Help Window
1286////////////////////////////////////////////////////////////////////////////
1287void bncWindow::slotHelp() {
1288 QUrl url;
1289 url.setPath(":bnchelp.html");
1290 new bncHlpDlg(0, url);
1291}
1292
1293// Select Fonts
1294////////////////////////////////////////////////////////////////////////////
1295void bncWindow::slotFontSel() {
1296 bool ok;
1297 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1298 if (ok) {
1299 bncSettings settings;
1300 settings.setValue("font", newFont.toString());
1301 QApplication::setFont(newFont);
1302 int ww = QFontMetrics(newFont).width('w');
1303 setMinimumSize(60*ww, 80*ww);
1304 resize(60*ww, 80*ww);
1305 }
1306}
1307
1308// Whats This Help
1309void bncWindow::slotWhatsThis() {
1310 QWhatsThis::enterWhatsThisMode();
1311}
1312
1313//
1314////////////////////////////////////////////////////////////////////////////
1315void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1316 _bncFigure->updateMountPoints();
1317 _bncFigureLate->updateMountPoints();
1318
1319 populateMountPointsTable();
1320 bncSettings settings;
1321 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1322 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1323 QListIterator<bncGetThread*> iTh(threads);
1324 while (iTh.hasNext()) {
1325 bncGetThread* thread = iTh.next();
1326 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1327 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1328 "@" + _mountPointsTable->item(iRow, 1)->text() );
1329 if (url == thread->mountPoint() &&
1330 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1331 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1332 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1333 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1334 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1335 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1336 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1337 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1338 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1339 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1340 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1341 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1342 disconnect(thread,
1343 SIGNAL(newPosition(bncTime, double, double, double)),
1344 _bncFigurePPP,
1345 SLOT(slotNewPosition(bncTime, double, double, double)));
1346 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1347 _bncFigurePPP,
1348 SLOT(slotNewPosition(bncTime, double, double, double)));
1349 }
1350 break;
1351 }
1352 }
1353 }
1354}
1355
1356//
1357////////////////////////////////////////////////////////////////////////////
1358void bncWindow::CreateMenu() {
1359 // Create Menus
1360 // ------------
1361 _menuFile = menuBar()->addMenu(tr("&File"));
1362 _menuFile->addAction(_actFontSel);
1363 _menuFile->addSeparator();
1364 _menuFile->addAction(_actSaveOpt);
1365 _menuFile->addSeparator();
1366 _menuFile->addAction(_actQuit);
1367
1368 _menuHlp = menuBar()->addMenu(tr("&Help"));
1369 _menuHlp->addAction(_actHelp);
1370 _menuHlp->addAction(_actFlowchart);
1371 _menuHlp->addAction(_actAbout);
1372}
1373
1374// Toolbar
1375////////////////////////////////////////////////////////////////////////////
1376void bncWindow::AddToolbar() {
1377 // Tool (Command) Bar
1378 // ------------------
1379 QToolBar* toolBar = new QToolBar;
1380 addToolBar(Qt::BottomToolBarArea, toolBar);
1381 toolBar->setMovable(false);
1382 toolBar->addAction(_actAddMountPoints);
1383 toolBar->addAction(_actDeleteMountPoints);
1384 toolBar->addAction(_actGetData);
1385 toolBar->addAction(_actStop);
1386 toolBar->addWidget(new QLabel(" "));
1387 toolBar->addAction(_actwhatsthis);
1388}
1389
1390// About
1391////////////////////////////////////////////////////////////////////////////
1392bncAboutDlg::bncAboutDlg(QWidget* parent) :
1393 QDialog(parent) {
1394
1395 QTextBrowser* tb = new QTextBrowser;
1396 QUrl url; url.setPath(":bncabout.html");
1397 tb->setSource(url);
1398 tb->setReadOnly(true);
1399
1400 int ww = QFontMetrics(font()).width('w');
1401 QPushButton* _closeButton = new QPushButton("Close");
1402 _closeButton->setMaximumWidth(10*ww);
1403 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1404
1405 QGridLayout* dlgLayout = new QGridLayout();
1406 QLabel* img = new QLabel();
1407 img->setPixmap(QPixmap(":ntrip-logo.png"));
1408 dlgLayout->addWidget(img, 0,0);
1409 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1410 dlgLayout->addWidget(tb,1,0,1,2);
1411 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1412
1413 setLayout(dlgLayout);
1414 resize(60*ww, 60*ww);
1415 setWindowTitle("About BNC");
1416 show();
1417}
1418
1419//
1420////////////////////////////////////////////////////////////////////////////
1421bncAboutDlg::~bncAboutDlg() {
1422};
1423
1424// Flowchart
1425////////////////////////////////////////////////////////////////////////////
1426bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1427 QDialog(parent) {
1428
1429 int ww = QFontMetrics(font()).width('w');
1430 QPushButton* _closeButton = new QPushButton("Close");
1431 _closeButton->setMaximumWidth(10*ww);
1432 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1433
1434 QGridLayout* dlgLayout = new QGridLayout();
1435 QLabel* img = new QLabel();
1436 img->setPixmap(QPixmap(":bncflowchart.png"));
1437 dlgLayout->addWidget(img, 0,0);
1438 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1439
1440 setLayout(dlgLayout);
1441 setWindowTitle("Flow Chart");
1442 show();
1443}
1444
1445//
1446////////////////////////////////////////////////////////////////////////////
1447bncFlowchartDlg::~bncFlowchartDlg() {
1448};
1449
1450// Bnc Text
1451////////////////////////////////////////////////////////////////////////////
1452void bncWindow::slotBncTextChanged(){
1453
1454 QPalette palette_white(QColor(255, 255, 255));
1455 QPalette palette_gray(QColor(230, 230, 230));
1456 bncSettings settings;
1457
1458 // Proxy
1459 //------
1460 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1461 if (!_proxyHostLineEdit->text().isEmpty()) {
1462 _proxyPortLineEdit->setStyleSheet("background-color: white");
1463 _proxyPortLineEdit->setEnabled(true);
1464 }
1465 else {
1466 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1467 _proxyPortLineEdit->setEnabled(false);
1468 }
1469 }
1470
1471 // RINEX Observations
1472 // ------------------
1473 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1474 if (!_rnxPathLineEdit->text().isEmpty()) {
1475 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1476 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1477 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1478 _rnxV3CheckBox->setPalette(palette_white);
1479 _rnxIntrComboBox->setStyleSheet("background-color: white");
1480 _rnxSamplSpinBox->setEnabled(true);
1481 _rnxSkelLineEdit->setEnabled(true);
1482 _rnxScrpLineEdit->setEnabled(true);
1483 _rnxV3CheckBox->setEnabled(true);
1484 _rnxIntrComboBox->setEnabled(true);
1485 }
1486 else {
1487 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1488 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1489 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1490 _rnxV3CheckBox->setPalette(palette_gray);
1491 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1492 _rnxSamplSpinBox->setEnabled(false);
1493 _rnxSkelLineEdit->setEnabled(false);
1494 _rnxScrpLineEdit->setEnabled(false);
1495 _rnxV3CheckBox->setEnabled(false);
1496 _rnxIntrComboBox->setEnabled(false);
1497 }
1498 }
1499
1500 // RINEX Ephemeris
1501 // ---------------
1502 if (sender() == 0 ||
1503 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1504 if (!_ephPathLineEdit->text().isEmpty() ||
1505 !_outEphPortLineEdit->text().isEmpty()) {
1506 _ephIntrComboBox->setStyleSheet("background-color: white");
1507 _ephV3CheckBox->setPalette(palette_white);
1508 _ephIntrComboBox->setEnabled(true);
1509 _ephV3CheckBox->setEnabled(true);
1510 }
1511 else {
1512 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1513 _ephV3CheckBox->setPalette(palette_gray);
1514 _ephIntrComboBox->setEnabled(false);
1515 _ephV3CheckBox->setEnabled(false);
1516 }
1517 }
1518
1519 // Broadcast Corrections
1520 // ---------------------
1521 if (sender() == 0 ||
1522 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1523 if (!_corrPathLineEdit->text().isEmpty() ||
1524 !_corrPortLineEdit->text().isEmpty()) {
1525 _corrIntrComboBox->setStyleSheet("background-color: white");
1526 _corrIntrComboBox->setEnabled(true);
1527 }
1528 else {
1529 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1530 _corrIntrComboBox->setEnabled(false);
1531 }
1532 }
1533
1534 // Feed Engine
1535 // -----------
1536 if (sender() == 0 ||
1537 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1538 if ( !_outPortLineEdit->text().isEmpty() ||
1539 !_outFileLineEdit->text().isEmpty()) {
1540 _waitTimeSpinBox->setStyleSheet("background-color: white");
1541 _binSamplSpinBox->setStyleSheet("background-color: white");
1542 _waitTimeSpinBox->setEnabled(true);
1543 _binSamplSpinBox->setEnabled(true);
1544 }
1545 else {
1546 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1547 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1548 _waitTimeSpinBox->setEnabled(false);
1549 _binSamplSpinBox->setEnabled(false);
1550 }
1551 }
1552
1553 // Serial Output
1554 // -------------
1555 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1556 sender() == _serialAutoNMEAComboBox) {
1557 if (!_serialMountPointLineEdit->text().isEmpty()) {
1558 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1559 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1560 _serialParityComboBox->setStyleSheet("background-color: white");
1561 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1562 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1563 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1564 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1565 _serialPortNameLineEdit->setEnabled(true);
1566 _serialBaudRateComboBox->setEnabled(true);
1567 _serialParityComboBox->setEnabled(true);
1568 _serialDataBitsComboBox->setEnabled(true);
1569 _serialStopBitsComboBox->setEnabled(true);
1570 _serialFlowControlComboBox->setEnabled(true);
1571 _serialAutoNMEAComboBox->setEnabled(true);
1572 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1573 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1574 _serialHeightNMEALineEdit->setEnabled(true);
1575 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1576 _serialFileNMEALineEdit->setEnabled(false);
1577 }
1578 else {
1579 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1580 _serialHeightNMEALineEdit->setEnabled(false);
1581 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1582 _serialFileNMEALineEdit->setEnabled(true);
1583 }
1584 }
1585 else {
1586 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1587 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1588 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1589 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1590 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1591 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1592 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1593 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1594 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1595 _serialPortNameLineEdit->setEnabled(false);
1596 _serialBaudRateComboBox->setEnabled(false);
1597 _serialParityComboBox->setEnabled(false);
1598 _serialDataBitsComboBox->setEnabled(false);
1599 _serialStopBitsComboBox->setEnabled(false);
1600 _serialFlowControlComboBox->setEnabled(false);
1601 _serialAutoNMEAComboBox->setEnabled(false);
1602 _serialHeightNMEALineEdit->setEnabled(false);
1603 _serialFileNMEALineEdit->setEnabled(false);
1604 }
1605 }
1606
1607 // Outages
1608 // -------
1609 if (sender() == 0 || sender() == _obsRateComboBox) {
1610 if (!_obsRateComboBox->currentText().isEmpty()) {
1611 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1612 _adviseFailSpinBox->setStyleSheet("background-color: white");
1613 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1614 _adviseFailSpinBox->setEnabled(true);
1615 _adviseRecoSpinBox->setEnabled(true);
1616 _adviseScriptLineEdit->setEnabled(true);
1617 } else {
1618 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1619 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1620 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1621 _adviseFailSpinBox->setEnabled(false);
1622 _adviseRecoSpinBox->setEnabled(false);
1623 _adviseScriptLineEdit->setEnabled(false);
1624 }
1625 }
1626
1627 // Miscellaneous
1628 // -------------
1629 if (sender() == 0 || sender() == _miscMountLineEdit) {
1630 if (!_miscMountLineEdit->text().isEmpty()) {
1631 _perfIntrComboBox->setStyleSheet("background-color: white");
1632 _scanRTCMCheckBox->setPalette(palette_white);
1633 _perfIntrComboBox->setEnabled(true);
1634 _scanRTCMCheckBox->setEnabled(true);
1635 } else {
1636 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1637 _scanRTCMCheckBox->setPalette(palette_gray);
1638 _perfIntrComboBox->setEnabled(false);
1639 _scanRTCMCheckBox->setEnabled(false);
1640 }
1641 }
1642
1643 // PPP Client
1644 // ----------
1645 if (sender() == 0
1646 || sender() == _pppMountLineEdit
1647 || sender() == _pppRefCrdXLineEdit
1648 || sender() == _pppRefCrdYLineEdit
1649 || sender() == _pppRefCrdZLineEdit
1650 || sender() == _pppEstTropoCheckBox
1651 || sender() == _pppUsePhaseCheckBox ) {
1652 if (!_pppMountLineEdit->text().isEmpty()) {
1653 _pppSPPComboBox->setPalette(palette_white);
1654 _pppNMEALineEdit->setPalette(palette_white);
1655 _pppNMEAPortLineEdit->setPalette(palette_white);
1656 _pppRefCrdXLineEdit->setPalette(palette_white);
1657 _pppRefCrdYLineEdit->setPalette(palette_white);
1658 _pppRefCrdZLineEdit->setPalette(palette_white);
1659 _pppUsePhaseCheckBox->setPalette(palette_white);
1660 _pppPlotCoordinates->setPalette(palette_white);
1661 _pppEstTropoCheckBox->setPalette(palette_white);
1662 _pppGLONASSCheckBox->setPalette(palette_white);
1663 _pppGalileoCheckBox->setPalette(palette_white);
1664 _pppSPPComboBox->setEnabled(true);
1665 _pppNMEALineEdit->setEnabled(true);
1666 _pppNMEAPortLineEdit->setEnabled(true);
1667 _pppRefCrdXLineEdit->setEnabled(true);
1668 _pppRefCrdYLineEdit->setEnabled(true);
1669 _pppRefCrdZLineEdit->setEnabled(true);
1670 _pppUsePhaseCheckBox->setEnabled(true);
1671 _pppPlotCoordinates->setEnabled(true);
1672 _pppEstTropoCheckBox->setEnabled(true);
1673 _pppGLONASSCheckBox->setEnabled(true);
1674 _pppGalileoCheckBox->setEnabled(true);
1675 _pppRefCrdXLineEdit->setPalette(palette_white);
1676 _pppRefCrdXLineEdit->setEnabled(true);
1677 _pppRefCrdYLineEdit->setPalette(palette_white);
1678 _pppRefCrdYLineEdit->setEnabled(true);
1679 _pppRefCrdZLineEdit->setPalette(palette_white);
1680 _pppRefCrdZLineEdit->setEnabled(true);
1681
1682 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1683 !_pppRefCrdYLineEdit->text().isEmpty() &&
1684 !_pppRefCrdZLineEdit->text().isEmpty()) {
1685 _pppAverageLineEdit->setPalette(palette_white);
1686 _pppAverageLineEdit->setEnabled(true);
1687 _pppQuickStartLineEdit->setPalette(palette_white);
1688 _pppQuickStartLineEdit->setEnabled(true);
1689 }
1690 else {
1691 _pppAverageLineEdit->setPalette(palette_gray);
1692 _pppAverageLineEdit->setEnabled(false);
1693 _pppQuickStartLineEdit->setPalette(palette_gray);
1694 _pppQuickStartLineEdit->setEnabled(false);
1695 }
1696 _pppSigCLineEdit->setPalette(palette_white);
1697 _pppSigCLineEdit->setEnabled(true);
1698 _pppSigCrd0->setPalette(palette_white);
1699 _pppSigCrd0->setEnabled(true);
1700 _pppSigCrdP->setPalette(palette_white);
1701 _pppSigCrdP->setEnabled(true);
1702 if (_pppEstTropoCheckBox->isChecked()
1703 && !_pppMountLineEdit->text().isEmpty()) {
1704 _pppSigTrp0->setPalette(palette_white);
1705 _pppSigTrp0->setEnabled(true);
1706 _pppSigTrpP->setPalette(palette_white);
1707 _pppSigTrpP->setEnabled(true);
1708 }
1709 else {
1710 _pppSigTrp0->setPalette(palette_gray);
1711 _pppSigTrp0->setEnabled(false);
1712 _pppSigTrpP->setPalette(palette_gray);
1713 _pppSigTrpP->setEnabled(false);
1714 }
1715 if (_pppUsePhaseCheckBox->isChecked()
1716 && !_pppMountLineEdit->text().isEmpty()) {
1717 _pppSigPLineEdit->setPalette(palette_white);
1718 _pppSigPLineEdit->setEnabled(true);
1719 }
1720 else {
1721 _pppSigPLineEdit->setPalette(palette_gray);
1722 _pppSigPLineEdit->setEnabled(false);
1723 }
1724 } else {
1725 _pppSPPComboBox->setPalette(palette_gray);
1726 _pppNMEALineEdit->setPalette(palette_gray);
1727 _pppNMEAPortLineEdit->setPalette(palette_gray);
1728 _pppRefCrdXLineEdit->setPalette(palette_gray);
1729 _pppRefCrdYLineEdit->setPalette(palette_gray);
1730 _pppRefCrdZLineEdit->setPalette(palette_gray);
1731 _pppUsePhaseCheckBox->setPalette(palette_gray);
1732 _pppPlotCoordinates->setPalette(palette_gray);
1733 _pppEstTropoCheckBox->setPalette(palette_gray);
1734 _pppGLONASSCheckBox->setPalette(palette_gray);
1735 _pppGalileoCheckBox->setPalette(palette_gray);
1736 _pppSigCLineEdit->setPalette(palette_gray);
1737 _pppSigPLineEdit->setPalette(palette_gray);
1738 _pppSigCrd0->setPalette(palette_gray);
1739 _pppSigCrdP->setPalette(palette_gray);
1740 _pppSigTrp0->setPalette(palette_gray);
1741 _pppSigTrpP->setPalette(palette_gray);
1742 _pppAverageLineEdit->setPalette(palette_gray);
1743 _pppQuickStartLineEdit->setPalette(palette_gray);
1744 _pppSPPComboBox->setEnabled(false);
1745 _pppNMEALineEdit->setEnabled(false);
1746 _pppNMEAPortLineEdit->setEnabled(false);
1747 _pppRefCrdXLineEdit->setEnabled(false);
1748 _pppRefCrdYLineEdit->setEnabled(false);
1749 _pppRefCrdZLineEdit->setEnabled(false);
1750 _pppUsePhaseCheckBox->setEnabled(false);
1751 _pppPlotCoordinates->setEnabled(false);
1752 _pppEstTropoCheckBox->setEnabled(false);
1753 _pppGLONASSCheckBox->setEnabled(false);
1754 _pppGalileoCheckBox->setEnabled(false);
1755 _pppSigCLineEdit->setEnabled(false);
1756 _pppSigPLineEdit->setEnabled(false);
1757 _pppSigCrd0->setEnabled(false);
1758 _pppSigCrdP->setEnabled(false);
1759 _pppSigTrp0->setEnabled(false);
1760 _pppSigTrpP->setEnabled(false);
1761 _pppAverageLineEdit->setEnabled(false);
1762 _pppQuickStartLineEdit->setEnabled(false);
1763 }
1764 }
1765}
Note: See TracBrowser for help on using the repository browser.