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

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

* empty log message *

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