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

Last change on this file since 2546 was 2483, checked in by weber, 15 years ago

Change pppSigC to pppSigmaCode

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