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

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