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

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

Tab PPP-2 updated

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