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

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

PPP tabs modified

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