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

Last change on this file since 2877 was 2877, checked in by mervart, 13 years ago
File size: 96.6 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* ppp2group = new QWidget();
522 QWidget* cmbgroup = new QWidget();
523 _aogroup->addTab(pgroup,tr("Proxy"));
524 _aogroup->addTab(ggroup,tr("General"));
525 _aogroup->addTab(ogroup,tr("RINEX Observations"));
526 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
527 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
528 _aogroup->addTab(sgroup,tr("Feed Engine"));
529 _aogroup->addTab(sergroup,tr("Serial Output"));
530 _aogroup->addTab(agroup,tr("Outages"));
531 _aogroup->addTab(rgroup,tr("Miscellaneous"));
532 _aogroup->addTab(pppgroup,tr("PPP (1)"));
533 _aogroup->addTab(ppp2group,tr("PPP (2)"));
534 _aogroup->addTab(cmbgroup,tr("Combination"));
535
536 // Log Tab
537 // -------
538 _loggroup = new QTabWidget();
539 _loggroup->addTab(_log,tr("Log"));
540 _loggroup->addTab(_bncFigure,tr("Throughput"));
541 _loggroup->addTab(_bncFigureLate,tr("Latency"));
542 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
543
544 // Proxy Tab
545 // ---------
546 QGridLayout* pLayout = new QGridLayout;
547 pLayout->setColumnMinimumWidth(0,13*ww);
548 _proxyPortLineEdit->setMaximumWidth(9*ww);
549
550 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
551 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
552 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
553 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
554 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
555 pLayout->addWidget(new QLabel(" "),3,0);
556 pLayout->addWidget(new QLabel(" "),4,0);
557 pLayout->addWidget(new QLabel(" "),5,0);
558 pgroup->setLayout(pLayout);
559
560 // General Tab
561 // -----------
562 QGridLayout* gLayout = new QGridLayout;
563 gLayout->setColumnMinimumWidth(0,14*ww);
564 _onTheFlyComboBox->setMaximumWidth(9*ww);
565
566 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
567 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
568 gLayout->addWidget(new QLabel("Append files"), 1, 0);
569 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
570 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
571 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
572 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
573 gLayout->addWidget(_autoStartCheckBox, 3, 1);
574 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
575 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
576 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
577 ggroup->setLayout(gLayout);
578
579 // RINEX Observations
580 // ------------------
581 QGridLayout* oLayout = new QGridLayout;
582 oLayout->setColumnMinimumWidth(0,14*ww);
583 _rnxIntrComboBox->setMaximumWidth(9*ww);
584 _rnxSamplSpinBox->setMaximumWidth(9*ww);
585
586 oLayout->addWidget(new QLabel("Directory"), 0, 0);
587 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
588 oLayout->addWidget(new QLabel("Interval"), 1, 0);
589 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
590 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
591 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
592 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
593 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
594 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
595 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
596 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
597 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
598 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
599 ogroup->setLayout(oLayout);
600
601 // RINEX Ephemeris
602 // ---------------
603 QGridLayout* eLayout = new QGridLayout;
604 eLayout->setColumnMinimumWidth(0,14*ww);
605 _ephIntrComboBox->setMaximumWidth(9*ww);
606 _outEphPortLineEdit->setMaximumWidth(9*ww);
607
608 eLayout->addWidget(new QLabel("Directory"), 0, 0);
609 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
610 eLayout->addWidget(new QLabel("Interval"), 1, 0);
611 eLayout->addWidget(_ephIntrComboBox, 1, 1);
612 eLayout->addWidget(new QLabel("Port"), 2, 0);
613 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
614 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
615 eLayout->addWidget(_ephV3CheckBox, 3, 1);
616 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
617 eLayout->addWidget(new QLabel(" "),5,0);
618 egroup->setLayout(eLayout);
619
620
621 // Broadcast Corrections
622 // ---------------------
623 QGridLayout* cLayout = new QGridLayout;
624 cLayout->setColumnMinimumWidth(0,14*ww);
625 _corrIntrComboBox->setMaximumWidth(9*ww);
626 _corrPortLineEdit->setMaximumWidth(9*ww);
627 _corrTimeSpinBox->setMaximumWidth(9*ww);
628
629 cLayout->addWidget(new QLabel("Directory"), 0, 0);
630 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
631 cLayout->addWidget(new QLabel("Interval"), 1, 0);
632 cLayout->addWidget(_corrIntrComboBox, 1, 1);
633 cLayout->addWidget(new QLabel("Port"), 2, 0);
634 cLayout->addWidget(_corrPortLineEdit, 2, 1);
635 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
636 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
637 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
638 cLayout->addWidget(new QLabel(" "),4,0);
639 cLayout->addWidget(new QLabel(" "),5,0);
640 cgroup->setLayout(cLayout);
641
642 // Feed Engine
643 // -----------
644 QGridLayout* sLayout = new QGridLayout;
645 sLayout->setColumnMinimumWidth(0,14*ww);
646 _outPortLineEdit->setMaximumWidth(9*ww);
647 _waitTimeSpinBox->setMaximumWidth(9*ww);
648 _binSamplSpinBox->setMaximumWidth(9*ww);
649 _outUPortLineEdit->setMaximumWidth(9*ww);
650
651 sLayout->addWidget(new QLabel("Port"), 0, 0);
652 sLayout->addWidget(_outPortLineEdit, 0, 1);
653 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
654 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
655 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
656 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
657 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
658 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
659 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
660 sLayout->addWidget(_outUPortLineEdit, 3, 1);
661 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
662 sLayout->addWidget(new QLabel(" "),5,0);
663 sgroup->setLayout(sLayout);
664
665 // Serial Output
666 // -------------
667 QGridLayout* serLayout = new QGridLayout;
668 serLayout->setColumnMinimumWidth(0,14*ww);
669 _serialBaudRateComboBox->setMaximumWidth(9*ww);
670 _serialFlowControlComboBox->setMaximumWidth(11*ww);
671 _serialDataBitsComboBox->setMaximumWidth(5*ww);
672 _serialParityComboBox->setMaximumWidth(9*ww);
673 _serialStopBitsComboBox->setMaximumWidth(5*ww);
674 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
675 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
676
677 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
678 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
679 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
680 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
681 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
682 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
683 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
684 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
685 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
686 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
687 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
688 serLayout->addWidget(_serialParityComboBox, 3,3);
689 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
690 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
691 serLayout->addWidget(new QLabel("NMEA"), 4,0);
692 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
693 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
694 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
695 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
696 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
697 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
698
699 sergroup->setLayout(serLayout);
700
701 // Outages
702 // -------
703 QGridLayout* aLayout = new QGridLayout;
704 aLayout->setColumnMinimumWidth(0,14*ww);
705 _obsRateComboBox->setMaximumWidth(9*ww);
706 _adviseFailSpinBox->setMaximumWidth(9*ww);
707 _adviseRecoSpinBox->setMaximumWidth(9*ww);
708
709 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
710 aLayout->addWidget(_obsRateComboBox, 0, 1);
711 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
712 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
713 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
714 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
715 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
716 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
717 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
718 aLayout->addWidget(new QLabel(" "), 5, 0);
719 agroup->setLayout(aLayout);
720
721 // Miscellaneous
722 // -------------
723 QGridLayout* rLayout = new QGridLayout;
724 rLayout->setColumnMinimumWidth(0,14*ww);
725 _perfIntrComboBox->setMaximumWidth(9*ww);
726
727 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
728 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
729 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
730 rLayout->addWidget(_perfIntrComboBox, 1, 1);
731 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
732 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
733 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
734 rLayout->addWidget(new QLabel(" "), 4, 0);
735 rLayout->addWidget(new QLabel(" "), 5, 0);
736 rgroup->setLayout(rLayout);
737
738 // PPP Client
739 // ----------
740 QGridLayout* pppLayout = new QGridLayout;
741 _pppSigCLineEdit->setMaximumWidth(6*ww);
742 _pppSigPLineEdit->setMaximumWidth(6*ww);
743 _pppSigCrd0->setMaximumWidth(6*ww);
744 _pppSigCrdP->setMaximumWidth(6*ww);
745 _pppSigTrp0->setMaximumWidth(6*ww);
746 _pppSigTrpP->setMaximumWidth(6*ww);
747 _pppAverageLineEdit->setMaximumWidth(6*ww);
748 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
749 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
750 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
751 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
752 _pppSync->setMaximumWidth(6*ww);
753 _pppSPPComboBox->setMaximumWidth(8*ww);
754 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
755//pppLayout->setColumnMinimumWidth(0,12*ww);
756 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
757 pppLayout->addWidget(_pppMountLineEdit, 0, 1);
758 pppLayout->addWidget(_pppSPPComboBox, 0, 2);
759 pppLayout->addWidget(new QLabel(" X "), 0, 3, Qt::AlignRight);
760 pppLayout->addWidget(_pppRefCrdXLineEdit, 0, 4);
761 pppLayout->addWidget(new QLabel(" Y "), 0, 5, Qt::AlignRight);
762 pppLayout->addWidget(_pppRefCrdYLineEdit, 0, 6);
763 pppLayout->addWidget(new QLabel(" Z "), 0, 7, Qt::AlignRight);
764 pppLayout->addWidget(_pppRefCrdZLineEdit, 0, 8);
765 pppLayout->addWidget(new QLabel("Options"), 1, 0, 1, 5);
766 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 1, Qt::AlignRight);
767 pppLayout->addWidget(new QLabel("Use phase obs"), 1, 2);
768 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 3, Qt::AlignRight);
769 pppLayout->addWidget(new QLabel("Estimate tropo"), 1, 4);
770 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 5, Qt::AlignRight);
771 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 6);
772 pppLayout->addWidget(_pppGalileoCheckBox, 1, 7, Qt::AlignRight);
773 pppLayout->addWidget(new QLabel("Use Galileo"), 1, 8);
774 pppLayout->addWidget(new QLabel("Options cont'd"), 2, 0);
775 pppLayout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
776 pppLayout->addWidget(new QLabel("Sigma Code"), 2, 2);
777 pppLayout->addWidget(_pppSigPLineEdit, 2, 3);
778 pppLayout->addWidget(new QLabel("Sigma Phase"), 2, 4);
779 pppLayout->addWidget(_pppQuickStartLineEdit, 2, 5, Qt::AlignRight);
780 pppLayout->addWidget(new QLabel("Quick-Start (sec) ") , 2, 6);
781 pppLayout->addWidget(_pppAverageLineEdit, 2, 7);
782 pppLayout->addWidget(new QLabel("Averaging (min)") , 2, 8);
783 pppLayout->addWidget(new QLabel("Parameter sigmas"), 3, 0);
784 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
785 pppLayout->addWidget(new QLabel("XYZ Init"), 3, 2);
786 pppLayout->addWidget(_pppSigCrdP, 3, 3);
787 pppLayout->addWidget(new QLabel("XYZ White Noise "), 3, 4);
788 pppLayout->addWidget(_pppSigTrp0, 3, 5, Qt::AlignRight);
789 pppLayout->addWidget(new QLabel("Tropo Init"), 3, 6);
790 pppLayout->addWidget(_pppSigTrpP, 3, 7);
791 pppLayout->addWidget(new QLabel("Tropo White Noise"), 3, 8);
792 pppLayout->addWidget(new QLabel("Output"), 4, 0);
793 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 3);
794 pppLayout->addWidget(new QLabel("NMEA file"), 4, 4);
795 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 5);
796 pppLayout->addWidget(new QLabel("NMEA port"), 4, 6);
797 pppLayout->addWidget(_pppPlotCoordinates, 4, 7, Qt::AlignRight);
798 pppLayout->addWidget(new QLabel("PPP Plot"), 4, 8);
799
800 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
801 pppLayout->addWidget(_pppSync, 5, 7);
802 pppLayout->addWidget(new QLabel("Sync Corr (sec)"), 5, 8);
803
804 pppgroup->setLayout(pppLayout);
805
806 // PPP Client (second panel)
807 // -------------------------
808 QGridLayout* ppp2Layout = new QGridLayout;
809 _pppAntennaLineEdit = new QLineEdit();
810 _pppAntennaLineEdit->setMaximumWidth(12*ww);
811 _pppAntexLineEdit = new QLineEdit();
812 _pppAntexLineEdit->setMaximumWidth(12*ww);
813 _pppIgnoreSatAntCheckBox = new QCheckBox;
814
815 ppp2Layout->addWidget(new QLabel("Antenna Name"), 0, 0);
816 ppp2Layout->addWidget(_pppAntennaLineEdit, 0, 1);
817 ppp2Layout->addWidget(new QLabel("ANTEX File"), 1, 0);
818 ppp2Layout->addWidget(_pppAntexLineEdit, 1, 1);
819 ppp2Layout->addWidget(new QLabel("Ignore Satellite Antenna Offsets"), 1, 2);
820 ppp2Layout->addWidget(_pppIgnoreSatAntCheckBox, 1, 3);
821
822 ppp2Layout->setRowStretch(2,1);
823 ppp2Layout->setColumnStretch(4,1);
824
825 ppp2Layout->addWidget(new QLabel("Options for PPP (continuation)"), 3, 0, 1, 4);
826
827 ppp2group->setLayout(ppp2Layout);
828
829 // Combination
830 // -----------
831 QGridLayout* cmbLayout = new QGridLayout;
832
833 _cmbTable = new QTableWidget(0,3);
834 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
835 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
836 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
837 populateCmbTable();
838 cmbLayout->addWidget(_cmbTable,0,0,6,3);
839 cmbLayout->setColumnStretch(0,1);
840 cmbLayout->setColumnStretch(1,1);
841 cmbLayout->setColumnStretch(2,1);
842
843 QPushButton* addCmbRowButton = new QPushButton("Add Row");
844 cmbLayout->addWidget(addCmbRowButton,0,3);
845 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
846
847 QPushButton* delCmbRowButton = new QPushButton("Delete");
848 cmbLayout->addWidget(delCmbRowButton,1,3);
849 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
850
851 cmbLayout->setColumnStretch(4,1);
852
853 cmbLayout->addWidget(new QLabel("Host"), 0, 5);
854 _cmbOutHostLineEdit = new QLineEdit(settings.value("cmbOutHost").toString());
855 cmbLayout->addWidget(_cmbOutHostLineEdit, 0, 6);
856
857 cmbLayout->addWidget(new QLabel("Port"), 0, 7);
858 _cmbOutPortLineEdit = new QLineEdit(settings.value("cmbOutPort").toString());
859 _cmbOutPortLineEdit->setMaximumWidth(9*ww);
860 cmbLayout->addWidget(_cmbOutPortLineEdit, 0, 8);
861
862 cmbLayout->addWidget(new QLabel("Mountpoint"), 1, 5);
863 _cmbMountpointLineEdit = new QLineEdit(settings.value("cmbMountpoint").toString());
864 _cmbMountpointLineEdit->setMaximumWidth(12*ww);
865 cmbLayout->addWidget(_cmbMountpointLineEdit, 1, 6);
866
867 cmbLayout->addWidget(new QLabel("Password"), 1, 7);
868 _cmbPasswordLineEdit = new QLineEdit(settings.value("cmbPassword").toString());
869 _cmbPasswordLineEdit->setEchoMode(QLineEdit::Password);
870 _cmbPasswordLineEdit->setMaximumWidth(9*ww);
871 cmbLayout->addWidget(_cmbPasswordLineEdit, 1, 8);
872
873 cmbLayout->addWidget(new QLabel("Output File"), 2, 5);
874 _cmbOutFileLineEdit = new QLineEdit(settings.value("cmbOutFile").toString());
875 cmbLayout->addWidget(_cmbOutFileLineEdit, 2, 6);
876
877 cmbLayout->addWidget(new QLabel("Output SP3"), 3, 5);
878 _cmbSP3FileLineEdit = new QLineEdit(settings.value("cmbSP3File").toString());
879 cmbLayout->addWidget(_cmbSP3FileLineEdit, 3, 6);
880
881 cmbgroup->setLayout(cmbLayout);
882
883 // Main Layout
884 // -----------
885 QGridLayout* mLayout = new QGridLayout;
886 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
887 mLayout->addWidget(_aogroup, 0,0);
888 mLayout->addWidget(_mountPointsTable, 1,0);
889 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
890 mLayout->addWidget(_loggroup, 2,0);
891
892 _canvas->setLayout(mLayout);
893
894 // Enable/Disable all Widgets
895 // --------------------------
896 slotBncTextChanged();
897
898 // Auto start
899 // ----------
900 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
901 slotGetData();
902 }
903}
904
905// Destructor
906////////////////////////////////////////////////////////////////////////////
907bncWindow::~bncWindow() {
908 delete _caster;
909}
910
911//
912////////////////////////////////////////////////////////////////////////////
913void bncWindow::populateMountPointsTable() {
914
915 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
916 _mountPointsTable->removeRow(iRow);
917 }
918
919 bncSettings settings;
920
921 QListIterator<QString> it(settings.value("mountPoints").toStringList());
922 if (!it.hasNext()) {
923 _actGetData->setEnabled(false);
924 }
925 int iRow = 0;
926 while (it.hasNext()) {
927 QStringList hlp = it.next().split(" ");
928 if (hlp.size() < 5) continue;
929 _mountPointsTable->insertRow(iRow);
930
931 QUrl url(hlp[0]);
932
933 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
934 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
935 QString nmea(hlp[4]);
936 if (hlp[5] == "S") {
937 fullPath = hlp[0].replace(0,2,"");
938 }
939 QString ntripVersion = "1";
940 if (hlp.size() >= 6) {
941 ntripVersion = (hlp[5]);
942 }
943
944 QTableWidgetItem* it;
945 it = new QTableWidgetItem(url.userInfo());
946 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
947 _mountPointsTable->setItem(iRow, 0, it);
948
949 it = new QTableWidgetItem(fullPath);
950 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
951 _mountPointsTable->setItem(iRow, 1, it);
952
953 it = new QTableWidgetItem(format);
954 _mountPointsTable->setItem(iRow, 2, it);
955
956 if (nmea == "yes") {
957 it = new QTableWidgetItem(latitude);
958 _mountPointsTable->setItem(iRow, 3, it);
959 it = new QTableWidgetItem(longitude);
960 _mountPointsTable->setItem(iRow, 4, it);
961 } else {
962 it = new QTableWidgetItem(latitude);
963 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
964 _mountPointsTable->setItem(iRow, 3, it);
965 it = new QTableWidgetItem(longitude);
966 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
967 _mountPointsTable->setItem(iRow, 4, it);
968 }
969
970 it = new QTableWidgetItem(nmea);
971 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
972 _mountPointsTable->setItem(iRow, 5, it);
973
974 it = new QTableWidgetItem(ntripVersion);
975 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
976 _mountPointsTable->setItem(iRow, 6, it);
977
978 bncTableItem* bncIt = new bncTableItem();
979 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
980 _mountPointsTable->setItem(iRow, 7, bncIt);
981
982 iRow++;
983 }
984
985 _mountPointsTable->sortItems(1);
986}
987
988// Retrieve Table
989////////////////////////////////////////////////////////////////////////////
990void bncWindow::slotAddMountPoints() {
991
992 bncSettings settings;
993 QString proxyHost = settings.value("proxyHost").toString();
994 int proxyPort = settings.value("proxyPort").toInt();
995 if (proxyHost != _proxyHostLineEdit->text() ||
996 proxyPort != _proxyPortLineEdit->text().toInt()) {
997 int iRet = QMessageBox::question(this, "Question", "Proxy options "
998 "changed. Use the new ones?",
999 QMessageBox::Yes, QMessageBox::No,
1000 QMessageBox::NoButton);
1001 if (iRet == QMessageBox::Yes) {
1002 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1003 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1004 settings.sync();
1005 }
1006 }
1007
1008 QMessageBox msgBox;
1009 msgBox.setIcon(QMessageBox::Question);
1010 msgBox.setWindowTitle("Add Stream");
1011 msgBox.setText("Add stream(s) coming from:");
1012
1013 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1014 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1015 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1016 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1017 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1018
1019 msgBox.exec();
1020
1021 if (msgBox.clickedButton() == buttonNtrip) {
1022 bncTableDlg* dlg = new bncTableDlg(this);
1023 dlg->move(this->pos().x()+50, this->pos().y()+50);
1024 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1025 this, SLOT(slotNewMountPoints(QStringList*)));
1026 dlg->exec();
1027 delete dlg;
1028 } else if (msgBox.clickedButton() == buttonIP) {
1029 bncIpPort* ipp = new bncIpPort(this);
1030 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1031 this, SLOT(slotNewMountPoints(QStringList*)));
1032 ipp->exec();
1033 delete ipp;
1034 } else if (msgBox.clickedButton() == buttonUDP) {
1035 bncUdpPort* udp = new bncUdpPort(this);
1036 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1037 this, SLOT(slotNewMountPoints(QStringList*)));
1038 udp->exec();
1039 delete udp;
1040 } else if (msgBox.clickedButton() == buttonSerial) {
1041 bncSerialPort* sep = new bncSerialPort(this);
1042 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1043 this, SLOT(slotNewMountPoints(QStringList*)));
1044 sep->exec();
1045 delete sep;
1046 } else if (msgBox.clickedButton() == buttonCancel) {
1047 // Cancel
1048 }
1049}
1050
1051// Delete Selected Mount Points
1052////////////////////////////////////////////////////////////////////////////
1053void bncWindow::slotDeleteMountPoints() {
1054
1055 int nRows = _mountPointsTable->rowCount();
1056 bool flg[nRows];
1057 for (int iRow = 0; iRow < nRows; iRow++) {
1058 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1059 flg[iRow] = true;
1060 }
1061 else {
1062 flg[iRow] = false;
1063 }
1064 }
1065 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1066 if (flg[iRow]) {
1067 _mountPointsTable->removeRow(iRow);
1068 }
1069 }
1070 _actDeleteMountPoints->setEnabled(false);
1071
1072 if (_mountPointsTable->rowCount() == 0) {
1073 _actGetData->setEnabled(false);
1074 }
1075}
1076
1077// New Mount Points Selected
1078////////////////////////////////////////////////////////////////////////////
1079void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1080 int iRow = 0;
1081 QListIterator<QString> it(*mountPoints);
1082 while (it.hasNext()) {
1083 QStringList hlp = it.next().split(" ");
1084 QUrl url(hlp[0]);
1085 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1086 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1087 QString nmea(hlp[4]);
1088 if (hlp[5] == "S") {
1089 fullPath = hlp[0].replace(0,2,"");
1090 }
1091 QString ntripVersion = "1";
1092 if (hlp.size() >= 6) {
1093 ntripVersion = (hlp[5]);
1094 }
1095
1096 _mountPointsTable->insertRow(iRow);
1097
1098 QTableWidgetItem* it;
1099 it = new QTableWidgetItem(url.userInfo());
1100 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1101 _mountPointsTable->setItem(iRow, 0, it);
1102
1103 it = new QTableWidgetItem(fullPath);
1104 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1105 _mountPointsTable->setItem(iRow, 1, it);
1106
1107 it = new QTableWidgetItem(format);
1108 _mountPointsTable->setItem(iRow, 2, it);
1109
1110 if (nmea == "yes") {
1111 it = new QTableWidgetItem(latitude);
1112 _mountPointsTable->setItem(iRow, 3, it);
1113 it = new QTableWidgetItem(longitude);
1114 _mountPointsTable->setItem(iRow, 4, it);
1115 } else {
1116 it = new QTableWidgetItem(latitude);
1117 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1118 _mountPointsTable->setItem(iRow, 3, it);
1119 it = new QTableWidgetItem(longitude);
1120 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1121 _mountPointsTable->setItem(iRow, 4, it);
1122 }
1123
1124 it = new QTableWidgetItem(nmea);
1125 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1126 _mountPointsTable->setItem(iRow, 5, it);
1127
1128 it = new QTableWidgetItem(ntripVersion);
1129 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1130 _mountPointsTable->setItem(iRow, 6, it);
1131
1132 bncTableItem* bncIt = new bncTableItem();
1133 _mountPointsTable->setItem(iRow, 7, bncIt);
1134
1135 iRow++;
1136 }
1137 _mountPointsTable->hideColumn(0);
1138 _mountPointsTable->sortItems(1);
1139 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1140 _actGetData->setEnabled(true);
1141 }
1142 delete mountPoints;
1143}
1144
1145// Save Options
1146////////////////////////////////////////////////////////////////////////////
1147void bncWindow::slotSaveOptions() {
1148
1149 QStringList mountPoints;
1150 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1151
1152 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1153 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1154 "@" + _mountPointsTable->item(iRow, 1)->text() );
1155
1156 mountPoints.append(url.toString() + " " +
1157 _mountPointsTable->item(iRow, 2)->text()
1158 + " " + _mountPointsTable->item(iRow, 3)->text()
1159 + " " + _mountPointsTable->item(iRow, 4)->text()
1160 + " " + _mountPointsTable->item(iRow, 5)->text()
1161 + " " + _mountPointsTable->item(iRow, 6)->text());
1162 } else {
1163 mountPoints.append(
1164 "//" + _mountPointsTable->item(iRow, 1)->text()
1165 + " " + _mountPointsTable->item(iRow, 2)->text()
1166 + " " + _mountPointsTable->item(iRow, 3)->text()
1167 + " " + _mountPointsTable->item(iRow, 4)->text()
1168 + " " + _mountPointsTable->item(iRow, 5)->text()
1169 + " " + _mountPointsTable->item(iRow, 6)->text());
1170 }
1171 }
1172
1173 QStringList combineStreams;
1174 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1175 QString hlp;
1176 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1177 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1178 }
1179 combineStreams << hlp;
1180 }
1181
1182 bncSettings settings;
1183
1184 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1185 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1186 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1187 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1188 settings.setValue("binSampl", _binSamplSpinBox->value());
1189 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1190 settings.setValue("corrPath", _corrPathLineEdit->text());
1191 settings.setValue("corrPort", _corrPortLineEdit->text());
1192 settings.setValue("corrTime", _corrTimeSpinBox->value());
1193 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1194 settings.setValue("ephPath", _ephPathLineEdit->text());
1195 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1196 settings.setValue("logFile", _logFileLineEdit->text());
1197 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1198 settings.setValue("miscMount", _miscMountLineEdit->text());
1199 settings.setValue("pppMount", _pppMountLineEdit->text());
1200 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1201 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1202 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1203 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1204 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1205 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1206 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1207 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1208 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1209 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1210 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1211 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1212 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1213 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1214 settings.setValue("pppSync", _pppSync->text());
1215 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1216 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1217 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1218 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1219 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1220 settings.setValue("mountPoints", mountPoints);
1221 settings.setValue("obsRate", _obsRateComboBox->currentText());
1222 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1223 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1224 settings.setValue("outFile", _outFileLineEdit->text());
1225 settings.setValue("outPort", _outPortLineEdit->text());
1226 settings.setValue("outUPort", _outUPortLineEdit->text());
1227 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1228 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1229 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1230 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1231 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1232 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1233 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1234 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1235 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1236 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1237 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1238 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1239 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1240 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1241 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1242 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1243 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1244 settings.setValue("serialParity", _serialParityComboBox->currentText());
1245 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1246 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1247 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1248 settings.setValue("startTab", _aogroup->currentIndex());
1249 settings.setValue("statusTab", _loggroup->currentIndex());
1250 settings.setValue("waitTime", _waitTimeSpinBox->value());
1251 settings.setValue("combineStreams", combineStreams);
1252 settings.setValue("cmbOutHost", _cmbOutHostLineEdit->text());
1253 settings.setValue("cmbOutPort", _cmbOutPortLineEdit->text());
1254 settings.setValue("cmbMountpoint", _cmbMountpointLineEdit->text());
1255 settings.setValue("cmbPassword", _cmbPasswordLineEdit->text());
1256 settings.setValue("cmbOutFile", _cmbOutFileLineEdit->text());
1257 settings.setValue("cmbSP3File", _cmbSP3FileLineEdit->text());
1258
1259 if (_caster) {
1260 _caster->slotReadMountPoints();
1261 }
1262 settings.sync();
1263}
1264
1265// All get slots terminated
1266////////////////////////////////////////////////////////////////////////////
1267void bncWindow::slotGetThreadsFinished() {
1268 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1269 delete _caster; _caster = 0;
1270 _actGetData->setEnabled(true);
1271 _actStop->setEnabled(false);
1272}
1273
1274// Retrieve Data
1275////////////////////////////////////////////////////////////////////////////
1276void bncWindow::slotGetData() {
1277 slotSaveOptions();
1278
1279 _bncFigurePPP->reset();
1280
1281 _actDeleteMountPoints->setEnabled(false);
1282 _actGetData->setEnabled(false);
1283 _actStop->setEnabled(true);
1284
1285 _caster = new bncCaster(_outFileLineEdit->text(),
1286 _outPortLineEdit->text().toInt());
1287
1288 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1289 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1290
1291 connect(_caster, SIGNAL(getThreadsFinished()),
1292 this, SLOT(slotGetThreadsFinished()));
1293
1294 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1295 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1296
1297 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1298
1299 bncSettings settings;
1300
1301 QDir rnxdir(settings.value("rnxPath").toString());
1302 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1303
1304 QString rnx_file = settings.value("rnxScript").toString();
1305 if ( !rnx_file.isEmpty() ) {
1306 QFile rnxfile(settings.value("rnxScript").toString());
1307 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1308 }
1309
1310 QDir ephdir(settings.value("ephPath").toString());
1311 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1312
1313 QDir corrdir(settings.value("corrPath").toString());
1314 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1315
1316 QString advise_file = settings.value("adviseScript").toString();
1317 if ( !advise_file.isEmpty() ) {
1318 QFile advisefile(settings.value("adviseScript").toString());
1319 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1320 }
1321
1322 _caster->slotReadMountPoints();
1323}
1324
1325// Retrieve Data
1326////////////////////////////////////////////////////////////////////////////
1327void bncWindow::slotStop() {
1328 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1329 QMessageBox::Yes, QMessageBox::No,
1330 QMessageBox::NoButton);
1331 if (iRet == QMessageBox::Yes) {
1332 delete _caster; _caster = 0;
1333 _actGetData->setEnabled(true);
1334 _actStop->setEnabled(false);
1335 }
1336}
1337
1338// Close Application gracefully
1339////////////////////////////////////////////////////////////////////////////
1340void bncWindow::closeEvent(QCloseEvent* event) {
1341
1342 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1343 QMessageBox::Yes, QMessageBox::No,
1344 QMessageBox::Cancel);
1345
1346 if (iRet == QMessageBox::Cancel) {
1347 event->ignore();
1348 return;
1349 }
1350 else if (iRet == QMessageBox::Yes) {
1351 slotSaveOptions();
1352 }
1353
1354 QMainWindow::closeEvent(event);
1355}
1356
1357// User changed the selection of mountPoints
1358////////////////////////////////////////////////////////////////////////////
1359void bncWindow::slotSelectionChanged() {
1360 if (_mountPointsTable->selectedItems().isEmpty()) {
1361 _actDeleteMountPoints->setEnabled(false);
1362 }
1363 else {
1364 _actDeleteMountPoints->setEnabled(true);
1365 }
1366}
1367
1368// Display Program Messages
1369////////////////////////////////////////////////////////////////////////////
1370void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1371
1372#ifdef DEBUG_RTCM2_2021
1373 const int maxBufferSize = 1000;
1374#else
1375 const int maxBufferSize = 10000;
1376#endif
1377
1378 if (! showOnScreen ) {
1379 return;
1380 }
1381
1382 QString txt = _log->toPlainText() + "\n" +
1383 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1384 _log->clear();
1385 _log->append(txt.right(maxBufferSize));
1386}
1387
1388// About Message
1389////////////////////////////////////////////////////////////////////////////
1390void bncWindow::slotAbout() {
1391 new bncAboutDlg(0);
1392}
1393
1394//Flowchart
1395////////////////////////////////////////////////////////////////////////////
1396void bncWindow::slotFlowchart() {
1397 new bncFlowchartDlg(0);
1398}
1399
1400// Help Window
1401////////////////////////////////////////////////////////////////////////////
1402void bncWindow::slotHelp() {
1403 QUrl url;
1404 url.setPath(":bnchelp.html");
1405 new bncHlpDlg(0, url);
1406}
1407
1408// Select Fonts
1409////////////////////////////////////////////////////////////////////////////
1410void bncWindow::slotFontSel() {
1411 bool ok;
1412 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1413 if (ok) {
1414 bncSettings settings;
1415 settings.setValue("font", newFont.toString());
1416 QApplication::setFont(newFont);
1417 int ww = QFontMetrics(newFont).width('w');
1418 setMinimumSize(60*ww, 80*ww);
1419 resize(60*ww, 80*ww);
1420 }
1421}
1422
1423// Whats This Help
1424void bncWindow::slotWhatsThis() {
1425 QWhatsThis::enterWhatsThisMode();
1426}
1427
1428//
1429////////////////////////////////////////////////////////////////////////////
1430void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1431 _bncFigure->updateMountPoints();
1432 _bncFigureLate->updateMountPoints();
1433
1434 populateMountPointsTable();
1435 bncSettings settings;
1436 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1437 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1438 QListIterator<bncGetThread*> iTh(threads);
1439 while (iTh.hasNext()) {
1440 bncGetThread* thread = iTh.next();
1441 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1442 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1443 "@" + _mountPointsTable->item(iRow, 1)->text() );
1444 if (url == thread->mountPoint() &&
1445 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1446 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1447 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1448 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1449 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1450 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1451 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1452 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1453 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1454 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1455 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1456 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1457 disconnect(thread,
1458 SIGNAL(newPosition(bncTime, double, double, double)),
1459 _bncFigurePPP,
1460 SLOT(slotNewPosition(bncTime, double, double, double)));
1461 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1462 _bncFigurePPP,
1463 SLOT(slotNewPosition(bncTime, double, double, double)));
1464 }
1465 break;
1466 }
1467 }
1468 }
1469}
1470
1471//
1472////////////////////////////////////////////////////////////////////////////
1473void bncWindow::CreateMenu() {
1474 // Create Menus
1475 // ------------
1476 _menuFile = menuBar()->addMenu(tr("&File"));
1477 _menuFile->addAction(_actFontSel);
1478 _menuFile->addSeparator();
1479 _menuFile->addAction(_actSaveOpt);
1480 _menuFile->addSeparator();
1481 _menuFile->addAction(_actQuit);
1482
1483 _menuHlp = menuBar()->addMenu(tr("&Help"));
1484 _menuHlp->addAction(_actHelp);
1485 _menuHlp->addAction(_actFlowchart);
1486 _menuHlp->addAction(_actAbout);
1487}
1488
1489// Toolbar
1490////////////////////////////////////////////////////////////////////////////
1491void bncWindow::AddToolbar() {
1492 // Tool (Command) Bar
1493 // ------------------
1494 QToolBar* toolBar = new QToolBar;
1495 addToolBar(Qt::BottomToolBarArea, toolBar);
1496 toolBar->setMovable(false);
1497 toolBar->addAction(_actAddMountPoints);
1498 toolBar->addAction(_actDeleteMountPoints);
1499 toolBar->addAction(_actGetData);
1500 toolBar->addAction(_actStop);
1501 toolBar->addWidget(new QLabel(" "));
1502 toolBar->addAction(_actwhatsthis);
1503}
1504
1505// About
1506////////////////////////////////////////////////////////////////////////////
1507bncAboutDlg::bncAboutDlg(QWidget* parent) :
1508 QDialog(parent) {
1509
1510 QTextBrowser* tb = new QTextBrowser;
1511 QUrl url; url.setPath(":bncabout.html");
1512 tb->setSource(url);
1513 tb->setReadOnly(true);
1514
1515 int ww = QFontMetrics(font()).width('w');
1516 QPushButton* _closeButton = new QPushButton("Close");
1517 _closeButton->setMaximumWidth(10*ww);
1518 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1519
1520 QGridLayout* dlgLayout = new QGridLayout();
1521 QLabel* img = new QLabel();
1522 img->setPixmap(QPixmap(":ntrip-logo.png"));
1523 dlgLayout->addWidget(img, 0,0);
1524 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1525 dlgLayout->addWidget(tb,1,0,1,2);
1526 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1527
1528 setLayout(dlgLayout);
1529 resize(60*ww, 60*ww);
1530 setWindowTitle("About BNC");
1531 show();
1532}
1533
1534//
1535////////////////////////////////////////////////////////////////////////////
1536bncAboutDlg::~bncAboutDlg() {
1537};
1538
1539// Flowchart
1540////////////////////////////////////////////////////////////////////////////
1541bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1542 QDialog(parent) {
1543
1544 int ww = QFontMetrics(font()).width('w');
1545 QPushButton* _closeButton = new QPushButton("Close");
1546 _closeButton->setMaximumWidth(10*ww);
1547 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1548
1549 QGridLayout* dlgLayout = new QGridLayout();
1550 QLabel* img = new QLabel();
1551 img->setPixmap(QPixmap(":bncflowchart.png"));
1552 dlgLayout->addWidget(img, 0,0);
1553 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1554
1555 setLayout(dlgLayout);
1556 setWindowTitle("Flow Chart");
1557 show();
1558}
1559
1560//
1561////////////////////////////////////////////////////////////////////////////
1562bncFlowchartDlg::~bncFlowchartDlg() {
1563};
1564
1565// Bnc Text
1566////////////////////////////////////////////////////////////////////////////
1567void bncWindow::slotBncTextChanged(){
1568
1569 QPalette palette_white(QColor(255, 255, 255));
1570 QPalette palette_gray(QColor(230, 230, 230));
1571 bncSettings settings;
1572
1573 // Proxy
1574 //------
1575 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1576 if (!_proxyHostLineEdit->text().isEmpty()) {
1577 _proxyPortLineEdit->setStyleSheet("background-color: white");
1578 _proxyPortLineEdit->setEnabled(true);
1579 }
1580 else {
1581 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1582 _proxyPortLineEdit->setEnabled(false);
1583 }
1584 }
1585
1586 // RINEX Observations
1587 // ------------------
1588 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1589 if (!_rnxPathLineEdit->text().isEmpty()) {
1590 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1591 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1592 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1593 _rnxV3CheckBox->setPalette(palette_white);
1594 _rnxIntrComboBox->setStyleSheet("background-color: white");
1595 _rnxSamplSpinBox->setEnabled(true);
1596 _rnxSkelLineEdit->setEnabled(true);
1597 _rnxScrpLineEdit->setEnabled(true);
1598 _rnxV3CheckBox->setEnabled(true);
1599 _rnxIntrComboBox->setEnabled(true);
1600 }
1601 else {
1602 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1603 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1604 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1605 _rnxV3CheckBox->setPalette(palette_gray);
1606 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1607 _rnxSamplSpinBox->setEnabled(false);
1608 _rnxSkelLineEdit->setEnabled(false);
1609 _rnxScrpLineEdit->setEnabled(false);
1610 _rnxV3CheckBox->setEnabled(false);
1611 _rnxIntrComboBox->setEnabled(false);
1612 }
1613 }
1614
1615 // RINEX Ephemeris
1616 // ---------------
1617 if (sender() == 0 ||
1618 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1619 if (!_ephPathLineEdit->text().isEmpty() ||
1620 !_outEphPortLineEdit->text().isEmpty()) {
1621 _ephIntrComboBox->setStyleSheet("background-color: white");
1622 _ephV3CheckBox->setPalette(palette_white);
1623 _ephIntrComboBox->setEnabled(true);
1624 _ephV3CheckBox->setEnabled(true);
1625 }
1626 else {
1627 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1628 _ephV3CheckBox->setPalette(palette_gray);
1629 _ephIntrComboBox->setEnabled(false);
1630 _ephV3CheckBox->setEnabled(false);
1631 }
1632 }
1633
1634 // Broadcast Corrections
1635 // ---------------------
1636 if (sender() == 0 ||
1637 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1638 if (!_corrPathLineEdit->text().isEmpty() ||
1639 !_corrPortLineEdit->text().isEmpty()) {
1640 _corrIntrComboBox->setStyleSheet("background-color: white");
1641 _corrIntrComboBox->setEnabled(true);
1642 }
1643 else {
1644 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1645 _corrIntrComboBox->setEnabled(false);
1646 }
1647 }
1648
1649 // Feed Engine
1650 // -----------
1651 if (sender() == 0 ||
1652 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1653 if ( !_outPortLineEdit->text().isEmpty() ||
1654 !_outFileLineEdit->text().isEmpty()) {
1655 _waitTimeSpinBox->setStyleSheet("background-color: white");
1656 _binSamplSpinBox->setStyleSheet("background-color: white");
1657 _waitTimeSpinBox->setEnabled(true);
1658 _binSamplSpinBox->setEnabled(true);
1659 }
1660 else {
1661 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1662 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1663 _waitTimeSpinBox->setEnabled(false);
1664 _binSamplSpinBox->setEnabled(false);
1665 }
1666 }
1667
1668 // Serial Output
1669 // -------------
1670 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1671 sender() == _serialAutoNMEAComboBox) {
1672 if (!_serialMountPointLineEdit->text().isEmpty()) {
1673 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1674 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1675 _serialParityComboBox->setStyleSheet("background-color: white");
1676 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1677 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1678 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1679 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1680 _serialPortNameLineEdit->setEnabled(true);
1681 _serialBaudRateComboBox->setEnabled(true);
1682 _serialParityComboBox->setEnabled(true);
1683 _serialDataBitsComboBox->setEnabled(true);
1684 _serialStopBitsComboBox->setEnabled(true);
1685 _serialFlowControlComboBox->setEnabled(true);
1686 _serialAutoNMEAComboBox->setEnabled(true);
1687 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1688 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1689 _serialHeightNMEALineEdit->setEnabled(true);
1690 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1691 _serialFileNMEALineEdit->setEnabled(false);
1692 }
1693 else {
1694 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1695 _serialHeightNMEALineEdit->setEnabled(false);
1696 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1697 _serialFileNMEALineEdit->setEnabled(true);
1698 }
1699 }
1700 else {
1701 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1702 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1703 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1704 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1705 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1706 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1707 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1708 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1709 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1710 _serialPortNameLineEdit->setEnabled(false);
1711 _serialBaudRateComboBox->setEnabled(false);
1712 _serialParityComboBox->setEnabled(false);
1713 _serialDataBitsComboBox->setEnabled(false);
1714 _serialStopBitsComboBox->setEnabled(false);
1715 _serialFlowControlComboBox->setEnabled(false);
1716 _serialAutoNMEAComboBox->setEnabled(false);
1717 _serialHeightNMEALineEdit->setEnabled(false);
1718 _serialFileNMEALineEdit->setEnabled(false);
1719 }
1720 }
1721
1722 // Outages
1723 // -------
1724 if (sender() == 0 || sender() == _obsRateComboBox) {
1725 if (!_obsRateComboBox->currentText().isEmpty()) {
1726 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1727 _adviseFailSpinBox->setStyleSheet("background-color: white");
1728 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1729 _adviseFailSpinBox->setEnabled(true);
1730 _adviseRecoSpinBox->setEnabled(true);
1731 _adviseScriptLineEdit->setEnabled(true);
1732 } else {
1733 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1734 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1735 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1736 _adviseFailSpinBox->setEnabled(false);
1737 _adviseRecoSpinBox->setEnabled(false);
1738 _adviseScriptLineEdit->setEnabled(false);
1739 }
1740 }
1741
1742 // Miscellaneous
1743 // -------------
1744 if (sender() == 0 || sender() == _miscMountLineEdit) {
1745 if (!_miscMountLineEdit->text().isEmpty()) {
1746 _perfIntrComboBox->setStyleSheet("background-color: white");
1747 _scanRTCMCheckBox->setPalette(palette_white);
1748 _perfIntrComboBox->setEnabled(true);
1749 _scanRTCMCheckBox->setEnabled(true);
1750 } else {
1751 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1752 _scanRTCMCheckBox->setPalette(palette_gray);
1753 _perfIntrComboBox->setEnabled(false);
1754 _scanRTCMCheckBox->setEnabled(false);
1755 }
1756 }
1757
1758 // PPP Client
1759 // ----------
1760 if (sender() == 0
1761 || sender() == _pppMountLineEdit
1762 || sender() == _pppRefCrdXLineEdit
1763 || sender() == _pppRefCrdYLineEdit
1764 || sender() == _pppRefCrdZLineEdit
1765 || sender() == _pppSync
1766 || sender() == _pppSPPComboBox
1767 || sender() == _pppEstTropoCheckBox
1768 || sender() == _pppUsePhaseCheckBox ) {
1769 if (!_pppMountLineEdit->text().isEmpty()) {
1770 _pppSPPComboBox->setPalette(palette_white);
1771 _pppNMEALineEdit->setPalette(palette_white);
1772 _pppNMEAPortLineEdit->setPalette(palette_white);
1773 _pppRefCrdXLineEdit->setPalette(palette_white);
1774 _pppRefCrdYLineEdit->setPalette(palette_white);
1775 _pppRefCrdZLineEdit->setPalette(palette_white);
1776 _pppUsePhaseCheckBox->setPalette(palette_white);
1777 _pppPlotCoordinates->setPalette(palette_white);
1778 _pppEstTropoCheckBox->setPalette(palette_white);
1779 _pppGLONASSCheckBox->setPalette(palette_white);
1780 _pppGalileoCheckBox->setPalette(palette_white);
1781 _pppSPPComboBox->setEnabled(true);
1782 _pppNMEALineEdit->setEnabled(true);
1783 _pppNMEAPortLineEdit->setEnabled(true);
1784 _pppRefCrdXLineEdit->setEnabled(true);
1785 _pppRefCrdYLineEdit->setEnabled(true);
1786 _pppRefCrdZLineEdit->setEnabled(true);
1787 _pppUsePhaseCheckBox->setEnabled(true);
1788 _pppPlotCoordinates->setEnabled(true);
1789 _pppEstTropoCheckBox->setEnabled(true);
1790 _pppGLONASSCheckBox->setEnabled(true);
1791 _pppGalileoCheckBox->setEnabled(true);
1792 _pppRefCrdXLineEdit->setPalette(palette_white);
1793 _pppRefCrdXLineEdit->setEnabled(true);
1794 _pppRefCrdYLineEdit->setPalette(palette_white);
1795 _pppRefCrdYLineEdit->setEnabled(true);
1796 _pppRefCrdZLineEdit->setPalette(palette_white);
1797 _pppRefCrdZLineEdit->setEnabled(true);
1798 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1799 !_pppRefCrdYLineEdit->text().isEmpty() &&
1800 !_pppRefCrdZLineEdit->text().isEmpty()) {
1801 _pppAverageLineEdit->setPalette(palette_white);
1802 _pppAverageLineEdit->setEnabled(true);
1803 _pppQuickStartLineEdit->setPalette(palette_white);
1804 _pppQuickStartLineEdit->setEnabled(true);
1805 }
1806 else {
1807 _pppAverageLineEdit->setPalette(palette_gray);
1808 _pppAverageLineEdit->setEnabled(false);
1809 _pppQuickStartLineEdit->setPalette(palette_gray);
1810 _pppQuickStartLineEdit->setEnabled(false);
1811 }
1812 _pppSigCLineEdit->setPalette(palette_white);
1813 _pppSigCLineEdit->setEnabled(true);
1814 _pppSigCrd0->setPalette(palette_white);
1815 _pppSigCrd0->setEnabled(true);
1816 _pppSigCrdP->setPalette(palette_white);
1817 _pppSigCrdP->setEnabled(true);
1818 if (_pppEstTropoCheckBox->isChecked()
1819 && !_pppMountLineEdit->text().isEmpty()) {
1820 _pppSigTrp0->setPalette(palette_white);
1821 _pppSigTrp0->setEnabled(true);
1822 _pppSigTrpP->setPalette(palette_white);
1823 _pppSigTrpP->setEnabled(true);
1824 }
1825 else {
1826 _pppSigTrp0->setPalette(palette_gray);
1827 _pppSigTrp0->setEnabled(false);
1828 _pppSigTrpP->setPalette(palette_gray);
1829 _pppSigTrpP->setEnabled(false);
1830 }
1831 if (_pppUsePhaseCheckBox->isChecked()
1832 && !_pppMountLineEdit->text().isEmpty()) {
1833 _pppSigPLineEdit->setPalette(palette_white);
1834 _pppSigPLineEdit->setEnabled(true);
1835 }
1836 else {
1837 _pppSigPLineEdit->setPalette(palette_gray);
1838 _pppSigPLineEdit->setEnabled(false);
1839 }
1840 if (_pppSPPComboBox->currentText() == "PPP") {
1841 _pppSync->setPalette(palette_white);
1842 _pppSync->setEnabled(true);
1843 }
1844 else {
1845 _pppSync->setPalette(palette_gray);
1846 _pppSync->setEnabled(false);
1847 }
1848 } else {
1849 _pppSPPComboBox->setPalette(palette_gray);
1850 _pppNMEALineEdit->setPalette(palette_gray);
1851 _pppNMEAPortLineEdit->setPalette(palette_gray);
1852 _pppRefCrdXLineEdit->setPalette(palette_gray);
1853 _pppRefCrdYLineEdit->setPalette(palette_gray);
1854 _pppRefCrdZLineEdit->setPalette(palette_gray);
1855 _pppSync->setPalette(palette_gray);
1856 _pppUsePhaseCheckBox->setPalette(palette_gray);
1857 _pppPlotCoordinates->setPalette(palette_gray);
1858 _pppEstTropoCheckBox->setPalette(palette_gray);
1859 _pppGLONASSCheckBox->setPalette(palette_gray);
1860 _pppGalileoCheckBox->setPalette(palette_gray);
1861 _pppSigCLineEdit->setPalette(palette_gray);
1862 _pppSigPLineEdit->setPalette(palette_gray);
1863 _pppSigCrd0->setPalette(palette_gray);
1864 _pppSigCrdP->setPalette(palette_gray);
1865 _pppSigTrp0->setPalette(palette_gray);
1866 _pppSigTrpP->setPalette(palette_gray);
1867 _pppAverageLineEdit->setPalette(palette_gray);
1868 _pppQuickStartLineEdit->setPalette(palette_gray);
1869 _pppSPPComboBox->setEnabled(false);
1870 _pppNMEALineEdit->setEnabled(false);
1871 _pppNMEAPortLineEdit->setEnabled(false);
1872 _pppRefCrdXLineEdit->setEnabled(false);
1873 _pppRefCrdYLineEdit->setEnabled(false);
1874 _pppRefCrdZLineEdit->setEnabled(false);
1875 _pppSync->setEnabled(false);
1876 _pppUsePhaseCheckBox->setEnabled(false);
1877 _pppPlotCoordinates->setEnabled(false);
1878 _pppEstTropoCheckBox->setEnabled(false);
1879 _pppGLONASSCheckBox->setEnabled(false);
1880 _pppGalileoCheckBox->setEnabled(false);
1881 _pppSigCLineEdit->setEnabled(false);
1882 _pppSigPLineEdit->setEnabled(false);
1883 _pppSigCrd0->setEnabled(false);
1884 _pppSigCrdP->setEnabled(false);
1885 _pppSigTrp0->setEnabled(false);
1886 _pppSigTrpP->setEnabled(false);
1887 _pppAverageLineEdit->setEnabled(false);
1888 _pppQuickStartLineEdit->setEnabled(false);
1889 }
1890 }
1891}
1892
1893//
1894////////////////////////////////////////////////////////////////////////////
1895void bncWindow::slotAddCmbRow() {
1896 int iRow = _cmbTable->rowCount();
1897 _cmbTable->insertRow(iRow);
1898 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1899 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
1900 }
1901}
1902
1903//
1904////////////////////////////////////////////////////////////////////////////
1905void bncWindow::slotDelCmbRow() {
1906 int nRows = _cmbTable->rowCount();
1907 bool flg[nRows];
1908 for (int iRow = 0; iRow < nRows; iRow++) {
1909 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
1910 flg[iRow] = true;
1911 }
1912 else {
1913 flg[iRow] = false;
1914 }
1915 }
1916 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1917 if (flg[iRow]) {
1918 _cmbTable->removeRow(iRow);
1919 }
1920 }
1921}
1922
1923//
1924////////////////////////////////////////////////////////////////////////////
1925void bncWindow::populateCmbTable() {
1926
1927 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
1928 _cmbTable->removeRow(iRow);
1929 }
1930
1931 bncSettings settings;
1932
1933 int iRow = -1;
1934 QListIterator<QString> it(settings.value("combineStreams").toStringList());
1935 while (it.hasNext()) {
1936 QStringList hlp = it.next().split(" ");
1937 if (hlp.size() > 0) {
1938 ++iRow;
1939 _cmbTable->insertRow(iRow);
1940 }
1941 for (int iCol = 0; iCol < hlp.size(); iCol++) {
1942 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
1943 }
1944 }
1945}
Note: See TracBrowser for help on using the repository browser.