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

Last change on this file since 9783 was 9783, checked in by stuerze, 2 years ago

some changes regarding PPP

File size: 168.9 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 <QAction>
44#include <QApplication>
45#include <QCheckBox>
46#include <QCloseEvent>
47#include <QComboBox>
48#include <QDialog>
49#include <QFontDialog>
50#include <QGridLayout>
51#include <QHeaderView>
52#include <QLabel>
53#include <QLineEdit>
54#include <QMenu>
55#include <QMenuBar>
56#include <QMessageBox>
57#include <QPushButton>
58#include <QRadioButton>
59#include <QSpinBox>
60#include <QTableWidgetItem>
61#include <QTextEdit>
62#include <QToolBar>
63
64#include <unistd.h>
65#include "bncwindow.h"
66#include "bnccore.h"
67#include "bncgetthread.h"
68#include "bnctabledlg.h"
69#include "bncipport.h"
70#include "bncudpport.h"
71#include "bncserialport.h"
72#include "bnchlpdlg.h"
73#include "bnchtml.h"
74#include "bnctableitem.h"
75#include "bncsettings.h"
76#include "bncfigure.h"
77#include "bncfigurelate.h"
78#include "bncfigureppp.h"
79#include "bncversion.h"
80#include "bncbytescounter.h"
81#include "bncsslconfig.h"
82#include "upload/bnccustomtrafo.h"
83#include "upload/bncephuploadcaster.h"
84#include "qtfilechooser.h"
85#include "reqcdlg.h"
86#include "bncmap.h"
87#include "rinex/reqcedit.h"
88#include "rinex/reqcanalyze.h"
89#include "orbComp/sp3Comp.h"
90#ifdef QT_WEBENGINE
91# include "map/bncmapwin.h"
92#endif
93
94using namespace std;
95
96#ifdef GNSSCENTER_PLUGIN
97Q_EXPORT_PLUGIN2(gnsscenter_bnc, t_bncFactory)
98#endif
99
100// Constructor
101////////////////////////////////////////////////////////////////////////////
102bncWindow::bncWindow() {
103
104 const static QPalette paletteWhite(QColor(255, 255, 255));
105 const static QPalette paletteGray(QColor(230, 230, 230));
106
107#ifdef GNSSCENTER_PLUGIN
108 BNC_CORE->setConfFileName("");
109#endif
110
111 _caster = 0;
112 _casterEph = 0;
113
114 _bncFigure = new bncFigure(this);
115 _bncFigureLate = new bncFigureLate(this);
116 _bncFigurePPP = new bncFigurePPP(this);
117
118 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
119 _bncFigurePPP, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
120
121 connect(BNC_CORE, SIGNAL(progressRnxPPP(int)), this, SLOT(slotPostProcessingProgress(int)));
122 connect(BNC_CORE, SIGNAL(finishedRnxPPP()), this, SLOT(slotPostProcessingFinished()));
123
124 _runningRealTime = false;
125 _runningPPP = false;
126 _runningEdit = false;
127 _runningQC = false;
128 _runningSp3Comp = false;
129 _reqcActionComboBox = 0; // necessary for enableStartStop()
130
131 _mapWin = 0;
132
133 int ww = QFontMetrics(this->font()).width('w');
134
135 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, country, lat, long, nmea, ntrip, bytes").split(",");
136
137 setMinimumSize(100*ww, 70*ww);
138
139 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
140
141 connect(BNC_CORE, SIGNAL(newMessage(QByteArray,bool)),
142 this, SLOT(slotWindowMessage(QByteArray,bool)));
143
144 // Create Actions
145 // --------------
146 _actHelp = new QAction(tr("&Help Contents"),this);
147 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
148
149 _actAbout = new QAction(tr("&About BNC"),this);
150 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
151
152 _actFlowchart = new QAction(tr("&Flow Chart"),this);
153 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
154
155 _actFontSel = new QAction(tr("Select &Font"),this);
156 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
157
158 _actSaveOpt = new QAction(tr("&Reread && Save Configuration"),this);
159 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
160
161 _actQuit = new QAction(tr("&Quit"),this);
162 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
163
164 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
165 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
166
167 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
168 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
169 _actDeleteMountPoints->setEnabled(false);
170
171 _actMapMountPoints = new QAction(tr("&Map"),this);
172 connect(_actMapMountPoints, SIGNAL(triggered()), SLOT(slotMapMountPoints()));
173
174 _actStart = new QAction(tr("Sta&rt"),this);
175 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
176
177 _actStop = new QAction(tr("Sto&p"),this);
178 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
179 connect(_actStop, SIGNAL(triggered()), SLOT(slotMapPPPClosed()));
180
181 _actwhatsthis= new QAction(tr("Help?=Shift+F1"),this);
182 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
183
184 CreateMenu();
185 AddToolbar();
186
187 bncSettings settings;
188
189 // Network Options
190 // ---------------
191 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
192 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
193
194 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
195 this, SLOT(slotBncTextChanged()));
196
197 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
198 _sslIgnoreErrorsCheckBox = new QCheckBox();
199 _sslIgnoreErrorsCheckBox->setCheckState(Qt::CheckState(
200 settings.value("sslIgnoreErrors").toInt()));
201
202 // General Options
203 // ---------------
204 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
205 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
206 _rnxAppendCheckBox = new QCheckBox();
207 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
208 settings.value("rnxAppend").toInt()));
209 _onTheFlyComboBox = new QComboBox();
210 _onTheFlyComboBox->setEditable(false);
211 _onTheFlyComboBox->addItems(QString("no,1 day,1 hour,5 min,1 min").split(","));
212 int go = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
213 if (go != -1) {
214 _onTheFlyComboBox->setCurrentIndex(go);
215 }
216 _autoStartCheckBox = new QCheckBox();
217 _autoStartCheckBox->setCheckState(Qt::CheckState(
218 settings.value("autoStart").toInt()));
219
220 // RINEX Observations Options
221 // --------------------------
222 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
223 _rnxIntrComboBox = new QComboBox();
224 _rnxIntrComboBox->setEditable(false);
225 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
226 int ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
227 if (ii != -1) {
228 _rnxIntrComboBox->setCurrentIndex(ii);
229 }
230 _rnxSamplComboBox = new QComboBox();
231 _rnxSamplComboBox->setEditable(false);
232 _rnxSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
233 int ij = _rnxSamplComboBox->findText(settings.value("rnxSampl").toString());
234 if (ij != -1) {
235 _rnxSamplComboBox->setCurrentIndex(ij);
236 }
237 _rnxFileCheckBox = new QCheckBox();
238 _rnxFileCheckBox->setCheckState(Qt::CheckState(settings.value("rnxOnlyWithSKL").toInt()));
239 _rnxSkelExtComboBox = new QComboBox();
240 _rnxSkelExtComboBox->setEditable(false);
241 _rnxSkelExtComboBox->addItems(QString("skl, SKL").split(","));
242 int ik = _rnxSkelExtComboBox->findText(settings.value("rnxSkel").toString());
243 if (ik != -1) {
244 _rnxSkelExtComboBox->setCurrentIndex(ik);
245 }
246 _rnxSkelPathLineEdit = new QLineEdit(settings.value("rnxSkelPath").toString());
247 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
248 _rnxVersComboBox = new QComboBox();
249 _rnxVersComboBox->setEditable(false);
250 _rnxVersComboBox->addItems(QString("4,3,2").split(","));
251 _rnxVersComboBox->setMaximumWidth(7*ww);
252 int il = _rnxVersComboBox->findText(settings.value("rnxVersion").toString());
253 if (il != -1) {
254 _rnxVersComboBox->setCurrentIndex(il);
255 }
256 QString hlp = settings.value("rnxV2Priority").toString();
257 if (hlp.isEmpty()) {
258 hlp = "G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:128&DPX C:7&DPZ I:ABCX S:1&C S:5&IQX";
259 }
260 _rnxV2Priority = new QLineEdit(hlp);
261
262 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(slotBncTextChanged()));
263 connect(_rnxSkelPathLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(slotBncTextChanged()));
264 connect(_rnxVersComboBox, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slotBncTextChanged()));
265
266 // RINEX Ephemeris Options
267 // -----------------------
268 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
269 _ephIntrComboBox = new QComboBox();
270 _ephIntrComboBox->setEditable(false);
271 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
272 int ji = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
273 if (ji != -1) {
274 _ephIntrComboBox->setCurrentIndex(ji);
275 }
276 _ephOutPortLineEdit = new QLineEdit(settings.value("ephOutPort").toString());
277 _ephVersComboBox = new QComboBox();
278 _ephVersComboBox->setEditable(false);
279 _ephVersComboBox->addItems(QString("4,3,2").split(","));
280 _ephVersComboBox->setMaximumWidth(7*ww);
281 int jk = _ephVersComboBox->findText(settings.value("ephVersion").toString());
282 if (jk != -1) {
283 _ephVersComboBox->setCurrentIndex(jk);
284 }
285
286 connect(_ephOutPortLineEdit, SIGNAL(textChanged(const QString &)),
287 this, SLOT(slotBncTextChanged()));
288
289 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
290 this, SLOT(slotBncTextChanged()));
291
292 // Broadcast Corrections Options
293 // -----------------------------
294 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
295 _corrIntrComboBox = new QComboBox();
296 _corrIntrComboBox->setEditable(false);
297 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
298 int bi = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
299 if (bi != -1) {
300 _corrIntrComboBox->setCurrentIndex(bi);
301 }
302 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
303
304 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
305 this, SLOT(slotBncTextChanged()));
306
307 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
308 this, SLOT(slotBncTextChanged()));
309
310 // Feed Engine Options
311 // -------------------
312 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
313 _outWaitSpinBox = new QSpinBox();
314 _outWaitSpinBox->setMinimum(0);
315 _outWaitSpinBox->setMaximum(30);
316 _outWaitSpinBox->setSingleStep(1);
317 _outWaitSpinBox->setSuffix(" sec");
318 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
319 _outSamplComboBox = new QComboBox();
320 _outSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
321 int nn = _outSamplComboBox->findText(settings.value("outSampl").toString());
322 if (nn != -1) {
323 _outSamplComboBox->setCurrentIndex(nn);
324 }
325 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
326 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
327 _outLockTimeCheckBox = new QCheckBox();
328 _outLockTimeCheckBox->setCheckState(Qt::CheckState(settings.value("outLockTime").toInt()));
329
330 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
331 this, SLOT(slotBncTextChanged()));
332
333 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
334 this, SLOT(slotBncTextChanged()));
335
336 connect(_outLockTimeCheckBox, SIGNAL(stateChanged(int)),
337 this, SLOT(slotBncTextChanged()));
338
339 // Serial Output Options
340 // ---------------------
341 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
342 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
343 _serialBaudRateComboBox = new QComboBox();
344 _serialBaudRateComboBox->addItems(QString("110,300,600,"
345 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
346 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
347 if (kk != -1) {
348 _serialBaudRateComboBox->setCurrentIndex(kk);
349 }
350 _serialFlowControlComboBox = new QComboBox();
351 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
352 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
353 if (kk != -1) {
354 _serialFlowControlComboBox->setCurrentIndex(kk);
355 }
356 _serialDataBitsComboBox = new QComboBox();
357 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
358 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
359 if (kk != -1) {
360 _serialDataBitsComboBox->setCurrentIndex(kk);
361 }
362 _serialParityComboBox = new QComboBox();
363 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
364 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
365 if (kk != -1) {
366 _serialParityComboBox->setCurrentIndex(kk);
367 }
368 _serialStopBitsComboBox = new QComboBox();
369 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
370 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
371 if (kk != -1) {
372 _serialStopBitsComboBox->setCurrentIndex(kk);
373 }
374 _serialAutoNMEAComboBox = new QComboBox();
375 _serialAutoNMEAComboBox->addItems(QString("no,Auto,Manual GPGGA,Manual GNGGA").split(","));
376 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
377 if (kk != -1) {
378 _serialAutoNMEAComboBox->setCurrentIndex(kk);
379 }
380 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
381 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
382
383 _serialManualNMEASamplingSpinBox = new QSpinBox();
384 _serialManualNMEASamplingSpinBox->setMinimum(0);
385 _serialManualNMEASamplingSpinBox->setMaximum(300);
386 _serialManualNMEASamplingSpinBox->setSingleStep(10);
387 _serialManualNMEASamplingSpinBox->setValue(settings.value("serialManualNMEASampling").toInt());
388 _serialManualNMEASamplingSpinBox->setSuffix(" sec");
389
390 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
391 this, SLOT(slotBncTextChanged()));
392
393 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
394 this, SLOT(slotBncTextChanged()));
395
396 // Outages Options
397 // ---------------
398 _adviseObsRateComboBox = new QComboBox();
399 _adviseObsRateComboBox->setEditable(false);
400 _adviseObsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
401 kk = _adviseObsRateComboBox->findText(settings.value("adviseObsRate").toString());
402 if (kk != -1) {
403 _adviseObsRateComboBox->setCurrentIndex(kk);
404 }
405 _adviseFailSpinBox = new QSpinBox();
406 _adviseFailSpinBox->setMinimum(0);
407 _adviseFailSpinBox->setMaximum(60);
408 _adviseFailSpinBox->setSingleStep(1);
409 _adviseFailSpinBox->setSuffix(" min");
410 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
411 _adviseRecoSpinBox = new QSpinBox();
412 _adviseRecoSpinBox->setMinimum(0);
413 _adviseRecoSpinBox->setMaximum(60);
414 _adviseRecoSpinBox->setSingleStep(1);
415 _adviseRecoSpinBox->setSuffix(" min");
416 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
417 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
418
419 connect(_adviseObsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
420 this, SLOT(slotBncTextChanged()));
421
422 // Miscellaneous Options
423 // ---------------------
424 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
425 _miscPortLineEdit = new QLineEdit(settings.value("miscPort").toString());
426 _miscIntrComboBox = new QComboBox();
427 _miscIntrComboBox->setEditable(false);
428 _miscIntrComboBox->addItems(QString(",2 sec,10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
429 int ll = _miscIntrComboBox->findText(settings.value("miscIntr").toString());
430 if (ll != -1) {
431 _miscIntrComboBox->setCurrentIndex(ll);
432 }
433 _miscScanRTCMCheckBox = new QCheckBox();
434 _miscScanRTCMCheckBox->setCheckState(Qt::CheckState(
435 settings.value("miscScanRTCM").toInt()));
436
437 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
438 this, SLOT(slotBncTextChanged()));
439
440 // Streams
441 // -------
442 _mountPointsTable = new QTableWidget(0,9);
443
444 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
445 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
446 _mountPointsTable->horizontalHeader()->resizeSection(3,9*ww);
447 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
448 _mountPointsTable->horizontalHeader()->resizeSection(5,7*ww);
449 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
450 _mountPointsTable->horizontalHeader()->resizeSection(7,5*ww);
451#if QT_VERSION < 0x050000
452 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
453#else
454 _mountPointsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
455#endif
456 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
457 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
458 _mountPointsTable->setHorizontalHeaderLabels(labels);
459 _mountPointsTable->setGridStyle(Qt::NoPen);
460 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
461 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
462 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
463 _mountPointsTable->hideColumn(0);
464 _mountPointsTable->hideColumn(3);
465 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
466 SLOT(slotSelectionChanged()));
467 populateMountPointsTable();
468
469 _log = new QTextEdit();
470 _log->setReadOnly(true);
471 QFont msFont(""); msFont.setStyleHint(QFont::TypeWriter); // default monospace font
472 _log->setFont(msFont);
473 _log->document()->setMaximumBlockCount(1000);
474
475 // Combine Corrections
476 // -------------------
477 _cmbTable = new QTableWidget(0,3);
478 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
479 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
480 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
481 _cmbTable->setMaximumWidth(30*ww);
482 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
483 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
484 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
485#if QT_VERSION < 0x050000
486 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
487#else
488 _cmbTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
489#endif
490 _cmbTable->horizontalHeader()->setStretchLastSection(true);
491 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
492
493 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
494
495 _cmbSamplSpinBox = new QSpinBox;
496 _cmbSamplSpinBox->setMinimum(0);
497 _cmbSamplSpinBox->setMaximum(60);
498 _cmbSamplSpinBox->setSingleStep(10);
499 _cmbSamplSpinBox->setMaximumWidth(9*ww);
500 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
501 _cmbSamplSpinBox->setSuffix(" sec");
502
503 QPushButton* addCmbRowButton = new QPushButton("Add Row");
504 QPushButton* delCmbRowButton = new QPushButton("Delete");
505
506 connect(_cmbTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
507
508 _cmbMethodComboBox = new QComboBox();
509 _cmbMethodComboBox->setEditable(false);
510 _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
511 int cm = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
512 if (cm != -1) {
513 _cmbMethodComboBox->setCurrentIndex(cm);
514 }
515
516 int iRow = _cmbTable->rowCount();
517 if (iRow > 0) {
518 enableWidget(true, _cmbMethodComboBox);
519 enableWidget(true, _cmbMaxresLineEdit);
520 enableWidget(true, _cmbSamplSpinBox);
521 }
522 else {
523 enableWidget(false, _cmbMethodComboBox);
524 enableWidget(false, _cmbMaxresLineEdit);
525 enableWidget(false, _cmbSamplSpinBox);
526 }
527 _cmbGpsCheckBox = new QCheckBox();
528 _cmbGpsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGps").toInt()));
529 _cmbGloCheckBox = new QCheckBox();
530 _cmbGloCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGlo").toInt()));
531 _cmbGalCheckBox = new QCheckBox();
532 _cmbGalCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGal").toInt()));
533 _cmbBdsCheckBox = new QCheckBox();
534 _cmbBdsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbBds").toInt()));
535 _cmbQzssCheckBox = new QCheckBox();
536 _cmbQzssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbQzss").toInt()));
537 _cmbSbasCheckBox = new QCheckBox();
538 _cmbSbasCheckBox->setCheckState(Qt::CheckState(settings.value("cmbSbas").toInt()));
539 _cmbIrnssCheckBox = new QCheckBox();
540 _cmbIrnssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbIrnss").toInt()));
541
542 connect(_cmbGpsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
543 connect(_cmbGloCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
544 connect(_cmbGalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
545 connect(_cmbBdsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
546 connect(_cmbQzssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
547 connect(_cmbSbasCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
548 connect(_cmbIrnssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
549
550 _cmbBsxFile = new qtFileChooser(0, qtFileChooser::File);
551 _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
552
553 // Upload Results
554 // -------------
555 _uploadTable = new QTableWidget(0,16);
556 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, bytes").split(","));
557 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
558 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
559 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
560 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
561 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
562 _uploadTable->horizontalHeader()->resizeSection( 3, 6*ww);
563 _uploadTable->horizontalHeader()->resizeSection( 4, 8*ww);
564 _uploadTable->horizontalHeader()->resizeSection( 5, 8*ww);
565 _uploadTable->horizontalHeader()->resizeSection( 6,11*ww);
566 _uploadTable->horizontalHeader()->resizeSection( 7,11*ww);
567 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
568 _uploadTable->horizontalHeader()->resizeSection( 9,15*ww);
569 _uploadTable->horizontalHeader()->resizeSection(10,15*ww);
570 _uploadTable->horizontalHeader()->resizeSection(11,15*ww);
571 _uploadTable->horizontalHeader()->resizeSection(12, 4*ww);
572 _uploadTable->horizontalHeader()->resizeSection(13, 4*ww);
573 _uploadTable->horizontalHeader()->resizeSection(14, 4*ww);
574 _uploadTable->horizontalHeader()->resizeSection(15,12*ww);
575#if QT_VERSION < 0x050000
576 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
577#else
578 _uploadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
579#endif
580 _uploadTable->horizontalHeader()->setStretchLastSection(true);
581 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
582
583 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
584 SLOT(slotBncTextChanged()));
585
586 QPushButton* addUploadRowButton = new QPushButton("Add Row");
587 QPushButton* delUploadRowButton = new QPushButton("Del Row");
588 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
589 _uploadIntrComboBox = new QComboBox;
590 _uploadIntrComboBox->setEditable(false);
591 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
592 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
593 if (ii != -1) {
594 _uploadIntrComboBox->setCurrentIndex(ii);
595 }
596
597 _uploadAntexFile = new qtFileChooser(0, qtFileChooser::File);
598 _uploadAntexFile->setFileName(settings.value("uploadAntexFile").toString());
599
600 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
601 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
602 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
603 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
604 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
605 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
606 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
607
608 _uploadSamplSp3SpinBox = new QSpinBox;
609 _uploadSamplSp3SpinBox->setMinimum(0);
610 _uploadSamplSp3SpinBox->setMaximum(15);
611 _uploadSamplSp3SpinBox->setSingleStep(1);
612 _uploadSamplSp3SpinBox->setMaximumWidth(9*ww);
613 _uploadSamplSp3SpinBox->setValue(settings.value("uploadSamplSp3").toInt());
614 _uploadSamplSp3SpinBox->setSuffix(" min");
615
616 _uploadSamplClkRnxSpinBox = new QSpinBox;
617 _uploadSamplClkRnxSpinBox->setMinimum(0);
618 _uploadSamplClkRnxSpinBox->setMaximum(60);
619 _uploadSamplClkRnxSpinBox->setSingleStep(5);
620 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
621 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
622 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
623
624 _uploadSamplBiaSnxSpinBox = new QSpinBox;
625 _uploadSamplBiaSnxSpinBox->setMinimum(0);
626 _uploadSamplBiaSnxSpinBox->setMaximum(60);
627 _uploadSamplBiaSnxSpinBox->setSingleStep(5);
628 _uploadSamplBiaSnxSpinBox->setMaximumWidth(9*ww);
629 _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
630 _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
631
632 int iRowT = _uploadTable->rowCount();
633 if (iRowT > 0) {
634 enableWidget(true, _uploadIntrComboBox);
635 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
636 enableWidget(true, _uploadSamplSp3SpinBox);
637 enableWidget(true, _uploadSamplClkRnxSpinBox);
638 enableWidget(true, _uploadSamplBiaSnxSpinBox);
639 enableWidget(true, _uploadAntexFile);
640 }
641 else {
642 enableWidget(false, _uploadIntrComboBox);
643 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
644 enableWidget(false, _uploadSamplSp3SpinBox);
645 enableWidget(false, _uploadSamplClkRnxSpinBox);
646 enableWidget(true, _uploadSamplBiaSnxSpinBox);
647 enableWidget(false, _uploadAntexFile);
648 }
649
650 // Upload RTCM3 Ephemeris
651 // ----------------------
652 _uploadEphTable = new QTableWidget(0,6);
653 _uploadEphTable->setColumnCount(8);
654 _uploadEphTable->setRowCount(0);
655 _uploadEphTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Ntrip, User, Password, System, bytes").split(","));
656 _uploadEphTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
657 _uploadEphTable->setSelectionBehavior(QAbstractItemView::SelectRows);
658 _uploadEphTable->horizontalHeader()->resizeSection( 0,13*ww);
659 _uploadEphTable->horizontalHeader()->resizeSection( 1, 5*ww);
660 _uploadEphTable->horizontalHeader()->resizeSection( 2, 8*ww);
661 _uploadEphTable->horizontalHeader()->resizeSection( 3, 6*ww);
662 _uploadEphTable->horizontalHeader()->resizeSection( 4, 8*ww);
663 _uploadEphTable->horizontalHeader()->resizeSection( 3, 8*ww);
664 _uploadEphTable->horizontalHeader()->resizeSection( 5,10*ww);
665 _uploadEphTable->horizontalHeader()->resizeSection( 6,12*ww);
666#if QT_VERSION < 0x050000
667 _uploadEphTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
668#else
669 _uploadEphTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
670#endif
671 _uploadEphTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
672
673 connect(_uploadEphTable, SIGNAL(itemSelectionChanged()),
674 SLOT(slotBncTextChanged()));
675
676 QPushButton* addUploadEphRowButton = new QPushButton("Add Row");
677 addUploadEphRowButton->setMaximumWidth(9*ww);
678 QPushButton* delUploadEphRowButton = new QPushButton("Del Row");
679 delUploadEphRowButton->setMaximumWidth(9*ww);
680
681 _uploadSamplRtcmEphSpinBox = new QSpinBox;
682 _uploadSamplRtcmEphSpinBox->setMinimum(0);
683 _uploadSamplRtcmEphSpinBox->setMaximum(60);
684 _uploadSamplRtcmEphSpinBox->setSingleStep(5);
685 _uploadSamplRtcmEphSpinBox->setMaximumWidth(9*ww);
686 _uploadSamplRtcmEphSpinBox->setValue(settings.value("uploadSamplRtcmEph").toInt());
687 _uploadSamplRtcmEphSpinBox->setSuffix(" sec");
688
689 iRowT = _uploadEphTable->rowCount();
690 if (iRowT > 0) {
691 enableWidget(true, _uploadSamplRtcmEphSpinBox);
692 }
693 else {
694 enableWidget(false, _uploadSamplRtcmEphSpinBox);
695 }
696
697 // Canvas with Editable Fields
698 // ---------------------------
699 _canvas = new QWidget;
700 setCentralWidget(_canvas);
701
702 _aogroup = new QTabWidget();
703 _aogroup->setElideMode(Qt::ElideNone);
704 _aogroup->setUsesScrollButtons(true);
705 QWidget* pgroup = new QWidget();
706 QWidget* ggroup = new QWidget();
707 QWidget* sgroup = new QWidget();
708 QWidget* egroup = new QWidget();
709 QWidget* agroup = new QWidget();
710 QWidget* cgroup = new QWidget();
711 QWidget* ogroup = new QWidget();
712 QWidget* rgroup = new QWidget();
713 QWidget* sergroup = new QWidget();
714 QWidget* pppGroup1 = new QWidget();
715 QWidget* pppGroup2 = new QWidget();
716 QWidget* pppGroup3 = new QWidget();
717 QWidget* pppGroup4 = new QWidget();
718 QWidget* reqcgroup = new QWidget();
719 QWidget* sp3CompGroup = new QWidget();
720 QWidget* cmbgroup = new QWidget();
721 QWidget* uploadgroup = new QWidget();
722 QWidget* uploadEphgroup = new QWidget();
723 _aogroup->addTab(pgroup,tr("Network"));
724 _aogroup->addTab(ggroup,tr("General"));
725 _aogroup->addTab(ogroup,tr("RINEX Observations"));
726 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
727 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
728 _aogroup->addTab(sp3CompGroup,tr("SP3 Comparison"));
729 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
730 _aogroup->addTab(sgroup,tr("Feed Engine"));
731 _aogroup->addTab(sergroup,tr("Serial Output"));
732 _aogroup->addTab(agroup,tr("Outages"));
733 _aogroup->addTab(rgroup,tr("Miscellaneous"));
734 _aogroup->addTab(pppGroup1,tr("PPP (1)"));
735 _aogroup->addTab(pppGroup2,tr("PPP (2)"));
736 _aogroup->addTab(pppGroup3,tr("PPP (3)"));
737 _aogroup->addTab(pppGroup4,tr("PPP (4)"));
738 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
739 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
740 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
741
742 // Log Tab
743 // -------
744 _loggroup = new QTabWidget();
745 _loggroup->addTab(_log,tr("Log"));
746 _loggroup->addTab(_bncFigure,tr("Throughput"));
747 _loggroup->addTab(_bncFigureLate,tr("Latency"));
748 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
749
750 // Netowork (Proxy and SSL) Tab
751 // ----------------------------
752 QGridLayout* pLayout = new QGridLayout;
753 pLayout->setColumnMinimumWidth(0,13*ww);
754 _proxyPortLineEdit->setMaximumWidth(9*ww);
755
756 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none.<br>"),0, 0, 1, 50);
757 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
758 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
759 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
760 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
761 pLayout->addWidget(new QLabel("Path to SSL certificates"), 3, 0);
762 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
763 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
764 pLayout->addWidget(new QLabel("Ignore SSL authorization errors"), 4, 0);
765 pLayout->addWidget(_sslIgnoreErrorsCheckBox, 4, 1, 1,10);
766 pLayout->addWidget(new QLabel(""), 5, 1);
767 pLayout->setRowStretch(6, 999);
768
769 pgroup->setLayout(pLayout);
770
771 // General Tab
772 // -----------
773 QGridLayout* gLayout = new QGridLayout;
774 gLayout->setColumnMinimumWidth(0,14*ww);
775 _onTheFlyComboBox->setMaximumWidth(9*ww);
776
777 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, auto-start, and raw file output.<br>"),0, 0, 1, 50);
778 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
779 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,20);
780 gLayout->addWidget(new QLabel("Append files"), 2, 0);
781 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
782 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
783 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
784 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
785 gLayout->addWidget(_autoStartCheckBox, 4, 1);
786 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
787 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,20);
788 gLayout->addWidget(new QLabel(""), 6, 1);
789 gLayout->setRowStretch(7, 999);
790
791 ggroup->setLayout(gLayout);
792
793 // RINEX Observations
794 // ------------------
795 QGridLayout* oLayout = new QGridLayout;
796 oLayout->setColumnMinimumWidth(0,14*ww);
797 _rnxIntrComboBox->setMaximumWidth(9*ww);
798 _rnxSamplComboBox->setMaximumWidth(9*ww);
799 _rnxSkelExtComboBox->setMaximumWidth(9*ww);
800
801 oLayout->addWidget(new QLabel("Saving RINEX observation files.<br>"),0, 0, 1,50);
802 oLayout->addWidget(new QLabel("Directory"), 1, 0);
803 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1, 15);
804 oLayout->addWidget(new QLabel("Interval"), 2, 0);
805 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
806 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
807 oLayout->addWidget(_rnxSamplComboBox, 2, 3, Qt::AlignRight);
808 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
809 oLayout->addWidget(_rnxSkelExtComboBox, 3, 1, Qt::AlignLeft);
810 oLayout->addWidget(new QLabel("Skeleton mandatory"), 3, 2, Qt::AlignRight);
811 oLayout->addWidget(_rnxFileCheckBox, 3, 3);
812 oLayout->addWidget(new QLabel("Skeleton Directory"), 4, 0);
813 oLayout->addWidget(_rnxSkelPathLineEdit, 4, 1, 1, 15);
814 oLayout->addWidget(new QLabel("Script (full path)"), 5, 0);
815 oLayout->addWidget(_rnxScrpLineEdit, 5, 1, 1, 15);
816 oLayout->addWidget(new QLabel("Version"), 6, 0);
817 oLayout->addWidget(_rnxVersComboBox, 6, 1);
818 oLayout->addWidget(new QLabel("Signal priority"), 6, 2, Qt::AlignRight);
819 oLayout->addWidget(_rnxV2Priority, 6, 3, 1, 13);
820 oLayout->addWidget(new QLabel(""), 7, 1);
821 oLayout->setRowStretch(8, 999);
822
823 ogroup->setLayout(oLayout);
824
825 // RINEX Ephemeris
826 // ---------------
827 QGridLayout* eLayout = new QGridLayout;
828 eLayout->setColumnMinimumWidth(0,14*ww);
829 _ephIntrComboBox->setMaximumWidth(9*ww);
830 _ephOutPortLineEdit->setMaximumWidth(9*ww);
831
832 eLayout->addWidget(new QLabel("Saving RINEX navigation files and ephemeris output through IP port.<br>"),0,0,1,70);
833 eLayout->addWidget(new QLabel("Directory"), 1, 0);
834 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
835 eLayout->addWidget(new QLabel("Interval"), 2, 0);
836 eLayout->addWidget(_ephIntrComboBox, 2, 1);
837 eLayout->addWidget(new QLabel("Port"), 3, 0);
838 eLayout->addWidget(_ephOutPortLineEdit, 3, 1);
839 eLayout->addWidget(new QLabel("Version"), 4, 0);
840 eLayout->addWidget(_ephVersComboBox, 4, 1);
841 eLayout->setRowStretch(5, 999);
842
843 egroup->setLayout(eLayout);
844
845
846 // Broadcast Corrections
847 // ---------------------
848 QGridLayout* cLayout = new QGridLayout;
849 cLayout->setColumnMinimumWidth(0,14*ww);
850 _corrIntrComboBox->setMaximumWidth(9*ww);
851 _corrPortLineEdit->setMaximumWidth(9*ww);
852
853 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port.<br>"),0,0,1,70);
854 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
855 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,30);
856 cLayout->addWidget(new QLabel("Interval"), 2, 0);
857 cLayout->addWidget(_corrIntrComboBox, 2, 1);
858 cLayout->addWidget(new QLabel("Port"), 3, 0);
859 cLayout->addWidget(_corrPortLineEdit, 3, 1);
860 cLayout->addWidget(new QLabel(""), 4, 1);
861 cLayout->setRowStretch(7, 999);
862 cgroup->setLayout(cLayout);
863
864 // Feed Engine
865 // -----------
866 QGridLayout* sLayout = new QGridLayout;
867 sLayout->setColumnMinimumWidth(0,14*ww);
868 _outPortLineEdit->setMaximumWidth(9*ww);
869 _outWaitSpinBox->setMaximumWidth(9*ww);
870 _outSamplComboBox->setMaximumWidth(9*ww);
871 _outUPortLineEdit->setMaximumWidth(9*ww);
872
873 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine.<br>"),0,0,1,50);
874 sLayout->addWidget(new QLabel("Port"), 1, 0);
875 sLayout->addWidget(_outPortLineEdit, 1, 1);
876 sLayout->addWidget(new QLabel(" Wait for full obs epoch"), 1, 2, Qt::AlignRight);
877 sLayout->addWidget(_outWaitSpinBox, 1, 3, Qt::AlignLeft);
878 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
879 sLayout->addWidget(_outSamplComboBox, 2, 1, Qt::AlignLeft);
880 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
881 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 10);
882 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
883 sLayout->addWidget(_outUPortLineEdit, 4, 1);
884 sLayout->addWidget(new QLabel("Print lock time"), 5, 0);
885 sLayout->addWidget(_outLockTimeCheckBox, 5, 1);
886 sLayout->addWidget(new QLabel(""), 6, 1);
887 sLayout->setRowStretch(7, 999);
888
889 sgroup->setLayout(sLayout);
890
891 // Serial Output
892 // -------------
893 QGridLayout* serLayout = new QGridLayout;
894 serLayout->setColumnMinimumWidth(0,12*ww);
895 _serialBaudRateComboBox->setMaximumWidth(9*ww);
896 _serialFlowControlComboBox->setMaximumWidth(11*ww);
897 _serialDataBitsComboBox->setMaximumWidth(5*ww);
898 _serialParityComboBox->setMaximumWidth(9*ww);
899 _serialStopBitsComboBox->setMaximumWidth(5*ww);
900 _serialAutoNMEAComboBox->setMaximumWidth(14*ww);
901 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
902 _serialManualNMEASamplingSpinBox->setMaximumWidth(8*ww);
903
904 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver.<br>"),0,0,1,30);
905 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
906 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
907 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
908 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
909 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
910 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
911 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
912 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
913 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
914 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
915 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
916 serLayout->addWidget(_serialParityComboBox, 4, 3);
917 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
918 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
919 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
920 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
921 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
922 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,10);
923 serLayout->addWidget(new QLabel("Height"), 5,14, Qt::AlignRight);
924 serLayout->addWidget(_serialHeightNMEALineEdit, 5,15, 1,11);
925 serLayout->addWidget(new QLabel("Sampling"), 5,25, Qt::AlignRight);
926 serLayout->addWidget(_serialManualNMEASamplingSpinBox, 5,26, 1,12);
927 serLayout->addWidget(new QLabel(""), 6, 1);
928 serLayout->setRowStretch(7, 999);
929
930 sergroup->setLayout(serLayout);
931
932 // Outages
933 // -------
934 QGridLayout* aLayout = new QGridLayout;
935 aLayout->setColumnMinimumWidth(0,14*ww);
936 _adviseObsRateComboBox->setMaximumWidth(9*ww);
937 _adviseFailSpinBox->setMaximumWidth(9*ww);
938 _adviseRecoSpinBox->setMaximumWidth(9*ww);
939
940 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes.<br>"),0,0,1,50,Qt::AlignLeft);
941 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
942 aLayout->addWidget(_adviseObsRateComboBox, 1, 1);
943 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
944 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
945 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
946 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
947 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
948 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,20);
949 aLayout->addWidget(new QLabel(""), 5, 1);
950 aLayout->setRowStretch(6, 999);
951
952 agroup->setLayout(aLayout);
953
954 // Miscellaneous
955 // -------------
956 QGridLayout* rLayout = new QGridLayout;
957 rLayout->setColumnMinimumWidth(0,14*ww);
958 _miscIntrComboBox->setMaximumWidth(9*ww);
959 _miscPortLineEdit->setMaximumWidth(9*ww);
960
961 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for message types and antenna information or output raw data through TCP/IP port.<br>"),0, 0,1,50);
962 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
963 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1, 7);
964 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
965 rLayout->addWidget(_miscIntrComboBox, 2, 1);
966 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
967 rLayout->addWidget(_miscScanRTCMCheckBox, 3, 1);
968 rLayout->addWidget(new QLabel("Port"), 4, 0);
969 rLayout->addWidget(_miscPortLineEdit, 4, 1);
970 rLayout->addWidget(new QLabel(""), 5, 1);
971 rLayout->setRowStretch(6, 999);
972
973 rgroup->setLayout(rLayout);
974
975 // PPP
976 // ---
977 _pppWidgets._dataSource->setMaximumWidth(15*ww);
978 _pppWidgets._corrMount->setMaximumWidth(15*ww);
979 _pppWidgets._nmeaPath->setMaximumWidth(35*ww);
980 _pppWidgets._logPath->setMaximumWidth(35*ww);
981 _pppWidgets._snxtroPath->setMaximumWidth(35*ww);
982 _pppWidgets._snxtroIntr->setMaximumWidth(10*ww);
983 _pppWidgets._snxtroAc ->setMaximumWidth(10*ww);
984 _pppWidgets._snxtroSol ->setMaximumWidth(7*ww);
985 _pppWidgets._ionoMount->setMaximumWidth(15*ww);
986
987
988 QGridLayout* pppLayout1 = new QGridLayout();
989 int ir = 0;
990 pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
991 ++ir;
992 pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
993 pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
994 pppLayout1->addWidget(new QLabel(" Logfile directory"), ir, 4);
995 pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
996 ++ir;
997 pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
998 pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
999 pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
1000 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
1001 pppLayout1->addWidget(new QLabel(" NMEA directory"), ir, 4);
1002 pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
1003 ++ir;
1004#ifdef USE_PPP
1005 pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
1006 pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
1007 pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
1008 pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
1009#endif
1010 pppLayout1->addWidget(new QLabel(" SNX TRO directory"), ir, 4);
1011 pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
1012 ++ir;
1013 pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
1014 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
1015 pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
1016 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
1017 pppLayout1->addWidget(new QLabel(" SNX TRO interval"), ir, 4);
1018 pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
1019 pppLayout1->addWidget(new QLabel(" SNX TRO sampling"), ir, 6);
1020 pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
1021 ++ir;
1022 pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 0);
1023 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1);
1024 pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 2);
1025 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 3);
1026 pppLayout1->addWidget(new QLabel(" SNX TRO AC"), ir, 4);
1027 pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
1028 pppLayout1->addWidget(new QLabel(" SNX TRO solution"), ir, 6);
1029 pppLayout1->addWidget(_pppWidgets._snxtroSol, ir, 7, Qt::AlignRight);
1030 ++ir;
1031#ifdef USE_PPP
1032 pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
1033 pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
1034#endif
1035 pppLayout1->setRowStretch(ir+1, 999);
1036 pppGroup1->setLayout(pppLayout1);
1037
1038 QVBoxLayout* pppLayout2 = new QVBoxLayout();
1039 pppLayout2->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
1040 pppLayout2->addWidget(_pppWidgets._staTable, 99);
1041 QHBoxLayout* pppLayout2sub = new QHBoxLayout();
1042 pppLayout2sub->addWidget(_pppWidgets._addStaButton);
1043 pppLayout2sub->addWidget(_pppWidgets._delStaButton);
1044 pppLayout2sub->addStretch(99);
1045
1046 pppLayout2->addLayout(pppLayout2sub);
1047
1048 pppGroup2->setLayout(pppLayout2);
1049
1050 QGridLayout* pppLayout3 = new QGridLayout();
1051 ir = 0;
1052 pppLayout3->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
1053 ++ir;
1054 pppLayout3->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
1055 pppLayout3->addWidget(_pppWidgets._lcGPS, ir, 1);
1056 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1057 pppLayout3->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
1058 pppLayout3->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8*ww);
1059 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1060 pppLayout3->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
1061 pppLayout3->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8*ww);
1062 ++ir;
1063 pppLayout3->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
1064 pppLayout3->addWidget(_pppWidgets._lcGLONASS, ir, 1);
1065 pppLayout3->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
1066 pppLayout3->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8*ww);
1067 pppLayout3->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
1068 pppLayout3->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8*ww);
1069 ++ir;
1070 pppLayout3->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
1071 pppLayout3->addWidget(_pppWidgets._lcGalileo, ir, 1);
1072 pppLayout3->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
1073 pppLayout3->addWidget(_pppWidgets._eleWgtCode, ir, 4);
1074 pppLayout3->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
1075 pppLayout3->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
1076 ++ir;
1077 pppLayout3->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
1078 pppLayout3->addWidget(_pppWidgets._lcBDS, ir, 1);
1079 pppLayout3->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
1080 pppLayout3->addWidget(_pppWidgets._minObs, ir, 4);
1081 pppLayout3->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
1082 pppLayout3->addWidget(_pppWidgets._minEle, ir, 7);_pppWidgets._minEle->setMaximumWidth(8*ww);
1083 ++ir;
1084 pppLayout3->addWidget(new QLabel("Model Obs"), ir, 0, Qt::AlignLeft);
1085 pppLayout3->addWidget(_pppWidgets._modelObs, ir, 1);
1086 pppLayout3->addWidget(new QLabel("Wait for clock corr."), ir, 3, Qt::AlignLeft);
1087 pppLayout3->addWidget(_pppWidgets._corrWaitTime, ir, 4);
1088 pppLayout3->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
1089 pppLayout3->addWidget(_pppWidgets._seedingTime, ir, 7);_pppWidgets._seedingTime->setMaximumWidth(8*ww);
1090 ++ir;
1091 pppLayout3->addWidget(new QLabel("Pseudo Obs"), ir, 0, Qt::AlignLeft);
1092 pppLayout3->addWidget(_pppWidgets._pseudoObs, ir, 1);
1093 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 2);
1094 pppLayout3->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
1095 pppLayout3->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8*ww);
1096 pppLayout3->addItem(new QSpacerItem(8*ww, 0), ir, 5);
1097 pppLayout3->addWidget(new QLabel("Max Res GIM"), ir, 6, Qt::AlignLeft);
1098 pppLayout3->addWidget(_pppWidgets._maxResGIM, ir, 7); _pppWidgets._maxResGIM->setMaximumWidth(8*ww);
1099 ++ir;
1100 pppLayout3->addWidget(new QLabel(""), ir, 8);
1101 pppLayout3->setColumnStretch(8, 999);
1102 ++ir;
1103 pppLayout3->addWidget(new QLabel(""), ir, 1);
1104 pppLayout3->setRowStretch(ir, 999);
1105
1106 pppGroup3->setLayout(pppLayout3);
1107
1108 // ------------------------
1109 connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
1110 _pppWidgets._mapSpeedSlider->setMinimumWidth(33*ww);
1111 _pppWidgets._audioResponse->setMaximumWidth(8*ww);
1112
1113 QGridLayout* pppLayout4 = new QGridLayout();
1114 ir = 0;
1115 pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
1116 ++ir;
1117 pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
1118 pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
1119 pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
1120 pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
1121 pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
1122 ++ir;
1123 pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
1124 pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
1125 ++ir;
1126 pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
1127 pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
1128 pppLayout4->addWidget(new QLabel("Size "), ir, 2, Qt::AlignLeft);
1129 pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
1130 pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
1131 ++ir;
1132 pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
1133 pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
1134 ++ir;
1135 pppLayout4->addWidget(new QLabel(""), ir, 1);
1136 pppLayout4->setRowStretch(ir, 999);
1137
1138 pppGroup4->setLayout(pppLayout4);
1139
1140 // Reqc Processing
1141 // ---------------
1142 _reqcActionComboBox = new QComboBox();
1143 _reqcActionComboBox->setEditable(false);
1144 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1145 int ip = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1146 if (ip != -1) {
1147 _reqcActionComboBox->setCurrentIndex(ip);
1148 }
1149 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1150 this, SLOT(slotBncTextChanged()));
1151
1152 QGridLayout* reqcLayout = new QGridLayout;
1153 _reqcActionComboBox->setMinimumWidth(15*ww);
1154 _reqcActionComboBox->setMaximumWidth(20*ww);
1155
1156 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1157 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1158
1159 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1160 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1161 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1162 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1163 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1164 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1165 _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
1166
1167 connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString &)),
1168 this, SLOT(slotBncTextChanged()));
1169
1170 _reqcLogSummaryOnly = new QCheckBox();
1171 _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
1172
1173 ir = 0;
1174 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"),ir, 0, 1, 8);
1175 ++ir;
1176 reqcLayout->addWidget(new QLabel("Action"), ir, 0);
1177 reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
1178 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1179 _reqcEditOptionButton->setMinimumWidth(15*ww);
1180 _reqcEditOptionButton->setMaximumWidth(20*ww);
1181
1182 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
1183 ++ir;
1184 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
1185 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
1186 _reqcObsFileChooser->setMaximumWidth(40*ww);
1187 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1188 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
1189 _reqcNavFileChooser->setMaximumWidth(40*ww);
1190 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1191 ++ir;
1192 reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
1193 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
1194 _reqcOutObsLineEdit->setMaximumWidth(40*ww);
1195 reqcLayout->addWidget(new QLabel(" Obs"), ir, 2);
1196 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
1197 _reqcOutNavLineEdit->setMaximumWidth(40*ww);
1198 reqcLayout->addWidget(new QLabel(" Nav"), ir, 4);
1199 ++ir;
1200 reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
1201 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
1202 _reqcOutLogLineEdit->setMaximumWidth(40*ww);
1203 reqcLayout->addWidget(new QLabel(" Summary only"), ir, 2);
1204 reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
1205 ++ir;
1206 reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
1207 reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
1208 _reqcSkyPlotSignals->setMaximumWidth(40*ww);
1209 ++ir;
1210 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
1211 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
1212 _reqcPlotDirLineEdit->setMaximumWidth(40*ww);
1213 ++ir;
1214 reqcLayout->setRowStretch(ir, 999);
1215
1216 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1217 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1218
1219 reqcgroup->setLayout(reqcLayout);
1220
1221 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1222 this, SLOT(slotReqcEditOption()));
1223
1224 QGridLayout* sp3CompLayout = new QGridLayout;
1225
1226 _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1227 _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
1228 _sp3CompFileChooser->setMinimumWidth(15*ww);
1229 _sp3CompFileChooser->setMaximumWidth(40*ww);
1230
1231 _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
1232 _sp3CompExclude->setMinimumWidth(18*ww);
1233 _sp3CompExclude->setMaximumWidth(18*ww);
1234
1235 _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
1236 _sp3CompLogLineEdit->setMinimumWidth(18*ww);
1237 _sp3CompLogLineEdit->setMaximumWidth(18*ww);
1238
1239 ir = 0;
1240 sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
1241 ++ir;
1242 sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
1243 sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
1244 ++ir;
1245 sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
1246 sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
1247 ++ir;
1248 sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
1249 sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
1250 ++ir;
1251 sp3CompLayout->addWidget(new QLabel(""), ir, 1);
1252 ++ir;
1253 sp3CompLayout->setRowStretch(ir, 999);
1254
1255 sp3CompLayout->setColumnMinimumWidth(2, 8*ww);
1256 sp3CompLayout->setColumnMinimumWidth(4, 8*ww);
1257
1258 sp3CompGroup->setLayout(sp3CompLayout);
1259
1260 connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString &)),
1261 this, SLOT(slotBncTextChanged()));
1262
1263 // Combine Corrections
1264 // -------------------
1265 QGridLayout* cmbLayout = new QGridLayout;
1266
1267 populateCmbTable();
1268 cmbLayout->addWidget(_cmbTable, 0, 0, 8, 6);
1269 cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams.<br>"), 1, 6, 1, 10);
1270 cmbLayout->addWidget(addCmbRowButton, 2, 6);
1271 cmbLayout->addWidget(delCmbRowButton, 2, 7);
1272 cmbLayout->addWidget(new QLabel("Method"), 3, 6, Qt::AlignLeft);
1273 cmbLayout->addWidget(_cmbMethodComboBox, 3, 7);
1274 cmbLayout->addWidget(new QLabel("BSX File"), 4, 6, Qt::AlignLeft);
1275 cmbLayout->addWidget(_cmbBsxFile, 4, 7, Qt::AlignRight);
1276 cmbLayout->addWidget(new QLabel("Max Residual"), 5, 6, Qt::AlignLeft);
1277 cmbLayout->addWidget(_cmbMaxresLineEdit, 5, 7, Qt::AlignRight);
1278 cmbLayout->addWidget(new QLabel("Sampling"), 6, 6, Qt::AlignLeft);
1279 cmbLayout->addWidget(_cmbSamplSpinBox, 6, 7, Qt::AlignRight);
1280 cmbLayout->addWidget(new QLabel("GNSS"), 7, 6, Qt::AlignLeft);
1281 cmbLayout->addWidget(new QLabel("GPS (C1W/C2W)"), 7, 7);
1282 cmbLayout->addWidget(_cmbGpsCheckBox, 7, 8);
1283 cmbLayout->addWidget(new QLabel("GLONASS (C1P/C2P)"), 7, 9);
1284 cmbLayout->addWidget(_cmbGloCheckBox, 7, 10);
1285 cmbLayout->addWidget(new QLabel("Galileo (C1C/C5Q)"), 7, 11);
1286 cmbLayout->addWidget(_cmbGalCheckBox, 7, 12);
1287 cmbLayout->addWidget(new QLabel("Beidou (C2I/C6I)"), 7, 13);
1288 cmbLayout->addWidget(_cmbBdsCheckBox, 7, 14);
1289 cmbLayout->addWidget(new QLabel("QZSS (C1C/C2L)"), 8, 7);
1290 cmbLayout->addWidget(_cmbQzssCheckBox, 8, 8);
1291 cmbLayout->addWidget(new QLabel("SBAS (C1C/C5Q)"), 8, 9);
1292 cmbLayout->addWidget(_cmbSbasCheckBox, 8, 10);
1293 cmbLayout->addWidget(new QLabel("IRNSS"), 8, 11);
1294 cmbLayout->addWidget(_cmbIrnssCheckBox, 8, 12);
1295 cmbLayout->setRowStretch(8, 999);
1296
1297 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1298 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1299
1300 cmbgroup->setLayout(cmbLayout);
1301
1302 // Upload Layout (Clocks)
1303 // ----------------------
1304 QGridLayout* uploadHlpLayout = new QGridLayout();
1305
1306 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1307 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1308 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1309
1310 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1311 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1312 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1313 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1314 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1315 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1316 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1317 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1318 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1319 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1320 uploadHlpLayout->addWidget(new QLabel("BSX"), 0,10, Qt::AlignRight);
1321 uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox, 0,11);
1322 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,12);
1323 uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
1324 uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
1325
1326 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1327 populateUploadTable();
1328
1329 uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to caster.<br>"));
1330 uploadLayout->addWidget(_uploadTable);
1331 uploadLayout->addLayout(uploadHlpLayout);
1332
1333 uploadgroup->setLayout(uploadLayout);
1334
1335 // Upload Layout (Ephemeris)
1336 // -------------------------
1337 QGridLayout* uploadHlpLayoutEph = new QGridLayout();
1338
1339 connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
1340 connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
1341
1342 uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
1343 uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
1344 uploadHlpLayoutEph->addWidget(new QLabel(" Sampling"), 0, 2, Qt::AlignRight);
1345 uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
1346
1347 QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
1348 populateUploadEphTable();
1349
1350 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster.<br>"));
1351 uploadLayoutEph->addWidget(_uploadEphTable);
1352 uploadLayoutEph->addLayout(uploadHlpLayoutEph);
1353
1354 uploadEphgroup->setLayout(uploadLayoutEph);
1355
1356
1357 // Main Layout
1358 // -----------
1359 QGridLayout* mLayout = new QGridLayout;
1360 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1361 mLayout->addWidget(_aogroup, 0,0);
1362 mLayout->addWidget(_mountPointsTable, 1,0);
1363 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1364 mLayout->addWidget(_loggroup, 2,0);
1365
1366 _canvas->setLayout(mLayout);
1367
1368 // WhatsThis, Network
1369 // ------------------
1370 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you may 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. Without any entry, BNC will try to use the system proxies. </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 this is not possible, you may need to run BNC outside your LAN on a network that has unobstructed connection to the Internet. <i>[key: proxyHost]</i></p>"));
1371 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC. <i>[key: proxyPort]</i></p>"));
1372 _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 whether this is supported by the involved Ntrip Broadcaster.</p><p>Note that SSL communication is usually done over port 443. <i>[key: sslCaCertPath]</i></p>"));
1373 _sslIgnoreErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the Ntrip Broadcaster. Tick 'Ignore SSL authorization errors' if you don't want to be bothered with this. <i>[key: sslIgnoreErrors]</i></p>"));
1374
1375 // WhatsThis, General
1376 // ------------------
1377 _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 for that 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. <i>[key: logFile]</i></p>"));
1378 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and file content already available under the same name will be overwritten. However, users might want to append already existing files following a regular restart or a crash of BNC or its platform.</p><p>Tick 'Append files' to continue with existing files and keep what has been recorded so far. <i>[key: rnxAppend]</i></p>"));
1379 _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. The default entry is 'no' that means the reread function is switched of. <p></p>Select '1 min', '5 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, five minutes, 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 via button 'Save & Reread Configuration'. <i>[key: onTheFlyInterval]</i></p>"));
1380 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options. <i>[key: autoStart]</i></p>"));
1381 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p><p>This option is primarily meant for debugging purposes. <i>[key: rawOutFile]</i></p>"));
1382
1383 // WhatsThis, RINEX Observations
1384 // -----------------------------
1385 _rnxPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where the RINEX Observation files will be stored.</p><p>If the specified directory does not exist, BNC will not create RINEX Observation files. <i>[key: rnxPath]</i></p>"));
1386 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
1387 _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
1388 _rnxSkelExtComboBox->setWhatsThis(tr("<p>BNC allows using personal RINEX skeleton files that contain the RINEX header records you would like to include. You can derive a skeleton file from information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' skl or SKL is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream. <i>[key: rnxSkel]</i></p>"));
1389 _rnxSkelPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where local skeleton files are located.</p><p> If no directory is specified, the path is assumed to where the RINEX Observation files will stored. <i>[key: rnxSkelPath]</i></p>"));
1390 _rnxFileCheckBox->setWhatsThis(tr("<p>Tick check box 'Skeleton mandatory' in case you want that RINEX files are only produced if skeleton files are available for BNC. If no skeleton file is available for a particular source then no RINEX Observation file will be produced from the affected stream.</p><p>Note that a skeleton file contains RINEX header information such as receiver and antenna types. In case of stream conversion to RINEX Version 3, a skeleton file should also contain information on potentially available observation types. A missing skeleton file will therefore enforce BNC to only save a default set of RINEX 3 observation types. <i>[key: rnxOnlyWithSKL]</i></p>"));
1391 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is finally saved, you may want to compress, copy or upload it immediately, for example via FTP. BNC allows you to execute a script/batch file to carry out such operation.</p><p>Specify the full path of a script or batch file. BNC will pass the full RINEX Observation file path to the script as command line parameter (%1 on Windows systems, $1 on Unix/Linux/Mac systems). <i>[key: rnxScript]</i></p>"));
1392 _rnxV2Priority->setWhatsThis(tr("<p>Specify a priority list of characters defining signal attributes as defined in RINEX Version 3. Priorities will be used to map observations with RINEX Version 3 attributes from incoming streams to Version 2. The underscore character '_' stands for undefined attributes. A question mark '?' can be used as wildcard which represents any one character.</p><p>Signal priorities can be specified as equal for all systems, as system specific or as system and freq. specific. For example: </li><ul><li>'CWPX_?' (General signal priorities valid for all GNSS) </li><li>'I:ABCX' (System specific signal priorities for IRNSS) </li><li>'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX' (System and frequency specific signal priorities) </li></ul>Default is the following priority list 'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:128&DPX C:7&DPZ I:ABCX S:1&C S:5&IQX'. <i>[key: rnxV2Priority]</i></p>"));
1393 _rnxVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Observation files. <i>[key: rnxVersion]</i></p>"));
1394
1395 // WhatsThis, RINEX Ephemeris
1396 // --------------------------
1397 _ephPathLineEdit->setWhatsThis(tr("<p>Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files.</p><p>If the specified directory does not exist, BNC will not create RINEX Navigation files. <i>[key: ephPath]</i></p>"));
1398 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
1399 _ephOutPortLineEdit->setWhatsThis(tr("<p>BNC can produce ephemeris data in RINEX Navigation ASCII format on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: ephOutPort]</i></p>"));
1400 _ephVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Navigation files. <i>[key: ephVersion]</i></p>"));
1401
1402 // WhatsThis, RINEX Editing & QC
1403 // -----------------------------
1404 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to 'Edit or Concatenate' RINEX Version 2 or 3 files or to perform a Quality Check (QC) and 'Analyze' data following UNAVCO's famous 'teqc' program. <i>[key: reqcAction]</i></p>"));
1405 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
1406 _reqcObsFileChooser->setWhatsThis(tr("<p>Specify the full path to input observation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX observation file is mandatory. <i>[key: reqcObsFile]</i></p>"));
1407 _reqcNavFileChooser->setWhatsThis(tr("<p>Specify the full path to input navigation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX navigation file is mandatory. <i>[key: reqcNavFile]</i></p>"));
1408 _reqcOutObsLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Observation output file.</p><p>Default is an empty option field, meaning that no RINEX Observation output file will be produced. <i>[key: reqcOutObsFile]</i></p>"));
1409 _reqcOutNavLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Navigation output file.</p><p>Default is an empty option field, meaning that no RINEX Navigation output file will be produced. <i>[key: reqcOutNavFile]</i></p>"));
1410 _reqcOutLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile.</p><p>Default is an empty option field, meaning that no 'RINEX Editing & QC' logfile will be produced. <i>[key: reqcOutLogFile]</i></p>"));
1411 _reqcLogSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from editing or analyzing RINEX data. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: reqcLogSummaryOnly]</i></p>"));
1412 _reqcPlotDirLineEdit->setWhatsThis(tr("<p>Specify a directory for saving plots in PNG format.</p><p>Default is an empty option field, meaning that plots will not be saved on disk. <i>[key: reqcPlotDir]</i></p>"));
1413 _reqcSkyPlotSignals->setWhatsThis(tr("<p>BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values. The 'Plots for signals' option lets you exactly specify observation signals to be used for that and also enables the plot generation. You can specify the navigation system, the frequency, and the tracking mode or channel as defined in RINEX Version 3. Specifications for frequency and tracking mode or channel must be separated by ampersand character '&'. Specifications for navigation systems must be separated by blank character ' '.</p><p>Examples for 'Plots for signals' option:<ul><li> G:1&2&5 R:1&2&3 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
1414
1415 // WhatsThis, SP3 Comparison
1416 // -------------------------
1417 _sp3CompFileChooser->setWhatsThis(tr("<p>BNC can compare two SP3 files containing GNSS satellite orbit and clock information.</p></p>Specify the full path to two files with orbits and clocks in SP3 format, separate them by comma. <i>[key: sp3CompFile]</i></p>"));
1418 _sp3CompExclude->setWhatsThis(tr("<p>Specify satellites to exclude them from orbit and clock comparison. Example:<p>G04,G31,R</p><p>This excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from the comparison.</p><p>Default is an empty option field, meaning that no satellite is excluded from the comparison. <i>[key: sp3CompExclude]</i></p>"));
1419 _sp3CompLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile saving comparison results.</p><p>Specifying a logfile is mandatory. Comparing SP3 files and not saving comparison results on disk would be useless. <i>[key: sp3CompOutLogFile]</i></p>"));
1420
1421 // WhatsThis, Broadcast Corrections
1422 // --------------------------------
1423 _corrPathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving Broadcast Ephemeris Correction files.</p><p>If the specified directory does not exist, BNC will not create the files. <i>[key: corrPath]</i></p>"));
1424 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
1425 _corrPortLineEdit->setWhatsThis(tr("<p>BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: corrPort]</i></p>"));
1426
1427 // WhatsThis, Feed Engine
1428 // ----------------------
1429 _outPortLineEdit->setWhatsThis(tr("<p>BNC can produce synchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outPort]</i></p>"));
1430 _outWaitSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full obs epoch' seconds.</p><p>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 product. <i>[key: outWait]</i></p>"));
1431 _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
1432 _outFileLineEdit->setWhatsThis(tr("<p>Specify the full path to a file where synchronized observations are saved in plain ASCII format.</p><p>Beware that the size of this file can rapidly increase depending on the number of incoming streams. <i>[key: outFile]</i></p>"));
1433 _outUPortLineEdit->setWhatsThis(tr("<p>BNC can produce unsynchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outUPort]</i></p>"));
1434 _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
1435
1436 // WhatsThis, Serial Output
1437 // ------------------------
1438 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p><p>Depending on the stream content, the receiver may use it for example for Differential GNSS, Precise Point Positioning or any other purpose supported by its firmware. <i>[key: serialMountPoint]</i></p>"));
1439 _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 before you start BNC, you must plug a serial cable in the port defined here. <i>[key: serialPortName]</i></p>"));
1440 _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. Using a high baud rate is recommended. <i>[key: serialBaudRate]</i></p>"));
1441 _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. <i>[key: serialFlowControl]</i></p>"));
1442 _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. <i>[key: serialDataBits]</i></p>"));
1443 _serialParityComboBox->setWhatsThis(tr("<p>Select a 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. The parity is often set to 'NONE'. <i>[key: serialParity]</i></p>"));
1444 _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. <i>[key: serialStopBits]</i></p>"));
1445 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>The 'NMEA' option supports the so-called 'Virtual Reference Station' (VRS) concept which requires the receiver to send approximate position information to the Ntrip Broadcaster. Select 'no' if you don't want BNC to forward or upload any NMEA message to the Ntrip Broadcaster in support of VRS.</p><p>Select 'Auto' to automatically forward NMEA messages of type GGA from your serial connected receiver to the Ntrip Broadcaster and/or save them in a file.</p><p>Select 'Manual GPGGA' or 'Manual GNGGA' if you want BNC to produce and upload GPGGA or GNGGA NMEA messages to the Ntrip Broadcaster because your serial connected receiver doesn't generate these messages. A Talker ID 'GP' preceding the GGA string stands for GPS solutions while a Talker ID 'GN' stands for multi constellation solutions.</p><p>Note that selecting 'Auto' or 'Manual' works only for VRS streams which show up under the 'Streams' canvas on BNC's main window with 'nmea' stream attribute set to 'yes'. This attribute is either extracted from the Ntrip Broadcaster's source-table or introduced by the user via editing the BNC configuration file. <i>[key: serialAutoNMEA]</i></p>"));
1446 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p><p>Default is an empty option field, meaning that NMEA messages will not be saved on disk. <i>[key: serialFileNMEA]</i></p>"));
1447 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meters for the reference station introduced by option 'Mountpoint'. Together with the latitude and longitude from the source-table, the height information is used to build GGA messages to be sent to the Ntrip Broadcaster.</p><p>For adjusting latitude and longitude values of a VRS stream given in the 'Streams' canvas, you can double click the latitude/longitude data fields, specify appropriate values and then hit Enter.</p><p>This option is only relevant when option 'NMEA' is set to 'Manual GPGGA' or 'Manual GNGGA' respectively. <i>[key: serialHeightNMEA]</i></p>"));
1448 _serialManualNMEASamplingSpinBox->setWhatsThis(tr("<p>Select a sampling interval in seconds for manual generation and upload of NMEA GGA sentences.</p><p>A sampling rate of '0' means, the a GGA sentence will be send only once to initialize the requested VRS stream. Note that some VRS systems need GGA sentences at regular intervals. <i>[key: serialManualNMEASampling]</i></p>"));
1449
1450 // WhatsThis, Outages
1451 // ------------------
1452 _adviseObsRateComboBox->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><p>Default is an empty option field, meaning that you don't want BNC to report on stream failures or recoveries when exceeding a threshold time span. <i>[key: adviseObsRate]</i></p>"));
1453 _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. <i>[key: adviseFail]</i></p>"));
1454 _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. <i>[key: adviseReco]</i></p>"));
1455 _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 a comment '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.</p><p>An empty option field (default) or invalid path means that you don't want to use this option. <i>[key: adviseScript]</i></p>"));
1456
1457 // WhatsThis, Miscellaneous
1458 // ------------------------
1459 _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. <i>[key: miscMount]</i></p>"));
1460 _miscIntrComboBox->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. <i>[key: miscIntr]</i></p>"));
1461 _miscScanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incoming message types as well as contained antenna coordinates, antenna height, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types. <i>[key: miscScanRTCM]</i></p>"));
1462 _miscPortLineEdit->setWhatsThis(tr("<p>BNC can output an incoming stream through an IP port of your local host.</p><p>Specify a port number to activate this function. <i>[key: miscPort]</i></p>"));
1463
1464 // WhatsThis, PPP (1)
1465 // ------------------
1466 _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations. <i>[key: PPP/]</i></p>"));
1467 _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
1468 _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
1469 _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP. <i>[key: PPP/corrMount]</i></p>"));
1470 _pppWidgets._ionoMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides VTEC informations in SSR format.</p><p>If you don't specify a corrections stream via this option, BNC will use VTEC informations from the Corrections stream 'mountpoint', if available. <i>[key: PPP/ionoMount]</i></p>"));
1471 _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP. <i>[key: PPP/corrFile]</i></p>"));
1472 _pppWidgets._ionoFile->setWhatsThis(tr("<p>Specify the VTEC file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will use VTEC informations from the Corrections file, if available. <i>[key: PPP/ionoFile]</i></p>"));
1473 _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets</li><li>Receiver APC variations</li><li>Satellite APC offsets.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations.</p><p>If you don't specify an 'ANTEX file' then observations will not be corrected for APC offsets and variations. <i>[key: PPP/antexFile]</i></p>"));
1474 _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:<p><ul><li>Specify the station either by<ul><li>the 'Mountpoint' of the station's RTCM stream (when in real-time PPP mode), or</li><li>the 4-charater station ID of the RINEX Observations file (when in post processing PPP mode).</li></ul></li><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown).</li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul></p><p>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored. <i>[key: PPP/crdFile]</i></p>"));
1475 _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logficorrMountles shall be produced. <i>[key: PPP/logPath]</i></p>"));
1476 _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced. <i>[key: PPP/nmeaPath]</i></p>"));
1477 _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced. <i>[key: PPP/snxtroPath]</i></p>"));
1478 _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'. <i>[key: PPP/snxtroIntr]</i></p>"));
1479 _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
1480 _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
1481 _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 4-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSol]</i></p>"));
1482
1483
1484 // WhatsThis, PPP (3)
1485 // ------------------
1486 _pppWidgets._lcGPS->setWhatsThis(tr("<p>Specify which kind of GPS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying 'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying 'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GPS data. <i>[key: PPP/lcGPS]</i></p>"));
1487 _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use GLONASS data. <i>[key: PPP/lcGLONASS]</i></p>"));
1488 _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data of two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use Galileo data. <i>[key: PPP/lcGalileo]</i></p>"));
1489 _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use</p><p><ul><li>Specifying 'Pi' means that you request BNC to use code data from two frequencies.</li><li>Specifying'Li' means that you request BNC to use phase data of two frequencies.</li> <li>Specifying'Pi&Li' means that you request BNC to use both, code and phase data of two frequencies.</li></ul></p><p>Specifying 'no' means that you don't want BNC to use BDS data. <i>[key: PPP/lcBDS]</i></p>"));
1490 _pppWidgets._modelObs->setWhatsThis(tr("<p>Specify which kind of PPP model you want to use:</p><p><ul><li>Iopnosphere-free PPP</li><li>Uncombined PPP</li><li>PPP-RTK (recommended for test purposes only because of an incomplete standardized SSR model)</li><li>DCM with Code or Phase Biases</li><li></p><p>[key: PPP/modelObs]</i></p>"));
1491 _pppWidgets._pseudoObs->setWhatsThis(tr("<p>Specify which kind of pseudo observations you want to use. Please note, pseudo observations regarding the Ionosphere are useful, as soon as the ionospheric information is more accurate than the code data accuracy. <i>[key: PPP/pseudoObs]</i></p>"));
1492 _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS C1 code observations to a PPP solution from combined code and phase data. 2.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma C1 = 2.0' <i>[key: PPP/sigmaC1]</i></p>"));
1493 _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS L1 phase observations to a PPP solutions from combined code and phase data. 0.02 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma L1 = 0.02' <i>[key: PPP/sigmaL1]</i></p>"));
1494 _pppWidgets._sigmaGIM->setWhatsThis(tr("<p>Enter a Sigma for GIM pseudo observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GIM pseudo observations to a PPP solution. 5.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 5.0' <i>[key: PPP/sigmaGIM]</i></p>"));
1495 _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS C1 code observations in a PPP solution. '3.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res C1 = 3.0' <i>[key: PPP/maxResC1]</i></p>"));
1496 _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS L1 phase observations in a PPP solution. '0.03' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res L1 = 0.03' <i>[key: PPP/maxResL1]</i></p>"));
1497 _pppWidgets._maxResGIM->setWhatsThis(tr("<p>Specify a maximum for residuals from GIM pseudo observations in a PPP solution. '3.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res GIM = 3.0' <i>[key: PPP/maxResGIM]</i></p>"));
1498 _pppWidgets._eleWgtCode->setWhatsThis(tr("<p>Tic 'Ele Wgt Code' to use satellite Elevation depending Weights for Code observations in the PPP solution. <i>[key: PPP/eleWgtCode]</i></p>"));
1499 _pppWidgets._eleWgtPhase->setWhatsThis(tr("<p>Tic 'Ele Wgt Phase' to use satellite Elevation depending Weights for Phase observations in the PPP solution. <i>[key: PPP/eleWgtPhase]</i></p>"));
1500 _pppWidgets._minObs->setWhatsThis(tr("<p>Select a Minimum Number of Observations per epoch for a PPP solution.</p><p>BNC will only process epochs with observation numbers reaching or exceeding this minimum. <i>[key: PPP/minObs]</i></p>"));
1501 _pppWidgets._minEle->setWhatsThis(tr("<p>Select a Minimum satellite Elevation for observations.</p><p>BNC will ignore an observation if the associated satellite Elevation does not reach or exceed this minimum.</p><p>Selecting '10 deg' may be an appropriate choice in order to avoid too noisy observations. <i>[key: PPP/minEle]</i></p>"));
1502
1503 // WhatsThis, Combine Corrections
1504 // ------------------------------
1505 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock correction streams in real-time to produce, encode, upload and save a combination of correctors coming from different providers. To add a line to the 'Combine Corrections' table hit the 'Add Row' button, double click on the 'Mountpoint' field to specify a Broadcast Ephemeris Correction 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 a weight to be applied for this stream in the combination.</p><p>Note that the orbit information in the resulting combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides orbit and clock correction streams BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris Correction stream in the 'Combine Corrections' table. Instead of combining corrections BNC will then add the corrections to the Broadcast Ephemeris with the possibility to save final orbit and clock results in SP3 and/or Clock RINEX format. <i>[key: cmbStreams]</i></p>"));
1506 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1507 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1508 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'.</p><p>It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning. <i>[key: cmbMethod]</i></p>"));
1509 _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'. <i>[key: cmbMaxres]</i></p>"));
1510 _cmbSamplSpinBox->setWhatsThis(tr("<p>Select a combination Sampling interval for the clocks. Clock corrections will be produced following that interval.</p><p>A value of 10 sec may be an appropriate choice. A value of zero '0' tells BNC to use all available samples. <i>[key: ]</i></p>"));
1511 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. <i>[key: cmbGps]</i></p>"));
1512 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1513 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1514 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1515 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1516 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1517 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS clock corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1518 _cmbBsxFile->setWhatsThis(tr("<p> Specify a Bias SINEX File that will be used to add satellite code biases to the combined clocks. <i>[key: cmbBsxFile]</i></p>"));
1519
1520 // WhatsThis, Upload Corrections
1521 // -----------------------------
1522 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) as well as Code Biases in different SSR formats. You may have a situation where clocks, orbits and code biases come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified Ntrip Broadcaster Host and Port</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris Corrections if you specify correction streams in the 'Combine Corrections' table.</p><p>To fill the 'Upload Corrections' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the Ntrip Broadcaster IP port (default is 80), the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference System (e.g. IGS14) for outgoing clock and orbit corrections.</p><p>Select a target SSR format (e.g. IGS-SSR) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BNC0SSRRTS${V3PROD}.sp3.</p><p>Specify a path for saving generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system: /home/user/BNC0SSRRTS${V3PROD}.clk.</p><p>Specify a path for saving generated Code Biases as SINEX Bias files. If the specified directory does not exist, BNC will not create SINEX Bias files. The following is a path example for a Linux system: /home/user/BNC0SSRRTS${V3PROD}.bia.</p><p>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
1523 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1524 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1525 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
1526 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("<p>Select a stream's orbit correction sampling interval in seconds.</p><p>A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages. <i>[key: uploadSamplRtcmEphCorr]</i></p>"));
1527 _uploadSamplSp3SpinBox->setWhatsThis(tr("<p>Select a SP3 orbit file sampling interval in minutes.</p><p>A value of zero '0' tells BNC to store all available samples into SP3 orbit files. <i>[key: uploadSamplSp3]</i></p>"));
1528 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("<p>Select a Clock RINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Clock RINEX files. <i>[key: uploadSamplClkRnx]</i></p>"));
1529 _uploadSamplBiaSnxSpinBox->setWhatsThis(tr("<p>Select a Bias SINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Bias SINEX files. <i>[key: uploadSamplBiaSnx]</i></p>"));
1530 setUploadTrafoButton->setWhatsThis(tr("<p>Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation via option 'System'.</p>"));
1531 _uploadAntexFile->setWhatsThis(tr("<p>When producing SP3 files or referring orbit and clock corrections to the satellite's Center of Mass (CoM) instead Antenna Phase Center (APC), an offset has to be applied which is available from the IGS 'ANTEX file'. You must therefore specify an 'ANTEX file' path if you want to save the stream content in SP3 format and/or refer correctors to CoM.</p><p>If you don't specify an 'ANTEX file' path, the SP3 file content as well as the orbit and clock correctors will be referred to satellite APCs. <i>[key: uploadAntexFile]</i></p>"));
1532
1533 // WhatsThis, Upload Ephemeris
1534 // ---------------------------
1535 _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the Ntrip Broadcaster IP port (default is 80), the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphHost]</i></p>"));
1536 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1537 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1538 _uploadSamplRtcmEphSpinBox->setWhatsThis(tr("<p>Select the Broadcast Ephemeris sampling interval in seconds.</p><p>Default is '5', meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds. <i>[key: uploadSamplRtcmEph]</i></p>"));
1539
1540 // WhatsThis, Streams Canvas
1541 // -------------------------
1542 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button opens 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 source-table. 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. Accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x' and 'RTNET'.</p><p>In case you need to log raw data as is, BNC allows to by-pass its decoders and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate such stream, the approximate latitude/longitude rover position is sent to the Ntrip Broadcaster together with an approximation for the height. Default values for latitude and longitude 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. <i>[key: mountPoints]</i></p>"));
1543 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1544 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1545 _actMapMountPoints->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
1546 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1547 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1548
1549 // WhatsThis, Log Canvas
1550 // ---------------------
1551 _log->setWhatsThis(tr("<p>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 problems that occur in the communication link, stream availability, stream delay, stream conversion etc.</p>"));
1552 _bncFigure->setWhatsThis(tr("<p>The bandwith consumption per stream is shown in the 'Throughput' tab in bits per second (bps) or kilobits per second (kbps).</p>"));
1553 _bncFigureLate->setWhatsThis(tr("<p>The individual latency of observations of incoming streams is shown in the 'Latency' tab. Streams not carrying observations (e.g. those providing only Broadcast Ephemeris) remain unconsidered.</p><p>Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized.</p>"));
1554 _bncFigurePPP->setWhatsThis(tr("<p>PPP time series of North (red), East (green) and Up (blue) displacements are shown in the 'PPP Plot' tab when the corresponding option is selected.</p><p>Values are referred to an XYZ a priori coordinate. The sliding PPP time series window covers the period of the latest 5 minutes.</p>"));
1555
1556
1557 // Enable/Disable all Widgets
1558 // --------------------------
1559 slotBncTextChanged();
1560 enableStartStop();
1561
1562 // Auto start
1563 // ----------
1564 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1565 slotStart();
1566 }
1567}
1568
1569// Destructor
1570////////////////////////////////////////////////////////////////////////////
1571bncWindow::~bncWindow() {
1572 if (_caster) {
1573 delete _caster; BNC_CORE->setCaster(0);
1574 }
1575 if (_casterEph) {
1576 delete _casterEph;
1577 }
1578 delete _bncFigureLate;
1579 delete _bncFigurePPP;
1580 delete _actHelp;
1581 delete _actAbout;
1582 delete _actFlowchart;
1583 delete _actFontSel;
1584 delete _actSaveOpt;
1585 delete _actQuit;
1586 delete _actAddMountPoints;
1587 delete _actDeleteMountPoints;
1588 delete _actMapMountPoints;
1589 delete _actStart;
1590 delete _actStop;
1591 delete _actwhatsthis;
1592 delete _proxyHostLineEdit;
1593 delete _proxyPortLineEdit;
1594 delete _sslCaCertPathLineEdit;
1595 delete _sslIgnoreErrorsCheckBox;
1596 delete _logFileLineEdit;
1597 delete _rawOutFileLineEdit;
1598 delete _rnxAppendCheckBox;
1599 delete _onTheFlyComboBox;
1600 delete _autoStartCheckBox;
1601 delete _rnxPathLineEdit;
1602 delete _rnxIntrComboBox;
1603 delete _rnxSamplComboBox;
1604 delete _rnxSkelExtComboBox;
1605 delete _rnxSkelPathLineEdit;
1606 delete _rnxFileCheckBox;
1607 delete _rnxScrpLineEdit;
1608 delete _rnxVersComboBox;
1609 delete _rnxV2Priority;
1610 delete _ephPathLineEdit;
1611 delete _ephIntrComboBox;
1612 delete _ephOutPortLineEdit;
1613 delete _ephVersComboBox;
1614 delete _corrPathLineEdit;
1615 delete _corrIntrComboBox;
1616 delete _corrPortLineEdit;
1617 delete _outPortLineEdit;
1618 delete _outWaitSpinBox;
1619 delete _outSamplComboBox;
1620 delete _outFileLineEdit;
1621 delete _outUPortLineEdit;
1622 delete _outLockTimeCheckBox;
1623 delete _serialMountPointLineEdit;
1624 delete _serialPortNameLineEdit;
1625 delete _serialBaudRateComboBox;
1626 delete _serialFlowControlComboBox;
1627 delete _serialDataBitsComboBox;
1628 delete _serialParityComboBox;
1629 delete _serialStopBitsComboBox;
1630 delete _serialAutoNMEAComboBox;
1631 delete _serialFileNMEALineEdit;
1632 delete _serialHeightNMEALineEdit;
1633 delete _serialManualNMEASamplingSpinBox;
1634 delete _adviseObsRateComboBox;
1635 delete _adviseFailSpinBox;
1636 delete _adviseRecoSpinBox;
1637 delete _adviseScriptLineEdit;
1638 delete _miscMountLineEdit;
1639 delete _miscPortLineEdit;
1640 delete _miscIntrComboBox;
1641 delete _miscScanRTCMCheckBox;
1642 _mountPointsTable->deleteLater();
1643 delete _log;
1644 delete _loggroup;
1645 _cmbTable->deleteLater();
1646 delete _cmbMaxresLineEdit;
1647 delete _cmbSamplSpinBox;
1648 delete _cmbMethodComboBox;
1649 delete _cmbGpsCheckBox;
1650 delete _cmbGloCheckBox;
1651 delete _cmbGalCheckBox;
1652 delete _cmbBdsCheckBox;
1653 delete _cmbQzssCheckBox;
1654 delete _cmbSbasCheckBox;
1655 delete _cmbIrnssCheckBox;
1656 delete _cmbBsxFile;
1657 _uploadEphTable->deleteLater();
1658 delete _uploadSamplRtcmEphCorrSpinBox;
1659 _uploadTable->deleteLater();
1660 delete _uploadIntrComboBox;
1661 delete _uploadAntexFile;
1662 delete _uploadSamplRtcmEphSpinBox;
1663 delete _uploadSamplSp3SpinBox;
1664 delete _uploadSamplClkRnxSpinBox;
1665 delete _uploadSamplBiaSnxSpinBox;
1666 delete _reqcActionComboBox;
1667 delete _reqcObsFileChooser;
1668 delete _reqcNavFileChooser;
1669 delete _reqcOutObsLineEdit;
1670 delete _reqcOutNavLineEdit;
1671 delete _reqcOutLogLineEdit;
1672 delete _reqcPlotDirLineEdit;
1673 delete _reqcSkyPlotSignals;
1674 delete _reqcLogSummaryOnly;
1675 delete _reqcEditOptionButton;
1676 delete _sp3CompFileChooser;
1677 delete _sp3CompExclude;
1678 delete _sp3CompLogLineEdit;
1679 //delete _canvas;
1680}
1681
1682//
1683////////////////////////////////////////////////////////////////////////////
1684void bncWindow::populateMountPointsTable() {
1685
1686 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1687 _mountPointsTable->removeRow(iRow);
1688 }
1689
1690 bncSettings settings;
1691
1692 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1693 int iRow = 0;
1694 while (it.hasNext()) {
1695 QStringList hlp = it.next().split(" ");
1696 if (hlp.size() < 7) continue;
1697 _mountPointsTable->insertRow(iRow);
1698
1699 QUrl url(hlp[0]);
1700
1701 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1702 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1703 QString nmea(hlp[5]);
1704 if (hlp[6] == "S") {
1705 fullPath = hlp[0].replace(0,2,"");
1706 }
1707 QString ntripVersion = "2";
1708 if (hlp.size() >= 7) {
1709 ntripVersion = (hlp[6]);
1710 }
1711
1712 QTableWidgetItem* it;
1713 it = new QTableWidgetItem(url.userInfo());
1714 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1715 _mountPointsTable->setItem(iRow, 0, it);
1716
1717 it = new QTableWidgetItem(fullPath);
1718 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1719 _mountPointsTable->setItem(iRow, 1, it);
1720
1721 it = new QTableWidgetItem(format);
1722 _mountPointsTable->setItem(iRow, 2, it);
1723
1724 it = new QTableWidgetItem(country);
1725 _mountPointsTable->setItem(iRow, 3, it);
1726
1727 if (nmea == "yes") {
1728 it = new QTableWidgetItem(latitude);
1729 _mountPointsTable->setItem(iRow, 4, it);
1730 it = new QTableWidgetItem(longitude);
1731 _mountPointsTable->setItem(iRow, 5, it);
1732 } else {
1733 it = new QTableWidgetItem(latitude);
1734 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1735 _mountPointsTable->setItem(iRow, 4, it);
1736
1737 it = new QTableWidgetItem(longitude);
1738 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1739 _mountPointsTable->setItem(iRow, 5, it);
1740 }
1741
1742 it = new QTableWidgetItem(nmea);
1743 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1744 _mountPointsTable->setItem(iRow, 6, it);
1745
1746 it = new QTableWidgetItem(ntripVersion);
1747 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1748 _mountPointsTable->setItem(iRow, 7, it);
1749
1750 bncTableItem* bncIt = new bncTableItem();
1751 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1752 _mountPointsTable->setItem(iRow, 8, bncIt);
1753
1754 iRow++;
1755 }
1756
1757 _mountPointsTable->sortItems(1);
1758
1759 enableStartStop();
1760}
1761
1762// Retrieve Table
1763////////////////////////////////////////////////////////////////////////////
1764void bncWindow::slotAddMountPoints() {
1765
1766 bncSettings settings;
1767 QString proxyHost = settings.value("proxyHost").toString();
1768 int proxyPort = settings.value("proxyPort").toInt();
1769 if (proxyHost != _proxyHostLineEdit->text() ||
1770 proxyPort != _proxyPortLineEdit->text().toInt()) {
1771 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1772 "changed. Use the new ones?",
1773 QMessageBox::Yes, QMessageBox::No,
1774 QMessageBox::NoButton);
1775 if (iRet == QMessageBox::Yes) {
1776 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1777 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1778 }
1779 }
1780
1781 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1782 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1783
1784 QMessageBox msgBox;
1785 msgBox.setIcon(QMessageBox::Question);
1786 msgBox.setWindowTitle("Add Stream");
1787 msgBox.setText("Add stream(s) coming from:");
1788
1789 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1790 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1791 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1792 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1793 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1794
1795 msgBox.exec();
1796
1797 if (msgBox.clickedButton() == buttonNtrip) {
1798 bncTableDlg* dlg = new bncTableDlg(this);
1799 dlg->move(this->pos().x()+50, this->pos().y()+50);
1800 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1801 this, SLOT(slotNewMountPoints(QStringList*)));
1802 dlg->exec();
1803 delete dlg;
1804 } else if (msgBox.clickedButton() == buttonIP) {
1805 bncIpPort* ipp = new bncIpPort(this);
1806 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1807 this, SLOT(slotNewMountPoints(QStringList*)));
1808 ipp->exec();
1809 delete ipp;
1810 } else if (msgBox.clickedButton() == buttonUDP) {
1811 bncUdpPort* udp = new bncUdpPort(this);
1812 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1813 this, SLOT(slotNewMountPoints(QStringList*)));
1814 udp->exec();
1815 delete udp;
1816 } else if (msgBox.clickedButton() == buttonSerial) {
1817 bncSerialPort* sep = new bncSerialPort(this);
1818 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1819 this, SLOT(slotNewMountPoints(QStringList*)));
1820 sep->exec();
1821 delete sep;
1822 } else if (msgBox.clickedButton() == buttonCancel) {
1823 // Cancel
1824 }
1825
1826 enableStartStop();
1827}
1828
1829// Delete Selected Mount Points
1830////////////////////////////////////////////////////////////////////////////
1831void bncWindow::slotDeleteMountPoints() {
1832
1833 int nRows = _mountPointsTable->rowCount();
1834 bool flg[nRows];
1835 for (int iRow = 0; iRow < nRows; iRow++) {
1836 if (_mountPointsTable->item(iRow,1)->isSelected()) {
1837 flg[iRow] = true;
1838 }
1839 else {
1840 flg[iRow] = false;
1841 }
1842 }
1843 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1844 if (flg[iRow]) {
1845 _mountPointsTable->removeRow(iRow);
1846 }
1847 }
1848 _actDeleteMountPoints->setEnabled(false);
1849
1850 enableStartStop();
1851}
1852
1853// New Mount Points Selected
1854////////////////////////////////////////////////////////////////////////////
1855void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1856 int iRow = 0;
1857 QListIterator<QString> it(*mountPoints);
1858 while (it.hasNext()) {
1859 QStringList hlp = it.next().split(" ");
1860 QUrl url(hlp[0]);
1861 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1862 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1863 QString nmea(hlp[5]);
1864 if (hlp[6] == "S") {
1865 fullPath = hlp[0].replace(0,2,"");
1866 }
1867 QString ntripVersion = "2";
1868 if (hlp.size() >= 7) {
1869 ntripVersion = (hlp[6]);
1870 }
1871
1872 _mountPointsTable->insertRow(iRow);
1873
1874 QTableWidgetItem* it;
1875 it = new QTableWidgetItem(url.userInfo());
1876 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1877 _mountPointsTable->setItem(iRow, 0, it);
1878
1879 it = new QTableWidgetItem(fullPath);
1880 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1881 _mountPointsTable->setItem(iRow, 1, it);
1882
1883 it = new QTableWidgetItem(format);
1884 _mountPointsTable->setItem(iRow, 2, it);
1885
1886 it = new QTableWidgetItem(country);
1887 _mountPointsTable->setItem(iRow, 3, it);
1888
1889 if (nmea == "yes") {
1890 it = new QTableWidgetItem(latitude);
1891 _mountPointsTable->setItem(iRow, 4, it);
1892 it = new QTableWidgetItem(longitude);
1893 _mountPointsTable->setItem(iRow, 5, it);
1894 } else {
1895 it = new QTableWidgetItem(latitude);
1896 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1897 _mountPointsTable->setItem(iRow, 4, it);
1898 it = new QTableWidgetItem(longitude);
1899 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1900 _mountPointsTable->setItem(iRow, 5, it);
1901 }
1902
1903 it = new QTableWidgetItem(nmea);
1904 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1905 _mountPointsTable->setItem(iRow, 6, it);
1906
1907 it = new QTableWidgetItem(ntripVersion);
1908 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1909 _mountPointsTable->setItem(iRow, 7, it);
1910
1911 bncTableItem* bncIt = new bncTableItem();
1912 _mountPointsTable->setItem(iRow, 8, bncIt);
1913
1914 iRow++;
1915 }
1916 _mountPointsTable->hideColumn(0);
1917 _mountPointsTable->hideColumn(3);
1918 _mountPointsTable->sortItems(1);
1919 delete mountPoints;
1920
1921 enableStartStop();
1922}
1923
1924// Save Options (serialize)
1925////////////////////////////////////////////////////////////////////////////
1926void bncWindow::slotSaveOptions() {
1927 saveOptions();
1928 bncSettings settings;
1929 settings.sync();
1930}
1931
1932// Save Options (memory only)
1933////////////////////////////////////////////////////////////////////////////
1934void bncWindow::saveOptions() {
1935
1936 QStringList mountPoints;
1937 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1938
1939 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1940 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1941 "@" + _mountPointsTable->item(iRow, 1)->text() );
1942
1943 mountPoints.append(url.toString() + " " +
1944 _mountPointsTable->item(iRow, 2)->text()
1945 + " " + _mountPointsTable->item(iRow, 3)->text()
1946 + " " + _mountPointsTable->item(iRow, 4)->text()
1947 + " " + _mountPointsTable->item(iRow, 5)->text()
1948 + " " + _mountPointsTable->item(iRow, 6)->text()
1949 + " " + _mountPointsTable->item(iRow, 7)->text());
1950 } else {
1951 mountPoints.append(
1952 "//" + _mountPointsTable->item(iRow, 1)->text()
1953 + " " + _mountPointsTable->item(iRow, 2)->text()
1954 + " " + _mountPointsTable->item(iRow, 3)->text()
1955 + " " + _mountPointsTable->item(iRow, 4)->text()
1956 + " " + _mountPointsTable->item(iRow, 5)->text()
1957 + " " + _mountPointsTable->item(iRow, 6)->text()
1958 + " " + _mountPointsTable->item(iRow, 7)->text());
1959 }
1960 }
1961
1962 QStringList cmbStreams;
1963 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1964 QString hlp;
1965 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1966 if (_cmbTable->item(iRow, iCol)) {
1967 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1968 }
1969 }
1970 if (!hlp.isEmpty()) {
1971 cmbStreams << hlp;
1972 }
1973 }
1974
1975 QStringList uploadMountpointsOut;
1976 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1977 QString hlp;
1978 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1979 if (_uploadTable->cellWidget(iRow, iCol) &&
1980 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
1981 if (iCol == 3) {
1982 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1983 hlp += ntripversion->currentText() + ",";
1984 }
1985 else if (iCol == 4 ) {
1986 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1987 hlp += user->text() + ",";
1988 }
1989 else if (iCol == 5) {
1990 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1991 hlp += passwd->text() + ",";
1992 }
1993 else if (iCol == 6) {
1994 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1995 hlp += system->currentText() + ",";
1996 }
1997 else if (iCol == 7) {
1998 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1999 hlp += format->currentText() + ",";
2000 }
2001 else if (iCol == 8) {
2002 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
2003 QString state; state.setNum(com->checkState());
2004 hlp += state + ",";
2005 }
2006 }
2007 else if (_uploadTable->item(iRow, iCol)) {
2008 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
2009 }
2010 }
2011 if (!hlp.isEmpty()) {
2012 uploadMountpointsOut << hlp;
2013 }
2014 }
2015
2016 QStringList uploadEphMountpointsOut;
2017 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
2018 QString hlp;
2019 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2020 if (_uploadEphTable->cellWidget(iRow, iCol) &&
2021 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
2022 if (iCol == 3) {
2023 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
2024 hlp += ntripversion->currentText() + ",";
2025 }
2026 else if (iCol == 4 ) {
2027 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2028 hlp += user->text() + ",";
2029 }
2030 else if (iCol == 5) {
2031 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2032 hlp += passwd->text() + ",";
2033 }
2034 else if (iCol == 6) {
2035 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2036 hlp += system->text() + ",";
2037 }
2038 }
2039 else if (_uploadEphTable->item(iRow, iCol)) {
2040 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2041 }
2042 }
2043 if (!hlp.isEmpty()) {
2044 uploadEphMountpointsOut << hlp;
2045 }
2046 }
2047
2048 bncSettings settings;
2049
2050 settings.setValue("startTab", _aogroup->currentIndex());
2051 settings.setValue("statusTab", _loggroup->currentIndex());
2052 settings.setValue("mountPoints", mountPoints);
2053// Network
2054 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2055 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2056 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2057 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2058// General
2059 settings.setValue("logFile", _logFileLineEdit->text());
2060 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2061 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2062 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2063 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2064// RINEX Observations
2065 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2066 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2067 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2068 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2069 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2070 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2071 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2072 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2073 settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
2074// RINEX Ephemeris
2075 settings.setValue("ephPath", _ephPathLineEdit->text());
2076 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2077 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2078 settings.setValue("ephVersion", _ephVersComboBox->currentText());
2079// Broadcast Corrections
2080 settings.setValue("corrPath", _corrPathLineEdit->text());
2081 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2082 settings.setValue("corrPort", _corrPortLineEdit->text());
2083// Feed Engine
2084 settings.setValue("outPort", _outPortLineEdit->text());
2085 settings.setValue("outWait", _outWaitSpinBox->value());
2086 settings.setValue("outSampl", _outSamplComboBox->currentText());
2087 settings.setValue("outFile", _outFileLineEdit->text());
2088 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2089// Serial Output
2090 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2091 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2092 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2093 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2094 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2095 settings.setValue("serialParity", _serialParityComboBox->currentText());
2096 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2097 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2098 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2099 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2100 settings.setValue("serialManualNMEASampling", _serialManualNMEASamplingSpinBox->value());
2101// Outages
2102 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2103 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2104 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2105 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2106// Miscellaneous
2107 settings.setValue("miscMount", _miscMountLineEdit->text());
2108 settings.setValue("miscPort", _miscPortLineEdit->text());
2109 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2110 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2111// Reqc
2112 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2113 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2114 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2115 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2116 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2117 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2118 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2119 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2120 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2121// SP3 Comparison
2122 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2123 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2124 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2125// Combine Corrections
2126 if (!cmbStreams.isEmpty()) {
2127 settings.setValue("cmbStreams", cmbStreams);
2128 }
2129 else {
2130 settings.setValue("cmbStreams", "");
2131 }
2132 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2133 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2134 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2135 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2136 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2137 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2138 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2139 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2140 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2141 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2142 settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
2143
2144// Upload Corrections
2145 if (!uploadMountpointsOut.isEmpty()) {
2146 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2147 }
2148 else {
2149 settings.setValue("uploadMountpointsOut", "");
2150 }
2151 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2152 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2153 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
2154 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2155 settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
2156 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2157// Upload Ephemeris
2158 if (!uploadEphMountpointsOut.isEmpty()) {
2159 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2160 }
2161 else {
2162 settings.setValue("uploadEphMountpointsOut", "");
2163 }
2164 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2165
2166 if (_caster) {
2167 _caster->readMountPoints();
2168 }
2169
2170 _pppWidgets.saveOptions();
2171}
2172
2173// All get slots terminated
2174////////////////////////////////////////////////////////////////////////////
2175void bncWindow::slotGetThreadsFinished() {
2176 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2177 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2178 delete _casterEph; _casterEph = 0;
2179 _runningRealTime = false;
2180}
2181
2182// Start It!
2183////////////////////////////////////////////////////////////////////////////
2184void bncWindow::slotStart() {
2185 saveOptions();
2186 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2187 _runningPPP = true;
2188 enableStartStop();
2189 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2190 BNC_CORE->startPPP();
2191 _bncFigurePPP->reset();
2192 }
2193 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2194 if (_reqcActionComboBox->currentText() == "Analyze") {
2195 _runningQC = true;
2196 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2197 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2198 reqcAnalyze->start();
2199 }
2200 else {
2201 _runningEdit = true;
2202 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2203 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2204 reqcEdit->start();
2205 }
2206 enableStartStop();
2207 }
2208 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2209 _runningSp3Comp = true;
2210 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2211 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2212 sp3Comp->start();
2213 enableStartStop();
2214 }
2215 else {
2216 startRealTime();
2217 BNC_CORE->startPPP();
2218 }
2219}
2220
2221// Start Real-Time (Retrieve Data etc.)
2222////////////////////////////////////////////////////////////////////////////
2223void bncWindow::startRealTime() {
2224
2225 _runningRealTime = true;
2226
2227 _bncFigurePPP->reset();
2228
2229 _actDeleteMountPoints->setEnabled(false);
2230
2231 enableStartStop();
2232
2233 _caster = new bncCaster();
2234
2235 BNC_CORE->setCaster(_caster);
2236 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2237 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2238 BNC_CORE->initCombination();
2239
2240 connect(_caster, SIGNAL(getThreadsFinished()),
2241 this, SLOT(slotGetThreadsFinished()));
2242
2243 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
2244 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2245
2246 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2247
2248 bncSettings settings;
2249
2250 // Active panels
2251 // -------------
2252 if (!_rnxPathLineEdit->text().isEmpty())
2253 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2254 if (!_ephPathLineEdit->text().isEmpty())
2255 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2256 if (!_corrPathLineEdit->text().isEmpty())
2257 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2258 if (!_outPortLineEdit->text().isEmpty())
2259 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2260 if (!_serialMountPointLineEdit->text().isEmpty())
2261 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2262 if (!_adviseObsRateComboBox->currentText().isEmpty())
2263 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2264 if (!_miscMountLineEdit->text().isEmpty())
2265 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2266 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2267 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2268 if (_cmbTable->rowCount() > 0)
2269 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2270 if (_uploadTable->rowCount() > 0)
2271 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2272 if (_uploadEphTable->rowCount() > 0)
2273 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2274
2275 QDir rnxdir(settings.value("rnxPath").toString());
2276 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2277
2278 QString rnx_file = settings.value("rnxScript").toString();
2279 if ( !rnx_file.isEmpty() ) {
2280 QFile rnxfile(settings.value("rnxScript").toString());
2281 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2282 }
2283
2284 QDir ephdir(settings.value("ephPath").toString());
2285 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2286
2287 QDir corrdir(settings.value("corrPath").toString());
2288 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2289
2290 QString advise_file = settings.value("adviseScript").toString();
2291 if ( !advise_file.isEmpty() ) {
2292 QFile advisefile(settings.value("adviseScript").toString());
2293 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2294 }
2295
2296 _caster->readMountPoints();
2297
2298 _casterEph = new bncEphUploadCaster();
2299}
2300
2301// Retrieve Data
2302////////////////////////////////////////////////////////////////////////////
2303void bncWindow::slotStop() {
2304 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2305 QMessageBox::Yes, QMessageBox::No,
2306 QMessageBox::NoButton);
2307 if (iRet == QMessageBox::Yes) {
2308 BNC_CORE->stopPPP();
2309 BNC_CORE->stopCombination();
2310 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2311 delete _casterEph; _casterEph = 0;
2312 _runningRealTime = false;
2313 _runningPPP = false;
2314 enableStartStop();
2315 }
2316}
2317
2318// Close Application gracefully
2319////////////////////////////////////////////////////////////////////////////
2320void bncWindow::closeEvent(QCloseEvent* event) {
2321
2322 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2323 QMessageBox::Yes, QMessageBox::No,
2324 QMessageBox::Cancel);
2325
2326 if (iRet == QMessageBox::Cancel) {
2327 event->ignore();
2328 return;
2329 }
2330 else if (iRet == QMessageBox::Yes) {
2331 slotSaveOptions();
2332 }
2333
2334 BNC_CORE->stopPPP();
2335
2336 QMainWindow::closeEvent(event);
2337}
2338
2339// User changed the selection of mountPoints
2340////////////////////////////////////////////////////////////////////////////
2341void bncWindow::slotSelectionChanged() {
2342 if (_mountPointsTable->selectedItems().isEmpty()) {
2343 _actDeleteMountPoints->setEnabled(false);
2344 }
2345 else {
2346 _actDeleteMountPoints->setEnabled(true);
2347 }
2348}
2349
2350// Display Program Messages
2351////////////////////////////////////////////////////////////////////////////
2352void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2353 if (showOnScreen ) {
2354 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2355 }
2356}
2357
2358// About Message
2359////////////////////////////////////////////////////////////////////////////
2360void bncWindow::slotAbout() {
2361 new bncAboutDlg(0);
2362}
2363
2364//Flowchart
2365////////////////////////////////////////////////////////////////////////////
2366void bncWindow::slotFlowchart() {
2367 new bncFlowchartDlg(0);
2368}
2369
2370// Help Window
2371////////////////////////////////////////////////////////////////////////////
2372void bncWindow::slotHelp() {
2373 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2374 new bncHlpDlg(0, url);
2375}
2376
2377// Select Fonts
2378////////////////////////////////////////////////////////////////////////////
2379void bncWindow::slotFontSel() {
2380 bool ok;
2381 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2382 if (ok) {
2383 bncSettings settings;
2384 settings.setValue("font", newFont.toString());
2385 QApplication::setFont(newFont);
2386 int ww = QFontMetrics(newFont).width('w');
2387 setMinimumSize(60*ww, 80*ww);
2388 resize(60*ww, 80*ww);
2389 }
2390}
2391
2392// Whats This Help
2393void bncWindow::slotWhatsThis() {
2394 QWhatsThis::enterWhatsThisMode();
2395}
2396
2397//
2398////////////////////////////////////////////////////////////////////////////
2399void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2400 _threads = threads;
2401
2402 _bncFigure->updateMountPoints();
2403 _bncFigureLate->updateMountPoints();
2404
2405 populateMountPointsTable();
2406 bncSettings settings;
2407 _outSamplComboBox->findText(settings.value("outSampl").toString());
2408 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2409 QListIterator<bncGetThread*> iTh(threads);
2410 while (iTh.hasNext()) {
2411 bncGetThread* thread = iTh.next();
2412 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2413 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2414 "@" + _mountPointsTable->item(iRow, 1)->text() );
2415 if (url == thread->mountPoint() &&
2416 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2417 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2418 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2419 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2420 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2421 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2422 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2423 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2424 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2425 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2426 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2427 break;
2428 }
2429 }
2430 }
2431}
2432
2433//
2434////////////////////////////////////////////////////////////////////////////
2435void bncWindow::CreateMenu() {
2436 // Create Menus
2437 // ------------
2438 _menuFile = menuBar()->addMenu(tr("&File"));
2439 _menuFile->addAction(_actFontSel);
2440 _menuFile->addSeparator();
2441 _menuFile->addAction(_actSaveOpt);
2442 _menuFile->addSeparator();
2443 _menuFile->addAction(_actQuit);
2444
2445 _menuHlp = menuBar()->addMenu(tr("&Help"));
2446 _menuHlp->addAction(_actHelp);
2447 _menuHlp->addAction(_actFlowchart);
2448 _menuHlp->addAction(_actAbout);
2449}
2450
2451// Toolbar
2452////////////////////////////////////////////////////////////////////////////
2453void bncWindow::AddToolbar() {
2454 QToolBar* toolBar = new QToolBar;
2455 addToolBar(Qt::BottomToolBarArea, toolBar);
2456 toolBar->setMovable(false);
2457 toolBar->addAction(_actAddMountPoints);
2458 toolBar->addAction(_actDeleteMountPoints);
2459 toolBar->addAction(_actMapMountPoints);
2460 toolBar->addAction(_actStart);
2461 toolBar->addAction(_actStop);
2462 toolBar->addWidget(new QLabel(" "));
2463 toolBar->addAction(_actwhatsthis);
2464}
2465
2466// About
2467////////////////////////////////////////////////////////////////////////////
2468bncAboutDlg::bncAboutDlg(QWidget* parent) :
2469 QDialog(parent) {
2470
2471 QTextBrowser* tb = new QTextBrowser;
2472 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2473 tb->setSource(url);
2474 tb->setReadOnly(true);
2475
2476 int ww = QFontMetrics(font()).width('w');
2477 QPushButton* _closeButton = new QPushButton("Close");
2478 _closeButton->setMaximumWidth(10*ww);
2479 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2480
2481 QGridLayout* dlgLayout = new QGridLayout();
2482 QLabel* img = new QLabel();
2483 img->setPixmap(QPixmap(":ntrip-logo.png"));
2484 dlgLayout->addWidget(img, 0,0);
2485 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2486 dlgLayout->addWidget(tb,1,0,1,2);
2487 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2488
2489 setLayout(dlgLayout);
2490 resize(60*ww, 60*ww);
2491 setWindowTitle("About BNC");
2492 show();
2493}
2494
2495//
2496////////////////////////////////////////////////////////////////////////////
2497bncAboutDlg::~bncAboutDlg() {
2498
2499};
2500
2501// Flowchart
2502////////////////////////////////////////////////////////////////////////////
2503bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2504 QDialog(parent) {
2505
2506 int ww = QFontMetrics(font()).width('w');
2507 QPushButton* _closeButton = new QPushButton("Close");
2508 _closeButton->setMaximumWidth(10*ww);
2509 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2510
2511 QGridLayout* dlgLayout = new QGridLayout();
2512 QLabel* img = new QLabel();
2513 img->setPixmap(QPixmap(":bncflowchart.png"));
2514 dlgLayout->addWidget(img, 0,0);
2515 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2516
2517 setLayout(dlgLayout);
2518 setWindowTitle("Flow Chart");
2519 show();
2520}
2521
2522//
2523////////////////////////////////////////////////////////////////////////////
2524bncFlowchartDlg::~bncFlowchartDlg() {
2525};
2526
2527// Enable/Disable Widget (and change its color)
2528////////////////////////////////////////////////////////////////////////////
2529void bncWindow::enableWidget(bool enable, QWidget* widget) {
2530
2531 const static QPalette paletteWhite(QColor(255, 255, 255));
2532 const static QPalette paletteGray(QColor(230, 230, 230));
2533
2534 widget->setEnabled(enable);
2535 if (enable) {
2536 widget->setPalette(paletteWhite);
2537 }
2538 else {
2539 widget->setPalette(paletteGray);
2540 }
2541}
2542
2543// Bnc Text
2544////////////////////////////////////////////////////////////////////////////
2545void bncWindow::slotBncTextChanged(){
2546
2547 const static QPalette paletteWhite(QColor(255, 255, 255));
2548 const static QPalette paletteGray(QColor(230, 230, 230));
2549
2550 bool enable = true;
2551
2552 // Proxy
2553 //------
2554 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2555 enable = !_proxyHostLineEdit->text().isEmpty();
2556 enableWidget(enable, _proxyPortLineEdit);
2557 }
2558
2559 // RINEX Observations
2560 // ------------------
2561 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2562 enable = !_rnxPathLineEdit->text().isEmpty();
2563 enableWidget(enable, _rnxIntrComboBox);
2564 enableWidget(enable, _rnxSamplComboBox);
2565 enableWidget(enable, _rnxSkelExtComboBox);
2566 enableWidget(enable, _rnxSkelPathLineEdit);
2567 enableWidget(enable, _rnxFileCheckBox);
2568 enableWidget(enable, _rnxScrpLineEdit);
2569 enableWidget(enable, _rnxV2Priority);
2570 enableWidget(enable, _rnxVersComboBox);
2571
2572 bool enable1 = true;
2573 enable1 = _rnxVersComboBox->currentText() == "2";
2574 if (enable && enable1) {
2575 enableWidget(true, _rnxV2Priority);
2576 }
2577 if (enable && !enable1) {
2578 enableWidget(false, _rnxV2Priority);
2579 }
2580 }
2581
2582 // RINEX Observations, Signal Priority
2583 // -----------------------------------
2584 if (sender() == 0 || sender() == _rnxVersComboBox) {
2585 if (!_rnxPathLineEdit->text().isEmpty()) {
2586 enableWidget(enable, _rnxIntrComboBox);
2587 enable = _rnxVersComboBox->currentText() == "2";
2588 enableWidget(enable, _rnxV2Priority);
2589 }
2590 }
2591
2592 // RINEX Ephemeris
2593 // ---------------
2594 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2595 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2596 enableWidget(enable, _ephIntrComboBox);
2597 enableWidget(enable, _ephVersComboBox);
2598 }
2599
2600 // Broadcast Corrections
2601 // ---------------------
2602 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2603 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2604 enableWidget(enable, _corrIntrComboBox);
2605 }
2606
2607 // Feed Engine
2608 // -----------
2609 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2610 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2611 enableWidget(enable, _outWaitSpinBox);
2612 enableWidget(enable, _outSamplComboBox);
2613 }
2614
2615 // Serial Output
2616 // -------------
2617 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2618 sender() == _serialAutoNMEAComboBox) {
2619 enable = !_serialMountPointLineEdit->text().isEmpty();
2620 enableWidget(enable, _serialPortNameLineEdit);
2621 enableWidget(enable, _serialBaudRateComboBox);
2622 enableWidget(enable, _serialParityComboBox);
2623 enableWidget(enable, _serialDataBitsComboBox);
2624 enableWidget(enable, _serialStopBitsComboBox);
2625 enableWidget(enable, _serialFlowControlComboBox);
2626 enableWidget(enable, _serialAutoNMEAComboBox);
2627 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() == "Auto";
2628 enableWidget(enable2, _serialFileNMEALineEdit);
2629 bool enable3 = enable && _serialAutoNMEAComboBox->currentText().contains("Manual");
2630 enableWidget(enable3, _serialHeightNMEALineEdit);
2631 enableWidget(enable3, _serialManualNMEASamplingSpinBox);
2632 }
2633
2634 // Outages
2635 // -------
2636 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2637 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2638 enableWidget(enable, _adviseFailSpinBox);
2639 enableWidget(enable, _adviseRecoSpinBox);
2640 enableWidget(enable, _adviseScriptLineEdit);
2641 }
2642
2643 // Miscellaneous
2644 // -------------
2645 if (sender() == 0 || sender() == _miscMountLineEdit) {
2646 enable = !_miscMountLineEdit->text().isEmpty();
2647 enableWidget(enable, _miscIntrComboBox);
2648 enableWidget(enable, _miscScanRTCMCheckBox);
2649 enableWidget(enable, _miscPortLineEdit);
2650 }
2651
2652 // Combine Corrections
2653 // -------------------
2654 if (sender() == 0 || sender() == _cmbTable) {
2655 int iRow = _cmbTable->rowCount();
2656 if (iRow > 0) {
2657 enableWidget(true, _cmbMethodComboBox);
2658 enableWidget(true, _cmbMaxresLineEdit);
2659 enableWidget(true, _cmbSamplSpinBox);
2660 enableWidget(true, _cmbGpsCheckBox);
2661 enableWidget(true, _cmbGloCheckBox);
2662 enableWidget(true, _cmbGalCheckBox);
2663 enableWidget(true, _cmbBdsCheckBox);
2664 enableWidget(true, _cmbQzssCheckBox);
2665 enableWidget(true, _cmbSbasCheckBox);
2666 enableWidget(true, _cmbIrnssCheckBox);
2667 enableWidget(true, _cmbBsxFile);
2668 }
2669 else {
2670 enableWidget(false, _cmbMethodComboBox);
2671 enableWidget(false, _cmbMaxresLineEdit);
2672 enableWidget(false, _cmbSamplSpinBox);
2673 enableWidget(false, _cmbGpsCheckBox);
2674 enableWidget(false, _cmbGloCheckBox);
2675 enableWidget(false, _cmbGalCheckBox);
2676 enableWidget(false, _cmbBdsCheckBox);
2677 enableWidget(false, _cmbQzssCheckBox);
2678 enableWidget(false, _cmbSbasCheckBox);
2679 enableWidget(false, _cmbIrnssCheckBox);
2680 enableWidget(false, _cmbBsxFile);
2681 }
2682 }
2683
2684 // Upload(clk)
2685 // -----------
2686 int iRow = _uploadTable->rowCount();
2687 if (iRow > 0) {
2688 enableWidget(true, _uploadIntrComboBox);
2689 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2690 enableWidget(true, _uploadSamplClkRnxSpinBox);
2691 enableWidget(true, _uploadSamplBiaSnxSpinBox);
2692 enableWidget(true, _uploadSamplSp3SpinBox);
2693 enableWidget(true, _uploadAntexFile);
2694 }
2695 else {
2696 enableWidget(false, _uploadIntrComboBox);
2697 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2698 enableWidget(false, _uploadSamplClkRnxSpinBox);
2699 enableWidget(false, _uploadSamplBiaSnxSpinBox);
2700 enableWidget(false, _uploadSamplSp3SpinBox);
2701 enableWidget(false, _uploadAntexFile);
2702 }
2703
2704 // Upload(eph)
2705 // -----------
2706 iRow = _uploadEphTable->rowCount();
2707 if (iRow > 0) {
2708 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2709 }
2710 else {
2711 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2712 }
2713
2714 // QC
2715 // --
2716 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2717 enable = !_reqcActionComboBox->currentText().isEmpty();
2718 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2719// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2720 enableWidget(enable, _reqcObsFileChooser);
2721 enableWidget(enable, _reqcNavFileChooser);
2722 enableWidget(enable, _reqcOutLogLineEdit);
2723 enableWidget(enable && enable10, _reqcEditOptionButton);
2724 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2725 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2726 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2727 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2728// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2729 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2730 }
2731
2732 // SP3 File Comparison
2733 // -------------------
2734 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2735 enable = !_sp3CompFileChooser->fileName().isEmpty();
2736 enableWidget(enable, _sp3CompLogLineEdit);
2737 enableWidget(enable, _sp3CompExclude);
2738 }
2739
2740 enableStartStop();
2741}
2742
2743//
2744////////////////////////////////////////////////////////////////////////////
2745void bncWindow::slotAddCmbRow() {
2746 int iRow = _cmbTable->rowCount();
2747 _cmbTable->insertRow(iRow);
2748 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2749 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2750 }
2751}
2752
2753//
2754////////////////////////////////////////////////////////////////////////////
2755void bncWindow::slotDelCmbRow() {
2756
2757 const static QPalette paletteWhite(QColor(255, 255, 255));
2758 const static QPalette paletteGray(QColor(230, 230, 230));
2759
2760 int nRows = _cmbTable->rowCount();
2761 bool flg[nRows];
2762 for (int iRow = 0; iRow < nRows; iRow++) {
2763 if (_cmbTable->item(iRow,1)->isSelected()) {
2764 flg[iRow] = true;
2765 }
2766 else {
2767 flg[iRow] = false;
2768 }
2769 }
2770 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2771 if (flg[iRow]) {
2772 _cmbTable->removeRow(iRow);
2773 }
2774 }
2775 nRows = _cmbTable->rowCount();
2776 if (nRows < 1) {
2777 enableWidget(false, _cmbMethodComboBox);
2778 enableWidget(false, _cmbMaxresLineEdit);
2779 enableWidget(false, _cmbSamplSpinBox);
2780 }
2781}
2782
2783//
2784////////////////////////////////////////////////////////////////////////////
2785void bncWindow::populateCmbTable() {
2786
2787 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2788 _cmbTable->removeRow(iRow);
2789 }
2790
2791 bncSettings settings;
2792
2793 int iRow = -1;
2794 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2795 while (it.hasNext()) {
2796 QStringList hlp = it.next().split(" ");
2797 if (hlp.size() > 2) {
2798 ++iRow;
2799 _cmbTable->insertRow(iRow);
2800 }
2801 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2802 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2803 }
2804 }
2805}
2806
2807//
2808////////////////////////////////////////////////////////////////////////////
2809void bncWindow::slotAddUploadRow() {
2810 int iRow = _uploadTable->rowCount();
2811 _uploadTable->insertRow(iRow);
2812 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2813 if (iCol == 3) {
2814 QComboBox* ntripversion = new QComboBox();
2815 ntripversion->setEditable(false);
2816 ntripversion->addItems(QString("1,2,2s").split(","));
2817 ntripversion->setFrame(false);
2818 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2819
2820 }
2821 else if (iCol == 4) {
2822 QLineEdit* user = new QLineEdit();
2823 user->setFrame(false);
2824 _uploadTable->setCellWidget(iRow, iCol, user);
2825 }
2826 else if (iCol == 5) {
2827 QLineEdit* passwd = new QLineEdit();
2828 passwd->setFrame(false);
2829 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2830 _uploadTable->setCellWidget(iRow, iCol, passwd);
2831 }
2832 else if (iCol == 6) {
2833 QComboBox* system = new QComboBox();
2834 system->setEditable(false);
2835 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2836 system->setFrame(false);
2837 _uploadTable->setCellWidget(iRow, iCol, system);
2838 }
2839 else if (iCol == 7) {
2840 QComboBox* format = new QComboBox();
2841 format->setEditable(false);
2842 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2843 format->setFrame(false);
2844 _uploadTable->setCellWidget(iRow, iCol, format);
2845 }
2846 else if (iCol == 8) {
2847 QCheckBox* com = new QCheckBox();
2848 _uploadTable->setCellWidget(iRow, iCol, com);
2849 }
2850 else if (iCol == 15) {
2851 bncTableItem* bncIt = new bncTableItem();
2852 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2853 _uploadTable->setItem(iRow, iCol, bncIt);
2854 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2855 }
2856 else {
2857 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2858 }
2859 }
2860}
2861
2862//
2863////////////////////////////////////////////////////////////////////////////
2864void bncWindow::slotDelUploadRow() {
2865 BNC_CORE->_uploadTableItems.clear();
2866 int nRows = _uploadTable->rowCount();
2867 bool flg[nRows];
2868 for (int iRow = 0; iRow < nRows; iRow++) {
2869 if (_uploadTable->item(iRow,1)->isSelected()) {
2870 flg[iRow] = true;
2871 }
2872 else {
2873 flg[iRow] = false;
2874 }
2875 }
2876 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2877 if (flg[iRow]) {
2878 _uploadTable->removeRow(iRow);
2879 }
2880 }
2881 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2882 BNC_CORE->_uploadTableItems[iRow] =
2883 (bncTableItem*) _uploadTable->item(iRow, 14);
2884 }
2885 nRows = _uploadTable->rowCount();
2886 if (nRows < 1) {
2887 enableWidget(false, _uploadIntrComboBox);
2888 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2889 enableWidget(false, _uploadSamplSp3SpinBox);
2890 enableWidget(false, _uploadSamplClkRnxSpinBox);
2891 enableWidget(false, _uploadAntexFile);
2892 }
2893}
2894
2895//
2896////////////////////////////////////////////////////////////////////////////
2897void bncWindow::populateUploadTable() {
2898 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2899 _uploadTable->removeRow(iRow);
2900 }
2901
2902 bncSettings settings;
2903
2904 int iRow = -1;
2905 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2906
2907 while (it.hasNext()) {
2908 QStringList hlp = it.next().split(",");
2909 if (hlp.size() > 6) {
2910 ++iRow;
2911 _uploadTable->insertRow(iRow);
2912 }
2913 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2914 if (iCol == 3) {
2915 QComboBox* ntripversion = new QComboBox();
2916 ntripversion->setEditable(false);
2917 ntripversion->addItems(QString("1,2,2s").split(","));
2918 ntripversion->setFrame(false);
2919 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
2920 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2921 }
2922 else if (iCol == 4) {
2923 QLineEdit* user = new QLineEdit();
2924 user->setFrame(false);
2925 user->setText(hlp[iCol]);
2926 _uploadTable->setCellWidget(iRow, iCol, user);
2927 }
2928 else if (iCol == 5) {
2929 QLineEdit* passwd = new QLineEdit();
2930 passwd->setFrame(false);
2931 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2932 passwd->setText(hlp[iCol]);
2933 _uploadTable->setCellWidget(iRow, iCol, passwd);
2934 }
2935 else if (iCol == 6) {
2936 QComboBox* system = new QComboBox();
2937 system->setEditable(false);
2938 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2939 system->setFrame(false);
2940 system->setCurrentIndex(system->findText(hlp[iCol]));
2941 _uploadTable->setCellWidget(iRow, iCol, system);
2942 }
2943 else if (iCol == 7) {
2944 QComboBox* format = new QComboBox();
2945 format->setEditable(false);
2946 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2947 format->setFrame(false);
2948 format->setCurrentIndex(format->findText(hlp[iCol]));
2949 _uploadTable->setCellWidget(iRow, iCol, format);
2950 }
2951 else if (iCol == 8) {
2952 QCheckBox* com = new QCheckBox();
2953 if (hlp[iCol].toInt() == Qt::Checked) {
2954 com->setCheckState(Qt::Checked);
2955 }
2956 _uploadTable->setCellWidget(iRow, iCol, com);
2957 }
2958 else if (iCol == 15) {
2959 bncTableItem* bncIt = new bncTableItem();
2960 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2961 _uploadTable->setItem(iRow, iCol, bncIt);
2962 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2963 }
2964 else {
2965 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2966 }
2967 }
2968 }
2969}
2970
2971//
2972////////////////////////////////////////////////////////////////////////////
2973void bncWindow::slotSetUploadTrafo() {
2974 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2975 dlg->exec();
2976 delete dlg;
2977}
2978
2979//
2980////////////////////////////////////////////////////////////////////////////
2981void bncWindow::slotAddUploadEphRow() {
2982 int iRow = _uploadEphTable->rowCount();
2983 _uploadEphTable->insertRow(iRow);
2984 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2985 if (iCol == 3) {
2986 QComboBox* ntripversion = new QComboBox();
2987 ntripversion->setEditable(false);
2988 ntripversion->addItems(QString("1,2,2s").split(","));
2989 ntripversion->setFrame(false);
2990 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
2991
2992 }
2993 else if (iCol == 4) {
2994 QLineEdit* user = new QLineEdit();
2995 user->setFrame(false);
2996 _uploadEphTable->setCellWidget(iRow, iCol, user);
2997 }
2998 else if (iCol == 5) {
2999 QLineEdit* passwd = new QLineEdit();
3000 passwd->setFrame(false);
3001 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3002 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3003 }
3004 else if (iCol == 6) {
3005 QLineEdit* system = new QLineEdit();
3006 system->setFrame(false);
3007 _uploadEphTable->setCellWidget(iRow, iCol, system);
3008 }
3009 else if (iCol == 7) {
3010 bncTableItem* bncIt = new bncTableItem();
3011 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3012 _uploadEphTable->setItem(iRow, iCol, bncIt);
3013 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3014 }
3015 else {
3016 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
3017 }
3018 }
3019}
3020
3021//
3022////////////////////////////////////////////////////////////////////////////
3023void bncWindow::slotDelUploadEphRow() {
3024 BNC_CORE->_uploadTableItems.clear();
3025 int nRows = _uploadEphTable->rowCount();
3026 bool flg[nRows];
3027 for (int iRow = 0; iRow < nRows; iRow++) {
3028 if (_uploadEphTable->item(iRow,1)->isSelected()) {
3029 flg[iRow] = true;
3030 }
3031 else {
3032 flg[iRow] = false;
3033 }
3034 }
3035 for (int iRow = nRows-1; iRow >= 0; iRow--) {
3036 if (flg[iRow]) {
3037 _uploadEphTable->removeRow(iRow);
3038 }
3039 }
3040 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
3041 BNC_CORE->_uploadTableItems[iRow] =
3042 (bncTableItem*) _uploadEphTable->item(iRow, 7);
3043 }
3044 nRows = _uploadEphTable->rowCount();
3045 if (nRows < 1) {
3046 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3047 }
3048}
3049
3050//
3051////////////////////////////////////////////////////////////////////////////
3052void bncWindow::populateUploadEphTable() {
3053 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3054 _uploadEphTable->removeRow(iRow);
3055 }
3056
3057 bncSettings settings;
3058
3059 int iRow = -1;
3060 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3061 while (it.hasNext()) {
3062 QStringList hlp = it.next().split(",");
3063 if (hlp.size() > 6) {
3064 ++iRow;
3065 _uploadEphTable->insertRow(iRow);
3066 }
3067 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3068 if (iCol == 3) {
3069 QComboBox* ntripversion = new QComboBox();
3070 ntripversion->setEditable(false);
3071 ntripversion->addItems(QString("1,2,2s").split(","));
3072 ntripversion->setFrame(false);
3073 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3074 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3075 }
3076 else if (iCol == 4) {
3077 QLineEdit* user = new QLineEdit();
3078 user->setFrame(false);
3079 user->setText(hlp[iCol]);
3080 _uploadEphTable->setCellWidget(iRow, iCol, user);
3081 }
3082 else if (iCol == 5) {
3083 QLineEdit* passwd = new QLineEdit();
3084 passwd->setFrame(false);
3085 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3086 passwd->setText(hlp[iCol]);
3087 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3088 }
3089 else if (iCol == 6) {
3090 QLineEdit* system = new QLineEdit();
3091 system->setFrame(false);
3092 system->setText(hlp[iCol]);
3093 _uploadEphTable->setCellWidget(iRow, iCol, system);
3094 }
3095 else if (iCol == 7) {
3096 bncTableItem* bncIt = new bncTableItem();
3097 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3098 _uploadEphTable->setItem(iRow, iCol, bncIt);
3099 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3100 }
3101 else {
3102 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3103 }
3104 }
3105 }
3106}
3107
3108
3109// Progress Bar Change
3110////////////////////////////////////////////////////////////////////////////
3111void bncWindow::slotPostProcessingProgress(int nEpo) {
3112 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3113}
3114
3115// Post-Processing Reqc Finished
3116////////////////////////////////////////////////////////////////////////////
3117void bncWindow::slotPostProcessingFinished() {
3118 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3119 _runningPPP = false;
3120 _runningEdit = false;
3121 _runningQC = false;
3122 _runningSp3Comp = false;
3123 _actStart->setText(tr("Sta&rt"));
3124 enableStartStop();
3125}
3126
3127// Edit teqc-like editing options
3128////////////////////////////////////////////////////////////////////////////
3129void bncWindow::slotReqcEditOption() {
3130 saveOptions();
3131 reqcDlg* dlg = new reqcDlg(this);
3132 dlg->move(this->pos().x()+50, this->pos().y()+50);
3133 dlg->exec();
3134 delete dlg;
3135}
3136
3137// Enable/Disable Start and Stop Buttons
3138////////////////////////////////////////////////////////////////////////////
3139void bncWindow::enableStartStop() {
3140 if ( running() ) {
3141 _actStart->setEnabled(false);
3142 if (_runningRealTime || _runningPPP) {
3143 _actStop->setEnabled(true);
3144 }
3145 }
3146 else {
3147 _actStart->setEnabled(true);
3148 _actStop->setEnabled(false);
3149 }
3150}
3151
3152// Show Map
3153////////////////////////////////////////////////////////////////////////////
3154void bncWindow::slotMapMountPoints() {
3155 saveOptions();
3156 t_bncMap* bncMap = new t_bncMap(this);
3157 bncMap->setMinimumSize(800, 600);
3158 bncMap->setWindowTitle("Selected Mountpoints");
3159
3160 bncSettings settings;
3161 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3162 while (it.hasNext()) {
3163 QStringList hlp = it.next().split(" ");
3164 if (hlp.size() < 5) continue;
3165 QUrl url(hlp[0]);
3166 double latDeg = hlp[3].toDouble();
3167 double lonDeg = hlp[4].toDouble();
3168 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3169 }
3170
3171 bncMap->show();
3172}
3173
3174// Show Map
3175////////////////////////////////////////////////////////////////////////////
3176void bncWindow::slotMapPPP() {
3177#ifdef QT_WEBENGINE
3178 saveOptions();
3179 enableWidget(false, _pppWidgets._mapWinButton);
3180 enableWidget(false, _pppWidgets._mapWinDotSize);
3181 enableWidget(false, _pppWidgets._mapWinDotColor);
3182
3183 if (!_mapWin) {
3184 _mapWin = new bncMapWin(this);
3185 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3186 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3187 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3188 }
3189 _mapWin->show();
3190#else
3191 QMessageBox::information(this, "Information",
3192 "Qt Library compiled without QT_WEBENGINE");
3193#endif
3194}
3195
3196// Show Map
3197////////////////////////////////////////////////////////////////////////////
3198void bncWindow::slotMapPPPClosed() {
3199#ifdef QT_WEBENGINE
3200 enableWidget(true, _pppWidgets._mapWinButton);
3201 enableWidget(true, _pppWidgets._mapWinDotSize);
3202 enableWidget(true, _pppWidgets._mapWinDotColor);
3203 if (_mapWin) {
3204 QListIterator<bncGetThread*> it(_threads);
3205 while (it.hasNext()) {
3206 bncGetThread* thread = it.next();
3207 thread->disconnect(_mapWin);
3208 }
3209 _mapWin->deleteLater();
3210 _mapWin = 0;
3211 }
3212#endif
3213}
Note: See TracBrowser for help on using the repository browser.