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

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

Online help for QuickStart

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