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

Last change on this file since 9774 was 9760, checked in by stuerze, 23 months ago

initial changes to consider RINEX Version 4 in future

File size: 168.7 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(" Version 2 filenames"),ir, 4);
995 pppLayout1->addWidget(_pppWidgets._v2filenames, 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(" Logfile directory"), ir, 4);
1002 pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
1003 ++ir;
1004 pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
1005 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
1006 pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
1007 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
1008 pppLayout1->addWidget(new QLabel(" NMEA directory"), ir, 4);
1009 pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
1010 ++ir;
1011 pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 0);
1012 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 1);
1013 pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 2);
1014 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 3);
1015 pppLayout1->addWidget(new QLabel(" SNX TRO directory"), ir, 4);
1016 pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
1017 ++ir;
1018#ifdef USE_PPP
1019 pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
1020 pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
1021#endif
1022 pppLayout1->addWidget(new QLabel(" SNX TRO interval"), ir, 4);
1023 pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
1024 pppLayout1->addWidget(new QLabel(" SNX TRO sampling"), ir, 6);
1025 pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
1026 ++ir;
1027 pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
1028 pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
1029 pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
1030 pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
1031 pppLayout1->addWidget(new QLabel(" SNX TRO AC"), ir, 4);
1032 pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
1033 pppLayout1->addWidget(new QLabel(" SNX TRO solution"), ir, 6);
1034 pppLayout1->addWidget(_pppWidgets._snxtroSol, ir, 7, Qt::AlignRight);
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);
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);
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.</p>"));
1467 _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file.</p>"));
1468 _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file.</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.</p>"));
1470 _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.</p>"));
1471 _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.</p>"));
1472 _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.</p>"));
1473 _pppWidgets._v2filenames->setWhatsThis(tr("<p>Tick 'Version 2 filenames' to let BNC create filenames for PPP logfiles , NMEA files and SINEX Troposphere files following the RINEX Version 2 standard.</p><p>Default is an empty check box, meaning to create filenames following the RINEX Version 3 standard. The file content is not affected by this option. It only concerns the filenames.</p>"));
1474 _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 logfiles shall be produced.</p>"));
1475 _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.</p>"));
1476 _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.</p>"));
1477 _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'.</p>"));
1478 _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters.</p>"));
1479 _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files.</p>"));
1480 _pppWidgets._snxtroSol->setWhatsThis(tr("<p>Specify a 4-character solution ID to allow a distingtion between different solutions per AC.</p>"));
1481 _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.</p>"));
1482
1483 // WhatsThis, PPP (3)
1484 // ------------------
1485 _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>"));
1486 _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>"));
1487 _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>"));
1488 _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>"));
1489 _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>"));
1490 _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>"));
1491 _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>"));
1492 _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>"));
1493 _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>"));
1494 _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>"));
1495 _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>"));
1496 _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>"));
1497 _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>"));
1498 _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>"));
1499 _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>"));
1500 _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>"));
1501
1502 // WhatsThis, Combine Corrections
1503 // ------------------------------
1504 _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>"));
1505 addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
1506 delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
1507 _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>"));
1508 _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>"));
1509 _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>"));
1510 _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. <i>[key: cmbGps]</i></p>"));
1511 _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
1512 _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
1513 _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
1514 _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
1515 _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
1516 _cmbIrnssCheckBox->setWhatsThis(tr("<p>IRNSS clock corrections shall be combined; IRNSS Broadcast ephemeris and corrections are required. <i>[key: cmbIrnss]</i></p>"));
1517 _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>"));
1518
1519 // WhatsThis, Upload Corrections
1520 // -----------------------------
1521 _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>"));
1522 addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
1523 delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
1524 _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
1525 _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>"));
1526 _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>"));
1527 _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>"));
1528 _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>"));
1529 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>"));
1530 _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>"));
1531
1532 // WhatsThis, Upload Ephemeris
1533 // ---------------------------
1534 _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>"));
1535 addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
1536 delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
1537 _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>"));
1538
1539 // WhatsThis, Streams Canvas
1540 // -------------------------
1541 _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>"));
1542 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1543 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1544 _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>"));
1545 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1546 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1547
1548 // WhatsThis, Log Canvas
1549 // ---------------------
1550 _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>"));
1551 _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>"));
1552 _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>"));
1553 _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>"));
1554
1555
1556 // Enable/Disable all Widgets
1557 // --------------------------
1558 slotBncTextChanged();
1559 enableStartStop();
1560
1561 // Auto start
1562 // ----------
1563 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1564 slotStart();
1565 }
1566}
1567
1568// Destructor
1569////////////////////////////////////////////////////////////////////////////
1570bncWindow::~bncWindow() {
1571 if (_caster) {
1572 delete _caster; BNC_CORE->setCaster(0);
1573 }
1574 if (_casterEph) {
1575 delete _casterEph;
1576 }
1577 delete _bncFigureLate;
1578 delete _bncFigurePPP;
1579 delete _actHelp;
1580 delete _actAbout;
1581 delete _actFlowchart;
1582 delete _actFontSel;
1583 delete _actSaveOpt;
1584 delete _actQuit;
1585 delete _actAddMountPoints;
1586 delete _actDeleteMountPoints;
1587 delete _actMapMountPoints;
1588 delete _actStart;
1589 delete _actStop;
1590 delete _actwhatsthis;
1591 delete _proxyHostLineEdit;
1592 delete _proxyPortLineEdit;
1593 delete _sslCaCertPathLineEdit;
1594 delete _sslIgnoreErrorsCheckBox;
1595 delete _logFileLineEdit;
1596 delete _rawOutFileLineEdit;
1597 delete _rnxAppendCheckBox;
1598 delete _onTheFlyComboBox;
1599 delete _autoStartCheckBox;
1600 delete _rnxPathLineEdit;
1601 delete _rnxIntrComboBox;
1602 delete _rnxSamplComboBox;
1603 delete _rnxSkelExtComboBox;
1604 delete _rnxSkelPathLineEdit;
1605 delete _rnxFileCheckBox;
1606 delete _rnxScrpLineEdit;
1607 delete _rnxVersComboBox;
1608 delete _rnxV2Priority;
1609 delete _ephPathLineEdit;
1610 delete _ephIntrComboBox;
1611 delete _ephOutPortLineEdit;
1612 delete _ephVersComboBox;
1613 delete _corrPathLineEdit;
1614 delete _corrIntrComboBox;
1615 delete _corrPortLineEdit;
1616 delete _outPortLineEdit;
1617 delete _outWaitSpinBox;
1618 delete _outSamplComboBox;
1619 delete _outFileLineEdit;
1620 delete _outUPortLineEdit;
1621 delete _outLockTimeCheckBox;
1622 delete _serialMountPointLineEdit;
1623 delete _serialPortNameLineEdit;
1624 delete _serialBaudRateComboBox;
1625 delete _serialFlowControlComboBox;
1626 delete _serialDataBitsComboBox;
1627 delete _serialParityComboBox;
1628 delete _serialStopBitsComboBox;
1629 delete _serialAutoNMEAComboBox;
1630 delete _serialFileNMEALineEdit;
1631 delete _serialHeightNMEALineEdit;
1632 delete _serialManualNMEASamplingSpinBox;
1633 delete _adviseObsRateComboBox;
1634 delete _adviseFailSpinBox;
1635 delete _adviseRecoSpinBox;
1636 delete _adviseScriptLineEdit;
1637 delete _miscMountLineEdit;
1638 delete _miscPortLineEdit;
1639 delete _miscIntrComboBox;
1640 delete _miscScanRTCMCheckBox;
1641 _mountPointsTable->deleteLater();
1642 delete _log;
1643 delete _loggroup;
1644 _cmbTable->deleteLater();
1645 delete _cmbMaxresLineEdit;
1646 delete _cmbSamplSpinBox;
1647 delete _cmbMethodComboBox;
1648 delete _cmbGpsCheckBox;
1649 delete _cmbGloCheckBox;
1650 delete _cmbGalCheckBox;
1651 delete _cmbBdsCheckBox;
1652 delete _cmbQzssCheckBox;
1653 delete _cmbSbasCheckBox;
1654 delete _cmbIrnssCheckBox;
1655 delete _cmbBsxFile;
1656 _uploadEphTable->deleteLater();
1657 delete _uploadSamplRtcmEphCorrSpinBox;
1658 _uploadTable->deleteLater();
1659 delete _uploadIntrComboBox;
1660 delete _uploadAntexFile;
1661 delete _uploadSamplRtcmEphSpinBox;
1662 delete _uploadSamplSp3SpinBox;
1663 delete _uploadSamplClkRnxSpinBox;
1664 delete _uploadSamplBiaSnxSpinBox;
1665 delete _reqcActionComboBox;
1666 delete _reqcObsFileChooser;
1667 delete _reqcNavFileChooser;
1668 delete _reqcOutObsLineEdit;
1669 delete _reqcOutNavLineEdit;
1670 delete _reqcOutLogLineEdit;
1671 delete _reqcPlotDirLineEdit;
1672 delete _reqcSkyPlotSignals;
1673 delete _reqcLogSummaryOnly;
1674 delete _reqcEditOptionButton;
1675 delete _sp3CompFileChooser;
1676 delete _sp3CompExclude;
1677 delete _sp3CompLogLineEdit;
1678 //delete _canvas;
1679}
1680
1681//
1682////////////////////////////////////////////////////////////////////////////
1683void bncWindow::populateMountPointsTable() {
1684
1685 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1686 _mountPointsTable->removeRow(iRow);
1687 }
1688
1689 bncSettings settings;
1690
1691 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1692 int iRow = 0;
1693 while (it.hasNext()) {
1694 QStringList hlp = it.next().split(" ");
1695 if (hlp.size() < 7) continue;
1696 _mountPointsTable->insertRow(iRow);
1697
1698 QUrl url(hlp[0]);
1699
1700 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1701 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1702 QString nmea(hlp[5]);
1703 if (hlp[6] == "S") {
1704 fullPath = hlp[0].replace(0,2,"");
1705 }
1706 QString ntripVersion = "2";
1707 if (hlp.size() >= 7) {
1708 ntripVersion = (hlp[6]);
1709 }
1710
1711 QTableWidgetItem* it;
1712 it = new QTableWidgetItem(url.userInfo());
1713 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1714 _mountPointsTable->setItem(iRow, 0, it);
1715
1716 it = new QTableWidgetItem(fullPath);
1717 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1718 _mountPointsTable->setItem(iRow, 1, it);
1719
1720 it = new QTableWidgetItem(format);
1721 _mountPointsTable->setItem(iRow, 2, it);
1722
1723 it = new QTableWidgetItem(country);
1724 _mountPointsTable->setItem(iRow, 3, it);
1725
1726 if (nmea == "yes") {
1727 it = new QTableWidgetItem(latitude);
1728 _mountPointsTable->setItem(iRow, 4, it);
1729 it = new QTableWidgetItem(longitude);
1730 _mountPointsTable->setItem(iRow, 5, it);
1731 } else {
1732 it = new QTableWidgetItem(latitude);
1733 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1734 _mountPointsTable->setItem(iRow, 4, it);
1735
1736 it = new QTableWidgetItem(longitude);
1737 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1738 _mountPointsTable->setItem(iRow, 5, it);
1739 }
1740
1741 it = new QTableWidgetItem(nmea);
1742 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1743 _mountPointsTable->setItem(iRow, 6, it);
1744
1745 it = new QTableWidgetItem(ntripVersion);
1746 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1747 _mountPointsTable->setItem(iRow, 7, it);
1748
1749 bncTableItem* bncIt = new bncTableItem();
1750 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1751 _mountPointsTable->setItem(iRow, 8, bncIt);
1752
1753 iRow++;
1754 }
1755
1756 _mountPointsTable->sortItems(1);
1757
1758 enableStartStop();
1759}
1760
1761// Retrieve Table
1762////////////////////////////////////////////////////////////////////////////
1763void bncWindow::slotAddMountPoints() {
1764
1765 bncSettings settings;
1766 QString proxyHost = settings.value("proxyHost").toString();
1767 int proxyPort = settings.value("proxyPort").toInt();
1768 if (proxyHost != _proxyHostLineEdit->text() ||
1769 proxyPort != _proxyPortLineEdit->text().toInt()) {
1770 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1771 "changed. Use the new ones?",
1772 QMessageBox::Yes, QMessageBox::No,
1773 QMessageBox::NoButton);
1774 if (iRet == QMessageBox::Yes) {
1775 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1776 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1777 }
1778 }
1779
1780 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1781 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
1782
1783 QMessageBox msgBox;
1784 msgBox.setIcon(QMessageBox::Question);
1785 msgBox.setWindowTitle("Add Stream");
1786 msgBox.setText("Add stream(s) coming from:");
1787
1788 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1789 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1790 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1791 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1792 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1793
1794 msgBox.exec();
1795
1796 if (msgBox.clickedButton() == buttonNtrip) {
1797 bncTableDlg* dlg = new bncTableDlg(this);
1798 dlg->move(this->pos().x()+50, this->pos().y()+50);
1799 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1800 this, SLOT(slotNewMountPoints(QStringList*)));
1801 dlg->exec();
1802 delete dlg;
1803 } else if (msgBox.clickedButton() == buttonIP) {
1804 bncIpPort* ipp = new bncIpPort(this);
1805 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1806 this, SLOT(slotNewMountPoints(QStringList*)));
1807 ipp->exec();
1808 delete ipp;
1809 } else if (msgBox.clickedButton() == buttonUDP) {
1810 bncUdpPort* udp = new bncUdpPort(this);
1811 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1812 this, SLOT(slotNewMountPoints(QStringList*)));
1813 udp->exec();
1814 delete udp;
1815 } else if (msgBox.clickedButton() == buttonSerial) {
1816 bncSerialPort* sep = new bncSerialPort(this);
1817 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1818 this, SLOT(slotNewMountPoints(QStringList*)));
1819 sep->exec();
1820 delete sep;
1821 } else if (msgBox.clickedButton() == buttonCancel) {
1822 // Cancel
1823 }
1824
1825 enableStartStop();
1826}
1827
1828// Delete Selected Mount Points
1829////////////////////////////////////////////////////////////////////////////
1830void bncWindow::slotDeleteMountPoints() {
1831
1832 int nRows = _mountPointsTable->rowCount();
1833 bool flg[nRows];
1834 for (int iRow = 0; iRow < nRows; iRow++) {
1835 if (_mountPointsTable->item(iRow,1)->isSelected()) {
1836 flg[iRow] = true;
1837 }
1838 else {
1839 flg[iRow] = false;
1840 }
1841 }
1842 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1843 if (flg[iRow]) {
1844 _mountPointsTable->removeRow(iRow);
1845 }
1846 }
1847 _actDeleteMountPoints->setEnabled(false);
1848
1849 enableStartStop();
1850}
1851
1852// New Mount Points Selected
1853////////////////////////////////////////////////////////////////////////////
1854void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1855 int iRow = 0;
1856 QListIterator<QString> it(*mountPoints);
1857 while (it.hasNext()) {
1858 QStringList hlp = it.next().split(" ");
1859 QUrl url(hlp[0]);
1860 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1861 QString format(hlp[1]); QString country(hlp[2]); QString latitude(hlp[3]); QString longitude(hlp[4]);
1862 QString nmea(hlp[5]);
1863 if (hlp[6] == "S") {
1864 fullPath = hlp[0].replace(0,2,"");
1865 }
1866 QString ntripVersion = "2";
1867 if (hlp.size() >= 7) {
1868 ntripVersion = (hlp[6]);
1869 }
1870
1871 _mountPointsTable->insertRow(iRow);
1872
1873 QTableWidgetItem* it;
1874 it = new QTableWidgetItem(url.userInfo());
1875 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1876 _mountPointsTable->setItem(iRow, 0, it);
1877
1878 it = new QTableWidgetItem(fullPath);
1879 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1880 _mountPointsTable->setItem(iRow, 1, it);
1881
1882 it = new QTableWidgetItem(format);
1883 _mountPointsTable->setItem(iRow, 2, it);
1884
1885 it = new QTableWidgetItem(country);
1886 _mountPointsTable->setItem(iRow, 3, it);
1887
1888 if (nmea == "yes") {
1889 it = new QTableWidgetItem(latitude);
1890 _mountPointsTable->setItem(iRow, 4, it);
1891 it = new QTableWidgetItem(longitude);
1892 _mountPointsTable->setItem(iRow, 5, it);
1893 } else {
1894 it = new QTableWidgetItem(latitude);
1895 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1896 _mountPointsTable->setItem(iRow, 4, it);
1897 it = new QTableWidgetItem(longitude);
1898 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1899 _mountPointsTable->setItem(iRow, 5, it);
1900 }
1901
1902 it = new QTableWidgetItem(nmea);
1903 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1904 _mountPointsTable->setItem(iRow, 6, it);
1905
1906 it = new QTableWidgetItem(ntripVersion);
1907 ////it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1908 _mountPointsTable->setItem(iRow, 7, it);
1909
1910 bncTableItem* bncIt = new bncTableItem();
1911 _mountPointsTable->setItem(iRow, 8, bncIt);
1912
1913 iRow++;
1914 }
1915 _mountPointsTable->hideColumn(0);
1916 _mountPointsTable->hideColumn(3);
1917 _mountPointsTable->sortItems(1);
1918 delete mountPoints;
1919
1920 enableStartStop();
1921}
1922
1923// Save Options (serialize)
1924////////////////////////////////////////////////////////////////////////////
1925void bncWindow::slotSaveOptions() {
1926 saveOptions();
1927 bncSettings settings;
1928 settings.sync();
1929}
1930
1931// Save Options (memory only)
1932////////////////////////////////////////////////////////////////////////////
1933void bncWindow::saveOptions() {
1934
1935 QStringList mountPoints;
1936 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1937
1938 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1939 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1940 "@" + _mountPointsTable->item(iRow, 1)->text() );
1941
1942 mountPoints.append(url.toString() + " " +
1943 _mountPointsTable->item(iRow, 2)->text()
1944 + " " + _mountPointsTable->item(iRow, 3)->text()
1945 + " " + _mountPointsTable->item(iRow, 4)->text()
1946 + " " + _mountPointsTable->item(iRow, 5)->text()
1947 + " " + _mountPointsTable->item(iRow, 6)->text()
1948 + " " + _mountPointsTable->item(iRow, 7)->text());
1949 } else {
1950 mountPoints.append(
1951 "//" + _mountPointsTable->item(iRow, 1)->text()
1952 + " " + _mountPointsTable->item(iRow, 2)->text()
1953 + " " + _mountPointsTable->item(iRow, 3)->text()
1954 + " " + _mountPointsTable->item(iRow, 4)->text()
1955 + " " + _mountPointsTable->item(iRow, 5)->text()
1956 + " " + _mountPointsTable->item(iRow, 6)->text()
1957 + " " + _mountPointsTable->item(iRow, 7)->text());
1958 }
1959 }
1960
1961 QStringList cmbStreams;
1962 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1963 QString hlp;
1964 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1965 if (_cmbTable->item(iRow, iCol)) {
1966 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1967 }
1968 }
1969 if (!hlp.isEmpty()) {
1970 cmbStreams << hlp;
1971 }
1972 }
1973
1974 QStringList uploadMountpointsOut;
1975 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1976 QString hlp;
1977 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1978 if (_uploadTable->cellWidget(iRow, iCol) &&
1979 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
1980 if (iCol == 3) {
1981 QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1982 hlp += ntripversion->currentText() + ",";
1983 }
1984 else if (iCol == 4 ) {
1985 QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1986 hlp += user->text() + ",";
1987 }
1988 else if (iCol == 5) {
1989 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1990 hlp += passwd->text() + ",";
1991 }
1992 else if (iCol == 6) {
1993 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1994 hlp += system->currentText() + ",";
1995 }
1996 else if (iCol == 7) {
1997 QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1998 hlp += format->currentText() + ",";
1999 }
2000 else if (iCol == 8) {
2001 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
2002 QString state; state.setNum(com->checkState());
2003 hlp += state + ",";
2004 }
2005 }
2006 else if (_uploadTable->item(iRow, iCol)) {
2007 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
2008 }
2009 }
2010 if (!hlp.isEmpty()) {
2011 uploadMountpointsOut << hlp;
2012 }
2013 }
2014
2015 QStringList uploadEphMountpointsOut;
2016 for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
2017 QString hlp;
2018 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2019 if (_uploadEphTable->cellWidget(iRow, iCol) &&
2020 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
2021 if (iCol == 3) {
2022 QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
2023 hlp += ntripversion->currentText() + ",";
2024 }
2025 else if (iCol == 4 ) {
2026 QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2027 hlp += user->text() + ",";
2028 }
2029 else if (iCol == 5) {
2030 QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2031 hlp += passwd->text() + ",";
2032 }
2033 else if (iCol == 6) {
2034 QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
2035 hlp += system->text() + ",";
2036 }
2037 }
2038 else if (_uploadEphTable->item(iRow, iCol)) {
2039 hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
2040 }
2041 }
2042 if (!hlp.isEmpty()) {
2043 uploadEphMountpointsOut << hlp;
2044 }
2045 }
2046
2047 bncSettings settings;
2048
2049 settings.setValue("startTab", _aogroup->currentIndex());
2050 settings.setValue("statusTab", _loggroup->currentIndex());
2051 settings.setValue("mountPoints", mountPoints);
2052// Network
2053 settings.setValue("proxyHost", _proxyHostLineEdit->text());
2054 settings.setValue("proxyPort", _proxyPortLineEdit->text());
2055 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
2056 settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
2057// General
2058 settings.setValue("logFile", _logFileLineEdit->text());
2059 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
2060 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
2061 settings.setValue("autoStart", _autoStartCheckBox->checkState());
2062 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
2063// RINEX Observations
2064 settings.setValue("rnxPath", _rnxPathLineEdit->text());
2065 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
2066 settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
2067 settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
2068 settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
2069 settings.setValue("rnxOnlyWithSKL",_rnxFileCheckBox->checkState());
2070 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
2071 settings.setValue("rnxV2Priority",_rnxV2Priority->text());
2072 settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
2073// RINEX Ephemeris
2074 settings.setValue("ephPath", _ephPathLineEdit->text());
2075 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
2076 settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
2077 settings.setValue("ephVersion", _ephVersComboBox->currentText());
2078// Broadcast Corrections
2079 settings.setValue("corrPath", _corrPathLineEdit->text());
2080 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
2081 settings.setValue("corrPort", _corrPortLineEdit->text());
2082// Feed Engine
2083 settings.setValue("outPort", _outPortLineEdit->text());
2084 settings.setValue("outWait", _outWaitSpinBox->value());
2085 settings.setValue("outSampl", _outSamplComboBox->currentText());
2086 settings.setValue("outFile", _outFileLineEdit->text());
2087 settings.setValue("outLockTime",_outLockTimeCheckBox->checkState()); settings.setValue("outUPort", _outUPortLineEdit->text());
2088// Serial Output
2089 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
2090 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
2091 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
2092 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
2093 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
2094 settings.setValue("serialParity", _serialParityComboBox->currentText());
2095 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
2096 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
2097 settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
2098 settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
2099 settings.setValue("serialManualNMEASampling", _serialManualNMEASamplingSpinBox->value());
2100// Outages
2101 settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
2102 settings.setValue("adviseFail", _adviseFailSpinBox->value());
2103 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
2104 settings.setValue("adviseScript", _adviseScriptLineEdit->text());
2105// Miscellaneous
2106 settings.setValue("miscMount", _miscMountLineEdit->text());
2107 settings.setValue("miscPort", _miscPortLineEdit->text());
2108 settings.setValue("miscIntr", _miscIntrComboBox->currentText());
2109 settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
2110// Reqc
2111 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
2112 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
2113 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
2114 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
2115 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
2116 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
2117 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
2118 settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
2119 settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
2120// SP3 Comparison
2121 settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
2122 settings.setValue("sp3CompExclude", _sp3CompExclude->text());
2123 settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
2124// Combine Corrections
2125 if (!cmbStreams.isEmpty()) {
2126 settings.setValue("cmbStreams", cmbStreams);
2127 }
2128 else {
2129 settings.setValue("cmbStreams", "");
2130 }
2131 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
2132 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
2133 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
2134 settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
2135 settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
2136 settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
2137 settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
2138 settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
2139 settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
2140 settings.setValue("cmbIrnss", _cmbIrnssCheckBox->checkState());
2141 settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
2142
2143// Upload Corrections
2144 if (!uploadMountpointsOut.isEmpty()) {
2145 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
2146 }
2147 else {
2148 settings.setValue("uploadMountpointsOut", "");
2149 }
2150 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
2151 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
2152 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
2153 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
2154 settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
2155 settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
2156// Upload Ephemeris
2157 if (!uploadEphMountpointsOut.isEmpty()) {
2158 settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
2159 }
2160 else {
2161 settings.setValue("uploadEphMountpointsOut", "");
2162 }
2163 settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
2164
2165 if (_caster) {
2166 _caster->readMountPoints();
2167 }
2168
2169 _pppWidgets.saveOptions();
2170}
2171
2172// All get slots terminated
2173////////////////////////////////////////////////////////////////////////////
2174void bncWindow::slotGetThreadsFinished() {
2175 BNC_CORE->slotMessage("All Get Threads Terminated", true);
2176 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2177 delete _casterEph; _casterEph = 0;
2178 _runningRealTime = false;
2179}
2180
2181// Start It!
2182////////////////////////////////////////////////////////////////////////////
2183void bncWindow::slotStart() {
2184 saveOptions();
2185 if ( _pppWidgets._dataSource->currentText() == "RINEX Files") {
2186 _runningPPP = true;
2187 enableStartStop();
2188 _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
2189 BNC_CORE->startPPP();
2190 _bncFigurePPP->reset();
2191 }
2192 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
2193 if (_reqcActionComboBox->currentText() == "Analyze") {
2194 _runningQC = true;
2195 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2196 connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2197 reqcAnalyze->start();
2198 }
2199 else {
2200 _runningEdit = true;
2201 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2202 connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2203 reqcEdit->start();
2204 }
2205 enableStartStop();
2206 }
2207 else if (!_sp3CompFileChooser->fileName().isEmpty()) {
2208 _runningSp3Comp = true;
2209 t_sp3Comp* sp3Comp = new t_sp3Comp(this);
2210 connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
2211 sp3Comp->start();
2212 enableStartStop();
2213 }
2214 else {
2215 startRealTime();
2216 BNC_CORE->startPPP();
2217 }
2218}
2219
2220// Start Real-Time (Retrieve Data etc.)
2221////////////////////////////////////////////////////////////////////////////
2222void bncWindow::startRealTime() {
2223
2224 _runningRealTime = true;
2225
2226 _bncFigurePPP->reset();
2227
2228 _actDeleteMountPoints->setEnabled(false);
2229
2230 enableStartStop();
2231
2232 _caster = new bncCaster();
2233
2234 BNC_CORE->setCaster(_caster);
2235 BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
2236 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2237 BNC_CORE->initCombination();
2238
2239 connect(_caster, SIGNAL(getThreadsFinished()),
2240 this, SLOT(slotGetThreadsFinished()));
2241
2242 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
2243 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2244
2245 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
2246
2247 bncSettings settings;
2248
2249 // Active panels
2250 // -------------
2251 if (!_rnxPathLineEdit->text().isEmpty())
2252 BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
2253 if (!_ephPathLineEdit->text().isEmpty())
2254 BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
2255 if (!_corrPathLineEdit->text().isEmpty())
2256 BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
2257 if (!_outPortLineEdit->text().isEmpty())
2258 BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
2259 if (!_serialMountPointLineEdit->text().isEmpty())
2260 BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
2261 if (!_adviseObsRateComboBox->currentText().isEmpty())
2262 BNC_CORE->slotMessage("Panel 'Outages' active", true);
2263 if (!_miscMountLineEdit->text().isEmpty())
2264 BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
2265 if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
2266 BNC_CORE->slotMessage("Panel 'PPP' active", true);
2267 if (_cmbTable->rowCount() > 0)
2268 BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
2269 if (_uploadTable->rowCount() > 0)
2270 BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
2271 if (_uploadEphTable->rowCount() > 0)
2272 BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
2273
2274 QDir rnxdir(settings.value("rnxPath").toString());
2275 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2276
2277 QString rnx_file = settings.value("rnxScript").toString();
2278 if ( !rnx_file.isEmpty() ) {
2279 QFile rnxfile(settings.value("rnxScript").toString());
2280 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2281 }
2282
2283 QDir ephdir(settings.value("ephPath").toString());
2284 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2285
2286 QDir corrdir(settings.value("corrPath").toString());
2287 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2288
2289 QString advise_file = settings.value("adviseScript").toString();
2290 if ( !advise_file.isEmpty() ) {
2291 QFile advisefile(settings.value("adviseScript").toString());
2292 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2293 }
2294
2295 _caster->readMountPoints();
2296
2297 _casterEph = new bncEphUploadCaster();
2298}
2299
2300// Retrieve Data
2301////////////////////////////////////////////////////////////////////////////
2302void bncWindow::slotStop() {
2303 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
2304 QMessageBox::Yes, QMessageBox::No,
2305 QMessageBox::NoButton);
2306 if (iRet == QMessageBox::Yes) {
2307 BNC_CORE->stopPPP();
2308 BNC_CORE->stopCombination();
2309 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
2310 delete _casterEph; _casterEph = 0;
2311 _runningRealTime = false;
2312 _runningPPP = false;
2313 enableStartStop();
2314 }
2315}
2316
2317// Close Application gracefully
2318////////////////////////////////////////////////////////////////////////////
2319void bncWindow::closeEvent(QCloseEvent* event) {
2320
2321 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2322 QMessageBox::Yes, QMessageBox::No,
2323 QMessageBox::Cancel);
2324
2325 if (iRet == QMessageBox::Cancel) {
2326 event->ignore();
2327 return;
2328 }
2329 else if (iRet == QMessageBox::Yes) {
2330 slotSaveOptions();
2331 }
2332
2333 BNC_CORE->stopPPP();
2334
2335 QMainWindow::closeEvent(event);
2336}
2337
2338// User changed the selection of mountPoints
2339////////////////////////////////////////////////////////////////////////////
2340void bncWindow::slotSelectionChanged() {
2341 if (_mountPointsTable->selectedItems().isEmpty()) {
2342 _actDeleteMountPoints->setEnabled(false);
2343 }
2344 else {
2345 _actDeleteMountPoints->setEnabled(true);
2346 }
2347}
2348
2349// Display Program Messages
2350////////////////////////////////////////////////////////////////////////////
2351void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2352 if (showOnScreen ) {
2353 _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
2354 }
2355}
2356
2357// About Message
2358////////////////////////////////////////////////////////////////////////////
2359void bncWindow::slotAbout() {
2360 new bncAboutDlg(0);
2361}
2362
2363//Flowchart
2364////////////////////////////////////////////////////////////////////////////
2365void bncWindow::slotFlowchart() {
2366 new bncFlowchartDlg(0);
2367}
2368
2369// Help Window
2370////////////////////////////////////////////////////////////////////////////
2371void bncWindow::slotHelp() {
2372 QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
2373 new bncHlpDlg(0, url);
2374}
2375
2376// Select Fonts
2377////////////////////////////////////////////////////////////////////////////
2378void bncWindow::slotFontSel() {
2379 bool ok;
2380 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2381 if (ok) {
2382 bncSettings settings;
2383 settings.setValue("font", newFont.toString());
2384 QApplication::setFont(newFont);
2385 int ww = QFontMetrics(newFont).width('w');
2386 setMinimumSize(60*ww, 80*ww);
2387 resize(60*ww, 80*ww);
2388 }
2389}
2390
2391// Whats This Help
2392void bncWindow::slotWhatsThis() {
2393 QWhatsThis::enterWhatsThisMode();
2394}
2395
2396//
2397////////////////////////////////////////////////////////////////////////////
2398void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2399 _threads = threads;
2400
2401 _bncFigure->updateMountPoints();
2402 _bncFigureLate->updateMountPoints();
2403
2404 populateMountPointsTable();
2405 bncSettings settings;
2406 _outSamplComboBox->findText(settings.value("outSampl").toString());
2407 _outWaitSpinBox->setValue(settings.value("outWait").toInt());
2408 QListIterator<bncGetThread*> iTh(threads);
2409 while (iTh.hasNext()) {
2410 bncGetThread* thread = iTh.next();
2411 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2412 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2413 "@" + _mountPointsTable->item(iRow, 1)->text() );
2414 if (url == thread->mountPoint() &&
2415 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
2416 _mountPointsTable->item(iRow, 5)->text() == thread->longitude() ) {
2417 ((bncTableItem*) _mountPointsTable->item(iRow, 8))->setGetThread(thread);
2418 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2419 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2420 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2421 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2422 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2423 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2424 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2425 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2426 break;
2427 }
2428 }
2429 }
2430}
2431
2432//
2433////////////////////////////////////////////////////////////////////////////
2434void bncWindow::CreateMenu() {
2435 // Create Menus
2436 // ------------
2437 _menuFile = menuBar()->addMenu(tr("&File"));
2438 _menuFile->addAction(_actFontSel);
2439 _menuFile->addSeparator();
2440 _menuFile->addAction(_actSaveOpt);
2441 _menuFile->addSeparator();
2442 _menuFile->addAction(_actQuit);
2443
2444 _menuHlp = menuBar()->addMenu(tr("&Help"));
2445 _menuHlp->addAction(_actHelp);
2446 _menuHlp->addAction(_actFlowchart);
2447 _menuHlp->addAction(_actAbout);
2448}
2449
2450// Toolbar
2451////////////////////////////////////////////////////////////////////////////
2452void bncWindow::AddToolbar() {
2453 QToolBar* toolBar = new QToolBar;
2454 addToolBar(Qt::BottomToolBarArea, toolBar);
2455 toolBar->setMovable(false);
2456 toolBar->addAction(_actAddMountPoints);
2457 toolBar->addAction(_actDeleteMountPoints);
2458 toolBar->addAction(_actMapMountPoints);
2459 toolBar->addAction(_actStart);
2460 toolBar->addAction(_actStop);
2461 toolBar->addWidget(new QLabel(" "));
2462 toolBar->addAction(_actwhatsthis);
2463}
2464
2465// About
2466////////////////////////////////////////////////////////////////////////////
2467bncAboutDlg::bncAboutDlg(QWidget* parent) :
2468 QDialog(parent) {
2469
2470 QTextBrowser* tb = new QTextBrowser;
2471 QUrl url = QUrl::fromLocalFile(":/bncabout.html");
2472 tb->setSource(url);
2473 tb->setReadOnly(true);
2474
2475 int ww = QFontMetrics(font()).width('w');
2476 QPushButton* _closeButton = new QPushButton("Close");
2477 _closeButton->setMaximumWidth(10*ww);
2478 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2479
2480 QGridLayout* dlgLayout = new QGridLayout();
2481 QLabel* img = new QLabel();
2482 img->setPixmap(QPixmap(":ntrip-logo.png"));
2483 dlgLayout->addWidget(img, 0,0);
2484 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0,1);
2485 dlgLayout->addWidget(tb,1,0,1,2);
2486 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2487
2488 setLayout(dlgLayout);
2489 resize(60*ww, 60*ww);
2490 setWindowTitle("About BNC");
2491 show();
2492}
2493
2494//
2495////////////////////////////////////////////////////////////////////////////
2496bncAboutDlg::~bncAboutDlg() {
2497
2498};
2499
2500// Flowchart
2501////////////////////////////////////////////////////////////////////////////
2502bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2503 QDialog(parent) {
2504
2505 int ww = QFontMetrics(font()).width('w');
2506 QPushButton* _closeButton = new QPushButton("Close");
2507 _closeButton->setMaximumWidth(10*ww);
2508 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2509
2510 QGridLayout* dlgLayout = new QGridLayout();
2511 QLabel* img = new QLabel();
2512 img->setPixmap(QPixmap(":bncflowchart.png"));
2513 dlgLayout->addWidget(img, 0,0);
2514 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2515
2516 setLayout(dlgLayout);
2517 setWindowTitle("Flow Chart");
2518 show();
2519}
2520
2521//
2522////////////////////////////////////////////////////////////////////////////
2523bncFlowchartDlg::~bncFlowchartDlg() {
2524};
2525
2526// Enable/Disable Widget (and change its color)
2527////////////////////////////////////////////////////////////////////////////
2528void bncWindow::enableWidget(bool enable, QWidget* widget) {
2529
2530 const static QPalette paletteWhite(QColor(255, 255, 255));
2531 const static QPalette paletteGray(QColor(230, 230, 230));
2532
2533 widget->setEnabled(enable);
2534 if (enable) {
2535 widget->setPalette(paletteWhite);
2536 }
2537 else {
2538 widget->setPalette(paletteGray);
2539 }
2540}
2541
2542// Bnc Text
2543////////////////////////////////////////////////////////////////////////////
2544void bncWindow::slotBncTextChanged(){
2545
2546 const static QPalette paletteWhite(QColor(255, 255, 255));
2547 const static QPalette paletteGray(QColor(230, 230, 230));
2548
2549 bool enable = true;
2550
2551 // Proxy
2552 //------
2553 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2554 enable = !_proxyHostLineEdit->text().isEmpty();
2555 enableWidget(enable, _proxyPortLineEdit);
2556 }
2557
2558 // RINEX Observations
2559 // ------------------
2560 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2561 enable = !_rnxPathLineEdit->text().isEmpty();
2562 enableWidget(enable, _rnxIntrComboBox);
2563 enableWidget(enable, _rnxSamplComboBox);
2564 enableWidget(enable, _rnxSkelExtComboBox);
2565 enableWidget(enable, _rnxSkelPathLineEdit);
2566 enableWidget(enable, _rnxFileCheckBox);
2567 enableWidget(enable, _rnxScrpLineEdit);
2568 enableWidget(enable, _rnxV2Priority);
2569 enableWidget(enable, _rnxVersComboBox);
2570
2571 bool enable1 = true;
2572 enable1 = _rnxVersComboBox->currentText() == "2";
2573 if (enable && enable1) {
2574 enableWidget(true, _rnxV2Priority);
2575 }
2576 if (enable && !enable1) {
2577 enableWidget(false, _rnxV2Priority);
2578 }
2579 }
2580
2581 // RINEX Observations, Signal Priority
2582 // -----------------------------------
2583 if (sender() == 0 || sender() == _rnxVersComboBox) {
2584 if (!_rnxPathLineEdit->text().isEmpty()) {
2585 enableWidget(enable, _rnxIntrComboBox);
2586 enable = _rnxVersComboBox->currentText() == "2";
2587 enableWidget(enable, _rnxV2Priority);
2588 }
2589 }
2590
2591 // RINEX Ephemeris
2592 // ---------------
2593 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
2594 enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
2595 enableWidget(enable, _ephIntrComboBox);
2596 enableWidget(enable, _ephVersComboBox);
2597 }
2598
2599 // Broadcast Corrections
2600 // ---------------------
2601 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2602 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2603 enableWidget(enable, _corrIntrComboBox);
2604 }
2605
2606 // Feed Engine
2607 // -----------
2608 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2609 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2610 enableWidget(enable, _outWaitSpinBox);
2611 enableWidget(enable, _outSamplComboBox);
2612 }
2613
2614 // Serial Output
2615 // -------------
2616 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2617 sender() == _serialAutoNMEAComboBox) {
2618 enable = !_serialMountPointLineEdit->text().isEmpty();
2619 enableWidget(enable, _serialPortNameLineEdit);
2620 enableWidget(enable, _serialBaudRateComboBox);
2621 enableWidget(enable, _serialParityComboBox);
2622 enableWidget(enable, _serialDataBitsComboBox);
2623 enableWidget(enable, _serialStopBitsComboBox);
2624 enableWidget(enable, _serialFlowControlComboBox);
2625 enableWidget(enable, _serialAutoNMEAComboBox);
2626 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() == "Auto";
2627 enableWidget(enable2, _serialFileNMEALineEdit);
2628 bool enable3 = enable && _serialAutoNMEAComboBox->currentText().contains("Manual");
2629 enableWidget(enable3, _serialHeightNMEALineEdit);
2630 enableWidget(enable3, _serialManualNMEASamplingSpinBox);
2631 }
2632
2633 // Outages
2634 // -------
2635 if (sender() == 0 || sender() == _adviseObsRateComboBox) {
2636 enable = !_adviseObsRateComboBox->currentText().isEmpty();
2637 enableWidget(enable, _adviseFailSpinBox);
2638 enableWidget(enable, _adviseRecoSpinBox);
2639 enableWidget(enable, _adviseScriptLineEdit);
2640 }
2641
2642 // Miscellaneous
2643 // -------------
2644 if (sender() == 0 || sender() == _miscMountLineEdit) {
2645 enable = !_miscMountLineEdit->text().isEmpty();
2646 enableWidget(enable, _miscIntrComboBox);
2647 enableWidget(enable, _miscScanRTCMCheckBox);
2648 enableWidget(enable, _miscPortLineEdit);
2649 }
2650
2651 // Combine Corrections
2652 // -------------------
2653 if (sender() == 0 || sender() == _cmbTable) {
2654 int iRow = _cmbTable->rowCount();
2655 if (iRow > 0) {
2656 enableWidget(true, _cmbMethodComboBox);
2657 enableWidget(true, _cmbMaxresLineEdit);
2658 enableWidget(true, _cmbSamplSpinBox);
2659 enableWidget(true, _cmbGpsCheckBox);
2660 enableWidget(true, _cmbGloCheckBox);
2661 enableWidget(true, _cmbGalCheckBox);
2662 enableWidget(true, _cmbBdsCheckBox);
2663 enableWidget(true, _cmbQzssCheckBox);
2664 enableWidget(true, _cmbSbasCheckBox);
2665 enableWidget(true, _cmbIrnssCheckBox);
2666 enableWidget(true, _cmbBsxFile);
2667 }
2668 else {
2669 enableWidget(false, _cmbMethodComboBox);
2670 enableWidget(false, _cmbMaxresLineEdit);
2671 enableWidget(false, _cmbSamplSpinBox);
2672 enableWidget(false, _cmbGpsCheckBox);
2673 enableWidget(false, _cmbGloCheckBox);
2674 enableWidget(false, _cmbGalCheckBox);
2675 enableWidget(false, _cmbBdsCheckBox);
2676 enableWidget(false, _cmbQzssCheckBox);
2677 enableWidget(false, _cmbSbasCheckBox);
2678 enableWidget(false, _cmbIrnssCheckBox);
2679 enableWidget(false, _cmbBsxFile);
2680 }
2681 }
2682
2683 // Upload(clk)
2684 // -----------
2685 int iRow = _uploadTable->rowCount();
2686 if (iRow > 0) {
2687 enableWidget(true, _uploadIntrComboBox);
2688 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2689 enableWidget(true, _uploadSamplClkRnxSpinBox);
2690 enableWidget(true, _uploadSamplBiaSnxSpinBox);
2691 enableWidget(true, _uploadSamplSp3SpinBox);
2692 enableWidget(true, _uploadAntexFile);
2693 }
2694 else {
2695 enableWidget(false, _uploadIntrComboBox);
2696 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2697 enableWidget(false, _uploadSamplClkRnxSpinBox);
2698 enableWidget(false, _uploadSamplBiaSnxSpinBox);
2699 enableWidget(false, _uploadSamplSp3SpinBox);
2700 enableWidget(false, _uploadAntexFile);
2701 }
2702
2703 // Upload(eph)
2704 // -----------
2705 iRow = _uploadEphTable->rowCount();
2706 if (iRow > 0) {
2707 enableWidget(true, _uploadSamplRtcmEphSpinBox);
2708 }
2709 else {
2710 enableWidget(false, _uploadSamplRtcmEphSpinBox);
2711 }
2712
2713 // QC
2714 // --
2715 if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
2716 enable = !_reqcActionComboBox->currentText().isEmpty();
2717 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2718// bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
2719 enableWidget(enable, _reqcObsFileChooser);
2720 enableWidget(enable, _reqcNavFileChooser);
2721 enableWidget(enable, _reqcOutLogLineEdit);
2722 enableWidget(enable && enable10, _reqcEditOptionButton);
2723 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2724 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2725 enableWidget(enable && !enable10, _reqcLogSummaryOnly);
2726 enableWidget(enable && !enable10, _reqcSkyPlotSignals);
2727// enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
2728 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2729 }
2730
2731 // SP3 File Comparison
2732 // -------------------
2733 if (sender() == 0 || sender() == _sp3CompFileChooser) {
2734 enable = !_sp3CompFileChooser->fileName().isEmpty();
2735 enableWidget(enable, _sp3CompLogLineEdit);
2736 enableWidget(enable, _sp3CompExclude);
2737 }
2738
2739 enableStartStop();
2740}
2741
2742//
2743////////////////////////////////////////////////////////////////////////////
2744void bncWindow::slotAddCmbRow() {
2745 int iRow = _cmbTable->rowCount();
2746 _cmbTable->insertRow(iRow);
2747 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2748 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2749 }
2750}
2751
2752//
2753////////////////////////////////////////////////////////////////////////////
2754void bncWindow::slotDelCmbRow() {
2755
2756 const static QPalette paletteWhite(QColor(255, 255, 255));
2757 const static QPalette paletteGray(QColor(230, 230, 230));
2758
2759 int nRows = _cmbTable->rowCount();
2760 bool flg[nRows];
2761 for (int iRow = 0; iRow < nRows; iRow++) {
2762 if (_cmbTable->item(iRow,1)->isSelected()) {
2763 flg[iRow] = true;
2764 }
2765 else {
2766 flg[iRow] = false;
2767 }
2768 }
2769 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2770 if (flg[iRow]) {
2771 _cmbTable->removeRow(iRow);
2772 }
2773 }
2774 nRows = _cmbTable->rowCount();
2775 if (nRows < 1) {
2776 enableWidget(false, _cmbMethodComboBox);
2777 enableWidget(false, _cmbMaxresLineEdit);
2778 enableWidget(false, _cmbSamplSpinBox);
2779 }
2780}
2781
2782//
2783////////////////////////////////////////////////////////////////////////////
2784void bncWindow::populateCmbTable() {
2785
2786 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2787 _cmbTable->removeRow(iRow);
2788 }
2789
2790 bncSettings settings;
2791
2792 int iRow = -1;
2793 QListIterator<QString> it(settings.value("cmbStreams").toStringList());
2794 while (it.hasNext()) {
2795 QStringList hlp = it.next().split(" ");
2796 if (hlp.size() > 2) {
2797 ++iRow;
2798 _cmbTable->insertRow(iRow);
2799 }
2800 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2801 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2802 }
2803 }
2804}
2805
2806//
2807////////////////////////////////////////////////////////////////////////////
2808void bncWindow::slotAddUploadRow() {
2809 int iRow = _uploadTable->rowCount();
2810 _uploadTable->insertRow(iRow);
2811 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2812 if (iCol == 3) {
2813 QComboBox* ntripversion = new QComboBox();
2814 ntripversion->setEditable(false);
2815 ntripversion->addItems(QString("1,2,2s").split(","));
2816 ntripversion->setFrame(false);
2817 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2818
2819 }
2820 else if (iCol == 4) {
2821 QLineEdit* user = new QLineEdit();
2822 user->setFrame(false);
2823 _uploadTable->setCellWidget(iRow, iCol, user);
2824 }
2825 else if (iCol == 5) {
2826 QLineEdit* passwd = new QLineEdit();
2827 passwd->setFrame(false);
2828 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2829 _uploadTable->setCellWidget(iRow, iCol, passwd);
2830 }
2831 else if (iCol == 6) {
2832 QComboBox* system = new QComboBox();
2833 system->setEditable(false);
2834 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2835 system->setFrame(false);
2836 _uploadTable->setCellWidget(iRow, iCol, system);
2837 }
2838 else if (iCol == 7) {
2839 QComboBox* format = new QComboBox();
2840 format->setEditable(false);
2841 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2842 format->setFrame(false);
2843 _uploadTable->setCellWidget(iRow, iCol, format);
2844 }
2845 else if (iCol == 8) {
2846 QCheckBox* com = new QCheckBox();
2847 _uploadTable->setCellWidget(iRow, iCol, com);
2848 }
2849 else if (iCol == 15) {
2850 bncTableItem* bncIt = new bncTableItem();
2851 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2852 _uploadTable->setItem(iRow, iCol, bncIt);
2853 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2854 }
2855 else {
2856 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2857 }
2858 }
2859}
2860
2861//
2862////////////////////////////////////////////////////////////////////////////
2863void bncWindow::slotDelUploadRow() {
2864 BNC_CORE->_uploadTableItems.clear();
2865 int nRows = _uploadTable->rowCount();
2866 bool flg[nRows];
2867 for (int iRow = 0; iRow < nRows; iRow++) {
2868 if (_uploadTable->item(iRow,1)->isSelected()) {
2869 flg[iRow] = true;
2870 }
2871 else {
2872 flg[iRow] = false;
2873 }
2874 }
2875 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2876 if (flg[iRow]) {
2877 _uploadTable->removeRow(iRow);
2878 }
2879 }
2880 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2881 BNC_CORE->_uploadTableItems[iRow] =
2882 (bncTableItem*) _uploadTable->item(iRow, 14);
2883 }
2884 nRows = _uploadTable->rowCount();
2885 if (nRows < 1) {
2886 enableWidget(false, _uploadIntrComboBox);
2887 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2888 enableWidget(false, _uploadSamplSp3SpinBox);
2889 enableWidget(false, _uploadSamplClkRnxSpinBox);
2890 enableWidget(false, _uploadAntexFile);
2891 }
2892}
2893
2894//
2895////////////////////////////////////////////////////////////////////////////
2896void bncWindow::populateUploadTable() {
2897 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2898 _uploadTable->removeRow(iRow);
2899 }
2900
2901 bncSettings settings;
2902
2903 int iRow = -1;
2904 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2905
2906 while (it.hasNext()) {
2907 QStringList hlp = it.next().split(",");
2908 if (hlp.size() > 6) {
2909 ++iRow;
2910 _uploadTable->insertRow(iRow);
2911 }
2912 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2913 if (iCol == 3) {
2914 QComboBox* ntripversion = new QComboBox();
2915 ntripversion->setEditable(false);
2916 ntripversion->addItems(QString("1,2,2s").split(","));
2917 ntripversion->setFrame(false);
2918 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
2919 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
2920 }
2921 else if (iCol == 4) {
2922 QLineEdit* user = new QLineEdit();
2923 user->setFrame(false);
2924 user->setText(hlp[iCol]);
2925 _uploadTable->setCellWidget(iRow, iCol, user);
2926 }
2927 else if (iCol == 5) {
2928 QLineEdit* passwd = new QLineEdit();
2929 passwd->setFrame(false);
2930 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2931 passwd->setText(hlp[iCol]);
2932 _uploadTable->setCellWidget(iRow, iCol, passwd);
2933 }
2934 else if (iCol == 6) {
2935 QComboBox* system = new QComboBox();
2936 system->setEditable(false);
2937 system->addItems(QString("IGS14,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
2938 system->setFrame(false);
2939 system->setCurrentIndex(system->findText(hlp[iCol]));
2940 _uploadTable->setCellWidget(iRow, iCol, system);
2941 }
2942 else if (iCol == 7) {
2943 QComboBox* format = new QComboBox();
2944 format->setEditable(false);
2945 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
2946 format->setFrame(false);
2947 format->setCurrentIndex(format->findText(hlp[iCol]));
2948 _uploadTable->setCellWidget(iRow, iCol, format);
2949 }
2950 else if (iCol == 8) {
2951 QCheckBox* com = new QCheckBox();
2952 if (hlp[iCol].toInt() == Qt::Checked) {
2953 com->setCheckState(Qt::Checked);
2954 }
2955 _uploadTable->setCellWidget(iRow, iCol, com);
2956 }
2957 else if (iCol == 15) {
2958 bncTableItem* bncIt = new bncTableItem();
2959 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2960 _uploadTable->setItem(iRow, iCol, bncIt);
2961 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2962 }
2963 else {
2964 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2965 }
2966 }
2967 }
2968}
2969
2970//
2971////////////////////////////////////////////////////////////////////////////
2972void bncWindow::slotSetUploadTrafo() {
2973 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2974 dlg->exec();
2975 delete dlg;
2976}
2977
2978//
2979////////////////////////////////////////////////////////////////////////////
2980void bncWindow::slotAddUploadEphRow() {
2981 int iRow = _uploadEphTable->rowCount();
2982 _uploadEphTable->insertRow(iRow);
2983 for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
2984 if (iCol == 3) {
2985 QComboBox* ntripversion = new QComboBox();
2986 ntripversion->setEditable(false);
2987 ntripversion->addItems(QString("1,2,2s").split(","));
2988 ntripversion->setFrame(false);
2989 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
2990
2991 }
2992 else if (iCol == 4) {
2993 QLineEdit* user = new QLineEdit();
2994 user->setFrame(false);
2995 _uploadEphTable->setCellWidget(iRow, iCol, user);
2996 }
2997 else if (iCol == 5) {
2998 QLineEdit* passwd = new QLineEdit();
2999 passwd->setFrame(false);
3000 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3001 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3002 }
3003 else if (iCol == 6) {
3004 QLineEdit* system = new QLineEdit();
3005 system->setFrame(false);
3006 _uploadEphTable->setCellWidget(iRow, iCol, system);
3007 }
3008 else if (iCol == 7) {
3009 bncTableItem* bncIt = new bncTableItem();
3010 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3011 _uploadEphTable->setItem(iRow, iCol, bncIt);
3012 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3013 }
3014 else {
3015 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
3016 }
3017 }
3018}
3019
3020//
3021////////////////////////////////////////////////////////////////////////////
3022void bncWindow::slotDelUploadEphRow() {
3023 BNC_CORE->_uploadTableItems.clear();
3024 int nRows = _uploadEphTable->rowCount();
3025 bool flg[nRows];
3026 for (int iRow = 0; iRow < nRows; iRow++) {
3027 if (_uploadEphTable->item(iRow,1)->isSelected()) {
3028 flg[iRow] = true;
3029 }
3030 else {
3031 flg[iRow] = false;
3032 }
3033 }
3034 for (int iRow = nRows-1; iRow >= 0; iRow--) {
3035 if (flg[iRow]) {
3036 _uploadEphTable->removeRow(iRow);
3037 }
3038 }
3039 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
3040 BNC_CORE->_uploadTableItems[iRow] =
3041 (bncTableItem*) _uploadEphTable->item(iRow, 7);
3042 }
3043 nRows = _uploadEphTable->rowCount();
3044 if (nRows < 1) {
3045 enableWidget(false, _uploadSamplRtcmEphSpinBox);
3046 }
3047}
3048
3049//
3050////////////////////////////////////////////////////////////////////////////
3051void bncWindow::populateUploadEphTable() {
3052 for (int iRow = _uploadEphTable->rowCount()-1; iRow >=0; iRow--) {
3053 _uploadEphTable->removeRow(iRow);
3054 }
3055
3056 bncSettings settings;
3057
3058 int iRow = -1;
3059 QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
3060 while (it.hasNext()) {
3061 QStringList hlp = it.next().split(",");
3062 if (hlp.size() > 6) {
3063 ++iRow;
3064 _uploadEphTable->insertRow(iRow);
3065 }
3066 for (int iCol = 0; iCol < hlp.size(); iCol++) {
3067 if (iCol == 3) {
3068 QComboBox* ntripversion = new QComboBox();
3069 ntripversion->setEditable(false);
3070 ntripversion->addItems(QString("1,2,2s").split(","));
3071 ntripversion->setFrame(false);
3072 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
3073 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
3074 }
3075 else if (iCol == 4) {
3076 QLineEdit* user = new QLineEdit();
3077 user->setFrame(false);
3078 user->setText(hlp[iCol]);
3079 _uploadEphTable->setCellWidget(iRow, iCol, user);
3080 }
3081 else if (iCol == 5) {
3082 QLineEdit* passwd = new QLineEdit();
3083 passwd->setFrame(false);
3084 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
3085 passwd->setText(hlp[iCol]);
3086 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
3087 }
3088 else if (iCol == 6) {
3089 QLineEdit* system = new QLineEdit();
3090 system->setFrame(false);
3091 system->setText(hlp[iCol]);
3092 _uploadEphTable->setCellWidget(iRow, iCol, system);
3093 }
3094 else if (iCol == 7) {
3095 bncTableItem* bncIt = new bncTableItem();
3096 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
3097 _uploadEphTable->setItem(iRow, iCol, bncIt);
3098 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
3099 }
3100 else {
3101 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
3102 }
3103 }
3104 }
3105}
3106
3107
3108// Progress Bar Change
3109////////////////////////////////////////////////////////////////////////////
3110void bncWindow::slotPostProcessingProgress(int nEpo) {
3111 _actStart->setText(QString("%1 Epochs").arg(nEpo));
3112}
3113
3114// Post-Processing Reqc Finished
3115////////////////////////////////////////////////////////////////////////////
3116void bncWindow::slotPostProcessingFinished() {
3117 delete _caster; _caster = 0; BNC_CORE->setCaster(0);
3118 _runningPPP = false;
3119 _runningEdit = false;
3120 _runningQC = false;
3121 _runningSp3Comp = false;
3122 _actStart->setText(tr("Sta&rt"));
3123 enableStartStop();
3124}
3125
3126// Edit teqc-like editing options
3127////////////////////////////////////////////////////////////////////////////
3128void bncWindow::slotReqcEditOption() {
3129 saveOptions();
3130 reqcDlg* dlg = new reqcDlg(this);
3131 dlg->move(this->pos().x()+50, this->pos().y()+50);
3132 dlg->exec();
3133 delete dlg;
3134}
3135
3136// Enable/Disable Start and Stop Buttons
3137////////////////////////////////////////////////////////////////////////////
3138void bncWindow::enableStartStop() {
3139 if ( running() ) {
3140 _actStart->setEnabled(false);
3141 if (_runningRealTime || _runningPPP) {
3142 _actStop->setEnabled(true);
3143 }
3144 }
3145 else {
3146 _actStart->setEnabled(true);
3147 _actStop->setEnabled(false);
3148 }
3149}
3150
3151// Show Map
3152////////////////////////////////////////////////////////////////////////////
3153void bncWindow::slotMapMountPoints() {
3154 saveOptions();
3155 t_bncMap* bncMap = new t_bncMap(this);
3156 bncMap->setMinimumSize(800, 600);
3157 bncMap->setWindowTitle("Selected Mountpoints");
3158
3159 bncSettings settings;
3160 QListIterator<QString> it(settings.value("mountPoints").toStringList());
3161 while (it.hasNext()) {
3162 QStringList hlp = it.next().split(" ");
3163 if (hlp.size() < 5) continue;
3164 QUrl url(hlp[0]);
3165 double latDeg = hlp[3].toDouble();
3166 double lonDeg = hlp[4].toDouble();
3167 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
3168 }
3169
3170 bncMap->show();
3171}
3172
3173// Show Map
3174////////////////////////////////////////////////////////////////////////////
3175void bncWindow::slotMapPPP() {
3176#ifdef QT_WEBENGINE
3177 saveOptions();
3178 enableWidget(false, _pppWidgets._mapWinButton);
3179 enableWidget(false, _pppWidgets._mapWinDotSize);
3180 enableWidget(false, _pppWidgets._mapWinDotColor);
3181
3182 if (!_mapWin) {
3183 _mapWin = new bncMapWin(this);
3184 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
3185 connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
3186 _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
3187 }
3188 _mapWin->show();
3189#else
3190 QMessageBox::information(this, "Information",
3191 "Qt Library compiled without QT_WEBENGINE");
3192#endif
3193}
3194
3195// Show Map
3196////////////////////////////////////////////////////////////////////////////
3197void bncWindow::slotMapPPPClosed() {
3198#ifdef QT_WEBENGINE
3199 enableWidget(true, _pppWidgets._mapWinButton);
3200 enableWidget(true, _pppWidgets._mapWinDotSize);
3201 enableWidget(true, _pppWidgets._mapWinDotColor);
3202 if (_mapWin) {
3203 QListIterator<bncGetThread*> it(_threads);
3204 while (it.hasNext()) {
3205 bncGetThread* thread = it.next();
3206 thread->disconnect(_mapWin);
3207 }
3208 _mapWin->deleteLater();
3209 _mapWin = 0;
3210 }
3211#endif
3212}
Note: See TracBrowser for help on using the repository browser.