source: ntrip/trunk/BNC/src/bncwindow.cpp@ 5865

Last change on this file since 5865 was 5865, checked in by mervart, 10 years ago
File size: 122.3 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bnccore.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#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "reqcdlg.h"
65#include "bncmap.h"
66#ifdef QT_WEBKIT
67# include "map/bncmapwin.h"
68#endif
69#ifdef USE_POSTPROCESSING
70# include "rinex/reqcedit.h"
71# include "rinex/reqcanalyze.h"
72#endif
73
74#include "PPP/pppMain.h"
75
76using namespace std;
77
78#ifdef GNSSCENTER_PLUGIN
79Q_EXPORT_PLUGIN2(gnsscenter_bnc, t_bncFactory)
80#endif
81
82// Constructor
83////////////////////////////////////////////////////////////////////////////
84bncWindow::bncWindow() {
85
86#ifdef GNSSCENTER_PLUGIN
87 BNC_CORE->setConfFileName("");
88#endif
89
90 _caster = 0;
91 _casterEph = 0;
92
93 _bncFigure = new bncFigure(this);
94 _bncFigureLate = new bncFigureLate(this);
95 _bncFigurePPP = new bncFigurePPP(this);
96 _runningRealTime = false;
97 _runningPostProcessingReqc = false;
98 _pppMain = new BNC_PPP::t_pppMain();
99 _reqcActionComboBox = 0; // necessary for enableStartStop()
100
101 _mapWin = 0;
102
103 int ww = QFontMetrics(this->font()).width('w');
104
105 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
106
107 setMinimumSize(85*ww, 65*ww);
108
109 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
110
111 connect(BNC_CORE, SIGNAL(newMessage(QByteArray,bool)),
112 this, SLOT(slotWindowMessage(QByteArray,bool)));
113
114 // Create Actions
115 // --------------
116 _actHelp = new QAction(tr("&Help Contents"),this);
117 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
118
119 _actAbout = new QAction(tr("&About BNC"),this);
120 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
121
122 _actFlowchart = new QAction(tr("&Flow Chart"),this);
123 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
124
125 _actFontSel = new QAction(tr("Select &Font"),this);
126 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
127
128 _actSaveOpt = new QAction(tr("&Reread && Save Configuration"),this);
129 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
130
131 _actQuit = new QAction(tr("&Quit"),this);
132 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
133
134 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
135 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
136
137 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
138 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
139 _actDeleteMountPoints->setEnabled(false);
140
141 _actMapMountPoints = new QAction(tr("&Map"),this);
142 connect(_actMapMountPoints, SIGNAL(triggered()), SLOT(slotMapMountPoints()));
143
144 _actStart = new QAction(tr("Sta&rt"),this);
145 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
146
147 _actStop = new QAction(tr("Sto&p"),this);
148 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
149
150 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
151 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
152
153 CreateMenu();
154 AddToolbar();
155
156 bncSettings settings;
157
158 // Network Options
159 // ---------------
160 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
161 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
162
163 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
164 this, SLOT(slotBncTextChanged()));
165
166 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
167 _ignoreSslErrorsCheckBox = new QCheckBox();
168 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
169 settings.value("ignoreSslErrors").toInt()));
170
171 // General Options
172 // ---------------
173 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
174 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
175 _rnxAppendCheckBox = new QCheckBox();
176 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
177 settings.value("rnxAppend").toInt()));
178 _onTheFlyComboBox = new QComboBox();
179 _onTheFlyComboBox->setEditable(false);
180 _onTheFlyComboBox->addItems(QString("1 day,1 hour,5 min,1 min").split(","));
181 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
182 if (ii != -1) {
183 _onTheFlyComboBox->setCurrentIndex(ii);
184 }
185 _autoStartCheckBox = new QCheckBox();
186 _autoStartCheckBox->setCheckState(Qt::CheckState(
187 settings.value("autoStart").toInt()));
188
189 // RINEX Observations Options
190 // --------------------------
191 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
192 _rnxIntrComboBox = new QComboBox();
193 _rnxIntrComboBox->setEditable(false);
194 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
195 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
196 if (ii != -1) {
197 _rnxIntrComboBox->setCurrentIndex(ii);
198 }
199 _rnxSamplSpinBox = new QSpinBox();
200 _rnxSamplSpinBox->setMinimum(0);
201 _rnxSamplSpinBox->setMaximum(60);
202 _rnxSamplSpinBox->setSingleStep(5);
203 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
204 _rnxSamplSpinBox->setSuffix(" sec");
205 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
206 _rnxSkelLineEdit->setMaximumWidth(5*ww);
207 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
208 _rnxV3CheckBox = new QCheckBox();
209 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
210
211 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
212 this, SLOT(slotBncTextChanged()));
213
214 // RINEX Ephemeris Options
215 // -----------------------
216 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
217 _ephIntrComboBox = new QComboBox();
218 _ephIntrComboBox->setEditable(false);
219 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
220 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
221 if (jj != -1) {
222 _ephIntrComboBox->setCurrentIndex(jj);
223 }
224 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
225 _ephV3CheckBox = new QCheckBox();
226 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
227
228 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
229 this, SLOT(slotBncTextChanged()));
230
231 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
232 this, SLOT(slotBncTextChanged()));
233
234 // Broadcast Corrections Options
235 // -----------------------------
236 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
237 _corrIntrComboBox = new QComboBox();
238 _corrIntrComboBox->setEditable(false);
239 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
240 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
241 if (mm != -1) {
242 _corrIntrComboBox->setCurrentIndex(mm);
243 }
244 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
245 _corrTimeSpinBox = new QSpinBox();
246 _corrTimeSpinBox->setMinimum(0);
247 _corrTimeSpinBox->setMaximum(60);
248 _corrTimeSpinBox->setSingleStep(1);
249 _corrTimeSpinBox->setSuffix(" sec");
250 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
251
252 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
253 this, SLOT(slotBncTextChanged()));
254
255 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
256 this, SLOT(slotBncTextChanged()));
257
258 // Feed Engine Options
259 // -------------------
260 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
261 _waitTimeSpinBox = new QSpinBox();
262 _waitTimeSpinBox->setMinimum(1);
263 _waitTimeSpinBox->setMaximum(30);
264 _waitTimeSpinBox->setSingleStep(1);
265 _waitTimeSpinBox->setSuffix(" sec");
266 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
267 _binSamplSpinBox = new QSpinBox();
268 _binSamplSpinBox->setMinimum(0);
269 _binSamplSpinBox->setMaximum(60);
270 _binSamplSpinBox->setSingleStep(5);
271 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
272 _binSamplSpinBox->setSuffix(" sec");
273 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
274 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
275
276 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
277 this, SLOT(slotBncTextChanged()));
278
279 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
280 this, SLOT(slotBncTextChanged()));
281
282 // Serial Output Options
283 // ---------------------
284 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
285 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
286 _serialBaudRateComboBox = new QComboBox();
287 _serialBaudRateComboBox->addItems(QString("110,300,600,"
288 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
289 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
290 if (kk != -1) {
291 _serialBaudRateComboBox->setCurrentIndex(kk);
292 }
293 _serialFlowControlComboBox = new QComboBox();
294 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
295 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
296 if (kk != -1) {
297 _serialFlowControlComboBox->setCurrentIndex(kk);
298 }
299 _serialDataBitsComboBox = new QComboBox();
300 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
301 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
302 if (kk != -1) {
303 _serialDataBitsComboBox->setCurrentIndex(kk);
304 }
305 _serialParityComboBox = new QComboBox();
306 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
307 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
308 if (kk != -1) {
309 _serialParityComboBox->setCurrentIndex(kk);
310 }
311 _serialStopBitsComboBox = new QComboBox();
312 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
313 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
314 if (kk != -1) {
315 _serialStopBitsComboBox->setCurrentIndex(kk);
316 }
317 _serialAutoNMEAComboBox = new QComboBox();
318 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
319 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
320 if (kk != -1) {
321 _serialAutoNMEAComboBox->setCurrentIndex(kk);
322 }
323 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
324 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
325
326 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
327 this, SLOT(slotBncTextChanged()));
328
329 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
330 this, SLOT(slotBncTextChanged()));
331
332 // Outages Options
333 // ---------------
334 _obsRateComboBox = new QComboBox();
335 _obsRateComboBox->setEditable(false);
336 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
337 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
338 if (kk != -1) {
339 _obsRateComboBox->setCurrentIndex(kk);
340 }
341 _adviseFailSpinBox = new QSpinBox();
342 _adviseFailSpinBox->setMinimum(0);
343 _adviseFailSpinBox->setMaximum(60);
344 _adviseFailSpinBox->setSingleStep(1);
345 _adviseFailSpinBox->setSuffix(" min");
346 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
347 _adviseRecoSpinBox = new QSpinBox();
348 _adviseRecoSpinBox->setMinimum(0);
349 _adviseRecoSpinBox->setMaximum(60);
350 _adviseRecoSpinBox->setSingleStep(1);
351 _adviseRecoSpinBox->setSuffix(" min");
352 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
353 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
354
355 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
356 this, SLOT(slotBncTextChanged()));
357
358 // Miscellaneous Options
359 // ---------------------
360 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
361 _miscPortLineEdit = new QLineEdit(settings.value("miscPort").toString());
362 _perfIntrComboBox = new QComboBox();
363 _perfIntrComboBox->setEditable(false);
364 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
365 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
366 if (ll != -1) {
367 _perfIntrComboBox->setCurrentIndex(ll);
368 }
369 _scanRTCMCheckBox = new QCheckBox();
370 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
371 settings.value("scanRTCM").toInt()));
372
373 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
374 this, SLOT(slotBncTextChanged()));
375
376 // Streams
377 // -------
378 _mountPointsTable = new QTableWidget(0,8);
379
380 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
381 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
382 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
383 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
384 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
385 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
386 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
387 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
388 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
389 _mountPointsTable->setHorizontalHeaderLabels(labels);
390 _mountPointsTable->setGridStyle(Qt::NoPen);
391 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
392 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
393 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
394 _mountPointsTable->hideColumn(0);
395 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
396 SLOT(slotSelectionChanged()));
397 populateMountPointsTable();
398
399 _log = new QTextBrowser();
400 _log->setReadOnly(true);
401
402 // Combine Corrections
403 // -------------------
404 _cmbTable = new QTableWidget(0,3);
405 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
406 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
407 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
408 _cmbTable->setMaximumWidth(30*ww);
409 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
410 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
411 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
412 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
413 _cmbTable->horizontalHeader()->setStretchLastSection(true);
414 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
415
416 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
417
418 _cmbSamplSpinBox = new QSpinBox;
419 _cmbSamplSpinBox->setMinimum(10);
420 _cmbSamplSpinBox->setMaximum(60);
421 _cmbSamplSpinBox->setSingleStep(10);
422 _cmbSamplSpinBox->setMaximumWidth(9*ww);
423 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
424 _cmbSamplSpinBox->setSuffix(" sec");
425
426 QPushButton* addCmbRowButton = new QPushButton("Add Row");
427 QPushButton* delCmbRowButton = new QPushButton("Delete");
428
429 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
430 SLOT(slotBncTextChanged()));
431
432 _cmbMethodComboBox = new QComboBox();
433 _cmbMethodComboBox->setEditable(false);
434 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
435 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
436 if (im != -1) {
437 _cmbMethodComboBox->setCurrentIndex(im);
438 }
439
440 int iRow = _cmbTable->rowCount();
441 if (iRow > 0) {
442 enableWidget(true, _cmbMethodComboBox);
443 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
444 _cmbMaxresLineEdit->setEnabled(true);
445 _cmbSamplSpinBox->setEnabled(true);
446 }
447 else {
448 enableWidget(false, _cmbMethodComboBox);
449 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
450 _cmbMaxresLineEdit->setEnabled(false);
451 _cmbSamplSpinBox->setEnabled(false);
452 }
453
454 // Upload Results
455 // -------------
456 _uploadTable = new QTableWidget(0,12);
457 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, PID, SID, IOD, bytes").split(","));
458 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
459 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
460 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
461 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
462 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
463 _uploadTable->horizontalHeader()->resizeSection( 3, 8*ww);
464 _uploadTable->horizontalHeader()->resizeSection( 4,11*ww);
465 _uploadTable->horizontalHeader()->resizeSection( 5, 4*ww);
466 _uploadTable->horizontalHeader()->resizeSection( 6,15*ww);
467 _uploadTable->horizontalHeader()->resizeSection( 7,15*ww);
468 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
469 _uploadTable->horizontalHeader()->resizeSection( 9, 4*ww);
470 _uploadTable->horizontalHeader()->resizeSection(10, 4*ww);
471 _uploadTable->horizontalHeader()->resizeSection(11,12*ww);
472 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
473 _uploadTable->horizontalHeader()->setStretchLastSection(true);
474 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
475
476 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
477 SLOT(slotBncTextChanged()));
478
479 QPushButton* addUploadRowButton = new QPushButton("Add Row");
480 QPushButton* delUploadRowButton = new QPushButton("Del Row");
481 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
482 _uploadIntrComboBox = new QComboBox;
483 _uploadIntrComboBox->setEditable(false);
484 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
485 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
486 if (ii != -1) {
487 _uploadIntrComboBox->setCurrentIndex(ii);
488 }
489
490 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
491 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
492 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
493 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
494 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
495 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
496 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
497
498 _uploadSamplSp3SpinBox = new QSpinBox;
499 _uploadSamplSp3SpinBox->setMinimum(0);
500 _uploadSamplSp3SpinBox->setMaximum(15);
501 _uploadSamplSp3SpinBox->setSingleStep(1);
502 _uploadSamplSp3SpinBox->setMaximumWidth(9*ww);
503 _uploadSamplSp3SpinBox->setValue(settings.value("uploadSamplSp3").toInt());
504 _uploadSamplSp3SpinBox->setSuffix(" min");
505
506 _uploadSamplClkRnxSpinBox = new QSpinBox;
507 _uploadSamplClkRnxSpinBox->setMinimum(0);
508 _uploadSamplClkRnxSpinBox->setMaximum(60);
509 _uploadSamplClkRnxSpinBox->setSingleStep(5);
510 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
511 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
512 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
513
514 int iRowT = _uploadTable->rowCount();
515 if (iRowT > 0) {
516 enableWidget(true, _uploadIntrComboBox);
517 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
518 enableWidget(true, _uploadSamplSp3SpinBox);
519 enableWidget(true, _uploadSamplClkRnxSpinBox);
520 }
521 else {
522 enableWidget(false, _uploadIntrComboBox);
523 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
524 enableWidget(false, _uploadSamplSp3SpinBox);
525 enableWidget(false, _uploadSamplClkRnxSpinBox);
526 }
527
528 // Upload RTCM3 Ephemeris
529 // ----------------------
530 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
531 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
532 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
533 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
534 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
535 _uploadEphSampleSpinBox = new QSpinBox;
536 _uploadEphSampleSpinBox->setMinimum(5);
537 _uploadEphSampleSpinBox->setMaximum(60);
538 _uploadEphSampleSpinBox->setSingleStep(5);
539 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
540 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
541 _uploadEphSampleSpinBox->setSuffix(" sec");
542 _uploadEphBytesCounter = new bncBytesCounter;
543
544 // Canvas with Editable Fields
545 // ---------------------------
546 _canvas = new QWidget;
547 setCentralWidget(_canvas);
548
549 _aogroup = new QTabWidget();
550 QWidget* pgroup = new QWidget();
551 QWidget* ggroup = new QWidget();
552 QWidget* sgroup = new QWidget();
553 QWidget* egroup = new QWidget();
554 QWidget* agroup = new QWidget();
555 QWidget* cgroup = new QWidget();
556 QWidget* ogroup = new QWidget();
557 QWidget* rgroup = new QWidget();
558 QWidget* sergroup = new QWidget();
559 QWidget* pppGroup1 = new QWidget();
560 QWidget* pppGroup2 = new QWidget();
561 QWidget* pppGroup3 = new QWidget();
562 QWidget* pppGroup4 = new QWidget();
563 QWidget* reqcgroup = new QWidget();
564 QWidget* cmbgroup = new QWidget();
565 QWidget* uploadgroup = new QWidget();
566 QWidget* uploadEphgroup = new QWidget();
567 _aogroup->addTab(pgroup,tr("Network"));
568 _aogroup->addTab(ggroup,tr("General"));
569 _aogroup->addTab(ogroup,tr("RINEX Observations"));
570 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
571 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
572 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
573 _aogroup->addTab(sgroup,tr("Feed Engine"));
574 _aogroup->addTab(sergroup,tr("Serial Output"));
575 _aogroup->addTab(agroup,tr("Outages"));
576 _aogroup->addTab(rgroup,tr("Miscellaneous"));
577 _aogroup->addTab(pppGroup1,tr("PPP (1)"));
578 _aogroup->addTab(pppGroup2,tr("PPP (2)"));
579 _aogroup->addTab(pppGroup3,tr("PPP (3)"));
580 _aogroup->addTab(pppGroup4,tr("PPP (4)"));
581
582#ifdef USE_COMBINATION
583 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
584#endif
585 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
586 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
587
588 // Log Tab
589 // -------
590 _loggroup = new QTabWidget();
591 _loggroup->addTab(_log,tr("Log"));
592 _loggroup->addTab(_bncFigure,tr("Throughput"));
593 _loggroup->addTab(_bncFigureLate,tr("Latency"));
594 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
595
596 // Netowork (Proxy and SSL) Tab
597 // ----------------------------
598 QGridLayout* pLayout = new QGridLayout;
599 pLayout->setColumnMinimumWidth(0,13*ww);
600 _proxyPortLineEdit->setMaximumWidth(9*ww);
601
602 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
603 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
604 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
605 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
606 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
607 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
608 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
609 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
610 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
611 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
612 pLayout->addWidget(new QLabel(" "), 4, 0);
613 pLayout->addWidget(new QLabel(" "), 5, 0);
614 pLayout->addWidget(new QLabel(" "), 6, 0);
615 pgroup->setLayout(pLayout);
616
617 // General Tab
618 // -----------
619 QGridLayout* gLayout = new QGridLayout;
620 gLayout->setColumnMinimumWidth(0,14*ww);
621 _onTheFlyComboBox->setMaximumWidth(9*ww);
622
623 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
624 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
625 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
626 gLayout->addWidget(new QLabel("Append files"), 2, 0);
627 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
628 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
629 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
630 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
631 gLayout->addWidget(_autoStartCheckBox, 4, 1);
632 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
633 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
634 gLayout->addWidget(new QLabel(" "), 6, 0);
635 ggroup->setLayout(gLayout);
636
637 // RINEX Observations
638 // ------------------
639 QGridLayout* oLayout = new QGridLayout;
640 oLayout->setColumnMinimumWidth(0,14*ww);
641 _rnxIntrComboBox->setMaximumWidth(9*ww);
642 _rnxSamplSpinBox->setMaximumWidth(9*ww);
643
644 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
645 oLayout->addWidget(new QLabel("Directory"), 1, 0);
646 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
647 oLayout->addWidget(new QLabel("Interval"), 2, 0);
648 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
649 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
650 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
651 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
652 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
653 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
654 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
655 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
656 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
657 oLayout->addWidget(new QLabel(" "), 6, 0);
658 ogroup->setLayout(oLayout);
659
660 // RINEX Ephemeris
661 // ---------------
662 QGridLayout* eLayout = new QGridLayout;
663 eLayout->setColumnMinimumWidth(0,14*ww);
664 _ephIntrComboBox->setMaximumWidth(9*ww);
665 _outEphPortLineEdit->setMaximumWidth(9*ww);
666
667 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
668 eLayout->addWidget(new QLabel("Directory"), 1, 0);
669 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
670 eLayout->addWidget(new QLabel("Interval"), 2, 0);
671 eLayout->addWidget(_ephIntrComboBox, 2, 1);
672 eLayout->addWidget(new QLabel("Port"), 3, 0);
673 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
674 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
675 eLayout->addWidget(_ephV3CheckBox, 4, 1);
676 eLayout->addWidget(new QLabel(" "), 5, 0);
677 eLayout->addWidget(new QLabel(" "), 6, 0);
678 egroup->setLayout(eLayout);
679
680
681 // Broadcast Corrections
682 // ---------------------
683 QGridLayout* cLayout = new QGridLayout;
684 cLayout->setColumnMinimumWidth(0,14*ww);
685 _corrIntrComboBox->setMaximumWidth(9*ww);
686 _corrPortLineEdit->setMaximumWidth(9*ww);
687 _corrTimeSpinBox->setMaximumWidth(9*ww);
688
689 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
690 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
691 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
692 cLayout->addWidget(new QLabel("Interval"), 2, 0);
693 cLayout->addWidget(_corrIntrComboBox, 2, 1);
694 cLayout->addWidget(new QLabel("Port"), 3, 0);
695 cLayout->addWidget(_corrPortLineEdit, 3, 1);
696 cLayout->addWidget(new QLabel(" Wait for full corr epoch"), 3, 2, Qt::AlignRight);
697 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
698 cLayout->addWidget(new QLabel(" "), 4, 0);
699 cLayout->addWidget(new QLabel(" "), 5, 0);
700 cLayout->addWidget(new QLabel(" "), 6, 0);
701 cgroup->setLayout(cLayout);
702
703 // Feed Engine
704 // -----------
705 QGridLayout* sLayout = new QGridLayout;
706 sLayout->setColumnMinimumWidth(0,14*ww);
707 _outPortLineEdit->setMaximumWidth(9*ww);
708 _waitTimeSpinBox->setMaximumWidth(9*ww);
709 _binSamplSpinBox->setMaximumWidth(9*ww);
710 _outUPortLineEdit->setMaximumWidth(9*ww);
711
712 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine."),0,0,1,50);
713 sLayout->addWidget(new QLabel("Port"), 1, 0);
714 sLayout->addWidget(_outPortLineEdit, 1, 1);
715 sLayout->addWidget(new QLabel("Wait for full obs epoch"), 1, 2, Qt::AlignRight);
716 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
717 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
718 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
719 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
720 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
721 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
722 sLayout->addWidget(_outUPortLineEdit, 4, 1);
723 sLayout->addWidget(new QLabel(" "), 5, 0);
724 sLayout->addWidget(new QLabel(" "), 6, 0);
725 sgroup->setLayout(sLayout);
726
727 // Serial Output
728 // -------------
729 QGridLayout* serLayout = new QGridLayout;
730 serLayout->setColumnMinimumWidth(0,14*ww);
731 _serialBaudRateComboBox->setMaximumWidth(9*ww);
732 _serialFlowControlComboBox->setMaximumWidth(11*ww);
733 _serialDataBitsComboBox->setMaximumWidth(5*ww);
734 _serialParityComboBox->setMaximumWidth(9*ww);
735 _serialStopBitsComboBox->setMaximumWidth(5*ww);
736 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
737 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
738
739 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
740 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
741 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
742 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
743 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
744 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
745 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
746 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
747 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
748 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
749 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
750 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
751 serLayout->addWidget(_serialParityComboBox, 4, 3);
752 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
753 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
754 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
755 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
756 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
757 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
758 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
759 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
760 serLayout->addWidget(new QLabel(" "), 6, 0);
761
762 sergroup->setLayout(serLayout);
763
764 // Outages
765 // -------
766 QGridLayout* aLayout = new QGridLayout;
767 aLayout->setColumnMinimumWidth(0,14*ww);
768 _obsRateComboBox->setMaximumWidth(9*ww);
769 _adviseFailSpinBox->setMaximumWidth(9*ww);
770 _adviseRecoSpinBox->setMaximumWidth(9*ww);
771
772 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
773 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
774 aLayout->addWidget(_obsRateComboBox, 1, 1);
775 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
776 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
777 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
778 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
779 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
780 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
781 aLayout->addWidget(new QLabel(" "), 5, 0);
782 aLayout->addWidget(new QLabel(" "), 6, 0);
783 agroup->setLayout(aLayout);
784
785 // Miscellaneous
786 // -------------
787 QGridLayout* rLayout = new QGridLayout;
788 rLayout->setColumnMinimumWidth(0,14*ww);
789 _perfIntrComboBox->setMaximumWidth(9*ww);
790 _miscPortLineEdit->setMaximumWidth(9*ww);
791
792 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for message types and antenna information or output raw data through TCP/IP port."),0, 0,1,30);
793 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
794 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
795 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
796 rLayout->addWidget(_perfIntrComboBox, 2, 1);
797 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
798 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
799 rLayout->addWidget(new QLabel("Port"), 4, 0);
800 rLayout->addWidget(_miscPortLineEdit, 4, 1);
801 rLayout->addWidget(new QLabel(" "), 5, 0);
802 rLayout->addWidget(new QLabel(" "), 6, 0);
803 rgroup->setLayout(rLayout);
804
805 // PPP
806 // ---
807 QGridLayout* pppLayout1 = new QGridLayout();
808 int ir = 0;
809 pppLayout1->addWidget(new QLabel("<b>Precise Point Positioning (Input and Output)</b>"), ir, 0, 1, 7, Qt::AlignLeft);
810 ++ir;
811 pppLayout1->addWidget(new QLabel("Data Source"), ir, 0, Qt::AlignLeft);
812 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
813 pppLayout1->addItem(new QSpacerItem(4*ww, 0), ir, 2);
814 pppLayout1->addWidget(new QLabel("RINEX Observations"), ir, 3, Qt::AlignLeft);
815 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 4, 1, 2);
816 ++ir;
817 pppLayout1->addWidget(new QLabel("RINEX Orbits"), ir, 3, Qt::AlignLeft);
818 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 4, 1, 2);
819 ++ir;
820 pppLayout1->addWidget(new QLabel("Corrections"), ir, 0, Qt::AlignLeft);
821 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
822 pppLayout1->addWidget(new QLabel("Corrections"), ir, 3, Qt::AlignLeft);
823 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 4, 1, 2);
824 ++ir;
825 pppLayout1->addWidget(new QLabel("<b>Input</b>"), ir, 0, Qt::AlignLeft);
826 pppLayout1->addWidget(new QLabel("<b>Output</b>"), ir, 4, 1, 2, Qt::AlignLeft);
827 ++ir;
828 pppLayout1->addWidget(new QLabel("Coordinates"), ir, 0, Qt::AlignLeft);
829 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 1, 1, 2);
830 pppLayout1->addWidget(new QLabel("Log File"), ir, 4, Qt::AlignLeft);
831 pppLayout1->addWidget(_pppWidgets._logFile, ir, 5);
832 ++ir;
833 pppLayout1->addWidget(new QLabel("ANTEX"), ir, 0, Qt::AlignLeft);
834 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1, 1, 2);
835 pppLayout1->addWidget(new QLabel("NMEA File"), ir, 4, Qt::AlignLeft);
836 pppLayout1->addWidget(_pppWidgets._nmeaFile, ir, 5);
837 pppLayout1->addWidget(new QLabel("Port"), ir, 6, Qt::AlignLeft);
838 pppLayout1->addWidget(_pppWidgets._nmeaPort, ir, 7);
839
840 pppGroup1->setLayout(pppLayout1);
841
842 QVBoxLayout* pppLayout2 = new QVBoxLayout();
843 pppLayout2->addWidget(new QLabel("<b>Precise Point Positioning (Processed Stations)</b>"));
844 pppLayout2->addWidget(_pppWidgets._staTable, 99);
845 QHBoxLayout* pppLayout2sub = new QHBoxLayout();
846 pppLayout2sub->addWidget(_pppWidgets._addStaButton);
847 pppLayout2sub->addWidget(_pppWidgets._delStaButton);
848 pppLayout2sub->addStretch(99);
849
850 pppLayout2->addLayout(pppLayout2sub);
851
852 pppGroup2->setLayout(pppLayout2);
853
854 QGridLayout* pppLayout3 = new QGridLayout();
855 ir = 0;
856 pppLayout3->addWidget(new QLabel("<b>Precise Point Positioning (Options)</b>"), ir, 0, 1, 2, Qt::AlignLeft);
857 ++ir;
858 pppLayout3->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
859 pppLayout3->addWidget(_pppWidgets._lcGPS, ir, 1);
860 pppLayout3->addItem(new QSpacerItem(4*ww, 0), ir, 2);
861 pppLayout3->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
862 pppLayout3->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
863 pppLayout3->addWidget(new QLabel("Sigma L1"), ir, 5, Qt::AlignLeft);
864 pppLayout3->addWidget(_pppWidgets._sigmaL1, ir, 6); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
865 ++ir;
866 pppLayout3->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
867 pppLayout3->addWidget(_pppWidgets._lcGLONASS, ir, 1);
868 ++ir;
869 pppLayout3->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
870 pppLayout3->addWidget(_pppWidgets._lcGalileo, ir, 1);
871 ++ir;
872 pppLayout3->addWidget(new QLabel("Wait for corrections"), ir, 0, Qt::AlignLeft);
873 pppLayout3->addWidget(_pppWidgets._corrWaitTime, ir, 1);
874 ++ir;
875 pppLayout3->addWidget(new QLabel(""), ir, 0);
876
877 pppGroup3->setLayout(pppLayout3);
878
879 // ------------------------
880 QVBoxLayout* pppLayout4 = new QVBoxLayout;
881 pppLayout4->addWidget(new QLabel("Precise Point Positioning, Panel 3."));
882 pppLayout4->addSpacing(ww);
883
884 QHBoxLayout* pppLayout4Hlp1 = new QHBoxLayout;
885 _pppPlotCoordinates = new QCheckBox();
886 _pppPlotCoordinates->setCheckState(Qt::CheckState(settings.value("pppPlotCoordinates").toInt()));
887 pppLayout4Hlp1->addWidget(new QLabel("PPP Plot "));
888 pppLayout4Hlp1->addWidget(_pppPlotCoordinates);
889 pppLayout4Hlp1->addWidget(new QLabel("Nort-East-Up Time Series"));
890 pppLayout4Hlp1->addStretch();
891 pppLayout4->addLayout(pppLayout4Hlp1);
892 pppLayout4->addSpacing(ww);
893
894 QHBoxLayout* pppLayout4Hlp2 = new QHBoxLayout;
895 pppLayout4Hlp2->addWidget(new QLabel("Track Plot "));
896 _mapWinButton = new QPushButton;
897 _mapWinButton->setText("Open Map");
898 connect(_mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
899 pppLayout4Hlp2->addWidget(_mapWinButton);
900
901 pppLayout4Hlp2->addSpacing(1*ww);
902
903 _gmRadioButton = new QRadioButton;
904 _gmRadioButton->setChecked(!settings.value("useOsmMap").toBool());
905 pppLayout4Hlp2->addWidget(new QLabel("Google"));
906 pppLayout4Hlp2->addWidget(_gmRadioButton);
907
908 _osmRadioButton = new QRadioButton;
909 _osmRadioButton->setChecked(settings.value("useOsmMap").toBool());
910 pppLayout4Hlp2->addWidget(new QLabel("OSM"));
911 pppLayout4Hlp2->addWidget(_osmRadioButton);
912
913 pppLayout4Hlp2->addSpacing(3*ww);
914
915 _mapWinDotSizeLineEdit = new QLineEdit(settings.value("mapWinDotSize").toString());
916 pppLayout4Hlp2->addWidget(new QLabel("Dot Size"));
917 _mapWinDotSizeLineEdit->setMaximumWidth(5*ww);
918 pppLayout4Hlp2->addWidget(_mapWinDotSizeLineEdit);
919
920 pppLayout4Hlp2->addSpacing(3*ww);
921
922 _mapWinDotColorComboBox = new QComboBox();
923 pppLayout4Hlp2->addWidget(new QLabel("Dot Color"));
924 _mapWinDotColorComboBox->setEditable(false);
925 _mapWinDotColorComboBox->addItems(QString("red,yellow").split(","));
926 ii = _mapWinDotColorComboBox->findText(settings.value("mapWinDotColor").toString());
927 if (ii != -1) {
928 _mapWinDotColorComboBox->setCurrentIndex(ii);
929 }
930 pppLayout4Hlp2->addWidget(_mapWinDotColorComboBox);
931
932 pppLayout4Hlp2->addSpacing(3*ww);
933
934 _mapSpeedSlider = new QSlider;
935 _mapSpeedSlider->setOrientation(Qt::Horizontal);
936 _mapSpeedSlider->setRange(1, 100);
937 _mapSpeedSlider->setTickPosition(QSlider::TicksBelow);
938 _mapSpeedSlider->setTickInterval(10);
939 int speed = settings.value("mapSpeed").toInt();
940 if (speed == 0) speed = _mapSpeedSlider->maximum();
941 _mapSpeedSlider->setSliderPosition(speed);
942 pppLayout4Hlp2->addWidget(new QLabel("Speed"));
943 pppLayout4Hlp2->addWidget(_mapSpeedSlider);
944
945 pppLayout4Hlp2->addStretch();
946 pppLayout4->addLayout(pppLayout4Hlp2);
947
948 pppLayout4->addStretch();
949 pppGroup4->setLayout(pppLayout4);
950
951 // Reqc Processing
952 // ---------------
953 _reqcActionComboBox = new QComboBox();
954 _reqcActionComboBox->setEditable(false);
955 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
956 int ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
957 if (ik != -1) {
958 _reqcActionComboBox->setCurrentIndex(ik);
959 }
960 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
961 this, SLOT(slotBncTextChanged()));
962
963 QGridLayout* reqcLayout = new QGridLayout;
964 _reqcActionComboBox->setMinimumWidth(15*ww);
965 _reqcActionComboBox->setMaximumWidth(15*ww);
966
967 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
968 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
969 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
970 _reqcObsFileChooser->setMinimumWidth(15*ww);
971 _reqcObsFileChooser->setMaximumWidth(15*ww);
972
973 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
974 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
975 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
976 _reqcNavFileChooser->setMinimumWidth(15*ww);
977 _reqcNavFileChooser->setMaximumWidth(15*ww);
978
979 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
980 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to a RINEX observation output file."));
981 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
982 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
983
984 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
985 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to a RINEX navigation output file."));
986 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
987 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
988
989 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
990 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to a logfile."));
991 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
992 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
993
994 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
995 _reqcPlotDirLineEdit->setWhatsThis(tr("Specify the directory name for saving plots."));
996 _reqcPlotDirLineEdit->setMinimumWidth(15*ww);
997 _reqcPlotDirLineEdit->setMaximumWidth(15*ww);
998
999 _reqcSkyPlotSystems = new QComboBox();
1000 _reqcSkyPlotSystems->setEditable(false);
1001 _reqcSkyPlotSystems->addItems(QString("ALL,GPS,GLONASS,Galileo").split(","));
1002 ik = _reqcSkyPlotSystems->findText(settings.value("reqcSkyPlotSystems").toString());
1003 if (ik != -1) {
1004 _reqcSkyPlotSystems->setCurrentIndex(ik);
1005 }
1006
1007 ir = 0;
1008 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1009 ++ir;
1010 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1011 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1012 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1013 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1014 ++ir;
1015 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1016 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1017 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1018 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1019 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1020 ++ir;
1021 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1022 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1023 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1024 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1025 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1026 ++ir;
1027 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1028 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1029 ++ir;
1030 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0, Qt::AlignLeft);
1031 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1, Qt::AlignRight);
1032 ++ir;
1033 reqcLayout->addWidget(new QLabel("Sky plots for"), ir, 0, Qt::AlignLeft);
1034 reqcLayout->addWidget(_reqcSkyPlotSystems, ir, 1, Qt::AlignRight);
1035 ++ir;
1036 reqcLayout->addWidget(new QLabel(""), ir, 1);
1037 reqcLayout->setRowStretch(ir, 999);
1038
1039 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1040 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1041
1042 reqcgroup->setLayout(reqcLayout);
1043
1044 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1045 this, SLOT(slotReqcEditOption()));
1046
1047 // Combine Corrections
1048 // -------------------
1049 QGridLayout* cmbLayout = new QGridLayout;
1050
1051 populateCmbTable();
1052 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1053 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1054 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1055 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1056 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1057 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1058 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1059 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1060 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1061 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1062 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1063 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1064 cmbLayout->addWidget(new QLabel(" "), 4, 5);
1065 cmbLayout->addWidget(new QLabel("Sampling"), 4, 6, Qt::AlignRight);
1066 cmbLayout->addWidget(_cmbSamplSpinBox, 4, 7, Qt::AlignRight);
1067 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1068
1069 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1070 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1071
1072 cmbgroup->setLayout(cmbLayout);
1073
1074 // Upload Layout (Clocks)
1075 // ----------------------
1076 QGridLayout* uploadHlpLayout = new QGridLayout();
1077
1078 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1079 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1080 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1081
1082 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1083 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1084 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1085 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1086 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1087 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1088 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1089 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1090 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1091 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1092 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1093
1094 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1095 populateUploadTable();
1096
1097 uploadLayout->addWidget(new QLabel("Upload RTCMv3 Broadcast Corrections to caster."));
1098 uploadLayout->addWidget(_uploadTable);
1099 uploadLayout->addLayout(uploadHlpLayout);
1100
1101 uploadgroup->setLayout(uploadLayout);
1102
1103 // Upload Layout (Ephemeris)
1104 // -------------------------
1105 QGridLayout* uploadLayoutEph = new QGridLayout;
1106
1107 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1108 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1109 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1110 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1111
1112 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1113 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1114 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1115 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1116 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1117 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1118 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1119 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1120 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1121 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1122 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1123 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1124 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1125 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1126 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1127
1128 uploadEphgroup->setLayout(uploadLayoutEph);
1129
1130 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1131 this, SLOT(slotBncTextChanged()));
1132
1133 // Main Layout
1134 // -----------
1135 QGridLayout* mLayout = new QGridLayout;
1136 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1137 mLayout->addWidget(_aogroup, 0,0);
1138 mLayout->addWidget(_mountPointsTable, 1,0);
1139 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1140 mLayout->addWidget(_loggroup, 2,0);
1141
1142 _canvas->setLayout(mLayout);
1143
1144 // WhatsThis
1145 // ---------
1146 _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>"));
1147 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1148 _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an NTRIP broadcaster over SSL requires the exchange of client and/or server certificates. Specify the path to a directory where you save certificates on your system. Don't try communication via SSL if you are not sure wheter this is supported by the involved NTRIP broadcaster. Note that SSL communication is usually done over port 443.</p>"));
1149 _ignoreSslErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the NTRIP broadcaster. Tick 'Ignore SSL authorization erros' if you don't want to be bothered with this.</p>"));
1150 _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 obs 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>"));
1151 _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."));
1152 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
1153 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
1154 _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."));
1155 _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."));
1156 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full corr 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.</p><p>Specifying a value of '0' means that BNC immediately outputs all incoming Broadcast Epemeris Corrections and does not drop any of them for latency reasons.</p>"));
1157 _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."));
1158 _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."));
1159 _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."));
1160 _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>"));
1161 _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>"));
1162 _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>"));
1163 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1164 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1165 _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', '5 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>"));
1166 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1167 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1168 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1169 _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>"));
1170 _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>"));
1171 _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>"));
1172 _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>"));
1173 _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>"));
1174 _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."));
1175 _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>"));
1176 _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>"));
1177 _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 'RTNET'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders 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>"));
1178 _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."));
1179 _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)."));
1180 _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."));
1181 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
1182 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
1183 _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>"));
1184 _miscPortLineEdit->setWhatsThis(tr("BNC can output an incoming stream through a TCP/IP port of your local host. Specify a port number here to activate this function."));
1185 _scanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incomming message types as well as contained antenna coordinates, antenna heigt, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types.</p>."));
1186 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1187 _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>"));
1188 _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>"));
1189 _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>"));
1190 _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>"));
1191 _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>"));
1192 _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>"));
1193 _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>"));
1194 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1195 _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>"));
1196 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to edit or concatenate RINEX v2 or v3 files or to perform a quality check following UNAVCO's famous 'teqc' program.</p>"));
1197 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1198 _mapWinButton->setWhatsThis(tr("<p>You make like to track your rover position using Google Maps or Open Street Map as a background map. Track plots can be produced with BNC in 'Realtime-PPP', 'Realtime-SPP' and 'Post-Processing' mode.</p><p>The 'Open Map' button opens a windows showing a map according to specified options.</p><p>When in 'Post-Processing' mode you should not forget to specify a proxy under the 'Network' tab if that is operated in front of BNC."));
1199 _gmRadioButton->setWhatsThis(tr("<p>Specify Google Maps as the background for your rover positions."));
1200 _osmRadioButton->setWhatsThis(tr("<p>Specify Open Street Map as the background for your rover positions."));
1201 _mapWinDotSizeLineEdit->setWhatsThis(tr("<p>Specify the size of dots showing the rover positions.</p><p>A dot size of '3' may be appropriate. The maximum possible dot size is '10'. An empty option field or a size of '0' would mean that you don't want BNC to show the rover's track on the map.</p>"));
1202 _mapWinDotColorComboBox->setWhatsThis(tr("<p>Specify the color of dots showing the rover track.</p>"));
1203 _mapSpeedSlider->setWhatsThis(tr("<p>With BNC in PPP post-processing mode you can specify the speed of computations as appropriate for visualization. Note that you can adjust 'Speed' on-the-fly while BNC is already processing your observations."));
1204 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when the corresponting option is selected above. Values are either referred to an XYZ reference coordinate (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."));
1205 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock corrections streams in real-time to produce, encode, upload and save a combination of correctors coming from various providers. Hit the 'Add Row' button, double click on the 'Mountpoint' field to enter a Broadcast Ephemeris corrections mountpoint from the 'Streams' section below and hit Enter. Then double click on the 'AC Name' field to enter your choice of an abbreviation for the Analysis Center (AC) providing the stream. Finally, double click on the 'Weight' field to enter the weight to be applied for this stream in the combination.<ul><li>Note that an appropriate 'Wait for full corr epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</li><li>Note also that you need to tick 'Use GLONASS' which is part ot the 'PPP (2)' panel in case you want to produce an GPS plus GLONASS combination.</li></ul></p><p>Note further that the orbit information in the final combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris corrections stream in the combination table. Instead of combining corrections BNC will then merge them with Broadcast Ephemeris to save results in SP3 and/or Clock RINEX format."));
1206 _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Residuum' meters from the average of all clocks will be ignored.<p></p>It is suggested to specify a value of about 0.2 m for the Kalman filter combination approach and a value of about 3.0 meters for the Single-Epoch combination approach.</p><p>Default is a value of '999.0'.</p>"));
1207 _cmbSamplSpinBox->setWhatsThis(tr("<p>Specify a combination sampling interval. Clock and orbit corrections will be produced following that interval. A value of 10 sec may be an appropriate choice.</p>"));
1208 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'. It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning.</p>"));
1209 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to broadcast ephemeris (Broadcast Corrections) in RTCM Version 3 SSR format. You may have a situation where clocks and orbits come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified NTRIP broadcaster</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris corrections if you specify correction streams in the 'Combine Corrections' stream table.</p><p>Hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an NTRIP broadcaster and hit Enter. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the NTRIP broadcaster IP port (default is 80), the mountpoint and the stream upload password. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference system (e.g. IGS08) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving the generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create SP3 orbit files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.sp3<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><ul><li>As an SP3 file contents should be referred to the satellites Center of Mass (CoM) while correctors are referred to the satellites Antenna Phase Center (APC), an offset has to be applied which is available from an IGS ANTEX file. You should therefore specify the 'ANTEX File' path under tab 'PPP (2)' if you want to save the stream contents in SP3 format. If you don't specify an 'ANTEX File' path there, the SP3 file contents will be referred to the satellites APCs.</li></ul></p><p>Specify a path for saving the generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.clk<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><p>Specify finally an SSR Provider ID number, an SSR Solution ID number and an Issue of Data SSR number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Corrections stream, BNC will merge that stream with Broadcast Ephemeris to save results in files specified here through SP3 and/or Clock RINEX file path. In such a case you should define only the SP3 and Clock RINEX file path and no further options in the 'Upload Corrections' table.</p>"));
1210 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1211 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1212 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1213 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1214 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1215 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("Select the stream's orbit correction sampling interval in seconds. A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages."));
1216 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("Select the Clock RINEX file sampling interval in seconds. A value of zero '0' tells BNC to store all available samples into Clock RINEX files."));
1217 _uploadSamplSp3SpinBox->setWhatsThis(tr("Select the SP3 orbit file sampling interval in minutes. A value of zero '0' tells BNC to store all available samples into SP3 orbit files."));
1218 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1219 _uploadEphHostLineEdit->setWhatsThis(tr("BNC can upload a Broadcast Ephemeris stream in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload Broadcast Ephemeris."));
1220 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1221 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1222 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1223 _uploadEphSampleSpinBox->setWhatsThis(tr("Select the Broadcast Ephemeris sampling interval in seconds. Defaut is '5' meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds."));
1224 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1225 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1226 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1227 _actMapMountPoints->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use the mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
1228 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1229 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1230// Weber
1231
1232 // Enable/Disable all Widgets
1233 // --------------------------
1234 slotBncTextChanged();
1235 enableStartStop();
1236
1237 // Auto start
1238 // ----------
1239 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1240 slotStart();
1241 }
1242}
1243
1244// Destructor
1245////////////////////////////////////////////////////////////////////////////
1246bncWindow::~bncWindow() {
1247 delete _caster; BNC_CORE->setCaster(0);
1248 delete _casterEph;
1249 delete _pppMain;
1250}
1251
1252//
1253////////////////////////////////////////////////////////////////////////////
1254void bncWindow::populateMountPointsTable() {
1255
1256 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1257 _mountPointsTable->removeRow(iRow);
1258 }
1259
1260 bncSettings settings;
1261
1262 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1263 int iRow = 0;
1264 while (it.hasNext()) {
1265 QStringList hlp = it.next().split(" ");
1266 if (hlp.size() < 5) continue;
1267 _mountPointsTable->insertRow(iRow);
1268
1269 QUrl url(hlp[0]);
1270
1271 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1272 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1273 QString nmea(hlp[4]);
1274 if (hlp[5] == "S") {
1275 fullPath = hlp[0].replace(0,2,"");
1276 }
1277 QString ntripVersion = "2";
1278 if (hlp.size() >= 6) {
1279 ntripVersion = (hlp[5]);
1280 }
1281
1282 QTableWidgetItem* it;
1283 it = new QTableWidgetItem(url.userInfo());
1284 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1285 _mountPointsTable->setItem(iRow, 0, it);
1286
1287 it = new QTableWidgetItem(fullPath);
1288 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1289 _mountPointsTable->setItem(iRow, 1, it);
1290
1291 it = new QTableWidgetItem(format);
1292 _mountPointsTable->setItem(iRow, 2, it);
1293
1294 if (nmea == "yes") {
1295 it = new QTableWidgetItem(latitude);
1296 _mountPointsTable->setItem(iRow, 3, it);
1297 it = new QTableWidgetItem(longitude);
1298 _mountPointsTable->setItem(iRow, 4, it);
1299 } else {
1300 it = new QTableWidgetItem(latitude);
1301 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1302 _mountPointsTable->setItem(iRow, 3, it);
1303 it = new QTableWidgetItem(longitude);
1304 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1305 _mountPointsTable->setItem(iRow, 4, it);
1306 }
1307
1308 it = new QTableWidgetItem(nmea);
1309 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1310 _mountPointsTable->setItem(iRow, 5, it);
1311
1312 it = new QTableWidgetItem(ntripVersion);
1313 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1314 _mountPointsTable->setItem(iRow, 6, it);
1315
1316 bncTableItem* bncIt = new bncTableItem();
1317 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1318 _mountPointsTable->setItem(iRow, 7, bncIt);
1319
1320 iRow++;
1321 }
1322
1323 _mountPointsTable->sortItems(1);
1324
1325 enableStartStop();
1326}
1327
1328// Retrieve Table
1329////////////////////////////////////////////////////////////////////////////
1330void bncWindow::slotAddMountPoints() {
1331
1332 bncSettings settings;
1333 QString proxyHost = settings.value("proxyHost").toString();
1334 int proxyPort = settings.value("proxyPort").toInt();
1335 if (proxyHost != _proxyHostLineEdit->text() ||
1336 proxyPort != _proxyPortLineEdit->text().toInt()) {
1337 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1338 "changed. Use the new ones?",
1339 QMessageBox::Yes, QMessageBox::No,
1340 QMessageBox::NoButton);
1341 if (iRet == QMessageBox::Yes) {
1342 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1343 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1344 }
1345 }
1346
1347 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1348 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1349
1350 QMessageBox msgBox;
1351 msgBox.setIcon(QMessageBox::Question);
1352 msgBox.setWindowTitle("Add Stream");
1353 msgBox.setText("Add stream(s) coming from:");
1354
1355 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1356 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1357 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1358 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1359 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1360
1361 msgBox.exec();
1362
1363 if (msgBox.clickedButton() == buttonNtrip) {
1364 bncTableDlg* dlg = new bncTableDlg(this);
1365 dlg->move(this->pos().x()+50, this->pos().y()+50);
1366 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1367 this, SLOT(slotNewMountPoints(QStringList*)));
1368 dlg->exec();
1369 delete dlg;
1370 } else if (msgBox.clickedButton() == buttonIP) {
1371 bncIpPort* ipp = new bncIpPort(this);
1372 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1373 this, SLOT(slotNewMountPoints(QStringList*)));
1374 ipp->exec();
1375 delete ipp;
1376 } else if (msgBox.clickedButton() == buttonUDP) {
1377 bncUdpPort* udp = new bncUdpPort(this);
1378 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1379 this, SLOT(slotNewMountPoints(QStringList*)));
1380 udp->exec();
1381 delete udp;
1382 } else if (msgBox.clickedButton() == buttonSerial) {
1383 bncSerialPort* sep = new bncSerialPort(this);
1384 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1385 this, SLOT(slotNewMountPoints(QStringList*)));
1386 sep->exec();
1387 delete sep;
1388 } else if (msgBox.clickedButton() == buttonCancel) {
1389 // Cancel
1390 }
1391
1392 enableStartStop();
1393}
1394
1395// Delete Selected Mount Points
1396////////////////////////////////////////////////////////////////////////////
1397void bncWindow::slotDeleteMountPoints() {
1398
1399 int nRows = _mountPointsTable->rowCount();
1400 bool flg[nRows];
1401 for (int iRow = 0; iRow < nRows; iRow++) {
1402 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1403 flg[iRow] = true;
1404 }
1405 else {
1406 flg[iRow] = false;
1407 }
1408 }
1409 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1410 if (flg[iRow]) {
1411 _mountPointsTable->removeRow(iRow);
1412 }
1413 }
1414 _actDeleteMountPoints->setEnabled(false);
1415
1416 enableStartStop();
1417}
1418
1419// New Mount Points Selected
1420////////////////////////////////////////////////////////////////////////////
1421void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1422 int iRow = 0;
1423 QListIterator<QString> it(*mountPoints);
1424 while (it.hasNext()) {
1425 QStringList hlp = it.next().split(" ");
1426 QUrl url(hlp[0]);
1427 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1428 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1429 QString nmea(hlp[4]);
1430 if (hlp[5] == "S") {
1431 fullPath = hlp[0].replace(0,2,"");
1432 }
1433 QString ntripVersion = "2";
1434 if (hlp.size() >= 6) {
1435 ntripVersion = (hlp[5]);
1436 }
1437
1438 _mountPointsTable->insertRow(iRow);
1439
1440 QTableWidgetItem* it;
1441 it = new QTableWidgetItem(url.userInfo());
1442 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1443 _mountPointsTable->setItem(iRow, 0, it);
1444
1445 it = new QTableWidgetItem(fullPath);
1446 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1447 _mountPointsTable->setItem(iRow, 1, it);
1448
1449 it = new QTableWidgetItem(format);
1450 _mountPointsTable->setItem(iRow, 2, it);
1451
1452 if (nmea == "yes") {
1453 it = new QTableWidgetItem(latitude);
1454 _mountPointsTable->setItem(iRow, 3, it);
1455 it = new QTableWidgetItem(longitude);
1456 _mountPointsTable->setItem(iRow, 4, it);
1457 } else {
1458 it = new QTableWidgetItem(latitude);
1459 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1460 _mountPointsTable->setItem(iRow, 3, it);
1461 it = new QTableWidgetItem(longitude);
1462 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1463 _mountPointsTable->setItem(iRow, 4, it);
1464 }
1465
1466 it = new QTableWidgetItem(nmea);
1467 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1468 _mountPointsTable->setItem(iRow, 5, it);
1469
1470 it = new QTableWidgetItem(ntripVersion);
1471 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1472 _mountPointsTable->setItem(iRow, 6, it);
1473
1474 bncTableItem* bncIt = new bncTableItem();
1475 _mountPointsTable->setItem(iRow, 7, bncIt);
1476
1477 iRow++;
1478 }
1479 _mountPointsTable->hideColumn(0);
1480 _mountPointsTable->sortItems(1);
1481 delete mountPoints;
1482
1483 enableStartStop();
1484}
1485
1486// Save Options (serialize)
1487////////////////////////////////////////////////////////////////////////////
1488void bncWindow::slotSaveOptions() {
1489 saveOptions();
1490 bncSettings settings;
1491 settings.sync();
1492}
1493
1494// Save Options (memory only)
1495////////////////////////////////////////////////////////////////////////////
1496void bncWindow::saveOptions() {
1497
1498 QStringList mountPoints;
1499 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1500
1501 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1502 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1503 "@" + _mountPointsTable->item(iRow, 1)->text() );
1504
1505 mountPoints.append(url.toString() + " " +
1506 _mountPointsTable->item(iRow, 2)->text()
1507 + " " + _mountPointsTable->item(iRow, 3)->text()
1508 + " " + _mountPointsTable->item(iRow, 4)->text()
1509 + " " + _mountPointsTable->item(iRow, 5)->text()
1510 + " " + _mountPointsTable->item(iRow, 6)->text());
1511 } else {
1512 mountPoints.append(
1513 "//" + _mountPointsTable->item(iRow, 1)->text()
1514 + " " + _mountPointsTable->item(iRow, 2)->text()
1515 + " " + _mountPointsTable->item(iRow, 3)->text()
1516 + " " + _mountPointsTable->item(iRow, 4)->text()
1517 + " " + _mountPointsTable->item(iRow, 5)->text()
1518 + " " + _mountPointsTable->item(iRow, 6)->text());
1519 }
1520 }
1521
1522 QStringList combineStreams;
1523 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1524 QString hlp;
1525 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1526 if (_cmbTable->item(iRow, iCol)) {
1527 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1528 }
1529 }
1530 if (!hlp.isEmpty()) {
1531 combineStreams << hlp;
1532 }
1533 }
1534
1535 QStringList uploadMountpointsOut;
1536 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1537 QString hlp;
1538 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1539 if (_uploadTable->cellWidget(iRow, iCol) &&
1540 (iCol == 3 || iCol == 4 || iCol == 5)) {
1541 if (iCol == 3) {
1542 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1543 hlp += passwd->text() + ",";
1544 }
1545 else if (iCol == 4) {
1546 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1547 hlp += system->currentText() + ",";
1548 }
1549 else if (iCol == 5) {
1550 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1551 QString state; state.setNum(com->checkState());
1552 hlp += state + ",";
1553 }
1554 }
1555 else if (_uploadTable->item(iRow, iCol)) {
1556 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1557 }
1558 }
1559 if (!hlp.isEmpty()) {
1560 uploadMountpointsOut << hlp;
1561 }
1562 }
1563
1564 bncSettings settings;
1565
1566 settings.setValue("startTab", _aogroup->currentIndex());
1567 settings.setValue("statusTab", _loggroup->currentIndex());
1568 settings.setValue("mountPoints", mountPoints);
1569// Network
1570 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1571 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1572 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1573 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1574// General
1575 settings.setValue("logFile", _logFileLineEdit->text());
1576 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1577 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1578 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1579 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1580// RINEX Observations
1581 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1582 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1583 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1584 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1585 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1586 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1587// RINEX Ephemeris
1588 settings.setValue("ephPath", _ephPathLineEdit->text());
1589 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1590 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1591 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1592// Broadcast Corrections
1593 settings.setValue("corrPath", _corrPathLineEdit->text());
1594 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1595 settings.setValue("corrPort", _corrPortLineEdit->text());
1596 settings.setValue("corrTime", _corrTimeSpinBox->value());
1597// Feed Engine
1598 settings.setValue("outPort", _outPortLineEdit->text());
1599 settings.setValue("waitTime", _waitTimeSpinBox->value());
1600 settings.setValue("binSampl", _binSamplSpinBox->value());
1601 settings.setValue("outFile", _outFileLineEdit->text());
1602 settings.setValue("outUPort", _outUPortLineEdit->text());
1603// Serial Output
1604 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1605 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1606 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1607 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1608 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1609 settings.setValue("serialParity", _serialParityComboBox->currentText());
1610 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1611 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1612 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1613 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1614// Outages
1615 settings.setValue("obsRate", _obsRateComboBox->currentText());
1616 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1617 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1618 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1619// Miscellaneous
1620 settings.setValue("miscMount", _miscMountLineEdit->text());
1621 settings.setValue("miscPort", _miscPortLineEdit->text());
1622 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1623 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1624 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1625 settings.setValue("useOsmMap", _osmRadioButton->isChecked());
1626 settings.setValue("mapWinDotSize", _mapWinDotSizeLineEdit->text());
1627 settings.setValue("mapWinDotColor", _mapWinDotColorComboBox->currentText());
1628 settings.setValue("mapSpeed", _mapSpeedSlider->value());
1629// Reqc
1630 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1631 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1632 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1633 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1634 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1635 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1636 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
1637 settings.setValue("reqcSkyPlotSystems", _reqcSkyPlotSystems->currentText());
1638// Combine Corrections
1639 if (!combineStreams.isEmpty()) {
1640 settings.setValue("combineStreams", combineStreams);
1641 }
1642 else {
1643 settings.setValue("combineStreams", "");
1644 }
1645 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1646 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1647 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1648// Upload Corrections
1649 if (!uploadMountpointsOut.isEmpty()) {
1650 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1651 }
1652 else {
1653 settings.setValue("uploadMountpointsOut", "");
1654 }
1655 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1656 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1657 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1658 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1659// Upload Ephemeris
1660 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1661 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1662 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1663 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1664 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1665
1666 if (_caster) {
1667 _caster->readMountPoints();
1668 }
1669
1670 _pppWidgets.saveOptions();
1671}
1672
1673// All get slots terminated
1674////////////////////////////////////////////////////////////////////////////
1675void bncWindow::slotGetThreadsFinished() {
1676 BNC_CORE->slotMessage("All Get Threads Terminated", true);
1677 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
1678 delete _casterEph; _casterEph = 0;
1679 _runningRealTime = false;
1680}
1681
1682// Start It!
1683////////////////////////////////////////////////////////////////////////////
1684void bncWindow::slotStart() {
1685 saveOptions();
1686 if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1687 startPostProcessingReqc();
1688 }
1689 else {
1690 startRealTime();
1691 }
1692 if (_pppMain) {
1693 _pppMain->start();
1694 }
1695}
1696
1697// Start Real-Time (Retrieve Data etc.)
1698////////////////////////////////////////////////////////////////////////////
1699void bncWindow::startRealTime() {
1700
1701 _runningRealTime = true;
1702
1703 _bncFigurePPP->reset();
1704
1705 _actDeleteMountPoints->setEnabled(false);
1706
1707 enableStartStop();
1708
1709 _caster = new bncCaster();
1710
1711 BNC_CORE->setCaster(_caster);
1712 BNC_CORE->setPort(_outEphPortLineEdit->text().toInt());
1713 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
1714 BNC_CORE->initCombination();
1715
1716 connect(_caster, SIGNAL(getThreadsFinished()),
1717 this, SLOT(slotGetThreadsFinished()));
1718
1719 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1720 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1721
1722 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1723
1724 bncSettings settings;
1725
1726 QDir rnxdir(settings.value("rnxPath").toString());
1727 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
1728
1729 QString rnx_file = settings.value("rnxScript").toString();
1730 if ( !rnx_file.isEmpty() ) {
1731 QFile rnxfile(settings.value("rnxScript").toString());
1732 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
1733 }
1734
1735 QDir ephdir(settings.value("ephPath").toString());
1736 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
1737
1738 QDir corrdir(settings.value("corrPath").toString());
1739 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
1740
1741 QString advise_file = settings.value("adviseScript").toString();
1742 if ( !advise_file.isEmpty() ) {
1743 QFile advisefile(settings.value("adviseScript").toString());
1744 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
1745 }
1746
1747 QString ant_file = settings.value("pppAntex").toString();
1748 if ( !ant_file.isEmpty() ) {
1749 QFile anxfile(settings.value("pppAntex").toString());
1750 if (!anxfile.exists()) BNC_CORE->slotMessage("Cannot find IGS ANTEX file", true);
1751 }
1752
1753 _caster->readMountPoints();
1754
1755 _casterEph = new bncEphUploadCaster();
1756 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1757 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1758}
1759
1760// Retrieve Data
1761////////////////////////////////////////////////////////////////////////////
1762void bncWindow::slotStop() {
1763 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1764 QMessageBox::Yes, QMessageBox::No,
1765 QMessageBox::NoButton);
1766 if (iRet == QMessageBox::Yes) {
1767 if (_pppMain) {
1768 _pppMain->slotStop();
1769 }
1770 BNC_CORE->stopCombination();
1771 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
1772 delete _casterEph; _casterEph = 0;
1773 _runningRealTime = false;
1774 enableStartStop();
1775 }
1776}
1777
1778// Close Application gracefully
1779////////////////////////////////////////////////////////////////////////////
1780void bncWindow::closeEvent(QCloseEvent* event) {
1781
1782 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1783 QMessageBox::Yes, QMessageBox::No,
1784 QMessageBox::Cancel);
1785
1786 if (iRet == QMessageBox::Cancel) {
1787 event->ignore();
1788 return;
1789 }
1790 else if (iRet == QMessageBox::Yes) {
1791 slotSaveOptions();
1792 }
1793
1794 if (_pppMain) {
1795 _pppMain->slotStop();
1796 }
1797
1798 QMainWindow::closeEvent(event);
1799}
1800
1801// User changed the selection of mountPoints
1802////////////////////////////////////////////////////////////////////////////
1803void bncWindow::slotSelectionChanged() {
1804 if (_mountPointsTable->selectedItems().isEmpty()) {
1805 _actDeleteMountPoints->setEnabled(false);
1806 }
1807 else {
1808 _actDeleteMountPoints->setEnabled(true);
1809 }
1810}
1811
1812// Display Program Messages
1813////////////////////////////////////////////////////////////////////////////
1814void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1815
1816#ifdef DEBUG_RTCM2_2021
1817 const int maxBufferSize = 1000;
1818#else
1819 const int maxBufferSize = 10000;
1820#endif
1821
1822 if (! showOnScreen ) {
1823 return;
1824 }
1825
1826 QString txt = _log->toPlainText() + "\n" +
1827 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1828 _log->clear();
1829 _log->append(txt.right(maxBufferSize));
1830}
1831
1832// About Message
1833////////////////////////////////////////////////////////////////////////////
1834void bncWindow::slotAbout() {
1835 new bncAboutDlg(0);
1836}
1837
1838//Flowchart
1839////////////////////////////////////////////////////////////////////////////
1840void bncWindow::slotFlowchart() {
1841 new bncFlowchartDlg(0);
1842}
1843
1844// Help Window
1845////////////////////////////////////////////////////////////////////////////
1846void bncWindow::slotHelp() {
1847 QUrl url;
1848 url.setPath(":bnchelp.html");
1849 new bncHlpDlg(0, url);
1850}
1851
1852// Select Fonts
1853////////////////////////////////////////////////////////////////////////////
1854void bncWindow::slotFontSel() {
1855 bool ok;
1856 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1857 if (ok) {
1858 bncSettings settings;
1859 settings.setValue("font", newFont.toString());
1860 QApplication::setFont(newFont);
1861 int ww = QFontMetrics(newFont).width('w');
1862 setMinimumSize(60*ww, 80*ww);
1863 resize(60*ww, 80*ww);
1864 }
1865}
1866
1867// Whats This Help
1868void bncWindow::slotWhatsThis() {
1869 QWhatsThis::enterWhatsThisMode();
1870}
1871
1872//
1873////////////////////////////////////////////////////////////////////////////
1874void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1875 _threads = threads;
1876
1877 _bncFigure->updateMountPoints();
1878 _bncFigureLate->updateMountPoints();
1879
1880 populateMountPointsTable();
1881 bncSettings settings;
1882 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1883 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1884 QListIterator<bncGetThread*> iTh(threads);
1885 while (iTh.hasNext()) {
1886 bncGetThread* thread = iTh.next();
1887 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1888 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1889 "@" + _mountPointsTable->item(iRow, 1)->text() );
1890 if (url == thread->mountPoint() &&
1891 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1892 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1893 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1894 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1895 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1896 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1897 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1898 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1899 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1900 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1901 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1902 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1903 disconnect(thread,
1904 SIGNAL(newPosition(bncTime, double, double, double)),
1905 _bncFigurePPP,
1906 SLOT(slotNewPosition(bncTime, double, double, double)));
1907 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1908 _bncFigurePPP,
1909 SLOT(slotNewPosition(bncTime, double, double, double)));
1910 }
1911#ifdef QT_WEBKIT
1912 if (_mapWin) {
1913 disconnect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1914 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
1915 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1916 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
1917 }
1918#endif
1919 break;
1920 }
1921 }
1922 }
1923}
1924
1925//
1926////////////////////////////////////////////////////////////////////////////
1927void bncWindow::CreateMenu() {
1928 // Create Menus
1929 // ------------
1930 _menuFile = menuBar()->addMenu(tr("&File"));
1931 _menuFile->addAction(_actFontSel);
1932 _menuFile->addSeparator();
1933 _menuFile->addAction(_actSaveOpt);
1934 _menuFile->addSeparator();
1935 _menuFile->addAction(_actQuit);
1936
1937 _menuHlp = menuBar()->addMenu(tr("&Help"));
1938 _menuHlp->addAction(_actHelp);
1939 _menuHlp->addAction(_actFlowchart);
1940 _menuHlp->addAction(_actAbout);
1941}
1942
1943// Toolbar
1944////////////////////////////////////////////////////////////////////////////
1945void bncWindow::AddToolbar() {
1946 QToolBar* toolBar = new QToolBar;
1947 addToolBar(Qt::BottomToolBarArea, toolBar);
1948 toolBar->setMovable(false);
1949 toolBar->addAction(_actAddMountPoints);
1950 toolBar->addAction(_actDeleteMountPoints);
1951 toolBar->addAction(_actMapMountPoints);
1952 toolBar->addAction(_actStart);
1953 toolBar->addAction(_actStop);
1954 toolBar->addWidget(new QLabel(" "));
1955 toolBar->addAction(_actwhatsthis);
1956}
1957
1958// About
1959////////////////////////////////////////////////////////////////////////////
1960bncAboutDlg::bncAboutDlg(QWidget* parent) :
1961 QDialog(parent) {
1962
1963 QTextBrowser* tb = new QTextBrowser;
1964 QUrl url; url.setPath(":bncabout.html");
1965 tb->setSource(url);
1966 tb->setReadOnly(true);
1967
1968 int ww = QFontMetrics(font()).width('w');
1969 QPushButton* _closeButton = new QPushButton("Close");
1970 _closeButton->setMaximumWidth(10*ww);
1971 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1972
1973 QGridLayout* dlgLayout = new QGridLayout();
1974 QLabel* img = new QLabel();
1975 img->setPixmap(QPixmap(":ntrip-logo.png"));
1976 dlgLayout->addWidget(img, 0,0);
1977 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1978 dlgLayout->addWidget(tb,1,0,1,2);
1979 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1980
1981 setLayout(dlgLayout);
1982 resize(60*ww, 60*ww);
1983 setWindowTitle("About BNC");
1984 show();
1985}
1986
1987//
1988////////////////////////////////////////////////////////////////////////////
1989bncAboutDlg::~bncAboutDlg() {
1990};
1991
1992// Flowchart
1993////////////////////////////////////////////////////////////////////////////
1994bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1995 QDialog(parent) {
1996
1997 int ww = QFontMetrics(font()).width('w');
1998 QPushButton* _closeButton = new QPushButton("Close");
1999 _closeButton->setMaximumWidth(10*ww);
2000 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2001
2002 QGridLayout* dlgLayout = new QGridLayout();
2003 QLabel* img = new QLabel();
2004 img->setPixmap(QPixmap(":bncflowchart.png"));
2005 dlgLayout->addWidget(img, 0,0);
2006 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2007
2008 setLayout(dlgLayout);
2009 setWindowTitle("Flow Chart");
2010 show();
2011}
2012
2013//
2014////////////////////////////////////////////////////////////////////////////
2015bncFlowchartDlg::~bncFlowchartDlg() {
2016};
2017
2018// Enable/Disable Widget (and change its color)
2019////////////////////////////////////////////////////////////////////////////
2020void bncWindow::enableWidget(bool enable, QWidget* widget) {
2021 const static QPalette paletteWhite(QColor(255, 255, 255));
2022 const static QPalette paletteGray(QColor(230, 230, 230));
2023
2024 widget->setEnabled(enable);
2025 if (enable) {
2026 widget->setPalette(paletteWhite);
2027 }
2028 else {
2029 widget->setPalette(paletteGray);
2030 }
2031}
2032
2033// Bnc Text
2034////////////////////////////////////////////////////////////////////////////
2035void bncWindow::slotBncTextChanged(){
2036
2037 bool enable = true;
2038
2039 // Proxy
2040 //------
2041 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2042 enable = !_proxyHostLineEdit->text().isEmpty();
2043 enableWidget(enable, _proxyPortLineEdit);
2044 }
2045
2046 // RINEX Observations
2047 // ------------------
2048 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2049 enable = !_rnxPathLineEdit->text().isEmpty();
2050 enableWidget(enable, _rnxSamplSpinBox);
2051 enableWidget(enable, _rnxSkelLineEdit);
2052 enableWidget(enable, _rnxScrpLineEdit);
2053 enableWidget(enable, _rnxV3CheckBox);
2054 enableWidget(enable, _rnxIntrComboBox);
2055 }
2056
2057 // RINEX Ephemeris
2058 // ---------------
2059 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2060 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2061 enableWidget(enable, _ephIntrComboBox);
2062 enableWidget(enable, _ephV3CheckBox);
2063 }
2064
2065 // Broadcast Corrections
2066 // ---------------------
2067 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2068 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2069 enableWidget(enable, _corrIntrComboBox);
2070 }
2071
2072 // Feed Engine
2073 // -----------
2074 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2075 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2076 enableWidget(enable, _waitTimeSpinBox);
2077 enableWidget(enable, _binSamplSpinBox);
2078 }
2079
2080 // Serial Output
2081 // -------------
2082 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2083 sender() == _serialAutoNMEAComboBox) {
2084 enable = !_serialMountPointLineEdit->text().isEmpty();
2085 enableWidget(enable, _serialPortNameLineEdit);
2086 enableWidget(enable, _serialBaudRateComboBox);
2087 enableWidget(enable, _serialParityComboBox);
2088 enableWidget(enable, _serialDataBitsComboBox);
2089 enableWidget(enable, _serialStopBitsComboBox);
2090 enableWidget(enable, _serialFlowControlComboBox);
2091 enableWidget(enable, _serialAutoNMEAComboBox);
2092
2093 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2094 enableWidget(enable2, _serialFileNMEALineEdit);
2095 }
2096
2097 // Outages
2098 // -------
2099 if (sender() == 0 || sender() == _obsRateComboBox) {
2100 enable = !_obsRateComboBox->currentText().isEmpty();
2101 enableWidget(enable, _adviseFailSpinBox);
2102 enableWidget(enable, _adviseRecoSpinBox);
2103 enableWidget(enable, _adviseScriptLineEdit);
2104 }
2105
2106 // Miscellaneous
2107 // -------------
2108 if (sender() == 0 || sender() == _miscMountLineEdit) {
2109 enable = !_miscMountLineEdit->text().isEmpty();
2110 enableWidget(enable, _perfIntrComboBox);
2111 enableWidget(enable, _scanRTCMCheckBox);
2112 enableWidget(enable, _miscPortLineEdit);
2113 }
2114
2115 // Enable/disable Broadcast Ephemerides
2116 // ------------------------------------
2117 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2118 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2119 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2120 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2121 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2122 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2123 _uploadEphPortLineEdit->setEnabled(true);
2124 _uploadEphMountpointLineEdit->setEnabled(true);
2125 _uploadEphPasswordLineEdit->setEnabled(true);
2126 _uploadEphSampleSpinBox->setEnabled(true);
2127 }
2128 else {
2129 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2130 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2131 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2132 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2133 _uploadEphPortLineEdit->setEnabled(false);
2134 _uploadEphMountpointLineEdit->setEnabled(false);
2135 _uploadEphPasswordLineEdit->setEnabled(false);
2136 _uploadEphSampleSpinBox->setEnabled(false);
2137 }
2138 }
2139
2140 // Combine Corrections
2141 // -------------------
2142 if (sender() == 0 || sender() == _cmbTable) {
2143 int iRow = _cmbTable->rowCount();
2144 if (iRow > 0) {
2145 enableWidget(true, _cmbMethodComboBox);
2146 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2147 _cmbMaxresLineEdit->setEnabled(true);
2148 _cmbSamplSpinBox->setEnabled(true);
2149 }
2150 else {
2151 enableWidget(false, _cmbMethodComboBox);
2152 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2153 _cmbMaxresLineEdit->setEnabled(false);
2154 _cmbSamplSpinBox->setEnabled(false);
2155 }
2156 }
2157
2158 // Upload(clk)
2159 // -----------
2160 int iRow = _uploadTable->rowCount();
2161 if (iRow > 0) {
2162 enableWidget(true, _uploadIntrComboBox);
2163 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2164 enableWidget(true, _uploadSamplClkRnxSpinBox);
2165 enableWidget(true, _uploadSamplSp3SpinBox);
2166 }
2167 else {
2168 enableWidget(false, _uploadIntrComboBox);
2169 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2170 enableWidget(false, _uploadSamplClkRnxSpinBox);
2171 enableWidget(false, _uploadSamplSp3SpinBox);
2172 }
2173
2174 // QC
2175 // --
2176 if (sender() == 0 || sender() == _reqcActionComboBox) {
2177 enable = !_reqcActionComboBox->currentText().isEmpty();
2178 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2179 enableWidget(enable && enable10, _reqcEditOptionButton);
2180 enableWidget(enable, _reqcObsFileChooser);
2181 enableWidget(enable, _reqcNavFileChooser);
2182 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2183 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2184 enableWidget(enable, _reqcOutLogLineEdit);
2185 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2186 enableWidget(enable && !enable10, _reqcSkyPlotSystems);
2187 }
2188
2189 enableStartStop();
2190}
2191
2192//
2193////////////////////////////////////////////////////////////////////////////
2194void bncWindow::slotAddCmbRow() {
2195 int iRow = _cmbTable->rowCount();
2196 _cmbTable->insertRow(iRow);
2197 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2198 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2199 }
2200}
2201
2202//
2203////////////////////////////////////////////////////////////////////////////
2204void bncWindow::slotDelCmbRow() {
2205 int nRows = _cmbTable->rowCount();
2206 bool flg[nRows];
2207 for (int iRow = 0; iRow < nRows; iRow++) {
2208 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2209 flg[iRow] = true;
2210 }
2211 else {
2212 flg[iRow] = false;
2213 }
2214 }
2215 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2216 if (flg[iRow]) {
2217 _cmbTable->removeRow(iRow);
2218 }
2219 }
2220 nRows = _cmbTable->rowCount();
2221 if (nRows < 1) {
2222 enableWidget(false, _cmbMethodComboBox);
2223 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2224 _cmbMaxresLineEdit->setEnabled(false);
2225 _cmbSamplSpinBox->setEnabled(false);
2226 }
2227}
2228
2229//
2230////////////////////////////////////////////////////////////////////////////
2231void bncWindow::populateCmbTable() {
2232
2233 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2234 _cmbTable->removeRow(iRow);
2235 }
2236
2237 bncSettings settings;
2238
2239 int iRow = -1;
2240 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2241 while (it.hasNext()) {
2242 QStringList hlp = it.next().split(" ");
2243 if (hlp.size() > 2) {
2244 ++iRow;
2245 _cmbTable->insertRow(iRow);
2246 }
2247 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2248 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2249 }
2250 }
2251}
2252
2253//
2254////////////////////////////////////////////////////////////////////////////
2255void bncWindow::slotAddUploadRow() {
2256 int iRow = _uploadTable->rowCount();
2257 _uploadTable->insertRow(iRow);
2258 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2259 if (iCol == 3) {
2260 QLineEdit* passwd = new QLineEdit();
2261 passwd->setFrame(false);
2262 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2263 _uploadTable->setCellWidget(iRow, iCol, passwd);
2264 }
2265 else if (iCol == 4) {
2266 QComboBox* system = new QComboBox();
2267 system->setEditable(false);
2268 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2269 system->setFrame(false);
2270 _uploadTable->setCellWidget(iRow, iCol, system);
2271 }
2272 else if (iCol == 5) {
2273 QCheckBox* com = new QCheckBox();
2274 _uploadTable->setCellWidget(iRow, iCol, com);
2275 }
2276 else if (iCol == 11) {
2277 bncTableItem* bncIt = new bncTableItem();
2278 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2279 _uploadTable->setItem(iRow, iCol, bncIt);
2280 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2281 }
2282 else {
2283 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2284 }
2285 }
2286}
2287
2288//
2289////////////////////////////////////////////////////////////////////////////
2290void bncWindow::slotDelUploadRow() {
2291 BNC_CORE->_uploadTableItems.clear();
2292 int nRows = _uploadTable->rowCount();
2293 bool flg[nRows];
2294 for (int iRow = 0; iRow < nRows; iRow++) {
2295 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2296 flg[iRow] = true;
2297 }
2298 else {
2299 flg[iRow] = false;
2300 }
2301 }
2302 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2303 if (flg[iRow]) {
2304 _uploadTable->removeRow(iRow);
2305 }
2306 }
2307 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2308 BNC_CORE->_uploadTableItems[iRow] =
2309 (bncTableItem*) _uploadTable->item(iRow, 11);
2310 }
2311 nRows = _uploadTable->rowCount();
2312 if (nRows < 1) {
2313 enableWidget(false, _uploadIntrComboBox);
2314 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2315 enableWidget(false, _uploadSamplSp3SpinBox);
2316 enableWidget(false, _uploadSamplClkRnxSpinBox);
2317 }
2318}
2319
2320//
2321////////////////////////////////////////////////////////////////////////////
2322void bncWindow::populateUploadTable() {
2323 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2324 _uploadTable->removeRow(iRow);
2325 }
2326
2327 bncSettings settings;
2328
2329 int iRow = -1;
2330 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2331 while (it.hasNext()) {
2332 QStringList hlp = it.next().split(",");
2333 if (hlp.size() > 6) {
2334 ++iRow;
2335 _uploadTable->insertRow(iRow);
2336 }
2337 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2338 if (iCol == 3) {
2339 QLineEdit* passwd = new QLineEdit();
2340 passwd->setFrame(false);
2341 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2342 passwd->setText(hlp[iCol]);
2343 _uploadTable->setCellWidget(iRow, iCol, passwd);
2344 }
2345 else if (iCol == 4) {
2346 QComboBox* system = new QComboBox();
2347 system->setEditable(false);
2348 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2349 system->setFrame(false);
2350 system->setCurrentIndex(system->findText(hlp[iCol]));
2351 _uploadTable->setCellWidget(iRow, iCol, system);
2352 }
2353 else if (iCol == 5) {
2354 QCheckBox* com = new QCheckBox();
2355 if (hlp[iCol].toInt() == Qt::Checked) {
2356 com->setCheckState(Qt::Checked);
2357 }
2358 _uploadTable->setCellWidget(iRow, iCol, com);
2359 }
2360 else if (iCol == 11) {
2361 bncTableItem* bncIt = new bncTableItem();
2362 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2363 _uploadTable->setItem(iRow, iCol, bncIt);
2364 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2365 }
2366 else {
2367 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2368 }
2369 }
2370 }
2371}
2372
2373//
2374////////////////////////////////////////////////////////////////////////////
2375void bncWindow::slotSetUploadTrafo() {
2376 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2377 dlg->exec();
2378 delete dlg;
2379}
2380
2381// Progress Bar Change
2382////////////////////////////////////////////////////////////////////////////
2383void bncWindow::slotPostProgress(int nEpo) {
2384 if (_actStart) {
2385 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2386 }
2387}
2388
2389// Start Post-Processing Reqc
2390////////////////////////////////////////////////////////////////////////////
2391void bncWindow::startPostProcessingReqc() {
2392#ifdef USE_POSTPROCESSING
2393 _runningPostProcessingReqc = true;
2394 enableStartStop();
2395 if (_reqcActionComboBox->currentText() == "Analyze") {
2396 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2397 connect(reqcAnalyze, SIGNAL(finished()),
2398 this, SLOT(slotFinishedPostProcessingReqc()));
2399 reqcAnalyze->start();
2400 }
2401 else {
2402 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2403 connect(reqcEdit, SIGNAL(finished()),
2404 this, SLOT(slotFinishedPostProcessingReqc()));
2405 reqcEdit->start();
2406 }
2407#else
2408 QMessageBox::information(this, "Information",
2409 "Post-Processing Not Permitted");
2410#endif
2411}
2412
2413// Post-Processing Reqc Finished
2414////////////////////////////////////////////////////////////////////////////
2415void bncWindow::slotFinishedPostProcessingReqc() {
2416 _runningPostProcessingReqc = false;
2417 if (_reqcActionComboBox->currentText() != "Analyze") {
2418 QMessageBox::information(this, "Information",
2419 "RINEX Processing Thread Finished");
2420 }
2421 enableStartStop();
2422}
2423
2424// Edit teqc-like editing options
2425////////////////////////////////////////////////////////////////////////////
2426void bncWindow::slotReqcEditOption() {
2427 reqcDlg* dlg = new reqcDlg(this);
2428 dlg->move(this->pos().x()+50, this->pos().y()+50);
2429 dlg->exec();
2430 delete dlg;
2431}
2432
2433// Enable/Disable Start and Stop Buttons
2434////////////////////////////////////////////////////////////////////////////
2435void bncWindow::enableStartStop() {
2436
2437 if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2438 if (_runningPostProcessingReqc) {
2439 _actStart->setEnabled(false);
2440 }
2441 else {
2442 _actStart->setEnabled(true);
2443 }
2444 _actStop->setEnabled(false);
2445 }
2446 else {
2447 if (_runningRealTime) {
2448 _actStart->setEnabled(false);
2449 _actStop->setEnabled(true);
2450 }
2451 else {
2452 _actStop->setEnabled(false);
2453 if (_mountPointsTable->rowCount() == 0) {
2454 _actStart->setEnabled(false);
2455 }
2456 else {
2457 _actStart->setEnabled(true);
2458 }
2459 }
2460 }
2461}
2462
2463// Show Map
2464////////////////////////////////////////////////////////////////////////////
2465void bncWindow::slotMapMountPoints() {
2466 saveOptions();
2467 t_bncMap* bncMap = new t_bncMap(this);
2468 bncMap->setMinimumSize(800, 600);
2469 bncMap->setWindowTitle("Selected Mountpoints");
2470
2471 bncSettings settings;
2472 QListIterator<QString> it(settings.value("mountPoints").toStringList());
2473 while (it.hasNext()) {
2474 QStringList hlp = it.next().split(" ");
2475 if (hlp.size() < 5) continue;
2476 QUrl url(hlp[0]);
2477 double latDeg = hlp[2].toDouble();
2478 double lonDeg = hlp[3].toDouble();
2479 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
2480 }
2481
2482 bncMap->show();
2483}
2484
2485// Show Map
2486////////////////////////////////////////////////////////////////////////////
2487void bncWindow::slotMapPPP() {
2488#ifdef QT_WEBKIT
2489 saveOptions();
2490 enableWidget(false, _mapWinButton);
2491 enableWidget(false, _gmRadioButton);
2492 enableWidget(false, _osmRadioButton);
2493 enableWidget(false, _mapWinDotSizeLineEdit);
2494 enableWidget(false, _mapWinDotColorComboBox);
2495
2496 if (!_mapWin) {
2497 _mapWin = new bncMapWin(this);
2498 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
2499 QListIterator<bncGetThread*> it(_threads);
2500 while (it.hasNext()) {
2501 bncGetThread* thread = it.next();
2502 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2503 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2504 }
2505 }
2506 _mapWin->show();
2507#else
2508 QMessageBox::information(this, "Information",
2509 "Qt Library compiled without QtWebKit");
2510#endif
2511}
2512
2513// Show Map
2514////////////////////////////////////////////////////////////////////////////
2515void bncWindow::slotMapPPPClosed() {
2516#ifdef QT_WEBKIT
2517 slotBncTextChanged();
2518 if (_mapWin) {
2519 QListIterator<bncGetThread*> it(_threads);
2520 while (it.hasNext()) {
2521 bncGetThread* thread = it.next();
2522 thread->disconnect(_mapWin);
2523 }
2524 _mapWin->deleteLater();
2525 _mapWin = 0;
2526 }
2527#endif
2528}
Note: See TracBrowser for help on using the repository browser.