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

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

Type corrected

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