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

Last change on this file since 4791 was 4791, checked in by mervart, 11 years ago
File size: 148.0 KB
Line 
1// Part of BNC, a utility for retrieving decoding and
2// converting GNSS data streams from NTRIP broadcasters.
3//
4// Copyright (C) 2007
5// German Federal Agency for Cartography and Geodesy (BKG)
6// http://www.bkg.bund.de
7// Czech Technical University Prague, Department of Geodesy
8// http://www.fsv.cvut.cz
9//
10// Email: euref-ip@bkg.bund.de
11//
12// This program is free software; you can redistribute it and/or
13// modify it under the terms of the GNU General Public License
14// as published by the Free Software Foundation, version 2.
15//
16// This program is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program; if not, write to the Free Software
23// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24
25/* -------------------------------------------------------------------------
26 * BKG NTRIP Client
27 * -------------------------------------------------------------------------
28 *
29 * Class: bncWindow
30 *
31 * Purpose: This class implements the main application window.
32 *
33 * Author: L. Mervart
34 *
35 * Created: 24-Dec-2005
36 *
37 * Changes:
38 *
39 * -----------------------------------------------------------------------*/
40
41#include <iostream>
42
43#include <unistd.h>
44#include "bncwindow.h"
45#include "bncapp.h"
46#include "bncgetthread.h"
47#include "bnctabledlg.h"
48#include "bncipport.h"
49#include "bncudpport.h"
50#include "bncserialport.h"
51#include "bnchlpdlg.h"
52#include "bnchtml.h"
53#include "bnctableitem.h"
54#include "bncsettings.h"
55#include "bncfigure.h"
56#include "bncfigurelate.h"
57#include "bncfigureppp.h"
58#include "bncversion.h"
59#include "bncbytescounter.h"
60#include "bncsslconfig.h"
61#include "upload/bnccustomtrafo.h"
62#include "upload/bncephuploadcaster.h"
63#include "qtfilechooser.h"
64#include "reqcdlg.h"
65#include "bncmap.h"
66#ifdef USE_POSTPROCESSING
67# include "rinex/bncpostprocess.h"
68# include "rinex/reqcedit.h"
69# include "rinex/reqcanalyze.h"
70#endif
71
72using namespace std;
73
74// Constructor
75////////////////////////////////////////////////////////////////////////////
76bncWindow::bncWindow() {
77
78 _caster = 0;
79 _casterEph = 0;
80
81 _bncFigure = new bncFigure(this);
82 _bncFigureLate = new bncFigureLate(this);
83 _bncFigurePPP = new bncFigurePPP(this);
84 _runningRealTime = false;
85 _runningPostProcessingPPP = false;
86 _runningPostProcessingReqc = false;
87
88 _pppSPPComboBox = 0; // necessary for enableStartStop()
89 _reqcActionComboBox = 0; // necessary for enableStartStop()
90
91 int ww = QFontMetrics(this->font()).width('w');
92
93 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
94
95 setMinimumSize(85*ww, 65*ww);
96
97 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
98
99 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
100 this, SLOT(slotWindowMessage(QByteArray,bool)));
101
102 // Create Actions
103 // --------------
104 _actHelp = new QAction(tr("&Help Contents"),this);
105 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
106
107 _actAbout = new QAction(tr("&About BNC"),this);
108 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
109
110 _actFlowchart = new QAction(tr("&Flow Chart"),this);
111 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
112
113 _actFontSel = new QAction(tr("Select &Font"),this);
114 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
115
116 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
117 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
118
119 _actQuit = new QAction(tr("&Quit"),this);
120 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
121
122 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
123 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
124
125 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
126 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
127 _actDeleteMountPoints->setEnabled(false);
128
129 _actMap = new QAction(tr("&Map"),this);
130 connect(_actMap, SIGNAL(triggered()), SLOT(slotMap()));
131
132 _actStart = new QAction(tr("Sta&rt"),this);
133 connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
134
135 _actStop = new QAction(tr("Sto&p"),this);
136 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
137
138 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
139 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
140
141 CreateMenu();
142 AddToolbar();
143
144 bncSettings settings;
145
146 // Network Options
147 // ---------------
148 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
149 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
150
151 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
152 this, SLOT(slotBncTextChanged()));
153
154 _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
155 _ignoreSslErrorsCheckBox = new QCheckBox();
156 _ignoreSslErrorsCheckBox->setCheckState(Qt::CheckState(
157 settings.value("ignoreSslErrors").toInt()));
158
159 // General Options
160 // ---------------
161 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
162 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
163 _rnxAppendCheckBox = new QCheckBox();
164 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
165 settings.value("rnxAppend").toInt()));
166 _onTheFlyComboBox = new QComboBox();
167 _onTheFlyComboBox->setEditable(false);
168 _onTheFlyComboBox->addItems(QString("1 day,1 hour,5 min,1 min").split(","));
169 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
170 if (ii != -1) {
171 _onTheFlyComboBox->setCurrentIndex(ii);
172 }
173 _autoStartCheckBox = new QCheckBox();
174 _autoStartCheckBox->setCheckState(Qt::CheckState(
175 settings.value("autoStart").toInt()));
176
177 // RINEX Observations Options
178 // --------------------------
179 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
180 _rnxIntrComboBox = new QComboBox();
181 _rnxIntrComboBox->setEditable(false);
182 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
183 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
184 if (ii != -1) {
185 _rnxIntrComboBox->setCurrentIndex(ii);
186 }
187 _rnxSamplSpinBox = new QSpinBox();
188 _rnxSamplSpinBox->setMinimum(0);
189 _rnxSamplSpinBox->setMaximum(60);
190 _rnxSamplSpinBox->setSingleStep(5);
191 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
192 _rnxSamplSpinBox->setSuffix(" sec");
193 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
194 _rnxSkelLineEdit->setMaximumWidth(5*ww);
195 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
196 _rnxV3CheckBox = new QCheckBox();
197 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
198
199 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
200 this, SLOT(slotBncTextChanged()));
201
202 // RINEX Ephemeris Options
203 // -----------------------
204 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
205 _ephIntrComboBox = new QComboBox();
206 _ephIntrComboBox->setEditable(false);
207 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
208 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
209 if (jj != -1) {
210 _ephIntrComboBox->setCurrentIndex(jj);
211 }
212 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
213 _ephV3CheckBox = new QCheckBox();
214 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
215
216 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
217 this, SLOT(slotBncTextChanged()));
218
219 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
220 this, SLOT(slotBncTextChanged()));
221
222 // Broadcast Corrections Options
223 // -----------------------------
224 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
225 _corrIntrComboBox = new QComboBox();
226 _corrIntrComboBox->setEditable(false);
227 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
228 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
229 if (mm != -1) {
230 _corrIntrComboBox->setCurrentIndex(mm);
231 }
232 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
233 _corrTimeSpinBox = new QSpinBox();
234 _corrTimeSpinBox->setMinimum(0);
235 _corrTimeSpinBox->setMaximum(60);
236 _corrTimeSpinBox->setSingleStep(1);
237 _corrTimeSpinBox->setSuffix(" sec");
238 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
239
240 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
241 this, SLOT(slotBncTextChanged()));
242
243 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
244 this, SLOT(slotBncTextChanged()));
245
246 // Feed Engine Options
247 // -------------------
248 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
249 _waitTimeSpinBox = new QSpinBox();
250 _waitTimeSpinBox->setMinimum(1);
251 _waitTimeSpinBox->setMaximum(30);
252 _waitTimeSpinBox->setSingleStep(1);
253 _waitTimeSpinBox->setSuffix(" sec");
254 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
255 _binSamplSpinBox = new QSpinBox();
256 _binSamplSpinBox->setMinimum(0);
257 _binSamplSpinBox->setMaximum(60);
258 _binSamplSpinBox->setSingleStep(5);
259 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
260 _binSamplSpinBox->setSuffix(" sec");
261 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
262 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
263
264 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
265 this, SLOT(slotBncTextChanged()));
266
267 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
268 this, SLOT(slotBncTextChanged()));
269
270 // Serial Output Options
271 // ---------------------
272 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
273 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
274 _serialBaudRateComboBox = new QComboBox();
275 _serialBaudRateComboBox->addItems(QString("110,300,600,"
276 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
277 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
278 if (kk != -1) {
279 _serialBaudRateComboBox->setCurrentIndex(kk);
280 }
281 _serialFlowControlComboBox = new QComboBox();
282 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
283 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
284 if (kk != -1) {
285 _serialFlowControlComboBox->setCurrentIndex(kk);
286 }
287 _serialDataBitsComboBox = new QComboBox();
288 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
289 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
290 if (kk != -1) {
291 _serialDataBitsComboBox->setCurrentIndex(kk);
292 }
293 _serialParityComboBox = new QComboBox();
294 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
295 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
296 if (kk != -1) {
297 _serialParityComboBox->setCurrentIndex(kk);
298 }
299 _serialStopBitsComboBox = new QComboBox();
300 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
301 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
302 if (kk != -1) {
303 _serialStopBitsComboBox->setCurrentIndex(kk);
304 }
305 _serialAutoNMEAComboBox = new QComboBox();
306 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
307 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
308 if (kk != -1) {
309 _serialAutoNMEAComboBox->setCurrentIndex(kk);
310 }
311 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
312 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
313
314 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
315 this, SLOT(slotBncTextChanged()));
316
317 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
318 this, SLOT(slotBncTextChanged()));
319
320 // Outages Options
321 // ---------------
322 _obsRateComboBox = new QComboBox();
323 _obsRateComboBox->setEditable(false);
324 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
325 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
326 if (kk != -1) {
327 _obsRateComboBox->setCurrentIndex(kk);
328 }
329 _adviseFailSpinBox = new QSpinBox();
330 _adviseFailSpinBox->setMinimum(0);
331 _adviseFailSpinBox->setMaximum(60);
332 _adviseFailSpinBox->setSingleStep(1);
333 _adviseFailSpinBox->setSuffix(" min");
334 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
335 _adviseRecoSpinBox = new QSpinBox();
336 _adviseRecoSpinBox->setMinimum(0);
337 _adviseRecoSpinBox->setMaximum(60);
338 _adviseRecoSpinBox->setSingleStep(1);
339 _adviseRecoSpinBox->setSuffix(" min");
340 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
341 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
342
343 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
344 this, SLOT(slotBncTextChanged()));
345
346 // Miscellaneous Options
347 // ---------------------
348 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
349 _perfIntrComboBox = new QComboBox();
350 _perfIntrComboBox->setEditable(false);
351 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
352 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
353 if (ll != -1) {
354 _perfIntrComboBox->setCurrentIndex(ll);
355 }
356 _scanRTCMCheckBox = new QCheckBox();
357 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
358 settings.value("scanRTCM").toInt()));
359
360 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
361 this, SLOT(slotBncTextChanged()));
362
363 // PPP Options
364 // -----------
365 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
366 _pppMountLineEdit->setMaximumWidth(8*ww);
367 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
368 _pppMountLineEdit->setMinimumWidth(8*ww);
369 _pppCorrMountLineEdit->setMinimumWidth(8*ww);
370 _pppCorrMountLineEdit->setMaximumWidth(8*ww);
371 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
372 _pppNMEALineEdit->setMinimumWidth(15*ww);
373 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
374 _pppNMEAPortLineEdit->setMaximumWidth(8*ww);
375 _pppNMEAPortLineEdit->setMinimumWidth(8*ww);
376 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
377 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
378 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
379 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
380 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
381 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
382 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
383 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
384 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
385 _pppAudioResponseLineEdit = new QLineEdit(settings.value("pppAudioResponse").toString());
386 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
387 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
388 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
389 _pppRefdNLineEdit = new QLineEdit(settings.value("pppRefdN").toString());
390 _pppRefdELineEdit = new QLineEdit(settings.value("pppRefdE").toString());
391 _pppRefdULineEdit = new QLineEdit(settings.value("pppRefdU").toString());
392 _pppSync = new QLineEdit(settings.value("pppSync").toString());
393 _pppAntexFileChooser = new qtFileChooser;
394 _pppAntexFileChooser->setMinimumWidth(12*ww);
395 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
396 _pppAntexFileChooser->setFileName(settings.value("pppAntex").toString());
397
398 _pppSPPComboBox = new QComboBox();
399 _pppSPPComboBox->setEditable(false);
400 _pppSPPComboBox->addItems(QString(",Realtime-PPP,Realtime-SPP,Post-Processing").split(","));
401 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
402 if (ik != -1) {
403 _pppSPPComboBox->setCurrentIndex(ik);
404 }
405 _pppUsePhaseCheckBox = new QCheckBox();
406 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
407 settings.value("pppUsePhase").toInt()));
408 _pppEstTropoCheckBox = new QCheckBox();
409 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
410 settings.value("pppEstTropo").toInt()));
411 _pppGLONASSCheckBox = new QCheckBox();
412 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
413 settings.value("pppGLONASS").toInt()));
414 _pppGalileoCheckBox = new QCheckBox();
415 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
416 settings.value("pppGalileo").toInt()));
417
418 _pppPlotCoordinates = new QCheckBox();
419 _pppPlotCoordinates->setCheckState(Qt::CheckState(
420 settings.value("pppPlotCoordinates").toInt()));
421
422 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
423 this, SLOT(slotBncTextChanged()));
424
425 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
426 this, SLOT(slotBncTextChanged()));
427
428 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
429 this, SLOT(slotBncTextChanged()));
430
431 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
432 this, SLOT(slotBncTextChanged()));
433 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
434 this, SLOT(slotBncTextChanged()));
435 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
436 this, SLOT(slotBncTextChanged()));
437 connect(_pppRefdNLineEdit, SIGNAL(textChanged(const QString &)),
438 this, SLOT(slotBncTextChanged()));
439 connect(_pppRefdELineEdit, SIGNAL(textChanged(const QString &)),
440 this, SLOT(slotBncTextChanged()));
441 connect(_pppRefdULineEdit, SIGNAL(textChanged(const QString &)),
442 this, SLOT(slotBncTextChanged()));
443
444 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
445 this, SLOT(slotBncTextChanged()));
446
447 connect(_pppSync, SIGNAL(textChanged(const QString &)),
448 this, SLOT(slotBncTextChanged()));
449
450 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
451 this, SLOT(slotBncTextChanged()));
452
453 connect(_pppAntexFileChooser, SIGNAL(fileNameChanged(const QString &)),
454 this, SLOT(slotBncTextChanged()));
455
456 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
457 this, SLOT(slotBncTextChanged()));
458
459 // Streams
460 // -------
461 _mountPointsTable = new QTableWidget(0,8);
462
463 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
464 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
465 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
466 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
467 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
468 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
469 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
470 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
471 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
472_mountPointsTable->setHorizontalHeaderLabels(labels);
473 _mountPointsTable->setGridStyle(Qt::NoPen);
474 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
475 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
476 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
477 _mountPointsTable->hideColumn(0);
478 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
479 SLOT(slotSelectionChanged()));
480 populateMountPointsTable();
481
482 _log = new QTextBrowser();
483 _log->setReadOnly(true);
484
485 // Combine Corrections
486 // -------------------
487 _cmbTable = new QTableWidget(0,3);
488 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
489 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
490 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
491 _cmbTable->setMaximumWidth(30*ww);
492 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
493 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
494 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
495 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
496 _cmbTable->horizontalHeader()->setStretchLastSection(true);
497 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
498
499 _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
500
501 _cmbSamplSpinBox = new QSpinBox;
502 _cmbSamplSpinBox->setMinimum(10);
503 _cmbSamplSpinBox->setMaximum(60);
504 _cmbSamplSpinBox->setSingleStep(10);
505 _cmbSamplSpinBox->setMaximumWidth(9*ww);
506 _cmbSamplSpinBox->setValue(settings.value("cmbSampl").toInt());
507 _cmbSamplSpinBox->setSuffix(" sec");
508
509 QPushButton* addCmbRowButton = new QPushButton("Add Row");
510 QPushButton* delCmbRowButton = new QPushButton("Delete");
511
512 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
513 SLOT(slotBncTextChanged()));
514
515 _cmbMethodComboBox = new QComboBox();
516 _cmbMethodComboBox->setEditable(false);
517 _cmbMethodComboBox->addItems(QString("Filter,Single-Epoch").split(","));
518 int im = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
519 if (im != -1) {
520 _cmbMethodComboBox->setCurrentIndex(im);
521 }
522
523 int iRow = _cmbTable->rowCount();
524 if (iRow > 0) {
525 enableWidget(true, _cmbMethodComboBox);
526 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
527 _cmbMaxresLineEdit->setEnabled(true);
528 _cmbSamplSpinBox->setEnabled(true);
529 }
530 else {
531 enableWidget(false, _cmbMethodComboBox);
532 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
533 _cmbMaxresLineEdit->setEnabled(false);
534 _cmbSamplSpinBox->setEnabled(false);
535 }
536
537 // Upload Results
538 // -------------
539 _uploadTable = new QTableWidget(0,12);
540 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, PID, SID, IOD, bytes").split(","));
541 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
542 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
543 _uploadTable->horizontalHeader()->resizeSection( 0,13*ww);
544 _uploadTable->horizontalHeader()->resizeSection( 1, 5*ww);
545 _uploadTable->horizontalHeader()->resizeSection( 2, 6*ww);
546 _uploadTable->horizontalHeader()->resizeSection( 3, 8*ww);
547 _uploadTable->horizontalHeader()->resizeSection( 4,11*ww);
548 _uploadTable->horizontalHeader()->resizeSection( 5, 4*ww);
549 _uploadTable->horizontalHeader()->resizeSection( 6,15*ww);
550 _uploadTable->horizontalHeader()->resizeSection( 7,15*ww);
551 _uploadTable->horizontalHeader()->resizeSection( 8, 4*ww);
552 _uploadTable->horizontalHeader()->resizeSection( 9, 4*ww);
553 _uploadTable->horizontalHeader()->resizeSection(10, 4*ww);
554 _uploadTable->horizontalHeader()->resizeSection(11,12*ww);
555 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
556 _uploadTable->horizontalHeader()->setStretchLastSection(true);
557 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
558
559 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
560 SLOT(slotBncTextChanged()));
561
562 QPushButton* addUploadRowButton = new QPushButton("Add Row");
563 QPushButton* delUploadRowButton = new QPushButton("Del Row");
564 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
565 _uploadIntrComboBox = new QComboBox;
566 _uploadIntrComboBox->setEditable(false);
567 _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
568 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
569 if (ii != -1) {
570 _uploadIntrComboBox->setCurrentIndex(ii);
571 }
572
573 _uploadSamplRtcmEphCorrSpinBox = new QSpinBox;
574 _uploadSamplRtcmEphCorrSpinBox->setMinimum(0);
575 _uploadSamplRtcmEphCorrSpinBox->setMaximum(60);
576 _uploadSamplRtcmEphCorrSpinBox->setSingleStep(5);
577 _uploadSamplRtcmEphCorrSpinBox->setMaximumWidth(9*ww);
578 _uploadSamplRtcmEphCorrSpinBox->setValue(settings.value("uploadSamplRtcmEphCorr").toInt());
579 _uploadSamplRtcmEphCorrSpinBox->setSuffix(" sec");
580
581 _uploadSamplSp3SpinBox = new QSpinBox;
582 _uploadSamplSp3SpinBox->setMinimum(0);
583 _uploadSamplSp3SpinBox->setMaximum(15);
584 _uploadSamplSp3SpinBox->setSingleStep(1);
585 _uploadSamplSp3SpinBox->setMaximumWidth(9*ww);
586 _uploadSamplSp3SpinBox->setValue(settings.value("uploadSamplSp3").toInt());
587 _uploadSamplSp3SpinBox->setSuffix(" min");
588
589 _uploadSamplClkRnxSpinBox = new QSpinBox;
590 _uploadSamplClkRnxSpinBox->setMinimum(0);
591 _uploadSamplClkRnxSpinBox->setMaximum(60);
592 _uploadSamplClkRnxSpinBox->setSingleStep(5);
593 _uploadSamplClkRnxSpinBox->setMaximumWidth(9*ww);
594 _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
595 _uploadSamplClkRnxSpinBox->setSuffix(" sec");
596
597 int iRowT = _uploadTable->rowCount();
598 if (iRowT > 0) {
599 enableWidget(true, _uploadIntrComboBox);
600 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
601 enableWidget(true, _uploadSamplSp3SpinBox);
602 enableWidget(true, _uploadSamplClkRnxSpinBox);
603 }
604 else {
605 enableWidget(false, _uploadIntrComboBox);
606 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
607 enableWidget(false, _uploadSamplSp3SpinBox);
608 enableWidget(false, _uploadSamplClkRnxSpinBox);
609 }
610
611 // Upload RTCM3 Ephemeris
612 // ----------------------
613 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
614 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
615 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
616 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
617 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
618 _uploadEphSampleSpinBox = new QSpinBox;
619 _uploadEphSampleSpinBox->setMinimum(5);
620 _uploadEphSampleSpinBox->setMaximum(60);
621 _uploadEphSampleSpinBox->setSingleStep(5);
622 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
623 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
624 _uploadEphSampleSpinBox->setSuffix(" sec");
625 _uploadEphBytesCounter = new bncBytesCounter;
626
627 // Canvas with Editable Fields
628 // ---------------------------
629 _canvas = new QWidget;
630 setCentralWidget(_canvas);
631
632 _aogroup = new QTabWidget();
633 QWidget* pgroup = new QWidget();
634 QWidget* ggroup = new QWidget();
635 QWidget* sgroup = new QWidget();
636 QWidget* egroup = new QWidget();
637 QWidget* agroup = new QWidget();
638 QWidget* cgroup = new QWidget();
639 QWidget* ogroup = new QWidget();
640 QWidget* rgroup = new QWidget();
641 QWidget* sergroup = new QWidget();
642 QWidget* pppgroup = new QWidget();
643 QWidget* ppp2group = new QWidget();
644 QWidget* reqcgroup = new QWidget();
645 QWidget* cmbgroup = new QWidget();
646 QWidget* uploadgroup = new QWidget();
647 QWidget* uploadEphgroup = new QWidget();
648 _aogroup->addTab(pgroup,tr("Network"));
649 _aogroup->addTab(ggroup,tr("General"));
650 _aogroup->addTab(ogroup,tr("RINEX Observations"));
651 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
652 _aogroup->addTab(reqcgroup,tr("RINEX Editing && QC"));
653 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
654 _aogroup->addTab(sgroup,tr("Feed Engine"));
655 _aogroup->addTab(sergroup,tr("Serial Output"));
656 _aogroup->addTab(agroup,tr("Outages"));
657 _aogroup->addTab(rgroup,tr("Miscellaneous"));
658 _aogroup->addTab(pppgroup,tr("PPP (1)"));
659 _aogroup->addTab(ppp2group,tr("PPP (2)"));
660#ifdef USE_COMBINATION
661 _aogroup->addTab(cmbgroup,tr("Combine Corrections"));
662#endif
663 _aogroup->addTab(uploadgroup,tr("Upload Corrections"));
664 _aogroup->addTab(uploadEphgroup,tr("Upload Ephemeris"));
665
666 // Log Tab
667 // -------
668 _loggroup = new QTabWidget();
669 _loggroup->addTab(_log,tr("Log"));
670 _loggroup->addTab(_bncFigure,tr("Throughput"));
671 _loggroup->addTab(_bncFigureLate,tr("Latency"));
672 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
673
674 // Netowork (Proxy and SSL) Tab
675 // ----------------------------
676 QGridLayout* pLayout = new QGridLayout;
677 pLayout->setColumnMinimumWidth(0,13*ww);
678 _proxyPortLineEdit->setMaximumWidth(9*ww);
679
680 pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none."),0, 0, 1, 50);
681 pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
682 pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1,10);
683 pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
684 pLayout->addWidget(_proxyPortLineEdit, 2, 1);
685 pLayout->addWidget(new QLabel("Path to SSL Certificates"), 3, 0);
686 pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1,10);
687 pLayout->addWidget(new QLabel("Default: " + bncSslConfig::defaultPath()), 3,11, 1,20);
688 pLayout->addWidget(new QLabel("Ignore SSL Authorization Errors"), 4, 0);
689 pLayout->addWidget(_ignoreSslErrorsCheckBox, 4, 1, 1,10);
690 pLayout->addWidget(new QLabel(" "), 4, 0);
691 pLayout->addWidget(new QLabel(" "), 5, 0);
692 pLayout->addWidget(new QLabel(" "), 6, 0);
693 pgroup->setLayout(pLayout);
694
695 // General Tab
696 // -----------
697 QGridLayout* gLayout = new QGridLayout;
698 gLayout->setColumnMinimumWidth(0,14*ww);
699 _onTheFlyComboBox->setMaximumWidth(9*ww);
700
701 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),0, 0, 1, 50);
702 gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
703 gLayout->addWidget(_logFileLineEdit, 1, 1, 1,30);
704 gLayout->addWidget(new QLabel("Append files"), 2, 0);
705 gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
706 gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
707 gLayout->addWidget(_onTheFlyComboBox, 3, 1);
708 gLayout->addWidget(new QLabel("Auto start"), 4, 0);
709 gLayout->addWidget(_autoStartCheckBox, 4, 1);
710 gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
711 gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1,30);
712 gLayout->addWidget(new QLabel(" "), 6, 0);
713 ggroup->setLayout(gLayout);
714
715 // RINEX Observations
716 // ------------------
717 QGridLayout* oLayout = new QGridLayout;
718 oLayout->setColumnMinimumWidth(0,14*ww);
719 _rnxIntrComboBox->setMaximumWidth(9*ww);
720 _rnxSamplSpinBox->setMaximumWidth(9*ww);
721
722 oLayout->addWidget(new QLabel("Saving RINEX observation files."),0, 0, 1,50);
723 oLayout->addWidget(new QLabel("Directory"), 1, 0);
724 oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1,24);
725 oLayout->addWidget(new QLabel("Interval"), 2, 0);
726 oLayout->addWidget(_rnxIntrComboBox, 2, 1);
727 oLayout->addWidget(new QLabel(" Sampling"), 2, 2, Qt::AlignRight);
728 oLayout->addWidget(_rnxSamplSpinBox, 2, 3, Qt::AlignLeft);
729 oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
730 oLayout->addWidget(_rnxSkelLineEdit, 3, 1, 1, 1, Qt::AlignLeft);
731 oLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
732 oLayout->addWidget(_rnxScrpLineEdit, 4, 1, 1,24);
733 oLayout->addWidget(new QLabel("Version 3"), 5, 0);
734 oLayout->addWidget(_rnxV3CheckBox, 5, 1);
735 oLayout->addWidget(new QLabel(" "), 6, 0);
736 ogroup->setLayout(oLayout);
737
738 // RINEX Ephemeris
739 // ---------------
740 QGridLayout* eLayout = new QGridLayout;
741 eLayout->setColumnMinimumWidth(0,14*ww);
742 _ephIntrComboBox->setMaximumWidth(9*ww);
743 _outEphPortLineEdit->setMaximumWidth(9*ww);
744
745 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),0,0,1,50);
746 eLayout->addWidget(new QLabel("Directory"), 1, 0);
747 eLayout->addWidget(_ephPathLineEdit, 1, 1, 1,30);
748 eLayout->addWidget(new QLabel("Interval"), 2, 0);
749 eLayout->addWidget(_ephIntrComboBox, 2, 1);
750 eLayout->addWidget(new QLabel("Port"), 3, 0);
751 eLayout->addWidget(_outEphPortLineEdit, 3, 1);
752 eLayout->addWidget(new QLabel("Version 3"), 4, 0);
753 eLayout->addWidget(_ephV3CheckBox, 4, 1);
754 eLayout->addWidget(new QLabel(" "), 5, 0);
755 eLayout->addWidget(new QLabel(" "), 6, 0);
756 egroup->setLayout(eLayout);
757
758
759 // Broadcast Corrections
760 // ---------------------
761 QGridLayout* cLayout = new QGridLayout;
762 cLayout->setColumnMinimumWidth(0,14*ww);
763 _corrIntrComboBox->setMaximumWidth(9*ww);
764 _corrPortLineEdit->setMaximumWidth(9*ww);
765 _corrTimeSpinBox->setMaximumWidth(9*ww);
766
767 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),0,0,1,50);
768 cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
769 cLayout->addWidget(_corrPathLineEdit, 1, 1, 1,20);
770 cLayout->addWidget(new QLabel("Interval"), 2, 0);
771 cLayout->addWidget(_corrIntrComboBox, 2, 1);
772 cLayout->addWidget(new QLabel("Port"), 3, 0);
773 cLayout->addWidget(_corrPortLineEdit, 3, 1);
774 cLayout->addWidget(new QLabel(" Wait for full corr epoch"), 3, 2, Qt::AlignRight);
775 cLayout->addWidget(_corrTimeSpinBox, 3, 3, Qt::AlignLeft);
776 cLayout->addWidget(new QLabel(" "), 4, 0);
777 cLayout->addWidget(new QLabel(" "), 5, 0);
778 cLayout->addWidget(new QLabel(" "), 6, 0);
779 cgroup->setLayout(cLayout);
780
781 // Feed Engine
782 // -----------
783 QGridLayout* sLayout = new QGridLayout;
784 sLayout->setColumnMinimumWidth(0,14*ww);
785 _outPortLineEdit->setMaximumWidth(9*ww);
786 _waitTimeSpinBox->setMaximumWidth(9*ww);
787 _binSamplSpinBox->setMaximumWidth(9*ww);
788 _outUPortLineEdit->setMaximumWidth(9*ww);
789
790 sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine."),0,0,1,50);
791 sLayout->addWidget(new QLabel("Port"), 1, 0);
792 sLayout->addWidget(_outPortLineEdit, 1, 1);
793 sLayout->addWidget(new QLabel("Wait for full obs epoch"), 1, 2, Qt::AlignRight);
794 sLayout->addWidget(_waitTimeSpinBox, 1, 3, Qt::AlignLeft);
795 sLayout->addWidget(new QLabel("Sampling"), 2, 0);
796 sLayout->addWidget(_binSamplSpinBox, 2, 1, Qt::AlignLeft);
797 sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
798 sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 20);
799 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
800 sLayout->addWidget(_outUPortLineEdit, 4, 1);
801 sLayout->addWidget(new QLabel(" "), 5, 0);
802 sLayout->addWidget(new QLabel(" "), 6, 0);
803 sgroup->setLayout(sLayout);
804
805 // Serial Output
806 // -------------
807 QGridLayout* serLayout = new QGridLayout;
808 serLayout->setColumnMinimumWidth(0,14*ww);
809 _serialBaudRateComboBox->setMaximumWidth(9*ww);
810 _serialFlowControlComboBox->setMaximumWidth(11*ww);
811 _serialDataBitsComboBox->setMaximumWidth(5*ww);
812 _serialParityComboBox->setMaximumWidth(9*ww);
813 _serialStopBitsComboBox->setMaximumWidth(5*ww);
814 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
815 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
816
817 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),0,0,1,30);
818 serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
819 serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
820 serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
821 serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
822 serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
823 serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
824 serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
825 serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
826 serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
827 serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
828 serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
829 serLayout->addWidget(_serialParityComboBox, 4, 3);
830 serLayout->addWidget(new QLabel(" Stop bits"), 4, 4, Qt::AlignRight);
831 serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
832 serLayout->addWidget(new QLabel("NMEA"), 5, 0);
833 serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
834 serLayout->addWidget(new QLabel(" File (full path)"), 5, 2, Qt::AlignRight);
835 serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1,15);
836 serLayout->addWidget(new QLabel("Height"), 5,20, Qt::AlignRight);
837 serLayout->addWidget(_serialHeightNMEALineEdit, 5,21, 1,11);
838 serLayout->addWidget(new QLabel(" "), 6, 0);
839
840 sergroup->setLayout(serLayout);
841
842 // Outages
843 // -------
844 QGridLayout* aLayout = new QGridLayout;
845 aLayout->setColumnMinimumWidth(0,14*ww);
846 _obsRateComboBox->setMaximumWidth(9*ww);
847 _adviseFailSpinBox->setMaximumWidth(9*ww);
848 _adviseRecoSpinBox->setMaximumWidth(9*ww);
849
850 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),0,0,1,50,Qt::AlignLeft);
851 aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
852 aLayout->addWidget(_obsRateComboBox, 1, 1);
853 aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
854 aLayout->addWidget(_adviseFailSpinBox, 2, 1);
855 aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
856 aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
857 aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
858 aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1,30);
859 aLayout->addWidget(new QLabel(" "), 5, 0);
860 aLayout->addWidget(new QLabel(" "), 6, 0);
861 agroup->setLayout(aLayout);
862
863 // Miscellaneous
864 // -------------
865 QGridLayout* rLayout = new QGridLayout;
866 rLayout->setColumnMinimumWidth(0,14*ww);
867 _perfIntrComboBox->setMaximumWidth(9*ww);
868
869 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),0, 0,1,30);
870 rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
871 rLayout->addWidget(_miscMountLineEdit, 1, 1, 1,7);
872 rLayout->addWidget(new QLabel("Log latency"), 2, 0);
873 rLayout->addWidget(_perfIntrComboBox, 2, 1);
874 rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
875 rLayout->addWidget(_scanRTCMCheckBox, 3, 1);
876 rLayout->addWidget(new QLabel(" "), 4, 0);
877 rLayout->addWidget(new QLabel(" "), 5, 0);
878 rLayout->addWidget(new QLabel(" "), 6, 0);
879 rgroup->setLayout(rLayout);
880
881 // PPP Client
882 // ----------
883 QGridLayout* pppLayout = new QGridLayout;
884 pppLayout->setColumnMinimumWidth(0,14*ww);
885 _pppSigCLineEdit->setMaximumWidth(6*ww);
886 _pppSigPLineEdit->setMaximumWidth(6*ww);
887 _pppSigCrd0->setMaximumWidth(6*ww);
888 _pppSigCrdP->setMaximumWidth(6*ww);
889 _pppSigTrp0->setMaximumWidth(6*ww);
890 _pppSigTrpP->setMaximumWidth(6*ww);
891 _pppAverageLineEdit->setMaximumWidth(6*ww);
892 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
893 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
894 _pppAudioResponseLineEdit->setMaximumWidth(6*ww);
895 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
896 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
897 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
898 _pppRefdNLineEdit->setMaximumWidth(6*ww);
899 _pppRefdELineEdit->setMaximumWidth(6*ww);
900 _pppRefdULineEdit->setMaximumWidth(6*ww);
901 _pppSync->setMaximumWidth(6*ww);
902 _pppSPPComboBox->setMinimumWidth(15*ww);
903
904 _postObsFileChooser = new qtFileChooser;
905 _postObsFileChooser->setFileName(settings.value("postObsFile").toString());
906 _postObsFileChooser->setMinimumWidth(15*ww);
907 _postNavFileChooser = new qtFileChooser;
908 _postNavFileChooser->setFileName(settings.value("postNavFile").toString());
909 _postNavFileChooser->setMinimumWidth(15*ww);
910 _postCorrFileChooser = new qtFileChooser;
911 _postCorrFileChooser->setFileName(settings.value("postCorrFile").toString());
912 _postCorrFileChooser->setMinimumWidth(15*ww);
913 _postOutLineEdit = new QLineEdit(settings.value("postOutFile").toString());
914 _postOutLineEdit->setMinimumWidth(15*ww);
915
916 int ir = 0;
917 pppLayout->addWidget(new QLabel("Precise Point Positioning, Panel 1."), ir, 0, 1, 2, Qt::AlignLeft);
918 ++ir;
919 pppLayout->addWidget(new QLabel("Mode & mountpoints"),ir, 0, Qt::AlignLeft);
920 pppLayout->addWidget(_pppSPPComboBox, ir, 1, Qt::AlignRight);
921 pppLayout->addWidget(_pppMountLineEdit, ir, 3, Qt::AlignRight);
922 pppLayout->addWidget(new QLabel("Obs."), ir, 4, Qt::AlignLeft);
923 pppLayout->addWidget(_pppCorrMountLineEdit, ir, 5, Qt::AlignRight);
924 pppLayout->addWidget(new QLabel("Corr."), ir, 6, Qt::AlignLeft);
925 ++ir;
926 pppLayout->addWidget(new QLabel("Marker coordinates"), ir, 0, Qt::AlignLeft);
927 pppLayout->addWidget(_pppRefCrdXLineEdit, ir, 1, Qt::AlignRight);
928 pppLayout->addWidget(new QLabel("X "), ir, 2, Qt::AlignLeft);
929 pppLayout->addWidget(_pppRefCrdYLineEdit, ir, 3, Qt::AlignRight);
930 pppLayout->addWidget(new QLabel("Y"), ir, 4, Qt::AlignLeft);
931 pppLayout->addWidget(_pppRefCrdZLineEdit, ir, 5, Qt::AlignRight);
932 pppLayout->addWidget(new QLabel("Z"), ir, 6, Qt::AlignLeft);
933 ++ir;
934 pppLayout->addWidget(new QLabel("Antenna excentricity"), ir, 0, Qt::AlignLeft);
935 pppLayout->addWidget(_pppRefdNLineEdit, ir, 1, Qt::AlignRight);
936 pppLayout->addWidget(new QLabel("dN"), ir, 2, Qt::AlignLeft);
937 pppLayout->addWidget(_pppRefdELineEdit, ir, 3, Qt::AlignRight);
938 pppLayout->addWidget(new QLabel("dE"), ir, 4, Qt::AlignLeft);
939 pppLayout->addWidget(_pppRefdULineEdit, ir, 5, Qt::AlignRight);
940 pppLayout->addWidget(new QLabel("dU"), ir, 6, Qt::AlignLeft);
941 ++ir;
942 pppLayout->addWidget(new QLabel("NMEA & plot output"),ir, 0, Qt::AlignLeft);
943 pppLayout->addWidget(_pppNMEALineEdit, ir, 1, Qt::AlignRight);
944 pppLayout->addWidget(new QLabel("NMEA File"), ir, 2, Qt::AlignLeft);
945 pppLayout->addWidget(_pppNMEAPortLineEdit, ir, 3, Qt::AlignRight);
946 pppLayout->addWidget(new QLabel("NMEA Port"), ir, 4, Qt::AlignLeft);
947 pppLayout->addWidget(_pppPlotCoordinates, ir, 5, Qt::AlignRight);
948 pppLayout->addWidget(new QLabel("PPP Plot"), ir, 6, Qt::AlignLeft);
949 ++ir;
950 pppLayout->addWidget(new QLabel("Post-processing"), ir, 0, Qt::AlignLeft);
951 pppLayout->addWidget(_postObsFileChooser, ir, 1, Qt::AlignRight);
952 pppLayout->addWidget(new QLabel("Obs "), ir, 2, Qt::AlignLeft);
953 pppLayout->addWidget(_postNavFileChooser, ir, 3, Qt::AlignRight);
954 pppLayout->addWidget(new QLabel("Nav "), ir, 4, Qt::AlignLeft);
955 ++ir;
956 pppLayout->addWidget(_postCorrFileChooser, ir, 1, Qt::AlignRight);
957 pppLayout->addWidget(new QLabel("Corr"), ir, 2, Qt::AlignLeft);
958 pppLayout->addWidget(_postOutLineEdit, ir, 3, Qt::AlignRight);
959 pppLayout->addWidget(new QLabel("Log (full path)"), ir, 4, Qt::AlignLeft);
960
961 pppgroup->setLayout(pppLayout);
962
963 // PPP Client (second panel)
964 // -------------------------
965 QGridLayout* ppp2Layout = new QGridLayout;
966 ppp2Layout->setColumnMinimumWidth(0,14*ww);
967 ir = 0;
968 ppp2Layout->addWidget(new QLabel("Precise Point Positioning, Panel 2."), ir, 0, 1, 10);
969 ++ir;
970 ppp2Layout->addWidget(new QLabel("Antennas"), ir, 0);
971 ppp2Layout->addWidget(_pppAntexFileChooser, ir, 1,1,3);
972 ppp2Layout->addWidget(new QLabel("ANTEX File"), ir, 4);
973 ppp2Layout->addWidget(_pppAntennaLineEdit, ir, 5,1,3);
974 ppp2Layout->addWidget(new QLabel("Antenna Name"), ir, 8);
975 ++ir;
976 ppp2Layout->addWidget(new QLabel("Basics"), ir, 0, 1, 5);
977 ppp2Layout->addWidget(_pppUsePhaseCheckBox, ir, 1, Qt::AlignRight);
978 ppp2Layout->addWidget(new QLabel("Use phase obs"), ir, 2);
979 ppp2Layout->addWidget(_pppEstTropoCheckBox, ir, 3, Qt::AlignRight);
980 ppp2Layout->addWidget(new QLabel("Estimate tropo"), ir, 4);
981 ppp2Layout->addWidget(_pppGLONASSCheckBox, ir, 5, Qt::AlignRight);
982 ppp2Layout->addWidget(new QLabel("Use GLONASS"), ir, 6);
983 ppp2Layout->addWidget(_pppGalileoCheckBox, ir, 7, Qt::AlignRight);
984 ppp2Layout->addWidget(new QLabel("Use Galileo "), ir, 8);
985 ++ir;
986 ppp2Layout->addWidget(new QLabel("Basics cont'd"), ir, 0);
987 ppp2Layout->addWidget(_pppSync, ir, 1);
988 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), ir, 2);
989 ppp2Layout->addWidget(_pppAverageLineEdit, ir, 3, Qt::AlignRight);
990 ppp2Layout->addWidget(new QLabel("Averaging (min)") , ir, 4);
991 ppp2Layout->addWidget(_pppQuickStartLineEdit, ir, 5, Qt::AlignRight);
992 ppp2Layout->addWidget(new QLabel("Quick-Start (sec) "), ir, 6);
993 ppp2Layout->addWidget(_pppMaxSolGapLineEdit, ir, 7, Qt::AlignRight);
994 ppp2Layout->addWidget(new QLabel("Max Sol. Gap (sec)"), ir, 8);
995 ++ir;
996 ppp2Layout->addWidget(new QLabel("Basics cont'd"), ir, 0);
997 ppp2Layout->addWidget(_pppAudioResponseLineEdit, ir, 1, Qt::AlignRight);
998 ppp2Layout->addWidget(new QLabel("Audio response (m)"), ir, 2);
999 ++ir;
1000 ppp2Layout->addWidget(new QLabel("Sigmas"), ir, 0);
1001 ppp2Layout->addWidget(_pppSigCLineEdit, ir, 1, Qt::AlignRight);
1002 ppp2Layout->addWidget(new QLabel("Code"), ir, 2);
1003 ppp2Layout->addWidget(_pppSigPLineEdit, ir, 3);
1004 ppp2Layout->addWidget(new QLabel("Phase"), ir, 4);
1005 ++ir;
1006 ppp2Layout->addWidget(new QLabel("Sigmas cont'd"), ir, 0);
1007 ppp2Layout->addWidget(_pppSigCrd0, ir, 1, Qt::AlignRight);
1008 ppp2Layout->addWidget(new QLabel("XYZ Init "), ir, 2);
1009 ppp2Layout->addWidget(_pppSigCrdP, ir, 3, Qt::AlignRight);
1010 ppp2Layout->addWidget(new QLabel("XYZ White Noise "), ir, 4);
1011 ppp2Layout->addWidget(_pppSigTrp0, ir, 5, Qt::AlignRight);
1012 ppp2Layout->addWidget(new QLabel("Tropo Init "), ir, 6);
1013 ppp2Layout->addWidget(_pppSigTrpP, ir, 7);
1014 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), ir, 8);
1015 ++ir;
1016 ppp2Layout->addWidget(new QLabel(""), ir, 0);
1017
1018 ppp2group->setLayout(ppp2Layout);
1019
1020 // Reqc Processing
1021 // ---------------
1022 _reqcActionComboBox = new QComboBox();
1023 _reqcActionComboBox->setEditable(false);
1024 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1025 ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1026 if (ik != -1) {
1027 _reqcActionComboBox->setCurrentIndex(ik);
1028 }
1029 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1030 this, SLOT(slotBncTextChanged()));
1031
1032 QGridLayout* reqcLayout = new QGridLayout;
1033 _reqcActionComboBox->setMinimumWidth(15*ww);
1034 _reqcActionComboBox->setMaximumWidth(15*ww);
1035
1036 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1037 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1038 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
1039 _reqcObsFileChooser->setMinimumWidth(15*ww);
1040 _reqcObsFileChooser->setMaximumWidth(15*ww);
1041
1042 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1043 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1044 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
1045 _reqcNavFileChooser->setMinimumWidth(15*ww);
1046 _reqcNavFileChooser->setMaximumWidth(15*ww);
1047
1048 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1049 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to a RINEX observation output file."));
1050 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
1051 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
1052
1053 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1054 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to a RINEX navigation output file."));
1055 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
1056 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
1057
1058 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1059 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to a logfile."));
1060 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
1061 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
1062
1063 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1064 _reqcPlotDirLineEdit->setWhatsThis(tr("Specify the directory name for saving plots."));
1065 _reqcPlotDirLineEdit->setMinimumWidth(15*ww);
1066 _reqcPlotDirLineEdit->setMaximumWidth(15*ww);
1067
1068 ir = 0;
1069 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1070 ++ir;
1071 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1072 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1073 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1074 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1075 ++ir;
1076 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1077 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1078 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1079 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1080 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1081 ++ir;
1082 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1083 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1084 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1085 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1086 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1087 ++ir;
1088 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1089 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1090 ++ir;
1091 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0, Qt::AlignLeft);
1092 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1, Qt::AlignRight);
1093 ++ir;
1094 reqcLayout->addWidget(new QLabel(""), ir, 1);
1095 reqcLayout->setRowStretch(ir, 999);
1096
1097 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1098 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1099
1100 reqcgroup->setLayout(reqcLayout);
1101
1102 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1103 this, SLOT(slotReqcEditOption()));
1104
1105 // Combine Corrections
1106 // -------------------
1107 QGridLayout* cmbLayout = new QGridLayout;
1108
1109 populateCmbTable();
1110 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1111 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1112 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1113 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1114 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1115 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1116 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1117 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1118 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1119 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1120 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1121 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1122 cmbLayout->addWidget(new QLabel(" "), 4, 5);
1123 cmbLayout->addWidget(new QLabel("Sampling"), 4, 6, Qt::AlignRight);
1124 cmbLayout->addWidget(_cmbSamplSpinBox, 4, 7, Qt::AlignRight);
1125 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1126
1127 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1128 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1129
1130 cmbgroup->setLayout(cmbLayout);
1131
1132 // Upload Layout (Clocks)
1133 // ----------------------
1134 QGridLayout* uploadHlpLayout = new QGridLayout();
1135
1136 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1137 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1138 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1139
1140 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1141 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1142 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1143 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1144 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1145 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1146 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1147 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1148 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1149 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1150 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1151
1152 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1153 populateUploadTable();
1154
1155 uploadLayout->addWidget(new QLabel("Upload RTCMv3 Broadcast Corrections to caster."));
1156 uploadLayout->addWidget(_uploadTable);
1157 uploadLayout->addLayout(uploadHlpLayout);
1158
1159 uploadgroup->setLayout(uploadLayout);
1160
1161 // Upload Layout (Ephemeris)
1162 // -------------------------
1163 QGridLayout* uploadLayoutEph = new QGridLayout;
1164
1165 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1166 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1167 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1168 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1169
1170 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1171 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1172 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1173 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1174 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1175 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1176 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1177 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1178 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1179 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1180 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1181 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1182 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1183 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1184 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1185
1186 uploadEphgroup->setLayout(uploadLayoutEph);
1187
1188 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1189 this, SLOT(slotBncTextChanged()));
1190
1191#ifdef RTROVER_INTERFACE
1192 QWidget* rtroverGroup = new QWidget();
1193 _aogroup->addTab(rtroverGroup,tr("RTRover"));
1194 QGridLayout* rtroverLayout = new QGridLayout();
1195
1196 _rtroverModeComboBox = new QComboBox();
1197
1198 _rtroverModeComboBox->setEditable(false);
1199 _rtroverModeComboBox->addItems(QString(",PPP_DF,SPP_DF,PPP_SF,SPP_SF,PPP_AR,RTK,PPP_FTTF").split(","));
1200 ik = _rtroverModeComboBox->findText(settings.value("rtroverMode").toString());
1201 if (ik != -1) {
1202 _rtroverModeComboBox->setCurrentIndex(ik);
1203 }
1204 _rtroverModeComboBox->setMinimumWidth(10*ww);
1205
1206 _rtroverRoverMountLineEdit = new QLineEdit(settings.value("rtroverRoverMount").toString());
1207 _rtroverRoverMountLineEdit->setMaximumWidth(8*ww);
1208 _rtroverCorrMountLineEdit = new QLineEdit(settings.value("rtroverCorrMount").toString());
1209 _rtroverCorrMountLineEdit->setMaximumWidth(8*ww);
1210 _rtroverBaseMountLineEdit = new QLineEdit(settings.value("rtroverBaseMount").toString());
1211 _rtroverBaseMountLineEdit->setMaximumWidth(8*ww);
1212 _rtroverRoverRefCrdXLineEdit = new QLineEdit(settings.value("rtroverRoverRefCrdX").toString());
1213 _rtroverRoverRefCrdYLineEdit = new QLineEdit(settings.value("rtroverRoverRefCrdY").toString());
1214 _rtroverRoverRefCrdZLineEdit = new QLineEdit(settings.value("rtroverRoverRefCrdZ").toString());
1215 _rtroverBaseRefCrdXLineEdit = new QLineEdit(settings.value("rtroverBaseRefCrdX").toString());
1216 _rtroverBaseRefCrdYLineEdit = new QLineEdit(settings.value("rtroverBaseRefCrdY").toString());
1217 _rtroverBaseCrdZLineEdit = new QLineEdit(settings.value("rtroverBaseRefCrdZ").toString());
1218 _rtroverRoverDNLineEdit = new QLineEdit(settings.value("rtroverRoverDN").toString());
1219 _rtroverRoverDNLineEdit->setMaximumWidth(6*ww);
1220 _rtroverRoverDELineEdit = new QLineEdit(settings.value("rtroverRoverDE").toString());
1221 _rtroverRoverDELineEdit->setMaximumWidth(6*ww);
1222 _rtroverRoverDULineEdit = new QLineEdit(settings.value("rtroverRoverDU").toString());
1223 _rtroverRoverDULineEdit->setMaximumWidth(6*ww);
1224 _rtroverBaseDNLineEdit = new QLineEdit(settings.value("rtroverBaseDN").toString());
1225 _rtroverBaseDNLineEdit->setMaximumWidth(6*ww);
1226 _rtroverBaseDELineEdit = new QLineEdit(settings.value("rtroverBaseDE").toString());
1227 _rtroverBaseDELineEdit->setMaximumWidth(6*ww);
1228 _rtroverBaseDULineEdit = new QLineEdit(settings.value("rtroverBaseDU").toString());
1229 _rtroverBaseDULineEdit->setMaximumWidth(6*ww);
1230 _rtroverRoverAntennaLineEdit = new QLineEdit(settings.value("rtroverRoverAntenna").toString());
1231 _rtroverBaseAntennaLineEdit = new QLineEdit(settings.value("rtroverBaseAntenna").toString());
1232 _rtroverAntexFileChooser = new qtFileChooser;
1233 _rtroverAntexFileChooser->setMinimumWidth(12*ww);
1234 _rtroverAntexFileChooser->setFileName(settings.value("rtroverAntex").toString());
1235 _rtroverOutputLineEdit = new QLineEdit(settings.value("rtroverOutput").toString());
1236 _rtroverOutputLineEdit->setMinimumWidth(15*ww);
1237
1238 ir = 0;
1239 rtroverLayout->addWidget(new QLabel("Real-Time Rover"), ir, 0, 1, 2, Qt::AlignLeft);
1240 ++ir;
1241 rtroverLayout->addWidget(new QLabel("Mode & mountpoints"),ir, 0, Qt::AlignLeft);
1242 rtroverLayout->addWidget(_rtroverModeComboBox, ir, 1, Qt::AlignRight);
1243 rtroverLayout->addWidget(_rtroverRoverMountLineEdit, ir, 3, Qt::AlignRight);
1244 rtroverLayout->addWidget(new QLabel("Rover"), ir, 4, Qt::AlignLeft);
1245 rtroverLayout->addWidget(_rtroverCorrMountLineEdit, ir, 5, Qt::AlignRight);
1246 rtroverLayout->addWidget(new QLabel("Corr."), ir, 6, Qt::AlignLeft);
1247 rtroverLayout->addWidget(_rtroverBaseMountLineEdit, ir, 7, Qt::AlignRight);
1248 rtroverLayout->addWidget(new QLabel("Base"), ir, 8, Qt::AlignLeft);
1249 ++ir;
1250 rtroverLayout->addWidget(new QLabel("Rover coordinates"), ir, 0, Qt::AlignLeft);
1251 rtroverLayout->addWidget(_rtroverRoverRefCrdXLineEdit, ir, 1, Qt::AlignRight);
1252 rtroverLayout->addWidget(new QLabel("X "), ir, 2, Qt::AlignLeft);
1253 rtroverLayout->addWidget(_rtroverRoverRefCrdYLineEdit, ir, 3, Qt::AlignRight);
1254 rtroverLayout->addWidget(new QLabel("Y"), ir, 4, Qt::AlignLeft);
1255 rtroverLayout->addWidget(_rtroverRoverRefCrdZLineEdit, ir, 5, Qt::AlignRight);
1256 rtroverLayout->addWidget(new QLabel("Z"), ir, 6, Qt::AlignLeft);
1257 ++ir;
1258 rtroverLayout->addWidget(_rtroverRoverDNLineEdit, ir, 1, Qt::AlignRight);
1259 rtroverLayout->addWidget(new QLabel("dN"), ir, 2, Qt::AlignLeft);
1260 rtroverLayout->addWidget(_rtroverRoverDELineEdit, ir, 3, Qt::AlignRight);
1261 rtroverLayout->addWidget(new QLabel("dE"), ir, 4, Qt::AlignLeft);
1262 rtroverLayout->addWidget(_rtroverRoverDULineEdit, ir, 5, Qt::AlignRight);
1263 rtroverLayout->addWidget(new QLabel("dU"), ir, 6, Qt::AlignLeft);
1264 ++ir;
1265 rtroverLayout->addWidget(new QLabel("Base coordinates"), ir, 0, Qt::AlignLeft);
1266 rtroverLayout->addWidget(_rtroverBaseRefCrdXLineEdit, ir, 1, Qt::AlignRight);
1267 rtroverLayout->addWidget(new QLabel("X "), ir, 2, Qt::AlignLeft);
1268 rtroverLayout->addWidget(_rtroverBaseRefCrdYLineEdit, ir, 3, Qt::AlignRight);
1269 rtroverLayout->addWidget(new QLabel("Y"), ir, 4, Qt::AlignLeft);
1270 rtroverLayout->addWidget(_rtroverBaseCrdZLineEdit, ir, 5, Qt::AlignRight);
1271 rtroverLayout->addWidget(new QLabel("Z"), ir, 6, Qt::AlignLeft);
1272 ++ir;
1273 rtroverLayout->addWidget(_rtroverBaseDNLineEdit, ir, 1, Qt::AlignRight);
1274 rtroverLayout->addWidget(new QLabel("dN"), ir, 2, Qt::AlignLeft);
1275 rtroverLayout->addWidget(_rtroverBaseDELineEdit, ir, 3, Qt::AlignRight);
1276 rtroverLayout->addWidget(new QLabel("dE"), ir, 4, Qt::AlignLeft);
1277 rtroverLayout->addWidget(_rtroverBaseDULineEdit, ir, 5, Qt::AlignRight);
1278 rtroverLayout->addWidget(new QLabel("dU"), ir, 6, Qt::AlignLeft);
1279 ++ir;
1280 rtroverLayout->addWidget(new QLabel("ANTEX"), ir, 0, Qt::AlignLeft);
1281 rtroverLayout->addWidget(_rtroverAntexFileChooser, ir, 1, Qt::AlignRight);
1282 rtroverLayout->addWidget(new QLabel("file"), ir, 2, Qt::AlignLeft);
1283 rtroverLayout->addWidget(_rtroverBaseAntennaLineEdit, ir, 3, Qt::AlignRight);
1284 rtroverLayout->addWidget(new QLabel("Ant. Rover"), ir, 4, Qt::AlignLeft);
1285 rtroverLayout->addWidget(_rtroverRoverAntennaLineEdit, ir, 5, Qt::AlignRight);
1286 rtroverLayout->addWidget(new QLabel("Ant. Base"), ir, 6, Qt::AlignLeft);
1287 ++ir;
1288 rtroverLayout->addWidget(new QLabel("Output"), ir, 0, Qt::AlignLeft);
1289 rtroverLayout->addWidget(_rtroverOutputLineEdit, ir, 1, Qt::AlignRight);
1290
1291 rtroverGroup->setLayout(rtroverLayout);
1292#endif
1293
1294 // Main Layout
1295 // -----------
1296 QGridLayout* mLayout = new QGridLayout;
1297 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1298 mLayout->addWidget(_aogroup, 0,0);
1299 mLayout->addWidget(_mountPointsTable, 1,0);
1300 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1301 mLayout->addWidget(_loggroup, 2,0);
1302
1303 _canvas->setLayout(mLayout);
1304
1305 // WhatsThis
1306 // ---------
1307 _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you might need to use a proxy server to access the Internet. Enter your proxy server IP and port number in case one is operated in front of BNC. If you do not know the IP and port of your proxy server, check the proxy server settings in your Internet browser or ask your network administrator.</p><p>Note that IP streaming is sometimes not allowed in a LAN. In this case you need to ask your network administrator for an appropriate modification of the local security policy or for the installation of a TCP relay to the NTRIP broadcasters. If these are not possible, you might need to run BNC outside your LAN on a network that has unobstructed connection to the Internet.</p>"));
1308 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1309 _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an NTRIP broadcaster over SSL requires the exchange of client and/or server certificates. Specify the path to a directory where you save certificates on your system. Don't try communication via SSL if you are not sure wheter this is supported by the involved NTRIP broadcaster. Note that SSL communication is usually done over port 443.</p>"));
1310 _ignoreSslErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the NTRIP broadcaster. Tick 'Ignore SSL authorization erros' if you don't want to be bothered with this.</p>"));
1311 _waitTimeSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full obs epoch' seconds. A value of 3 to 5 seconds is recommended, depending on the latency of the incoming streams and the delay acceptable to your real-time GNSS network engine or products.</p>"));
1312 _outFileLineEdit->setWhatsThis(tr("Specify the full path to a file where synchronized observations are saved in plain ASCII format. Beware that the size of this file can rapidly increase depending on the number of incoming streams."));
1313 _outPortLineEdit->setWhatsThis(tr("BNC can produce synchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
1314 _outUPortLineEdit->setWhatsThis(tr("BNC can produce unsynchronized observations in a plain ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
1315 _outEphPortLineEdit->setWhatsThis(tr("BNC can produce ephemeris data in RINEX ASCII format on your local host through an IP port. Specify a port number here to activate this function."));
1316 _corrPortLineEdit->setWhatsThis(tr("BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port. Specify a port number here to activate this function."));
1317 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full corr epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application.</p><p>Specifying a value of '0' means that BNC immediately outputs all incoming Broadcast Epemeris Corrections and does not drop any of them for latency reasons.</p>"));
1318 _rnxPathLineEdit->setWhatsThis(tr("Here you specify the path to where the RINEX Observation files will be stored. If the specified directory does not exist, BNC will not create RINEX Observation files."));
1319 _ephPathLineEdit->setWhatsThis(tr("Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files. If the specified directory does not exist, BNC will not create RINEX Navigation files."));
1320 _corrPathLineEdit->setWhatsThis(tr("Specify a directory for saving Broadcast Ephemeris Correction files. If the specified directory does not exist, BNC will not create the files."));
1321 _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is saved, you might want to compress, copy or upload it immediately via FTP. BNC allows you to execute a script/batch file to carry out these operations. To do that specify the full path of the script/batch file here. BNC will pass the full RINEX Observation file path to the script as a command line parameter (%1 on Windows systems, $1 onUnix/Linux systems).</p>"));
1322 _rnxSkelLineEdit->setWhatsThis(tr("<p>BNC allows using personal skeleton files that contain the header records you would like to include. You can derive a personal RINEX header skeleton file from the information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' suffix is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream.</p>"));
1323 _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and any existing files with the same name will be overwritten. However, users might want to append already existing files following a restart of BNC, a system crash or when BNC crashed. Tick 'Append files' to continue with existing files and keep what has been recorded so far.</p>"));
1324 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1325 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1326
1327 _onTheFlyComboBox->setWhatsThis(tr("<p>When operating BNC online in 'no window' mode, some configuration parameters can be changed on-the-fly without interrupting the running process. For that BNC rereads parts of its configuration in pre-defined intervals.<p></p>Select '1 min', '5 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, hour, or day and let in between edited configuration options become effective on-the-fly without terminating uninvolved threads.</p><p>Note that when operating BNC in window mode, on-the-fly changeable configuration options become effective immediately through 'Save & Reread Configuration'.</p>"));
1328 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1329 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1330 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1331 _rnxSamplSpinBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. A value of zero '0' tells BNC to store all received epochs into RINEX.</p>"));
1332 _binSamplSpinBox->setWhatsThis(tr("<p>Select the synchronized observation sampling interval in seconds. A value of zero '0' tells BNC to send/store all received epochs.</p>"));
1333 _obsRateComboBox->setWhatsThis(tr("<p>BNC can collect all returns (success or failure) coming from a decoder within a certain short time span to then decide whether a stream has an outage or its content is corrupted. The procedure needs a rough estimate of the expected 'Observation rate' of the incoming streams. When a continuous problem is detected, BNC can inform its operator about this event through an advisory note.</p>"));
1334 _adviseRecoSpinBox->setWhatsThis(tr("<p>Following a stream outage or a longer series of bad observations, an advisory note is generated when valid observations are received again throughout the 'Recovery threshold' time span. A value of about 5min (default) is recommended.</p><p>A value of zero '0' means that for any stream recovery, however short, BNC immediately generates an advisory note.</p>"));
1335 _adviseFailSpinBox->setWhatsThis(tr("<p>An advisory note is generated when no (or only corrupted) observations are seen throughout the 'Failure threshold' time span. A value of 15 min (default) is recommended.</p><p>A value of zero '0' means that for any stream failure, however short, BNC immediately generates an advisory note.</p>"));
1336 _logFileLineEdit->setWhatsThis(tr("<p>Records of BNC's activities are shown in the 'Log' tab on the bottom of this window. They can be saved into a file when a valid path is specified in the 'Logfile (full path)' field.</p><p>The logfile name will automatically be extended by a string '_YYMMDD' carrying the current date."));
1337 _adviseScriptLineEdit->setWhatsThis(tr("<p>Specify the full path to a script or batch file to handle advisory notes generated in the event of corrupted streams or stream outages. The affected mountpoint and one of the comments 'Begin_Outage', 'End_Outage', 'Begin_Corrupted', or 'End_Corrupted' are passed on to the script as command line parameters.</p><p>The script may have the task to send the advisory notes by email to BNC's operator and/or to the affected stream provider. An empty option field (default) or invalid path means that you don't want to use this option.</p>"));
1338 _perfIntrComboBox->setWhatsThis(tr("<p>BNC can average latencies per stream over a certain period of GPS time. The resulting mean latencies are recorded in the 'Log' tab at the end of each 'Log latency' interval together with results of a statistical evaluation (approximate number of covered epochs, data gaps).</p><p>Select a 'Log latency' interval or select the empty option field if you do not want BNC to log latencies and statistical information.</p>"));
1339 _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. Clicking on 'Add Stream' button will open a window that allows the user to select data streams from an NTRIP broadcaster according to their mountpoints. To remove a stream from the 'Streams' list, highlight it by clicking on it and hit the 'Delete Stream' button. You can also remove multiple streams by highlighting them using +Shift and +Ctrl.</p><p>BNC automatically allocates one of its internal decoders to a stream based on the stream's 'format' as given in the sourcetable. BNC allows users to change this selection by editing the decoder string. Double click on the 'decoder' field, enter your preferred decoder and then hit Enter. The accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x' and 'RTNET'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and directly save the input in daily log files. To do this specify the decoder string as 'ZERO'.</p><p>BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. To initiate these streams, the approximate latitude/longitude rover position is sent to the NTRIP broadcaster. The default values can be change according to your requirement. Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter.</p>"));
1340 _log->setWhatsThis(tr("Records of BNC's activities are shown in the 'Log' tab. The message log covers the communication status between BNC and the NTRIP broadcaster as well as any problems that occur in the communication link, stream availability, stream delay, stream conversion etc."));
1341 _bncFigure->setWhatsThis(tr("The bandwidth consumtion per stream is shown in the 'Throughput' tab in bits per second (bps) or kilo bits per second (kbps)."));
1342 _bncFigureLate->setWhatsThis(tr("The individual latency of observations in each incoming stream is shown in the 'Latency' tab. Streams not carrying observations (i.e. those providing only broadcast ephemeris messages) are not considered here. Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized."));
1343 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
1344 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
1345 _miscMountLineEdit->setWhatsThis(tr("<p>Specify a mountpoint to apply any of the options shown below. Enter 'ALL' if you want to apply these options to all configured streams.</p><p>An empty option field (default) means that you don't want BNC to apply any of these options.</p>"));
1346 _scanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incomming message types as well as contained antenna coordinates, antenna heigt, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types.</p>."));
1347 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1348 _serialPortNameLineEdit->setWhatsThis(tr("<p>Enter the serial 'Port name' selected for communication with your serial connected receiver. Valid port names are</p><pre>Windows: COM1, COM2<br>Linux: /dev/ttyS0, /dev/ttyS1<br>FreeBSD: /dev/ttyd0, /dev/ttyd1<br>Digital Unix: /dev/tty01, /dev/tty02<br>HP-UX: /dev/tty1p0, /dev/tty2p0<br>SGI/IRIX: /dev/ttyf1, /dev/ttyf2<br>SunOS/Solaris: /dev/ttya, /dev/ttyb</pre><p>Note that you must plug a serial cable in the port defined here before you start BNC.</p>"));
1349 _serialBaudRateComboBox->setWhatsThis(tr("<p>Select a 'Baud rate' for the serial output link.</p><p>Note that your selection must equal the baud rate configured to the serial connected receiver. Note further that using a high baud rate is recommended.</p>"));
1350 _serialParityComboBox->setWhatsThis(tr("<p>Select the 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. Note further that parity is often set to 'NONE'.</p>"));
1351 _serialDataBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Data bits' for the serial output link.</p><p>Note that your selection must equal the number of data bits configured to the serial connected receiver. Note further that often 8 data bits are used.</p>"));
1352 _serialStopBitsComboBox->setWhatsThis(tr("<p>Select the number of 'Stop bits' for the serial output link.</p><p>Note that your selection must equal the number of stop bits configured to the serial connected receiver. Note further that often 1 stop bit is used.</p>"));
1353 _serialFlowControlComboBox->setWhatsThis(tr("<p>Select a 'Flow control' for the serial output link.</p><p>Note that your selection must equal the flow control configured to the serial connected receiver. Select 'OFF' if you don't know better.</p>"));
1354 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>Select 'Auto' to automatically forward NMEA-GGA messages coming from your serial connected receiver to the NTRIP broadcaster and/or save them in a file.</p><p>Select 'Manual' only when handling a VRS stream and your serial connected receiver doesn't generate NMEA-GGA messages.</p>"));
1355 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1356 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meter for your VRS to simulate an inital NMEA-GGA message.</p><p>The setting of this option is ignored in case of streams coming from physical reference stations.</p>"));
1357 _pppMountLineEdit->setWhatsThis(tr("<p>Specify an observations stream by its mountpoint from the 'Streams' list compiled below if you want BNC to estimate coordinates for the affected receiver position through a PPP solution. Example: 'FFMJ1'</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
1358 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock Broadcast Ephemeris corrections stream by its mountpoint from the 'Streams' list below. Example: 'CLK10'</p><p>Note that BNC can produce an internal PPP solution from combined Broadcast Ephemeris corrections as specified under 'Combine Corrections' if you introduce keyword 'INTERNAL' as the corrections mountpoint.</p>"));
1359 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP) in 'Realtime' or 'Post-Processing' mode.</p><p>When in 'Post-Processing mode:<ul><li>Specifying a RINEX Observation, a RINEX Navigation and a Broadcast Correction file leads to a PPP solution.</li><li>Specifying only a RINEX Observation and a RINEX Navigation file and no Broadcast Correction file leads to a SPP solution.</ul></p>"));
1360 _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to edit or concatenate RINEX v2 or v3 files or to perform a quality check following UNAVCO's famous 'teqc' program.</p>"));
1361 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1362 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
1363 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
1364 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for adding GLONASS observations to GPS and Galileo (optional) in a PPP solution.</p>"));
1365 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for adding Galileo observations to GPS and GLONASS (optional) in a PPP solution.</p>"));
1366 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
1367 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
1368 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
1369 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
1370 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'Sigma XYZ Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
1371 _pppMaxSolGapLineEdit->setWhatsThis(tr("<p>Specify a 'Maximum Solution Gap' in seconds. Should the time span between two consecutive solutions exceed this limit, the algorithm returns into Quick-Start mode and fixes the introduced reference coordinate for the specified period. A value of '60' seconds could be an appropriate choice.</p><p>This option makes only sense for a stationary operated receiver where solution convergence can be enforced because a good approximation for the rover position is known. Default is an empty option field, meaning that you don't want BNC to return into the Quick-Start mode after failures caused i.e. by longer lasting outages.</p>"));
1372 _pppAudioResponseLineEdit->setWhatsThis(tr("<p>Specify an 'Audio response' threshold in meters. A beep is produced by BNC whenever a horizontal PPP coordinate component differs by more than the threshold value from the marker coordinate.</p><p>Default is an empty option field, meaning that you don't want BNC to produce alarm signals.</p>"));
1373 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
1374 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
1375 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
1376 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the white noise of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
1377 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
1378 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 3e-6 (default) would mean that the tropospheric effect may vary for 3600 * 3e-6 = 0.01 meters per hour.</p>"));
1379 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p><p>This option only makes sense in static observation conditions.</p>"));
1380 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1381 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p><p>This option only makes sens in static observation conditions.</p>"));
1382 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
1383 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
1384 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
1385 _bncFigurePPP->setWhatsThis(tr("PPP time series of North (red), East (green) and Up (blue) coordinate components are shown in the 'PPP Plot' tab when the corresponting option is selected above. Values are either referred to an XYZ reference coordinate (if specified) or referred to the first estimated set of coordinate compoments. The sliding PPP time series window covers the period of the latest 5 minutes."));
1386 _pppSync->setWhatsThis(tr(
1387 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
1388 "immediately after its arrival using satellite clock corrections available at "
1389 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
1390 "are buffered and the processing of each epoch is postponed till the satellite clock "
1391 "corrections not older than 'Sync Corr' seconds are available.<p>"));
1392 _pppAntexFileChooser->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
1393 _pppAntennaLineEdit->setWhatsThis(tr("<p>Specify the receiver's antenna name as defined in your ANTEX file. Observations will be corrected for the antenna phase center's offset which may result in a reduction of a few centimeters at max. Corrections for phase center variations are not yet applied by BNC. The specified name must consist of 20 characters. Add trailing blanks if the antenna name has less then 20 characters.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets.</p>"));
1394 _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock corrections streams in real-time to produce, encode, upload and save a combination of correctors coming from various providers. Hit the 'Add Row' button, double click on the 'Mountpoint' field to enter a Broadcast Ephemeris corrections mountpoint from the 'Streams' section below and hit Enter. Then double click on the 'AC Name' field to enter your choice of an abbreviation for the Analysis Center (AC) providing the stream. Finally, double click on the 'Weight' field to enter the weight to be applied for this stream in the combination.<ul><li>Note that an appropriate 'Wait for full corr epoch' value needs to be specified for the combination under the 'Broadcast Corrections' tab. A value of 15 seconds would make sense there if the update rate of incoming clock corrections is i.e. 10 seconds.</li><li>Note also that you need to tick 'Use GLONASS' which is part ot the 'PPP (2)' panel in case you want to produce an GPS plus GLONASS combination.</li></ul></p><p>Note further that the orbit information in the final combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris corrections stream in the combination table. Instead of combining corrections BNC will then merge them with Broadcast Ephemeris to save results in SP3 and/or Clock RINEX format."));
1395 _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Residuum' meters from the average of all clocks will be ignored.<p></p>It is suggested to specify a value of about 0.2 m for the Kalman filter combination approach and a value of about 3.0 meters for the Single-Epoch combination approach.</p><p>Default is a value of '999.0'.</p>"));
1396 _cmbSamplSpinBox->setWhatsThis(tr("<p>Specify a combination sampling interval. Clock and orbit corrections will be produced following that interval. A value of 10 sec may be an appropriate choice.</p>"));
1397 _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'. It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning.</p>"));
1398 _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to broadcast ephemeris (Broadcast Corrections) in RTCM Version 3 SSR format. You may have a situation where clocks and orbits come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified NTRIP broadcaster</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris corrections if you specify correction streams in the 'Combine Corrections' stream table.</p><p>Hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an NTRIP broadcaster and hit Enter. Then double click on the 'Port', 'Mount' and 'Password' fields to enter the NTRIP broadcaster IP port (default is 80), the mountpoint and the stream upload password. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference system (e.g. IGS08) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving the generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create SP3 orbit files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.sp3<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><ul><li>As an SP3 file contents should be referred to the satellites Center of Mass (CoM) while correctors are referred to the satellites Antenna Phase Center (APC), an offset has to be applied which is available from an IGS ANTEX file. You should therefore specify the 'ANTEX File' path under tab 'PPP (2)' if you want to save the stream contents in SP3 format. If you don't specify an 'ANTEX File' path there, the SP3 file contents will be referred to the satellites APCs.</li></ul></p><p>Specify a path for saving the generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system:<br>/home/user/BNC${GPSWD}.clk<br>Note that '${GPSWD}' produces the GPS Week and Day number in the file name.</p><p>Specify finally an SSR Provider ID number, an SSR Solution ID number and an Issue of Data SSR number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Corrections stream, BNC will merge that stream with Broadcast Ephemeris to save results in files specified here through SP3 and/or Clock RINEX file path. In such a case you should define only the SP3 and Clock RINEX file path and no further options in the 'Upload Corrections' table.</p>"));
1399 _postObsFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Observation file."));
1400 _postNavFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Navigation file."));
1401 _postCorrFileChooser->setWhatsThis(tr("Full path to Broadcast Corrections file as previously saved with BNC in plain ASCII format."));
1402 _postOutLineEdit->setWhatsThis(tr("Full path to file with post processing PPP results. "));
1403 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1404 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1405 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1406 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1407 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1408 _uploadSamplRtcmEphCorrSpinBox->setWhatsThis(tr("Select the stream's orbit correction sampling interval in seconds. A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages."));
1409 _uploadSamplClkRnxSpinBox->setWhatsThis(tr("Select the Clock RINEX file sampling interval in seconds. A value of zero '0' tells BNC to store all available samples into Clock RINEX files."));
1410 _uploadSamplSp3SpinBox->setWhatsThis(tr("Select the SP3 orbit file sampling interval in minutes. A value of zero '0' tells BNC to store all available samples into SP3 orbit files."));
1411 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1412
1413 _uploadEphHostLineEdit->setWhatsThis(tr("BNC can upload a Broadcast Ephemeris stream in RTCM Version 3 format. Specify the host IP of an NTRIP Broadcaster to upload the stream. An empty option field means that you don't want to upload Broadcast Ephemeris."));
1414 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1415 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1416 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1417 _uploadEphSampleSpinBox->setWhatsThis(tr("Select the Broadcast Ephemeris sampling interval in seconds. Defaut is '5' meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds."));
1418 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1419
1420 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1421 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1422 _actMap->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use the mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
1423
1424 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1425 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1426// Weber
1427
1428 // Enable/Disable all Widgets
1429 // --------------------------
1430 slotBncTextChanged();
1431 enableStartStop();
1432
1433 // Auto start
1434 // ----------
1435 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1436 slotStart();
1437 }
1438}
1439
1440// Destructor
1441////////////////////////////////////////////////////////////////////////////
1442bncWindow::~bncWindow() {
1443 delete _caster;
1444 delete _casterEph;
1445}
1446
1447//
1448////////////////////////////////////////////////////////////////////////////
1449void bncWindow::populateMountPointsTable() {
1450
1451 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1452 _mountPointsTable->removeRow(iRow);
1453 }
1454
1455 bncSettings settings;
1456
1457 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1458 int iRow = 0;
1459 while (it.hasNext()) {
1460 QStringList hlp = it.next().split(" ");
1461 if (hlp.size() < 5) continue;
1462 _mountPointsTable->insertRow(iRow);
1463
1464 QUrl url(hlp[0]);
1465
1466 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1467 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1468 QString nmea(hlp[4]);
1469 if (hlp[5] == "S") {
1470 fullPath = hlp[0].replace(0,2,"");
1471 }
1472 QString ntripVersion = "2";
1473 if (hlp.size() >= 6) {
1474 ntripVersion = (hlp[5]);
1475 }
1476
1477 QTableWidgetItem* it;
1478 it = new QTableWidgetItem(url.userInfo());
1479 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1480 _mountPointsTable->setItem(iRow, 0, it);
1481
1482 it = new QTableWidgetItem(fullPath);
1483 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1484 _mountPointsTable->setItem(iRow, 1, it);
1485
1486 it = new QTableWidgetItem(format);
1487 _mountPointsTable->setItem(iRow, 2, it);
1488
1489 if (nmea == "yes") {
1490 it = new QTableWidgetItem(latitude);
1491 _mountPointsTable->setItem(iRow, 3, it);
1492 it = new QTableWidgetItem(longitude);
1493 _mountPointsTable->setItem(iRow, 4, it);
1494 } else {
1495 it = new QTableWidgetItem(latitude);
1496 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1497 _mountPointsTable->setItem(iRow, 3, it);
1498 it = new QTableWidgetItem(longitude);
1499 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1500 _mountPointsTable->setItem(iRow, 4, it);
1501 }
1502
1503 it = new QTableWidgetItem(nmea);
1504 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1505 _mountPointsTable->setItem(iRow, 5, it);
1506
1507 it = new QTableWidgetItem(ntripVersion);
1508 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1509 _mountPointsTable->setItem(iRow, 6, it);
1510
1511 bncTableItem* bncIt = new bncTableItem();
1512 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1513 _mountPointsTable->setItem(iRow, 7, bncIt);
1514
1515 iRow++;
1516 }
1517
1518 _mountPointsTable->sortItems(1);
1519
1520 enableStartStop();
1521}
1522
1523// Retrieve Table
1524////////////////////////////////////////////////////////////////////////////
1525void bncWindow::slotAddMountPoints() {
1526
1527 bncSettings settings;
1528 QString proxyHost = settings.value("proxyHost").toString();
1529 int proxyPort = settings.value("proxyPort").toInt();
1530 if (proxyHost != _proxyHostLineEdit->text() ||
1531 proxyPort != _proxyPortLineEdit->text().toInt()) {
1532 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1533 "changed. Use the new ones?",
1534 QMessageBox::Yes, QMessageBox::No,
1535 QMessageBox::NoButton);
1536 if (iRet == QMessageBox::Yes) {
1537 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1538 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1539 }
1540 }
1541
1542 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1543 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1544
1545 QMessageBox msgBox;
1546 msgBox.setIcon(QMessageBox::Question);
1547 msgBox.setWindowTitle("Add Stream");
1548 msgBox.setText("Add stream(s) coming from:");
1549
1550 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1551 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1552 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1553 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1554 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1555
1556 msgBox.exec();
1557
1558 if (msgBox.clickedButton() == buttonNtrip) {
1559 bncTableDlg* dlg = new bncTableDlg(this);
1560 dlg->move(this->pos().x()+50, this->pos().y()+50);
1561 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1562 this, SLOT(slotNewMountPoints(QStringList*)));
1563 dlg->exec();
1564 delete dlg;
1565 } else if (msgBox.clickedButton() == buttonIP) {
1566 bncIpPort* ipp = new bncIpPort(this);
1567 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1568 this, SLOT(slotNewMountPoints(QStringList*)));
1569 ipp->exec();
1570 delete ipp;
1571 } else if (msgBox.clickedButton() == buttonUDP) {
1572 bncUdpPort* udp = new bncUdpPort(this);
1573 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1574 this, SLOT(slotNewMountPoints(QStringList*)));
1575 udp->exec();
1576 delete udp;
1577 } else if (msgBox.clickedButton() == buttonSerial) {
1578 bncSerialPort* sep = new bncSerialPort(this);
1579 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1580 this, SLOT(slotNewMountPoints(QStringList*)));
1581 sep->exec();
1582 delete sep;
1583 } else if (msgBox.clickedButton() == buttonCancel) {
1584 // Cancel
1585 }
1586
1587 enableStartStop();
1588}
1589
1590// Delete Selected Mount Points
1591////////////////////////////////////////////////////////////////////////////
1592void bncWindow::slotDeleteMountPoints() {
1593
1594 int nRows = _mountPointsTable->rowCount();
1595 bool flg[nRows];
1596 for (int iRow = 0; iRow < nRows; iRow++) {
1597 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1598 flg[iRow] = true;
1599 }
1600 else {
1601 flg[iRow] = false;
1602 }
1603 }
1604 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1605 if (flg[iRow]) {
1606 _mountPointsTable->removeRow(iRow);
1607 }
1608 }
1609 _actDeleteMountPoints->setEnabled(false);
1610
1611 enableStartStop();
1612}
1613
1614// New Mount Points Selected
1615////////////////////////////////////////////////////////////////////////////
1616void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1617 int iRow = 0;
1618 QListIterator<QString> it(*mountPoints);
1619 while (it.hasNext()) {
1620 QStringList hlp = it.next().split(" ");
1621 QUrl url(hlp[0]);
1622 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1623 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1624 QString nmea(hlp[4]);
1625 if (hlp[5] == "S") {
1626 fullPath = hlp[0].replace(0,2,"");
1627 }
1628 QString ntripVersion = "2";
1629 if (hlp.size() >= 6) {
1630 ntripVersion = (hlp[5]);
1631 }
1632
1633 _mountPointsTable->insertRow(iRow);
1634
1635 QTableWidgetItem* it;
1636 it = new QTableWidgetItem(url.userInfo());
1637 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1638 _mountPointsTable->setItem(iRow, 0, it);
1639
1640 it = new QTableWidgetItem(fullPath);
1641 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1642 _mountPointsTable->setItem(iRow, 1, it);
1643
1644 it = new QTableWidgetItem(format);
1645 _mountPointsTable->setItem(iRow, 2, it);
1646
1647 if (nmea == "yes") {
1648 it = new QTableWidgetItem(latitude);
1649 _mountPointsTable->setItem(iRow, 3, it);
1650 it = new QTableWidgetItem(longitude);
1651 _mountPointsTable->setItem(iRow, 4, it);
1652 } else {
1653 it = new QTableWidgetItem(latitude);
1654 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1655 _mountPointsTable->setItem(iRow, 3, it);
1656 it = new QTableWidgetItem(longitude);
1657 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1658 _mountPointsTable->setItem(iRow, 4, it);
1659 }
1660
1661 it = new QTableWidgetItem(nmea);
1662 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1663 _mountPointsTable->setItem(iRow, 5, it);
1664
1665 it = new QTableWidgetItem(ntripVersion);
1666 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1667 _mountPointsTable->setItem(iRow, 6, it);
1668
1669 bncTableItem* bncIt = new bncTableItem();
1670 _mountPointsTable->setItem(iRow, 7, bncIt);
1671
1672 iRow++;
1673 }
1674 _mountPointsTable->hideColumn(0);
1675 _mountPointsTable->sortItems(1);
1676 delete mountPoints;
1677
1678 enableStartStop();
1679}
1680
1681// Save Options (serialize)
1682////////////////////////////////////////////////////////////////////////////
1683void bncWindow::slotSaveOptions() {
1684 saveOptions();
1685 bncSettings settings;
1686 settings.sync();
1687}
1688
1689// Save Options (memory only)
1690////////////////////////////////////////////////////////////////////////////
1691void bncWindow::saveOptions() {
1692
1693 QStringList mountPoints;
1694 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1695
1696 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1697 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1698 "@" + _mountPointsTable->item(iRow, 1)->text() );
1699
1700 mountPoints.append(url.toString() + " " +
1701 _mountPointsTable->item(iRow, 2)->text()
1702 + " " + _mountPointsTable->item(iRow, 3)->text()
1703 + " " + _mountPointsTable->item(iRow, 4)->text()
1704 + " " + _mountPointsTable->item(iRow, 5)->text()
1705 + " " + _mountPointsTable->item(iRow, 6)->text());
1706 } else {
1707 mountPoints.append(
1708 "//" + _mountPointsTable->item(iRow, 1)->text()
1709 + " " + _mountPointsTable->item(iRow, 2)->text()
1710 + " " + _mountPointsTable->item(iRow, 3)->text()
1711 + " " + _mountPointsTable->item(iRow, 4)->text()
1712 + " " + _mountPointsTable->item(iRow, 5)->text()
1713 + " " + _mountPointsTable->item(iRow, 6)->text());
1714 }
1715 }
1716
1717 QStringList combineStreams;
1718 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1719 QString hlp;
1720 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1721 if (_cmbTable->item(iRow, iCol)) {
1722 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1723 }
1724 }
1725 if (!hlp.isEmpty()) {
1726 combineStreams << hlp;
1727 }
1728 }
1729
1730 QStringList uploadMountpointsOut;
1731 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1732 QString hlp;
1733 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1734 if (_uploadTable->cellWidget(iRow, iCol) &&
1735 (iCol == 3 || iCol == 4 || iCol == 5)) {
1736 if (iCol == 3) {
1737 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1738 hlp += passwd->text() + ",";
1739 }
1740 else if (iCol == 4) {
1741 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1742 hlp += system->currentText() + ",";
1743 }
1744 else if (iCol == 5) {
1745 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1746 QString state; state.setNum(com->checkState());
1747 hlp += state + ",";
1748 }
1749 }
1750 else if (_uploadTable->item(iRow, iCol)) {
1751 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1752 }
1753 }
1754 if (!hlp.isEmpty()) {
1755 uploadMountpointsOut << hlp;
1756 }
1757 }
1758
1759 bncSettings settings;
1760
1761 settings.setValue("startTab", _aogroup->currentIndex());
1762 settings.setValue("statusTab", _loggroup->currentIndex());
1763 settings.setValue("mountPoints", mountPoints);
1764// Network
1765 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1766 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1767 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1768 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1769// General
1770 settings.setValue("logFile", _logFileLineEdit->text());
1771 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1772 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1773 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1774 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1775// RINEX Observations
1776 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1777 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1778 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1779 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1780 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1781 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1782// RINEX Ephemeris
1783 settings.setValue("ephPath", _ephPathLineEdit->text());
1784 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1785 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1786 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1787// Broadcast Corrections
1788 settings.setValue("corrPath", _corrPathLineEdit->text());
1789 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1790 settings.setValue("corrPort", _corrPortLineEdit->text());
1791 settings.setValue("corrTime", _corrTimeSpinBox->value());
1792// Feed Engine
1793 settings.setValue("outPort", _outPortLineEdit->text());
1794 settings.setValue("waitTime", _waitTimeSpinBox->value());
1795 settings.setValue("binSampl", _binSamplSpinBox->value());
1796 settings.setValue("outFile", _outFileLineEdit->text());
1797 settings.setValue("outUPort", _outUPortLineEdit->text());
1798// Serial Output
1799 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1800 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1801 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1802 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1803 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1804 settings.setValue("serialParity", _serialParityComboBox->currentText());
1805 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1806 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1807 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1808 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1809// Outages
1810 settings.setValue("obsRate", _obsRateComboBox->currentText());
1811 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1812 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1813 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1814// Miscellaneous
1815 settings.setValue("miscMount", _miscMountLineEdit->text());
1816 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1817 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1818// PPPP
1819 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1820 settings.setValue("pppMount", _pppMountLineEdit->text());
1821 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1822 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1823 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1824 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1825 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1826 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1827 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1828 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1829 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1830 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1831 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1832 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1833 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1834 settings.setValue("postOutFile", _postOutLineEdit->text());
1835 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1836 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1837 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1838 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1839 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1840 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1841 settings.setValue("pppSync", _pppSync->text());
1842 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1843 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1844 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1845 settings.setValue("pppAudioResponse", _pppAudioResponseLineEdit->text());
1846 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1847 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1848 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1849 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1850 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1851 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1852// Reqc
1853 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1854 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1855 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1856 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1857 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1858 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1859 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
1860// Combine Corrections
1861 if (!combineStreams.isEmpty()) {
1862 settings.setValue("combineStreams", combineStreams);
1863 }
1864 else {
1865 settings.setValue("combineStreams", "");
1866 }
1867 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1868 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1869 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1870// Upload Corrections
1871 if (!uploadMountpointsOut.isEmpty()) {
1872 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1873 }
1874 else {
1875 settings.setValue("uploadMountpointsOut", "");
1876 }
1877 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1878 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1879 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1880 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1881// Upload Ephemeris
1882 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1883 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1884 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1885 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1886 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1887
1888#ifdef RTROVER_INTERFACE
1889 settings.setValue("rtroverMode", _rtroverModeComboBox->currentText());
1890 settings.setValue("rtroverRoverMount", _rtroverRoverMountLineEdit->text());
1891 settings.setValue("rtroverCorrMount", _rtroverCorrMountLineEdit->text());
1892 settings.setValue("rtroverBaseMount", _rtroverBaseMountLineEdit->text());
1893 settings.setValue("rtroverRoverRefCrdX", _rtroverRoverRefCrdXLineEdit->text());
1894 settings.setValue("rtroverRoverRefCrdY", _rtroverRoverRefCrdYLineEdit->text());
1895 settings.setValue("rtroverRoverRefCrdZ", _rtroverRoverRefCrdZLineEdit->text());
1896 settings.setValue("rtroverBaseRefCrdX", _rtroverBaseRefCrdXLineEdit->text());
1897 settings.setValue("rtroverBaseRefCrdY", _rtroverBaseRefCrdYLineEdit->text());
1898 settings.setValue("rtroverBaseRefCrdZ", _rtroverBaseCrdZLineEdit->text());
1899 settings.setValue("rtroverRoverDN", _rtroverRoverDNLineEdit->text());
1900 settings.setValue("rtroverRoverDE", _rtroverRoverDELineEdit->text());
1901 settings.setValue("rtroverRoverDU", _rtroverRoverDULineEdit->text());
1902 settings.setValue("rtroverBaseDN", _rtroverBaseDNLineEdit->text());
1903 settings.setValue("rtroverBaseDE", _rtroverBaseDELineEdit->text());
1904 settings.setValue("rtroverBaseDU", _rtroverBaseDULineEdit->text());
1905 settings.setValue("rtroverRoverAntenna", _rtroverRoverAntennaLineEdit->text());
1906 settings.setValue("rtroverBaseAntenna", _rtroverBaseAntennaLineEdit->text());
1907 settings.setValue("rtroverAntex", _rtroverAntexFileChooser->fileName());
1908 settings.setValue("rtroverOutput", _rtroverOutputLineEdit->text());
1909#endif
1910
1911 if (_caster) {
1912 _caster->readMountPoints();
1913 }
1914}
1915
1916// All get slots terminated
1917////////////////////////////////////////////////////////////////////////////
1918void bncWindow::slotGetThreadsFinished() {
1919 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1920 delete _caster; _caster = 0;
1921 delete _casterEph; _casterEph = 0;
1922 _runningRealTime = false;
1923}
1924
1925// Start It!
1926////////////////////////////////////////////////////////////////////////////
1927void bncWindow::slotStart() {
1928 saveOptions();
1929 if ( _pppSPPComboBox->currentText() == "Post-Processing" ) {
1930 startPostProcessingPPP();
1931 }
1932 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1933 startPostProcessingReqc();
1934 }
1935 else {
1936 startRealTime();
1937 }
1938}
1939
1940// Start Real-Time (Retrieve Data etc.)
1941////////////////////////////////////////////////////////////////////////////
1942void bncWindow::startRealTime() {
1943
1944 _runningRealTime = true;
1945
1946 _bncFigurePPP->reset();
1947
1948 _actDeleteMountPoints->setEnabled(false);
1949
1950 enableStartStop();
1951
1952 _caster = new bncCaster(_outFileLineEdit->text(),
1953 _outPortLineEdit->text().toInt());
1954
1955 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1956 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1957 ((bncApp*)qApp)->initCombination();
1958
1959 connect(_caster, SIGNAL(getThreadsFinished()),
1960 this, SLOT(slotGetThreadsFinished()));
1961
1962 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1963 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1964
1965 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1966
1967 bncSettings settings;
1968
1969 QDir rnxdir(settings.value("rnxPath").toString());
1970 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1971
1972 QString rnx_file = settings.value("rnxScript").toString();
1973 if ( !rnx_file.isEmpty() ) {
1974 QFile rnxfile(settings.value("rnxScript").toString());
1975 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1976 }
1977
1978 QDir ephdir(settings.value("ephPath").toString());
1979 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1980
1981 QDir corrdir(settings.value("corrPath").toString());
1982 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1983
1984 QString advise_file = settings.value("adviseScript").toString();
1985 if ( !advise_file.isEmpty() ) {
1986 QFile advisefile(settings.value("adviseScript").toString());
1987 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1988 }
1989
1990 QString ant_file = settings.value("pppAntex").toString();
1991 if ( !ant_file.isEmpty() ) {
1992 QFile anxfile(settings.value("pppAntex").toString());
1993 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1994 }
1995
1996 _caster->readMountPoints();
1997
1998 _casterEph = new bncEphUploadCaster();
1999 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
2000 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
2001}
2002
2003// Retrieve Data
2004////////////////////////////////////////////////////////////////////////////
2005void bncWindow::slotStop() {
2006 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
2007 QMessageBox::Yes, QMessageBox::No,
2008 QMessageBox::NoButton);
2009 if (iRet == QMessageBox::Yes) {
2010 ((bncApp*)qApp)->stopCombination();
2011 delete _caster; _caster = 0;
2012 delete _casterEph; _casterEph = 0;
2013 _runningRealTime = false;
2014 enableStartStop();
2015 }
2016}
2017
2018// Close Application gracefully
2019////////////////////////////////////////////////////////////////////////////
2020void bncWindow::closeEvent(QCloseEvent* event) {
2021
2022 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2023 QMessageBox::Yes, QMessageBox::No,
2024 QMessageBox::Cancel);
2025
2026 if (iRet == QMessageBox::Cancel) {
2027 event->ignore();
2028 return;
2029 }
2030 else if (iRet == QMessageBox::Yes) {
2031 slotSaveOptions();
2032 }
2033
2034 QMainWindow::closeEvent(event);
2035}
2036
2037// User changed the selection of mountPoints
2038////////////////////////////////////////////////////////////////////////////
2039void bncWindow::slotSelectionChanged() {
2040 if (_mountPointsTable->selectedItems().isEmpty()) {
2041 _actDeleteMountPoints->setEnabled(false);
2042 }
2043 else {
2044 _actDeleteMountPoints->setEnabled(true);
2045 }
2046}
2047
2048// Display Program Messages
2049////////////////////////////////////////////////////////////////////////////
2050void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2051
2052#ifdef DEBUG_RTCM2_2021
2053 const int maxBufferSize = 1000;
2054#else
2055 const int maxBufferSize = 10000;
2056#endif
2057
2058 if (! showOnScreen ) {
2059 return;
2060 }
2061
2062 QString txt = _log->toPlainText() + "\n" +
2063 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
2064 _log->clear();
2065 _log->append(txt.right(maxBufferSize));
2066}
2067
2068// About Message
2069////////////////////////////////////////////////////////////////////////////
2070void bncWindow::slotAbout() {
2071 new bncAboutDlg(0);
2072}
2073
2074//Flowchart
2075////////////////////////////////////////////////////////////////////////////
2076void bncWindow::slotFlowchart() {
2077 new bncFlowchartDlg(0);
2078}
2079
2080// Help Window
2081////////////////////////////////////////////////////////////////////////////
2082void bncWindow::slotHelp() {
2083 QUrl url;
2084 url.setPath(":bnchelp.html");
2085 new bncHlpDlg(0, url);
2086}
2087
2088// Select Fonts
2089////////////////////////////////////////////////////////////////////////////
2090void bncWindow::slotFontSel() {
2091 bool ok;
2092 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2093 if (ok) {
2094 bncSettings settings;
2095 settings.setValue("font", newFont.toString());
2096 QApplication::setFont(newFont);
2097 int ww = QFontMetrics(newFont).width('w');
2098 setMinimumSize(60*ww, 80*ww);
2099 resize(60*ww, 80*ww);
2100 }
2101}
2102
2103// Whats This Help
2104void bncWindow::slotWhatsThis() {
2105 QWhatsThis::enterWhatsThisMode();
2106}
2107
2108//
2109////////////////////////////////////////////////////////////////////////////
2110void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2111 _bncFigure->updateMountPoints();
2112 _bncFigureLate->updateMountPoints();
2113
2114 populateMountPointsTable();
2115 bncSettings settings;
2116 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
2117 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
2118 QListIterator<bncGetThread*> iTh(threads);
2119 while (iTh.hasNext()) {
2120 bncGetThread* thread = iTh.next();
2121 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2122 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2123 "@" + _mountPointsTable->item(iRow, 1)->text() );
2124 if (url == thread->mountPoint() &&
2125 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
2126 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
2127 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
2128 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2129 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2130 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2131 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2132 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2133 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2134 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2135 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2136 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
2137 disconnect(thread,
2138 SIGNAL(newPosition(bncTime, double, double, double)),
2139 _bncFigurePPP,
2140 SLOT(slotNewPosition(bncTime, double, double, double)));
2141 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2142 _bncFigurePPP,
2143 SLOT(slotNewPosition(bncTime, double, double, double)));
2144 }
2145 break;
2146 }
2147 }
2148 }
2149}
2150
2151//
2152////////////////////////////////////////////////////////////////////////////
2153void bncWindow::CreateMenu() {
2154 // Create Menus
2155 // ------------
2156 _menuFile = menuBar()->addMenu(tr("&File"));
2157 _menuFile->addAction(_actFontSel);
2158 _menuFile->addSeparator();
2159 _menuFile->addAction(_actSaveOpt);
2160 _menuFile->addSeparator();
2161 _menuFile->addAction(_actQuit);
2162
2163 _menuHlp = menuBar()->addMenu(tr("&Help"));
2164 _menuHlp->addAction(_actHelp);
2165 _menuHlp->addAction(_actFlowchart);
2166 _menuHlp->addAction(_actAbout);
2167}
2168
2169// Toolbar
2170////////////////////////////////////////////////////////////////////////////
2171void bncWindow::AddToolbar() {
2172 QToolBar* toolBar = new QToolBar;
2173 addToolBar(Qt::BottomToolBarArea, toolBar);
2174 toolBar->setMovable(false);
2175 toolBar->addAction(_actAddMountPoints);
2176 toolBar->addAction(_actDeleteMountPoints);
2177 toolBar->addAction(_actMap);
2178 toolBar->addAction(_actStart);
2179 toolBar->addAction(_actStop);
2180 toolBar->addWidget(new QLabel(" "));
2181 toolBar->addAction(_actwhatsthis);
2182}
2183
2184// About
2185////////////////////////////////////////////////////////////////////////////
2186bncAboutDlg::bncAboutDlg(QWidget* parent) :
2187 QDialog(parent) {
2188
2189 QTextBrowser* tb = new QTextBrowser;
2190 QUrl url; url.setPath(":bncabout.html");
2191 tb->setSource(url);
2192 tb->setReadOnly(true);
2193
2194 int ww = QFontMetrics(font()).width('w');
2195 QPushButton* _closeButton = new QPushButton("Close");
2196 _closeButton->setMaximumWidth(10*ww);
2197 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2198
2199 QGridLayout* dlgLayout = new QGridLayout();
2200 QLabel* img = new QLabel();
2201 img->setPixmap(QPixmap(":ntrip-logo.png"));
2202 dlgLayout->addWidget(img, 0,0);
2203 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
2204 dlgLayout->addWidget(tb,1,0,1,2);
2205 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2206
2207 setLayout(dlgLayout);
2208 resize(60*ww, 60*ww);
2209 setWindowTitle("About BNC");
2210 show();
2211}
2212
2213//
2214////////////////////////////////////////////////////////////////////////////
2215bncAboutDlg::~bncAboutDlg() {
2216};
2217
2218// Flowchart
2219////////////////////////////////////////////////////////////////////////////
2220bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2221 QDialog(parent) {
2222
2223 int ww = QFontMetrics(font()).width('w');
2224 QPushButton* _closeButton = new QPushButton("Close");
2225 _closeButton->setMaximumWidth(10*ww);
2226 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2227
2228 QGridLayout* dlgLayout = new QGridLayout();
2229 QLabel* img = new QLabel();
2230 img->setPixmap(QPixmap(":bncflowchart.png"));
2231 dlgLayout->addWidget(img, 0,0);
2232 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2233
2234 setLayout(dlgLayout);
2235 setWindowTitle("Flow Chart");
2236 show();
2237}
2238
2239//
2240////////////////////////////////////////////////////////////////////////////
2241bncFlowchartDlg::~bncFlowchartDlg() {
2242};
2243
2244// Enable/Disable Widget (and change its color)
2245////////////////////////////////////////////////////////////////////////////
2246void bncWindow::enableWidget(bool enable, QWidget* widget) {
2247 const static QPalette paletteWhite(QColor(255, 255, 255));
2248 const static QPalette paletteGray(QColor(230, 230, 230));
2249
2250 widget->setEnabled(enable);
2251 if (enable) {
2252 widget->setPalette(paletteWhite);
2253 }
2254 else {
2255 widget->setPalette(paletteGray);
2256 }
2257}
2258
2259// Bnc Text
2260////////////////////////////////////////////////////////////////////////////
2261void bncWindow::slotBncTextChanged(){
2262
2263 bool enable = true;
2264
2265 // Proxy
2266 //------
2267 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2268 enable = !_proxyHostLineEdit->text().isEmpty();
2269 enableWidget(enable, _proxyPortLineEdit);
2270 }
2271
2272 // RINEX Observations
2273 // ------------------
2274 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2275 enable = !_rnxPathLineEdit->text().isEmpty();
2276 enableWidget(enable, _rnxSamplSpinBox);
2277 enableWidget(enable, _rnxSkelLineEdit);
2278 enableWidget(enable, _rnxScrpLineEdit);
2279 enableWidget(enable, _rnxV3CheckBox);
2280 enableWidget(enable, _rnxIntrComboBox);
2281 }
2282
2283 // RINEX Ephemeris
2284 // ---------------
2285 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2286 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2287 enableWidget(enable, _ephIntrComboBox);
2288 enableWidget(enable, _ephV3CheckBox);
2289 }
2290
2291 // Broadcast Corrections
2292 // ---------------------
2293 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2294 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2295 enableWidget(enable, _corrIntrComboBox);
2296 }
2297
2298 // Feed Engine
2299 // -----------
2300 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2301 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2302 enableWidget(enable, _waitTimeSpinBox);
2303 enableWidget(enable, _binSamplSpinBox);
2304 }
2305
2306 // Serial Output
2307 // -------------
2308 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2309 sender() == _serialAutoNMEAComboBox) {
2310 enable = !_serialMountPointLineEdit->text().isEmpty();
2311 enableWidget(enable, _serialPortNameLineEdit);
2312 enableWidget(enable, _serialBaudRateComboBox);
2313 enableWidget(enable, _serialParityComboBox);
2314 enableWidget(enable, _serialDataBitsComboBox);
2315 enableWidget(enable, _serialStopBitsComboBox);
2316 enableWidget(enable, _serialFlowControlComboBox);
2317 enableWidget(enable, _serialAutoNMEAComboBox);
2318
2319 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2320 enableWidget(enable2, _serialFileNMEALineEdit);
2321 }
2322
2323 // Outages
2324 // -------
2325 if (sender() == 0 || sender() == _obsRateComboBox) {
2326 enable = !_obsRateComboBox->currentText().isEmpty();
2327 enableWidget(enable, _adviseFailSpinBox);
2328 enableWidget(enable, _adviseRecoSpinBox);
2329 enableWidget(enable, _adviseScriptLineEdit);
2330 }
2331
2332 // Miscellaneous
2333 // -------------
2334 if (sender() == 0 || sender() == _miscMountLineEdit) {
2335 enable = !_miscMountLineEdit->text().isEmpty();
2336 enableWidget(enable, _perfIntrComboBox);
2337 enableWidget(enable, _scanRTCMCheckBox);
2338 }
2339
2340 // Enable/disable Broadcast Ephemerides
2341 // ------------------------------------
2342 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2343 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2344 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2345 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2346 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2347 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2348 _uploadEphPortLineEdit->setEnabled(true);
2349 _uploadEphMountpointLineEdit->setEnabled(true);
2350 _uploadEphPasswordLineEdit->setEnabled(true);
2351 _uploadEphSampleSpinBox->setEnabled(true);
2352 }
2353 else {
2354 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2355 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2356 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2357 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2358 _uploadEphPortLineEdit->setEnabled(false);
2359 _uploadEphMountpointLineEdit->setEnabled(false);
2360 _uploadEphPasswordLineEdit->setEnabled(false);
2361 _uploadEphSampleSpinBox->setEnabled(false);
2362 }
2363 }
2364
2365 // Combine Corrections
2366 // -------------------
2367 if (sender() == 0 || sender() == _cmbTable) {
2368 int iRow = _cmbTable->rowCount();
2369 if (iRow > 0) {
2370 enableWidget(true, _cmbMethodComboBox);
2371 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2372 _cmbMaxresLineEdit->setEnabled(true);
2373 _cmbSamplSpinBox->setEnabled(true);
2374 }
2375 else {
2376 enableWidget(false, _cmbMethodComboBox);
2377 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2378 _cmbMaxresLineEdit->setEnabled(false);
2379 _cmbSamplSpinBox->setEnabled(false);
2380 }
2381 }
2382
2383 // Upload(clk)
2384 // -----------
2385 int iRow = _uploadTable->rowCount();
2386 if (iRow > 0) {
2387 enableWidget(true, _uploadIntrComboBox);
2388 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2389 enableWidget(true, _uploadSamplClkRnxSpinBox);
2390 enableWidget(true, _uploadSamplSp3SpinBox);
2391 }
2392 else {
2393 enableWidget(false, _uploadIntrComboBox);
2394 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2395 enableWidget(false, _uploadSamplClkRnxSpinBox);
2396 enableWidget(false, _uploadSamplSp3SpinBox);
2397 }
2398
2399 // PPP Client
2400 // ----------
2401 if (sender() == 0
2402 || sender() == _pppMountLineEdit
2403 || sender() == _pppCorrMountLineEdit
2404 || sender() == _pppRefCrdXLineEdit
2405 || sender() == _pppRefCrdYLineEdit
2406 || sender() == _pppRefCrdZLineEdit
2407 || sender() == _pppRefdNLineEdit
2408 || sender() == _pppRefdELineEdit
2409 || sender() == _pppRefdULineEdit
2410 || sender() == _pppSync
2411 || sender() == _pppSPPComboBox
2412 || sender() == _pppQuickStartLineEdit
2413 || sender() == _pppEstTropoCheckBox
2414 || sender() == _pppUsePhaseCheckBox
2415 || sender() == _pppAntexFileChooser ) {
2416
2417 enable = !_pppSPPComboBox->currentText().isEmpty();
2418 if (enable) {
2419 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2420 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "Realtime-SPP") ||
2421 (_pppSPPComboBox->currentText() == "Post-Processing");
2422 }
2423
2424 enableWidget(enable, _pppNMEALineEdit);
2425 enableWidget(enable, _pppNMEAPortLineEdit);
2426 enableWidget(enable, _pppRefCrdXLineEdit);
2427 enableWidget(enable, _pppRefCrdYLineEdit);
2428 enableWidget(enable, _pppRefCrdZLineEdit);
2429 enableWidget(enable, _pppRefdNLineEdit);
2430 enableWidget(enable, _pppRefdELineEdit);
2431 enableWidget(enable, _pppRefdULineEdit);
2432 enableWidget(enable, _pppUsePhaseCheckBox);
2433 enableWidget(enable, _pppPlotCoordinates);
2434 enableWidget(enable, _pppEstTropoCheckBox);
2435// enableWidget(enable, _pppGLONASSCheckBox);
2436 enableWidget(enable, _pppGalileoCheckBox);
2437// enableWidget(enable, _pppAntexFileChooser);
2438 enableWidget(enable, _pppSigCLineEdit);
2439 enableWidget(enable, _pppSigCrd0);
2440 enableWidget(enable, _pppSigCrdP);
2441
2442 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2443 !_pppRefCrdYLineEdit->text().isEmpty() &&
2444 !_pppRefCrdZLineEdit->text().isEmpty();
2445
2446 enableWidget(enable2, _pppAverageLineEdit);
2447 enableWidget(enable2, _pppQuickStartLineEdit);
2448
2449 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2450 enableWidget(enable3, _pppMaxSolGapLineEdit);
2451 enableWidget(enable3, _pppAudioResponseLineEdit);
2452
2453 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2454 enableWidget(enable4, _pppAntennaLineEdit);
2455
2456 bool enable5 = enable && _pppEstTropoCheckBox->isChecked();
2457 enableWidget(enable5, _pppSigTrp0);
2458 enableWidget(enable5, _pppSigTrpP);
2459
2460 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2461 enableWidget(enable6, _pppSigPLineEdit);
2462
2463 bool enable7 = enable && _pppSPPComboBox->currentText() == "Realtime-PPP";
2464 enableWidget(enable7, _pppSync);
2465
2466 bool enable8 = _pppSPPComboBox->currentText() == "Realtime-PPP";
2467 enableWidget(enable8, _pppCorrMountLineEdit);
2468
2469 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2470 enableWidget(enable9, _postObsFileChooser);
2471 enableWidget(enable9, _postNavFileChooser);
2472 enableWidget(enable9, _postCorrFileChooser);
2473 enableWidget(enable9, _postOutLineEdit);
2474
2475 bool enable10 = !_pppSPPComboBox->currentText().isEmpty() && !enable9;
2476 enableWidget(enable10, _pppMountLineEdit);
2477 }
2478
2479 if (sender() == 0 || sender() == _reqcActionComboBox) {
2480 enable = !_reqcActionComboBox->currentText().isEmpty();
2481 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2482 enableWidget(enable && enable10, _reqcEditOptionButton);
2483 enableWidget(enable, _reqcObsFileChooser);
2484 enableWidget(enable, _reqcNavFileChooser);
2485 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2486 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2487 enableWidget(enable, _reqcOutLogLineEdit);
2488 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2489 }
2490
2491 enableStartStop();
2492}
2493
2494//
2495////////////////////////////////////////////////////////////////////////////
2496void bncWindow::slotAddCmbRow() {
2497 int iRow = _cmbTable->rowCount();
2498 _cmbTable->insertRow(iRow);
2499 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2500 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2501 }
2502}
2503
2504//
2505////////////////////////////////////////////////////////////////////////////
2506void bncWindow::slotDelCmbRow() {
2507 int nRows = _cmbTable->rowCount();
2508 bool flg[nRows];
2509 for (int iRow = 0; iRow < nRows; iRow++) {
2510 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2511 flg[iRow] = true;
2512 }
2513 else {
2514 flg[iRow] = false;
2515 }
2516 }
2517 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2518 if (flg[iRow]) {
2519 _cmbTable->removeRow(iRow);
2520 }
2521 }
2522 nRows = _cmbTable->rowCount();
2523 if (nRows < 1) {
2524 enableWidget(false, _cmbMethodComboBox);
2525 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2526 _cmbMaxresLineEdit->setEnabled(false);
2527 _cmbSamplSpinBox->setEnabled(false);
2528 }
2529}
2530
2531//
2532////////////////////////////////////////////////////////////////////////////
2533void bncWindow::populateCmbTable() {
2534
2535 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2536 _cmbTable->removeRow(iRow);
2537 }
2538
2539 bncSettings settings;
2540
2541 int iRow = -1;
2542 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2543 while (it.hasNext()) {
2544 QStringList hlp = it.next().split(" ");
2545 if (hlp.size() > 2) {
2546 ++iRow;
2547 _cmbTable->insertRow(iRow);
2548 }
2549 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2550 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2551 }
2552 }
2553}
2554
2555//
2556////////////////////////////////////////////////////////////////////////////
2557void bncWindow::slotAddUploadRow() {
2558 int iRow = _uploadTable->rowCount();
2559 _uploadTable->insertRow(iRow);
2560 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2561 if (iCol == 3) {
2562 QLineEdit* passwd = new QLineEdit();
2563 passwd->setFrame(false);
2564 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2565 _uploadTable->setCellWidget(iRow, iCol, passwd);
2566 }
2567 else if (iCol == 4) {
2568 QComboBox* system = new QComboBox();
2569 system->setEditable(false);
2570 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2571 system->setFrame(false);
2572 _uploadTable->setCellWidget(iRow, iCol, system);
2573 }
2574 else if (iCol == 5) {
2575 QCheckBox* com = new QCheckBox();
2576 _uploadTable->setCellWidget(iRow, iCol, com);
2577 }
2578 else if (iCol == 11) {
2579 bncTableItem* bncIt = new bncTableItem();
2580 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2581 _uploadTable->setItem(iRow, iCol, bncIt);
2582 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2583 }
2584 else {
2585 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2586 }
2587 }
2588}
2589
2590//
2591////////////////////////////////////////////////////////////////////////////
2592void bncWindow::slotDelUploadRow() {
2593 ((bncApp*)qApp)->_uploadTableItems.clear();
2594 int nRows = _uploadTable->rowCount();
2595 bool flg[nRows];
2596 for (int iRow = 0; iRow < nRows; iRow++) {
2597 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2598 flg[iRow] = true;
2599 }
2600 else {
2601 flg[iRow] = false;
2602 }
2603 }
2604 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2605 if (flg[iRow]) {
2606 _uploadTable->removeRow(iRow);
2607 }
2608 }
2609 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2610 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2611 (bncTableItem*) _uploadTable->item(iRow, 11);
2612 }
2613 nRows = _uploadTable->rowCount();
2614 if (nRows < 1) {
2615 enableWidget(false, _uploadIntrComboBox);
2616 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2617 enableWidget(false, _uploadSamplSp3SpinBox);
2618 enableWidget(false, _uploadSamplClkRnxSpinBox);
2619 }
2620}
2621
2622//
2623////////////////////////////////////////////////////////////////////////////
2624void bncWindow::populateUploadTable() {
2625 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2626 _uploadTable->removeRow(iRow);
2627 }
2628
2629 bncSettings settings;
2630
2631 int iRow = -1;
2632 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2633 while (it.hasNext()) {
2634 QStringList hlp = it.next().split(",");
2635 if (hlp.size() > 6) {
2636 ++iRow;
2637 _uploadTable->insertRow(iRow);
2638 }
2639 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2640 if (iCol == 3) {
2641 QLineEdit* passwd = new QLineEdit();
2642 passwd->setFrame(false);
2643 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2644 passwd->setText(hlp[iCol]);
2645 _uploadTable->setCellWidget(iRow, iCol, passwd);
2646 }
2647 else if (iCol == 4) {
2648 QComboBox* system = new QComboBox();
2649 system->setEditable(false);
2650 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2651 system->setFrame(false);
2652 system->setCurrentIndex(system->findText(hlp[iCol]));
2653 _uploadTable->setCellWidget(iRow, iCol, system);
2654 }
2655 else if (iCol == 5) {
2656 QCheckBox* com = new QCheckBox();
2657 if (hlp[iCol].toInt() == Qt::Checked) {
2658 com->setCheckState(Qt::Checked);
2659 }
2660 _uploadTable->setCellWidget(iRow, iCol, com);
2661 }
2662 else if (iCol == 11) {
2663 bncTableItem* bncIt = new bncTableItem();
2664 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2665 _uploadTable->setItem(iRow, iCol, bncIt);
2666 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2667 }
2668 else {
2669 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2670 }
2671 }
2672 }
2673}
2674
2675//
2676////////////////////////////////////////////////////////////////////////////
2677void bncWindow::slotSetUploadTrafo() {
2678 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2679 dlg->exec();
2680 delete dlg;
2681}
2682
2683// Start Post-Processing PPP
2684////////////////////////////////////////////////////////////////////////////
2685void bncWindow::startPostProcessingPPP() {
2686#ifdef USE_POSTPROCESSING
2687 _runningPostProcessingPPP = true;
2688 _actStart->setText("0 Epochs");
2689 enableStartStop();
2690
2691 t_postProcessing* postProcessing = new t_postProcessing(this);
2692 connect(postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessingPPP()));
2693 connect(postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2694
2695 postProcessing->start();
2696#else
2697 QMessageBox::information(this, "Information",
2698 "Post-Processing Not Permitted");
2699#endif
2700}
2701
2702// Post-Processing PPP Finished
2703////////////////////////////////////////////////////////////////////////////
2704void bncWindow::slotFinishedPostProcessingPPP() {
2705 _runningPostProcessingPPP = false;
2706 QMessageBox::information(this, "Information",
2707 "Post-Processing Thread Finished");
2708 _actStart->setText("Start");
2709 enableStartStop();
2710}
2711
2712// Progress Bar Change
2713////////////////////////////////////////////////////////////////////////////
2714void bncWindow::slotPostProgress(int nEpo) {
2715 if (_actStart) {
2716 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2717 }
2718}
2719
2720// Start Post-Processing Reqc
2721////////////////////////////////////////////////////////////////////////////
2722void bncWindow::startPostProcessingReqc() {
2723#ifdef USE_POSTPROCESSING
2724 _runningPostProcessingReqc = true;
2725 enableStartStop();
2726 if (_reqcActionComboBox->currentText() == "Analyze") {
2727 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2728 connect(reqcAnalyze, SIGNAL(finished()),
2729 this, SLOT(slotFinishedPostProcessingReqc()));
2730 reqcAnalyze->start();
2731 }
2732 else {
2733 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2734 connect(reqcEdit, SIGNAL(finished()),
2735 this, SLOT(slotFinishedPostProcessingReqc()));
2736 reqcEdit->start();
2737 }
2738#else
2739 QMessageBox::information(this, "Information",
2740 "Post-Processing Not Permitted");
2741#endif
2742}
2743
2744// Post-Processing Reqc Finished
2745////////////////////////////////////////////////////////////////////////////
2746void bncWindow::slotFinishedPostProcessingReqc() {
2747 _runningPostProcessingReqc = false;
2748 if (_reqcActionComboBox->currentText() != "Analyze") {
2749 QMessageBox::information(this, "Information",
2750 "RINEX Processing Thread Finished");
2751 }
2752 enableStartStop();
2753}
2754
2755// Edit teqc-like editing options
2756////////////////////////////////////////////////////////////////////////////
2757void bncWindow::slotReqcEditOption() {
2758 reqcDlg* dlg = new reqcDlg(this);
2759 dlg->move(this->pos().x()+50, this->pos().y()+50);
2760 dlg->exec();
2761 delete dlg;
2762}
2763
2764// Enable/Disable Start and Stop Buttons
2765////////////////////////////////////////////////////////////////////////////
2766void bncWindow::enableStartStop() {
2767
2768 if ( _pppSPPComboBox && _pppSPPComboBox->currentText() == "Post-Processing" ) {
2769 if (_runningPostProcessingPPP) {
2770 _actStart->setEnabled(false);
2771 }
2772 else {
2773 _actStart->setEnabled(true);
2774 }
2775 _actStop->setEnabled(false);
2776 }
2777 else if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2778 if (_runningPostProcessingReqc) {
2779 _actStart->setEnabled(false);
2780 }
2781 else {
2782 _actStart->setEnabled(true);
2783 }
2784 _actStop->setEnabled(false);
2785 }
2786 else {
2787 if (_runningRealTime) {
2788 _actStart->setEnabled(false);
2789 _actStop->setEnabled(true);
2790 }
2791 else {
2792 _actStop->setEnabled(false);
2793 if (_mountPointsTable->rowCount() == 0) {
2794 _actStart->setEnabled(false);
2795 }
2796 else {
2797 _actStart->setEnabled(true);
2798 }
2799 }
2800 }
2801}
2802
2803// Show Map
2804////////////////////////////////////////////////////////////////////////////
2805void bncWindow::slotMap() {
2806 saveOptions();
2807 t_bncMap* bncMap = new t_bncMap(this);
2808 bncMap->setMinimumSize(800, 600);
2809 bncMap->setWindowTitle("Selected Mountpoints");
2810
2811 bncSettings settings;
2812 QListIterator<QString> it(settings.value("mountPoints").toStringList());
2813 while (it.hasNext()) {
2814 QStringList hlp = it.next().split(" ");
2815 if (hlp.size() < 5) continue;
2816 QUrl url(hlp[0]);
2817 double latDeg = hlp[2].toDouble();
2818 double lonDeg = hlp[3].toDouble();
2819 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
2820 }
2821
2822 bncMap->show();
2823}
Note: See TracBrowser for help on using the repository browser.