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

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

* empty log message *

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