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

Last change on this file since 2128 was 2128, checked in by mervart, 14 years ago

* empty log message *

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