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

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