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

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