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

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