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

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