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

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

PPP section restructured

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