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

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