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

Last change on this file since 2340 was 2340, checked in by weber, 14 years ago

* empty log message *

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