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

Last change on this file since 5861 was 5861, checked in by mervart, 8 years ago
File size: 122.2 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
581#ifdef USE_COMBINATION
582 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
583#endif
584 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
585 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
586
587 // Log Tab
588 // -------
589 _loggroup = new QTabWidget();
590 _loggroup->addTab(_log,tr("Log"));
591 _loggroup->addTab(_bncFigure,tr("Throughput"));
592 _loggroup->addTab(_bncFigureLate,tr("Latency"));
593 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
594
595 // Netowork (Proxy and SSL) Tab
596 // ----------------------------
597 QGridLayout* pLayout = new QGridLayout;
598 pLayout->setColumnMinimumWidth(0,13*ww);
599 _proxyPortLineEdit->setMaximumWidth(9*ww);
600
601 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
602 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
603 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
604 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
605 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
606 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
607 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
608 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
609 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
610 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
611 pLayout->addWidget(new QLabel(" "), 4, 0);
612 pLayout->addWidget(new QLabel(" "), 5, 0);
613 pLayout->addWidget(new QLabel(" "), 6, 0);
614 pgroup->setLayout(pLayout);
615
616 // General Tab
617 // -----------
618 QGridLayout* gLayout = new QGridLayout;
619 gLayout->setColumnMinimumWidth(0,14*ww);
620 _onTheFlyComboBox->setMaximumWidth(9*ww);
621
622 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
623 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
624 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
625 gLayout->addWidget(new QLabel("Append files"), 2, 0);
626 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
627 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
628 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
629 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
630 gLayout->addWidget(_autoStartCheckBox, 4, 1);
631 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
632 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
633 gLayout->addWidget(new QLabel(" "), 6, 0);
634 ggroup->setLayout(gLayout);
635
636 // RINEX Observations
637 // ------------------
638 QGridLayout* oLayout = new QGridLayout;
639 oLayout->setColumnMinimumWidth(0,14*ww);
640 _rnxIntrComboBox->setMaximumWidth(9*ww);
641 _rnxSamplSpinBox->setMaximumWidth(9*ww);
642
643 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
644 oLayout->addWidget(new QLabel("Directory"), 1, 0);
645 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
646 oLayout->addWidget(new QLabel("Interval"), 2, 0);
647 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
648 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
649 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
650 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
651 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
652 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
653 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
654 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
655 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
656 oLayout->addWidget(new QLabel(" "), 6, 0);
657 ogroup->setLayout(oLayout);
658
659 // RINEX Ephemeris
660 // ---------------
661 QGridLayout* eLayout = new QGridLayout;
662 eLayout->setColumnMinimumWidth(0,14*ww);
663 _ephIntrComboBox->setMaximumWidth(9*ww);
664 _outEphPortLineEdit->setMaximumWidth(9*ww);
665
666 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
667 eLayout->addWidget(new QLabel("Directory"), 1, 0);
668 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
669 eLayout->addWidget(new QLabel("Interval"), 2, 0);
670 eLayout->addWidget(_ephIntrComboBox, 2, 1);
671 eLayout->addWidget(new QLabel("Port"), 3, 0);
672 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
673 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
674 eLayout->addWidget(_ephV3CheckBox, 4, 1);
675 eLayout->addWidget(new QLabel(" "), 5, 0);
676 eLayout->addWidget(new QLabel(" "), 6, 0);
677 egroup->setLayout(eLayout);
678
679
680 // Broadcast Corrections
681 // ---------------------
682 QGridLayout* cLayout = new QGridLayout;
683 cLayout->setColumnMinimumWidth(0,14*ww);
684 _corrIntrComboBox->setMaximumWidth(9*ww);
685 _corrPortLineEdit->setMaximumWidth(9*ww);
686 _corrTimeSpinBox->setMaximumWidth(9*ww);
687
688 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
689 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
690 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
691 cLayout->addWidget(new QLabel("Interval"), 2, 0);
692 cLayout->addWidget(_corrIntrComboBox, 2, 1);
693 cLayout->addWidget(new QLabel("Port"), 3, 0);
694 cLayout->addWidget(_corrPortLineEdit, 3, 1);
695 cLayout->addWidget(new QLabel(" Wait for full corr epoch"), 3, 2, Qt::AlignRight);
696 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
697 cLayout->addWidget(new QLabel(" "), 4, 0);
698 cLayout->addWidget(new QLabel(" "), 5, 0);
699 cLayout->addWidget(new QLabel(" "), 6, 0);
700 cgroup->setLayout(cLayout);
701
702 // Feed Engine
703 // -----------
704 QGridLayout* sLayout = new QGridLayout;
705 sLayout->setColumnMinimumWidth(0,14*ww);
706 _outPortLineEdit->setMaximumWidth(9*ww);
707 _waitTimeSpinBox->setMaximumWidth(9*ww);
708 _binSamplSpinBox->setMaximumWidth(9*ww);
709 _outUPortLineEdit->setMaximumWidth(9*ww);
710
711 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine."),0,0,1,50);
712 sLayout->addWidget(new QLabel("Port"), 1, 0);
713 sLayout->addWidget(_outPortLineEdit, 1, 1);
714 sLayout->addWidget(new QLabel("Wait for full obs epoch"), 1, 2, Qt::AlignRight);
715 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
716 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
717 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
718 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
719 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
720 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
721 sLayout->addWidget(_outUPortLineEdit, 4, 1);
722 sLayout->addWidget(new QLabel(" "), 5, 0);
723 sLayout->addWidget(new QLabel(" "), 6, 0);
724 sgroup->setLayout(sLayout);
725
726 // Serial Output
727 // -------------
728 QGridLayout* serLayout = new QGridLayout;
729 serLayout->setColumnMinimumWidth(0,14*ww);
730 _serialBaudRateComboBox->setMaximumWidth(9*ww);
731 _serialFlowControlComboBox->setMaximumWidth(11*ww);
732 _serialDataBitsComboBox->setMaximumWidth(5*ww);
733 _serialParityComboBox->setMaximumWidth(9*ww);
734 _serialStopBitsComboBox->setMaximumWidth(5*ww);
735 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
736 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
737
738 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
739 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
740 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
741 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
742 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
743 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
744 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
745 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
746 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
747 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
748 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
749 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
750 serLayout->addWidget(_serialParityComboBox, 4, 3);
751 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
752 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
753 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
754 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
755 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
756 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
757 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
758 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
759 serLayout->addWidget(new QLabel(" "), 6, 0);
760
761 sergroup->setLayout(serLayout);
762
763 // Outages
764 // -------
765 QGridLayout* aLayout = new QGridLayout;
766 aLayout->setColumnMinimumWidth(0,14*ww);
767 _obsRateComboBox->setMaximumWidth(9*ww);
768 _adviseFailSpinBox->setMaximumWidth(9*ww);
769 _adviseRecoSpinBox->setMaximumWidth(9*ww);
770
771 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
772 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
773 aLayout->addWidget(_obsRateComboBox, 1, 1);
774 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
775 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
776 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
777 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
778 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
779 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
780 aLayout->addWidget(new QLabel(" "), 5, 0);
781 aLayout->addWidget(new QLabel(" "), 6, 0);
782 agroup->setLayout(aLayout);
783
784 // Miscellaneous
785 // -------------
786 QGridLayout* rLayout = new QGridLayout;
787 rLayout->setColumnMinimumWidth(0,14*ww);
788 _perfIntrComboBox->setMaximumWidth(9*ww);
789 _miscPortLineEdit->setMaximumWidth(9*ww);
790
791 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);
792 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
793 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
794 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
795 rLayout->addWidget(_perfIntrComboBox, 2, 1);
796 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
797 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
798 rLayout->addWidget(new QLabel("Port"), 4, 0);
799 rLayout->addWidget(_miscPortLineEdit, 4, 1);
800 rLayout->addWidget(new QLabel(" "), 5, 0);
801 rLayout->addWidget(new QLabel(" "), 6, 0);
802 rgroup->setLayout(rLayout);
803
804 // PPP
805 // ---
806 QGridLayout* pppLayout1 = new QGridLayout();
807 int ir = 0;
808 pppLayout1->addWidget(new QLabel("<b>Precise Point Positioning (Input and Output)</b>"), ir, 0, 1, 7, Qt::AlignLeft);
809 ++ir;
810 pppLayout1->addWidget(new QLabel("Data Source"), ir, 0, Qt::AlignLeft);
811 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
812 pppLayout1->addItem(new QSpacerItem(4*ww, 0), ir, 2);
813 pppLayout1->addWidget(new QLabel("RINEX Observations"), ir, 3, Qt::AlignLeft);
814 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 4, 1, 2);
815 ++ir;
816 pppLayout1->addWidget(new QLabel("RINEX Orbits"), ir, 3, Qt::AlignLeft);
817 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 4, 1, 2);
818 ++ir;
819 pppLayout1->addWidget(new QLabel("Corrections"), ir, 0, Qt::AlignLeft);
820 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
821 pppLayout1->addWidget(new QLabel("Corrections"), ir, 3, Qt::AlignLeft);
822 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 4, 1, 2);
823 ++ir;
824 pppLayout1->addWidget(new QLabel("<b>Input</b>"), ir, 0, Qt::AlignLeft);
825 pppLayout1->addWidget(new QLabel("<b>Output</b>"), ir, 4, 1, 2, Qt::AlignLeft);
826 ++ir;
827 pppLayout1->addWidget(new QLabel("Coordinates"), ir, 0, Qt::AlignLeft);
828 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 1, 1, 2);
829 pppLayout1->addWidget(new QLabel("Log File"), ir, 4, Qt::AlignLeft);
830 pppLayout1->addWidget(_pppWidgets._logFile, ir, 5);
831 ++ir;
832 pppLayout1->addWidget(new QLabel("ANTEX"), ir, 0, Qt::AlignLeft);
833 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1, 1, 2);
834 pppLayout1->addWidget(new QLabel("NMEA File"), ir, 4, Qt::AlignLeft);
835 pppLayout1->addWidget(_pppWidgets._nmeaFile, ir, 5);
836 pppLayout1->addWidget(new QLabel("Port"), ir, 6, Qt::AlignLeft);
837 pppLayout1->addWidget(_pppWidgets._nmeaPort, ir, 7);
838
839 pppGroup1->setLayout(pppLayout1);
840
841 QVBoxLayout* pppLayout2 = new QVBoxLayout();
842 pppLayout2->addWidget(new QLabel("<b>Precise Point Positioning (Processed Stations)</b>"));
843 pppLayout2->addWidget(_pppWidgets._staTable, 99);
844 QHBoxLayout* pppLayout2sub = new QHBoxLayout();
845 pppLayout2sub->addWidget(_pppWidgets._addStaButton);
846 pppLayout2sub->addWidget(_pppWidgets._delStaButton);
847 pppLayout2sub->addStretch(99);
848
849 pppLayout2->addLayout(pppLayout2sub);
850
851 pppGroup2->setLayout(pppLayout2);
852
853 QGridLayout* pppLayout3 = new QGridLayout();
854 ir = 0;
855 pppLayout3->addWidget(new QLabel("<b>Precise Point Positioning (Options)</b>"), ir, 0, 1, 2, Qt::AlignLeft);
856 ++ir;
857 pppLayout3->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
858 pppLayout3->addWidget(_pppWidgets._lcGPS, ir, 1);
859 pppLayout3->addItem(new QSpacerItem(4*ww, 0), ir, 2);
860 pppLayout3->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
861 pppLayout3->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
862 pppLayout3->addWidget(new QLabel("Sigma L1"), ir, 5, Qt::AlignLeft);
863 pppLayout3->addWidget(_pppWidgets._sigmaL1, ir, 6); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
864 ++ir;
865 pppLayout3->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
866 pppLayout3->addWidget(_pppWidgets._lcGLONASS, ir, 1);
867 ++ir;
868 pppLayout3->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
869 pppLayout3->addWidget(_pppWidgets._lcGalileo, ir, 1);
870 ++ir;
871 pppLayout3->addWidget(new QLabel("Wait for corrections"), ir, 0, Qt::AlignLeft);
872 pppLayout3->addWidget(_pppWidgets._corrWaitTime, ir, 1);
873 ++ir;
874 pppLayout3->addWidget(new QLabel(""), ir, 0);
875
876 pppGroup3->setLayout(pppLayout3);
877
878 // ------------------------
879 QVBoxLayout* pppLayout4 = new QVBoxLayout;
880 pppLayout4->addWidget(new QLabel("Precise Point Positioning, Panel 3."));
881 pppLayout4->addSpacing(ww);
882
883 QHBoxLayout* pppLayout4Hlp1 = new QHBoxLayout;
884 _pppPlotCoordinates = new QCheckBox();
885 _pppPlotCoordinates->setCheckState(Qt::CheckState(settings.value("pppPlotCoordinates").toInt()));
886 pppLayout4Hlp1->addWidget(new QLabel("PPP Plot "));
887 pppLayout4Hlp1->addWidget(_pppPlotCoordinates);
888 pppLayout4Hlp1->addWidget(new QLabel("Nort-East-Up Time Series"));
889 pppLayout4Hlp1->addStretch();
890 pppLayout4->addLayout(pppLayout4Hlp1);
891 pppLayout4->addSpacing(ww);
892
893 QHBoxLayout* pppLayout4Hlp2 = new QHBoxLayout;
894 pppLayout4Hlp2->addWidget(new QLabel("Track Plot "));
895 _mapWinButton = new QPushButton;
896 _mapWinButton->setText("Open Map");
897 connect(_mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
898 pppLayout4Hlp2->addWidget(_mapWinButton);
899
900 pppLayout4Hlp2->addSpacing(1*ww);
901
902 _gmRadioButton = new QRadioButton;
903 _gmRadioButton->setChecked(!settings.value("useOsmMap").toBool());
904 pppLayout4Hlp2->addWidget(new QLabel("Google"));
905 pppLayout4Hlp2->addWidget(_gmRadioButton);
906
907 _osmRadioButton = new QRadioButton;
908 _osmRadioButton->setChecked(settings.value("useOsmMap").toBool());
909 pppLayout4Hlp2->addWidget(new QLabel("OSM"));
910 pppLayout4Hlp2->addWidget(_osmRadioButton);
911
912 pppLayout4Hlp2->addSpacing(3*ww);
913
914 _mapWinDotSizeLineEdit = new QLineEdit(settings.value("mapWinDotSize").toString());
915 pppLayout4Hlp2->addWidget(new QLabel("Dot Size"));
916 _mapWinDotSizeLineEdit->setMaximumWidth(5*ww);
917 pppLayout4Hlp2->addWidget(_mapWinDotSizeLineEdit);
918
919 pppLayout4Hlp2->addSpacing(3*ww);
920
921 _mapWinDotColorComboBox = new QComboBox();
922 pppLayout4Hlp2->addWidget(new QLabel("Dot Color"));
923 _mapWinDotColorComboBox->setEditable(false);
924 _mapWinDotColorComboBox->addItems(QString("red,yellow").split(","));
925 ii = _mapWinDotColorComboBox->findText(settings.value("mapWinDotColor").toString());
926 if (ii != -1) {
927 _mapWinDotColorComboBox->setCurrentIndex(ii);
928 }
929 pppLayout4Hlp2->addWidget(_mapWinDotColorComboBox);
930
931 pppLayout4Hlp2->addSpacing(3*ww);
932
933 _mapSpeedSlider = new QSlider;
934 _mapSpeedSlider->setOrientation(Qt::Horizontal);
935 _mapSpeedSlider->setRange(1, 100);
936 _mapSpeedSlider->setTickPosition(QSlider::TicksBelow);
937 _mapSpeedSlider->setTickInterval(10);
938 int speed = settings.value("mapSpeed").toInt();
939 if (speed == 0) speed = _mapSpeedSlider->maximum();
940 _mapSpeedSlider->setSliderPosition(speed);
941 pppLayout4Hlp2->addWidget(new QLabel("Speed"));
942 pppLayout4Hlp2->addWidget(_mapSpeedSlider);
943
944 pppLayout4Hlp2->addStretch();
945 pppLayout4->addLayout(pppLayout4Hlp2);
946
947 pppLayout4->addStretch();
948 pppGroup4->setLayout(pppLayout4);
949
950 // Reqc Processing
951 // ---------------
952 _reqcActionComboBox = new QComboBox();
953 _reqcActionComboBox->setEditable(false);
954 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
955 int ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
956 if (ik != -1) {
957 _reqcActionComboBox->setCurrentIndex(ik);
958 }
959 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
960 this, SLOT(slotBncTextChanged()));
961
962 QGridLayout* reqcLayout = new QGridLayout;
963 _reqcActionComboBox->setMinimumWidth(15*ww);
964 _reqcActionComboBox->setMaximumWidth(15*ww);
965
966 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
967 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
968 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
969 _reqcObsFileChooser->setMinimumWidth(15*ww);
970 _reqcObsFileChooser->setMaximumWidth(15*ww);
971
972 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
973 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
974 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
975 _reqcNavFileChooser->setMinimumWidth(15*ww);
976 _reqcNavFileChooser->setMaximumWidth(15*ww);
977
978 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
979 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to a RINEX observation output file."));
980 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
981 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
982
983 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
984 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to a RINEX navigation output file."));
985 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
986 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
987
988 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
989 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to a logfile."));
990 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
991 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
992
993 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
994 _reqcPlotDirLineEdit->setWhatsThis(tr("Specify the directory name for saving plots."));
995 _reqcPlotDirLineEdit->setMinimumWidth(15*ww);
996 _reqcPlotDirLineEdit->setMaximumWidth(15*ww);
997
998 _reqcSkyPlotSystems = new QComboBox();
999 _reqcSkyPlotSystems->setEditable(false);
1000 _reqcSkyPlotSystems->addItems(QString("ALL,GPS,GLONASS,Galileo").split(","));
1001 ik = _reqcSkyPlotSystems->findText(settings.value("reqcSkyPlotSystems").toString());
1002 if (ik != -1) {
1003 _reqcSkyPlotSystems->setCurrentIndex(ik);
1004 }
1005
1006 ir = 0;
1007 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1008 ++ir;
1009 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1010 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1011 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1012 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1013 ++ir;
1014 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1015 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1016 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1017 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1018 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1019 ++ir;
1020 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1021 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1022 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1023 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1024 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1025 ++ir;
1026 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1027 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1028 ++ir;
1029 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0, Qt::AlignLeft);
1030 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1, Qt::AlignRight);
1031 ++ir;
1032 reqcLayout->addWidget(new QLabel("Sky plots for"), ir, 0, Qt::AlignLeft);
1033 reqcLayout->addWidget(_reqcSkyPlotSystems, ir, 1, Qt::AlignRight);
1034 ++ir;
1035 reqcLayout->addWidget(new QLabel(""), ir, 1);
1036 reqcLayout->setRowStretch(ir, 999);
1037
1038 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1039 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1040
1041 reqcgroup->setLayout(reqcLayout);
1042
1043 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1044 this, SLOT(slotReqcEditOption()));
1045
1046 // Combine Corrections
1047 // -------------------
1048 QGridLayout* cmbLayout = new QGridLayout;
1049
1050 populateCmbTable();
1051 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1052 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1053 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1054 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1055 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1056 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1057 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1058 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1059 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1060 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1061 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1062 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1063 cmbLayout->addWidget(new QLabel(" "), 4, 5);
1064 cmbLayout->addWidget(new QLabel("Sampling"), 4, 6, Qt::AlignRight);
1065 cmbLayout->addWidget(_cmbSamplSpinBox, 4, 7, Qt::AlignRight);
1066 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1067
1068 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1069 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1070
1071 cmbgroup->setLayout(cmbLayout);
1072
1073 // Upload Layout (Clocks)
1074 // ----------------------
1075 QGridLayout* uploadHlpLayout = new QGridLayout();
1076
1077 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1078 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1079 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1080
1081 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1082 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1083 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1084 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1085 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1086 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1087 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1088 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1089 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1090 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1091 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1092
1093 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1094 populateUploadTable();
1095
1096 uploadLayout->addWidget(new QLabel("Upload RTCMv3 Broadcast Corrections to caster."));
1097 uploadLayout->addWidget(_uploadTable);
1098 uploadLayout->addLayout(uploadHlpLayout);
1099
1100 uploadgroup->setLayout(uploadLayout);
1101
1102 // Upload Layout (Ephemeris)
1103 // -------------------------
1104 QGridLayout* uploadLayoutEph = new QGridLayout;
1105
1106 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1107 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1108 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1109 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1110
1111 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1112 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1113 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1114 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1115 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1116 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1117 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1118 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1119 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1120 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1121 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1122 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1123 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1124 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1125 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1126
1127 uploadEphgroup->setLayout(uploadLayoutEph);
1128
1129 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1130 this, SLOT(slotBncTextChanged()));
1131
1132 // Main Layout
1133 // -----------
1134 QGridLayout* mLayout = new QGridLayout;
1135 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1136 mLayout->addWidget(_aogroup, 0,0);
1137 mLayout->addWidget(_mountPointsTable, 1,0);
1138 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1139 mLayout->addWidget(_loggroup, 2,0);
1140
1141 _canvas->setLayout(mLayout);
1142
1143 // WhatsThis
1144 // ---------
1145 _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>"));
1146 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1147 _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>"));
1148 _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>"));
1149 _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>"));
1150 _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."));
1151 _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."));
1152 _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."));
1153 _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."));
1154 _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."));
1155 _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>"));
1156 _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."));
1157 _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."));
1158 _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."));
1159 _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>"));
1160 _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>"));
1161 _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>"));
1162 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1163 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1164 _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>"));
1165 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1166 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1167 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1168 _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>"));
1169 _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>"));
1170 _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>"));
1171 _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>"));
1172 _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>"));
1173 _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."));
1174 _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>"));
1175 _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>"));
1176 _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>"));
1177 _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."));
1178 _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)."));
1179 _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."));
1180 _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."));
1181 _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."));
1182 _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>"));
1183 _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."));
1184 _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>."));
1185 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1186 _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>"));
1187 _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>"));
1188 _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>"));
1189 _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>"));
1190 _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>"));
1191 _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>"));
1192 _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>"));
1193 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1194 _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>"));
1195 _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>"));
1196 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1197 _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."));
1198 _gmRadioButton->setWhatsThis(tr("<p>Specify Google Maps as the background for your rover positions."));
1199 _osmRadioButton->setWhatsThis(tr("<p>Specify Open Street Map as the background for your rover positions."));
1200 _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>"));
1201 _mapWinDotColorComboBox->setWhatsThis(tr("<p>Specify the color of dots showing the rover track.</p>"));
1202 _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."));
1203 _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."));
1204 _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."));
1205 _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>"));
1206 _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>"));
1207 _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>"));
1208 _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>"));
1209 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1210 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1211 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1212 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1213 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1214 _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."));
1215 _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."));
1216 _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."));
1217 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1218 _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."));
1219 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1220 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1221 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1222 _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."));
1223 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1224 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1225 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1226 _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>"));
1227 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1228 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1229// Weber
1230
1231 // Enable/Disable all Widgets
1232 // --------------------------
1233 slotBncTextChanged();
1234 enableStartStop();
1235
1236 // Auto start
1237 // ----------
1238 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1239 slotStart();
1240 }
1241}
1242
1243// Destructor
1244////////////////////////////////////////////////////////////////////////////
1245bncWindow::~bncWindow() {
1246 delete _caster; BNC_CORE->setCaster(0);
1247 delete _casterEph;
1248 delete _pppMain;
1249}
1250
1251//
1252////////////////////////////////////////////////////////////////////////////
1253void bncWindow::populateMountPointsTable() {
1254
1255 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1256 _mountPointsTable->removeRow(iRow);
1257 }
1258
1259 bncSettings settings;
1260
1261 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1262 int iRow = 0;
1263 while (it.hasNext()) {
1264 QStringList hlp = it.next().split(" ");
1265 if (hlp.size() < 5) continue;
1266 _mountPointsTable->insertRow(iRow);
1267
1268 QUrl url(hlp[0]);
1269
1270 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1271 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1272 QString nmea(hlp[4]);
1273 if (hlp[5] == "S") {
1274 fullPath = hlp[0].replace(0,2,"");
1275 }
1276 QString ntripVersion = "2";
1277 if (hlp.size() >= 6) {
1278 ntripVersion = (hlp[5]);
1279 }
1280
1281 QTableWidgetItem* it;
1282 it = new QTableWidgetItem(url.userInfo());
1283 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1284 _mountPointsTable->setItem(iRow, 0, it);
1285
1286 it = new QTableWidgetItem(fullPath);
1287 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1288 _mountPointsTable->setItem(iRow, 1, it);
1289
1290 it = new QTableWidgetItem(format);
1291 _mountPointsTable->setItem(iRow, 2, it);
1292
1293 if (nmea == "yes") {
1294 it = new QTableWidgetItem(latitude);
1295 _mountPointsTable->setItem(iRow, 3, it);
1296 it = new QTableWidgetItem(longitude);
1297 _mountPointsTable->setItem(iRow, 4, it);
1298 } else {
1299 it = new QTableWidgetItem(latitude);
1300 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1301 _mountPointsTable->setItem(iRow, 3, it);
1302 it = new QTableWidgetItem(longitude);
1303 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1304 _mountPointsTable->setItem(iRow, 4, it);
1305 }
1306
1307 it = new QTableWidgetItem(nmea);
1308 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1309 _mountPointsTable->setItem(iRow, 5, it);
1310
1311 it = new QTableWidgetItem(ntripVersion);
1312 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1313 _mountPointsTable->setItem(iRow, 6, it);
1314
1315 bncTableItem* bncIt = new bncTableItem();
1316 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1317 _mountPointsTable->setItem(iRow, 7, bncIt);
1318
1319 iRow++;
1320 }
1321
1322 _mountPointsTable->sortItems(1);
1323
1324 enableStartStop();
1325}
1326
1327// Retrieve Table
1328////////////////////////////////////////////////////////////////////////////
1329void bncWindow::slotAddMountPoints() {
1330
1331 bncSettings settings;
1332 QString proxyHost = settings.value("proxyHost").toString();
1333 int proxyPort = settings.value("proxyPort").toInt();
1334 if (proxyHost != _proxyHostLineEdit->text() ||
1335 proxyPort != _proxyPortLineEdit->text().toInt()) {
1336 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1337 "changed. Use the new ones?",
1338 QMessageBox::Yes, QMessageBox::No,
1339 QMessageBox::NoButton);
1340 if (iRet == QMessageBox::Yes) {
1341 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1342 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1343 }
1344 }
1345
1346 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1347 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1348
1349 QMessageBox msgBox;
1350 msgBox.setIcon(QMessageBox::Question);
1351 msgBox.setWindowTitle("Add Stream");
1352 msgBox.setText("Add stream(s) coming from:");
1353
1354 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1355 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1356 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1357 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1358 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1359
1360 msgBox.exec();
1361
1362 if (msgBox.clickedButton() == buttonNtrip) {
1363 bncTableDlg* dlg = new bncTableDlg(this);
1364 dlg->move(this->pos().x()+50, this->pos().y()+50);
1365 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1366 this, SLOT(slotNewMountPoints(QStringList*)));
1367 dlg->exec();
1368 delete dlg;
1369 } else if (msgBox.clickedButton() == buttonIP) {
1370 bncIpPort* ipp = new bncIpPort(this);
1371 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1372 this, SLOT(slotNewMountPoints(QStringList*)));
1373 ipp->exec();
1374 delete ipp;
1375 } else if (msgBox.clickedButton() == buttonUDP) {
1376 bncUdpPort* udp = new bncUdpPort(this);
1377 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1378 this, SLOT(slotNewMountPoints(QStringList*)));
1379 udp->exec();
1380 delete udp;
1381 } else if (msgBox.clickedButton() == buttonSerial) {
1382 bncSerialPort* sep = new bncSerialPort(this);
1383 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1384 this, SLOT(slotNewMountPoints(QStringList*)));
1385 sep->exec();
1386 delete sep;
1387 } else if (msgBox.clickedButton() == buttonCancel) {
1388 // Cancel
1389 }
1390
1391 enableStartStop();
1392}
1393
1394// Delete Selected Mount Points
1395////////////////////////////////////////////////////////////////////////////
1396void bncWindow::slotDeleteMountPoints() {
1397
1398 int nRows = _mountPointsTable->rowCount();
1399 bool flg[nRows];
1400 for (int iRow = 0; iRow < nRows; iRow++) {
1401 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1402 flg[iRow] = true;
1403 }
1404 else {
1405 flg[iRow] = false;
1406 }
1407 }
1408 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1409 if (flg[iRow]) {
1410 _mountPointsTable->removeRow(iRow);
1411 }
1412 }
1413 _actDeleteMountPoints->setEnabled(false);
1414
1415 enableStartStop();
1416}
1417
1418// New Mount Points Selected
1419////////////////////////////////////////////////////////////////////////////
1420void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1421 int iRow = 0;
1422 QListIterator<QString> it(*mountPoints);
1423 while (it.hasNext()) {
1424 QStringList hlp = it.next().split(" ");
1425 QUrl url(hlp[0]);
1426 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1427 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1428 QString nmea(hlp[4]);
1429 if (hlp[5] == "S") {
1430 fullPath = hlp[0].replace(0,2,"");
1431 }
1432 QString ntripVersion = "2";
1433 if (hlp.size() >= 6) {
1434 ntripVersion = (hlp[5]);
1435 }
1436
1437 _mountPointsTable->insertRow(iRow);
1438
1439 QTableWidgetItem* it;
1440 it = new QTableWidgetItem(url.userInfo());
1441 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1442 _mountPointsTable->setItem(iRow, 0, it);
1443
1444 it = new QTableWidgetItem(fullPath);
1445 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1446 _mountPointsTable->setItem(iRow, 1, it);
1447
1448 it = new QTableWidgetItem(format);
1449 _mountPointsTable->setItem(iRow, 2, it);
1450
1451 if (nmea == "yes") {
1452 it = new QTableWidgetItem(latitude);
1453 _mountPointsTable->setItem(iRow, 3, it);
1454 it = new QTableWidgetItem(longitude);
1455 _mountPointsTable->setItem(iRow, 4, it);
1456 } else {
1457 it = new QTableWidgetItem(latitude);
1458 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1459 _mountPointsTable->setItem(iRow, 3, it);
1460 it = new QTableWidgetItem(longitude);
1461 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1462 _mountPointsTable->setItem(iRow, 4, it);
1463 }
1464
1465 it = new QTableWidgetItem(nmea);
1466 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1467 _mountPointsTable->setItem(iRow, 5, it);
1468
1469 it = new QTableWidgetItem(ntripVersion);
1470 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1471 _mountPointsTable->setItem(iRow, 6, it);
1472
1473 bncTableItem* bncIt = new bncTableItem();
1474 _mountPointsTable->setItem(iRow, 7, bncIt);
1475
1476 iRow++;
1477 }
1478 _mountPointsTable->hideColumn(0);
1479 _mountPointsTable->sortItems(1);
1480 delete mountPoints;
1481
1482 enableStartStop();
1483}
1484
1485// Save Options (serialize)
1486////////////////////////////////////////////////////////////////////////////
1487void bncWindow::slotSaveOptions() {
1488 saveOptions();
1489 bncSettings settings;
1490 settings.sync();
1491}
1492
1493// Save Options (memory only)
1494////////////////////////////////////////////////////////////////////////////
1495void bncWindow::saveOptions() {
1496
1497 QStringList mountPoints;
1498 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1499
1500 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1501 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1502 "@" + _mountPointsTable->item(iRow, 1)->text() );
1503
1504 mountPoints.append(url.toString() + " " +
1505 _mountPointsTable->item(iRow, 2)->text()
1506 + " " + _mountPointsTable->item(iRow, 3)->text()
1507 + " " + _mountPointsTable->item(iRow, 4)->text()
1508 + " " + _mountPointsTable->item(iRow, 5)->text()
1509 + " " + _mountPointsTable->item(iRow, 6)->text());
1510 } else {
1511 mountPoints.append(
1512 "//" + _mountPointsTable->item(iRow, 1)->text()
1513 + " " + _mountPointsTable->item(iRow, 2)->text()
1514 + " " + _mountPointsTable->item(iRow, 3)->text()
1515 + " " + _mountPointsTable->item(iRow, 4)->text()
1516 + " " + _mountPointsTable->item(iRow, 5)->text()
1517 + " " + _mountPointsTable->item(iRow, 6)->text());
1518 }
1519 }
1520
1521 QStringList combineStreams;
1522 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1523 QString hlp;
1524 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1525 if (_cmbTable->item(iRow, iCol)) {
1526 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1527 }
1528 }
1529 if (!hlp.isEmpty()) {
1530 combineStreams << hlp;
1531 }
1532 }
1533
1534 QStringList uploadMountpointsOut;
1535 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1536 QString hlp;
1537 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1538 if (_uploadTable->cellWidget(iRow, iCol) &&
1539 (iCol == 3 || iCol == 4 || iCol == 5)) {
1540 if (iCol == 3) {
1541 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1542 hlp += passwd->text() + ",";
1543 }
1544 else if (iCol == 4) {
1545 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1546 hlp += system->currentText() + ",";
1547 }
1548 else if (iCol == 5) {
1549 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1550 QString state; state.setNum(com->checkState());
1551 hlp += state + ",";
1552 }
1553 }
1554 else if (_uploadTable->item(iRow, iCol)) {
1555 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1556 }
1557 }
1558 if (!hlp.isEmpty()) {
1559 uploadMountpointsOut << hlp;
1560 }
1561 }
1562
1563 bncSettings settings;
1564
1565 settings.setValue("startTab", _aogroup->currentIndex());
1566 settings.setValue("statusTab", _loggroup->currentIndex());
1567 settings.setValue("mountPoints", mountPoints);
1568// Network
1569 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1570 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1571 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1572 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1573// General
1574 settings.setValue("logFile", _logFileLineEdit->text());
1575 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1576 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1577 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1578 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1579// RINEX Observations
1580 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1581 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1582 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1583 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1584 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1585 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1586// RINEX Ephemeris
1587 settings.setValue("ephPath", _ephPathLineEdit->text());
1588 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1589 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1590 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1591// Broadcast Corrections
1592 settings.setValue("corrPath", _corrPathLineEdit->text());
1593 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1594 settings.setValue("corrPort", _corrPortLineEdit->text());
1595 settings.setValue("corrTime", _corrTimeSpinBox->value());
1596// Feed Engine
1597 settings.setValue("outPort", _outPortLineEdit->text());
1598 settings.setValue("waitTime", _waitTimeSpinBox->value());
1599 settings.setValue("binSampl", _binSamplSpinBox->value());
1600 settings.setValue("outFile", _outFileLineEdit->text());
1601 settings.setValue("outUPort", _outUPortLineEdit->text());
1602// Serial Output
1603 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1604 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1605 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1606 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1607 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1608 settings.setValue("serialParity", _serialParityComboBox->currentText());
1609 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1610 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1611 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1612 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1613// Outages
1614 settings.setValue("obsRate", _obsRateComboBox->currentText());
1615 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1616 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1617 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1618// Miscellaneous
1619 settings.setValue("miscMount", _miscMountLineEdit->text());
1620 settings.setValue("miscPort", _miscPortLineEdit->text());
1621 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1622 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1623 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1624 settings.setValue("useOsmMap", _osmRadioButton->isChecked());
1625 settings.setValue("mapWinDotSize", _mapWinDotSizeLineEdit->text());
1626 settings.setValue("mapWinDotColor", _mapWinDotColorComboBox->currentText());
1627 settings.setValue("mapSpeed", _mapSpeedSlider->value());
1628// Reqc
1629 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1630 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1631 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1632 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1633 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1634 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1635 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
1636 settings.setValue("reqcSkyPlotSystems", _reqcSkyPlotSystems->currentText());
1637// Combine Corrections
1638 if (!combineStreams.isEmpty()) {
1639 settings.setValue("combineStreams", combineStreams);
1640 }
1641 else {
1642 settings.setValue("combineStreams", "");
1643 }
1644 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1645 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1646 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1647// Upload Corrections
1648 if (!uploadMountpointsOut.isEmpty()) {
1649 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1650 }
1651 else {
1652 settings.setValue("uploadMountpointsOut", "");
1653 }
1654 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1655 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1656 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1657 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1658// Upload Ephemeris
1659 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1660 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1661 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1662 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1663 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1664
1665 if (_caster) {
1666 _caster->readMountPoints();
1667 }
1668
1669 _pppWidgets.saveOptions();
1670}
1671
1672// All get slots terminated
1673////////////////////////////////////////////////////////////////////////////
1674void bncWindow::slotGetThreadsFinished() {
1675 BNC_CORE->slotMessage("All Get Threads Terminated", true);
1676 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
1677 delete _casterEph; _casterEph = 0;
1678 _runningRealTime = false;
1679}
1680
1681// Start It!
1682////////////////////////////////////////////////////////////////////////////
1683void bncWindow::slotStart() {
1684 saveOptions();
1685 if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1686 startPostProcessingReqc();
1687 }
1688 else {
1689 startRealTime();
1690 }
1691 if (_pppMain) {
1692 _pppMain->start();
1693 }
1694}
1695
1696// Start Real-Time (Retrieve Data etc.)
1697////////////////////////////////////////////////////////////////////////////
1698void bncWindow::startRealTime() {
1699
1700 _runningRealTime = true;
1701
1702 _bncFigurePPP->reset();
1703
1704 _actDeleteMountPoints->setEnabled(false);
1705
1706 enableStartStop();
1707
1708 _caster = new bncCaster();
1709
1710 BNC_CORE->setCaster(_caster);
1711 BNC_CORE->setPort(_outEphPortLineEdit->text().toInt());
1712 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
1713 BNC_CORE->initCombination();
1714
1715 connect(_caster, SIGNAL(getThreadsFinished()),
1716 this, SLOT(slotGetThreadsFinished()));
1717
1718 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1719 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1720
1721 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1722
1723 bncSettings settings;
1724
1725 QDir rnxdir(settings.value("rnxPath").toString());
1726 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
1727
1728 QString rnx_file = settings.value("rnxScript").toString();
1729 if ( !rnx_file.isEmpty() ) {
1730 QFile rnxfile(settings.value("rnxScript").toString());
1731 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
1732 }
1733
1734 QDir ephdir(settings.value("ephPath").toString());
1735 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
1736
1737 QDir corrdir(settings.value("corrPath").toString());
1738 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
1739
1740 QString advise_file = settings.value("adviseScript").toString();
1741 if ( !advise_file.isEmpty() ) {
1742 QFile advisefile(settings.value("adviseScript").toString());
1743 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
1744 }
1745
1746 QString ant_file = settings.value("pppAntex").toString();
1747 if ( !ant_file.isEmpty() ) {
1748 QFile anxfile(settings.value("pppAntex").toString());
1749 if (!anxfile.exists()) BNC_CORE->slotMessage("Cannot find IGS ANTEX file", true);
1750 }
1751
1752 _caster->readMountPoints();
1753
1754 _casterEph = new bncEphUploadCaster();
1755 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1756 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1757}
1758
1759// Retrieve Data
1760////////////////////////////////////////////////////////////////////////////
1761void bncWindow::slotStop() {
1762 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1763 QMessageBox::Yes, QMessageBox::No,
1764 QMessageBox::NoButton);
1765 if (iRet == QMessageBox::Yes) {
1766 if (_pppMain) {
1767 _pppMain->slotStop();
1768 }
1769 BNC_CORE->stopCombination();
1770 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
1771 delete _casterEph; _casterEph = 0;
1772 _runningRealTime = false;
1773 enableStartStop();
1774 }
1775}
1776
1777// Close Application gracefully
1778////////////////////////////////////////////////////////////////////////////
1779void bncWindow::closeEvent(QCloseEvent* event) {
1780
1781 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1782 QMessageBox::Yes, QMessageBox::No,
1783 QMessageBox::Cancel);
1784
1785 if (iRet == QMessageBox::Cancel) {
1786 event->ignore();
1787 return;
1788 }
1789 else if (iRet == QMessageBox::Yes) {
1790 slotSaveOptions();
1791 }
1792
1793 if (_pppMain) {
1794 _pppMain->slotStop();
1795 }
1796
1797 QMainWindow::closeEvent(event);
1798}
1799
1800// User changed the selection of mountPoints
1801////////////////////////////////////////////////////////////////////////////
1802void bncWindow::slotSelectionChanged() {
1803 if (_mountPointsTable->selectedItems().isEmpty()) {
1804 _actDeleteMountPoints->setEnabled(false);
1805 }
1806 else {
1807 _actDeleteMountPoints->setEnabled(true);
1808 }
1809}
1810
1811// Display Program Messages
1812////////////////////////////////////////////////////////////////////////////
1813void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1814
1815#ifdef DEBUG_RTCM2_2021
1816 const int maxBufferSize = 1000;
1817#else
1818 const int maxBufferSize = 10000;
1819#endif
1820
1821 if (! showOnScreen ) {
1822 return;
1823 }
1824
1825 QString txt = _log->toPlainText() + "\n" +
1826 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1827 _log->clear();
1828 _log->append(txt.right(maxBufferSize));
1829}
1830
1831// About Message
1832////////////////////////////////////////////////////////////////////////////
1833void bncWindow::slotAbout() {
1834 new bncAboutDlg(0);
1835}
1836
1837//Flowchart
1838////////////////////////////////////////////////////////////////////////////
1839void bncWindow::slotFlowchart() {
1840 new bncFlowchartDlg(0);
1841}
1842
1843// Help Window
1844////////////////////////////////////////////////////////////////////////////
1845void bncWindow::slotHelp() {
1846 QUrl url;
1847 url.setPath(":bnchelp.html");
1848 new bncHlpDlg(0, url);
1849}
1850
1851// Select Fonts
1852////////////////////////////////////////////////////////////////////////////
1853void bncWindow::slotFontSel() {
1854 bool ok;
1855 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1856 if (ok) {
1857 bncSettings settings;
1858 settings.setValue("font", newFont.toString());
1859 QApplication::setFont(newFont);
1860 int ww = QFontMetrics(newFont).width('w');
1861 setMinimumSize(60*ww, 80*ww);
1862 resize(60*ww, 80*ww);
1863 }
1864}
1865
1866// Whats This Help
1867void bncWindow::slotWhatsThis() {
1868 QWhatsThis::enterWhatsThisMode();
1869}
1870
1871//
1872////////////////////////////////////////////////////////////////////////////
1873void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1874 _threads = threads;
1875
1876 _bncFigure->updateMountPoints();
1877 _bncFigureLate->updateMountPoints();
1878
1879 populateMountPointsTable();
1880 bncSettings settings;
1881 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1882 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1883 QListIterator<bncGetThread*> iTh(threads);
1884 while (iTh.hasNext()) {
1885 bncGetThread* thread = iTh.next();
1886 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1887 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1888 "@" + _mountPointsTable->item(iRow, 1)->text() );
1889 if (url == thread->mountPoint() &&
1890 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1891 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1892 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1893 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1894 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1895 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1896 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1897 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1898 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1899 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1900 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1901 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1902 disconnect(thread,
1903 SIGNAL(newPosition(bncTime, double, double, double)),
1904 _bncFigurePPP,
1905 SLOT(slotNewPosition(bncTime, double, double, double)));
1906 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1907 _bncFigurePPP,
1908 SLOT(slotNewPosition(bncTime, double, double, double)));
1909 }
1910#ifdef QT_WEBKIT
1911 if (_mapWin) {
1912 disconnect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1913 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
1914 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1915 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
1916 }
1917#endif
1918 break;
1919 }
1920 }
1921 }
1922}
1923
1924//
1925////////////////////////////////////////////////////////////////////////////
1926void bncWindow::CreateMenu() {
1927 // Create Menus
1928 // ------------
1929 _menuFile = menuBar()->addMenu(tr("&File"));
1930 _menuFile->addAction(_actFontSel);
1931 _menuFile->addSeparator();
1932 _menuFile->addAction(_actSaveOpt);
1933 _menuFile->addSeparator();
1934 _menuFile->addAction(_actQuit);
1935
1936 _menuHlp = menuBar()->addMenu(tr("&Help"));
1937 _menuHlp->addAction(_actHelp);
1938 _menuHlp->addAction(_actFlowchart);
1939 _menuHlp->addAction(_actAbout);
1940}
1941
1942// Toolbar
1943////////////////////////////////////////////////////////////////////////////
1944void bncWindow::AddToolbar() {
1945 QToolBar* toolBar = new QToolBar;
1946 addToolBar(Qt::BottomToolBarArea, toolBar);
1947 toolBar->setMovable(false);
1948 toolBar->addAction(_actAddMountPoints);
1949 toolBar->addAction(_actDeleteMountPoints);
1950 toolBar->addAction(_actMapMountPoints);
1951 toolBar->addAction(_actStart);
1952 toolBar->addAction(_actStop);
1953 toolBar->addWidget(new QLabel(" "));
1954 toolBar->addAction(_actwhatsthis);
1955}
1956
1957// About
1958////////////////////////////////////////////////////////////////////////////
1959bncAboutDlg::bncAboutDlg(QWidget* parent) :
1960 QDialog(parent) {
1961
1962 QTextBrowser* tb = new QTextBrowser;
1963 QUrl url; url.setPath(":bncabout.html");
1964 tb->setSource(url);
1965 tb->setReadOnly(true);
1966
1967 int ww = QFontMetrics(font()).width('w');
1968 QPushButton* _closeButton = new QPushButton("Close");
1969 _closeButton->setMaximumWidth(10*ww);
1970 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1971
1972 QGridLayout* dlgLayout = new QGridLayout();
1973 QLabel* img = new QLabel();
1974 img->setPixmap(QPixmap(":ntrip-logo.png"));
1975 dlgLayout->addWidget(img, 0,0);
1976 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1977 dlgLayout->addWidget(tb,1,0,1,2);
1978 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1979
1980 setLayout(dlgLayout);
1981 resize(60*ww, 60*ww);
1982 setWindowTitle("About BNC");
1983 show();
1984}
1985
1986//
1987////////////////////////////////////////////////////////////////////////////
1988bncAboutDlg::~bncAboutDlg() {
1989};
1990
1991// Flowchart
1992////////////////////////////////////////////////////////////////////////////
1993bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1994 QDialog(parent) {
1995
1996 int ww = QFontMetrics(font()).width('w');
1997 QPushButton* _closeButton = new QPushButton("Close");
1998 _closeButton->setMaximumWidth(10*ww);
1999 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2000
2001 QGridLayout* dlgLayout = new QGridLayout();
2002 QLabel* img = new QLabel();
2003 img->setPixmap(QPixmap(":bncflowchart.png"));
2004 dlgLayout->addWidget(img, 0,0);
2005 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2006
2007 setLayout(dlgLayout);
2008 setWindowTitle("Flow Chart");
2009 show();
2010}
2011
2012//
2013////////////////////////////////////////////////////////////////////////////
2014bncFlowchartDlg::~bncFlowchartDlg() {
2015};
2016
2017// Enable/Disable Widget (and change its color)
2018////////////////////////////////////////////////////////////////////////////
2019void bncWindow::enableWidget(bool enable, QWidget* widget) {
2020 const static QPalette paletteWhite(QColor(255, 255, 255));
2021 const static QPalette paletteGray(QColor(230, 230, 230));
2022
2023 widget->setEnabled(enable);
2024 if (enable) {
2025 widget->setPalette(paletteWhite);
2026 }
2027 else {
2028 widget->setPalette(paletteGray);
2029 }
2030}
2031
2032// Bnc Text
2033////////////////////////////////////////////////////////////////////////////
2034void bncWindow::slotBncTextChanged(){
2035
2036 bool enable = true;
2037
2038 // Proxy
2039 //------
2040 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2041 enable = !_proxyHostLineEdit->text().isEmpty();
2042 enableWidget(enable, _proxyPortLineEdit);
2043 }
2044
2045 // RINEX Observations
2046 // ------------------
2047 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2048 enable = !_rnxPathLineEdit->text().isEmpty();
2049 enableWidget(enable, _rnxSamplSpinBox);
2050 enableWidget(enable, _rnxSkelLineEdit);
2051 enableWidget(enable, _rnxScrpLineEdit);
2052 enableWidget(enable, _rnxV3CheckBox);
2053 enableWidget(enable, _rnxIntrComboBox);
2054 }
2055
2056 // RINEX Ephemeris
2057 // ---------------
2058 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2059 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2060 enableWidget(enable, _ephIntrComboBox);
2061 enableWidget(enable, _ephV3CheckBox);
2062 }
2063
2064 // Broadcast Corrections
2065 // ---------------------
2066 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2067 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2068 enableWidget(enable, _corrIntrComboBox);
2069 }
2070
2071 // Feed Engine
2072 // -----------
2073 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2074 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2075 enableWidget(enable, _waitTimeSpinBox);
2076 enableWidget(enable, _binSamplSpinBox);
2077 }
2078
2079 // Serial Output
2080 // -------------
2081 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2082 sender() == _serialAutoNMEAComboBox) {
2083 enable = !_serialMountPointLineEdit->text().isEmpty();
2084 enableWidget(enable, _serialPortNameLineEdit);
2085 enableWidget(enable, _serialBaudRateComboBox);
2086 enableWidget(enable, _serialParityComboBox);
2087 enableWidget(enable, _serialDataBitsComboBox);
2088 enableWidget(enable, _serialStopBitsComboBox);
2089 enableWidget(enable, _serialFlowControlComboBox);
2090 enableWidget(enable, _serialAutoNMEAComboBox);
2091
2092 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2093 enableWidget(enable2, _serialFileNMEALineEdit);
2094 }
2095
2096 // Outages
2097 // -------
2098 if (sender() == 0 || sender() == _obsRateComboBox) {
2099 enable = !_obsRateComboBox->currentText().isEmpty();
2100 enableWidget(enable, _adviseFailSpinBox);
2101 enableWidget(enable, _adviseRecoSpinBox);
2102 enableWidget(enable, _adviseScriptLineEdit);
2103 }
2104
2105 // Miscellaneous
2106 // -------------
2107 if (sender() == 0 || sender() == _miscMountLineEdit) {
2108 enable = !_miscMountLineEdit->text().isEmpty();
2109 enableWidget(enable, _perfIntrComboBox);
2110 enableWidget(enable, _scanRTCMCheckBox);
2111 enableWidget(enable, _miscPortLineEdit);
2112 }
2113
2114 // Enable/disable Broadcast Ephemerides
2115 // ------------------------------------
2116 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2117 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2118 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2119 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2120 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2121 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2122 _uploadEphPortLineEdit->setEnabled(true);
2123 _uploadEphMountpointLineEdit->setEnabled(true);
2124 _uploadEphPasswordLineEdit->setEnabled(true);
2125 _uploadEphSampleSpinBox->setEnabled(true);
2126 }
2127 else {
2128 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2129 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2130 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2131 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2132 _uploadEphPortLineEdit->setEnabled(false);
2133 _uploadEphMountpointLineEdit->setEnabled(false);
2134 _uploadEphPasswordLineEdit->setEnabled(false);
2135 _uploadEphSampleSpinBox->setEnabled(false);
2136 }
2137 }
2138
2139 // Combine Corrections
2140 // -------------------
2141 if (sender() == 0 || sender() == _cmbTable) {
2142 int iRow = _cmbTable->rowCount();
2143 if (iRow > 0) {
2144 enableWidget(true, _cmbMethodComboBox);
2145 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2146 _cmbMaxresLineEdit->setEnabled(true);
2147 _cmbSamplSpinBox->setEnabled(true);
2148 }
2149 else {
2150 enableWidget(false, _cmbMethodComboBox);
2151 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2152 _cmbMaxresLineEdit->setEnabled(false);
2153 _cmbSamplSpinBox->setEnabled(false);
2154 }
2155 }
2156
2157 // Upload(clk)
2158 // -----------
2159 int iRow = _uploadTable->rowCount();
2160 if (iRow > 0) {
2161 enableWidget(true, _uploadIntrComboBox);
2162 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2163 enableWidget(true, _uploadSamplClkRnxSpinBox);
2164 enableWidget(true, _uploadSamplSp3SpinBox);
2165 }
2166 else {
2167 enableWidget(false, _uploadIntrComboBox);
2168 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2169 enableWidget(false, _uploadSamplClkRnxSpinBox);
2170 enableWidget(false, _uploadSamplSp3SpinBox);
2171 }
2172
2173 // QC
2174 // --
2175 if (sender() == 0 || sender() == _reqcActionComboBox) {
2176 enable = !_reqcActionComboBox->currentText().isEmpty();
2177 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2178 enableWidget(enable && enable10, _reqcEditOptionButton);
2179 enableWidget(enable, _reqcObsFileChooser);
2180 enableWidget(enable, _reqcNavFileChooser);
2181 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2182 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2183 enableWidget(enable, _reqcOutLogLineEdit);
2184 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2185 enableWidget(enable && !enable10, _reqcSkyPlotSystems);
2186 }
2187
2188 enableStartStop();
2189}
2190
2191//
2192////////////////////////////////////////////////////////////////////////////
2193void bncWindow::slotAddCmbRow() {
2194 int iRow = _cmbTable->rowCount();
2195 _cmbTable->insertRow(iRow);
2196 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2197 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2198 }
2199}
2200
2201//
2202////////////////////////////////////////////////////////////////////////////
2203void bncWindow::slotDelCmbRow() {
2204 int nRows = _cmbTable->rowCount();
2205 bool flg[nRows];
2206 for (int iRow = 0; iRow < nRows; iRow++) {
2207 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2208 flg[iRow] = true;
2209 }
2210 else {
2211 flg[iRow] = false;
2212 }
2213 }
2214 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2215 if (flg[iRow]) {
2216 _cmbTable->removeRow(iRow);
2217 }
2218 }
2219 nRows = _cmbTable->rowCount();
2220 if (nRows < 1) {
2221 enableWidget(false, _cmbMethodComboBox);
2222 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2223 _cmbMaxresLineEdit->setEnabled(false);
2224 _cmbSamplSpinBox->setEnabled(false);
2225 }
2226}
2227
2228//
2229////////////////////////////////////////////////////////////////////////////
2230void bncWindow::populateCmbTable() {
2231
2232 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2233 _cmbTable->removeRow(iRow);
2234 }
2235
2236 bncSettings settings;
2237
2238 int iRow = -1;
2239 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2240 while (it.hasNext()) {
2241 QStringList hlp = it.next().split(" ");
2242 if (hlp.size() > 2) {
2243 ++iRow;
2244 _cmbTable->insertRow(iRow);
2245 }
2246 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2247 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2248 }
2249 }
2250}
2251
2252//
2253////////////////////////////////////////////////////////////////////////////
2254void bncWindow::slotAddUploadRow() {
2255 int iRow = _uploadTable->rowCount();
2256 _uploadTable->insertRow(iRow);
2257 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2258 if (iCol == 3) {
2259 QLineEdit* passwd = new QLineEdit();
2260 passwd->setFrame(false);
2261 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2262 _uploadTable->setCellWidget(iRow, iCol, passwd);
2263 }
2264 else if (iCol == 4) {
2265 QComboBox* system = new QComboBox();
2266 system->setEditable(false);
2267 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2268 system->setFrame(false);
2269 _uploadTable->setCellWidget(iRow, iCol, system);
2270 }
2271 else if (iCol == 5) {
2272 QCheckBox* com = new QCheckBox();
2273 _uploadTable->setCellWidget(iRow, iCol, com);
2274 }
2275 else if (iCol == 11) {
2276 bncTableItem* bncIt = new bncTableItem();
2277 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2278 _uploadTable->setItem(iRow, iCol, bncIt);
2279 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2280 }
2281 else {
2282 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2283 }
2284 }
2285}
2286
2287//
2288////////////////////////////////////////////////////////////////////////////
2289void bncWindow::slotDelUploadRow() {
2290 BNC_CORE->_uploadTableItems.clear();
2291 int nRows = _uploadTable->rowCount();
2292 bool flg[nRows];
2293 for (int iRow = 0; iRow < nRows; iRow++) {
2294 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2295 flg[iRow] = true;
2296 }
2297 else {
2298 flg[iRow] = false;
2299 }
2300 }
2301 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2302 if (flg[iRow]) {
2303 _uploadTable->removeRow(iRow);
2304 }
2305 }
2306 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2307 BNC_CORE->_uploadTableItems[iRow] =
2308 (bncTableItem*) _uploadTable->item(iRow, 11);
2309 }
2310 nRows = _uploadTable->rowCount();
2311 if (nRows < 1) {
2312 enableWidget(false, _uploadIntrComboBox);
2313 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2314 enableWidget(false, _uploadSamplSp3SpinBox);
2315 enableWidget(false, _uploadSamplClkRnxSpinBox);
2316 }
2317}
2318
2319//
2320////////////////////////////////////////////////////////////////////////////
2321void bncWindow::populateUploadTable() {
2322 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2323 _uploadTable->removeRow(iRow);
2324 }
2325
2326 bncSettings settings;
2327
2328 int iRow = -1;
2329 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2330 while (it.hasNext()) {
2331 QStringList hlp = it.next().split(",");
2332 if (hlp.size() > 6) {
2333 ++iRow;
2334 _uploadTable->insertRow(iRow);
2335 }
2336 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2337 if (iCol == 3) {
2338 QLineEdit* passwd = new QLineEdit();
2339 passwd->setFrame(false);
2340 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2341 passwd->setText(hlp[iCol]);
2342 _uploadTable->setCellWidget(iRow, iCol, passwd);
2343 }
2344 else if (iCol == 4) {
2345 QComboBox* system = new QComboBox();
2346 system->setEditable(false);
2347 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2348 system->setFrame(false);
2349 system->setCurrentIndex(system->findText(hlp[iCol]));
2350 _uploadTable->setCellWidget(iRow, iCol, system);
2351 }
2352 else if (iCol == 5) {
2353 QCheckBox* com = new QCheckBox();
2354 if (hlp[iCol].toInt() == Qt::Checked) {
2355 com->setCheckState(Qt::Checked);
2356 }
2357 _uploadTable->setCellWidget(iRow, iCol, com);
2358 }
2359 else if (iCol == 11) {
2360 bncTableItem* bncIt = new bncTableItem();
2361 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2362 _uploadTable->setItem(iRow, iCol, bncIt);
2363 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2364 }
2365 else {
2366 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2367 }
2368 }
2369 }
2370}
2371
2372//
2373////////////////////////////////////////////////////////////////////////////
2374void bncWindow::slotSetUploadTrafo() {
2375 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2376 dlg->exec();
2377 delete dlg;
2378}
2379
2380// Progress Bar Change
2381////////////////////////////////////////////////////////////////////////////
2382void bncWindow::slotPostProgress(int nEpo) {
2383 if (_actStart) {
2384 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2385 }
2386}
2387
2388// Start Post-Processing Reqc
2389////////////////////////////////////////////////////////////////////////////
2390void bncWindow::startPostProcessingReqc() {
2391#ifdef USE_POSTPROCESSING
2392 _runningPostProcessingReqc = true;
2393 enableStartStop();
2394 if (_reqcActionComboBox->currentText() == "Analyze") {
2395 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2396 connect(reqcAnalyze, SIGNAL(finished()),
2397 this, SLOT(slotFinishedPostProcessingReqc()));
2398 reqcAnalyze->start();
2399 }
2400 else {
2401 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2402 connect(reqcEdit, SIGNAL(finished()),
2403 this, SLOT(slotFinishedPostProcessingReqc()));
2404 reqcEdit->start();
2405 }
2406#else
2407 QMessageBox::information(this, "Information",
2408 "Post-Processing Not Permitted");
2409#endif
2410}
2411
2412// Post-Processing Reqc Finished
2413////////////////////////////////////////////////////////////////////////////
2414void bncWindow::slotFinishedPostProcessingReqc() {
2415 _runningPostProcessingReqc = false;
2416 if (_reqcActionComboBox->currentText() != "Analyze") {
2417 QMessageBox::information(this, "Information",
2418 "RINEX Processing Thread Finished");
2419 }
2420 enableStartStop();
2421}
2422
2423// Edit teqc-like editing options
2424////////////////////////////////////////////////////////////////////////////
2425void bncWindow::slotReqcEditOption() {
2426 reqcDlg* dlg = new reqcDlg(this);
2427 dlg->move(this->pos().x()+50, this->pos().y()+50);
2428 dlg->exec();
2429 delete dlg;
2430}
2431
2432// Enable/Disable Start and Stop Buttons
2433////////////////////////////////////////////////////////////////////////////
2434void bncWindow::enableStartStop() {
2435
2436 if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2437 if (_runningPostProcessingReqc) {
2438 _actStart->setEnabled(false);
2439 }
2440 else {
2441 _actStart->setEnabled(true);
2442 }
2443 _actStop->setEnabled(false);
2444 }
2445 else {
2446 if (_runningRealTime) {
2447 _actStart->setEnabled(false);
2448 _actStop->setEnabled(true);
2449 }
2450 else {
2451 _actStop->setEnabled(false);
2452 if (_mountPointsTable->rowCount() == 0) {
2453 _actStart->setEnabled(false);
2454 }
2455 else {
2456 _actStart->setEnabled(true);
2457 }
2458 }
2459 }
2460}
2461
2462// Show Map
2463////////////////////////////////////////////////////////////////////////////
2464void bncWindow::slotMapMountPoints() {
2465 saveOptions();
2466 t_bncMap* bncMap = new t_bncMap(this);
2467 bncMap->setMinimumSize(800, 600);
2468 bncMap->setWindowTitle("Selected Mountpoints");
2469
2470 bncSettings settings;
2471 QListIterator<QString> it(settings.value("mountPoints").toStringList());
2472 while (it.hasNext()) {
2473 QStringList hlp = it.next().split(" ");
2474 if (hlp.size() < 5) continue;
2475 QUrl url(hlp[0]);
2476 double latDeg = hlp[2].toDouble();
2477 double lonDeg = hlp[3].toDouble();
2478 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
2479 }
2480
2481 bncMap->show();
2482}
2483
2484// Show Map
2485////////////////////////////////////////////////////////////////////////////
2486void bncWindow::slotMapPPP() {
2487#ifdef QT_WEBKIT
2488 saveOptions();
2489 enableWidget(false, _mapWinButton);
2490 enableWidget(false, _gmRadioButton);
2491 enableWidget(false, _osmRadioButton);
2492 enableWidget(false, _mapWinDotSizeLineEdit);
2493 enableWidget(false, _mapWinDotColorComboBox);
2494
2495 if (!_mapWin) {
2496 _mapWin = new bncMapWin(this);
2497 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
2498 QListIterator<bncGetThread*> it(_threads);
2499 while (it.hasNext()) {
2500 bncGetThread* thread = it.next();
2501 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2502 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2503 }
2504 }
2505 _mapWin->show();
2506#else
2507 QMessageBox::information(this, "Information",
2508 "Qt Library compiled without QtWebKit");
2509#endif
2510}
2511
2512// Show Map
2513////////////////////////////////////////////////////////////////////////////
2514void bncWindow::slotMapPPPClosed() {
2515#ifdef QT_WEBKIT
2516 slotBncTextChanged();
2517 if (_mapWin) {
2518 QListIterator<bncGetThread*> it(_threads);
2519 while (it.hasNext()) {
2520 bncGetThread* thread = it.next();
2521 thread->disconnect(_mapWin);
2522 }
2523 _mapWin->deleteLater();
2524 _mapWin = 0;
2525 }
2526#endif
2527}
Note: See TracBrowser for help on using the repository browser.