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

Last change on this file since 3786 was 3786, checked in by weber, 12 years ago

Default for tropo sigma changed

File size: 122.1 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "teqcdlg.h"
65#ifdef USE_POSTPROCESSING
66# include "rinex/bncpostprocess.h"
67#endif
68
69using namespace std;
70
71// Constructor
72////////////////////////////////////////////////////////////////////////////
73bncWindow::bncWindow() {
74
75 _caster = 0;
76 _casterEph = 0;
77
78 _bncFigure = new bncFigure(this);
79 _bncFigureLate = new bncFigureLate(this);
80 _bncFigurePPP = new bncFigurePPP(this);
81 _runningRealTime = false;
82 _runningPostProcessingPPP = false;
83 _runningPostProcessingTeqc = false;
84
85 int ww = QFontMetrics(this->font()).width('w');
86
87 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
88
89 setMinimumSize(85*ww, 65*ww);
90
91 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
92
93 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
94 this, SLOT(slotWindowMessage(QByteArray,bool)));
95
96 // Create Actions
97 // --------------
98 _actHelp = new QAction(tr("&Help Contents"),this);
99 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
100
101 _actAbout = new QAction(tr("&About BNC"),this);
102 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
103
104 _actFlowchart = new QAction(tr("&Flow Chart"),this);
105 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
106
107 _actFontSel = new QAction(tr("Select &Font"),this);
108 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
109
110 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
111 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
112
113 _actQuit = new QAction(tr("&Quit"),this);
114 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
115
116 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
117 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
118
119 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
120 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
121 _actDeleteMountPoints->setEnabled(false);
122
123 _actStart = new QAction(tr("Sta&rt"),this);
124 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
125
126 _actStop = new QAction(tr("Sto&p"),this);
127 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
128 _actStop->setEnabled(false);
129
130 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
131 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
132
133 CreateMenu();
134 AddToolbar();
135
136 bncSettings settings;
137
138 // Netowrk Options
139 // ---------------
140 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
141 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
142
143 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
144 this, SLOT(slotBncTextChanged()));
145
146 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
147 _ignoreSslErrorsCheckBox = new QCheckBox();
148 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
149 settings.value("ignoreSslErrors").toInt()));
150
151 // General Options
152 // ---------------
153 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
154 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
155 _rnxAppendCheckBox = new QCheckBox();
156 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
157 settings.value("rnxAppend").toInt()));
158 _onTheFlyComboBox = new QComboBox();
159 _onTheFlyComboBox->setEditable(false);
160 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
161 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
162 if (ii != -1) {
163 _onTheFlyComboBox->setCurrentIndex(ii);
164 }
165 _autoStartCheckBox = new QCheckBox();
166 _autoStartCheckBox->setCheckState(Qt::CheckState(
167 settings.value("autoStart").toInt()));
168
169 // RINEX Observations Options
170 // --------------------------
171 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
172 _rnxIntrComboBox = new QComboBox();
173 _rnxIntrComboBox->setEditable(false);
174 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
175 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
176 if (ii != -1) {
177 _rnxIntrComboBox->setCurrentIndex(ii);
178 }
179 _rnxSamplSpinBox = new QSpinBox();
180 _rnxSamplSpinBox->setMinimum(0);
181 _rnxSamplSpinBox->setMaximum(60);
182 _rnxSamplSpinBox->setSingleStep(5);
183 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
184 _rnxSamplSpinBox->setSuffix(" sec");
185 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
186 _rnxSkelLineEdit->setMaximumWidth(5*ww);
187 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
188 _rnxV3CheckBox = new QCheckBox();
189 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
190
191 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
192 this, SLOT(slotBncTextChanged()));
193
194 // RINEX Ephemeris Options
195 // -----------------------
196 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
197 _ephIntrComboBox = new QComboBox();
198 _ephIntrComboBox->setEditable(false);
199 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
200 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
201 if (jj != -1) {
202 _ephIntrComboBox->setCurrentIndex(jj);
203 }
204 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
205 _ephV3CheckBox = new QCheckBox();
206 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
207
208 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
209 this, SLOT(slotBncTextChanged()));
210
211 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
212 this, SLOT(slotBncTextChanged()));
213
214 // Broadcast Corrections Options
215 // -----------------------------
216 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
217 _corrIntrComboBox = new QComboBox();
218 _corrIntrComboBox->setEditable(false);
219 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
220 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
221 if (mm != -1) {
222 _corrIntrComboBox->setCurrentIndex(mm);
223 }
224 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
225 _corrTimeSpinBox = new QSpinBox();
226 _corrTimeSpinBox->setMinimum(0);
227 _corrTimeSpinBox->setMaximum(60);
228 _corrTimeSpinBox->setSingleStep(1);
229 _corrTimeSpinBox->setSuffix(" sec");
230 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
231
232 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
233 this, SLOT(slotBncTextChanged()));
234
235 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
236 this, SLOT(slotBncTextChanged()));
237
238 // Feed Engine Options
239 // -------------------
240 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
241 _waitTimeSpinBox = new QSpinBox();
242 _waitTimeSpinBox->setMinimum(1);
243 _waitTimeSpinBox->setMaximum(30);
244 _waitTimeSpinBox->setSingleStep(1);
245 _waitTimeSpinBox->setSuffix(" sec");
246 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
247 _binSamplSpinBox = new QSpinBox();
248 _binSamplSpinBox->setMinimum(0);
249 _binSamplSpinBox->setMaximum(60);
250 _binSamplSpinBox->setSingleStep(5);
251 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
252 _binSamplSpinBox->setSuffix(" sec");
253 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
254 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
255
256 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
257 this, SLOT(slotBncTextChanged()));
258
259 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
260 this, SLOT(slotBncTextChanged()));
261
262 // Serial Output Options
263 // ---------------------
264 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
265 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
266 _serialBaudRateComboBox = new QComboBox();
267 _serialBaudRateComboBox->addItems(QString("110,300,600,"
268 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
269 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
270 if (kk != -1) {
271 _serialBaudRateComboBox->setCurrentIndex(kk);
272 }
273 _serialFlowControlComboBox = new QComboBox();
274 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
275 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
276 if (kk != -1) {
277 _serialFlowControlComboBox->setCurrentIndex(kk);
278 }
279 _serialDataBitsComboBox = new QComboBox();
280 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
281 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
282 if (kk != -1) {
283 _serialDataBitsComboBox->setCurrentIndex(kk);
284 }
285 _serialParityComboBox = new QComboBox();
286 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
287 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
288 if (kk != -1) {
289 _serialParityComboBox->setCurrentIndex(kk);
290 }
291 _serialStopBitsComboBox = new QComboBox();
292 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
293 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
294 if (kk != -1) {
295 _serialStopBitsComboBox->setCurrentIndex(kk);
296 }
297 _serialAutoNMEAComboBox = new QComboBox();
298 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
299 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
300 if (kk != -1) {
301 _serialAutoNMEAComboBox->setCurrentIndex(kk);
302 }
303 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
304 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
305
306 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
307 this, SLOT(slotBncTextChanged()));
308
309 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
310 this, SLOT(slotBncTextChanged()));
311
312 // Outages Options
313 // ---------------
314 _obsRateComboBox = new QComboBox();
315 _obsRateComboBox->setEditable(false);
316 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
317 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
318 if (kk != -1) {
319 _obsRateComboBox->setCurrentIndex(kk);
320 }
321 _adviseFailSpinBox = new QSpinBox();
322 _adviseFailSpinBox->setMinimum(0);
323 _adviseFailSpinBox->setMaximum(60);
324 _adviseFailSpinBox->setSingleStep(1);
325 _adviseFailSpinBox->setSuffix(" min");
326 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
327 _adviseRecoSpinBox = new QSpinBox();
328 _adviseRecoSpinBox->setMinimum(0);
329 _adviseRecoSpinBox->setMaximum(60);
330 _adviseRecoSpinBox->setSingleStep(1);
331 _adviseRecoSpinBox->setSuffix(" min");
332 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
333 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
334
335 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
336 this, SLOT(slotBncTextChanged()));
337
338 // Miscellaneous Options
339 // ---------------------
340 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
341 _perfIntrComboBox = new QComboBox();
342 _perfIntrComboBox->setEditable(false);
343 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
344 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
345 if (ll != -1) {
346 _perfIntrComboBox->setCurrentIndex(ll);
347 }
348 _scanRTCMCheckBox = new QCheckBox();
349 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
350 settings.value("scanRTCM").toInt()));
351
352 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
353 this, SLOT(slotBncTextChanged()));
354
355 // PPP Options
356 // -----------
357 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
358 _pppMountLineEdit->setMaximumWidth(8*ww);
359 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
360 _pppMountLineEdit->setMinimumWidth(8*ww);
361 _pppCorrMountLineEdit->setMinimumWidth(8*ww);
362 _pppCorrMountLineEdit->setMaximumWidth(8*ww);
363 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
364 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
365 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
366 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
367 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
368 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
369 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
370 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
371 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
372 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
373 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
374 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
375 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
376 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
377 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
378 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
379 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
380 _pppSync = new QLineEdit(settings.value("pppSync").toString());
381 _pppAntexFileChooser = new qtFileChooser;
382 _pppAntexFileChooser->setMinimumWidth(12*ww);
383 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
384 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
385
386 _pppSPPComboBox = new QComboBox();
387 _pppSPPComboBox->setEditable(false);
388 _pppSPPComboBox->addItems(QString(",Realtime-PPP,Realtime-SPP,Post-Processing").split(","));
389 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
390 if (ik != -1) {
391 _pppSPPComboBox->setCurrentIndex(ik);
392 }
393 _pppUsePhaseCheckBox = new QCheckBox();
394 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
395 settings.value("pppUsePhase").toInt()));
396 _pppEstTropoCheckBox = new QCheckBox();
397 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
398 settings.value("pppEstTropo").toInt()));
399 _pppGLONASSCheckBox = new QCheckBox();
400 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
401 settings.value("pppGLONASS").toInt()));
402 _pppGalileoCheckBox = new QCheckBox();
403 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
404 settings.value("pppGalileo").toInt()));
405
406 _pppPlotCoordinates = new QCheckBox();
407 _pppPlotCoordinates->setCheckState(Qt::CheckState(
408 settings.value("pppPlotCoordinates").toInt()));
409
410 _pppApplySatAntCheckBox = new QCheckBox();
411 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
412 settings.value("pppApplySatAnt").toInt()));
413
414 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
415 this, SLOT(slotBncTextChanged()));
416
417 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
418 this, SLOT(slotBncTextChanged()));
419
420 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
421 this, SLOT(slotBncTextChanged()));
422
423 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
424 this, SLOT(slotBncTextChanged()));
425 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
426 this, SLOT(slotBncTextChanged()));
427 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
428 this, SLOT(slotBncTextChanged()));
429 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
430 this, SLOT(slotBncTextChanged()));
431 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
432 this, SLOT(slotBncTextChanged()));
433 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
434 this, SLOT(slotBncTextChanged()));
435
436 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
437 this, SLOT(slotBncTextChanged()));
438
439 connect(_pppSync, SIGNAL(textChanged(const QString &)),
440 this, SLOT(slotBncTextChanged()));
441
442 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
443 this, SLOT(slotBncTextChanged()));
444
445 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
446 this, SLOT(slotBncTextChanged()));
447
448 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
449 this, SLOT(slotBncTextChanged()));
450
451 // Streams
452 // -------
453 _mountPointsTable = new QTableWidget(0,8);
454
455 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
456 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
457 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
458 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
459 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
460 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
461 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
462 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
463 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
464 _mountPointsTable->setHorizontalHeaderLabels(labels);
465 _mountPointsTable->setGridStyle(Qt::NoPen);
466 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
467 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
468 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
469 _mountPointsTable->hideColumn(0);
470 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
471 SLOT(slotSelectionChanged()));
472 populateMountPointsTable();
473
474 _log = new QTextBrowser();
475 _log->setReadOnly(true);
476
477 // Combination
478 // -----------
479 _cmbTable = new QTableWidget(0,3);
480 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
481 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
482 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
483 _cmbTable->setMaximumWidth(30*ww);
484 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
485 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
486 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
487 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
488 _cmbTable->horizontalHeader()->setStretchLastSection(true);
489 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
490
491 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
492
493 QPushButton* addCmbRowButton = new QPushButton("Add Row");
494 QPushButton* delCmbRowButton = new QPushButton("Delete");
495
496 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
497 SLOT(slotBncTextChanged()));
498
499 _cmbMethodComboBox = new QComboBox();
500 _cmbMethodComboBox->setEditable(false);
501 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
502 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
503 if (im != -1) {
504 _cmbMethodComboBox->setCurrentIndex(im);
505 }
506
507 // Upload Results
508 // -------------
509 _uploadTable = new QTableWidget(0,9);
510 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, bytes").split(","));
511 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
512 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
513 _uploadTable->horizontalHeader()->resizeSection(0,13*ww);
514 _uploadTable->horizontalHeader()->resizeSection(1,5*ww);
515 _uploadTable->horizontalHeader()->resizeSection(2,6*ww);
516 _uploadTable->horizontalHeader()->resizeSection(3,8*ww);
517 _uploadTable->horizontalHeader()->resizeSection(4,11*ww);
518 _uploadTable->horizontalHeader()->resizeSection(5,4*ww);
519 _uploadTable->horizontalHeader()->resizeSection(6,15*ww);
520 _uploadTable->horizontalHeader()->resizeSection(7,15*ww);
521 _uploadTable->horizontalHeader()->resizeSection(8,10*ww);
522 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
523 _uploadTable->horizontalHeader()->setStretchLastSection(true);
524 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
525
526 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
527 SLOT(slotBncTextChanged()));
528
529 QPushButton* addUploadRowButton = new QPushButton("Add Row");
530 QPushButton* delUploadRowButton = new QPushButton("Del Row");
531 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
532 _uploadIntrComboBox = new QComboBox;
533 _uploadIntrComboBox->setEditable(false);
534 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
535 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
536 if (ii != -1) {
537 _uploadIntrComboBox->setCurrentIndex(ii);
538 }
539 _uploadSamplSpinBox = new QSpinBox;
540 _uploadSamplSpinBox->setMinimum(5);
541 _uploadSamplSpinBox->setMaximum(60);
542 _uploadSamplSpinBox->setSingleStep(5);
543 _uploadSamplSpinBox->setMaximumWidth(9*ww);
544 _uploadSamplSpinBox->setValue(settings.value("uploadSampl").toInt());
545 _uploadSamplSpinBox->setSuffix(" sec");
546
547 _uploadSamplOrbSpinBox = new QSpinBox;
548 _uploadSamplOrbSpinBox->setMinimum(0);
549 _uploadSamplOrbSpinBox->setMaximum(60);
550 _uploadSamplOrbSpinBox->setSingleStep(5);
551 _uploadSamplOrbSpinBox->setMaximumWidth(9*ww);
552 _uploadSamplOrbSpinBox->setValue(settings.value("uploadSamplOrb").toInt());
553 _uploadSamplOrbSpinBox->setSuffix(" sec");
554
555 // Upload RTCM3 Ephemeris
556 // ----------------------
557 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
558 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
559 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
560 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
561 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
562 _uploadEphSampleSpinBox = new QSpinBox;
563 _uploadEphSampleSpinBox->setMinimum(5);
564 _uploadEphSampleSpinBox->setMaximum(60);
565 _uploadEphSampleSpinBox->setSingleStep(5);
566 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
567 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
568 _uploadEphSampleSpinBox->setSuffix(" sec");
569 _uploadEphBytesCounter = new bncBytesCounter;
570
571 // Canvas with Editable Fields
572 // ---------------------------
573 _canvas = new QWidget;
574 setCentralWidget(_canvas);
575
576 _aogroup = new QTabWidget();
577 QWidget* pgroup = new QWidget();
578 QWidget* ggroup = new QWidget();
579 QWidget* sgroup = new QWidget();
580 QWidget* egroup = new QWidget();
581 QWidget* agroup = new QWidget();
582 QWidget* cgroup = new QWidget();
583 QWidget* ogroup = new QWidget();
584 QWidget* rgroup = new QWidget();
585 QWidget* sergroup = new QWidget();
586 QWidget* pppgroup = new QWidget();
587 QWidget* ppp2group = new QWidget();
588 QWidget* teqcgroup = new QWidget();
589 QWidget* cmbgroup = new QWidget();
590 QWidget* uploadgroup = new QWidget();
591 QWidget* uploadEphgroup = new QWidget();
592 _aogroup->addTab(pgroup,tr("Network"));
593 _aogroup->addTab(ggroup,tr("General"));
594 _aogroup->addTab(ogroup,tr("RINEX Observations"));
595 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
596 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
597 _aogroup->addTab(sgroup,tr("Feed Engine"));
598 _aogroup->addTab(sergroup,tr("Serial Output"));
599 _aogroup->addTab(agroup,tr("Outages"));
600 _aogroup->addTab(rgroup,tr("Miscellaneous"));
601 _aogroup->addTab(pppgroup,tr("PPP (1)")); _tabIndexPPP1 = _aogroup->count() - 1;
602 _aogroup->addTab(ppp2group,tr("PPP (2)")); _tabIndexPPP2 = _aogroup->count() - 1;
603 _aogroup->addTab(teqcgroup,tr("Teqc")); _tabIndexTeqc = _aogroup->count() - 1;
604#ifdef USE_COMBINATION
605 _aogroup->addTab(cmbgroup,tr("Combination"));
606#endif
607 _aogroup->addTab(uploadgroup,tr("Upload (clk)"));
608 _aogroup->addTab(uploadEphgroup,tr("Upload (eph)"));
609
610 // Log Tab
611 // -------
612 _loggroup = new QTabWidget();
613 _loggroup->addTab(_log,tr("Log"));
614 _loggroup->addTab(_bncFigure,tr("Throughput"));
615 _loggroup->addTab(_bncFigureLate,tr("Latency"));
616 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
617
618 // Netowork (Proxy and SSL) Tab
619 // ----------------------------
620 QGridLayout* pLayout = new QGridLayout;
621 pLayout->setColumnMinimumWidth(0,13*ww);
622 _proxyPortLineEdit->setMaximumWidth(9*ww);
623
624 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
625 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
626 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
627 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
628 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
629 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
630 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
631 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
632 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
633 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
634 pLayout->addWidget(new QLabel(" "), 4, 0);
635 pLayout->addWidget(new QLabel(" "), 5, 0);
636 pLayout->addWidget(new QLabel(" "), 6, 0);
637 pgroup->setLayout(pLayout);
638
639 // General Tab
640 // -----------
641 QGridLayout* gLayout = new QGridLayout;
642 gLayout->setColumnMinimumWidth(0,14*ww);
643 _onTheFlyComboBox->setMaximumWidth(9*ww);
644
645 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
646 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
647 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
648 gLayout->addWidget(new QLabel("Append files"), 2, 0);
649 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
650 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
651 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
652 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
653 gLayout->addWidget(_autoStartCheckBox, 4, 1);
654 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
655 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
656 gLayout->addWidget(new QLabel(" "), 6, 0);
657 ggroup->setLayout(gLayout);
658
659 // RINEX Observations
660 // ------------------
661 QGridLayout* oLayout = new QGridLayout;
662 oLayout->setColumnMinimumWidth(0,14*ww);
663 _rnxIntrComboBox->setMaximumWidth(9*ww);
664 _rnxSamplSpinBox->setMaximumWidth(9*ww);
665
666 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
667 oLayout->addWidget(new QLabel("Directory"), 1, 0);
668 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
669 oLayout->addWidget(new QLabel("Interval"), 2, 0);
670 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
671 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
672 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
673 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
674 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
675 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
676 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
677 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
678 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
679 oLayout->addWidget(new QLabel(" "), 6, 0);
680 ogroup->setLayout(oLayout);
681
682 // RINEX Ephemeris
683 // ---------------
684 QGridLayout* eLayout = new QGridLayout;
685 eLayout->setColumnMinimumWidth(0,14*ww);
686 _ephIntrComboBox->setMaximumWidth(9*ww);
687 _outEphPortLineEdit->setMaximumWidth(9*ww);
688
689 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
690 eLayout->addWidget(new QLabel("Directory"), 1, 0);
691 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
692 eLayout->addWidget(new QLabel("Interval"), 2, 0);
693 eLayout->addWidget(_ephIntrComboBox, 2, 1);
694 eLayout->addWidget(new QLabel("Port"), 3, 0);
695 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
696 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
697 eLayout->addWidget(_ephV3CheckBox, 4, 1);
698 eLayout->addWidget(new QLabel(" "), 5, 0);
699 eLayout->addWidget(new QLabel(" "), 6, 0);
700 egroup->setLayout(eLayout);
701
702
703 // Broadcast Corrections
704 // ---------------------
705 QGridLayout* cLayout = new QGridLayout;
706 cLayout->setColumnMinimumWidth(0,14*ww);
707 _corrIntrComboBox->setMaximumWidth(9*ww);
708 _corrPortLineEdit->setMaximumWidth(9*ww);
709 _corrTimeSpinBox->setMaximumWidth(9*ww);
710
711 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
712 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
713 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
714 cLayout->addWidget(new QLabel("Interval"), 2, 0);
715 cLayout->addWidget(_corrIntrComboBox, 2, 1);
716 cLayout->addWidget(new QLabel("Port"), 3, 0);
717 cLayout->addWidget(_corrPortLineEdit, 3, 1);
718 cLayout->addWidget(new QLabel(" Wait for full epoch"), 3, 2, Qt::AlignRight);
719 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
720 cLayout->addWidget(new QLabel(" "), 4, 0);
721 cLayout->addWidget(new QLabel(" "), 5, 0);
722 cLayout->addWidget(new QLabel(" "), 6, 0);
723 cgroup->setLayout(cLayout);
724
725 // Feed Engine
726 // -----------
727 QGridLayout* sLayout = new QGridLayout;
728 sLayout->setColumnMinimumWidth(0,14*ww);
729 _outPortLineEdit->setMaximumWidth(9*ww);
730 _waitTimeSpinBox->setMaximumWidth(9*ww);
731 _binSamplSpinBox->setMaximumWidth(9*ww);
732 _outUPortLineEdit->setMaximumWidth(9*ww);
733
734 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),0,0,1,50);
735 sLayout->addWidget(new QLabel("Port"), 1, 0);
736 sLayout->addWidget(_outPortLineEdit, 1, 1);
737 sLayout->addWidget(new QLabel("Wait for full epoch"), 1, 2, Qt::AlignRight);
738 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
739 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
740 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
741 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
742 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
743 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
744 sLayout->addWidget(_outUPortLineEdit, 4, 1);
745 sLayout->addWidget(new QLabel(" "), 5, 0);
746 sLayout->addWidget(new QLabel(" "), 6, 0);
747 sgroup->setLayout(sLayout);
748
749 // Serial Output
750 // -------------
751 QGridLayout* serLayout = new QGridLayout;
752 serLayout->setColumnMinimumWidth(0,14*ww);
753 _serialBaudRateComboBox->setMaximumWidth(9*ww);
754 _serialFlowControlComboBox->setMaximumWidth(11*ww);
755 _serialDataBitsComboBox->setMaximumWidth(5*ww);
756 _serialParityComboBox->setMaximumWidth(9*ww);
757 _serialStopBitsComboBox->setMaximumWidth(5*ww);
758 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
759 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
760
761 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
762 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
763 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
764 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
765 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
766 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
767 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
768 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
769 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
770 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
771 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
772 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
773 serLayout->addWidget(_serialParityComboBox, 4, 3);
774 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
775 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
776 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
777 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
778 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
779 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
780 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
781 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
782 serLayout->addWidget(new QLabel(" "), 6, 0);
783
784 sergroup->setLayout(serLayout);
785
786 // Outages
787 // -------
788 QGridLayout* aLayout = new QGridLayout;
789 aLayout->setColumnMinimumWidth(0,14*ww);
790 _obsRateComboBox->setMaximumWidth(9*ww);
791 _adviseFailSpinBox->setMaximumWidth(9*ww);
792 _adviseRecoSpinBox->setMaximumWidth(9*ww);
793
794 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
795 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
796 aLayout->addWidget(_obsRateComboBox, 1, 1);
797 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
798 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
799 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
800 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
801 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
802 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
803 aLayout->addWidget(new QLabel(" "), 5, 0);
804 aLayout->addWidget(new QLabel(" "), 6, 0);
805 agroup->setLayout(aLayout);
806
807 // Miscellaneous
808 // -------------
809 QGridLayout* rLayout = new QGridLayout;
810 rLayout->setColumnMinimumWidth(0,14*ww);
811 _perfIntrComboBox->setMaximumWidth(9*ww);
812
813 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),0, 0,1,30);
814 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
815 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
816 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
817 rLayout->addWidget(_perfIntrComboBox, 2, 1);
818 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
819 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
820 rLayout->addWidget(new QLabel(" "), 4, 0);
821 rLayout->addWidget(new QLabel(" "), 5, 0);
822 rLayout->addWidget(new QLabel(" "), 6, 0);
823 rgroup->setLayout(rLayout);
824
825 // PPP Client
826 // ----------
827 QGridLayout* pppLayout = new QGridLayout;
828 pppLayout->setColumnMinimumWidth(0,14*ww);
829 _pppSigCLineEdit->setMaximumWidth(6*ww);
830 _pppSigPLineEdit->setMaximumWidth(6*ww);
831 _pppSigCrd0->setMaximumWidth(6*ww);
832 _pppSigCrdP->setMaximumWidth(6*ww);
833 _pppSigTrp0->setMaximumWidth(6*ww);
834 _pppSigTrpP->setMaximumWidth(6*ww);
835 _pppAverageLineEdit->setMaximumWidth(6*ww);
836 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
837 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
838 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
839 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
840 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
841 _pppRefdNLineEdit->setMaximumWidth(5*ww);
842 _pppRefdELineEdit->setMaximumWidth(5*ww);
843 _pppRefdULineEdit->setMaximumWidth(5*ww);
844 _pppSync->setMaximumWidth(6*ww);
845 _pppSPPComboBox->setMinimumWidth(15*ww);
846 _pppNMEAPortLineEdit->setMaximumWidth(10*ww);
847
848 _postObsFileChooser = new qtFileChooser;
849 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
850 _postNavFileChooser = new qtFileChooser;
851 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
852 _postCorrFileChooser = new qtFileChooser;
853 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
854 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
855
856 int ir = 0;
857 pppLayout->addWidget(new QLabel("Precise Point Positioning, Panel 1."), ir, 0, 1, 100);
858 ++ir;
859 pppLayout->addWidget(new QLabel("Obs. Mountpnt"), ir, 0, 1, 10);
860 pppLayout->addWidget(_pppMountLineEdit, ir,10, 1, 10);
861 pppLayout->addWidget(_pppSPPComboBox, ir,20, 1, 15);
862 pppLayout->addWidget(new QLabel(" X "), ir,35, 1, 5, Qt::AlignRight);
863 pppLayout->addWidget(_pppRefCrdXLineEdit, ir,40, 1, 13);
864 pppLayout->addWidget(new QLabel(" Y "), ir,50, 1, 10, Qt::AlignRight);
865 pppLayout->addWidget(_pppRefCrdYLineEdit, ir,60, 1, 13);
866 pppLayout->addWidget(new QLabel(" Z "), ir,70, 1, 10, Qt::AlignRight);
867 pppLayout->addWidget(_pppRefCrdZLineEdit, ir,80, 1, 13);
868 ++ir;
869 pppLayout->addWidget(new QLabel("Corr. Mountpnt "), ir, 0, 1, 10);
870 pppLayout->addWidget(_pppCorrMountLineEdit, ir,10, 1, 20);
871 pppLayout->addWidget(new QLabel(" dN "), ir,30, 1, 10, Qt::AlignRight);
872 pppLayout->addWidget(_pppRefdNLineEdit, ir,40, 1, 10);
873 pppLayout->addWidget(new QLabel(" dE "), ir,50, 1, 10, Qt::AlignRight);
874 pppLayout->addWidget(_pppRefdELineEdit, ir,60, 1, 10);
875 pppLayout->addWidget(new QLabel(" dU "), ir,70, 1, 10, Qt::AlignRight);
876 pppLayout->addWidget(_pppRefdULineEdit, ir,80, 1, 10);
877 ++ir;
878 pppLayout->addWidget(new QLabel("Output"), ir, 0, 1, 10);
879 pppLayout->addWidget(_pppNMEALineEdit, ir,10, 1, 20);
880 pppLayout->addWidget(new QLabel("NMEA File"), ir,30, 1, 10, Qt::AlignLeft);
881 pppLayout->addWidget(_pppNMEAPortLineEdit, ir,40, 1, 10);
882 pppLayout->addWidget(new QLabel("NMEA Port"), ir,50, 1, 10);
883 pppLayout->addWidget(_pppPlotCoordinates, ir,60, 1, 3);
884 pppLayout->addWidget(new QLabel("PPP Plot"), ir,63, 1, 10);
885 ++ir;
886 pppLayout->addWidget(new QLabel("Post-Processing"), ir, 0, 1, 10);
887 pppLayout->addWidget(_postObsFileChooser, ir,10, 1, 25);
888 pppLayout->addWidget(new QLabel("Obs "), ir,35, 1, 5);
889 pppLayout->addWidget(_postNavFileChooser, ir,40, 1, 20);
890 pppLayout->addWidget(new QLabel("Nav "), ir,60, 1, 5);
891 pppLayout->addWidget(_postCorrFileChooser, ir,65, 1, 22);
892 pppLayout->addWidget(new QLabel("Corr"), ir,87, 1, 5);
893 ++ir;
894 pppLayout->addWidget(new QLabel("Post-Proc. cont'd"),ir, 0, 1, 10);
895 pppLayout->addWidget(_postOutLineEdit, ir,10, 1, 40);
896 pppLayout->addWidget(new QLabel("Output"), ir,50);
897 ++ir;
898 pppLayout->addWidget(new QLabel(" "), ir, 0, 1, 10);
899
900 pppgroup->setLayout(pppLayout);
901
902 // PPP Client (second panel)
903 // -------------------------
904 QGridLayout* ppp2Layout = new QGridLayout;
905 ppp2Layout->setColumnMinimumWidth(0,14*ww);
906 ir = 0;
907 ppp2Layout->addWidget(new QLabel("Precise Point Positioning, Panel 2."), ir, 0, 1, 10);
908 ++ir;
909 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
910 ppp2Layout->addWidget(_pppAntexFileChooser, ir, 1,1,3);
911 ppp2Layout->addWidget(new QLabel("ANTEX File"), ir, 4);
912 ppp2Layout->addWidget(_pppAntennaLineEdit, ir, 5,1,3);
913 ppp2Layout->addWidget(new QLabel("Antenna Name"), ir, 8);
914 ++ir;
915 ppp2Layout->addWidget(new QLabel("Antennas cont'd"), ir, 0);
916 ppp2Layout->addWidget(_pppApplySatAntCheckBox, ir, 1, Qt::AlignRight);
917 ppp2Layout->addWidget(new QLabel("Apply Sat. Ant. Offsets"),ir, 2);
918 ++ir;
919 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
920 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
921 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
922 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
923 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
924 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
925 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
926 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
927 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
928 ++ir;
929 ppp2Layout->addWidget(new QLabel("Options"), ir, 0, 1, 5);
930 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
931 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
932 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
933 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
934 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
935 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
936 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
937 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
938 ++ir;
939 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
940 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
941 ppp2Layout->addWidget(new QLabel("Sigma XYZ Init "), ir, 2);
942 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
943 ppp2Layout->addWidget(new QLabel("Sigma XYZ Noise "), ir, 4);
944 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
945 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
946 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
947 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
948 ++ir;
949 ppp2Layout->addWidget(new QLabel("Options cont'd"), ir, 0);
950 ppp2Layout->addWidget(_pppSync, ir, 1);
951 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
952 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
953 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
954 ++ir;
955 ppp2Layout->addWidget(new QLabel(""), ir, 0);
956
957 ppp2group->setLayout(ppp2Layout);
958
959 // Teqc Processing
960 // ---------------
961 _teqcActionComboBox = new QComboBox();
962 _teqcActionComboBox->setEditable(false);
963 _teqcActionComboBox->addItems(QString(",Edit,Analyze").split(","));
964 ik = _teqcActionComboBox->findText(settings.value("teqcAction").toString());
965 if (ik != -1) {
966 _teqcActionComboBox->setCurrentIndex(ik);
967 }
968 connect(_teqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
969 this, SLOT(slotBncTextChanged()));
970
971 QGridLayout* teqcLayout = new QGridLayout;
972 teqcLayout->setColumnMinimumWidth(0,14*ww);
973 _teqcActionComboBox->setMaximumWidth(10*ww);
974
975 _teqcObsFileChooser = new qtFileChooser;
976 _teqcObsFileChooser->setFileName(settings.value("teqcObsFile").toString());
977 _teqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
978
979 _teqcNavFileChooser = new qtFileChooser;
980 _teqcNavFileChooser->setFileName(settings.value("teqcNavFile").toString());
981 _teqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
982
983 _teqcOutLineEdit = new QLineEdit(settings.value("teqcOutFile").toString());
984 _teqcOutLineEdit->setWhatsThis(tr("Specify the full path to an output file."));
985
986 ir = 0;
987 teqcLayout->addWidget(new QLabel("RINEX file editing or concatination and file or stream quality control."), ir, 0, 1, 20);
988 ++ir;
989 teqcLayout->addWidget(new QLabel("Action"), ir, 0);
990 teqcLayout->addWidget(_teqcActionComboBox, ir, 1);
991 _teqcEditOptionButton = new QPushButton("Set Edit Options");
992 teqcLayout->addWidget(_teqcEditOptionButton, ir, 2);
993 ++ir;
994 teqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
995 teqcLayout->addWidget(_teqcObsFileChooser, ir, 1, 1, 4);
996 teqcLayout->addWidget(new QLabel("Obs "), ir, 5);
997 teqcLayout->addWidget(_teqcNavFileChooser, ir, 6, 1, 8);
998 teqcLayout->addWidget(new QLabel("Nav"), ir, 14);
999 ++ir;
1000 teqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
1001 teqcLayout->addWidget(_teqcOutLineEdit, ir, 1, 1, 4);
1002 ++ir;
1003 teqcLayout->addWidget(new QLabel(" "), ir, 0);
1004 ++ir;
1005 teqcLayout->addWidget(new QLabel(" "), ir, 0);
1006 ++ir;
1007 teqcLayout->addWidget(new QLabel(" "), ir, 0);
1008
1009 teqcgroup->setLayout(teqcLayout);
1010
1011 connect(_teqcEditOptionButton, SIGNAL(clicked()),
1012 this, SLOT(slotTeqcEditOption()));
1013
1014 // Combination
1015 // -----------
1016 QGridLayout* cmbLayout = new QGridLayout;
1017
1018 populateCmbTable();
1019 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1020 cmbLayout->addWidget(new QLabel("Combine Broadcast Ephemeris correction streams."),0, 5, 1, 5);
1021 cmbLayout->addWidget(addCmbRowButton, 1, 5);
1022 cmbLayout->addWidget(delCmbRowButton, 1, 6);
1023 cmbLayout->addWidget(new QLabel("Method"), 2, 5);
1024 cmbLayout->addWidget(_cmbMethodComboBox, 2, 6, Qt::AlignRight);
1025 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 5);
1026 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 6, Qt::AlignRight);
1027 cmbLayout->addWidget(new QLabel(" "), 4, 0);
1028 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1029 cmbLayout->addWidget(new QLabel(" "), 6, 0);
1030
1031 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1032 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1033
1034 cmbgroup->setLayout(cmbLayout);
1035
1036 // Upload Layout (Clocks)
1037 // ----------------------
1038 QGridLayout* uploadHlpLayout = new QGridLayout();
1039
1040 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1041 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1042 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1043
1044 uploadHlpLayout->addWidget(addUploadRowButton, 0,0);
1045 uploadHlpLayout->addWidget(delUploadRowButton, 0,1);
1046 uploadHlpLayout->addWidget(new QLabel("Interval"), 0,2, Qt::AlignRight);
1047 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0,3);
1048 uploadHlpLayout->addWidget(new QLabel(" Sampling (Clk)"),0,4, Qt::AlignRight);
1049 uploadHlpLayout->addWidget(_uploadSamplSpinBox, 0,5);
1050 uploadHlpLayout->addWidget(new QLabel(" Sampling (Orb)"),0,6, Qt::AlignRight);
1051 uploadHlpLayout->addWidget(_uploadSamplOrbSpinBox, 0,7);
1052 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,8);
1053
1054 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1055 populateUploadTable();
1056
1057 uploadLayout->addWidget(new QLabel("Upload orbit/clock stream coming from Real-time Network Engine or upload orbit/clock combination stream."));
1058 uploadLayout->addWidget(_uploadTable);
1059 uploadLayout->addLayout(uploadHlpLayout);
1060
1061 uploadgroup->setLayout(uploadLayout);
1062
1063 // Upload Layout (Ephemeris)
1064 // -------------------------
1065 QGridLayout* uploadLayoutEph = new QGridLayout;
1066
1067 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1068 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1069 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1070 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1071
1072 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1073 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1074 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1075 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1076 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1077 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1078 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1079 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1080 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1081 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1082 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1083 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1084 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1085 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1086 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1087
1088 uploadEphgroup->setLayout(uploadLayoutEph);
1089
1090 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1091 this, SLOT(slotBncTextChanged()));
1092
1093 // Main Layout
1094 // -----------
1095 QGridLayout* mLayout = new QGridLayout;
1096 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1097 mLayout->addWidget(_aogroup, 0,0);
1098 mLayout->addWidget(_mountPointsTable, 1,0);
1099 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1100 mLayout->addWidget(_loggroup, 2,0);
1101
1102 _canvas->setLayout(mLayout);
1103
1104 // WhatsThis
1105 // ---------
1106 _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>"));
1107 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1108 _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>"));
1109 _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>"));
1110 _waitTimeSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full epoch' seconds. A value of 3 to 5 seconds is recommended, depending on the latency of the incoming streams and the delay acceptable to your real-time GNSS network engine or products.</p>"));
1111 _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."));
1112 _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."));
1113 _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."));
1114 _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."));
1115 _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."));
1116 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application.</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>"));
1117 _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."));
1118 _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."));
1119 _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."));
1120 _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>"));
1121 _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>"));
1122 _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>"));
1123 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1124 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1125
1126 _onTheFlyComboBox->setWhatsThis(tr("<p>When operating BNC online in 'no window' mode, some configuration parameters can be changed on-the-fly without interrupting the running process. For that BNC rereads parts of its configuration in pre-defined intervals.<p></p>Select '1 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, hour, or day and let in between edited configuration options become effective on-the-fly without terminating uninvolved threads.</p><p>Note that when operating BNC in window mode, on-the-fly changeable configuration options become effective immediately through 'Save & Reread Configuration'.</p>"));
1127 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1128 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1129 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1130 _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>"));
1131 _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>"));
1132 _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>"));
1133 _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>"));
1134 _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>"));
1135 _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."));
1136 _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>"));
1137 _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>"));
1138 _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' and 'RTCM_3.x'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate these streams, the approximate latitude/longitude rover position is sent to the NTRIP broadcaster. The default values can be change according to your requirement. Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter.</p>"));
1139 _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."));
1140 _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)."));
1141 _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."));
1142 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
1143 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
1144 _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>"));
1145 _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>"));
1146 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1147 _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>"));
1148 _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>"));
1149 _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>"));
1150 _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>"));
1151 _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>"));
1152 _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>"));
1153 _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>"));
1154 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1155 _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>"));
1156 _pppMountLineEdit->setWhatsThis(tr("<p>Specify an observations stream by its mountpoint from the 'Streams' list compiled below if you want BNC to estimate coordinates for the affected receiver position through a PPP solution. Example: 'FFMJ1'</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
1157 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock corrections stream by its mountpoint from the 'Streams' list compiled below. Example: 'CLK10'</p>"));
1158 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP) in real-time and post processing mode.</p>"));
1159 _teqcActionComboBox->setWhatsThis(tr("<p>Select an editing action.</p>"));
1160 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
1161 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
1162 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for adding GLONASS observations to GPS and Galileo (optional) in a PPP solution.</p>"));
1163 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for adding Galileo observations to GPS and GLONASS (optional) in a PPP solution.</p>"));
1164 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
1165 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
1166 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
1167 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
1168 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'Sigma XYZ Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
1169 _pppMaxSolGapLineEdit->setWhatsThis(tr("<p>Specify a 'Maximum Solution Gap' in seconds. Should the time span between two consecutive solutions exceed this limit, the algorithm returns into the Quick-Start mode and fixes the introduced reference coordinate for the specified Quick-Start period. A value of '120' seconds could be an appropriate choice.</p><p>This option makes only sense for a stationary operated receiver where solution convergence can be enforced because a good approximation for the rover position is known. Default is an empty option field, meaning that you don't want BNC to return into the Quick-Start mode after failures caused i.e. by longer lasting outages.</p>"));
1170 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
1171 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
1172 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
1173 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the white noise of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
1174 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
1175 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 3e-6 (default) would mean that the tropospheric effect may vary for 3600 * 3e-6 = 0.01 meters per hour.</p>"));
1176 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
1177 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
1178 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
1179 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
1180 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
1181 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
1182 _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."));
1183 _pppSync->setWhatsThis(tr(
1184 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
1185 "immediately after its arrival using satellite clock corrections available at "
1186 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
1187 "are buffered and the processing of each epoch is postponed till the satellite clock "
1188 "corrections not older than 'Sync Corr' seconds are available.<p>"));
1189 _pppAntexFileChooser->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
1190 _pppAntennaLineEdit->setWhatsThis(tr("<p>Specify the receiver's antenna name as defined in your ANTEX file. Observations will be corrected for the antenna phase center's offset which may result in a reduction of a few centimeters at max. Corrections for phase center variations are not yet applied by BNC. The specified name must consist of 20 characters. Add trailing blanks if the antenna name has less then 20 characters.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets.</p>"));
1191 _pppApplySatAntCheckBox->setWhatsThis(tr("<p>This option is not yet working.</p><p>Satellite orbit and clock corrections refer to the satellite's antenna phase centers and hence observations are actually <u>not</u> to be corrected for satellite antenna phase center offsets. However, you may like to tick 'Apply Offsets' to force BNC to correct observations for satellite antenna phase center offsets.</p><p>Default is to <u>not</u> correct observations for satellite antenna phase center offsets."));
1192 _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.</p><p>Note that an appropriate 'Wait for full 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.</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 streams to get hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC must therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p>"));
1193 _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>"));
1194 _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>"));
1195 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to broadcast ephemeris (Broadcast Corrections) in RTCM Version 3 SSR format. The clock and orbit corrections may either come from a Real-time Network Engine or from a combination of incoming orbit/clock streams.</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' field to enter the NTRIP broadcaster IP port.</p>"));
1196 _postObsFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Observation file."));
1197 _postNavFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Navigation file."));
1198 _postCorrFileChooser->setWhatsThis(tr("Full path to Broadcast Corrections file as previously saved with BNC in plain ASCII format."));
1199 _postOutLineEdit->setWhatsThis(tr("Full path to file with post processing PPP results. "));
1200 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1201 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1202
1203 // Enable/Disable all Widgets
1204 // --------------------------
1205 slotBncTextChanged();
1206
1207 // Auto start
1208 // ----------
1209 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1210 slotStart();
1211 }
1212}
1213
1214// Destructor
1215////////////////////////////////////////////////////////////////////////////
1216bncWindow::~bncWindow() {
1217 delete _caster;
1218 delete _casterEph;
1219}
1220
1221//
1222////////////////////////////////////////////////////////////////////////////
1223void bncWindow::populateMountPointsTable() {
1224
1225 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1226 _mountPointsTable->removeRow(iRow);
1227 }
1228
1229 bncSettings settings;
1230
1231 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1232 if (!it.hasNext()) {
1233 _actStart->setEnabled(false);
1234 }
1235 int iRow = 0;
1236 while (it.hasNext()) {
1237 QStringList hlp = it.next().split(" ");
1238 if (hlp.size() < 5) continue;
1239 _mountPointsTable->insertRow(iRow);
1240
1241 QUrl url(hlp[0]);
1242
1243 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1244 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1245 QString nmea(hlp[4]);
1246 if (hlp[5] == "S") {
1247 fullPath = hlp[0].replace(0,2,"");
1248 }
1249 QString ntripVersion = "2";
1250 if (hlp.size() >= 6) {
1251 ntripVersion = (hlp[5]);
1252 }
1253
1254 QTableWidgetItem* it;
1255 it = new QTableWidgetItem(url.userInfo());
1256 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1257 _mountPointsTable->setItem(iRow, 0, it);
1258
1259 it = new QTableWidgetItem(fullPath);
1260 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1261 _mountPointsTable->setItem(iRow, 1, it);
1262
1263 it = new QTableWidgetItem(format);
1264 _mountPointsTable->setItem(iRow, 2, it);
1265
1266 if (nmea == "yes") {
1267 it = new QTableWidgetItem(latitude);
1268 _mountPointsTable->setItem(iRow, 3, it);
1269 it = new QTableWidgetItem(longitude);
1270 _mountPointsTable->setItem(iRow, 4, it);
1271 } else {
1272 it = new QTableWidgetItem(latitude);
1273 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1274 _mountPointsTable->setItem(iRow, 3, it);
1275 it = new QTableWidgetItem(longitude);
1276 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1277 _mountPointsTable->setItem(iRow, 4, it);
1278 }
1279
1280 it = new QTableWidgetItem(nmea);
1281 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1282 _mountPointsTable->setItem(iRow, 5, it);
1283
1284 it = new QTableWidgetItem(ntripVersion);
1285 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1286 _mountPointsTable->setItem(iRow, 6, it);
1287
1288 bncTableItem* bncIt = new bncTableItem();
1289 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1290 _mountPointsTable->setItem(iRow, 7, bncIt);
1291
1292 iRow++;
1293 }
1294
1295 _mountPointsTable->sortItems(1);
1296}
1297
1298// Retrieve Table
1299////////////////////////////////////////////////////////////////////////////
1300void bncWindow::slotAddMountPoints() {
1301
1302 bncSettings settings;
1303 QString proxyHost = settings.value("proxyHost").toString();
1304 int proxyPort = settings.value("proxyPort").toInt();
1305 if (proxyHost != _proxyHostLineEdit->text() ||
1306 proxyPort != _proxyPortLineEdit->text().toInt()) {
1307 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1308 "changed. Use the new ones?",
1309 QMessageBox::Yes, QMessageBox::No,
1310 QMessageBox::NoButton);
1311 if (iRet == QMessageBox::Yes) {
1312 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1313 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1314 settings.sync();
1315 }
1316 }
1317
1318 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1319 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1320 settings.sync();
1321
1322 QMessageBox msgBox;
1323 msgBox.setIcon(QMessageBox::Question);
1324 msgBox.setWindowTitle("Add Stream");
1325 msgBox.setText("Add stream(s) coming from:");
1326
1327 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1328 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1329 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1330 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1331 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1332
1333 msgBox.exec();
1334
1335 if (msgBox.clickedButton() == buttonNtrip) {
1336 bncTableDlg* dlg = new bncTableDlg(this);
1337 dlg->move(this->pos().x()+50, this->pos().y()+50);
1338 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1339 this, SLOT(slotNewMountPoints(QStringList*)));
1340 dlg->exec();
1341 delete dlg;
1342 } else if (msgBox.clickedButton() == buttonIP) {
1343 bncIpPort* ipp = new bncIpPort(this);
1344 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1345 this, SLOT(slotNewMountPoints(QStringList*)));
1346 ipp->exec();
1347 delete ipp;
1348 } else if (msgBox.clickedButton() == buttonUDP) {
1349 bncUdpPort* udp = new bncUdpPort(this);
1350 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1351 this, SLOT(slotNewMountPoints(QStringList*)));
1352 udp->exec();
1353 delete udp;
1354 } else if (msgBox.clickedButton() == buttonSerial) {
1355 bncSerialPort* sep = new bncSerialPort(this);
1356 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1357 this, SLOT(slotNewMountPoints(QStringList*)));
1358 sep->exec();
1359 delete sep;
1360 } else if (msgBox.clickedButton() == buttonCancel) {
1361 // Cancel
1362 }
1363}
1364
1365// Delete Selected Mount Points
1366////////////////////////////////////////////////////////////////////////////
1367void bncWindow::slotDeleteMountPoints() {
1368
1369 int nRows = _mountPointsTable->rowCount();
1370 bool flg[nRows];
1371 for (int iRow = 0; iRow < nRows; iRow++) {
1372 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1373 flg[iRow] = true;
1374 }
1375 else {
1376 flg[iRow] = false;
1377 }
1378 }
1379 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1380 if (flg[iRow]) {
1381 _mountPointsTable->removeRow(iRow);
1382 }
1383 }
1384 _actDeleteMountPoints->setEnabled(false);
1385
1386 if (_mountPointsTable->rowCount() == 0) {
1387 _actStart->setEnabled(false);
1388 }
1389}
1390
1391// New Mount Points Selected
1392////////////////////////////////////////////////////////////////////////////
1393void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1394 int iRow = 0;
1395 QListIterator<QString> it(*mountPoints);
1396 while (it.hasNext()) {
1397 QStringList hlp = it.next().split(" ");
1398 QUrl url(hlp[0]);
1399 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1400 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1401 QString nmea(hlp[4]);
1402 if (hlp[5] == "S") {
1403 fullPath = hlp[0].replace(0,2,"");
1404 }
1405 QString ntripVersion = "2";
1406 if (hlp.size() >= 6) {
1407 ntripVersion = (hlp[5]);
1408 }
1409
1410 _mountPointsTable->insertRow(iRow);
1411
1412 QTableWidgetItem* it;
1413 it = new QTableWidgetItem(url.userInfo());
1414 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1415 _mountPointsTable->setItem(iRow, 0, it);
1416
1417 it = new QTableWidgetItem(fullPath);
1418 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1419 _mountPointsTable->setItem(iRow, 1, it);
1420
1421 it = new QTableWidgetItem(format);
1422 _mountPointsTable->setItem(iRow, 2, it);
1423
1424 if (nmea == "yes") {
1425 it = new QTableWidgetItem(latitude);
1426 _mountPointsTable->setItem(iRow, 3, it);
1427 it = new QTableWidgetItem(longitude);
1428 _mountPointsTable->setItem(iRow, 4, it);
1429 } else {
1430 it = new QTableWidgetItem(latitude);
1431 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1432 _mountPointsTable->setItem(iRow, 3, it);
1433 it = new QTableWidgetItem(longitude);
1434 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1435 _mountPointsTable->setItem(iRow, 4, it);
1436 }
1437
1438 it = new QTableWidgetItem(nmea);
1439 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1440 _mountPointsTable->setItem(iRow, 5, it);
1441
1442 it = new QTableWidgetItem(ntripVersion);
1443 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1444 _mountPointsTable->setItem(iRow, 6, it);
1445
1446 bncTableItem* bncIt = new bncTableItem();
1447 _mountPointsTable->setItem(iRow, 7, bncIt);
1448
1449 iRow++;
1450 }
1451 _mountPointsTable->hideColumn(0);
1452 _mountPointsTable->sortItems(1);
1453 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1454 _actStart->setEnabled(true);
1455 }
1456 delete mountPoints;
1457}
1458
1459// Save Options
1460////////////////////////////////////////////////////////////////////////////
1461void bncWindow::slotSaveOptions() {
1462
1463 QStringList mountPoints;
1464 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1465
1466 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1467 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1468 "@" + _mountPointsTable->item(iRow, 1)->text() );
1469
1470 mountPoints.append(url.toString() + " " +
1471 _mountPointsTable->item(iRow, 2)->text()
1472 + " " + _mountPointsTable->item(iRow, 3)->text()
1473 + " " + _mountPointsTable->item(iRow, 4)->text()
1474 + " " + _mountPointsTable->item(iRow, 5)->text()
1475 + " " + _mountPointsTable->item(iRow, 6)->text());
1476 } else {
1477 mountPoints.append(
1478 "//" + _mountPointsTable->item(iRow, 1)->text()
1479 + " " + _mountPointsTable->item(iRow, 2)->text()
1480 + " " + _mountPointsTable->item(iRow, 3)->text()
1481 + " " + _mountPointsTable->item(iRow, 4)->text()
1482 + " " + _mountPointsTable->item(iRow, 5)->text()
1483 + " " + _mountPointsTable->item(iRow, 6)->text());
1484 }
1485 }
1486
1487 QStringList combineStreams;
1488 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1489 QString hlp;
1490 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1491 if (_cmbTable->item(iRow, iCol)) {
1492 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1493 }
1494 }
1495 if (!hlp.isEmpty()) {
1496 combineStreams << hlp;
1497 }
1498 }
1499
1500 QStringList uploadMountpointsOut;
1501 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1502 QString hlp;
1503 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1504 if (_uploadTable->cellWidget(iRow, iCol) &&
1505 (iCol == 3 || iCol == 4 || iCol == 5)) {
1506 if (iCol == 3) {
1507 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1508 hlp += passwd->text() + ",";
1509 }
1510 else if (iCol == 4) {
1511 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1512 hlp += system->currentText() + ",";
1513 }
1514 else if (iCol == 5) {
1515 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1516 QString state; state.setNum(com->checkState());
1517 hlp += state + ",";
1518 }
1519 }
1520 else if (_uploadTable->item(iRow, iCol)) {
1521 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1522 }
1523 }
1524 if (!hlp.isEmpty()) {
1525 uploadMountpointsOut << hlp;
1526 }
1527 }
1528
1529 bncSettings settings;
1530
1531 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1532 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1533 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1534 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1535 settings.setValue("binSampl", _binSamplSpinBox->value());
1536 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1537 settings.setValue("corrPath", _corrPathLineEdit->text());
1538 settings.setValue("corrPort", _corrPortLineEdit->text());
1539 settings.setValue("corrTime", _corrTimeSpinBox->value());
1540 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1541 settings.setValue("ephPath", _ephPathLineEdit->text());
1542 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1543 settings.setValue("logFile", _logFileLineEdit->text());
1544 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1545 settings.setValue("miscMount", _miscMountLineEdit->text());
1546 settings.setValue("pppMount", _pppMountLineEdit->text());
1547 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1548 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1549 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1550 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1551 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1552 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1553 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1554 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1555 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1556 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1557 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1558 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1559 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1560 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1561 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1562 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1563 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1564 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1565 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1566 settings.setValue("pppSync", _pppSync->text());
1567 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1568 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1569 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1570 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1571 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1572 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1573 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1574 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1575 settings.setValue("mountPoints", mountPoints);
1576 settings.setValue("obsRate", _obsRateComboBox->currentText());
1577 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1578 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1579 settings.setValue("outFile", _outFileLineEdit->text());
1580 settings.setValue("outPort", _outPortLineEdit->text());
1581 settings.setValue("outUPort", _outUPortLineEdit->text());
1582 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1583 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1584 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1585 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1586 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1587 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1588 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1589 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1590 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1591 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1592 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1593 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1594 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1595 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1596 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1597 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1598 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1599 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1600 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1601 settings.setValue("serialParity", _serialParityComboBox->currentText());
1602 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1603 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1604 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1605 settings.setValue("startTab", _aogroup->currentIndex());
1606 settings.setValue("statusTab", _loggroup->currentIndex());
1607 settings.setValue("waitTime", _waitTimeSpinBox->value());
1608 if (!combineStreams.isEmpty()) {
1609 settings.setValue("combineStreams", combineStreams);
1610 }
1611 else {
1612 settings.setValue("combineStreams", "");
1613 }
1614 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1615 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1616
1617 if (!uploadMountpointsOut.isEmpty()) {
1618 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1619 }
1620 else {
1621 settings.setValue("uploadMountpointsOut", "");
1622 }
1623 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1624 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1625 settings.setValue("uploadSamplOrb", _uploadSamplOrbSpinBox->value());
1626
1627 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1628 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1629 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1630 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1631 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1632
1633 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1634 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1635 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1636 settings.setValue("postOutFile", _postOutLineEdit->text());
1637
1638 settings.setValue("teqcObsFile", _teqcObsFileChooser->fileName());
1639 settings.setValue("teqcNavFile", _teqcNavFileChooser->fileName());
1640 settings.setValue("teqcOutFile", _teqcOutLineEdit->text());
1641
1642 if (_caster) {
1643 _caster->slotReadMountPoints();
1644 }
1645 settings.sync();
1646}
1647
1648// All get slots terminated
1649////////////////////////////////////////////////////////////////////////////
1650void bncWindow::slotGetThreadsFinished() {
1651 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1652 delete _caster; _caster = 0;
1653 delete _casterEph; _casterEph = 0;
1654 _actStart->setEnabled(true);
1655 _actStop->setEnabled(false);
1656}
1657
1658// Start It!
1659////////////////////////////////////////////////////////////////////////////
1660void bncWindow::slotStart() {
1661 slotSaveOptions();
1662 if ( _pppSPPComboBox->currentText() == "Post-Processing" ) {
1663 startPostProcessingPPP();
1664 }
1665 else if ( !_teqcActionComboBox->currentText().isEmpty() ) {
1666 startPostProcessingTeqc();
1667 }
1668 else {
1669 startRealTime();
1670 }
1671}
1672
1673// Start Real-Time (Retrieve Data etc.)
1674////////////////////////////////////////////////////////////////////////////
1675void bncWindow::startRealTime() {
1676
1677 _bncFigurePPP->reset();
1678
1679 _actDeleteMountPoints->setEnabled(false);
1680 _actStart->setEnabled(false);
1681 _actStop->setEnabled(true);
1682
1683 _caster = new bncCaster(_outFileLineEdit->text(),
1684 _outPortLineEdit->text().toInt());
1685
1686 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1687 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1688 ((bncApp*)qApp)->initCombination();
1689
1690 connect(_caster, SIGNAL(getThreadsFinished()),
1691 this, SLOT(slotGetThreadsFinished()));
1692
1693 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1694 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1695
1696 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1697
1698 bncSettings settings;
1699
1700 QDir rnxdir(settings.value("rnxPath").toString());
1701 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1702
1703 QString rnx_file = settings.value("rnxScript").toString();
1704 if ( !rnx_file.isEmpty() ) {
1705 QFile rnxfile(settings.value("rnxScript").toString());
1706 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1707 }
1708
1709 QDir ephdir(settings.value("ephPath").toString());
1710 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1711
1712 QDir corrdir(settings.value("corrPath").toString());
1713 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1714
1715 QString advise_file = settings.value("adviseScript").toString();
1716 if ( !advise_file.isEmpty() ) {
1717 QFile advisefile(settings.value("adviseScript").toString());
1718 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1719 }
1720
1721 QString ant_file = settings.value("pppAntex").toString();
1722 if ( !ant_file.isEmpty() ) {
1723 QFile anxfile(settings.value("pppAntex").toString());
1724 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1725 }
1726
1727 _caster->slotReadMountPoints();
1728
1729 _casterEph = new bncEphUploadCaster();
1730 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
1731 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
1732}
1733
1734// Retrieve Data
1735////////////////////////////////////////////////////////////////////////////
1736void bncWindow::slotStop() {
1737 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1738 QMessageBox::Yes, QMessageBox::No,
1739 QMessageBox::NoButton);
1740 if (iRet == QMessageBox::Yes) {
1741 ((bncApp*)qApp)->stopCombination();
1742 delete _caster; _caster = 0;
1743 delete _casterEph; _casterEph = 0;
1744 _actStart->setEnabled(true);
1745 _actStop->setEnabled(false);
1746 }
1747}
1748
1749// Close Application gracefully
1750////////////////////////////////////////////////////////////////////////////
1751void bncWindow::closeEvent(QCloseEvent* event) {
1752
1753 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1754 QMessageBox::Yes, QMessageBox::No,
1755 QMessageBox::Cancel);
1756
1757 if (iRet == QMessageBox::Cancel) {
1758 event->ignore();
1759 return;
1760 }
1761 else if (iRet == QMessageBox::Yes) {
1762 slotSaveOptions();
1763 }
1764
1765 QMainWindow::closeEvent(event);
1766}
1767
1768// User changed the selection of mountPoints
1769////////////////////////////////////////////////////////////////////////////
1770void bncWindow::slotSelectionChanged() {
1771 if (_mountPointsTable->selectedItems().isEmpty()) {
1772 _actDeleteMountPoints->setEnabled(false);
1773 }
1774 else {
1775 _actDeleteMountPoints->setEnabled(true);
1776 }
1777}
1778
1779// Display Program Messages
1780////////////////////////////////////////////////////////////////////////////
1781void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1782
1783#ifdef DEBUG_RTCM2_2021
1784 const int maxBufferSize = 1000;
1785#else
1786 const int maxBufferSize = 10000;
1787#endif
1788
1789 if (! showOnScreen ) {
1790 return;
1791 }
1792
1793 QString txt = _log->toPlainText() + "\n" +
1794 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1795 _log->clear();
1796 _log->append(txt.right(maxBufferSize));
1797}
1798
1799// About Message
1800////////////////////////////////////////////////////////////////////////////
1801void bncWindow::slotAbout() {
1802 new bncAboutDlg(0);
1803}
1804
1805//Flowchart
1806////////////////////////////////////////////////////////////////////////////
1807void bncWindow::slotFlowchart() {
1808 new bncFlowchartDlg(0);
1809}
1810
1811// Help Window
1812////////////////////////////////////////////////////////////////////////////
1813void bncWindow::slotHelp() {
1814 QUrl url;
1815 url.setPath(":bnchelp.html");
1816 new bncHlpDlg(0, url);
1817}
1818
1819// Select Fonts
1820////////////////////////////////////////////////////////////////////////////
1821void bncWindow::slotFontSel() {
1822 bool ok;
1823 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1824 if (ok) {
1825 bncSettings settings;
1826 settings.setValue("font", newFont.toString());
1827 QApplication::setFont(newFont);
1828 int ww = QFontMetrics(newFont).width('w');
1829 setMinimumSize(60*ww, 80*ww);
1830 resize(60*ww, 80*ww);
1831 }
1832}
1833
1834// Whats This Help
1835void bncWindow::slotWhatsThis() {
1836 QWhatsThis::enterWhatsThisMode();
1837}
1838
1839//
1840////////////////////////////////////////////////////////////////////////////
1841void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1842 _bncFigure->updateMountPoints();
1843 _bncFigureLate->updateMountPoints();
1844
1845 populateMountPointsTable();
1846 bncSettings settings;
1847 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1848 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1849 QListIterator<bncGetThread*> iTh(threads);
1850 while (iTh.hasNext()) {
1851 bncGetThread* thread = iTh.next();
1852 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1853 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1854 "@" + _mountPointsTable->item(iRow, 1)->text() );
1855 if (url == thread->mountPoint() &&
1856 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1857 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1858 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1859 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1860 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1861 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1862 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1863 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1864 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1865 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1866 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1867 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1868 disconnect(thread,
1869 SIGNAL(newPosition(bncTime, double, double, double)),
1870 _bncFigurePPP,
1871 SLOT(slotNewPosition(bncTime, double, double, double)));
1872 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1873 _bncFigurePPP,
1874 SLOT(slotNewPosition(bncTime, double, double, double)));
1875 }
1876 break;
1877 }
1878 }
1879 }
1880}
1881
1882//
1883////////////////////////////////////////////////////////////////////////////
1884void bncWindow::CreateMenu() {
1885 // Create Menus
1886 // ------------
1887 _menuFile = menuBar()->addMenu(tr("&File"));
1888 _menuFile->addAction(_actFontSel);
1889 _menuFile->addSeparator();
1890 _menuFile->addAction(_actSaveOpt);
1891 _menuFile->addSeparator();
1892 _menuFile->addAction(_actQuit);
1893
1894 _menuHlp = menuBar()->addMenu(tr("&Help"));
1895 _menuHlp->addAction(_actHelp);
1896 _menuHlp->addAction(_actFlowchart);
1897 _menuHlp->addAction(_actAbout);
1898}
1899
1900// Toolbar
1901////////////////////////////////////////////////////////////////////////////
1902void bncWindow::AddToolbar() {
1903 QToolBar* toolBar = new QToolBar;
1904 addToolBar(Qt::BottomToolBarArea, toolBar);
1905 toolBar->setMovable(false);
1906 toolBar->addAction(_actAddMountPoints);
1907 toolBar->addAction(_actDeleteMountPoints);
1908 toolBar->addAction(_actStart);
1909 toolBar->addAction(_actStop);
1910 toolBar->addWidget(new QLabel(" "));
1911 toolBar->addAction(_actwhatsthis);
1912}
1913
1914// About
1915////////////////////////////////////////////////////////////////////////////
1916bncAboutDlg::bncAboutDlg(QWidget* parent) :
1917 QDialog(parent) {
1918
1919 QTextBrowser* tb = new QTextBrowser;
1920 QUrl url; url.setPath(":bncabout.html");
1921 tb->setSource(url);
1922 tb->setReadOnly(true);
1923
1924 int ww = QFontMetrics(font()).width('w');
1925 QPushButton* _closeButton = new QPushButton("Close");
1926 _closeButton->setMaximumWidth(10*ww);
1927 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1928
1929 QGridLayout* dlgLayout = new QGridLayout();
1930 QLabel* img = new QLabel();
1931 img->setPixmap(QPixmap(":ntrip-logo.png"));
1932 dlgLayout->addWidget(img, 0,0);
1933 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1934 dlgLayout->addWidget(tb,1,0,1,2);
1935 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1936
1937 setLayout(dlgLayout);
1938 resize(60*ww, 60*ww);
1939 setWindowTitle("About BNC");
1940 show();
1941}
1942
1943//
1944////////////////////////////////////////////////////////////////////////////
1945bncAboutDlg::~bncAboutDlg() {
1946};
1947
1948// Flowchart
1949////////////////////////////////////////////////////////////////////////////
1950bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1951 QDialog(parent) {
1952
1953 int ww = QFontMetrics(font()).width('w');
1954 QPushButton* _closeButton = new QPushButton("Close");
1955 _closeButton->setMaximumWidth(10*ww);
1956 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1957
1958 QGridLayout* dlgLayout = new QGridLayout();
1959 QLabel* img = new QLabel();
1960 img->setPixmap(QPixmap(":bncflowchart.png"));
1961 dlgLayout->addWidget(img, 0,0);
1962 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1963
1964 setLayout(dlgLayout);
1965 setWindowTitle("Flow Chart");
1966 show();
1967}
1968
1969//
1970////////////////////////////////////////////////////////////////////////////
1971bncFlowchartDlg::~bncFlowchartDlg() {
1972};
1973
1974// Enable/Disable Widget (and change its color)
1975////////////////////////////////////////////////////////////////////////////
1976void bncWindow::enableWidget(bool enable, QWidget* widget) {
1977 const static QPalette paletteWhite(QColor(255, 255, 255));
1978 const static QPalette paletteGray(QColor(230, 230, 230));
1979
1980 widget->setEnabled(enable);
1981 if (enable) {
1982 widget->setPalette(paletteWhite);
1983 }
1984 else {
1985 widget->setPalette(paletteGray);
1986 }
1987}
1988
1989// Bnc Text
1990////////////////////////////////////////////////////////////////////////////
1991void bncWindow::slotBncTextChanged(){
1992
1993 bool enable = true;
1994
1995 // Proxy
1996 //------
1997 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1998 enable = !_proxyHostLineEdit->text().isEmpty();
1999 enableWidget(enable, _proxyPortLineEdit);
2000 }
2001
2002 // RINEX Observations
2003 // ------------------
2004 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2005 enable = !_rnxPathLineEdit->text().isEmpty();
2006 enableWidget(enable, _rnxSamplSpinBox);
2007 enableWidget(enable, _rnxSkelLineEdit);
2008 enableWidget(enable, _rnxScrpLineEdit);
2009 enableWidget(enable, _rnxV3CheckBox);
2010 enableWidget(enable, _rnxIntrComboBox);
2011 }
2012
2013 // RINEX Ephemeris
2014 // ---------------
2015 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2016 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2017 enableWidget(enable, _ephIntrComboBox);
2018 enableWidget(enable, _ephV3CheckBox);
2019 }
2020
2021 // Broadcast Corrections
2022 // ---------------------
2023 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2024 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2025 enableWidget(enable, _corrIntrComboBox);
2026 }
2027
2028 // Feed Engine
2029 // -----------
2030 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2031 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2032 enableWidget(enable, _waitTimeSpinBox);
2033 enableWidget(enable, _binSamplSpinBox);
2034 }
2035
2036 // Serial Output
2037 // -------------
2038 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2039 sender() == _serialAutoNMEAComboBox) {
2040 enable = !_serialMountPointLineEdit->text().isEmpty();
2041 enableWidget(enable, _serialPortNameLineEdit);
2042 enableWidget(enable, _serialBaudRateComboBox);
2043 enableWidget(enable, _serialParityComboBox);
2044 enableWidget(enable, _serialDataBitsComboBox);
2045 enableWidget(enable, _serialStopBitsComboBox);
2046 enableWidget(enable, _serialFlowControlComboBox);
2047 enableWidget(enable, _serialAutoNMEAComboBox);
2048
2049 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2050 enableWidget(enable2, _serialFileNMEALineEdit);
2051 }
2052
2053 // Outages
2054 // -------
2055 if (sender() == 0 || sender() == _obsRateComboBox) {
2056 enable = !_obsRateComboBox->currentText().isEmpty();
2057 enableWidget(enable, _adviseFailSpinBox);
2058 enableWidget(enable, _adviseRecoSpinBox);
2059 enableWidget(enable, _adviseScriptLineEdit);
2060 }
2061
2062 // Miscellaneous
2063 // -------------
2064 if (sender() == 0 || sender() == _miscMountLineEdit) {
2065 enable = !_miscMountLineEdit->text().isEmpty();
2066 enableWidget(enable, _perfIntrComboBox);
2067 enableWidget(enable, _scanRTCMCheckBox);
2068 }
2069
2070 // PPP Client
2071 // ----------
2072 if (sender() == 0
2073 || sender() == _pppMountLineEdit
2074 || sender() == _pppCorrMountLineEdit
2075 || sender() == _pppRefCrdXLineEdit
2076 || sender() == _pppRefCrdYLineEdit
2077 || sender() == _pppRefCrdZLineEdit
2078 || sender() == _pppRefdNLineEdit
2079 || sender() == _pppRefdELineEdit
2080 || sender() == _pppRefdULineEdit
2081 || sender() == _pppSync
2082 || sender() == _pppSPPComboBox
2083 || sender() == _pppQuickStartLineEdit
2084 || sender() == _pppEstTropoCheckBox
2085 || sender() == _pppUsePhaseCheckBox
2086 || sender() == _pppAntexFileChooser ) {
2087
2088 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2089 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "Realtime-SPP") ||
2090 (_pppSPPComboBox->currentText() == "Post-Processing");
2091
2092 enableWidget(enable, _pppNMEALineEdit);
2093 enableWidget(enable, _pppNMEAPortLineEdit);
2094 enableWidget(enable, _pppRefCrdXLineEdit);
2095 enableWidget(enable, _pppRefCrdYLineEdit);
2096 enableWidget(enable, _pppRefCrdZLineEdit);
2097 enableWidget(enable, _pppRefdNLineEdit);
2098 enableWidget(enable, _pppRefdELineEdit);
2099 enableWidget(enable, _pppRefdULineEdit);
2100 enableWidget(enable, _pppUsePhaseCheckBox);
2101 enableWidget(enable, _pppPlotCoordinates);
2102 enableWidget(enable, _pppEstTropoCheckBox);
2103 enableWidget(enable, _pppGLONASSCheckBox);
2104 enableWidget(enable, _pppGalileoCheckBox);
2105 enableWidget(enable, _pppAntexFileChooser);
2106 enableWidget(enable, _pppSigCLineEdit);
2107 enableWidget(enable, _pppSigCrd0);
2108 enableWidget(enable, _pppSigCrdP);
2109
2110 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2111 !_pppRefCrdYLineEdit->text().isEmpty() &&
2112 !_pppRefCrdZLineEdit->text().isEmpty();
2113
2114 enableWidget(enable2, _pppAverageLineEdit);
2115 enableWidget(enable2, _pppQuickStartLineEdit);
2116
2117 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2118 enableWidget(enable3, _pppMaxSolGapLineEdit);
2119
2120 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2121 enableWidget(enable4, _pppAntennaLineEdit);
2122 enableWidget(enable4, _pppApplySatAntCheckBox);
2123
2124 bool enable5 = enable && _pppEstTropoCheckBox->isChecked() && !_pppMountLineEdit->text().isEmpty();
2125 enableWidget(enable5, _pppSigTrp0);
2126 enableWidget(enable5, _pppSigTrpP);
2127
2128 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2129 enableWidget(enable6, _pppSigPLineEdit);
2130
2131 bool enable7 = enable && _pppSPPComboBox->currentText() == "Realtime-PPP";
2132 enableWidget(enable7, _pppSync);
2133
2134 bool enable8 = _pppSPPComboBox->currentText() == "Realtime-PPP";
2135 enableWidget(enable8, _pppCorrMountLineEdit);
2136
2137 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2138 enableWidget(enable9, _postObsFileChooser);
2139 enableWidget(enable9, _postNavFileChooser);
2140 enableWidget(enable9, _postCorrFileChooser);
2141 enableWidget(enable9, _postOutLineEdit);
2142 enableWidget(!enable9, _pppMountLineEdit);
2143 }
2144
2145 if (sender() == 0 || sender() == _teqcActionComboBox) {
2146 bool enable10 = _teqcActionComboBox->currentText() == "Edit";
2147 enableWidget(enable10, _teqcEditOptionButton);
2148 enableWidget(!enable10, _teqcNavFileChooser);
2149 enableWidget(!enable10, _teqcOutLineEdit);
2150 }
2151}
2152
2153//
2154////////////////////////////////////////////////////////////////////////////
2155void bncWindow::slotAddCmbRow() {
2156 int iRow = _cmbTable->rowCount();
2157 _cmbTable->insertRow(iRow);
2158 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2159 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2160 }
2161}
2162
2163//
2164////////////////////////////////////////////////////////////////////////////
2165void bncWindow::slotDelCmbRow() {
2166 int nRows = _cmbTable->rowCount();
2167 bool flg[nRows];
2168 for (int iRow = 0; iRow < nRows; iRow++) {
2169 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2170 flg[iRow] = true;
2171 }
2172 else {
2173 flg[iRow] = false;
2174 }
2175 }
2176 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2177 if (flg[iRow]) {
2178 _cmbTable->removeRow(iRow);
2179 }
2180 }
2181}
2182
2183//
2184////////////////////////////////////////////////////////////////////////////
2185void bncWindow::populateCmbTable() {
2186
2187 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2188 _cmbTable->removeRow(iRow);
2189 }
2190
2191 bncSettings settings;
2192
2193 int iRow = -1;
2194 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2195 while (it.hasNext()) {
2196 QStringList hlp = it.next().split(" ");
2197 if (hlp.size() > 2) {
2198 ++iRow;
2199 _cmbTable->insertRow(iRow);
2200 }
2201 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2202 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2203 }
2204 }
2205}
2206
2207//
2208////////////////////////////////////////////////////////////////////////////
2209void bncWindow::slotAddUploadRow() {
2210 int iRow = _uploadTable->rowCount();
2211 _uploadTable->insertRow(iRow);
2212 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2213 if (iCol == 3) {
2214 QLineEdit* passwd = new QLineEdit();
2215 passwd->setFrame(false);
2216 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2217 _uploadTable->setCellWidget(iRow, iCol, passwd);
2218 }
2219 else if (iCol == 4) {
2220 QComboBox* system = new QComboBox();
2221 system->setEditable(false);
2222 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2223 system->setFrame(false);
2224 _uploadTable->setCellWidget(iRow, iCol, system);
2225 }
2226 else if (iCol == 5) {
2227 QCheckBox* com = new QCheckBox();
2228 _uploadTable->setCellWidget(iRow, iCol, com);
2229 }
2230 else if (iCol == 8) {
2231 bncTableItem* bncIt = new bncTableItem();
2232 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2233 _uploadTable->setItem(iRow, iCol, bncIt);
2234 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2235 }
2236 else {
2237 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2238 }
2239 }
2240}
2241
2242//
2243////////////////////////////////////////////////////////////////////////////
2244void bncWindow::slotDelUploadRow() {
2245 ((bncApp*)qApp)->_uploadTableItems.clear();
2246 int nRows = _uploadTable->rowCount();
2247 bool flg[nRows];
2248 for (int iRow = 0; iRow < nRows; iRow++) {
2249 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2250 flg[iRow] = true;
2251 }
2252 else {
2253 flg[iRow] = false;
2254 }
2255 }
2256 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2257 if (flg[iRow]) {
2258 _uploadTable->removeRow(iRow);
2259 }
2260 }
2261 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2262 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2263 (bncTableItem*) _uploadTable->item(iRow, 8);
2264 }
2265}
2266
2267//
2268////////////////////////////////////////////////////////////////////////////
2269void bncWindow::populateUploadTable() {
2270 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2271 _uploadTable->removeRow(iRow);
2272 }
2273
2274 bncSettings settings;
2275
2276 int iRow = -1;
2277 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2278 while (it.hasNext()) {
2279 QStringList hlp = it.next().split(",");
2280 if (hlp.size() > 6) {
2281 ++iRow;
2282 _uploadTable->insertRow(iRow);
2283 }
2284 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2285 if (iCol == 3) {
2286 QLineEdit* passwd = new QLineEdit();
2287 passwd->setFrame(false);
2288 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2289 passwd->setText(hlp[iCol]);
2290 _uploadTable->setCellWidget(iRow, iCol, passwd);
2291 }
2292 else if (iCol == 4) {
2293 QComboBox* system = new QComboBox();
2294 system->setEditable(false);
2295 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2296 system->setFrame(false);
2297 system->setCurrentIndex(system->findText(hlp[iCol]));
2298 _uploadTable->setCellWidget(iRow, iCol, system);
2299 }
2300 else if (iCol == 5) {
2301 QCheckBox* com = new QCheckBox();
2302 if (hlp[iCol].toInt() == Qt::Checked) {
2303 com->setCheckState(Qt::Checked);
2304 }
2305 _uploadTable->setCellWidget(iRow, iCol, com);
2306 }
2307 else if (iCol == 8) {
2308 bncTableItem* bncIt = new bncTableItem();
2309 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2310 _uploadTable->setItem(iRow, iCol, bncIt);
2311 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2312 }
2313 else {
2314 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2315 }
2316 }
2317 }
2318}
2319
2320//
2321////////////////////////////////////////////////////////////////////////////
2322void bncWindow::slotSetUploadTrafo() {
2323 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2324 dlg->exec();
2325 delete dlg;
2326}
2327
2328// Start Post-Processing PPP
2329////////////////////////////////////////////////////////////////////////////
2330void bncWindow::startPostProcessingPPP() {
2331#ifdef USE_POSTPROCESSING
2332 _runningPostProcessingPPP = true;
2333 _actStart->setText("0 Epochs");
2334
2335 slotSaveOptions();
2336
2337 t_postProcessing* postProcessing = new t_postProcessing(this);
2338 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessingPPP()));
2339 connect(postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2340
2341 postProcessing->start();
2342#else
2343 QMessageBox::information(this, "Information",
2344 "Post-Processing Not Permitted");
2345#endif
2346}
2347
2348// Post-Processing PPP Finished
2349////////////////////////////////////////////////////////////////////////////
2350void bncWindow::slotFinishedPostProcessingPPP() {
2351 _runningPostProcessingPPP = false;
2352 QMessageBox::information(this, "Information",
2353 "Post-Processing Thread Finished");
2354 _actStart->setText("Start");
2355 _actStart->setEnabled(true);
2356}
2357
2358// Progress Bar Change
2359////////////////////////////////////////////////////////////////////////////
2360void bncWindow::slotPostProgress(int nEpo) {
2361 if (_actStart) {
2362 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2363 }
2364}
2365
2366// Start Post-Processing Teqc
2367////////////////////////////////////////////////////////////////////////////
2368void bncWindow::startPostProcessingTeqc() {
2369 _runningPostProcessingTeqc = false; // TODO
2370 QMessageBox::information(this, "Information",
2371 "Teqc-Processing Not Yet Implemented");
2372}
2373
2374// Post-Processing Teqc Finished
2375////////////////////////////////////////////////////////////////////////////
2376void bncWindow::slotFinishedPostProcessingTeqc() {
2377 _runningPostProcessingTeqc = false;
2378 QMessageBox::information(this, "Information",
2379 "Teqc-Processing Thread Finished");
2380}
2381
2382// Edit teqc-like editing options
2383////////////////////////////////////////////////////////////////////////////
2384void bncWindow::slotTeqcEditOption() {
2385 teqcDlg* dlg = new teqcDlg(this);
2386 dlg->move(this->pos().x()+50, this->pos().y()+50);
2387 dlg->exec();
2388 delete dlg;
2389}
Note: See TracBrowser for help on using the repository browser.