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

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

* empty log message *

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