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

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

* empty log message *

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