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

Last change on this file since 2875 was 2875, checked in by mervart, 13 years ago
File size: 95.1 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59
60using namespace std;
61
62// Constructor
63////////////////////////////////////////////////////////////////////////////
64bncWindow::bncWindow() {
65
66 _caster = 0;
67
68 _bncFigure = new bncFigure(this);
69 _bncFigureLate = new bncFigureLate(this);
70 _bncFigurePPP = new bncFigurePPP(this);
71
72 int ww = QFontMetrics(this->font()).width('w');
73
74 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
75
76 setMinimumSize(85*ww, 65*ww);
77
78 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
79
80 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
81 this, SLOT(slotWindowMessage(QByteArray,bool)));
82
83 // Create Actions
84 // --------------
85 _actHelp = new QAction(tr("&Help Contents"),this);
86 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
87
88 _actAbout = new QAction(tr("&About BNC"),this);
89 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
90
91 _actFlowchart = new QAction(tr("&Flow Chart"),this);
92 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
93
94 _actFontSel = new QAction(tr("Select &Font"),this);
95 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
96
97 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
98 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
99
100 _actQuit = new QAction(tr("&Quit"),this);
101 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
102
103 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
104 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
105
106 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
107 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
108 _actDeleteMountPoints->setEnabled(false);
109
110 _actGetData = new QAction(tr("Sta&rt"),this);
111 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
112
113 _actStop = new QAction(tr("Sto&p"),this);
114 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
115 _actStop->setEnabled(false);
116
117 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
118 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
119
120 CreateMenu();
121 AddToolbar();
122
123 bncSettings settings;
124
125 // Proxy Options
126 // -------------
127 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
128 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
129
130 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
131 this, SLOT(slotBncTextChanged()));
132
133 // General Options
134 // ---------------
135 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
136 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
137 _rnxAppendCheckBox = new QCheckBox();
138 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
139 settings.value("rnxAppend").toInt()));
140 _onTheFlyComboBox = new QComboBox();
141 _onTheFlyComboBox->setEditable(false);
142 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
143 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
144 if (ii != -1) {
145 _onTheFlyComboBox->setCurrentIndex(ii);
146 }
147 _autoStartCheckBox = new QCheckBox();
148 _autoStartCheckBox->setCheckState(Qt::CheckState(
149 settings.value("autoStart").toInt()));
150
151 // RINEX Observations Options
152 // --------------------------
153 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
154 _rnxIntrComboBox = new QComboBox();
155 _rnxIntrComboBox->setEditable(false);
156 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
157 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
158 if (ii != -1) {
159 _rnxIntrComboBox->setCurrentIndex(ii);
160 }
161 _rnxSamplSpinBox = new QSpinBox();
162 _rnxSamplSpinBox->setMinimum(0);
163 _rnxSamplSpinBox->setMaximum(60);
164 _rnxSamplSpinBox->setSingleStep(5);
165 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
166 _rnxSamplSpinBox->setSuffix(" sec");
167 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
168 _rnxSkelLineEdit->setMaximumWidth(5*ww);
169 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
170 _rnxV3CheckBox = new QCheckBox();
171 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
172
173 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
174 this, SLOT(slotBncTextChanged()));
175
176 // RINEX Ephemeris Options
177 // -----------------------
178 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
179 _ephIntrComboBox = new QComboBox();
180 _ephIntrComboBox->setEditable(false);
181 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
182 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
183 if (jj != -1) {
184 _ephIntrComboBox->setCurrentIndex(jj);
185 }
186 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
187 _ephV3CheckBox = new QCheckBox();
188 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
189
190 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
191 this, SLOT(slotBncTextChanged()));
192
193 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
194 this, SLOT(slotBncTextChanged()));
195
196 // Broadcast Corrections Options
197 // -----------------------------
198 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
199 _corrIntrComboBox = new QComboBox();
200 _corrIntrComboBox->setEditable(false);
201 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
202 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
203 if (mm != -1) {
204 _corrIntrComboBox->setCurrentIndex(mm);
205 }
206 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
207 _corrTimeSpinBox = new QSpinBox();
208 _corrTimeSpinBox->setMinimum(1);
209 _corrTimeSpinBox->setMaximum(60);
210 _corrTimeSpinBox->setSingleStep(1);
211 _corrTimeSpinBox->setSuffix(" sec");
212 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
213
214 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
215 this, SLOT(slotBncTextChanged()));
216
217 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
218 this, SLOT(slotBncTextChanged()));
219
220 // Feed Engine Options
221 // -------------------
222 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
223 _waitTimeSpinBox = new QSpinBox();
224 _waitTimeSpinBox->setMinimum(1);
225 _waitTimeSpinBox->setMaximum(30);
226 _waitTimeSpinBox->setSingleStep(1);
227 _waitTimeSpinBox->setSuffix(" sec");
228 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
229 _binSamplSpinBox = new QSpinBox();
230 _binSamplSpinBox->setMinimum(0);
231 _binSamplSpinBox->setMaximum(60);
232 _binSamplSpinBox->setSingleStep(5);
233 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
234 _binSamplSpinBox->setSuffix(" sec");
235 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
236 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
237
238 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
239 this, SLOT(slotBncTextChanged()));
240
241 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
242 this, SLOT(slotBncTextChanged()));
243
244 // Serial Output Options
245 // ---------------------
246 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
247 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
248 _serialBaudRateComboBox = new QComboBox();
249 _serialBaudRateComboBox->addItems(QString("110,300,600,"
250 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
251 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
252 if (kk != -1) {
253 _serialBaudRateComboBox->setCurrentIndex(kk);
254 }
255 _serialFlowControlComboBox = new QComboBox();
256 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
257 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
258 if (kk != -1) {
259 _serialFlowControlComboBox->setCurrentIndex(kk);
260 }
261 _serialDataBitsComboBox = new QComboBox();
262 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
263 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
264 if (kk != -1) {
265 _serialDataBitsComboBox->setCurrentIndex(kk);
266 }
267 _serialParityComboBox = new QComboBox();
268 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
269 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
270 if (kk != -1) {
271 _serialParityComboBox->setCurrentIndex(kk);
272 }
273 _serialStopBitsComboBox = new QComboBox();
274 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
275 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
276 if (kk != -1) {
277 _serialStopBitsComboBox->setCurrentIndex(kk);
278 }
279 _serialAutoNMEAComboBox = new QComboBox();
280 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
281 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
282 if (kk != -1) {
283 _serialAutoNMEAComboBox->setCurrentIndex(kk);
284 }
285 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
286 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
287
288 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
289 this, SLOT(slotBncTextChanged()));
290
291 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
292 this, SLOT(slotBncTextChanged()));
293
294 // Outages Options
295 // ---------------
296 _obsRateComboBox = new QComboBox();
297 _obsRateComboBox->setEditable(false);
298 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
299 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
300 if (kk != -1) {
301 _obsRateComboBox->setCurrentIndex(kk);
302 }
303 _adviseFailSpinBox = new QSpinBox();
304 _adviseFailSpinBox->setMinimum(0);
305 _adviseFailSpinBox->setMaximum(60);
306 _adviseFailSpinBox->setSingleStep(1);
307 _adviseFailSpinBox->setSuffix(" min");
308 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
309 _adviseRecoSpinBox = new QSpinBox();
310 _adviseRecoSpinBox->setMinimum(0);
311 _adviseRecoSpinBox->setMaximum(60);
312 _adviseRecoSpinBox->setSingleStep(1);
313 _adviseRecoSpinBox->setSuffix(" min");
314 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
315 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
316
317 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
318 this, SLOT(slotBncTextChanged()));
319
320 // Miscellaneous Options
321 // ---------------------
322 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
323 _perfIntrComboBox = new QComboBox();
324 _perfIntrComboBox->setEditable(false);
325 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
326 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
327 if (ll != -1) {
328 _perfIntrComboBox->setCurrentIndex(ll);
329 }
330 _scanRTCMCheckBox = new QCheckBox();
331 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
332 settings.value("scanRTCM").toInt()));
333
334 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
335 this, SLOT(slotBncTextChanged()));
336
337 // PPP Options
338 // -----------
339 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
340 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
341 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
342 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
343 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
344 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
345 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
346 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
347 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
348 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
349 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
350 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
351 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
352 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
353 _pppSync = new QLineEdit(settings.value("pppSync").toString());
354
355 _pppSPPComboBox = new QComboBox();
356 _pppSPPComboBox->setEditable(false);
357 _pppSPPComboBox->addItems(QString("PPP,SPP").split(","));
358 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
359 if (ik != -1) {
360 _pppSPPComboBox->setCurrentIndex(ik);
361 }
362 _pppUsePhaseCheckBox = new QCheckBox();
363 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
364 settings.value("pppUsePhase").toInt()));
365 _pppEstTropoCheckBox = new QCheckBox();
366 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
367 settings.value("pppEstTropo").toInt()));
368 _pppGLONASSCheckBox = new QCheckBox();
369 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
370 settings.value("pppGLONASS").toInt()));
371 _pppGalileoCheckBox = new QCheckBox();
372 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
373 settings.value("pppGalileo").toInt()));
374
375 _pppPlotCoordinates = new QCheckBox();
376 _pppPlotCoordinates->setCheckState(Qt::CheckState(
377 settings.value("pppPlotCoordinates").toInt()));
378
379 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
380 this, SLOT(slotBncTextChanged()));
381
382 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
383 this, SLOT(slotBncTextChanged()));
384
385 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
386 this, SLOT(slotBncTextChanged()));
387 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
388 this, SLOT(slotBncTextChanged()));
389 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
390 this, SLOT(slotBncTextChanged()));
391
392 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
393 this, SLOT(slotBncTextChanged()));
394
395 connect(_pppSync, SIGNAL(textChanged(const QString &)),
396 this, SLOT(slotBncTextChanged()));
397
398 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
399 this, SLOT(slotBncTextChanged()));
400
401 // Streams
402 // -------
403 _mountPointsTable = new QTableWidget(0,8);
404
405 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
406 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
407 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
408 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
409 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
410 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
411 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
412 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
413 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
414 _mountPointsTable->setHorizontalHeaderLabels(labels);
415 _mountPointsTable->setGridStyle(Qt::NoPen);
416 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
417 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
418 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
419 _mountPointsTable->hideColumn(0);
420 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
421 SLOT(slotSelectionChanged()));
422 populateMountPointsTable();
423
424 _log = new QTextBrowser();
425 _log->setReadOnly(true);
426
427 // WhatsThis
428 // ---------
429 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you might need to use a proxy server to access the Internet. Enter your proxy server IP and port number in case one is operated in front of BNC. If you do not know the IP and port of your proxy server, check the proxy server settings in your Internet browser or ask your network administrator.</p><p>Note that IP streaming is sometimes not allowed in a LAN. In this case you need to ask your network administrator for an appropriate modification of the local security policy or for the installation of a TCP relay to the NTRIP broadcasters. If these are not possible, you might need to run BNC outside your LAN on a network that has unobstructed connection to the Internet.</p>"));
430 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
431 _waitTimeSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full epoch' seconds. A value of 3 to 5 seconds is recommended, depending on the latency of the incoming streams and the delay acceptable to your real-time GNSS network engine or products.</p>"));
432 _outFileLineEdit->setWhatsThis(tr("Specify the full path to a file where synchronized observations are saved in plain ASCII format. Beware that the size of this file can rapidly increase depending on the number of incoming streams."));
433 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in binary format on your local host through an IP port. Specify a port number here to activate this function."));
434 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in binary format on your local host through an IP port. Specify a port number here to activate this function."));
435 _outEphPortLineEdit->setWhatsThis(tr("BNC can produce ephemeris data in RINEX ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
436 _corrPortLineEdit->setWhatsThis(tr("BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port. Specify a port number here to activate this function."));
437 _corrTimeSpinBox->setWhatsThis(tr("Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application."));
438 _rnxPathLineEdit->setWhatsThis(tr("Here you specify the path to where the RINEX Observation files will be stored. If the specified directory does not exist, BNC will not create RINEX Observation files."));
439 _ephPathLineEdit->setWhatsThis(tr("Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files. If the specified directory does not exist, BNC will not create RINEX Navigation files."));
440 _corrPathLineEdit->setWhatsThis(tr("Specify a directory for saving Broadcast Ephemeris Correction files. If the specified directory does not exist, BNC will not create the files."));
441 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is saved, you might want to compress, copy or upload it immediately via FTP. BNC allows you to execute a script/batch file to carry out these operations. To do that specify the full path of the script/batch file here. BNC will pass the full RINEX Observation file path to the script as a command line parameter (%1 on Windows systems, $1 onUnix/Linux systems).</p>"));
442 _rnxSkelLineEdit->setWhatsThis(tr("<p>BNC allows using personal skeleton files that contain the header records you would like to include. You can derive a personal RINEX header skeleton file from the information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' suffix is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream.</p>"));
443 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and any existing files with the same name will be overwritten. However, users might want to append already existing files following a restart of BNC, a system crash or when BNC crashed. Tick 'Append files' to continue with existing files and keep what has been recorded so far.</p>"));
444 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
445 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
446
447 _onTheFlyComboBox->setWhatsThis(tr("<p>When operating BNC online in 'no window' mode, some configuration parameters can be changed on-the-fly without interrupting the running process. For that BNC rereads parts of its configuration in pre-defined intervals.<p></p>Select '1 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, hour, or day and let in between edited configuration options become effective on-the-fly without terminating uninvolved threads.</p><p>Note that when operating BNC in window mode, on-the-fly changeable configuration options become effective immediately through 'Save & Reread Configuration'.</p>"));
448 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
449 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
450 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
451 _rnxSamplSpinBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. A value of zero '0' tells BNC to store all received epochs into RINEX.</p>"));
452 _binSamplSpinBox->setWhatsThis(tr("<p>Select the synchronized observation sampling interval in seconds. A value of zero '0' tells BNC to send/store all received epochs.</p>"));
453 _obsRateComboBox->setWhatsThis(tr("<p>BNC can collect all returns (success or failure) coming from a decoder within a certain short time span to then decide whether a stream has an outage or its content is corrupted. The procedure needs a rough estimate of the expected 'Observation rate' of the incoming streams. When a continuous problem is detected, BNC can inform its operator about this event through an advisory note.</p>"));
454 _adviseRecoSpinBox->setWhatsThis(tr("<p>Following a stream outage or a longer series of bad observations, an advisory note is generated when valid observations are received again throughout the 'Recovery threshold' time span. A value of about 5min (default) is recommended.</p><p>A value of zero '0' means that for any stream recovery, however short, BNC immediately generates an advisory note.</p>"));
455 _adviseFailSpinBox->setWhatsThis(tr("<p>An advisory note is generated when no (or only corrupted) observations are seen throughout the 'Failure threshold' time span. A value of 15 min (default) is recommended.</p><p>A value of zero '0' means that for any stream failure, however short, BNC immediately generates an advisory note.</p>"));
456 _logFileLineEdit->setWhatsThis(tr("<p>Records of BNC's activities are shown in the 'Log' tab on the bottom of this window. They can be saved into a file when a valid path is specified in the 'Logfile (full path)' field.</p><p>The logfile name will automatically be extended by a string '_YYMMDD' carrying the current date."));
457 _adviseScriptLineEdit->setWhatsThis(tr("<p>Specify the full path to a script or batch file to handle advisory notes generated in the event of corrupted streams or stream outages. The affected mountpoint and one of the comments 'Begin_Outage', 'End_Outage', 'Begin_Corrupted', or 'End_Corrupted' are passed on to the script as command line parameters.</p><p>The script may have the task to send the advisory notes by email to BNC's operator and/or to the affected stream provider. An empty option field (default) or invalid path means that you don't want to use this option.</p>"));
458 _perfIntrComboBox->setWhatsThis(tr("<p>BNC can average latencies per stream over a certain period of GPS time. The resulting mean latencies are recorded in the 'Log' tab at the end of each 'Log latency' interval together with results of a statistical evaluation (approximate number of covered epochs, data gaps).</p><p>Select a 'Log latency' interval or select the empty option field if you do not want BNC to log latencies and statistical information.</p>"));
459 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button will open a window that allows the user to select data streams from an NTRIP broadcaster according to their mountpoints. To remove a stream from the 'Streams' list, highlight it by clicking on it and hit the 'Delete Stream' button. You can also remove multiple streams by highlighting them using +Shift and +Ctrl.</p><p>BNC automatically allocates one of its internal decoders to a stream based on the stream's 'format' as given in the sourcetable. BNC allows users to change this selection by editing the decoder string. Double click on the 'decoder' field, enter your preferred decoder and then hit Enter. The accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x', and 'RTIGS'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate these streams, the approximate latitude/longitude rover position is sent to the NTRIP broadcaster. The default values can be change according to your requirement. Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter.</p>"));
460 _log->setWhatsThis(tr("Records of BNC's activities are shown in the 'Log' tab. The message log covers the communication status between BNC and the NTRIP broadcaster as well as any problems that occur in the communication link, stream availability, stream delay, stream conversion etc."));
461 _bncFigure->setWhatsThis(tr("The bandwidth consumtion per stream is shown in the 'Throughput' tab in bits per second (bps) or kilo bits per second (kbps)."));
462 _bncFigureLate->setWhatsThis(tr("The individual latency of observations in each incoming stream is shown in the 'Latency' tab. Streams not carrying observations (i.e. those providing only broadcast ephemeris messages) are not considered here. Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized."));
463 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
464 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
465 _miscMountLineEdit->setWhatsThis(tr("<p>Specify a mountpoint to apply any of the options shown below. Enter 'ALL' if you want to apply these options to all configured streams.</p><p>An empty option field (default) means that you don't want BNC to apply any of these options.</p>"));
466 _scanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incomming message types as well as contained antenna coordinates, antenna heigt, and antenna descriptor.</p>"));
467 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
468 _serialPortNameLineEdit->setWhatsThis(tr("<p>Enter the serial 'Port name' selected for communication with your serial connected receiver. Valid port names are</p><pre>Windows: COM1, COM2<br>Linux: /dev/ttyS0, /dev/ttyS1<br>FreeBSD: /dev/ttyd0, /dev/ttyd1<br>Digital Unix: /dev/tty01, /dev/tty02<br>HP-UX: /dev/tty1p0, /dev/tty2p0<br>SGI/IRIX: /dev/ttyf1, /dev/ttyf2<br>SunOS/Solaris: /dev/ttya, /dev/ttyb</pre><p>Note that you must plug a serial cable in the port defined here before you start BNC.</p>"));
469 _serialBaudRateComboBox->setWhatsThis(tr("<p>Select a 'Baud rate' for the serial output link.</p><p>Note that your selection must equal the baud rate configured to the serial connected receiver. Note further that using a high baud rate is recommended.</p>"));
470 _serialParityComboBox->setWhatsThis(tr("<p>Select the 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. Note further that parity is often set to 'NONE'.</p>"));
471 _serialDataBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Data bits' for the serial output link.</p><p>Note that your selection must equal the number of data bits configured to the serial connected receiver. Note further that often 8 data bits are used.</p>"));
472 _serialStopBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Stop bits' for the serial output link.</p><p>Note that your selection must equal the number of stop bits configured to the serial connected receiver. Note further that often 1 stop bit is used.</p>"));
473 _serialFlowControlComboBox->setWhatsThis(tr("<p>Select a 'Flow control' for the serial output link.</p><p>Note that your selection must equal the flow control configured to the serial connected receiver. Select 'OFF' if you don't know better.</p>"));
474 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>Select 'Auto' to automatically forward NMEA-GGA messages coming from your serial connected receiver to the NTRIP broadcaster and/or save them in a file.</p><p>Select 'Manual' only when handling a VRS stream and your serial connected receiver doesn't generate NMEA-GGA messages.</p>"));
475 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
476 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meter for your VRS to simulate an inital NMEA-GGA message.</p><p>The setting of this option is ignored in case of streams coming from physical reference stations.</p>"));
477 _pppMountLineEdit->setWhatsThis(tr("<p>Specify a mountpoint if you want BNC to estimate coordinates for the affected receiver position through a PPP solution.</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
478 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
479 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
480 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
481 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
482 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for a combined processing of both, GPS and Galileo observations in PPP mode.</p>"));
483 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
484 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
485 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
486 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
487 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'XYZ White Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
488 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
489 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
490 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
491 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the 'White Noise' of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
492 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
493 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 1e-6 (default) would mean that the tropospheric effect may vary for 3600 * 1e-6 = 0.0036 meters per hour.</p>"));
494 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
495 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
496 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
497 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when the corresponting option is selected above. Values are either referred to an XYZ reference coordinate (if specified) or referred to the first estimated set of coordinate compoments. The sliding PPP time series window covers the period of the latest 5 minutes."));
498 _pppSync->setWhatsThis(tr(
499 "<p> Zero value (or empty field) means that BNC processes each epoch of data "
500 "immediately after its arrival using satellite clock corrections available at "
501 "that time. Non-zero value 'pppSync' (i.e. 5) means that the epochs of data "
502 "are buffered and the processing of each epoch is postponed till the satellite clock "
503 "corrections not older than 'pppSync' seconds are available.<p>"));
504
505 // Canvas with Editable Fields
506 // ---------------------------
507 _canvas = new QWidget;
508 setCentralWidget(_canvas);
509
510 _aogroup = new QTabWidget();
511 QWidget* pgroup = new QWidget();
512 QWidget* ggroup = new QWidget();
513 QWidget* sgroup = new QWidget();
514 QWidget* egroup = new QWidget();
515 QWidget* agroup = new QWidget();
516 QWidget* cgroup = new QWidget();
517 QWidget* ogroup = new QWidget();
518 QWidget* rgroup = new QWidget();
519 QWidget* sergroup = new QWidget();
520 QWidget* pppgroup = new QWidget();
521 QWidget* cmbgroup = new QWidget();
522 _aogroup->addTab(pgroup,tr("Proxy"));
523 _aogroup->addTab(ggroup,tr("General"));
524 _aogroup->addTab(ogroup,tr("RINEX Observations"));
525 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
526 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
527 _aogroup->addTab(sgroup,tr("Feed Engine"));
528 _aogroup->addTab(sergroup,tr("Serial Output"));
529 _aogroup->addTab(agroup,tr("Outages"));
530 _aogroup->addTab(rgroup,tr("Miscellaneous"));
531 _aogroup->addTab(pppgroup,tr("PPP Client"));
532 _aogroup->addTab(cmbgroup,tr("Combination"));
533
534 // Log Tab
535 // -------
536 _loggroup = new QTabWidget();
537 _loggroup->addTab(_log,tr("Log"));
538 _loggroup->addTab(_bncFigure,tr("Throughput"));
539 _loggroup->addTab(_bncFigureLate,tr("Latency"));
540 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
541
542 // Proxy Tab
543 // ---------
544 QGridLayout* pLayout = new QGridLayout;
545 pLayout->setColumnMinimumWidth(0,13*ww);
546 _proxyPortLineEdit->setMaximumWidth(9*ww);
547
548 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
549 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
550 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
551 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
552 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
553 pLayout->addWidget(new QLabel(" "),3,0);
554 pLayout->addWidget(new QLabel(" "),4,0);
555 pLayout->addWidget(new QLabel(" "),5,0);
556 pgroup->setLayout(pLayout);
557
558 // General Tab
559 // -----------
560 QGridLayout* gLayout = new QGridLayout;
561 gLayout->setColumnMinimumWidth(0,14*ww);
562 _onTheFlyComboBox->setMaximumWidth(9*ww);
563
564 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
565 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
566 gLayout->addWidget(new QLabel("Append files"), 1, 0);
567 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
568 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
569 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
570 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
571 gLayout->addWidget(_autoStartCheckBox, 3, 1);
572 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
573 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
574 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
575 ggroup->setLayout(gLayout);
576
577 // RINEX Observations
578 // ------------------
579 QGridLayout* oLayout = new QGridLayout;
580 oLayout->setColumnMinimumWidth(0,14*ww);
581 _rnxIntrComboBox->setMaximumWidth(9*ww);
582 _rnxSamplSpinBox->setMaximumWidth(9*ww);
583
584 oLayout->addWidget(new QLabel("Directory"), 0, 0);
585 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
586 oLayout->addWidget(new QLabel("Interval"), 1, 0);
587 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
588 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
589 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
590 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
591 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
592 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
593 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
594 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
595 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
596 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
597 ogroup->setLayout(oLayout);
598
599 // RINEX Ephemeris
600 // ---------------
601 QGridLayout* eLayout = new QGridLayout;
602 eLayout->setColumnMinimumWidth(0,14*ww);
603 _ephIntrComboBox->setMaximumWidth(9*ww);
604 _outEphPortLineEdit->setMaximumWidth(9*ww);
605
606 eLayout->addWidget(new QLabel("Directory"), 0, 0);
607 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
608 eLayout->addWidget(new QLabel("Interval"), 1, 0);
609 eLayout->addWidget(_ephIntrComboBox, 1, 1);
610 eLayout->addWidget(new QLabel("Port"), 2, 0);
611 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
612 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
613 eLayout->addWidget(_ephV3CheckBox, 3, 1);
614 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
615 eLayout->addWidget(new QLabel(" "),5,0);
616 egroup->setLayout(eLayout);
617
618
619 // Broadcast Corrections
620 // ---------------------
621 QGridLayout* cLayout = new QGridLayout;
622 cLayout->setColumnMinimumWidth(0,14*ww);
623 _corrIntrComboBox->setMaximumWidth(9*ww);
624 _corrPortLineEdit->setMaximumWidth(9*ww);
625 _corrTimeSpinBox->setMaximumWidth(9*ww);
626
627 cLayout->addWidget(new QLabel("Directory"), 0, 0);
628 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
629 cLayout->addWidget(new QLabel("Interval"), 1, 0);
630 cLayout->addWidget(_corrIntrComboBox, 1, 1);
631 cLayout->addWidget(new QLabel("Port"), 2, 0);
632 cLayout->addWidget(_corrPortLineEdit, 2, 1);
633 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
634 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
635 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
636 cLayout->addWidget(new QLabel(" "),4,0);
637 cLayout->addWidget(new QLabel(" "),5,0);
638 cgroup->setLayout(cLayout);
639
640 // Feed Engine
641 // -----------
642 QGridLayout* sLayout = new QGridLayout;
643 sLayout->setColumnMinimumWidth(0,14*ww);
644 _outPortLineEdit->setMaximumWidth(9*ww);
645 _waitTimeSpinBox->setMaximumWidth(9*ww);
646 _binSamplSpinBox->setMaximumWidth(9*ww);
647 _outUPortLineEdit->setMaximumWidth(9*ww);
648
649 sLayout->addWidget(new QLabel("Port"), 0, 0);
650 sLayout->addWidget(_outPortLineEdit, 0, 1);
651 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
652 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
653 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
654 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
655 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
656 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
657 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
658 sLayout->addWidget(_outUPortLineEdit, 3, 1);
659 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
660 sLayout->addWidget(new QLabel(" "),5,0);
661 sgroup->setLayout(sLayout);
662
663 // Serial Output
664 // -------------
665 QGridLayout* serLayout = new QGridLayout;
666 serLayout->setColumnMinimumWidth(0,14*ww);
667 _serialBaudRateComboBox->setMaximumWidth(9*ww);
668 _serialFlowControlComboBox->setMaximumWidth(11*ww);
669 _serialDataBitsComboBox->setMaximumWidth(5*ww);
670 _serialParityComboBox->setMaximumWidth(9*ww);
671 _serialStopBitsComboBox->setMaximumWidth(5*ww);
672 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
673 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
674
675 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
676 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
677 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
678 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
679 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
680 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
681 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
682 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
683 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
684 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
685 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
686 serLayout->addWidget(_serialParityComboBox, 3,3);
687 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
688 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
689 serLayout->addWidget(new QLabel("NMEA"), 4,0);
690 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
691 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
692 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
693 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
694 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
695 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
696
697 sergroup->setLayout(serLayout);
698
699 // Outages
700 // -------
701 QGridLayout* aLayout = new QGridLayout;
702 aLayout->setColumnMinimumWidth(0,14*ww);
703 _obsRateComboBox->setMaximumWidth(9*ww);
704 _adviseFailSpinBox->setMaximumWidth(9*ww);
705 _adviseRecoSpinBox->setMaximumWidth(9*ww);
706
707 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
708 aLayout->addWidget(_obsRateComboBox, 0, 1);
709 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
710 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
711 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
712 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
713 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
714 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
715 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
716 aLayout->addWidget(new QLabel(" "), 5, 0);
717 agroup->setLayout(aLayout);
718
719 // Miscellaneous
720 // -------------
721 QGridLayout* rLayout = new QGridLayout;
722 rLayout->setColumnMinimumWidth(0,14*ww);
723 _perfIntrComboBox->setMaximumWidth(9*ww);
724
725 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
726 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
727 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
728 rLayout->addWidget(_perfIntrComboBox, 1, 1);
729 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
730 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
731 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
732 rLayout->addWidget(new QLabel(" "), 4, 0);
733 rLayout->addWidget(new QLabel(" "), 5, 0);
734 rgroup->setLayout(rLayout);
735
736 // PPP Client
737 // ----------
738 QGridLayout* pppLayout = new QGridLayout;
739 _pppSigCLineEdit->setMaximumWidth(6*ww);
740 _pppSigPLineEdit->setMaximumWidth(6*ww);
741 _pppSigCrd0->setMaximumWidth(6*ww);
742 _pppSigCrdP->setMaximumWidth(6*ww);
743 _pppSigTrp0->setMaximumWidth(6*ww);
744 _pppSigTrpP->setMaximumWidth(6*ww);
745 _pppAverageLineEdit->setMaximumWidth(6*ww);
746 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
747 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
748 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
749 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
750 _pppSync->setMaximumWidth(6*ww);
751 _pppSPPComboBox->setMaximumWidth(8*ww);
752 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
753//pppLayout->setColumnMinimumWidth(0,12*ww);
754 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
755 pppLayout->addWidget(_pppMountLineEdit, 0, 1);
756 pppLayout->addWidget(_pppSPPComboBox, 0, 2);
757 pppLayout->addWidget(new QLabel(" X "), 0, 3, Qt::AlignRight);
758 pppLayout->addWidget(_pppRefCrdXLineEdit, 0, 4);
759 pppLayout->addWidget(new QLabel(" Y "), 0, 5, Qt::AlignRight);
760 pppLayout->addWidget(_pppRefCrdYLineEdit, 0, 6);
761 pppLayout->addWidget(new QLabel(" Z "), 0, 7, Qt::AlignRight);
762 pppLayout->addWidget(_pppRefCrdZLineEdit, 0, 8);
763 pppLayout->addWidget(new QLabel("Options"), 1, 0, 1, 5);
764 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 1, Qt::AlignRight);
765 pppLayout->addWidget(new QLabel("Use phase obs"), 1, 2);
766 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 3, Qt::AlignRight);
767 pppLayout->addWidget(new QLabel("Estimate tropo"), 1, 4);
768 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 5, Qt::AlignRight);
769 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 6);
770 pppLayout->addWidget(_pppGalileoCheckBox, 1, 7, Qt::AlignRight);
771 pppLayout->addWidget(new QLabel("Use Galileo"), 1, 8);
772 pppLayout->addWidget(new QLabel("Options cont'd"), 2, 0);
773 pppLayout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
774 pppLayout->addWidget(new QLabel("Sigma Code"), 2, 2);
775 pppLayout->addWidget(_pppSigPLineEdit, 2, 3);
776 pppLayout->addWidget(new QLabel("Sigma Phase"), 2, 4);
777 pppLayout->addWidget(_pppQuickStartLineEdit, 2, 5, Qt::AlignRight);
778 pppLayout->addWidget(new QLabel("Quick-Start (sec) ") , 2, 6);
779 pppLayout->addWidget(_pppAverageLineEdit, 2, 7);
780 pppLayout->addWidget(new QLabel("Averaging (min)") , 2, 8);
781 pppLayout->addWidget(new QLabel("Parameter sigmas"), 3, 0);
782 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
783 pppLayout->addWidget(new QLabel("XYZ Init"), 3, 2);
784 pppLayout->addWidget(_pppSigCrdP, 3, 3);
785 pppLayout->addWidget(new QLabel("XYZ White Noise "), 3, 4);
786 pppLayout->addWidget(_pppSigTrp0, 3, 5, Qt::AlignRight);
787 pppLayout->addWidget(new QLabel("Tropo Init"), 3, 6);
788 pppLayout->addWidget(_pppSigTrpP, 3, 7);
789 pppLayout->addWidget(new QLabel("Tropo White Noise"), 3, 8);
790 pppLayout->addWidget(new QLabel("Output"), 4, 0);
791 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 3);
792 pppLayout->addWidget(new QLabel("NMEA file"), 4, 4);
793 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 5);
794 pppLayout->addWidget(new QLabel("NMEA port"), 4, 6);
795 pppLayout->addWidget(_pppPlotCoordinates, 4, 7, Qt::AlignRight);
796 pppLayout->addWidget(new QLabel("PPP Plot"), 4, 8);
797
798 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
799 pppLayout->addWidget(_pppSync, 5, 7);
800 pppLayout->addWidget(new QLabel("Sync Corr (sec)"), 5, 8);
801
802 pppgroup->setLayout(pppLayout);
803
804 // Combination
805 // -----------
806 QGridLayout* cmbLayout = new QGridLayout;
807
808 _cmbTable = new QTableWidget(0,3);
809 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
810 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
811 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
812 populateCmbTable();
813 cmbLayout->addWidget(_cmbTable,0,0,6,3);
814 cmbLayout->setColumnStretch(0,1);
815 cmbLayout->setColumnStretch(1,1);
816 cmbLayout->setColumnStretch(2,1);
817
818 QPushButton* addCmbRowButton = new QPushButton("Add Row");
819 cmbLayout->addWidget(addCmbRowButton,0,3);
820 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
821
822 QPushButton* delCmbRowButton = new QPushButton("Delete");
823 cmbLayout->addWidget(delCmbRowButton,1,3);
824 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
825
826 cmbLayout->setColumnStretch(4,1);
827
828 cmbLayout->addWidget(new QLabel("Host"), 0, 5);
829 _cmbOutHostLineEdit = new QLineEdit(settings.value("cmbOutHost").toString());
830 cmbLayout->addWidget(_cmbOutHostLineEdit, 0, 6);
831
832 cmbLayout->addWidget(new QLabel("Port"), 0, 7);
833 _cmbOutPortLineEdit = new QLineEdit(settings.value("cmbOutPort").toString());
834 _cmbOutPortLineEdit->setMaximumWidth(9*ww);
835 cmbLayout->addWidget(_cmbOutPortLineEdit, 0, 8);
836
837 cmbLayout->addWidget(new QLabel("Mountpoint"), 1, 5);
838 _cmbMountpointLineEdit = new QLineEdit(settings.value("cmbMountpoint").toString());
839 _cmbMountpointLineEdit->setMaximumWidth(12*ww);
840 cmbLayout->addWidget(_cmbMountpointLineEdit, 1, 6);
841
842 cmbLayout->addWidget(new QLabel("Password"), 1, 7);
843 _cmbPasswordLineEdit = new QLineEdit(settings.value("cmbPassword").toString());
844 _cmbPasswordLineEdit->setEchoMode(QLineEdit::Password);
845 _cmbPasswordLineEdit->setMaximumWidth(9*ww);
846 cmbLayout->addWidget(_cmbPasswordLineEdit, 1, 8);
847
848 cmbLayout->addWidget(new QLabel("Output File"), 2, 5);
849 _cmbOutFileLineEdit = new QLineEdit(settings.value("cmbOutFile").toString());
850 cmbLayout->addWidget(_cmbOutFileLineEdit, 2, 6);
851
852 cmbLayout->addWidget(new QLabel("Output SP3"), 3, 5);
853 _cmbSP3FileLineEdit = new QLineEdit(settings.value("cmbSP3File").toString());
854 cmbLayout->addWidget(_cmbSP3FileLineEdit, 3, 6);
855
856 cmbgroup->setLayout(cmbLayout);
857
858 // Main Layout
859 // -----------
860 QGridLayout* mLayout = new QGridLayout;
861 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
862 mLayout->addWidget(_aogroup, 0,0);
863 mLayout->addWidget(_mountPointsTable, 1,0);
864 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
865 mLayout->addWidget(_loggroup, 2,0);
866
867 _canvas->setLayout(mLayout);
868
869 // Enable/Disable all Widgets
870 // --------------------------
871 slotBncTextChanged();
872
873 // Auto start
874 // ----------
875 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
876 slotGetData();
877 }
878}
879
880// Destructor
881////////////////////////////////////////////////////////////////////////////
882bncWindow::~bncWindow() {
883 delete _caster;
884}
885
886//
887////////////////////////////////////////////////////////////////////////////
888void bncWindow::populateMountPointsTable() {
889
890 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
891 _mountPointsTable->removeRow(iRow);
892 }
893
894 bncSettings settings;
895
896 QListIterator<QString> it(settings.value("mountPoints").toStringList());
897 if (!it.hasNext()) {
898 _actGetData->setEnabled(false);
899 }
900 int iRow = 0;
901 while (it.hasNext()) {
902 QStringList hlp = it.next().split(" ");
903 if (hlp.size() < 5) continue;
904 _mountPointsTable->insertRow(iRow);
905
906 QUrl url(hlp[0]);
907
908 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
909 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
910 QString nmea(hlp[4]);
911 if (hlp[5] == "S") {
912 fullPath = hlp[0].replace(0,2,"");
913 }
914 QString ntripVersion = "1";
915 if (hlp.size() >= 6) {
916 ntripVersion = (hlp[5]);
917 }
918
919 QTableWidgetItem* it;
920 it = new QTableWidgetItem(url.userInfo());
921 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
922 _mountPointsTable->setItem(iRow, 0, it);
923
924 it = new QTableWidgetItem(fullPath);
925 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
926 _mountPointsTable->setItem(iRow, 1, it);
927
928 it = new QTableWidgetItem(format);
929 _mountPointsTable->setItem(iRow, 2, it);
930
931 if (nmea == "yes") {
932 it = new QTableWidgetItem(latitude);
933 _mountPointsTable->setItem(iRow, 3, it);
934 it = new QTableWidgetItem(longitude);
935 _mountPointsTable->setItem(iRow, 4, it);
936 } else {
937 it = new QTableWidgetItem(latitude);
938 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
939 _mountPointsTable->setItem(iRow, 3, it);
940 it = new QTableWidgetItem(longitude);
941 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
942 _mountPointsTable->setItem(iRow, 4, it);
943 }
944
945 it = new QTableWidgetItem(nmea);
946 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
947 _mountPointsTable->setItem(iRow, 5, it);
948
949 it = new QTableWidgetItem(ntripVersion);
950 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
951 _mountPointsTable->setItem(iRow, 6, it);
952
953 bncTableItem* bncIt = new bncTableItem();
954 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
955 _mountPointsTable->setItem(iRow, 7, bncIt);
956
957 iRow++;
958 }
959
960 _mountPointsTable->sortItems(1);
961}
962
963// Retrieve Table
964////////////////////////////////////////////////////////////////////////////
965void bncWindow::slotAddMountPoints() {
966
967 bncSettings settings;
968 QString proxyHost = settings.value("proxyHost").toString();
969 int proxyPort = settings.value("proxyPort").toInt();
970 if (proxyHost != _proxyHostLineEdit->text() ||
971 proxyPort != _proxyPortLineEdit->text().toInt()) {
972 int iRet = QMessageBox::question(this, "Question", "Proxy options "
973 "changed. Use the new ones?",
974 QMessageBox::Yes, QMessageBox::No,
975 QMessageBox::NoButton);
976 if (iRet == QMessageBox::Yes) {
977 settings.setValue("proxyHost", _proxyHostLineEdit->text());
978 settings.setValue("proxyPort", _proxyPortLineEdit->text());
979 settings.sync();
980 }
981 }
982
983 QMessageBox msgBox;
984 msgBox.setIcon(QMessageBox::Question);
985 msgBox.setWindowTitle("Add Stream");
986 msgBox.setText("Add stream(s) coming from:");
987
988 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
989 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
990 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
991 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
992 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
993
994 msgBox.exec();
995
996 if (msgBox.clickedButton() == buttonNtrip) {
997 bncTableDlg* dlg = new bncTableDlg(this);
998 dlg->move(this->pos().x()+50, this->pos().y()+50);
999 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1000 this, SLOT(slotNewMountPoints(QStringList*)));
1001 dlg->exec();
1002 delete dlg;
1003 } else if (msgBox.clickedButton() == buttonIP) {
1004 bncIpPort* ipp = new bncIpPort(this);
1005 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1006 this, SLOT(slotNewMountPoints(QStringList*)));
1007 ipp->exec();
1008 delete ipp;
1009 } else if (msgBox.clickedButton() == buttonUDP) {
1010 bncUdpPort* udp = new bncUdpPort(this);
1011 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1012 this, SLOT(slotNewMountPoints(QStringList*)));
1013 udp->exec();
1014 delete udp;
1015 } else if (msgBox.clickedButton() == buttonSerial) {
1016 bncSerialPort* sep = new bncSerialPort(this);
1017 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1018 this, SLOT(slotNewMountPoints(QStringList*)));
1019 sep->exec();
1020 delete sep;
1021 } else if (msgBox.clickedButton() == buttonCancel) {
1022 // Cancel
1023 }
1024}
1025
1026// Delete Selected Mount Points
1027////////////////////////////////////////////////////////////////////////////
1028void bncWindow::slotDeleteMountPoints() {
1029
1030 int nRows = _mountPointsTable->rowCount();
1031 bool flg[nRows];
1032 for (int iRow = 0; iRow < nRows; iRow++) {
1033 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1034 flg[iRow] = true;
1035 }
1036 else {
1037 flg[iRow] = false;
1038 }
1039 }
1040 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1041 if (flg[iRow]) {
1042 _mountPointsTable->removeRow(iRow);
1043 }
1044 }
1045 _actDeleteMountPoints->setEnabled(false);
1046
1047 if (_mountPointsTable->rowCount() == 0) {
1048 _actGetData->setEnabled(false);
1049 }
1050}
1051
1052// New Mount Points Selected
1053////////////////////////////////////////////////////////////////////////////
1054void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1055 int iRow = 0;
1056 QListIterator<QString> it(*mountPoints);
1057 while (it.hasNext()) {
1058 QStringList hlp = it.next().split(" ");
1059 QUrl url(hlp[0]);
1060 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1061 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1062 QString nmea(hlp[4]);
1063 if (hlp[5] == "S") {
1064 fullPath = hlp[0].replace(0,2,"");
1065 }
1066 QString ntripVersion = "1";
1067 if (hlp.size() >= 6) {
1068 ntripVersion = (hlp[5]);
1069 }
1070
1071 _mountPointsTable->insertRow(iRow);
1072
1073 QTableWidgetItem* it;
1074 it = new QTableWidgetItem(url.userInfo());
1075 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1076 _mountPointsTable->setItem(iRow, 0, it);
1077
1078 it = new QTableWidgetItem(fullPath);
1079 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1080 _mountPointsTable->setItem(iRow, 1, it);
1081
1082 it = new QTableWidgetItem(format);
1083 _mountPointsTable->setItem(iRow, 2, it);
1084
1085 if (nmea == "yes") {
1086 it = new QTableWidgetItem(latitude);
1087 _mountPointsTable->setItem(iRow, 3, it);
1088 it = new QTableWidgetItem(longitude);
1089 _mountPointsTable->setItem(iRow, 4, it);
1090 } else {
1091 it = new QTableWidgetItem(latitude);
1092 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1093 _mountPointsTable->setItem(iRow, 3, it);
1094 it = new QTableWidgetItem(longitude);
1095 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1096 _mountPointsTable->setItem(iRow, 4, it);
1097 }
1098
1099 it = new QTableWidgetItem(nmea);
1100 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1101 _mountPointsTable->setItem(iRow, 5, it);
1102
1103 it = new QTableWidgetItem(ntripVersion);
1104 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1105 _mountPointsTable->setItem(iRow, 6, it);
1106
1107 bncTableItem* bncIt = new bncTableItem();
1108 _mountPointsTable->setItem(iRow, 7, bncIt);
1109
1110 iRow++;
1111 }
1112 _mountPointsTable->hideColumn(0);
1113 _mountPointsTable->sortItems(1);
1114 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1115 _actGetData->setEnabled(true);
1116 }
1117 delete mountPoints;
1118}
1119
1120// Save Options
1121////////////////////////////////////////////////////////////////////////////
1122void bncWindow::slotSaveOptions() {
1123
1124 QStringList mountPoints;
1125 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1126
1127 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1128 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1129 "@" + _mountPointsTable->item(iRow, 1)->text() );
1130
1131 mountPoints.append(url.toString() + " " +
1132 _mountPointsTable->item(iRow, 2)->text()
1133 + " " + _mountPointsTable->item(iRow, 3)->text()
1134 + " " + _mountPointsTable->item(iRow, 4)->text()
1135 + " " + _mountPointsTable->item(iRow, 5)->text()
1136 + " " + _mountPointsTable->item(iRow, 6)->text());
1137 } else {
1138 mountPoints.append(
1139 "//" + _mountPointsTable->item(iRow, 1)->text()
1140 + " " + _mountPointsTable->item(iRow, 2)->text()
1141 + " " + _mountPointsTable->item(iRow, 3)->text()
1142 + " " + _mountPointsTable->item(iRow, 4)->text()
1143 + " " + _mountPointsTable->item(iRow, 5)->text()
1144 + " " + _mountPointsTable->item(iRow, 6)->text());
1145 }
1146 }
1147
1148 QStringList combineStreams;
1149 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1150 QString hlp;
1151 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1152 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1153 }
1154 combineStreams << hlp;
1155 }
1156
1157 bncSettings settings;
1158
1159 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1160 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1161 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1162 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1163 settings.setValue("binSampl", _binSamplSpinBox->value());
1164 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1165 settings.setValue("corrPath", _corrPathLineEdit->text());
1166 settings.setValue("corrPort", _corrPortLineEdit->text());
1167 settings.setValue("corrTime", _corrTimeSpinBox->value());
1168 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1169 settings.setValue("ephPath", _ephPathLineEdit->text());
1170 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1171 settings.setValue("logFile", _logFileLineEdit->text());
1172 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1173 settings.setValue("miscMount", _miscMountLineEdit->text());
1174 settings.setValue("pppMount", _pppMountLineEdit->text());
1175 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1176 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1177 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1178 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1179 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1180 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1181 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1182 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1183 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1184 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1185 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1186 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1187 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1188 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1189 settings.setValue("pppSync", _pppSync->text());
1190 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1191 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1192 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1193 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1194 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1195 settings.setValue("mountPoints", mountPoints);
1196 settings.setValue("obsRate", _obsRateComboBox->currentText());
1197 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1198 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1199 settings.setValue("outFile", _outFileLineEdit->text());
1200 settings.setValue("outPort", _outPortLineEdit->text());
1201 settings.setValue("outUPort", _outUPortLineEdit->text());
1202 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1203 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1204 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1205 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1206 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1207 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1208 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1209 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1210 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1211 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1212 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1213 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1214 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1215 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1216 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1217 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1218 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1219 settings.setValue("serialParity", _serialParityComboBox->currentText());
1220 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1221 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1222 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1223 settings.setValue("startTab", _aogroup->currentIndex());
1224 settings.setValue("statusTab", _loggroup->currentIndex());
1225 settings.setValue("waitTime", _waitTimeSpinBox->value());
1226 settings.setValue("combineStreams", combineStreams);
1227
1228 if (_caster) {
1229 _caster->slotReadMountPoints();
1230 }
1231 settings.sync();
1232}
1233
1234// All get slots terminated
1235////////////////////////////////////////////////////////////////////////////
1236void bncWindow::slotGetThreadsFinished() {
1237 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1238 delete _caster; _caster = 0;
1239 _actGetData->setEnabled(true);
1240 _actStop->setEnabled(false);
1241}
1242
1243// Retrieve Data
1244////////////////////////////////////////////////////////////////////////////
1245void bncWindow::slotGetData() {
1246 slotSaveOptions();
1247
1248 _bncFigurePPP->reset();
1249
1250 _actDeleteMountPoints->setEnabled(false);
1251 _actGetData->setEnabled(false);
1252 _actStop->setEnabled(true);
1253
1254 _caster = new bncCaster(_outFileLineEdit->text(),
1255 _outPortLineEdit->text().toInt());
1256
1257 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1258 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1259
1260 connect(_caster, SIGNAL(getThreadsFinished()),
1261 this, SLOT(slotGetThreadsFinished()));
1262
1263 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1264 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1265
1266 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1267
1268 bncSettings settings;
1269
1270 QDir rnxdir(settings.value("rnxPath").toString());
1271 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1272
1273 QString rnx_file = settings.value("rnxScript").toString();
1274 if ( !rnx_file.isEmpty() ) {
1275 QFile rnxfile(settings.value("rnxScript").toString());
1276 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1277 }
1278
1279 QDir ephdir(settings.value("ephPath").toString());
1280 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1281
1282 QDir corrdir(settings.value("corrPath").toString());
1283 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1284
1285 QString advise_file = settings.value("adviseScript").toString();
1286 if ( !advise_file.isEmpty() ) {
1287 QFile advisefile(settings.value("adviseScript").toString());
1288 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1289 }
1290
1291 _caster->slotReadMountPoints();
1292}
1293
1294// Retrieve Data
1295////////////////////////////////////////////////////////////////////////////
1296void bncWindow::slotStop() {
1297 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1298 QMessageBox::Yes, QMessageBox::No,
1299 QMessageBox::NoButton);
1300 if (iRet == QMessageBox::Yes) {
1301 delete _caster; _caster = 0;
1302 _actGetData->setEnabled(true);
1303 _actStop->setEnabled(false);
1304 }
1305}
1306
1307// Close Application gracefully
1308////////////////////////////////////////////////////////////////////////////
1309void bncWindow::closeEvent(QCloseEvent* event) {
1310
1311 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1312 QMessageBox::Yes, QMessageBox::No,
1313 QMessageBox::Cancel);
1314
1315 if (iRet == QMessageBox::Cancel) {
1316 event->ignore();
1317 return;
1318 }
1319 else if (iRet == QMessageBox::Yes) {
1320 slotSaveOptions();
1321 }
1322
1323 QMainWindow::closeEvent(event);
1324}
1325
1326// User changed the selection of mountPoints
1327////////////////////////////////////////////////////////////////////////////
1328void bncWindow::slotSelectionChanged() {
1329 if (_mountPointsTable->selectedItems().isEmpty()) {
1330 _actDeleteMountPoints->setEnabled(false);
1331 }
1332 else {
1333 _actDeleteMountPoints->setEnabled(true);
1334 }
1335}
1336
1337// Display Program Messages
1338////////////////////////////////////////////////////////////////////////////
1339void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1340
1341#ifdef DEBUG_RTCM2_2021
1342 const int maxBufferSize = 1000;
1343#else
1344 const int maxBufferSize = 10000;
1345#endif
1346
1347 if (! showOnScreen ) {
1348 return;
1349 }
1350
1351 QString txt = _log->toPlainText() + "\n" +
1352 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1353 _log->clear();
1354 _log->append(txt.right(maxBufferSize));
1355}
1356
1357// About Message
1358////////////////////////////////////////////////////////////////////////////
1359void bncWindow::slotAbout() {
1360 new bncAboutDlg(0);
1361}
1362
1363//Flowchart
1364////////////////////////////////////////////////////////////////////////////
1365void bncWindow::slotFlowchart() {
1366 new bncFlowchartDlg(0);
1367}
1368
1369// Help Window
1370////////////////////////////////////////////////////////////////////////////
1371void bncWindow::slotHelp() {
1372 QUrl url;
1373 url.setPath(":bnchelp.html");
1374 new bncHlpDlg(0, url);
1375}
1376
1377// Select Fonts
1378////////////////////////////////////////////////////////////////////////////
1379void bncWindow::slotFontSel() {
1380 bool ok;
1381 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1382 if (ok) {
1383 bncSettings settings;
1384 settings.setValue("font", newFont.toString());
1385 QApplication::setFont(newFont);
1386 int ww = QFontMetrics(newFont).width('w');
1387 setMinimumSize(60*ww, 80*ww);
1388 resize(60*ww, 80*ww);
1389 }
1390}
1391
1392// Whats This Help
1393void bncWindow::slotWhatsThis() {
1394 QWhatsThis::enterWhatsThisMode();
1395}
1396
1397//
1398////////////////////////////////////////////////////////////////////////////
1399void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1400 _bncFigure->updateMountPoints();
1401 _bncFigureLate->updateMountPoints();
1402
1403 populateMountPointsTable();
1404 bncSettings settings;
1405 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1406 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1407 QListIterator<bncGetThread*> iTh(threads);
1408 while (iTh.hasNext()) {
1409 bncGetThread* thread = iTh.next();
1410 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1411 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1412 "@" + _mountPointsTable->item(iRow, 1)->text() );
1413 if (url == thread->mountPoint() &&
1414 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1415 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1416 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1417 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1418 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1419 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1420 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1421 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1422 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1423 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1424 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1425 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1426 disconnect(thread,
1427 SIGNAL(newPosition(bncTime, double, double, double)),
1428 _bncFigurePPP,
1429 SLOT(slotNewPosition(bncTime, double, double, double)));
1430 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1431 _bncFigurePPP,
1432 SLOT(slotNewPosition(bncTime, double, double, double)));
1433 }
1434 break;
1435 }
1436 }
1437 }
1438}
1439
1440//
1441////////////////////////////////////////////////////////////////////////////
1442void bncWindow::CreateMenu() {
1443 // Create Menus
1444 // ------------
1445 _menuFile = menuBar()->addMenu(tr("&File"));
1446 _menuFile->addAction(_actFontSel);
1447 _menuFile->addSeparator();
1448 _menuFile->addAction(_actSaveOpt);
1449 _menuFile->addSeparator();
1450 _menuFile->addAction(_actQuit);
1451
1452 _menuHlp = menuBar()->addMenu(tr("&Help"));
1453 _menuHlp->addAction(_actHelp);
1454 _menuHlp->addAction(_actFlowchart);
1455 _menuHlp->addAction(_actAbout);
1456}
1457
1458// Toolbar
1459////////////////////////////////////////////////////////////////////////////
1460void bncWindow::AddToolbar() {
1461 // Tool (Command) Bar
1462 // ------------------
1463 QToolBar* toolBar = new QToolBar;
1464 addToolBar(Qt::BottomToolBarArea, toolBar);
1465 toolBar->setMovable(false);
1466 toolBar->addAction(_actAddMountPoints);
1467 toolBar->addAction(_actDeleteMountPoints);
1468 toolBar->addAction(_actGetData);
1469 toolBar->addAction(_actStop);
1470 toolBar->addWidget(new QLabel(" "));
1471 toolBar->addAction(_actwhatsthis);
1472}
1473
1474// About
1475////////////////////////////////////////////////////////////////////////////
1476bncAboutDlg::bncAboutDlg(QWidget* parent) :
1477 QDialog(parent) {
1478
1479 QTextBrowser* tb = new QTextBrowser;
1480 QUrl url; url.setPath(":bncabout.html");
1481 tb->setSource(url);
1482 tb->setReadOnly(true);
1483
1484 int ww = QFontMetrics(font()).width('w');
1485 QPushButton* _closeButton = new QPushButton("Close");
1486 _closeButton->setMaximumWidth(10*ww);
1487 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1488
1489 QGridLayout* dlgLayout = new QGridLayout();
1490 QLabel* img = new QLabel();
1491 img->setPixmap(QPixmap(":ntrip-logo.png"));
1492 dlgLayout->addWidget(img, 0,0);
1493 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1494 dlgLayout->addWidget(tb,1,0,1,2);
1495 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1496
1497 setLayout(dlgLayout);
1498 resize(60*ww, 60*ww);
1499 setWindowTitle("About BNC");
1500 show();
1501}
1502
1503//
1504////////////////////////////////////////////////////////////////////////////
1505bncAboutDlg::~bncAboutDlg() {
1506};
1507
1508// Flowchart
1509////////////////////////////////////////////////////////////////////////////
1510bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1511 QDialog(parent) {
1512
1513 int ww = QFontMetrics(font()).width('w');
1514 QPushButton* _closeButton = new QPushButton("Close");
1515 _closeButton->setMaximumWidth(10*ww);
1516 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1517
1518 QGridLayout* dlgLayout = new QGridLayout();
1519 QLabel* img = new QLabel();
1520 img->setPixmap(QPixmap(":bncflowchart.png"));
1521 dlgLayout->addWidget(img, 0,0);
1522 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1523
1524 setLayout(dlgLayout);
1525 setWindowTitle("Flow Chart");
1526 show();
1527}
1528
1529//
1530////////////////////////////////////////////////////////////////////////////
1531bncFlowchartDlg::~bncFlowchartDlg() {
1532};
1533
1534// Bnc Text
1535////////////////////////////////////////////////////////////////////////////
1536void bncWindow::slotBncTextChanged(){
1537
1538 QPalette palette_white(QColor(255, 255, 255));
1539 QPalette palette_gray(QColor(230, 230, 230));
1540 bncSettings settings;
1541
1542 // Proxy
1543 //------
1544 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1545 if (!_proxyHostLineEdit->text().isEmpty()) {
1546 _proxyPortLineEdit->setStyleSheet("background-color: white");
1547 _proxyPortLineEdit->setEnabled(true);
1548 }
1549 else {
1550 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1551 _proxyPortLineEdit->setEnabled(false);
1552 }
1553 }
1554
1555 // RINEX Observations
1556 // ------------------
1557 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1558 if (!_rnxPathLineEdit->text().isEmpty()) {
1559 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1560 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1561 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1562 _rnxV3CheckBox->setPalette(palette_white);
1563 _rnxIntrComboBox->setStyleSheet("background-color: white");
1564 _rnxSamplSpinBox->setEnabled(true);
1565 _rnxSkelLineEdit->setEnabled(true);
1566 _rnxScrpLineEdit->setEnabled(true);
1567 _rnxV3CheckBox->setEnabled(true);
1568 _rnxIntrComboBox->setEnabled(true);
1569 }
1570 else {
1571 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1572 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1573 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1574 _rnxV3CheckBox->setPalette(palette_gray);
1575 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1576 _rnxSamplSpinBox->setEnabled(false);
1577 _rnxSkelLineEdit->setEnabled(false);
1578 _rnxScrpLineEdit->setEnabled(false);
1579 _rnxV3CheckBox->setEnabled(false);
1580 _rnxIntrComboBox->setEnabled(false);
1581 }
1582 }
1583
1584 // RINEX Ephemeris
1585 // ---------------
1586 if (sender() == 0 ||
1587 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1588 if (!_ephPathLineEdit->text().isEmpty() ||
1589 !_outEphPortLineEdit->text().isEmpty()) {
1590 _ephIntrComboBox->setStyleSheet("background-color: white");
1591 _ephV3CheckBox->setPalette(palette_white);
1592 _ephIntrComboBox->setEnabled(true);
1593 _ephV3CheckBox->setEnabled(true);
1594 }
1595 else {
1596 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1597 _ephV3CheckBox->setPalette(palette_gray);
1598 _ephIntrComboBox->setEnabled(false);
1599 _ephV3CheckBox->setEnabled(false);
1600 }
1601 }
1602
1603 // Broadcast Corrections
1604 // ---------------------
1605 if (sender() == 0 ||
1606 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1607 if (!_corrPathLineEdit->text().isEmpty() ||
1608 !_corrPortLineEdit->text().isEmpty()) {
1609 _corrIntrComboBox->setStyleSheet("background-color: white");
1610 _corrIntrComboBox->setEnabled(true);
1611 }
1612 else {
1613 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1614 _corrIntrComboBox->setEnabled(false);
1615 }
1616 }
1617
1618 // Feed Engine
1619 // -----------
1620 if (sender() == 0 ||
1621 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1622 if ( !_outPortLineEdit->text().isEmpty() ||
1623 !_outFileLineEdit->text().isEmpty()) {
1624 _waitTimeSpinBox->setStyleSheet("background-color: white");
1625 _binSamplSpinBox->setStyleSheet("background-color: white");
1626 _waitTimeSpinBox->setEnabled(true);
1627 _binSamplSpinBox->setEnabled(true);
1628 }
1629 else {
1630 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1631 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1632 _waitTimeSpinBox->setEnabled(false);
1633 _binSamplSpinBox->setEnabled(false);
1634 }
1635 }
1636
1637 // Serial Output
1638 // -------------
1639 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1640 sender() == _serialAutoNMEAComboBox) {
1641 if (!_serialMountPointLineEdit->text().isEmpty()) {
1642 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1643 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1644 _serialParityComboBox->setStyleSheet("background-color: white");
1645 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1646 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1647 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1648 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1649 _serialPortNameLineEdit->setEnabled(true);
1650 _serialBaudRateComboBox->setEnabled(true);
1651 _serialParityComboBox->setEnabled(true);
1652 _serialDataBitsComboBox->setEnabled(true);
1653 _serialStopBitsComboBox->setEnabled(true);
1654 _serialFlowControlComboBox->setEnabled(true);
1655 _serialAutoNMEAComboBox->setEnabled(true);
1656 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1657 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1658 _serialHeightNMEALineEdit->setEnabled(true);
1659 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1660 _serialFileNMEALineEdit->setEnabled(false);
1661 }
1662 else {
1663 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1664 _serialHeightNMEALineEdit->setEnabled(false);
1665 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1666 _serialFileNMEALineEdit->setEnabled(true);
1667 }
1668 }
1669 else {
1670 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1671 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1672 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1673 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1674 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1675 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1676 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1677 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1678 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1679 _serialPortNameLineEdit->setEnabled(false);
1680 _serialBaudRateComboBox->setEnabled(false);
1681 _serialParityComboBox->setEnabled(false);
1682 _serialDataBitsComboBox->setEnabled(false);
1683 _serialStopBitsComboBox->setEnabled(false);
1684 _serialFlowControlComboBox->setEnabled(false);
1685 _serialAutoNMEAComboBox->setEnabled(false);
1686 _serialHeightNMEALineEdit->setEnabled(false);
1687 _serialFileNMEALineEdit->setEnabled(false);
1688 }
1689 }
1690
1691 // Outages
1692 // -------
1693 if (sender() == 0 || sender() == _obsRateComboBox) {
1694 if (!_obsRateComboBox->currentText().isEmpty()) {
1695 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1696 _adviseFailSpinBox->setStyleSheet("background-color: white");
1697 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1698 _adviseFailSpinBox->setEnabled(true);
1699 _adviseRecoSpinBox->setEnabled(true);
1700 _adviseScriptLineEdit->setEnabled(true);
1701 } else {
1702 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1703 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1704 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1705 _adviseFailSpinBox->setEnabled(false);
1706 _adviseRecoSpinBox->setEnabled(false);
1707 _adviseScriptLineEdit->setEnabled(false);
1708 }
1709 }
1710
1711 // Miscellaneous
1712 // -------------
1713 if (sender() == 0 || sender() == _miscMountLineEdit) {
1714 if (!_miscMountLineEdit->text().isEmpty()) {
1715 _perfIntrComboBox->setStyleSheet("background-color: white");
1716 _scanRTCMCheckBox->setPalette(palette_white);
1717 _perfIntrComboBox->setEnabled(true);
1718 _scanRTCMCheckBox->setEnabled(true);
1719 } else {
1720 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1721 _scanRTCMCheckBox->setPalette(palette_gray);
1722 _perfIntrComboBox->setEnabled(false);
1723 _scanRTCMCheckBox->setEnabled(false);
1724 }
1725 }
1726
1727 // PPP Client
1728 // ----------
1729 if (sender() == 0
1730 || sender() == _pppMountLineEdit
1731 || sender() == _pppRefCrdXLineEdit
1732 || sender() == _pppRefCrdYLineEdit
1733 || sender() == _pppRefCrdZLineEdit
1734 || sender() == _pppSync
1735 || sender() == _pppSPPComboBox
1736 || sender() == _pppEstTropoCheckBox
1737 || sender() == _pppUsePhaseCheckBox ) {
1738 if (!_pppMountLineEdit->text().isEmpty()) {
1739 _pppSPPComboBox->setPalette(palette_white);
1740 _pppNMEALineEdit->setPalette(palette_white);
1741 _pppNMEAPortLineEdit->setPalette(palette_white);
1742 _pppRefCrdXLineEdit->setPalette(palette_white);
1743 _pppRefCrdYLineEdit->setPalette(palette_white);
1744 _pppRefCrdZLineEdit->setPalette(palette_white);
1745 _pppUsePhaseCheckBox->setPalette(palette_white);
1746 _pppPlotCoordinates->setPalette(palette_white);
1747 _pppEstTropoCheckBox->setPalette(palette_white);
1748 _pppGLONASSCheckBox->setPalette(palette_white);
1749 _pppGalileoCheckBox->setPalette(palette_white);
1750 _pppSPPComboBox->setEnabled(true);
1751 _pppNMEALineEdit->setEnabled(true);
1752 _pppNMEAPortLineEdit->setEnabled(true);
1753 _pppRefCrdXLineEdit->setEnabled(true);
1754 _pppRefCrdYLineEdit->setEnabled(true);
1755 _pppRefCrdZLineEdit->setEnabled(true);
1756 _pppUsePhaseCheckBox->setEnabled(true);
1757 _pppPlotCoordinates->setEnabled(true);
1758 _pppEstTropoCheckBox->setEnabled(true);
1759 _pppGLONASSCheckBox->setEnabled(true);
1760 _pppGalileoCheckBox->setEnabled(true);
1761 _pppRefCrdXLineEdit->setPalette(palette_white);
1762 _pppRefCrdXLineEdit->setEnabled(true);
1763 _pppRefCrdYLineEdit->setPalette(palette_white);
1764 _pppRefCrdYLineEdit->setEnabled(true);
1765 _pppRefCrdZLineEdit->setPalette(palette_white);
1766 _pppRefCrdZLineEdit->setEnabled(true);
1767 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1768 !_pppRefCrdYLineEdit->text().isEmpty() &&
1769 !_pppRefCrdZLineEdit->text().isEmpty()) {
1770 _pppAverageLineEdit->setPalette(palette_white);
1771 _pppAverageLineEdit->setEnabled(true);
1772 _pppQuickStartLineEdit->setPalette(palette_white);
1773 _pppQuickStartLineEdit->setEnabled(true);
1774 }
1775 else {
1776 _pppAverageLineEdit->setPalette(palette_gray);
1777 _pppAverageLineEdit->setEnabled(false);
1778 _pppQuickStartLineEdit->setPalette(palette_gray);
1779 _pppQuickStartLineEdit->setEnabled(false);
1780 }
1781 _pppSigCLineEdit->setPalette(palette_white);
1782 _pppSigCLineEdit->setEnabled(true);
1783 _pppSigCrd0->setPalette(palette_white);
1784 _pppSigCrd0->setEnabled(true);
1785 _pppSigCrdP->setPalette(palette_white);
1786 _pppSigCrdP->setEnabled(true);
1787 if (_pppEstTropoCheckBox->isChecked()
1788 && !_pppMountLineEdit->text().isEmpty()) {
1789 _pppSigTrp0->setPalette(palette_white);
1790 _pppSigTrp0->setEnabled(true);
1791 _pppSigTrpP->setPalette(palette_white);
1792 _pppSigTrpP->setEnabled(true);
1793 }
1794 else {
1795 _pppSigTrp0->setPalette(palette_gray);
1796 _pppSigTrp0->setEnabled(false);
1797 _pppSigTrpP->setPalette(palette_gray);
1798 _pppSigTrpP->setEnabled(false);
1799 }
1800 if (_pppUsePhaseCheckBox->isChecked()
1801 && !_pppMountLineEdit->text().isEmpty()) {
1802 _pppSigPLineEdit->setPalette(palette_white);
1803 _pppSigPLineEdit->setEnabled(true);
1804 }
1805 else {
1806 _pppSigPLineEdit->setPalette(palette_gray);
1807 _pppSigPLineEdit->setEnabled(false);
1808 }
1809 if (_pppSPPComboBox->currentText() == "PPP") {
1810 _pppSync->setPalette(palette_white);
1811 _pppSync->setEnabled(true);
1812 }
1813 else {
1814 _pppSync->setPalette(palette_gray);
1815 _pppSync->setEnabled(false);
1816 }
1817 } else {
1818 _pppSPPComboBox->setPalette(palette_gray);
1819 _pppNMEALineEdit->setPalette(palette_gray);
1820 _pppNMEAPortLineEdit->setPalette(palette_gray);
1821 _pppRefCrdXLineEdit->setPalette(palette_gray);
1822 _pppRefCrdYLineEdit->setPalette(palette_gray);
1823 _pppRefCrdZLineEdit->setPalette(palette_gray);
1824 _pppSync->setPalette(palette_gray);
1825 _pppUsePhaseCheckBox->setPalette(palette_gray);
1826 _pppPlotCoordinates->setPalette(palette_gray);
1827 _pppEstTropoCheckBox->setPalette(palette_gray);
1828 _pppGLONASSCheckBox->setPalette(palette_gray);
1829 _pppGalileoCheckBox->setPalette(palette_gray);
1830 _pppSigCLineEdit->setPalette(palette_gray);
1831 _pppSigPLineEdit->setPalette(palette_gray);
1832 _pppSigCrd0->setPalette(palette_gray);
1833 _pppSigCrdP->setPalette(palette_gray);
1834 _pppSigTrp0->setPalette(palette_gray);
1835 _pppSigTrpP->setPalette(palette_gray);
1836 _pppAverageLineEdit->setPalette(palette_gray);
1837 _pppQuickStartLineEdit->setPalette(palette_gray);
1838 _pppSPPComboBox->setEnabled(false);
1839 _pppNMEALineEdit->setEnabled(false);
1840 _pppNMEAPortLineEdit->setEnabled(false);
1841 _pppRefCrdXLineEdit->setEnabled(false);
1842 _pppRefCrdYLineEdit->setEnabled(false);
1843 _pppRefCrdZLineEdit->setEnabled(false);
1844 _pppSync->setEnabled(false);
1845 _pppUsePhaseCheckBox->setEnabled(false);
1846 _pppPlotCoordinates->setEnabled(false);
1847 _pppEstTropoCheckBox->setEnabled(false);
1848 _pppGLONASSCheckBox->setEnabled(false);
1849 _pppGalileoCheckBox->setEnabled(false);
1850 _pppSigCLineEdit->setEnabled(false);
1851 _pppSigPLineEdit->setEnabled(false);
1852 _pppSigCrd0->setEnabled(false);
1853 _pppSigCrdP->setEnabled(false);
1854 _pppSigTrp0->setEnabled(false);
1855 _pppSigTrpP->setEnabled(false);
1856 _pppAverageLineEdit->setEnabled(false);
1857 _pppQuickStartLineEdit->setEnabled(false);
1858 }
1859 }
1860}
1861
1862//
1863////////////////////////////////////////////////////////////////////////////
1864void bncWindow::slotAddCmbRow() {
1865 int iRow = _cmbTable->rowCount();
1866 _cmbTable->insertRow(iRow);
1867 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1868 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
1869 }
1870}
1871
1872//
1873////////////////////////////////////////////////////////////////////////////
1874void bncWindow::slotDelCmbRow() {
1875 int nRows = _cmbTable->rowCount();
1876 bool flg[nRows];
1877 for (int iRow = 0; iRow < nRows; iRow++) {
1878 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
1879 flg[iRow] = true;
1880 }
1881 else {
1882 flg[iRow] = false;
1883 }
1884 }
1885 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1886 if (flg[iRow]) {
1887 _cmbTable->removeRow(iRow);
1888 }
1889 }
1890}
1891
1892//
1893////////////////////////////////////////////////////////////////////////////
1894void bncWindow::populateCmbTable() {
1895
1896 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
1897 _cmbTable->removeRow(iRow);
1898 }
1899
1900 bncSettings settings;
1901
1902 int iRow = -1;
1903 QListIterator<QString> it(settings.value("combineStreams").toStringList());
1904 while (it.hasNext()) {
1905 QStringList hlp = it.next().split(" ");
1906 if (hlp.size() > 0) {
1907 ++iRow;
1908 _cmbTable->insertRow(iRow);
1909 }
1910 for (int iCol = 0; iCol < hlp.size(); iCol++) {
1911 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
1912 }
1913 }
1914}
Note: See TracBrowser for help on using the repository browser.