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

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