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

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

* empty log message *

File size: 78.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 _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 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
340 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
341 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
342 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
343 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
344 _pppStaticCheckBox = new QCheckBox();
345 _pppStaticCheckBox->setCheckState(Qt::CheckState(
346 settings.value("pppStatic").toInt()));
347 _pppUsePhaseCheckBox = new QCheckBox();
348 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
349 settings.value("pppUsePhase").toInt()));
350 _pppEstTropoCheckBox = new QCheckBox();
351 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
352 settings.value("pppEstTropo").toInt()));
353 _pppGLONASSCheckBox = new QCheckBox();
354 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
355 settings.value("pppGLONASS").toInt()));
356
357 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
358 this, SLOT(slotBncTextChanged()));
359
360 // Streams
361 // -------
362 _mountPointsTable = new QTableWidget(0,8);
363
364 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
365 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
366 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
367 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
368 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
369 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
370 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
371 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
372 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
373 _mountPointsTable->setHorizontalHeaderLabels(labels);
374 _mountPointsTable->setGridStyle(Qt::NoPen);
375 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
376 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
377 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
378 _mountPointsTable->hideColumn(0);
379 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
380 SLOT(slotSelectionChanged()));
381 populateMountPointsTable();
382
383 _log = new QTextBrowser();
384 _log->setReadOnly(true);
385
386 // WhatsThis
387 // ---------
388 _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>"));
389 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
390 _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>"));
391 _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."));
392 _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."));
393 _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."));
394 _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."));
395 _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."));
396 _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."));
397 _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."));
398 _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."));
399 _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."));
400 _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>"));
401 _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>"));
402 _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>"));
403 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
404 _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>"));
405 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
406 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
407 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
408 _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>"));
409 _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>"));
410 _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>"));
411 _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>"));
412 _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>"));
413 _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."));
414 _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>"));
415 _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>"));
416 _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>"));
417 _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."));
418 _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)."));
419 _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."));
420 _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."));
421 _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."));
422 _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>"));
423 _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>"));
424 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
425 _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>"));
426 _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>"));
427 _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>"));
428 _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>"));
429 _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>"));
430 _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>"));
431 _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>"));
432 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
433 _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>"));
434 _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).</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>"));
435 _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>"));
436 _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>"));
437 _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>"));
438 _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>"));
439 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
440 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
441 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown in the 'PPP' tab will then be referred to these values.</p>"));
442 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown inthe 'PPP' tab will then be referred to these values.</p>"));
443 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown inthe 'PPP' tab will then be referred to these values.</p>"));
444 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP' tab when the 'Static' 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."));
445
446 // Canvas with Editable Fields
447 // ---------------------------
448 _canvas = new QWidget;
449 setCentralWidget(_canvas);
450
451 _aogroup = new QTabWidget();
452 QWidget* pgroup = new QWidget();
453 QWidget* ggroup = new QWidget();
454 QWidget* sgroup = new QWidget();
455 QWidget* egroup = new QWidget();
456 QWidget* agroup = new QWidget();
457 QWidget* cgroup = new QWidget();
458 QWidget* ogroup = new QWidget();
459 QWidget* rgroup = new QWidget();
460 QWidget* sergroup = new QWidget();
461 QWidget* pppgroup = new QWidget();
462 _aogroup->addTab(pgroup,tr("Proxy"));
463 _aogroup->addTab(ggroup,tr("General"));
464 _aogroup->addTab(ogroup,tr("RINEX Observations"));
465 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
466 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
467 _aogroup->addTab(sgroup,tr("Feed Engine"));
468 _aogroup->addTab(sergroup,tr("Serial Output"));
469 _aogroup->addTab(agroup,tr("Outages"));
470 _aogroup->addTab(rgroup,tr("Miscellaneous"));
471 _aogroup->addTab(pppgroup,tr("PPP Client"));
472
473 // Log Tab
474 // -------
475 _loggroup = new QTabWidget();
476 _loggroup->addTab(_log,tr("Log"));
477 _loggroup->addTab(_bncFigure,tr("Throughput"));
478 _loggroup->addTab(_bncFigureLate,tr("Latency"));
479 _loggroup->addTab(_bncFigurePPP,tr("Static PPP"));
480
481 // Proxy Tab
482 // ---------
483 QGridLayout* pLayout = new QGridLayout;
484 pLayout->setColumnMinimumWidth(0,13*ww);
485 _proxyPortLineEdit->setMaximumWidth(9*ww);
486
487 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
488 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
489 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
490 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
491 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
492 pLayout->addWidget(new QLabel(" "),3,0);
493 pLayout->addWidget(new QLabel(" "),4,0);
494 pLayout->addWidget(new QLabel(" "),5,0);
495 pgroup->setLayout(pLayout);
496
497 // General Tab
498 // -----------
499 QGridLayout* gLayout = new QGridLayout;
500 gLayout->setColumnMinimumWidth(0,14*ww);
501 _onTheFlyComboBox->setMaximumWidth(9*ww);
502
503 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
504 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
505 gLayout->addWidget(new QLabel("Append files"), 1, 0);
506 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
507 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
508 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
509 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
510 gLayout->addWidget(_autoStartCheckBox, 3, 1);
511 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),4, 0, 1, 50, Qt::AlignLeft);
512 gLayout->addWidget(new QLabel(" "),5,0);
513 ggroup->setLayout(gLayout);
514
515 // RINEX Observations
516 // ------------------
517 QGridLayout* oLayout = new QGridLayout;
518 oLayout->setColumnMinimumWidth(0,14*ww);
519 _rnxIntrComboBox->setMaximumWidth(9*ww);
520 _rnxSamplSpinBox->setMaximumWidth(9*ww);
521
522 oLayout->addWidget(new QLabel("Directory"), 0, 0);
523 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
524 oLayout->addWidget(new QLabel("Interval"), 1, 0);
525 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
526 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
527 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
528 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
529 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
530 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
531 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
532 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
533 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
534 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
535 ogroup->setLayout(oLayout);
536
537 // RINEX Ephemeris
538 // ---------------
539 QGridLayout* eLayout = new QGridLayout;
540 eLayout->setColumnMinimumWidth(0,14*ww);
541 _ephIntrComboBox->setMaximumWidth(9*ww);
542 _outEphPortLineEdit->setMaximumWidth(9*ww);
543
544 eLayout->addWidget(new QLabel("Directory"), 0, 0);
545 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
546 eLayout->addWidget(new QLabel("Interval"), 1, 0);
547 eLayout->addWidget(_ephIntrComboBox, 1, 1);
548 eLayout->addWidget(new QLabel("Port"), 2, 0);
549 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
550 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
551 eLayout->addWidget(_ephV3CheckBox, 3, 1);
552 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
553 eLayout->addWidget(new QLabel(" "),5,0);
554 egroup->setLayout(eLayout);
555
556
557 // Broadcast Corrections
558 // ---------------------
559 QGridLayout* cLayout = new QGridLayout;
560 cLayout->setColumnMinimumWidth(0,14*ww);
561 _corrIntrComboBox->setMaximumWidth(9*ww);
562 _corrPortLineEdit->setMaximumWidth(9*ww);
563 _corrTimeSpinBox->setMaximumWidth(9*ww);
564
565 cLayout->addWidget(new QLabel("Directory"), 0, 0);
566 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
567 cLayout->addWidget(new QLabel("Interval"), 1, 0);
568 cLayout->addWidget(_corrIntrComboBox, 1, 1);
569 cLayout->addWidget(new QLabel("Port"), 2, 0);
570 cLayout->addWidget(_corrPortLineEdit, 2, 1);
571 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
572 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
573 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
574 cLayout->addWidget(new QLabel(" "),4,0);
575 cLayout->addWidget(new QLabel(" "),5,0);
576 cgroup->setLayout(cLayout);
577
578 // Feed Engine
579 // -----------
580 QGridLayout* sLayout = new QGridLayout;
581 sLayout->setColumnMinimumWidth(0,14*ww);
582 _outPortLineEdit->setMaximumWidth(9*ww);
583 _waitTimeSpinBox->setMaximumWidth(9*ww);
584 _binSamplSpinBox->setMaximumWidth(9*ww);
585 _outUPortLineEdit->setMaximumWidth(9*ww);
586
587 sLayout->addWidget(new QLabel("Port"), 0, 0);
588 sLayout->addWidget(_outPortLineEdit, 0, 1);
589 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
590 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
591 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
592 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
593 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
594 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
595 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
596 sLayout->addWidget(_outUPortLineEdit, 3, 1);
597 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
598 sLayout->addWidget(new QLabel(" "),5,0);
599 sgroup->setLayout(sLayout);
600
601 // Serial Output
602 // -------------
603 QGridLayout* serLayout = new QGridLayout;
604 serLayout->setColumnMinimumWidth(0,14*ww);
605 _serialBaudRateComboBox->setMaximumWidth(9*ww);
606 _serialFlowControlComboBox->setMaximumWidth(11*ww);
607 _serialDataBitsComboBox->setMaximumWidth(5*ww);
608 _serialParityComboBox->setMaximumWidth(9*ww);
609 _serialStopBitsComboBox->setMaximumWidth(5*ww);
610 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
611 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
612
613 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
614 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
615 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
616 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
617 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
618 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
619 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
620 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
621 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
622 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
623 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
624 serLayout->addWidget(_serialParityComboBox, 3,3);
625 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
626 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
627 serLayout->addWidget(new QLabel("NMEA"), 4,0);
628 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
629 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
630 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
631 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
632 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
633 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
634
635 sergroup->setLayout(serLayout);
636
637 // Outages
638 // -------
639 QGridLayout* aLayout = new QGridLayout;
640 aLayout->setColumnMinimumWidth(0,14*ww);
641 _obsRateComboBox->setMaximumWidth(9*ww);
642 _adviseFailSpinBox->setMaximumWidth(9*ww);
643 _adviseRecoSpinBox->setMaximumWidth(9*ww);
644
645 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
646 aLayout->addWidget(_obsRateComboBox, 0, 1);
647 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
648 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
649 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
650 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
651 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
652 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
653 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
654 aLayout->addWidget(new QLabel(" "), 5, 0);
655 agroup->setLayout(aLayout);
656
657 // Miscellaneous
658 // -------------
659 QGridLayout* rLayout = new QGridLayout;
660 rLayout->setColumnMinimumWidth(0,14*ww);
661 _perfIntrComboBox->setMaximumWidth(9*ww);
662
663 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
664 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
665 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
666 rLayout->addWidget(_perfIntrComboBox, 1, 1);
667 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
668 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
669 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
670 rLayout->addWidget(new QLabel(" "), 4, 0);
671 rLayout->addWidget(new QLabel(" "), 5, 0);
672 rgroup->setLayout(rLayout);
673
674 // PPP Client
675 // ----------
676 QGridLayout* pppLayout = new QGridLayout;
677 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
678 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
679 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
680 pppLayout->setColumnMinimumWidth(0,14*ww);
681 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
682 pppLayout->addWidget(_pppMountLineEdit, 0, 1, 1, 3);
683 pppLayout->addWidget(new QLabel("Options"), 1, 0);
684 pppLayout->addWidget(_pppStaticCheckBox, 1, 1);
685 pppLayout->addWidget(new QLabel("Static "), 1, 2);
686 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 3);
687 pppLayout->addWidget(new QLabel("Use phase obs "), 1, 4);
688 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 5);
689 pppLayout->addWidget(new QLabel("Estimate tropo "), 1, 6);
690 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 7);
691 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 8);
692 pppLayout->addWidget(new QLabel("Ref. coordinates"), 2, 0);
693 pppLayout->addWidget(_pppRefCrdXLineEdit, 2, 1, 1, 2);
694 pppLayout->addWidget(new QLabel("X"), 2, 3);
695 pppLayout->addWidget(_pppRefCrdYLineEdit, 2, 4);
696 pppLayout->addWidget(new QLabel("Y"), 2, 5);
697 pppLayout->addWidget(_pppRefCrdZLineEdit, 2, 6);
698 pppLayout->addWidget(new QLabel("Z"), 2, 7);
699 pppLayout->addWidget(new QLabel("NMEA File (full path)"), 3, 0);
700 pppLayout->addWidget(_pppNMEALineEdit, 3, 1, 1, 6);
701 pppLayout->addWidget(new QLabel("Port"), 3, 7);
702 pppLayout->addWidget(_pppNMEAPortLineEdit, 3, 8, 1, 2);
703 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),4, 0,1,15);
704 pppLayout->addWidget(new QLabel(" "), 5, 0);
705 pppgroup->setLayout(pppLayout);
706
707 // Main Layout
708 // -----------
709 QGridLayout* mLayout = new QGridLayout;
710 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
711 mLayout->addWidget(_aogroup, 0,0);
712 mLayout->addWidget(_mountPointsTable, 1,0);
713 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
714 mLayout->addWidget(_loggroup, 2,0);
715
716 _canvas->setLayout(mLayout);
717
718 // Enable/Disable all Widgets
719 // --------------------------
720 slotBncTextChanged();
721
722 // Auto start
723 // ----------
724 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
725 slotGetData();
726 }
727}
728
729// Destructor
730////////////////////////////////////////////////////////////////////////////
731bncWindow::~bncWindow() {
732 delete _caster;
733}
734
735//
736////////////////////////////////////////////////////////////////////////////
737void bncWindow::populateMountPointsTable() {
738
739 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
740 _mountPointsTable->removeRow(iRow);
741 }
742
743 bncSettings settings;
744
745 QListIterator<QString> it(settings.value("mountPoints").toStringList());
746 if (!it.hasNext()) {
747 _actGetData->setEnabled(false);
748 }
749 int iRow = 0;
750 while (it.hasNext()) {
751 QStringList hlp = it.next().split(" ");
752 if (hlp.size() < 5) continue;
753 _mountPointsTable->insertRow(iRow);
754
755 QUrl url(hlp[0]);
756
757 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
758 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
759 QString nmea(hlp[4]);
760 if (hlp[5] == "S") {
761 fullPath = hlp[0].replace(0,2,"");
762 }
763 QString ntripVersion = "1";
764 if (hlp.size() >= 6) {
765 ntripVersion = (hlp[5]);
766 }
767
768 QTableWidgetItem* it;
769 it = new QTableWidgetItem(url.userInfo());
770 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
771 _mountPointsTable->setItem(iRow, 0, it);
772
773 it = new QTableWidgetItem(fullPath);
774 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
775 _mountPointsTable->setItem(iRow, 1, it);
776
777 it = new QTableWidgetItem(format);
778 _mountPointsTable->setItem(iRow, 2, it);
779
780 if (nmea == "yes") {
781 it = new QTableWidgetItem(latitude);
782 _mountPointsTable->setItem(iRow, 3, it);
783 it = new QTableWidgetItem(longitude);
784 _mountPointsTable->setItem(iRow, 4, it);
785 } else {
786 it = new QTableWidgetItem(latitude);
787 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
788 _mountPointsTable->setItem(iRow, 3, it);
789 it = new QTableWidgetItem(longitude);
790 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
791 _mountPointsTable->setItem(iRow, 4, it);
792 }
793
794 it = new QTableWidgetItem(nmea);
795 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
796 _mountPointsTable->setItem(iRow, 5, it);
797
798 it = new QTableWidgetItem(ntripVersion);
799 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
800 _mountPointsTable->setItem(iRow, 6, it);
801
802 bncTableItem* bncIt = new bncTableItem();
803 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
804 _mountPointsTable->setItem(iRow, 7, bncIt);
805
806 iRow++;
807 }
808
809 _mountPointsTable->sortItems(1);
810}
811
812// Retrieve Table
813////////////////////////////////////////////////////////////////////////////
814void bncWindow::slotAddMountPoints() {
815
816 bncSettings settings;
817 QString proxyHost = settings.value("proxyHost").toString();
818 int proxyPort = settings.value("proxyPort").toInt();
819 if (proxyHost != _proxyHostLineEdit->text() ||
820 proxyPort != _proxyPortLineEdit->text().toInt()) {
821 int iRet = QMessageBox::question(this, "Question", "Proxy options "
822 "changed. Use the new ones?",
823 QMessageBox::Yes, QMessageBox::No,
824 QMessageBox::NoButton);
825 if (iRet == QMessageBox::Yes) {
826 settings.setValue("proxyHost", _proxyHostLineEdit->text());
827 settings.setValue("proxyPort", _proxyPortLineEdit->text());
828 settings.sync();
829 }
830 }
831
832 QMessageBox msgBox;
833 msgBox.setIcon(QMessageBox::Question);
834 msgBox.setWindowTitle("Add Stream");
835 msgBox.setText("Add stream(s) coming from:");
836
837 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
838 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
839 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
840 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
841 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
842
843 msgBox.exec();
844
845 if (msgBox.clickedButton() == buttonNtrip) {
846 bncTableDlg* dlg = new bncTableDlg(this);
847 dlg->move(this->pos().x()+50, this->pos().y()+50);
848 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
849 this, SLOT(slotNewMountPoints(QStringList*)));
850 dlg->exec();
851 delete dlg;
852 } else if (msgBox.clickedButton() == buttonIP) {
853 bncIpPort* ipp = new bncIpPort(this);
854 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
855 this, SLOT(slotNewMountPoints(QStringList*)));
856 ipp->exec();
857 delete ipp;
858 } else if (msgBox.clickedButton() == buttonUDP) {
859 bncUdpPort* udp = new bncUdpPort(this);
860 connect(udp, SIGNAL(newMountPoints(QStringList*)),
861 this, SLOT(slotNewMountPoints(QStringList*)));
862 udp->exec();
863 delete udp;
864 } else if (msgBox.clickedButton() == buttonSerial) {
865 bncSerialPort* sep = new bncSerialPort(this);
866 connect(sep, SIGNAL(newMountPoints(QStringList*)),
867 this, SLOT(slotNewMountPoints(QStringList*)));
868 sep->exec();
869 delete sep;
870 } else if (msgBox.clickedButton() == buttonCancel) {
871 // Cancel
872 }
873}
874
875// Delete Selected Mount Points
876////////////////////////////////////////////////////////////////////////////
877void bncWindow::slotDeleteMountPoints() {
878
879 int nRows = _mountPointsTable->rowCount();
880 bool flg[nRows];
881 for (int iRow = 0; iRow < nRows; iRow++) {
882 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
883 flg[iRow] = true;
884 }
885 else {
886 flg[iRow] = false;
887 }
888 }
889 for (int iRow = nRows-1; iRow >= 0; iRow--) {
890 if (flg[iRow]) {
891 _mountPointsTable->removeRow(iRow);
892 }
893 }
894 _actDeleteMountPoints->setEnabled(false);
895
896 if (_mountPointsTable->rowCount() == 0) {
897 _actGetData->setEnabled(false);
898 }
899}
900
901// New Mount Points Selected
902////////////////////////////////////////////////////////////////////////////
903void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
904 int iRow = 0;
905 QListIterator<QString> it(*mountPoints);
906 while (it.hasNext()) {
907 QStringList hlp = it.next().split(" ");
908 QUrl url(hlp[0]);
909 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
910 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
911 QString nmea(hlp[4]);
912 if (hlp[5] == "S") {
913 fullPath = hlp[0].replace(0,2,"");
914 }
915 QString ntripVersion = "1";
916 if (hlp.size() >= 6) {
917 ntripVersion = (hlp[5]);
918 }
919
920 _mountPointsTable->insertRow(iRow);
921
922 QTableWidgetItem* it;
923 it = new QTableWidgetItem(url.userInfo());
924 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
925 _mountPointsTable->setItem(iRow, 0, it);
926
927 it = new QTableWidgetItem(fullPath);
928 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
929 _mountPointsTable->setItem(iRow, 1, it);
930
931 it = new QTableWidgetItem(format);
932 _mountPointsTable->setItem(iRow, 2, it);
933
934 if (nmea == "yes") {
935 it = new QTableWidgetItem(latitude);
936 _mountPointsTable->setItem(iRow, 3, it);
937 it = new QTableWidgetItem(longitude);
938 _mountPointsTable->setItem(iRow, 4, it);
939 } else {
940 it = new QTableWidgetItem(latitude);
941 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
942 _mountPointsTable->setItem(iRow, 3, it);
943 it = new QTableWidgetItem(longitude);
944 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
945 _mountPointsTable->setItem(iRow, 4, it);
946 }
947
948 it = new QTableWidgetItem(nmea);
949 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
950 _mountPointsTable->setItem(iRow, 5, it);
951
952 it = new QTableWidgetItem(ntripVersion);
953 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
954 _mountPointsTable->setItem(iRow, 6, it);
955
956 bncTableItem* bncIt = new bncTableItem();
957 _mountPointsTable->setItem(iRow, 7, bncIt);
958
959 iRow++;
960 }
961 _mountPointsTable->hideColumn(0);
962 _mountPointsTable->sortItems(1);
963 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
964 _actGetData->setEnabled(true);
965 }
966 delete mountPoints;
967}
968
969// Save Options
970////////////////////////////////////////////////////////////////////////////
971void bncWindow::slotSaveOptions() {
972
973 QStringList mountPoints;
974 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
975
976 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
977 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
978 "@" + _mountPointsTable->item(iRow, 1)->text() );
979
980 mountPoints.append(url.toString() + " " +
981 _mountPointsTable->item(iRow, 2)->text()
982 + " " + _mountPointsTable->item(iRow, 3)->text()
983 + " " + _mountPointsTable->item(iRow, 4)->text()
984 + " " + _mountPointsTable->item(iRow, 5)->text()
985 + " " + _mountPointsTable->item(iRow, 6)->text());
986 } else {
987 mountPoints.append(
988 "//" + _mountPointsTable->item(iRow, 1)->text()
989 + " " + _mountPointsTable->item(iRow, 2)->text()
990 + " " + _mountPointsTable->item(iRow, 3)->text()
991 + " " + _mountPointsTable->item(iRow, 4)->text()
992 + " " + _mountPointsTable->item(iRow, 5)->text()
993 + " " + _mountPointsTable->item(iRow, 6)->text());
994 }
995 }
996
997 bncSettings settings;
998
999 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1000 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1001 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1002 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1003 settings.setValue("binSampl", _binSamplSpinBox->value());
1004 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1005 settings.setValue("corrPath", _corrPathLineEdit->text());
1006 settings.setValue("corrPort", _corrPortLineEdit->text());
1007 settings.setValue("corrTime", _corrTimeSpinBox->value());
1008 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1009 settings.setValue("ephPath", _ephPathLineEdit->text());
1010 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1011 settings.setValue("logFile", _logFileLineEdit->text());
1012 settings.setValue("miscMount", _miscMountLineEdit->text());
1013 settings.setValue("pppMount", _pppMountLineEdit->text());
1014 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1015 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1016 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1017 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1018 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1019 settings.setValue("pppStatic", _pppStaticCheckBox->checkState());
1020 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1021 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1022 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1023 settings.setValue("mountPoints", mountPoints);
1024 settings.setValue("obsRate", _obsRateComboBox->currentText());
1025 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1026 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1027 settings.setValue("outFile", _outFileLineEdit->text());
1028 settings.setValue("outPort", _outPortLineEdit->text());
1029 settings.setValue("outUPort", _outUPortLineEdit->text());
1030 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1031 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1032 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1033 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1034 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1035 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1036 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1037 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1038 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1039 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1040 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1041 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1042 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1043 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1044 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1045 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1046 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1047 settings.setValue("serialParity", _serialParityComboBox->currentText());
1048 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1049 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1050 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1051 settings.setValue("startTab", _aogroup->currentIndex());
1052 settings.setValue("statusTab", _loggroup->currentIndex());
1053 settings.setValue("waitTime", _waitTimeSpinBox->value());
1054
1055 if (_caster) {
1056 _caster->slotReadMountPoints();
1057 }
1058 settings.sync();
1059}
1060
1061// All get slots terminated
1062////////////////////////////////////////////////////////////////////////////
1063void bncWindow::slotGetThreadsFinished() {
1064 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1065 delete _caster; _caster = 0;
1066 _actGetData->setEnabled(true);
1067 _actStop->setEnabled(false);
1068}
1069
1070// Retrieve Data
1071////////////////////////////////////////////////////////////////////////////
1072void bncWindow::slotGetData() {
1073 slotSaveOptions();
1074
1075 _bncFigurePPP->reset();
1076
1077 _actDeleteMountPoints->setEnabled(false);
1078 _actGetData->setEnabled(false);
1079 _actStop->setEnabled(true);
1080
1081 _caster = new bncCaster(_outFileLineEdit->text(),
1082 _outPortLineEdit->text().toInt());
1083
1084 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1085 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1086
1087 connect(_caster, SIGNAL(getThreadsFinished()),
1088 this, SLOT(slotGetThreadsFinished()));
1089
1090 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1091 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1092
1093 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1094
1095 bncSettings settings;
1096
1097 QDir rnxdir(settings.value("rnxPath").toString());
1098 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1099
1100 QString rnx_file = settings.value("rnxScript").toString();
1101 if ( !rnx_file.isEmpty() ) {
1102 QFile rnxfile(settings.value("rnxScript").toString());
1103 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1104 }
1105
1106 QDir ephdir(settings.value("ephPath").toString());
1107 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1108
1109 QDir corrdir(settings.value("corrPath").toString());
1110 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1111
1112 QString advise_file = settings.value("adviseScript").toString();
1113 if ( !advise_file.isEmpty() ) {
1114 QFile advisefile(settings.value("adviseScript").toString());
1115 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1116 }
1117
1118 _caster->slotReadMountPoints();
1119}
1120
1121// Retrieve Data
1122////////////////////////////////////////////////////////////////////////////
1123void bncWindow::slotStop() {
1124 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1125 QMessageBox::Yes, QMessageBox::No,
1126 QMessageBox::NoButton);
1127 if (iRet == QMessageBox::Yes) {
1128 delete _caster; _caster = 0;
1129 _actGetData->setEnabled(true);
1130 _actStop->setEnabled(false);
1131 }
1132}
1133
1134// Close Application gracefully
1135////////////////////////////////////////////////////////////////////////////
1136void bncWindow::closeEvent(QCloseEvent* event) {
1137
1138 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1139 QMessageBox::Yes, QMessageBox::No,
1140 QMessageBox::Cancel);
1141
1142 if (iRet == QMessageBox::Cancel) {
1143 event->ignore();
1144 return;
1145 }
1146 else if (iRet == QMessageBox::Yes) {
1147 slotSaveOptions();
1148 }
1149
1150 QMainWindow::closeEvent(event);
1151}
1152
1153// User changed the selection of mountPoints
1154////////////////////////////////////////////////////////////////////////////
1155void bncWindow::slotSelectionChanged() {
1156 if (_mountPointsTable->selectedItems().isEmpty()) {
1157 _actDeleteMountPoints->setEnabled(false);
1158 }
1159 else {
1160 _actDeleteMountPoints->setEnabled(true);
1161 }
1162}
1163
1164// Display Program Messages
1165////////////////////////////////////////////////////////////////////////////
1166void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1167
1168#ifdef DEBUG_RTCM2_2021
1169 const int maxBufferSize = 1000;
1170#else
1171 const int maxBufferSize = 10000;
1172#endif
1173
1174 if (! showOnScreen ) {
1175 return;
1176 }
1177
1178 QString txt = _log->toPlainText() + "\n" +
1179 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1180 _log->clear();
1181 _log->append(txt.right(maxBufferSize));
1182}
1183
1184// About Message
1185////////////////////////////////////////////////////////////////////////////
1186void bncWindow::slotAbout() {
1187 new bncAboutDlg(0);
1188}
1189
1190//Flowchart
1191////////////////////////////////////////////////////////////////////////////
1192void bncWindow::slotFlowchart() {
1193 new bncFlowchartDlg(0);
1194}
1195
1196// Help Window
1197////////////////////////////////////////////////////////////////////////////
1198void bncWindow::slotHelp() {
1199 QUrl url;
1200 url.setPath(":bnchelp.html");
1201 new bncHlpDlg(0, url);
1202}
1203
1204// Select Fonts
1205////////////////////////////////////////////////////////////////////////////
1206void bncWindow::slotFontSel() {
1207 bool ok;
1208 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1209 if (ok) {
1210 bncSettings settings;
1211 settings.setValue("font", newFont.toString());
1212 QApplication::setFont(newFont);
1213 int ww = QFontMetrics(newFont).width('w');
1214 setMinimumSize(60*ww, 80*ww);
1215 resize(60*ww, 80*ww);
1216 }
1217}
1218
1219// Whats This Help
1220void bncWindow::slotWhatsThis() {
1221 QWhatsThis::enterWhatsThisMode();
1222}
1223
1224//
1225////////////////////////////////////////////////////////////////////////////
1226void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1227 _bncFigure->updateMountPoints();
1228 _bncFigureLate->updateMountPoints();
1229
1230 populateMountPointsTable();
1231 bncSettings settings;
1232 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1233 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1234 QListIterator<bncGetThread*> iTh(threads);
1235 while (iTh.hasNext()) {
1236 bncGetThread* thread = iTh.next();
1237 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1238 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1239 "@" + _mountPointsTable->item(iRow, 1)->text() );
1240 if (url == thread->mountPoint() &&
1241 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1242 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1243 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1244 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1245 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1246 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1247 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1248 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1249 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1250 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1251 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1252 disconnect(thread,
1253 SIGNAL(newPosition(bncTime, double, double, double)),
1254 _bncFigurePPP,
1255 SLOT(slotNewPosition(bncTime, double, double, double)));
1256 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1257 _bncFigurePPP,
1258 SLOT(slotNewPosition(bncTime, double, double, double)));
1259 break;
1260 }
1261 }
1262 }
1263}
1264
1265//
1266////////////////////////////////////////////////////////////////////////////
1267void bncWindow::CreateMenu() {
1268 // Create Menus
1269 // ------------
1270 _menuFile = menuBar()->addMenu(tr("&File"));
1271 _menuFile->addAction(_actFontSel);
1272 _menuFile->addSeparator();
1273 _menuFile->addAction(_actSaveOpt);
1274 _menuFile->addSeparator();
1275 _menuFile->addAction(_actQuit);
1276
1277 _menuHlp = menuBar()->addMenu(tr("&Help"));
1278 _menuHlp->addAction(_actHelp);
1279 _menuHlp->addAction(_actFlowchart);
1280 _menuHlp->addAction(_actAbout);
1281}
1282
1283// Toolbar
1284////////////////////////////////////////////////////////////////////////////
1285void bncWindow::AddToolbar() {
1286 // Tool (Command) Bar
1287 // ------------------
1288 QToolBar* toolBar = new QToolBar;
1289 addToolBar(Qt::BottomToolBarArea, toolBar);
1290 toolBar->setMovable(false);
1291 toolBar->addAction(_actAddMountPoints);
1292 toolBar->addAction(_actDeleteMountPoints);
1293 toolBar->addAction(_actGetData);
1294 toolBar->addAction(_actStop);
1295 toolBar->addWidget(new QLabel(" "));
1296 toolBar->addAction(_actwhatsthis);
1297}
1298
1299// About
1300////////////////////////////////////////////////////////////////////////////
1301bncAboutDlg::bncAboutDlg(QWidget* parent) :
1302 QDialog(parent) {
1303
1304 QTextBrowser* tb = new QTextBrowser;
1305 QUrl url; url.setPath(":bncabout.html");
1306 tb->setSource(url);
1307 tb->setReadOnly(true);
1308
1309 int ww = QFontMetrics(font()).width('w');
1310 QPushButton* _closeButton = new QPushButton("Close");
1311 _closeButton->setMaximumWidth(10*ww);
1312 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1313
1314 QGridLayout* dlgLayout = new QGridLayout();
1315 QLabel* img = new QLabel();
1316 img->setPixmap(QPixmap(":ntrip-logo.png"));
1317 dlgLayout->addWidget(img, 0,0);
1318 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1319 dlgLayout->addWidget(tb,1,0,1,2);
1320 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1321
1322 setLayout(dlgLayout);
1323 resize(60*ww, 60*ww);
1324 setWindowTitle("About BNC");
1325 show();
1326}
1327
1328//
1329////////////////////////////////////////////////////////////////////////////
1330bncAboutDlg::~bncAboutDlg() {
1331};
1332
1333// Flowchart
1334////////////////////////////////////////////////////////////////////////////
1335bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1336 QDialog(parent) {
1337
1338 int ww = QFontMetrics(font()).width('w');
1339 QPushButton* _closeButton = new QPushButton("Close");
1340 _closeButton->setMaximumWidth(10*ww);
1341 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1342
1343 QGridLayout* dlgLayout = new QGridLayout();
1344 QLabel* img = new QLabel();
1345 img->setPixmap(QPixmap(":bncflowchart.png"));
1346 dlgLayout->addWidget(img, 0,0);
1347 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1348
1349 setLayout(dlgLayout);
1350 setWindowTitle("Flow Chart");
1351 show();
1352}
1353
1354//
1355////////////////////////////////////////////////////////////////////////////
1356bncFlowchartDlg::~bncFlowchartDlg() {
1357};
1358
1359// Bnc Text
1360////////////////////////////////////////////////////////////////////////////
1361void bncWindow::slotBncTextChanged(){
1362
1363 QPalette palette_white(QColor(255, 255, 255));
1364 QPalette palette_gray(QColor(230, 230, 230));
1365
1366 // Proxy
1367 //------
1368 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1369 if (!_proxyHostLineEdit->text().isEmpty()) {
1370 _proxyPortLineEdit->setStyleSheet("background-color: white");
1371 _proxyPortLineEdit->setEnabled(true);
1372 }
1373 else {
1374 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1375 _proxyPortLineEdit->setEnabled(false);
1376 }
1377 }
1378
1379 // RINEX Observations
1380 // ------------------
1381 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1382 if (!_rnxPathLineEdit->text().isEmpty()) {
1383 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1384 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1385 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1386 _rnxV3CheckBox->setPalette(palette_white);
1387 _rnxIntrComboBox->setStyleSheet("background-color: white");
1388 _rnxSamplSpinBox->setEnabled(true);
1389 _rnxSkelLineEdit->setEnabled(true);
1390 _rnxScrpLineEdit->setEnabled(true);
1391 _rnxV3CheckBox->setEnabled(true);
1392 _rnxIntrComboBox->setEnabled(true);
1393 }
1394 else {
1395 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1396 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1397 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1398 _rnxV3CheckBox->setPalette(palette_gray);
1399 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1400 _rnxSamplSpinBox->setEnabled(false);
1401 _rnxSkelLineEdit->setEnabled(false);
1402 _rnxScrpLineEdit->setEnabled(false);
1403 _rnxV3CheckBox->setEnabled(false);
1404 _rnxIntrComboBox->setEnabled(false);
1405 }
1406 }
1407
1408 // RINEX Ephemeris
1409 // ---------------
1410 if (sender() == 0 ||
1411 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1412 if (!_ephPathLineEdit->text().isEmpty() ||
1413 !_outEphPortLineEdit->text().isEmpty()) {
1414 _ephIntrComboBox->setStyleSheet("background-color: white");
1415 _ephV3CheckBox->setPalette(palette_white);
1416 _ephIntrComboBox->setEnabled(true);
1417 _ephV3CheckBox->setEnabled(true);
1418 }
1419 else {
1420 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1421 _ephV3CheckBox->setPalette(palette_gray);
1422 _ephIntrComboBox->setEnabled(false);
1423 _ephV3CheckBox->setEnabled(false);
1424 }
1425 }
1426
1427 // Broadcast Corrections
1428 // ---------------------
1429 if (sender() == 0 ||
1430 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1431 if (!_corrPathLineEdit->text().isEmpty() ||
1432 !_corrPortLineEdit->text().isEmpty()) {
1433 _corrIntrComboBox->setStyleSheet("background-color: white");
1434 _corrIntrComboBox->setEnabled(true);
1435 }
1436 else {
1437 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1438 _corrIntrComboBox->setEnabled(false);
1439 }
1440 }
1441
1442 // Feed Engine
1443 // -----------
1444 if (sender() == 0 ||
1445 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1446 if ( !_outPortLineEdit->text().isEmpty() ||
1447 !_outFileLineEdit->text().isEmpty()) {
1448 _waitTimeSpinBox->setStyleSheet("background-color: white");
1449 _binSamplSpinBox->setStyleSheet("background-color: white");
1450 _waitTimeSpinBox->setEnabled(true);
1451 _binSamplSpinBox->setEnabled(true);
1452 }
1453 else {
1454 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1455 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1456 _waitTimeSpinBox->setEnabled(false);
1457 _binSamplSpinBox->setEnabled(false);
1458 }
1459 }
1460
1461 // Serial Output
1462 // -------------
1463 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1464 sender() == _serialAutoNMEAComboBox) {
1465 if (!_serialMountPointLineEdit->text().isEmpty()) {
1466 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1467 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1468 _serialParityComboBox->setStyleSheet("background-color: white");
1469 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1470 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1471 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1472 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1473 _serialPortNameLineEdit->setEnabled(true);
1474 _serialBaudRateComboBox->setEnabled(true);
1475 _serialParityComboBox->setEnabled(true);
1476 _serialDataBitsComboBox->setEnabled(true);
1477 _serialStopBitsComboBox->setEnabled(true);
1478 _serialFlowControlComboBox->setEnabled(true);
1479 _serialAutoNMEAComboBox->setEnabled(true);
1480 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1481 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1482 _serialHeightNMEALineEdit->setEnabled(true);
1483 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1484 _serialFileNMEALineEdit->setEnabled(false);
1485 }
1486 else {
1487 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1488 _serialHeightNMEALineEdit->setEnabled(false);
1489 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1490 _serialFileNMEALineEdit->setEnabled(true);
1491 }
1492 }
1493 else {
1494 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1495 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1496 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1497 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1498 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1499 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1500 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1501 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1502 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1503 _serialPortNameLineEdit->setEnabled(false);
1504 _serialBaudRateComboBox->setEnabled(false);
1505 _serialParityComboBox->setEnabled(false);
1506 _serialDataBitsComboBox->setEnabled(false);
1507 _serialStopBitsComboBox->setEnabled(false);
1508 _serialFlowControlComboBox->setEnabled(false);
1509 _serialAutoNMEAComboBox->setEnabled(false);
1510 _serialHeightNMEALineEdit->setEnabled(false);
1511 _serialFileNMEALineEdit->setEnabled(false);
1512 }
1513 }
1514
1515 // Outages
1516 // -------
1517 if (sender() == 0 || sender() == _obsRateComboBox) {
1518 if (!_obsRateComboBox->currentText().isEmpty()) {
1519 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1520 _adviseFailSpinBox->setStyleSheet("background-color: white");
1521 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1522 _adviseFailSpinBox->setEnabled(true);
1523 _adviseRecoSpinBox->setEnabled(true);
1524 _adviseScriptLineEdit->setEnabled(true);
1525 } else {
1526 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1527 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1528 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1529 _adviseFailSpinBox->setEnabled(false);
1530 _adviseRecoSpinBox->setEnabled(false);
1531 _adviseScriptLineEdit->setEnabled(false);
1532 }
1533 }
1534
1535 // Miscellaneous
1536 // -------------
1537 if (sender() == 0 || sender() == _miscMountLineEdit) {
1538 if (!_miscMountLineEdit->text().isEmpty()) {
1539 _perfIntrComboBox->setStyleSheet("background-color: white");
1540 _scanRTCMCheckBox->setPalette(palette_white);
1541 _perfIntrComboBox->setEnabled(true);
1542 _scanRTCMCheckBox->setEnabled(true);
1543 } else {
1544 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1545 _scanRTCMCheckBox->setPalette(palette_gray);
1546 _perfIntrComboBox->setEnabled(false);
1547 _scanRTCMCheckBox->setEnabled(false);
1548 }
1549 }
1550
1551 // PPP Client
1552 // ----------
1553 if (sender() == 0 || sender() == _pppMountLineEdit) {
1554 if (!_pppMountLineEdit->text().isEmpty()) {
1555 _pppNMEALineEdit->setPalette(palette_white);
1556 _pppNMEAPortLineEdit->setPalette(palette_white);
1557 _pppRefCrdXLineEdit->setPalette(palette_white);
1558 _pppRefCrdYLineEdit->setPalette(palette_white);
1559 _pppRefCrdZLineEdit->setPalette(palette_white);
1560 _pppStaticCheckBox->setPalette(palette_white);
1561 _pppUsePhaseCheckBox->setPalette(palette_white);
1562 _pppEstTropoCheckBox->setPalette(palette_white);
1563 _pppGLONASSCheckBox->setPalette(palette_white);
1564 _pppNMEALineEdit->setEnabled(true);
1565 _pppNMEAPortLineEdit->setEnabled(true);
1566 _pppRefCrdXLineEdit->setEnabled(true);
1567 _pppRefCrdYLineEdit->setEnabled(true);
1568 _pppRefCrdZLineEdit->setEnabled(true);
1569 _pppStaticCheckBox->setEnabled(true);
1570 _pppUsePhaseCheckBox->setEnabled(true);
1571 _pppEstTropoCheckBox->setEnabled(true);
1572 _pppGLONASSCheckBox->setEnabled(true);
1573 } else {
1574 _pppNMEALineEdit->setPalette(palette_gray);
1575 _pppNMEAPortLineEdit->setPalette(palette_gray);
1576 _pppRefCrdXLineEdit->setPalette(palette_gray);
1577 _pppRefCrdYLineEdit->setPalette(palette_gray);
1578 _pppRefCrdZLineEdit->setPalette(palette_gray);
1579 _pppStaticCheckBox->setPalette(palette_gray);
1580 _pppUsePhaseCheckBox->setPalette(palette_gray);
1581 _pppEstTropoCheckBox->setPalette(palette_gray);
1582 _pppGLONASSCheckBox->setPalette(palette_gray);
1583 _pppNMEALineEdit->setEnabled(false);
1584 _pppNMEAPortLineEdit->setEnabled(false);
1585 _pppRefCrdXLineEdit->setEnabled(false);
1586 _pppRefCrdYLineEdit->setEnabled(false);
1587 _pppRefCrdZLineEdit->setEnabled(false);
1588 _pppStaticCheckBox->setEnabled(false);
1589 _pppUsePhaseCheckBox->setEnabled(false);
1590 _pppEstTropoCheckBox->setEnabled(false);
1591 _pppGLONASSCheckBox->setEnabled(false);
1592 }
1593 }
1594}
Note: See TracBrowser for help on using the repository browser.