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

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

* empty log message *

File size: 82.1 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 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
424
425 _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>"));
426 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
427 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
428 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
429 _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>"));
430 _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>"));
431 _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>"));
432 _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>"));
433 _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>"));
434 _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."));
435 _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>"));
436 _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>"));
437 _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>"));
438 _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."));
439 _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)."));
440 _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."));
441 _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."));
442 _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."));
443 _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>"));
444 _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>"));
445 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
446 _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>"));
447 _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>"));
448 _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>"));
449 _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>"));
450 _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>"));
451 _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>"));
452 _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>"));
453 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
454 _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>"));
455 _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>"));
456 _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>"));
457 _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>"));
458 _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>"));
459 _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>"));
460 _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>"));
461 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
462 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
463 _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>"));
464 _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>"));
465 _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>"));
466 _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>"));
467 _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."));
468
469 // Canvas with Editable Fields
470 // ---------------------------
471 _canvas = new QWidget;
472 setCentralWidget(_canvas);
473
474 _aogroup = new QTabWidget();
475 QWidget* pgroup = new QWidget();
476 QWidget* ggroup = new QWidget();
477 QWidget* sgroup = new QWidget();
478 QWidget* egroup = new QWidget();
479 QWidget* agroup = new QWidget();
480 QWidget* cgroup = new QWidget();
481 QWidget* ogroup = new QWidget();
482 QWidget* rgroup = new QWidget();
483 QWidget* sergroup = new QWidget();
484 QWidget* pppgroup = new QWidget();
485 _aogroup->addTab(pgroup,tr("Proxy"));
486 _aogroup->addTab(ggroup,tr("General"));
487 _aogroup->addTab(ogroup,tr("RINEX Observations"));
488 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
489 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
490 _aogroup->addTab(sgroup,tr("Feed Engine"));
491 _aogroup->addTab(sergroup,tr("Serial Output"));
492 _aogroup->addTab(agroup,tr("Outages"));
493 _aogroup->addTab(rgroup,tr("Miscellaneous"));
494 _aogroup->addTab(pppgroup,tr("PPP Client"));
495
496 // Log Tab
497 // -------
498 _loggroup = new QTabWidget();
499 _loggroup->addTab(_log,tr("Log"));
500 _loggroup->addTab(_bncFigure,tr("Throughput"));
501 _loggroup->addTab(_bncFigureLate,tr("Latency"));
502 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
503
504 // Proxy Tab
505 // ---------
506 QGridLayout* pLayout = new QGridLayout;
507 pLayout->setColumnMinimumWidth(0,13*ww);
508 _proxyPortLineEdit->setMaximumWidth(9*ww);
509
510 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
511 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
512 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
513 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
514 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
515 pLayout->addWidget(new QLabel(" "),3,0);
516 pLayout->addWidget(new QLabel(" "),4,0);
517 pLayout->addWidget(new QLabel(" "),5,0);
518 pgroup->setLayout(pLayout);
519
520 // General Tab
521 // -----------
522 QGridLayout* gLayout = new QGridLayout;
523 gLayout->setColumnMinimumWidth(0,14*ww);
524 _onTheFlyComboBox->setMaximumWidth(9*ww);
525
526 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
527 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
528 gLayout->addWidget(new QLabel("Append files"), 1, 0);
529 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
530 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
531 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
532 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
533 gLayout->addWidget(_autoStartCheckBox, 3, 1);
534 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
535 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
536 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
537 ggroup->setLayout(gLayout);
538
539 // RINEX Observations
540 // ------------------
541 QGridLayout* oLayout = new QGridLayout;
542 oLayout->setColumnMinimumWidth(0,14*ww);
543 _rnxIntrComboBox->setMaximumWidth(9*ww);
544 _rnxSamplSpinBox->setMaximumWidth(9*ww);
545
546 oLayout->addWidget(new QLabel("Directory"), 0, 0);
547 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
548 oLayout->addWidget(new QLabel("Interval"), 1, 0);
549 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
550 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
551 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
552 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
553 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
554 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
555 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
556 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
557 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
558 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
559 ogroup->setLayout(oLayout);
560
561 // RINEX Ephemeris
562 // ---------------
563 QGridLayout* eLayout = new QGridLayout;
564 eLayout->setColumnMinimumWidth(0,14*ww);
565 _ephIntrComboBox->setMaximumWidth(9*ww);
566 _outEphPortLineEdit->setMaximumWidth(9*ww);
567
568 eLayout->addWidget(new QLabel("Directory"), 0, 0);
569 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
570 eLayout->addWidget(new QLabel("Interval"), 1, 0);
571 eLayout->addWidget(_ephIntrComboBox, 1, 1);
572 eLayout->addWidget(new QLabel("Port"), 2, 0);
573 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
574 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
575 eLayout->addWidget(_ephV3CheckBox, 3, 1);
576 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
577 eLayout->addWidget(new QLabel(" "),5,0);
578 egroup->setLayout(eLayout);
579
580
581 // Broadcast Corrections
582 // ---------------------
583 QGridLayout* cLayout = new QGridLayout;
584 cLayout->setColumnMinimumWidth(0,14*ww);
585 _corrIntrComboBox->setMaximumWidth(9*ww);
586 _corrPortLineEdit->setMaximumWidth(9*ww);
587 _corrTimeSpinBox->setMaximumWidth(9*ww);
588
589 cLayout->addWidget(new QLabel("Directory"), 0, 0);
590 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
591 cLayout->addWidget(new QLabel("Interval"), 1, 0);
592 cLayout->addWidget(_corrIntrComboBox, 1, 1);
593 cLayout->addWidget(new QLabel("Port"), 2, 0);
594 cLayout->addWidget(_corrPortLineEdit, 2, 1);
595 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
596 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
597 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
598 cLayout->addWidget(new QLabel(" "),4,0);
599 cLayout->addWidget(new QLabel(" "),5,0);
600 cgroup->setLayout(cLayout);
601
602 // Feed Engine
603 // -----------
604 QGridLayout* sLayout = new QGridLayout;
605 sLayout->setColumnMinimumWidth(0,14*ww);
606 _outPortLineEdit->setMaximumWidth(9*ww);
607 _waitTimeSpinBox->setMaximumWidth(9*ww);
608 _binSamplSpinBox->setMaximumWidth(9*ww);
609 _outUPortLineEdit->setMaximumWidth(9*ww);
610
611 sLayout->addWidget(new QLabel("Port"), 0, 0);
612 sLayout->addWidget(_outPortLineEdit, 0, 1);
613 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
614 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
615 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
616 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
617 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
618 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
619 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
620 sLayout->addWidget(_outUPortLineEdit, 3, 1);
621 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
622 sLayout->addWidget(new QLabel(" "),5,0);
623 sgroup->setLayout(sLayout);
624
625 // Serial Output
626 // -------------
627 QGridLayout* serLayout = new QGridLayout;
628 serLayout->setColumnMinimumWidth(0,14*ww);
629 _serialBaudRateComboBox->setMaximumWidth(9*ww);
630 _serialFlowControlComboBox->setMaximumWidth(11*ww);
631 _serialDataBitsComboBox->setMaximumWidth(5*ww);
632 _serialParityComboBox->setMaximumWidth(9*ww);
633 _serialStopBitsComboBox->setMaximumWidth(5*ww);
634 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
635 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
636
637 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
638 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
639 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
640 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
641 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
642 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
643 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
644 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
645 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
646 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
647 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
648 serLayout->addWidget(_serialParityComboBox, 3,3);
649 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
650 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
651 serLayout->addWidget(new QLabel("NMEA"), 4,0);
652 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
653 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
654 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
655 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
656 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
657 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
658
659 sergroup->setLayout(serLayout);
660
661 // Outages
662 // -------
663 QGridLayout* aLayout = new QGridLayout;
664 aLayout->setColumnMinimumWidth(0,14*ww);
665 _obsRateComboBox->setMaximumWidth(9*ww);
666 _adviseFailSpinBox->setMaximumWidth(9*ww);
667 _adviseRecoSpinBox->setMaximumWidth(9*ww);
668
669 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
670 aLayout->addWidget(_obsRateComboBox, 0, 1);
671 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
672 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
673 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
674 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
675 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
676 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
677 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
678 aLayout->addWidget(new QLabel(" "), 5, 0);
679 agroup->setLayout(aLayout);
680
681 // Miscellaneous
682 // -------------
683 QGridLayout* rLayout = new QGridLayout;
684 rLayout->setColumnMinimumWidth(0,14*ww);
685 _perfIntrComboBox->setMaximumWidth(9*ww);
686
687 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
688 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
689 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
690 rLayout->addWidget(_perfIntrComboBox, 1, 1);
691 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
692 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
693 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
694 rLayout->addWidget(new QLabel(" "), 4, 0);
695 rLayout->addWidget(new QLabel(" "), 5, 0);
696 rgroup->setLayout(rLayout);
697
698 // PPP Client
699 // ----------
700 QGridLayout* pppLayout = new QGridLayout;
701 _pppRefCrdXLineEdit->setMaximumWidth(14*ww);
702 _pppRefCrdYLineEdit->setMaximumWidth(14*ww);
703 _pppRefCrdZLineEdit->setMaximumWidth(14*ww);
704 _pppNMEAPortLineEdit->setMaximumWidth(14*ww);
705 _pppOriginComboBox->setMaximumWidth(14*ww);
706 _pppSPPComboBox->setMaximumWidth(8*ww);
707 pppLayout->setColumnMinimumWidth(0,14*ww);
708 pppLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
709 pppLayout->addWidget(_pppMountLineEdit, 0, 1, 1, 2);
710 pppLayout->addWidget(_pppSPPComboBox, 0, 4);
711 pppLayout->addWidget(new QLabel("Options"), 1, 0);
712 pppLayout->addWidget(_pppStaticCheckBox, 1, 1);
713 pppLayout->addWidget(new QLabel("Static "), 1, 2);
714 pppLayout->addWidget(_pppUsePhaseCheckBox, 1, 3);
715 pppLayout->addWidget(new QLabel("Use phase obs "), 1, 4);
716 pppLayout->addWidget(_pppEstTropoCheckBox, 1, 5);
717 pppLayout->addWidget(new QLabel("Estimate tropo "), 1, 6);
718 pppLayout->addWidget(_pppGLONASSCheckBox, 1, 7);
719 pppLayout->addWidget(new QLabel("Use GLONASS"), 1, 8);
720 pppLayout->addWidget(new QLabel("Plot origin"), 2, 0);
721 pppLayout->addWidget(_pppOriginComboBox, 2, 1, 1, 2);
722 pppLayout->addWidget(new QLabel(" "), 2, 3);
723 pppLayout->addWidget(_pppRefCrdXLineEdit, 2, 4);
724 pppLayout->addWidget(new QLabel(" "), 2, 5);
725 pppLayout->addWidget(_pppRefCrdYLineEdit, 2, 6);
726 pppLayout->addWidget(new QLabel(" "), 2, 7);
727 pppLayout->addWidget(_pppRefCrdZLineEdit, 2, 8);
728 pppLayout->addWidget(new QLabel("NMEA File (full path)"), 3, 0);
729 pppLayout->addWidget(_pppNMEALineEdit, 3, 1, 1, 6);
730 pppLayout->addWidget(new QLabel("Port"), 3, 7);
731 pppLayout->addWidget(_pppNMEAPortLineEdit, 3, 8);
732 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),4, 0,1,15);
733 pppLayout->addWidget(new QLabel(" "), 5, 0);
734 pppgroup->setLayout(pppLayout);
735
736 // Main Layout
737 // -----------
738 QGridLayout* mLayout = new QGridLayout;
739 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
740 mLayout->addWidget(_aogroup, 0,0);
741 mLayout->addWidget(_mountPointsTable, 1,0);
742 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
743 mLayout->addWidget(_loggroup, 2,0);
744
745 _canvas->setLayout(mLayout);
746
747 // Enable/Disable all Widgets
748 // --------------------------
749 slotBncTextChanged();
750
751 // Auto start
752 // ----------
753 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
754 slotGetData();
755 }
756}
757
758// Destructor
759////////////////////////////////////////////////////////////////////////////
760bncWindow::~bncWindow() {
761 delete _caster;
762}
763
764//
765////////////////////////////////////////////////////////////////////////////
766void bncWindow::populateMountPointsTable() {
767
768 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
769 _mountPointsTable->removeRow(iRow);
770 }
771
772 bncSettings settings;
773
774 QListIterator<QString> it(settings.value("mountPoints").toStringList());
775 if (!it.hasNext()) {
776 _actGetData->setEnabled(false);
777 }
778 int iRow = 0;
779 while (it.hasNext()) {
780 QStringList hlp = it.next().split(" ");
781 if (hlp.size() < 5) continue;
782 _mountPointsTable->insertRow(iRow);
783
784 QUrl url(hlp[0]);
785
786 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
787 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
788 QString nmea(hlp[4]);
789 if (hlp[5] == "S") {
790 fullPath = hlp[0].replace(0,2,"");
791 }
792 QString ntripVersion = "1";
793 if (hlp.size() >= 6) {
794 ntripVersion = (hlp[5]);
795 }
796
797 QTableWidgetItem* it;
798 it = new QTableWidgetItem(url.userInfo());
799 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
800 _mountPointsTable->setItem(iRow, 0, it);
801
802 it = new QTableWidgetItem(fullPath);
803 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
804 _mountPointsTable->setItem(iRow, 1, it);
805
806 it = new QTableWidgetItem(format);
807 _mountPointsTable->setItem(iRow, 2, it);
808
809 if (nmea == "yes") {
810 it = new QTableWidgetItem(latitude);
811 _mountPointsTable->setItem(iRow, 3, it);
812 it = new QTableWidgetItem(longitude);
813 _mountPointsTable->setItem(iRow, 4, it);
814 } else {
815 it = new QTableWidgetItem(latitude);
816 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
817 _mountPointsTable->setItem(iRow, 3, it);
818 it = new QTableWidgetItem(longitude);
819 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
820 _mountPointsTable->setItem(iRow, 4, it);
821 }
822
823 it = new QTableWidgetItem(nmea);
824 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
825 _mountPointsTable->setItem(iRow, 5, it);
826
827 it = new QTableWidgetItem(ntripVersion);
828 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
829 _mountPointsTable->setItem(iRow, 6, it);
830
831 bncTableItem* bncIt = new bncTableItem();
832 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
833 _mountPointsTable->setItem(iRow, 7, bncIt);
834
835 iRow++;
836 }
837
838 _mountPointsTable->sortItems(1);
839}
840
841// Retrieve Table
842////////////////////////////////////////////////////////////////////////////
843void bncWindow::slotAddMountPoints() {
844
845 bncSettings settings;
846 QString proxyHost = settings.value("proxyHost").toString();
847 int proxyPort = settings.value("proxyPort").toInt();
848 if (proxyHost != _proxyHostLineEdit->text() ||
849 proxyPort != _proxyPortLineEdit->text().toInt()) {
850 int iRet = QMessageBox::question(this, "Question", "Proxy options "
851 "changed. Use the new ones?",
852 QMessageBox::Yes, QMessageBox::No,
853 QMessageBox::NoButton);
854 if (iRet == QMessageBox::Yes) {
855 settings.setValue("proxyHost", _proxyHostLineEdit->text());
856 settings.setValue("proxyPort", _proxyPortLineEdit->text());
857 settings.sync();
858 }
859 }
860
861 QMessageBox msgBox;
862 msgBox.setIcon(QMessageBox::Question);
863 msgBox.setWindowTitle("Add Stream");
864 msgBox.setText("Add stream(s) coming from:");
865
866 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
867 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
868 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
869 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
870 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
871
872 msgBox.exec();
873
874 if (msgBox.clickedButton() == buttonNtrip) {
875 bncTableDlg* dlg = new bncTableDlg(this);
876 dlg->move(this->pos().x()+50, this->pos().y()+50);
877 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
878 this, SLOT(slotNewMountPoints(QStringList*)));
879 dlg->exec();
880 delete dlg;
881 } else if (msgBox.clickedButton() == buttonIP) {
882 bncIpPort* ipp = new bncIpPort(this);
883 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
884 this, SLOT(slotNewMountPoints(QStringList*)));
885 ipp->exec();
886 delete ipp;
887 } else if (msgBox.clickedButton() == buttonUDP) {
888 bncUdpPort* udp = new bncUdpPort(this);
889 connect(udp, SIGNAL(newMountPoints(QStringList*)),
890 this, SLOT(slotNewMountPoints(QStringList*)));
891 udp->exec();
892 delete udp;
893 } else if (msgBox.clickedButton() == buttonSerial) {
894 bncSerialPort* sep = new bncSerialPort(this);
895 connect(sep, SIGNAL(newMountPoints(QStringList*)),
896 this, SLOT(slotNewMountPoints(QStringList*)));
897 sep->exec();
898 delete sep;
899 } else if (msgBox.clickedButton() == buttonCancel) {
900 // Cancel
901 }
902}
903
904// Delete Selected Mount Points
905////////////////////////////////////////////////////////////////////////////
906void bncWindow::slotDeleteMountPoints() {
907
908 int nRows = _mountPointsTable->rowCount();
909 bool flg[nRows];
910 for (int iRow = 0; iRow < nRows; iRow++) {
911 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
912 flg[iRow] = true;
913 }
914 else {
915 flg[iRow] = false;
916 }
917 }
918 for (int iRow = nRows-1; iRow >= 0; iRow--) {
919 if (flg[iRow]) {
920 _mountPointsTable->removeRow(iRow);
921 }
922 }
923 _actDeleteMountPoints->setEnabled(false);
924
925 if (_mountPointsTable->rowCount() == 0) {
926 _actGetData->setEnabled(false);
927 }
928}
929
930// New Mount Points Selected
931////////////////////////////////////////////////////////////////////////////
932void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
933 int iRow = 0;
934 QListIterator<QString> it(*mountPoints);
935 while (it.hasNext()) {
936 QStringList hlp = it.next().split(" ");
937 QUrl url(hlp[0]);
938 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
939 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
940 QString nmea(hlp[4]);
941 if (hlp[5] == "S") {
942 fullPath = hlp[0].replace(0,2,"");
943 }
944 QString ntripVersion = "1";
945 if (hlp.size() >= 6) {
946 ntripVersion = (hlp[5]);
947 }
948
949 _mountPointsTable->insertRow(iRow);
950
951 QTableWidgetItem* it;
952 it = new QTableWidgetItem(url.userInfo());
953 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
954 _mountPointsTable->setItem(iRow, 0, it);
955
956 it = new QTableWidgetItem(fullPath);
957 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
958 _mountPointsTable->setItem(iRow, 1, it);
959
960 it = new QTableWidgetItem(format);
961 _mountPointsTable->setItem(iRow, 2, it);
962
963 if (nmea == "yes") {
964 it = new QTableWidgetItem(latitude);
965 _mountPointsTable->setItem(iRow, 3, it);
966 it = new QTableWidgetItem(longitude);
967 _mountPointsTable->setItem(iRow, 4, it);
968 } else {
969 it = new QTableWidgetItem(latitude);
970 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
971 _mountPointsTable->setItem(iRow, 3, it);
972 it = new QTableWidgetItem(longitude);
973 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
974 _mountPointsTable->setItem(iRow, 4, it);
975 }
976
977 it = new QTableWidgetItem(nmea);
978 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
979 _mountPointsTable->setItem(iRow, 5, it);
980
981 it = new QTableWidgetItem(ntripVersion);
982 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
983 _mountPointsTable->setItem(iRow, 6, it);
984
985 bncTableItem* bncIt = new bncTableItem();
986 _mountPointsTable->setItem(iRow, 7, bncIt);
987
988 iRow++;
989 }
990 _mountPointsTable->hideColumn(0);
991 _mountPointsTable->sortItems(1);
992 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
993 _actGetData->setEnabled(true);
994 }
995 delete mountPoints;
996}
997
998// Save Options
999////////////////////////////////////////////////////////////////////////////
1000void bncWindow::slotSaveOptions() {
1001
1002 QStringList mountPoints;
1003 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1004
1005 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1006 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1007 "@" + _mountPointsTable->item(iRow, 1)->text() );
1008
1009 mountPoints.append(url.toString() + " " +
1010 _mountPointsTable->item(iRow, 2)->text()
1011 + " " + _mountPointsTable->item(iRow, 3)->text()
1012 + " " + _mountPointsTable->item(iRow, 4)->text()
1013 + " " + _mountPointsTable->item(iRow, 5)->text()
1014 + " " + _mountPointsTable->item(iRow, 6)->text());
1015 } else {
1016 mountPoints.append(
1017 "//" + _mountPointsTable->item(iRow, 1)->text()
1018 + " " + _mountPointsTable->item(iRow, 2)->text()
1019 + " " + _mountPointsTable->item(iRow, 3)->text()
1020 + " " + _mountPointsTable->item(iRow, 4)->text()
1021 + " " + _mountPointsTable->item(iRow, 5)->text()
1022 + " " + _mountPointsTable->item(iRow, 6)->text());
1023 }
1024 }
1025
1026 bncSettings settings;
1027
1028 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1029 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1030 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1031 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1032 settings.setValue("binSampl", _binSamplSpinBox->value());
1033 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1034 settings.setValue("corrPath", _corrPathLineEdit->text());
1035 settings.setValue("corrPort", _corrPortLineEdit->text());
1036 settings.setValue("corrTime", _corrTimeSpinBox->value());
1037 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1038 settings.setValue("ephPath", _ephPathLineEdit->text());
1039 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1040 settings.setValue("logFile", _logFileLineEdit->text());
1041 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1042 settings.setValue("miscMount", _miscMountLineEdit->text());
1043 settings.setValue("pppMount", _pppMountLineEdit->text());
1044 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1045 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1046 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1047 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1048 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1049 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1050 settings.setValue("pppStatic", _pppStaticCheckBox->checkState());
1051 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1052 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1053 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1054 settings.setValue("pppOrigin", _pppOriginComboBox->currentText());
1055 settings.setValue("mountPoints", mountPoints);
1056 settings.setValue("obsRate", _obsRateComboBox->currentText());
1057 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1058 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1059 settings.setValue("outFile", _outFileLineEdit->text());
1060 settings.setValue("outPort", _outPortLineEdit->text());
1061 settings.setValue("outUPort", _outUPortLineEdit->text());
1062 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1063 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1064 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1065 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1066 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1067 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1068 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1069 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1070 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1071 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1072 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1073 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1074 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1075 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1076 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1077 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1078 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1079 settings.setValue("serialParity", _serialParityComboBox->currentText());
1080 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1081 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1082 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1083 settings.setValue("startTab", _aogroup->currentIndex());
1084 settings.setValue("statusTab", _loggroup->currentIndex());
1085 settings.setValue("waitTime", _waitTimeSpinBox->value());
1086
1087 if (_caster) {
1088 _caster->slotReadMountPoints();
1089 }
1090 settings.sync();
1091}
1092
1093// All get slots terminated
1094////////////////////////////////////////////////////////////////////////////
1095void bncWindow::slotGetThreadsFinished() {
1096 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1097 delete _caster; _caster = 0;
1098 _actGetData->setEnabled(true);
1099 _actStop->setEnabled(false);
1100}
1101
1102// Retrieve Data
1103////////////////////////////////////////////////////////////////////////////
1104void bncWindow::slotGetData() {
1105 slotSaveOptions();
1106
1107 _bncFigurePPP->reset();
1108
1109 _actDeleteMountPoints->setEnabled(false);
1110 _actGetData->setEnabled(false);
1111 _actStop->setEnabled(true);
1112
1113 _caster = new bncCaster(_outFileLineEdit->text(),
1114 _outPortLineEdit->text().toInt());
1115
1116 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1117 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1118
1119 connect(_caster, SIGNAL(getThreadsFinished()),
1120 this, SLOT(slotGetThreadsFinished()));
1121
1122 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1123 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1124
1125 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1126
1127 bncSettings settings;
1128
1129 QDir rnxdir(settings.value("rnxPath").toString());
1130 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1131
1132 QString rnx_file = settings.value("rnxScript").toString();
1133 if ( !rnx_file.isEmpty() ) {
1134 QFile rnxfile(settings.value("rnxScript").toString());
1135 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1136 }
1137
1138 QDir ephdir(settings.value("ephPath").toString());
1139 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1140
1141 QDir corrdir(settings.value("corrPath").toString());
1142 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1143
1144 QString advise_file = settings.value("adviseScript").toString();
1145 if ( !advise_file.isEmpty() ) {
1146 QFile advisefile(settings.value("adviseScript").toString());
1147 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1148 }
1149
1150 _caster->slotReadMountPoints();
1151}
1152
1153// Retrieve Data
1154////////////////////////////////////////////////////////////////////////////
1155void bncWindow::slotStop() {
1156 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1157 QMessageBox::Yes, QMessageBox::No,
1158 QMessageBox::NoButton);
1159 if (iRet == QMessageBox::Yes) {
1160 delete _caster; _caster = 0;
1161 _actGetData->setEnabled(true);
1162 _actStop->setEnabled(false);
1163 }
1164}
1165
1166// Close Application gracefully
1167////////////////////////////////////////////////////////////////////////////
1168void bncWindow::closeEvent(QCloseEvent* event) {
1169
1170 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1171 QMessageBox::Yes, QMessageBox::No,
1172 QMessageBox::Cancel);
1173
1174 if (iRet == QMessageBox::Cancel) {
1175 event->ignore();
1176 return;
1177 }
1178 else if (iRet == QMessageBox::Yes) {
1179 slotSaveOptions();
1180 }
1181
1182 QMainWindow::closeEvent(event);
1183}
1184
1185// User changed the selection of mountPoints
1186////////////////////////////////////////////////////////////////////////////
1187void bncWindow::slotSelectionChanged() {
1188 if (_mountPointsTable->selectedItems().isEmpty()) {
1189 _actDeleteMountPoints->setEnabled(false);
1190 }
1191 else {
1192 _actDeleteMountPoints->setEnabled(true);
1193 }
1194}
1195
1196// Display Program Messages
1197////////////////////////////////////////////////////////////////////////////
1198void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1199
1200#ifdef DEBUG_RTCM2_2021
1201 const int maxBufferSize = 1000;
1202#else
1203 const int maxBufferSize = 10000;
1204#endif
1205
1206 if (! showOnScreen ) {
1207 return;
1208 }
1209
1210 QString txt = _log->toPlainText() + "\n" +
1211 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1212 _log->clear();
1213 _log->append(txt.right(maxBufferSize));
1214}
1215
1216// About Message
1217////////////////////////////////////////////////////////////////////////////
1218void bncWindow::slotAbout() {
1219 new bncAboutDlg(0);
1220}
1221
1222//Flowchart
1223////////////////////////////////////////////////////////////////////////////
1224void bncWindow::slotFlowchart() {
1225 new bncFlowchartDlg(0);
1226}
1227
1228// Help Window
1229////////////////////////////////////////////////////////////////////////////
1230void bncWindow::slotHelp() {
1231 QUrl url;
1232 url.setPath(":bnchelp.html");
1233 new bncHlpDlg(0, url);
1234}
1235
1236// Select Fonts
1237////////////////////////////////////////////////////////////////////////////
1238void bncWindow::slotFontSel() {
1239 bool ok;
1240 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1241 if (ok) {
1242 bncSettings settings;
1243 settings.setValue("font", newFont.toString());
1244 QApplication::setFont(newFont);
1245 int ww = QFontMetrics(newFont).width('w');
1246 setMinimumSize(60*ww, 80*ww);
1247 resize(60*ww, 80*ww);
1248 }
1249}
1250
1251// Whats This Help
1252void bncWindow::slotWhatsThis() {
1253 QWhatsThis::enterWhatsThisMode();
1254}
1255
1256//
1257////////////////////////////////////////////////////////////////////////////
1258void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1259 _bncFigure->updateMountPoints();
1260 _bncFigureLate->updateMountPoints();
1261
1262 populateMountPointsTable();
1263 bncSettings settings;
1264 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1265 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1266 QListIterator<bncGetThread*> iTh(threads);
1267 while (iTh.hasNext()) {
1268 bncGetThread* thread = iTh.next();
1269 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1270 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1271 "@" + _mountPointsTable->item(iRow, 1)->text() );
1272 if (url == thread->mountPoint() &&
1273 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1274 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1275 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1276 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1277 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1278 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1279 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1280 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1281 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1282 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1283 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1284 if (settings.value("pppOrigin").toString() != "No plot") {
1285 disconnect(thread,
1286 SIGNAL(newPosition(bncTime, double, double, double)),
1287 _bncFigurePPP,
1288 SLOT(slotNewPosition(bncTime, double, double, double)));
1289 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1290 _bncFigurePPP,
1291 SLOT(slotNewPosition(bncTime, double, double, double)));
1292 }
1293 break;
1294 }
1295 }
1296 }
1297}
1298
1299//
1300////////////////////////////////////////////////////////////////////////////
1301void bncWindow::CreateMenu() {
1302 // Create Menus
1303 // ------------
1304 _menuFile = menuBar()->addMenu(tr("&File"));
1305 _menuFile->addAction(_actFontSel);
1306 _menuFile->addSeparator();
1307 _menuFile->addAction(_actSaveOpt);
1308 _menuFile->addSeparator();
1309 _menuFile->addAction(_actQuit);
1310
1311 _menuHlp = menuBar()->addMenu(tr("&Help"));
1312 _menuHlp->addAction(_actHelp);
1313 _menuHlp->addAction(_actFlowchart);
1314 _menuHlp->addAction(_actAbout);
1315}
1316
1317// Toolbar
1318////////////////////////////////////////////////////////////////////////////
1319void bncWindow::AddToolbar() {
1320 // Tool (Command) Bar
1321 // ------------------
1322 QToolBar* toolBar = new QToolBar;
1323 addToolBar(Qt::BottomToolBarArea, toolBar);
1324 toolBar->setMovable(false);
1325 toolBar->addAction(_actAddMountPoints);
1326 toolBar->addAction(_actDeleteMountPoints);
1327 toolBar->addAction(_actGetData);
1328 toolBar->addAction(_actStop);
1329 toolBar->addWidget(new QLabel(" "));
1330 toolBar->addAction(_actwhatsthis);
1331}
1332
1333// About
1334////////////////////////////////////////////////////////////////////////////
1335bncAboutDlg::bncAboutDlg(QWidget* parent) :
1336 QDialog(parent) {
1337
1338 QTextBrowser* tb = new QTextBrowser;
1339 QUrl url; url.setPath(":bncabout.html");
1340 tb->setSource(url);
1341 tb->setReadOnly(true);
1342
1343 int ww = QFontMetrics(font()).width('w');
1344 QPushButton* _closeButton = new QPushButton("Close");
1345 _closeButton->setMaximumWidth(10*ww);
1346 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1347
1348 QGridLayout* dlgLayout = new QGridLayout();
1349 QLabel* img = new QLabel();
1350 img->setPixmap(QPixmap(":ntrip-logo.png"));
1351 dlgLayout->addWidget(img, 0,0);
1352 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1353 dlgLayout->addWidget(tb,1,0,1,2);
1354 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1355
1356 setLayout(dlgLayout);
1357 resize(60*ww, 60*ww);
1358 setWindowTitle("About BNC");
1359 show();
1360}
1361
1362//
1363////////////////////////////////////////////////////////////////////////////
1364bncAboutDlg::~bncAboutDlg() {
1365};
1366
1367// Flowchart
1368////////////////////////////////////////////////////////////////////////////
1369bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1370 QDialog(parent) {
1371
1372 int ww = QFontMetrics(font()).width('w');
1373 QPushButton* _closeButton = new QPushButton("Close");
1374 _closeButton->setMaximumWidth(10*ww);
1375 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1376
1377 QGridLayout* dlgLayout = new QGridLayout();
1378 QLabel* img = new QLabel();
1379 img->setPixmap(QPixmap(":bncflowchart.png"));
1380 dlgLayout->addWidget(img, 0,0);
1381 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1382
1383 setLayout(dlgLayout);
1384 setWindowTitle("Flow Chart");
1385 show();
1386}
1387
1388//
1389////////////////////////////////////////////////////////////////////////////
1390bncFlowchartDlg::~bncFlowchartDlg() {
1391};
1392
1393// Bnc Text
1394////////////////////////////////////////////////////////////////////////////
1395void bncWindow::slotBncTextChanged(){
1396
1397 QPalette palette_white(QColor(255, 255, 255));
1398 QPalette palette_gray(QColor(230, 230, 230));
1399
1400 // Proxy
1401 //------
1402 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1403 if (!_proxyHostLineEdit->text().isEmpty()) {
1404 _proxyPortLineEdit->setStyleSheet("background-color: white");
1405 _proxyPortLineEdit->setEnabled(true);
1406 }
1407 else {
1408 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1409 _proxyPortLineEdit->setEnabled(false);
1410 }
1411 }
1412
1413 // RINEX Observations
1414 // ------------------
1415 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1416 if (!_rnxPathLineEdit->text().isEmpty()) {
1417 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1418 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1419 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1420 _rnxV3CheckBox->setPalette(palette_white);
1421 _rnxIntrComboBox->setStyleSheet("background-color: white");
1422 _rnxSamplSpinBox->setEnabled(true);
1423 _rnxSkelLineEdit->setEnabled(true);
1424 _rnxScrpLineEdit->setEnabled(true);
1425 _rnxV3CheckBox->setEnabled(true);
1426 _rnxIntrComboBox->setEnabled(true);
1427 }
1428 else {
1429 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1430 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1431 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1432 _rnxV3CheckBox->setPalette(palette_gray);
1433 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1434 _rnxSamplSpinBox->setEnabled(false);
1435 _rnxSkelLineEdit->setEnabled(false);
1436 _rnxScrpLineEdit->setEnabled(false);
1437 _rnxV3CheckBox->setEnabled(false);
1438 _rnxIntrComboBox->setEnabled(false);
1439 }
1440 }
1441
1442 // RINEX Ephemeris
1443 // ---------------
1444 if (sender() == 0 ||
1445 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1446 if (!_ephPathLineEdit->text().isEmpty() ||
1447 !_outEphPortLineEdit->text().isEmpty()) {
1448 _ephIntrComboBox->setStyleSheet("background-color: white");
1449 _ephV3CheckBox->setPalette(palette_white);
1450 _ephIntrComboBox->setEnabled(true);
1451 _ephV3CheckBox->setEnabled(true);
1452 }
1453 else {
1454 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1455 _ephV3CheckBox->setPalette(palette_gray);
1456 _ephIntrComboBox->setEnabled(false);
1457 _ephV3CheckBox->setEnabled(false);
1458 }
1459 }
1460
1461 // Broadcast Corrections
1462 // ---------------------
1463 if (sender() == 0 ||
1464 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1465 if (!_corrPathLineEdit->text().isEmpty() ||
1466 !_corrPortLineEdit->text().isEmpty()) {
1467 _corrIntrComboBox->setStyleSheet("background-color: white");
1468 _corrIntrComboBox->setEnabled(true);
1469 }
1470 else {
1471 _corrIntrComboBox->setStyleSheet("background-color: lightGray");
1472 _corrIntrComboBox->setEnabled(false);
1473 }
1474 }
1475
1476 // Feed Engine
1477 // -----------
1478 if (sender() == 0 ||
1479 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1480 if ( !_outPortLineEdit->text().isEmpty() ||
1481 !_outFileLineEdit->text().isEmpty()) {
1482 _waitTimeSpinBox->setStyleSheet("background-color: white");
1483 _binSamplSpinBox->setStyleSheet("background-color: white");
1484 _waitTimeSpinBox->setEnabled(true);
1485 _binSamplSpinBox->setEnabled(true);
1486 }
1487 else {
1488 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1489 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1490 _waitTimeSpinBox->setEnabled(false);
1491 _binSamplSpinBox->setEnabled(false);
1492 }
1493 }
1494
1495 // Serial Output
1496 // -------------
1497 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1498 sender() == _serialAutoNMEAComboBox) {
1499 if (!_serialMountPointLineEdit->text().isEmpty()) {
1500 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1501 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1502 _serialParityComboBox->setStyleSheet("background-color: white");
1503 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1504 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1505 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1506 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1507 _serialPortNameLineEdit->setEnabled(true);
1508 _serialBaudRateComboBox->setEnabled(true);
1509 _serialParityComboBox->setEnabled(true);
1510 _serialDataBitsComboBox->setEnabled(true);
1511 _serialStopBitsComboBox->setEnabled(true);
1512 _serialFlowControlComboBox->setEnabled(true);
1513 _serialAutoNMEAComboBox->setEnabled(true);
1514 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1515 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1516 _serialHeightNMEALineEdit->setEnabled(true);
1517 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1518 _serialFileNMEALineEdit->setEnabled(false);
1519 }
1520 else {
1521 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1522 _serialHeightNMEALineEdit->setEnabled(false);
1523 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1524 _serialFileNMEALineEdit->setEnabled(true);
1525 }
1526 }
1527 else {
1528 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1529 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1530 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1531 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1532 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1533 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1534 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1535 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1536 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1537 _serialPortNameLineEdit->setEnabled(false);
1538 _serialBaudRateComboBox->setEnabled(false);
1539 _serialParityComboBox->setEnabled(false);
1540 _serialDataBitsComboBox->setEnabled(false);
1541 _serialStopBitsComboBox->setEnabled(false);
1542 _serialFlowControlComboBox->setEnabled(false);
1543 _serialAutoNMEAComboBox->setEnabled(false);
1544 _serialHeightNMEALineEdit->setEnabled(false);
1545 _serialFileNMEALineEdit->setEnabled(false);
1546 }
1547 }
1548
1549 // Outages
1550 // -------
1551 if (sender() == 0 || sender() == _obsRateComboBox) {
1552 if (!_obsRateComboBox->currentText().isEmpty()) {
1553 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1554 _adviseFailSpinBox->setStyleSheet("background-color: white");
1555 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1556 _adviseFailSpinBox->setEnabled(true);
1557 _adviseRecoSpinBox->setEnabled(true);
1558 _adviseScriptLineEdit->setEnabled(true);
1559 } else {
1560 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1561 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1562 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1563 _adviseFailSpinBox->setEnabled(false);
1564 _adviseRecoSpinBox->setEnabled(false);
1565 _adviseScriptLineEdit->setEnabled(false);
1566 }
1567 }
1568
1569 // Miscellaneous
1570 // -------------
1571 if (sender() == 0 || sender() == _miscMountLineEdit) {
1572 if (!_miscMountLineEdit->text().isEmpty()) {
1573 _perfIntrComboBox->setStyleSheet("background-color: white");
1574 _scanRTCMCheckBox->setPalette(palette_white);
1575 _perfIntrComboBox->setEnabled(true);
1576 _scanRTCMCheckBox->setEnabled(true);
1577 } else {
1578 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1579 _scanRTCMCheckBox->setPalette(palette_gray);
1580 _perfIntrComboBox->setEnabled(false);
1581 _scanRTCMCheckBox->setEnabled(false);
1582 }
1583 }
1584
1585 // PPP Client
1586 // ----------
1587 if (sender() == 0 || sender() == _pppMountLineEdit
1588 || sender() == _pppOriginComboBox) {
1589 if (!_pppMountLineEdit->text().isEmpty()) {
1590 _pppSPPComboBox->setPalette(palette_white);
1591 _pppNMEALineEdit->setPalette(palette_white);
1592 _pppNMEAPortLineEdit->setPalette(palette_white);
1593 _pppRefCrdXLineEdit->setPalette(palette_white);
1594 _pppRefCrdYLineEdit->setPalette(palette_white);
1595 _pppRefCrdZLineEdit->setPalette(palette_white);
1596 _pppStaticCheckBox->setPalette(palette_white);
1597 _pppUsePhaseCheckBox->setPalette(palette_white);
1598 _pppEstTropoCheckBox->setPalette(palette_white);
1599 _pppGLONASSCheckBox->setPalette(palette_white);
1600 _pppOriginComboBox->setPalette(palette_white);
1601 _pppSPPComboBox->setEnabled(true);
1602 _pppNMEALineEdit->setEnabled(true);
1603 _pppNMEAPortLineEdit->setEnabled(true);
1604 _pppRefCrdXLineEdit->setEnabled(true);
1605 _pppRefCrdYLineEdit->setEnabled(true);
1606 _pppRefCrdZLineEdit->setEnabled(true);
1607 _pppStaticCheckBox->setEnabled(true);
1608 _pppUsePhaseCheckBox->setEnabled(true);
1609 _pppEstTropoCheckBox->setEnabled(true);
1610 _pppGLONASSCheckBox->setEnabled(true);
1611 _pppOriginComboBox->setEnabled(true);
1612 if (_pppOriginComboBox->currentText() == "X Y Z" ) {
1613 _pppRefCrdXLineEdit->setPalette(palette_white);
1614 _pppRefCrdXLineEdit->setEnabled(true);
1615 _pppRefCrdYLineEdit->setPalette(palette_white);
1616 _pppRefCrdYLineEdit->setEnabled(true);
1617 _pppRefCrdZLineEdit->setPalette(palette_white);
1618 _pppRefCrdZLineEdit->setEnabled(true);
1619 }
1620 else {
1621 _pppRefCrdXLineEdit->setPalette(palette_gray);
1622 _pppRefCrdXLineEdit->setEnabled(false);
1623 _pppRefCrdYLineEdit->setPalette(palette_gray);
1624 _pppRefCrdYLineEdit->setEnabled(false);
1625 _pppRefCrdZLineEdit->setPalette(palette_gray);
1626 _pppRefCrdZLineEdit->setEnabled(false);
1627 }
1628 } else {
1629 _pppSPPComboBox->setPalette(palette_gray);
1630 _pppNMEALineEdit->setPalette(palette_gray);
1631 _pppNMEAPortLineEdit->setPalette(palette_gray);
1632 _pppRefCrdXLineEdit->setPalette(palette_gray);
1633 _pppRefCrdYLineEdit->setPalette(palette_gray);
1634 _pppRefCrdZLineEdit->setPalette(palette_gray);
1635 _pppStaticCheckBox->setPalette(palette_gray);
1636 _pppUsePhaseCheckBox->setPalette(palette_gray);
1637 _pppEstTropoCheckBox->setPalette(palette_gray);
1638 _pppGLONASSCheckBox->setPalette(palette_gray);
1639 _pppOriginComboBox->setPalette(palette_gray);
1640 _pppSPPComboBox->setEnabled(false);
1641 _pppNMEALineEdit->setEnabled(false);
1642 _pppNMEAPortLineEdit->setEnabled(false);
1643 _pppRefCrdXLineEdit->setEnabled(false);
1644 _pppRefCrdYLineEdit->setEnabled(false);
1645 _pppRefCrdZLineEdit->setEnabled(false);
1646 _pppStaticCheckBox->setEnabled(false);
1647 _pppUsePhaseCheckBox->setEnabled(false);
1648 _pppEstTropoCheckBox->setEnabled(false);
1649 _pppGLONASSCheckBox->setEnabled(false);
1650 _pppOriginComboBox->setEnabled(false);
1651 }
1652 }
1653}
Note: See TracBrowser for help on using the repository browser.