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

Last change on this file since 2391 was 2391, checked in by weber, 14 years ago

* empty log message *

File size: 82.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#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59
60using namespace std;
61
62// Constructor
63////////////////////////////////////////////////////////////////////////////
64bncWindow::bncWindow() {
65
66 _caster = 0;
67
68 _bncFigure = new bncFigure(this);
69 _bncFigureLate = new bncFigureLate(this);
70 _bncFigurePPP = new bncFigurePPP(this);
71
72 int ww = QFontMetrics(this->font()).width('w');
73
74 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
75
76 setMinimumSize(85*ww, 65*ww);
77
78 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
79
80 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
81 this, SLOT(slotWindowMessage(QByteArray,bool)));
82
83 // Create Actions
84 // --------------
85 _actHelp = new QAction(tr("&Help Contents"),this);
86 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
87
88 _actAbout = new QAction(tr("&About BNC"),this);
89 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
90
91 _actFlowchart = new QAction(tr("&Flow Chart"),this);
92 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
93
94 _actFontSel = new QAction(tr("Select &Font"),this);
95 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
96
97 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
98 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
99
100 _actQuit = new QAction(tr("&Quit"),this);
101 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
102
103 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
104 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
105
106 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
107 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
108 _actDeleteMountPoints->setEnabled(false);
109
110 _actGetData = new QAction(tr("Sta&rt"),this);
111 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
112
113 _actStop = new QAction(tr("Sto&p"),this);
114 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
115 _actStop->setEnabled(false);
116
117 _actwhatsthis= new QAction(tr("Help=Shift+F1"),this);
118 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
119
120 CreateMenu();
121 AddToolbar();
122
123 bncSettings settings;
124
125 // Proxy Options
126 // -------------
127 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
128 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
129
130 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
131 this, SLOT(slotBncTextChanged()));
132
133 // General Options
134 // ---------------
135 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
136 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
137 _rnxAppendCheckBox = new QCheckBox();
138 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
139 settings.value("rnxAppend").toInt()));
140 _onTheFlyComboBox = new QComboBox();
141 _onTheFlyComboBox->setEditable(false);
142 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
143 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
144 if (ii != -1) {
145 _onTheFlyComboBox->setCurrentIndex(ii);
146 }
147 _autoStartCheckBox = new QCheckBox();
148 _autoStartCheckBox->setCheckState(Qt::CheckState(
149 settings.value("autoStart").toInt()));
150
151 // RINEX Observations Options
152 // --------------------------
153 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
154 _rnxIntrComboBox = new QComboBox();
155 _rnxIntrComboBox->setEditable(false);
156 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
157 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
158 if (ii != -1) {
159 _rnxIntrComboBox->setCurrentIndex(ii);
160 }
161 _rnxSamplSpinBox = new QSpinBox();
162 _rnxSamplSpinBox->setMinimum(0);
163 _rnxSamplSpinBox->setMaximum(60);
164 _rnxSamplSpinBox->setSingleStep(5);
165 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
166 _rnxSamplSpinBox->setSuffix(" sec");
167 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
168 _rnxSkelLineEdit->setMaximumWidth(5*ww);
169 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
170 _rnxV3CheckBox = new QCheckBox();
171 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
172
173 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
174 this, SLOT(slotBncTextChanged()));
175
176 // RINEX Ephemeris Options
177 // -----------------------
178 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
179 _ephIntrComboBox = new QComboBox();
180 _ephIntrComboBox->setEditable(false);
181 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
182 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
183 if (jj != -1) {
184 _ephIntrComboBox->setCurrentIndex(jj);
185 }
186 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
187 _ephV3CheckBox = new QCheckBox();
188 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
189
190 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
191 this, SLOT(slotBncTextChanged()));
192
193 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
194 this, SLOT(slotBncTextChanged()));
195
196 // Broadcast Corrections Options
197 // -----------------------------
198 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
199 _corrIntrComboBox = new QComboBox();
200 _corrIntrComboBox->setEditable(false);
201 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
202 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
203 if (mm != -1) {
204 _corrIntrComboBox->setCurrentIndex(mm);
205 }
206 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
207 _corrTimeSpinBox = new QSpinBox();
208 _corrTimeSpinBox->setMinimum(1);
209 _corrTimeSpinBox->setMaximum(30);
210 _corrTimeSpinBox->setSingleStep(1);
211 _corrTimeSpinBox->setSuffix(" sec");
212 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
213
214 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
215 this, SLOT(slotBncTextChanged()));
216
217 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
218 this, SLOT(slotBncTextChanged()));
219
220 // Feed Engine Options
221 // -------------------
222 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
223 _waitTimeSpinBox = new QSpinBox();
224 _waitTimeSpinBox->setMinimum(1);
225 _waitTimeSpinBox->setMaximum(30);
226 _waitTimeSpinBox->setSingleStep(1);
227 _waitTimeSpinBox->setSuffix(" sec");
228 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
229 _binSamplSpinBox = new QSpinBox();
230 _binSamplSpinBox->setMinimum(0);
231 _binSamplSpinBox->setMaximum(60);
232 _binSamplSpinBox->setSingleStep(5);
233 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
234 _binSamplSpinBox->setSuffix(" sec");
235 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
236 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
237
238 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
239 this, SLOT(slotBncTextChanged()));
240
241 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
242 this, SLOT(slotBncTextChanged()));
243
244 // Serial Output Options
245 // ---------------------
246 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
247 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
248 _serialBaudRateComboBox = new QComboBox();
249 _serialBaudRateComboBox->addItems(QString("110,300,600,"
250 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
251 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
252 if (kk != -1) {
253 _serialBaudRateComboBox->setCurrentIndex(kk);
254 }
255 _serialFlowControlComboBox = new QComboBox();
256 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
257 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
258 if (kk != -1) {
259 _serialFlowControlComboBox->setCurrentIndex(kk);
260 }
261 _serialDataBitsComboBox = new QComboBox();
262 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
263 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
264 if (kk != -1) {
265 _serialDataBitsComboBox->setCurrentIndex(kk);
266 }
267 _serialParityComboBox = new QComboBox();
268 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
269 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
270 if (kk != -1) {
271 _serialParityComboBox->setCurrentIndex(kk);
272 }
273 _serialStopBitsComboBox = new QComboBox();
274 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
275 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
276 if (kk != -1) {
277 _serialStopBitsComboBox->setCurrentIndex(kk);
278 }
279 _serialAutoNMEAComboBox = new QComboBox();
280 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
281 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
282 if (kk != -1) {
283 _serialAutoNMEAComboBox->setCurrentIndex(kk);
284 }
285 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
286 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
287
288 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
289 this, SLOT(slotBncTextChanged()));
290
291 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
292 this, SLOT(slotBncTextChanged()));
293
294 // Outages Options
295 // ---------------
296 _obsRateComboBox = new QComboBox();
297 _obsRateComboBox->setEditable(false);
298 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
299 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
300 if (kk != -1) {
301 _obsRateComboBox->setCurrentIndex(kk);
302 }
303 _adviseFailSpinBox = new QSpinBox();
304 _adviseFailSpinBox->setMinimum(0);
305 _adviseFailSpinBox->setMaximum(60);
306 _adviseFailSpinBox->setSingleStep(1);
307 _adviseFailSpinBox->setSuffix(" min");
308 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
309 _adviseRecoSpinBox = new QSpinBox();
310 _adviseRecoSpinBox->setMinimum(0);
311 _adviseRecoSpinBox->setMaximum(60);
312 _adviseRecoSpinBox->setSingleStep(1);
313 _adviseRecoSpinBox->setSuffix(" min");
314 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
315 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
316
317 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
318 this, SLOT(slotBncTextChanged()));
319
320 // Miscellaneous Options
321 // ---------------------
322 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
323 _perfIntrComboBox = new QComboBox();
324 _perfIntrComboBox->setEditable(false);
325 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
326 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
327 if (ll != -1) {
328 _perfIntrComboBox->setCurrentIndex(ll);
329 }
330 _scanRTCMCheckBox = new QCheckBox();
331 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
332 settings.value("scanRTCM").toInt()));
333
334 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
335 this, SLOT(slotBncTextChanged()));
336
337 // PPP Options
338 // -----------
339 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
340 _pppUsePhaseCheckBox = new QCheckBox();
341 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
342 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
343 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
344 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
345 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
346 _pppOriginComboBox = new QComboBox();
347 _pppOriginComboBox->setEditable(false);
348 _pppOriginComboBox->addItems(QString("No plot,Start position,X Y Z").split(","));
349 int ij = _pppOriginComboBox->findText(settings.value("pppOrigin").toString());
350 if (ij != -1) {
351 _pppOriginComboBox->setCurrentIndex(ij);
352 }
353 _pppSPPComboBox = new QComboBox();
354 _pppSPPComboBox->setEditable(false);
355 _pppSPPComboBox->addItems(QString("PPP,SPP").split(","));
356 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
357 if (ik != -1) {
358 _pppSPPComboBox->setCurrentIndex(ik);
359 }
360 _pppStaticCheckBox = new QCheckBox();
361 _pppStaticCheckBox->setCheckState(Qt::CheckState(
362 settings.value("pppStatic").toInt()));
363 _pppUsePhaseCheckBox = new QCheckBox();
364 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
365 settings.value("pppUsePhase").toInt()));
366 _pppEstTropoCheckBox = new QCheckBox();
367 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
368 settings.value("pppEstTropo").toInt()));
369 _pppGLONASSCheckBox = new QCheckBox();
370 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
371 settings.value("pppGLONASS").toInt()));
372
373 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
374 this, SLOT(slotBncTextChanged()));
375
376 connect(_pppOriginComboBox, SIGNAL(currentIndexChanged(const QString &)),
377 this, SLOT(slotBncTextChanged()));
378
379 // Streams
380 // -------
381 _mountPointsTable = new QTableWidget(0,8);
382
383 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
384 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
385 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
386 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
387 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
388 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
389 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
390 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
391 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
392 _mountPointsTable->setHorizontalHeaderLabels(labels);
393 _mountPointsTable->setGridStyle(Qt::NoPen);
394 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
395 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
396 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
397 _mountPointsTable->hideColumn(0);
398 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
399 SLOT(slotSelectionChanged()));
400 populateMountPointsTable();
401
402 _log = new QTextBrowser();
403 _log->setReadOnly(true);
404
405 // WhatsThis
406 // ---------
407 _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>"));
408 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
409 _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>"));
410 _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."));
411 _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."));
412 _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."));
413 _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."));
414 _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."));
415 _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."));
416 _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."));
417 _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."));
418 _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."));
419 _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>"));
420 _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>"));
421 _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>"));
422 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
423 _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>"));
424 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
425 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
426 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
427 _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>"));
428 _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>"));
429 _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>"));
430 _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>"));
431 _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>"));
432 _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."));
433 _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>"));
434 _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>"));
435 _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>"));
436 _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."));
437 _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)."));
438 _bncFigureLate->setWhatsThis(tr("The individual latency of observations in each incoming stream is shown in the 'Latency' tab. Streams not carrying observations (i.e. those providing only broadcast ephemeris messages) are not considered here. Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized."));
439 _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."));
440 _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."));
441 _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>"));
442 _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>"));
443 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
444 _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>"));
445 _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>"));
446 _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>"));
447 _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>"));
448 _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>"));
449 _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>"));
450 _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>"));
451 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
452 _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>"));
453 _pppMountLineEdit->setWhatsThis(tr("<p>Specify a mountpoint if you want BNC to estimate coordinates for the affected receiver position through a PPP solution.</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster www.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver only in low repetition rate or dont come at all from there.</p>"));
454 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p><p>Note that SPP doesn not require to pull a stream of Broadcast Ephemeris Corrections.</p>"));
455 _pppStaticCheckBox->setWhatsThis(tr("<p>By default BNC considers the rover receiver as mobile.</p><p>Tick 'Static' to consider a static observation sitatuion and adapt appropriate filter characteristics for that.</p>"));
456 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
457 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
458 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
459 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
460 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
461 _pppOriginComboBox->setWhatsThis(tr("<p>Select an origin for North/East/Up time series plots in the 'PPP Plot' tab. This option makes only sense for a stationary receiver.</p>"));
462 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown in the 'PPP Plot' tab will then be referred to these values.</p>"));
463 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown in the 'PPP Plot' tab will then be referred to these values.</p>"));
464 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>You may enter reference coordinates of the receiver position if known. The time series plots shown in the 'PPP Plot' tab will then be referred to these values.</p>"));
465 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when a 'Plot origin' PPP option is applied. Values are either referred to reference coordinates (if specified) or referred to the first estimated set of coordinate compoments. The sliding PPP time series window covers the period of the latest 5 minutes."));
466
467 // Canvas with Editable Fields
468 // ---------------------------
469 _canvas = new QWidget;
470 setCentralWidget(_canvas);
471
472 _aogroup = new QTabWidget();
473 QWidget* pgroup = new QWidget();
474 QWidget* ggroup = new QWidget();
475 QWidget* sgroup = new QWidget();
476 QWidget* egroup = new QWidget();
477 QWidget* agroup = new QWidget();
478 QWidget* cgroup = new QWidget();
479 QWidget* ogroup = new QWidget();
480 QWidget* rgroup = new QWidget();
481 QWidget* sergroup = new QWidget();
482 QWidget* pppgroup = new QWidget();
483 _aogroup->addTab(pgroup,tr("Proxy"));
484 _aogroup->addTab(ggroup,tr("General"));
485 _aogroup->addTab(ogroup,tr("RINEX Observations"));
486 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
487 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
488 _aogroup->addTab(sgroup,tr("Feed Engine"));
489 _aogroup->addTab(sergroup,tr("Serial Output"));
490 _aogroup->addTab(agroup,tr("Outages"));
491 _aogroup->addTab(rgroup,tr("Miscellaneous"));
492 _aogroup->addTab(pppgroup,tr("PPP Client"));
493
494 // Log Tab
495 // -------
496 _loggroup = new QTabWidget();
497 _loggroup->addTab(_log,tr("Log"));
498 _loggroup->addTab(_bncFigure,tr("Throughput"));
499 _loggroup->addTab(_bncFigureLate,tr("Latency"));
500 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
501
502 // Proxy Tab
503 // ---------
504 QGridLayout* pLayout = new QGridLayout;
505 pLayout->setColumnMinimumWidth(0,13*ww);
506 _proxyPortLineEdit->setMaximumWidth(9*ww);
507
508 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
509 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
510 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
511 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
512 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
513 pLayout->addWidget(new QLabel(" "),3,0);
514 pLayout->addWidget(new QLabel(" "),4,0);
515 pLayout->addWidget(new QLabel(" "),5,0);
516 pgroup->setLayout(pLayout);
517
518 // General Tab
519 // -----------
520 QGridLayout* gLayout = new QGridLayout;
521 gLayout->setColumnMinimumWidth(0,14*ww);
522 _onTheFlyComboBox->setMaximumWidth(9*ww);
523
524 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
525 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
526 gLayout->addWidget(new QLabel("Append files"), 1, 0);
527 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
528 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
529 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
530 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
531 gLayout->addWidget(_autoStartCheckBox, 3, 1);
532 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
533 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
534 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
535 gLayout->addWidget(new QLabel(" "),6,0);
536 ggroup->setLayout(gLayout);
537
538 // RINEX Observations
539 // ------------------
540 QGridLayout* oLayout = new QGridLayout;
541 oLayout->setColumnMinimumWidth(0,14*ww);
542 _rnxIntrComboBox->setMaximumWidth(9*ww);
543 _rnxSamplSpinBox->setMaximumWidth(9*ww);
544
545 oLayout->addWidget(new QLabel("Directory"), 0, 0);
546 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
547 oLayout->addWidget(new QLabel("Interval"), 1, 0);
548 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
549 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
550 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
551 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
552 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
553 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
554 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
555 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
556 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
557 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
558 ogroup->setLayout(oLayout);
559
560 // RINEX Ephemeris
561 // ---------------
562 QGridLayout* eLayout = new QGridLayout;
563 eLayout->setColumnMinimumWidth(0,14*ww);
564 _ephIntrComboBox->setMaximumWidth(9*ww);
565 _outEphPortLineEdit->setMaximumWidth(9*ww);
566
567 eLayout->addWidget(new QLabel("Directory"), 0, 0);
568 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
569 eLayout->addWidget(new QLabel("Interval"), 1, 0);
570 eLayout->addWidget(_ephIntrComboBox, 1, 1);
571 eLayout->addWidget(new QLabel("Port"), 2, 0);
572 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
573 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
574 eLayout->addWidget(_ephV3CheckBox, 3, 1);
575 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
576 eLayout->addWidget(new QLabel(" "),5,0);
577 egroup->setLayout(eLayout);
578
579
580 // Broadcast Corrections
581 // ---------------------
582 QGridLayout* cLayout = new QGridLayout;
583 cLayout->setColumnMinimumWidth(0,14*ww);
584 _corrIntrComboBox->setMaximumWidth(9*ww);
585 _corrPortLineEdit->setMaximumWidth(9*ww);
586 _corrTimeSpinBox->setMaximumWidth(9*ww);
587
588 cLayout->addWidget(new QLabel("Directory"), 0, 0);
589 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
590 cLayout->addWidget(new QLabel("Interval"), 1, 0);
591 cLayout->addWidget(_corrIntrComboBox, 1, 1);
592 cLayout->addWidget(new QLabel("Port"), 2, 0);
593 cLayout->addWidget(_corrPortLineEdit, 2, 1);
594 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
595 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
596 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
597 cLayout->addWidget(new QLabel(" "),4,0);
598 cLayout->addWidget(new QLabel(" "),5,0);
599 cgroup->setLayout(cLayout);
600
601 // Feed Engine
602 // -----------
603 QGridLayout* sLayout = new QGridLayout;
604 sLayout->setColumnMinimumWidth(0,14*ww);
605 _outPortLineEdit->setMaximumWidth(9*ww);
606 _waitTimeSpinBox->setMaximumWidth(9*ww);
607 _binSamplSpinBox->setMaximumWidth(9*ww);
608 _outUPortLineEdit->setMaximumWidth(9*ww);
609
610 sLayout->addWidget(new QLabel("Port"), 0, 0);
611 sLayout->addWidget(_outPortLineEdit, 0, 1);
612 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
613 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
614 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
615 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
616 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
617 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
618 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
619 sLayout->addWidget(_outUPortLineEdit, 3, 1);
620 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
621 sLayout->addWidget(new QLabel(" "),5,0);
622 sgroup->setLayout(sLayout);
623
624 // Serial Output
625 // -------------
626 QGridLayout* serLayout = new QGridLayout;
627 serLayout->setColumnMinimumWidth(0,14*ww);
628 _serialBaudRateComboBox->setMaximumWidth(9*ww);
629 _serialFlowControlComboBox->setMaximumWidth(11*ww);
630 _serialDataBitsComboBox->setMaximumWidth(5*ww);
631 _serialParityComboBox->setMaximumWidth(9*ww);
632 _serialStopBitsComboBox->setMaximumWidth(5*ww);
633 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
634 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
635
636 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
637 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
638 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
639 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
640 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
641 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
642 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
643 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
644 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
645 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
646 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
647 serLayout->addWidget(_serialParityComboBox, 3,3);
648 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
649 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
650 serLayout->addWidget(new QLabel("NMEA"), 4,0);
651 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
652 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
653 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
654 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
655 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
656 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
657
658 sergroup->setLayout(serLayout);
659
660 // Outages
661 // -------
662 QGridLayout* aLayout = new QGridLayout;
663 aLayout->setColumnMinimumWidth(0,14*ww);
664 _obsRateComboBox->setMaximumWidth(9*ww);
665 _adviseFailSpinBox->setMaximumWidth(9*ww);
666 _adviseRecoSpinBox->setMaximumWidth(9*ww);
667
668 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
669 aLayout->addWidget(_obsRateComboBox, 0, 1);
670 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
671 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
672 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
673 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
674 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
675 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
676 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
677 aLayout->addWidget(new QLabel(" "), 5, 0);
678 agroup->setLayout(aLayout);
679
680 // Miscellaneous
681 // -------------
682 QGridLayout* rLayout = new QGridLayout;
683 rLayout->setColumnMinimumWidth(0,14*ww);
684 _perfIntrComboBox->setMaximumWidth(9*ww);
685
686 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
687 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
688 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
689 rLayout->addWidget(_perfIntrComboBox, 1, 1);
690 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
691 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
692 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
693 rLayout->addWidget(new QLabel(" "), 4, 0);
694 rLayout->addWidget(new QLabel(" "), 5, 0);
695 rgroup->setLayout(rLayout);
696
697 // PPP Client
698 // ----------
699 QGridLayout* pppLayout = new QGridLayout;
700 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
701 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
702 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
703 _pppNMEAPortLineEdit->setMaximumWidth(14*ww);
704 _pppOriginComboBox->setMaximumWidth(14*ww);
705 _pppSPPComboBox->setMaximumWidth(8*ww);
706 pppLayout->setColumnMinimumWidth(0,14*ww);
707 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
708 pppLayout->addWidget(_pppMountLineEdit, 0, 1, 1, 2);
709 pppLayout->addWidget(_pppSPPComboBox, 0, 4);
710 pppLayout->addWidget(new QLabel("Options"), 1, 0);
711 pppLayout->addWidget(_pppStaticCheckBox, 1, 1);
712 pppLayout->addWidget(new QLabel("Static "), 1, 2);
713 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 3);
714 pppLayout->addWidget(new QLabel("Use phase obs "), 1, 4);
715 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 5);
716 pppLayout->addWidget(new QLabel("Estimate tropo "), 1, 6);
717 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 7);
718 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 8);
719 pppLayout->addWidget(new QLabel("Plot origin"), 2, 0);
720 pppLayout->addWidget(_pppOriginComboBox, 2, 1, 1, 2);
721 pppLayout->addWidget(new QLabel(" "), 2, 3);
722 pppLayout->addWidget(_pppRefCrdXLineEdit, 2, 4);
723 pppLayout->addWidget(new QLabel(" "), 2, 5);
724 pppLayout->addWidget(_pppRefCrdYLineEdit, 2, 6);
725 pppLayout->addWidget(new QLabel(" "), 2, 7);
726 pppLayout->addWidget(_pppRefCrdZLineEdit, 2, 8);
727 pppLayout->addWidget(new QLabel("NMEA File (full path)"), 3, 0);
728 pppLayout->addWidget(_pppNMEALineEdit, 3, 1, 1, 6);
729 pppLayout->addWidget(new QLabel("Port"), 3, 7);
730 pppLayout->addWidget(_pppNMEAPortLineEdit, 3, 8);
731 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),4, 0,1,15);
732 pppLayout->addWidget(new QLabel(" "), 5, 0);
733 pppgroup->setLayout(pppLayout);
734
735 // Main Layout
736 // -----------
737 QGridLayout* mLayout = new QGridLayout;
738 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
739 mLayout->addWidget(_aogroup, 0,0);
740 mLayout->addWidget(_mountPointsTable, 1,0);
741 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
742 mLayout->addWidget(_loggroup, 2,0);
743
744 _canvas->setLayout(mLayout);
745
746 // Enable/Disable all Widgets
747 // --------------------------
748 slotBncTextChanged();
749
750 // Auto start
751 // ----------
752 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
753 slotGetData();
754 }
755}
756
757// Destructor
758////////////////////////////////////////////////////////////////////////////
759bncWindow::~bncWindow() {
760 delete _caster;
761}
762
763//
764////////////////////////////////////////////////////////////////////////////
765void bncWindow::populateMountPointsTable() {
766
767 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
768 _mountPointsTable->removeRow(iRow);
769 }
770
771 bncSettings settings;
772
773 QListIterator<QString> it(settings.value("mountPoints").toStringList());
774 if (!it.hasNext()) {
775 _actGetData->setEnabled(false);
776 }
777 int iRow = 0;
778 while (it.hasNext()) {
779 QStringList hlp = it.next().split(" ");
780 if (hlp.size() < 5) continue;
781 _mountPointsTable->insertRow(iRow);
782
783 QUrl url(hlp[0]);
784
785 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
786 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
787 QString nmea(hlp[4]);
788 if (hlp[5] == "S") {
789 fullPath = hlp[0].replace(0,2,"");
790 }
791 QString ntripVersion = "1";
792 if (hlp.size() >= 6) {
793 ntripVersion = (hlp[5]);
794 }
795
796 QTableWidgetItem* it;
797 it = new QTableWidgetItem(url.userInfo());
798 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
799 _mountPointsTable->setItem(iRow, 0, it);
800
801 it = new QTableWidgetItem(fullPath);
802 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
803 _mountPointsTable->setItem(iRow, 1, it);
804
805 it = new QTableWidgetItem(format);
806 _mountPointsTable->setItem(iRow, 2, it);
807
808 if (nmea == "yes") {
809 it = new QTableWidgetItem(latitude);
810 _mountPointsTable->setItem(iRow, 3, it);
811 it = new QTableWidgetItem(longitude);
812 _mountPointsTable->setItem(iRow, 4, it);
813 } else {
814 it = new QTableWidgetItem(latitude);
815 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
816 _mountPointsTable->setItem(iRow, 3, it);
817 it = new QTableWidgetItem(longitude);
818 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
819 _mountPointsTable->setItem(iRow, 4, it);
820 }
821
822 it = new QTableWidgetItem(nmea);
823 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
824 _mountPointsTable->setItem(iRow, 5, it);
825
826 it = new QTableWidgetItem(ntripVersion);
827 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
828 _mountPointsTable->setItem(iRow, 6, it);
829
830 bncTableItem* bncIt = new bncTableItem();
831 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
832 _mountPointsTable->setItem(iRow, 7, bncIt);
833
834 iRow++;
835 }
836
837 _mountPointsTable->sortItems(1);
838}
839
840// Retrieve Table
841////////////////////////////////////////////////////////////////////////////
842void bncWindow::slotAddMountPoints() {
843
844 bncSettings settings;
845 QString proxyHost = settings.value("proxyHost").toString();
846 int proxyPort = settings.value("proxyPort").toInt();
847 if (proxyHost != _proxyHostLineEdit->text() ||
848 proxyPort != _proxyPortLineEdit->text().toInt()) {
849 int iRet = QMessageBox::question(this, "Question", "Proxy options "
850 "changed. Use the new ones?",
851 QMessageBox::Yes, QMessageBox::No,
852 QMessageBox::NoButton);
853 if (iRet == QMessageBox::Yes) {
854 settings.setValue("proxyHost", _proxyHostLineEdit->text());
855 settings.setValue("proxyPort", _proxyPortLineEdit->text());
856 settings.sync();
857 }
858 }
859
860 QMessageBox msgBox;
861 msgBox.setIcon(QMessageBox::Question);
862 msgBox.setWindowTitle("Add Stream");
863 msgBox.setText("Add stream(s) coming from:");
864
865 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
866 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
867 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
868 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
869 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
870
871 msgBox.exec();
872
873 if (msgBox.clickedButton() == buttonNtrip) {
874 bncTableDlg* dlg = new bncTableDlg(this);
875 dlg->move(this->pos().x()+50, this->pos().y()+50);
876 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
877 this, SLOT(slotNewMountPoints(QStringList*)));
878 dlg->exec();
879 delete dlg;
880 } else if (msgBox.clickedButton() == buttonIP) {
881 bncIpPort* ipp = new bncIpPort(this);
882 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
883 this, SLOT(slotNewMountPoints(QStringList*)));
884 ipp->exec();
885 delete ipp;
886 } else if (msgBox.clickedButton() == buttonUDP) {
887 bncUdpPort* udp = new bncUdpPort(this);
888 connect(udp, SIGNAL(newMountPoints(QStringList*)),
889 this, SLOT(slotNewMountPoints(QStringList*)));
890 udp->exec();
891 delete udp;
892 } else if (msgBox.clickedButton() == buttonSerial) {
893 bncSerialPort* sep = new bncSerialPort(this);
894 connect(sep, SIGNAL(newMountPoints(QStringList*)),
895 this, SLOT(slotNewMountPoints(QStringList*)));
896 sep->exec();
897 delete sep;
898 } else if (msgBox.clickedButton() == buttonCancel) {
899 // Cancel
900 }
901}
902
903// Delete Selected Mount Points
904////////////////////////////////////////////////////////////////////////////
905void bncWindow::slotDeleteMountPoints() {
906
907 int nRows = _mountPointsTable->rowCount();
908 bool flg[nRows];
909 for (int iRow = 0; iRow < nRows; iRow++) {
910 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
911 flg[iRow] = true;
912 }
913 else {
914 flg[iRow] = false;
915 }
916 }
917 for (int iRow = nRows-1; iRow >= 0; iRow--) {
918 if (flg[iRow]) {
919 _mountPointsTable->removeRow(iRow);
920 }
921 }
922 _actDeleteMountPoints->setEnabled(false);
923
924 if (_mountPointsTable->rowCount() == 0) {
925 _actGetData->setEnabled(false);
926 }
927}
928
929// New Mount Points Selected
930////////////////////////////////////////////////////////////////////////////
931void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
932 int iRow = 0;
933 QListIterator<QString> it(*mountPoints);
934 while (it.hasNext()) {
935 QStringList hlp = it.next().split(" ");
936 QUrl url(hlp[0]);
937 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
938 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
939 QString nmea(hlp[4]);
940 if (hlp[5] == "S") {
941 fullPath = hlp[0].replace(0,2,"");
942 }
943 QString ntripVersion = "1";
944 if (hlp.size() >= 6) {
945 ntripVersion = (hlp[5]);
946 }
947
948 _mountPointsTable->insertRow(iRow);
949
950 QTableWidgetItem* it;
951 it = new QTableWidgetItem(url.userInfo());
952 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
953 _mountPointsTable->setItem(iRow, 0, it);
954
955 it = new QTableWidgetItem(fullPath);
956 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
957 _mountPointsTable->setItem(iRow, 1, it);
958
959 it = new QTableWidgetItem(format);
960 _mountPointsTable->setItem(iRow, 2, it);
961
962 if (nmea == "yes") {
963 it = new QTableWidgetItem(latitude);
964 _mountPointsTable->setItem(iRow, 3, it);
965 it = new QTableWidgetItem(longitude);
966 _mountPointsTable->setItem(iRow, 4, it);
967 } else {
968 it = new QTableWidgetItem(latitude);
969 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
970 _mountPointsTable->setItem(iRow, 3, it);
971 it = new QTableWidgetItem(longitude);
972 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
973 _mountPointsTable->setItem(iRow, 4, it);
974 }
975
976 it = new QTableWidgetItem(nmea);
977 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
978 _mountPointsTable->setItem(iRow, 5, it);
979
980 it = new QTableWidgetItem(ntripVersion);
981 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
982 _mountPointsTable->setItem(iRow, 6, it);
983
984 bncTableItem* bncIt = new bncTableItem();
985 _mountPointsTable->setItem(iRow, 7, bncIt);
986
987 iRow++;
988 }
989 _mountPointsTable->hideColumn(0);
990 _mountPointsTable->sortItems(1);
991 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
992 _actGetData->setEnabled(true);
993 }
994 delete mountPoints;
995}
996
997// Save Options
998////////////////////////////////////////////////////////////////////////////
999void bncWindow::slotSaveOptions() {
1000
1001 QStringList mountPoints;
1002 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1003
1004 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1005 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1006 "@" + _mountPointsTable->item(iRow, 1)->text() );
1007
1008 mountPoints.append(url.toString() + " " +
1009 _mountPointsTable->item(iRow, 2)->text()
1010 + " " + _mountPointsTable->item(iRow, 3)->text()
1011 + " " + _mountPointsTable->item(iRow, 4)->text()
1012 + " " + _mountPointsTable->item(iRow, 5)->text()
1013 + " " + _mountPointsTable->item(iRow, 6)->text());
1014 } else {
1015 mountPoints.append(
1016 "//" + _mountPointsTable->item(iRow, 1)->text()
1017 + " " + _mountPointsTable->item(iRow, 2)->text()
1018 + " " + _mountPointsTable->item(iRow, 3)->text()
1019 + " " + _mountPointsTable->item(iRow, 4)->text()
1020 + " " + _mountPointsTable->item(iRow, 5)->text()
1021 + " " + _mountPointsTable->item(iRow, 6)->text());
1022 }
1023 }
1024
1025 bncSettings settings;
1026
1027 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1028 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1029 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1030 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1031 settings.setValue("binSampl", _binSamplSpinBox->value());
1032 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1033 settings.setValue("corrPath", _corrPathLineEdit->text());
1034 settings.setValue("corrPort", _corrPortLineEdit->text());
1035 settings.setValue("corrTime", _corrTimeSpinBox->value());
1036 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1037 settings.setValue("ephPath", _ephPathLineEdit->text());
1038 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1039 settings.setValue("logFile", _logFileLineEdit->text());
1040 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1041 settings.setValue("miscMount", _miscMountLineEdit->text());
1042 settings.setValue("pppMount", _pppMountLineEdit->text());
1043 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1044 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1045 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1046 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1047 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1048 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1049 settings.setValue("pppStatic", _pppStaticCheckBox->checkState());
1050 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1051 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1052 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1053 settings.setValue("pppOrigin", _pppOriginComboBox->currentText());
1054 settings.setValue("mountPoints", mountPoints);
1055 settings.setValue("obsRate", _obsRateComboBox->currentText());
1056 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1057 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1058 settings.setValue("outFile", _outFileLineEdit->text());
1059 settings.setValue("outPort", _outPortLineEdit->text());
1060 settings.setValue("outUPort", _outUPortLineEdit->text());
1061 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1062 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1063 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1064 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1065 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1066 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1067 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1068 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1069 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1070 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1071 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1072 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1073 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1074 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1075 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1076 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1077 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1078 settings.setValue("serialParity", _serialParityComboBox->currentText());
1079 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1080 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1081 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1082 settings.setValue("startTab", _aogroup->currentIndex());
1083 settings.setValue("statusTab", _loggroup->currentIndex());
1084 settings.setValue("waitTime", _waitTimeSpinBox->value());
1085
1086 if (_caster) {
1087 _caster->slotReadMountPoints();
1088 }
1089 settings.sync();
1090}
1091
1092// All get slots terminated
1093////////////////////////////////////////////////////////////////////////////
1094void bncWindow::slotGetThreadsFinished() {
1095 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1096 delete _caster; _caster = 0;
1097 _actGetData->setEnabled(true);
1098 _actStop->setEnabled(false);
1099}
1100
1101// Retrieve Data
1102////////////////////////////////////////////////////////////////////////////
1103void bncWindow::slotGetData() {
1104 slotSaveOptions();
1105
1106 _bncFigurePPP->reset();
1107
1108 _actDeleteMountPoints->setEnabled(false);
1109 _actGetData->setEnabled(false);
1110 _actStop->setEnabled(true);
1111
1112 _caster = new bncCaster(_outFileLineEdit->text(),
1113 _outPortLineEdit->text().toInt());
1114
1115 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1116 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1117
1118 connect(_caster, SIGNAL(getThreadsFinished()),
1119 this, SLOT(slotGetThreadsFinished()));
1120
1121 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1122 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1123
1124 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1125
1126 bncSettings settings;
1127
1128 QDir rnxdir(settings.value("rnxPath").toString());
1129 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1130
1131 QString rnx_file = settings.value("rnxScript").toString();
1132 if ( !rnx_file.isEmpty() ) {
1133 QFile rnxfile(settings.value("rnxScript").toString());
1134 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1135 }
1136
1137 QDir ephdir(settings.value("ephPath").toString());
1138 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1139
1140 QDir corrdir(settings.value("corrPath").toString());
1141 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1142
1143 QString advise_file = settings.value("adviseScript").toString();
1144 if ( !advise_file.isEmpty() ) {
1145 QFile advisefile(settings.value("adviseScript").toString());
1146 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1147 }
1148
1149 _caster->slotReadMountPoints();
1150}
1151
1152// Retrieve Data
1153////////////////////////////////////////////////////////////////////////////
1154void bncWindow::slotStop() {
1155 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1156 QMessageBox::Yes, QMessageBox::No,
1157 QMessageBox::NoButton);
1158 if (iRet == QMessageBox::Yes) {
1159 delete _caster; _caster = 0;
1160 _actGetData->setEnabled(true);
1161 _actStop->setEnabled(false);
1162 }
1163}
1164
1165// Close Application gracefully
1166////////////////////////////////////////////////////////////////////////////
1167void bncWindow::closeEvent(QCloseEvent* event) {
1168
1169 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1170 QMessageBox::Yes, QMessageBox::No,
1171 QMessageBox::Cancel);
1172
1173 if (iRet == QMessageBox::Cancel) {
1174 event->ignore();
1175 return;
1176 }
1177 else if (iRet == QMessageBox::Yes) {
1178 slotSaveOptions();
1179 }
1180
1181 QMainWindow::closeEvent(event);
1182}
1183
1184// User changed the selection of mountPoints
1185////////////////////////////////////////////////////////////////////////////
1186void bncWindow::slotSelectionChanged() {
1187 if (_mountPointsTable->selectedItems().isEmpty()) {
1188 _actDeleteMountPoints->setEnabled(false);
1189 }
1190 else {
1191 _actDeleteMountPoints->setEnabled(true);
1192 }
1193}
1194
1195// Display Program Messages
1196////////////////////////////////////////////////////////////////////////////
1197void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1198
1199#ifdef DEBUG_RTCM2_2021
1200 const int maxBufferSize = 1000;
1201#else
1202 const int maxBufferSize = 10000;
1203#endif
1204
1205 if (! showOnScreen ) {
1206 return;
1207 }
1208
1209 QString txt = _log->toPlainText() + "\n" +
1210 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1211 _log->clear();
1212 _log->append(txt.right(maxBufferSize));
1213}
1214
1215// About Message
1216////////////////////////////////////////////////////////////////////////////
1217void bncWindow::slotAbout() {
1218 new bncAboutDlg(0);
1219}
1220
1221//Flowchart
1222////////////////////////////////////////////////////////////////////////////
1223void bncWindow::slotFlowchart() {
1224 new bncFlowchartDlg(0);
1225}
1226
1227// Help Window
1228////////////////////////////////////////////////////////////////////////////
1229void bncWindow::slotHelp() {
1230 QUrl url;
1231 url.setPath(":bnchelp.html");
1232 new bncHlpDlg(0, url);
1233}
1234
1235// Select Fonts
1236////////////////////////////////////////////////////////////////////////////
1237void bncWindow::slotFontSel() {
1238 bool ok;
1239 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1240 if (ok) {
1241 bncSettings settings;
1242 settings.setValue("font", newFont.toString());
1243 QApplication::setFont(newFont);
1244 int ww = QFontMetrics(newFont).width('w');
1245 setMinimumSize(60*ww, 80*ww);
1246 resize(60*ww, 80*ww);
1247 }
1248}
1249
1250// Whats This Help
1251void bncWindow::slotWhatsThis() {
1252 QWhatsThis::enterWhatsThisMode();
1253}
1254
1255//
1256////////////////////////////////////////////////////////////////////////////
1257void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1258 _bncFigure->updateMountPoints();
1259 _bncFigureLate->updateMountPoints();
1260
1261 populateMountPointsTable();
1262 bncSettings settings;
1263 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1264 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1265 QListIterator<bncGetThread*> iTh(threads);
1266 while (iTh.hasNext()) {
1267 bncGetThread* thread = iTh.next();
1268 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1269 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1270 "@" + _mountPointsTable->item(iRow, 1)->text() );
1271 if (url == thread->mountPoint() &&
1272 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1273 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1274 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1275 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1276 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1277 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1278 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1279 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1280 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1281 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1282 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1283 if (settings.value("pppOrigin").toString() != "No plot") {
1284 disconnect(thread,
1285 SIGNAL(newPosition(bncTime, double, double, double)),
1286 _bncFigurePPP,
1287 SLOT(slotNewPosition(bncTime, double, double, double)));
1288 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1289 _bncFigurePPP,
1290 SLOT(slotNewPosition(bncTime, double, double, double)));
1291 }
1292 break;
1293 }
1294 }
1295 }
1296}
1297
1298//
1299////////////////////////////////////////////////////////////////////////////
1300void bncWindow::CreateMenu() {
1301 // Create Menus
1302 // ------------
1303 _menuFile = menuBar()->addMenu(tr("&File"));
1304 _menuFile->addAction(_actFontSel);
1305 _menuFile->addSeparator();
1306 _menuFile->addAction(_actSaveOpt);
1307 _menuFile->addSeparator();
1308 _menuFile->addAction(_actQuit);
1309
1310 _menuHlp = menuBar()->addMenu(tr("&Help"));
1311 _menuHlp->addAction(_actHelp);
1312 _menuHlp->addAction(_actFlowchart);
1313 _menuHlp->addAction(_actAbout);
1314}
1315
1316// Toolbar
1317////////////////////////////////////////////////////////////////////////////
1318void bncWindow::AddToolbar() {
1319 // Tool (Command) Bar
1320 // ------------------
1321 QToolBar* toolBar = new QToolBar;
1322 addToolBar(Qt::BottomToolBarArea, toolBar);
1323 toolBar->setMovable(false);
1324 toolBar->addAction(_actAddMountPoints);
1325 toolBar->addAction(_actDeleteMountPoints);
1326 toolBar->addAction(_actGetData);
1327 toolBar->addAction(_actStop);
1328 toolBar->addWidget(new QLabel(" "));
1329 toolBar->addAction(_actwhatsthis);
1330}
1331
1332// About
1333////////////////////////////////////////////////////////////////////////////
1334bncAboutDlg::bncAboutDlg(QWidget* parent) :
1335 QDialog(parent) {
1336
1337 QTextBrowser* tb = new QTextBrowser;
1338 QUrl url; url.setPath(":bncabout.html");
1339 tb->setSource(url);
1340 tb->setReadOnly(true);
1341
1342 int ww = QFontMetrics(font()).width('w');
1343 QPushButton* _closeButton = new QPushButton("Close");
1344 _closeButton->setMaximumWidth(10*ww);
1345 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1346
1347 QGridLayout* dlgLayout = new QGridLayout();
1348 QLabel* img = new QLabel();
1349 img->setPixmap(QPixmap(":ntrip-logo.png"));
1350 dlgLayout->addWidget(img, 0,0);
1351 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1352 dlgLayout->addWidget(tb,1,0,1,2);
1353 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1354
1355 setLayout(dlgLayout);
1356 resize(60*ww, 60*ww);
1357 setWindowTitle("About BNC");
1358 show();
1359}
1360
1361//
1362////////////////////////////////////////////////////////////////////////////
1363bncAboutDlg::~bncAboutDlg() {
1364};
1365
1366// Flowchart
1367////////////////////////////////////////////////////////////////////////////
1368bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1369 QDialog(parent) {
1370
1371 int ww = QFontMetrics(font()).width('w');
1372 QPushButton* _closeButton = new QPushButton("Close");
1373 _closeButton->setMaximumWidth(10*ww);
1374 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1375
1376 QGridLayout* dlgLayout = new QGridLayout();
1377 QLabel* img = new QLabel();
1378 img->setPixmap(QPixmap(":bncflowchart.png"));
1379 dlgLayout->addWidget(img, 0,0);
1380 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1381
1382 setLayout(dlgLayout);
1383 setWindowTitle("Flow Chart");
1384 show();
1385}
1386
1387//
1388////////////////////////////////////////////////////////////////////////////
1389bncFlowchartDlg::~bncFlowchartDlg() {
1390};
1391
1392// Bnc Text
1393////////////////////////////////////////////////////////////////////////////
1394void bncWindow::slotBncTextChanged(){
1395
1396 QPalette palette_white(QColor(255, 255, 255));
1397 QPalette palette_gray(QColor(230, 230, 230));
1398
1399 // Proxy
1400 //------
1401 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1402 if (!_proxyHostLineEdit->text().isEmpty()) {
1403 _proxyPortLineEdit->setStyleSheet("background-color: white");
1404 _proxyPortLineEdit->setEnabled(true);
1405 }
1406 else {
1407 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1408 _proxyPortLineEdit->setEnabled(false);
1409 }
1410 }
1411
1412 // RINEX Observations
1413 // ------------------
1414 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1415 if (!_rnxPathLineEdit->text().isEmpty()) {
1416 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1417 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1418 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1419 _rnxV3CheckBox->setPalette(palette_white);
1420 _rnxIntrComboBox->setStyleSheet("background-color: white");
1421 _rnxSamplSpinBox->setEnabled(true);
1422 _rnxSkelLineEdit->setEnabled(true);
1423 _rnxScrpLineEdit->setEnabled(true);
1424 _rnxV3CheckBox->setEnabled(true);
1425 _rnxIntrComboBox->setEnabled(true);
1426 }
1427 else {
1428 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1429 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1430 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1431 _rnxV3CheckBox->setPalette(palette_gray);
1432 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1433 _rnxSamplSpinBox->setEnabled(false);
1434 _rnxSkelLineEdit->setEnabled(false);
1435 _rnxScrpLineEdit->setEnabled(false);
1436 _rnxV3CheckBox->setEnabled(false);
1437 _rnxIntrComboBox->setEnabled(false);
1438 }
1439 }
1440
1441 // RINEX Ephemeris
1442 // ---------------
1443 if (sender() == 0 ||
1444 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1445 if (!_ephPathLineEdit->text().isEmpty() ||
1446 !_outEphPortLineEdit->text().isEmpty()) {
1447 _ephIntrComboBox->setStyleSheet("background-color: white");
1448 _ephV3CheckBox->setPalette(palette_white);
1449 _ephIntrComboBox->setEnabled(true);
1450 _ephV3CheckBox->setEnabled(true);
1451 }
1452 else {
1453 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1454 _ephV3CheckBox->setPalette(palette_gray);
1455 _ephIntrComboBox->setEnabled(false);
1456 _ephV3CheckBox->setEnabled(false);
1457 }
1458 }
1459
1460 // Broadcast Corrections
1461 // ---------------------
1462 if (sender() == 0 ||
1463 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1464 if (!_corrPathLineEdit->text().isEmpty() ||
1465 !_corrPortLineEdit->text().isEmpty()) {
1466 _corrIntrComboBox->setStyleSheet("background-color: white");
1467 _corrIntrComboBox->setEnabled(true);
1468 }
1469 else {
1470 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1471 _corrIntrComboBox->setEnabled(false);
1472 }
1473 }
1474
1475 // Feed Engine
1476 // -----------
1477 if (sender() == 0 ||
1478 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1479 if ( !_outPortLineEdit->text().isEmpty() ||
1480 !_outFileLineEdit->text().isEmpty()) {
1481 _waitTimeSpinBox->setStyleSheet("background-color: white");
1482 _binSamplSpinBox->setStyleSheet("background-color: white");
1483 _waitTimeSpinBox->setEnabled(true);
1484 _binSamplSpinBox->setEnabled(true);
1485 }
1486 else {
1487 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1488 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1489 _waitTimeSpinBox->setEnabled(false);
1490 _binSamplSpinBox->setEnabled(false);
1491 }
1492 }
1493
1494 // Serial Output
1495 // -------------
1496 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1497 sender() == _serialAutoNMEAComboBox) {
1498 if (!_serialMountPointLineEdit->text().isEmpty()) {
1499 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1500 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1501 _serialParityComboBox->setStyleSheet("background-color: white");
1502 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1503 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1504 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1505 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1506 _serialPortNameLineEdit->setEnabled(true);
1507 _serialBaudRateComboBox->setEnabled(true);
1508 _serialParityComboBox->setEnabled(true);
1509 _serialDataBitsComboBox->setEnabled(true);
1510 _serialStopBitsComboBox->setEnabled(true);
1511 _serialFlowControlComboBox->setEnabled(true);
1512 _serialAutoNMEAComboBox->setEnabled(true);
1513 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1514 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1515 _serialHeightNMEALineEdit->setEnabled(true);
1516 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1517 _serialFileNMEALineEdit->setEnabled(false);
1518 }
1519 else {
1520 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1521 _serialHeightNMEALineEdit->setEnabled(false);
1522 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1523 _serialFileNMEALineEdit->setEnabled(true);
1524 }
1525 }
1526 else {
1527 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1528 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1529 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1530 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1531 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1532 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1533 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1534 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1535 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1536 _serialPortNameLineEdit->setEnabled(false);
1537 _serialBaudRateComboBox->setEnabled(false);
1538 _serialParityComboBox->setEnabled(false);
1539 _serialDataBitsComboBox->setEnabled(false);
1540 _serialStopBitsComboBox->setEnabled(false);
1541 _serialFlowControlComboBox->setEnabled(false);
1542 _serialAutoNMEAComboBox->setEnabled(false);
1543 _serialHeightNMEALineEdit->setEnabled(false);
1544 _serialFileNMEALineEdit->setEnabled(false);
1545 }
1546 }
1547
1548 // Outages
1549 // -------
1550 if (sender() == 0 || sender() == _obsRateComboBox) {
1551 if (!_obsRateComboBox->currentText().isEmpty()) {
1552 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1553 _adviseFailSpinBox->setStyleSheet("background-color: white");
1554 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1555 _adviseFailSpinBox->setEnabled(true);
1556 _adviseRecoSpinBox->setEnabled(true);
1557 _adviseScriptLineEdit->setEnabled(true);
1558 } else {
1559 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1560 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1561 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1562 _adviseFailSpinBox->setEnabled(false);
1563 _adviseRecoSpinBox->setEnabled(false);
1564 _adviseScriptLineEdit->setEnabled(false);
1565 }
1566 }
1567
1568 // Miscellaneous
1569 // -------------
1570 if (sender() == 0 || sender() == _miscMountLineEdit) {
1571 if (!_miscMountLineEdit->text().isEmpty()) {
1572 _perfIntrComboBox->setStyleSheet("background-color: white");
1573 _scanRTCMCheckBox->setPalette(palette_white);
1574 _perfIntrComboBox->setEnabled(true);
1575 _scanRTCMCheckBox->setEnabled(true);
1576 } else {
1577 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1578 _scanRTCMCheckBox->setPalette(palette_gray);
1579 _perfIntrComboBox->setEnabled(false);
1580 _scanRTCMCheckBox->setEnabled(false);
1581 }
1582 }
1583
1584 // PPP Client
1585 // ----------
1586 if (sender() == 0 || sender() == _pppMountLineEdit
1587 || sender() == _pppOriginComboBox) {
1588 if (!_pppMountLineEdit->text().isEmpty()) {
1589 _pppSPPComboBox->setPalette(palette_white);
1590 _pppNMEALineEdit->setPalette(palette_white);
1591 _pppNMEAPortLineEdit->setPalette(palette_white);
1592 _pppRefCrdXLineEdit->setPalette(palette_white);
1593 _pppRefCrdYLineEdit->setPalette(palette_white);
1594 _pppRefCrdZLineEdit->setPalette(palette_white);
1595 _pppStaticCheckBox->setPalette(palette_white);
1596 _pppUsePhaseCheckBox->setPalette(palette_white);
1597 _pppEstTropoCheckBox->setPalette(palette_white);
1598 _pppGLONASSCheckBox->setPalette(palette_white);
1599 _pppOriginComboBox->setPalette(palette_white);
1600 _pppSPPComboBox->setEnabled(true);
1601 _pppNMEALineEdit->setEnabled(true);
1602 _pppNMEAPortLineEdit->setEnabled(true);
1603 _pppRefCrdXLineEdit->setEnabled(true);
1604 _pppRefCrdYLineEdit->setEnabled(true);
1605 _pppRefCrdZLineEdit->setEnabled(true);
1606 _pppStaticCheckBox->setEnabled(true);
1607 _pppUsePhaseCheckBox->setEnabled(true);
1608 _pppEstTropoCheckBox->setEnabled(true);
1609 _pppGLONASSCheckBox->setEnabled(true);
1610 _pppOriginComboBox->setEnabled(true);
1611 if (_pppOriginComboBox->currentText() == "X Y Z" ) {
1612 _pppRefCrdXLineEdit->setPalette(palette_white);
1613 _pppRefCrdXLineEdit->setEnabled(true);
1614 _pppRefCrdYLineEdit->setPalette(palette_white);
1615 _pppRefCrdYLineEdit->setEnabled(true);
1616 _pppRefCrdZLineEdit->setPalette(palette_white);
1617 _pppRefCrdZLineEdit->setEnabled(true);
1618 }
1619 else {
1620 _pppRefCrdXLineEdit->setPalette(palette_gray);
1621 _pppRefCrdXLineEdit->setEnabled(false);
1622 _pppRefCrdYLineEdit->setPalette(palette_gray);
1623 _pppRefCrdYLineEdit->setEnabled(false);
1624 _pppRefCrdZLineEdit->setPalette(palette_gray);
1625 _pppRefCrdZLineEdit->setEnabled(false);
1626 }
1627 } else {
1628 _pppSPPComboBox->setPalette(palette_gray);
1629 _pppNMEALineEdit->setPalette(palette_gray);
1630 _pppNMEAPortLineEdit->setPalette(palette_gray);
1631 _pppRefCrdXLineEdit->setPalette(palette_gray);
1632 _pppRefCrdYLineEdit->setPalette(palette_gray);
1633 _pppRefCrdZLineEdit->setPalette(palette_gray);
1634 _pppStaticCheckBox->setPalette(palette_gray);
1635 _pppUsePhaseCheckBox->setPalette(palette_gray);
1636 _pppEstTropoCheckBox->setPalette(palette_gray);
1637 _pppGLONASSCheckBox->setPalette(palette_gray);
1638 _pppOriginComboBox->setPalette(palette_gray);
1639 _pppSPPComboBox->setEnabled(false);
1640 _pppNMEALineEdit->setEnabled(false);
1641 _pppNMEAPortLineEdit->setEnabled(false);
1642 _pppRefCrdXLineEdit->setEnabled(false);
1643 _pppRefCrdYLineEdit->setEnabled(false);
1644 _pppRefCrdZLineEdit->setEnabled(false);
1645 _pppStaticCheckBox->setEnabled(false);
1646 _pppUsePhaseCheckBox->setEnabled(false);
1647 _pppEstTropoCheckBox->setEnabled(false);
1648 _pppGLONASSCheckBox->setEnabled(false);
1649 _pppOriginComboBox->setEnabled(false);
1650 }
1651 }
1652}
Note: See TracBrowser for help on using the repository browser.