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

Last change on this file since 1595 was 1595, checked in by weber, 15 years ago

* empty log message *

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