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

Last change on this file since 5688 was 5688, checked in by mervart, 10 years ago
File size: 151.5 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->addItem(new QSpacerItem(4*ww, 0), ir, 2);
1143 pppLayout1->addWidget(new QLabel("RINEX Observations"), ir, 3, Qt::AlignLeft);
1144 pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 4, 1, 2);
1145 ++ir;
1146 pppLayout1->addWidget(new QLabel("RINEX Orbits"), ir, 3, Qt::AlignLeft);
1147 pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 4, 1, 2);
1148 ++ir;
1149 pppLayout1->addWidget(new QLabel("Corrections"), ir, 0, Qt::AlignLeft);
1150 pppLayout1->addWidget(_pppWidgets._corrHostPort, ir, 1);
1151 pppLayout1->addWidget(new QLabel("Corrections"), ir, 3, Qt::AlignLeft);
1152 pppLayout1->addWidget(_pppWidgets._corrFile, ir, 4, 1, 2);
1153 ++ir;
1154 pppLayout1->addWidget(new QLabel("<b>Input</b>"), ir, 0, Qt::AlignLeft);
1155 pppLayout1->addWidget(new QLabel("<b>Output</b>"), ir, 4, 1, 2, Qt::AlignLeft);
1156 ++ir;
1157 pppLayout1->addWidget(new QLabel("Coordinates"), ir, 0, Qt::AlignLeft);
1158 pppLayout1->addWidget(_pppWidgets._crdFile, ir, 1, 1, 2);
1159 pppLayout1->addWidget(new QLabel("Log File"), ir, 4, Qt::AlignLeft);
1160 pppLayout1->addWidget(_pppWidgets._logFile, ir, 5);
1161 ++ir;
1162 pppLayout1->addWidget(new QLabel("ANTEX"), ir, 0, Qt::AlignLeft);
1163 pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1, 1, 2);
1164 pppLayout1->addWidget(new QLabel("NMEA File"), ir, 4, Qt::AlignLeft);
1165 pppLayout1->addWidget(_pppWidgets._nmeaFile, ir, 5);
1166 pppLayout1->addWidget(new QLabel("Port"), ir, 6, Qt::AlignLeft);
1167 pppLayout1->addWidget(_pppWidgets._nmeaPort, ir, 7);
1168
1169 pppGroup1->setLayout(pppLayout1);
1170
1171 QGridLayout* pppLayout2 = new QGridLayout();
1172 ir = 0;
1173 pppLayout2->addWidget(new QLabel("<b>Precise Point Positioning</b>"), ir, 0, 1, 7, Qt::AlignLeft);
1174
1175 pppGroup2->setLayout(pppLayout2);
1176
1177 // Reqc Processing
1178 // ---------------
1179 _reqcActionComboBox = new QComboBox();
1180 _reqcActionComboBox->setEditable(false);
1181 _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
1182 ik = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
1183 if (ik != -1) {
1184 _reqcActionComboBox->setCurrentIndex(ik);
1185 }
1186 connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString &)),
1187 this, SLOT(slotBncTextChanged()));
1188
1189 QGridLayout* reqcLayout = new QGridLayout;
1190 _reqcActionComboBox->setMinimumWidth(15*ww);
1191 _reqcActionComboBox->setMaximumWidth(15*ww);
1192
1193 _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1194 _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
1195 _reqcObsFileChooser->setWhatsThis(tr("Specify the full path to an observation file in RINEX v2 or v3 format."));
1196 _reqcObsFileChooser->setMinimumWidth(15*ww);
1197 _reqcObsFileChooser->setMaximumWidth(15*ww);
1198
1199 _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
1200 _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
1201 _reqcNavFileChooser->setWhatsThis(tr("Specify the full path to a RINEX v2 or v3 navigation file."));
1202 _reqcNavFileChooser->setMinimumWidth(15*ww);
1203 _reqcNavFileChooser->setMaximumWidth(15*ww);
1204
1205 _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
1206 _reqcOutObsLineEdit->setWhatsThis(tr("Specify the full path to a RINEX observation output file."));
1207 _reqcOutObsLineEdit->setMinimumWidth(15*ww);
1208 _reqcOutObsLineEdit->setMaximumWidth(15*ww);
1209
1210 _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
1211 _reqcOutNavLineEdit->setWhatsThis(tr("Specify the full path to a RINEX navigation output file."));
1212 _reqcOutNavLineEdit->setMinimumWidth(15*ww);
1213 _reqcOutNavLineEdit->setMaximumWidth(15*ww);
1214
1215 _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
1216 _reqcOutLogLineEdit->setWhatsThis(tr("Specify the full path to a logfile."));
1217 _reqcOutLogLineEdit->setMinimumWidth(15*ww);
1218 _reqcOutLogLineEdit->setMaximumWidth(15*ww);
1219
1220 _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
1221 _reqcPlotDirLineEdit->setWhatsThis(tr("Specify the directory name for saving plots."));
1222 _reqcPlotDirLineEdit->setMinimumWidth(15*ww);
1223 _reqcPlotDirLineEdit->setMaximumWidth(15*ww);
1224
1225 _reqcSkyPlotSystems = new QComboBox();
1226 _reqcSkyPlotSystems->setEditable(false);
1227 _reqcSkyPlotSystems->addItems(QString("ALL,GPS,GLONASS,Galileo").split(","));
1228 ik = _reqcSkyPlotSystems->findText(settings.value("reqcSkyPlotSystems").toString());
1229 if (ik != -1) {
1230 _reqcSkyPlotSystems->setCurrentIndex(ik);
1231 }
1232
1233 ir = 0;
1234 reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check."),ir, 0, 1, 20);
1235 ++ir;
1236 reqcLayout->addWidget(new QLabel("Action"), ir, 0, Qt::AlignLeft);
1237 reqcLayout->addWidget(_reqcActionComboBox, ir, 1, Qt::AlignLeft);
1238 _reqcEditOptionButton = new QPushButton("Set Edit Options");
1239 reqcLayout->addWidget(_reqcEditOptionButton, ir, 3, Qt::AlignRight);
1240 ++ir;
1241 reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0, Qt::AlignLeft);
1242 reqcLayout->addWidget(_reqcObsFileChooser, ir, 1, Qt::AlignRight);
1243 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1244 reqcLayout->addWidget(_reqcNavFileChooser, ir, 3, Qt::AlignRight);
1245 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1246 ++ir;
1247 reqcLayout->addWidget(new QLabel("Output files (full path)"), ir, 0, Qt::AlignLeft);
1248 reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1, Qt::AlignRight);
1249 reqcLayout->addWidget(new QLabel("Obs"), ir, 2, Qt::AlignLeft);
1250 reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3, Qt::AlignRight);
1251 reqcLayout->addWidget(new QLabel("Nav"), ir, 4, Qt::AlignLeft);
1252 ++ir;
1253 reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1, Qt::AlignRight);
1254 reqcLayout->addWidget(new QLabel("Log"), ir, 2, Qt::AlignLeft);
1255 ++ir;
1256 reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0, Qt::AlignLeft);
1257 reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1, Qt::AlignRight);
1258 ++ir;
1259 reqcLayout->addWidget(new QLabel("Sky plots for"), ir, 0, Qt::AlignLeft);
1260 reqcLayout->addWidget(_reqcSkyPlotSystems, ir, 1, Qt::AlignRight);
1261 ++ir;
1262 reqcLayout->addWidget(new QLabel(""), ir, 1);
1263 reqcLayout->setRowStretch(ir, 999);
1264
1265 reqcLayout->setColumnMinimumWidth(2, 8*ww);
1266 reqcLayout->setColumnMinimumWidth(4, 8*ww);
1267
1268 reqcgroup->setLayout(reqcLayout);
1269
1270 connect(_reqcEditOptionButton, SIGNAL(clicked()),
1271 this, SLOT(slotReqcEditOption()));
1272
1273 // Combine Corrections
1274 // -------------------
1275 QGridLayout* cmbLayout = new QGridLayout;
1276
1277 populateCmbTable();
1278 cmbLayout->addWidget(_cmbTable, 0, 0, 6, 3);
1279 cmbLayout->addWidget(new QLabel(" "), 0, 5);
1280 cmbLayout->addWidget(new QLabel("Combine Broadcast Correction streams."), 0, 6, 1, 50);
1281 cmbLayout->addWidget(new QLabel(" "), 1, 5);
1282 cmbLayout->addWidget(addCmbRowButton, 1, 6);
1283 cmbLayout->addWidget(delCmbRowButton, 1, 7);
1284 cmbLayout->addWidget(new QLabel(" "), 2, 5);
1285 cmbLayout->addWidget(new QLabel("Method"), 2, 6, Qt::AlignRight);
1286 cmbLayout->addWidget(_cmbMethodComboBox, 2, 7, Qt::AlignRight);
1287 cmbLayout->addWidget(new QLabel(" "), 3, 5);
1288 cmbLayout->addWidget(new QLabel("Maximal Residuum"), 3, 6, Qt::AlignRight);
1289 cmbLayout->addWidget(_cmbMaxresLineEdit, 3, 7, Qt::AlignRight);
1290 cmbLayout->addWidget(new QLabel(" "), 4, 5);
1291 cmbLayout->addWidget(new QLabel("Sampling"), 4, 6, Qt::AlignRight);
1292 cmbLayout->addWidget(_cmbSamplSpinBox, 4, 7, Qt::AlignRight);
1293 cmbLayout->addWidget(new QLabel(" "), 5, 0);
1294
1295 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
1296 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
1297
1298 cmbgroup->setLayout(cmbLayout);
1299
1300 // Upload Layout (Clocks)
1301 // ----------------------
1302 QGridLayout* uploadHlpLayout = new QGridLayout();
1303
1304 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
1305 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
1306 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
1307
1308 uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
1309 uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
1310 uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
1311 uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
1312 uploadHlpLayout->addWidget(new QLabel(" Sampling: Orb"), 0, 4, Qt::AlignRight);
1313 uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrSpinBox, 0, 5);
1314 uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
1315 uploadHlpLayout->addWidget(_uploadSamplSp3SpinBox, 0, 7);
1316 uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
1317 uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
1318 uploadHlpLayout->addWidget(setUploadTrafoButton, 0,10);
1319
1320 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
1321 populateUploadTable();
1322
1323 uploadLayout->addWidget(new QLabel("Upload RTCMv3 Broadcast Corrections to caster."));
1324 uploadLayout->addWidget(_uploadTable);
1325 uploadLayout->addLayout(uploadHlpLayout);
1326
1327 uploadgroup->setLayout(uploadLayout);
1328
1329 // Upload Layout (Ephemeris)
1330 // -------------------------
1331 QGridLayout* uploadLayoutEph = new QGridLayout;
1332
1333 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
1334 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
1335 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
1336 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
1337
1338 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 0, 0, 1, 50);
1339 uploadLayoutEph->addWidget(new QLabel("Host"), 1, 0);
1340 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 1, 1, 1, 3);
1341 uploadLayoutEph->addWidget(new QLabel(" Port"), 1, 4, Qt::AlignRight);
1342 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 1, 5, 1, 1);
1343 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 2, 0);
1344 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 2, 1);
1345 uploadLayoutEph->addWidget(new QLabel(" Password"), 2, 2, Qt::AlignRight);
1346 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 2, 3);
1347 uploadLayoutEph->addWidget(new QLabel("Sampling"), 3, 0);
1348 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 3, 1);
1349 uploadLayoutEph->addWidget(new QLabel("Uploaded"), 4, 0);
1350 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 4, 1);
1351 uploadLayoutEph->addWidget(new QLabel(" "), 5, 0);
1352 uploadLayoutEph->addWidget(new QLabel(" "), 6, 0);
1353
1354 uploadEphgroup->setLayout(uploadLayoutEph);
1355
1356 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1357 this, SLOT(slotBncTextChanged()));
1358
1359 // Main Layout
1360 // -----------
1361 QGridLayout* mLayout = new QGridLayout;
1362 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1363 mLayout->addWidget(_aogroup, 0,0);
1364 mLayout->addWidget(_mountPointsTable, 1,0);
1365 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1366 mLayout->addWidget(_loggroup, 2,0);
1367
1368 _canvas->setLayout(mLayout);
1369
1370 // WhatsThis
1371 // ---------
1372 _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>"));
1373 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
1374 _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>"));
1375 _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>"));
1376 _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>"));
1377 _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."));
1378 _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."));
1379 _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."));
1380 _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."));
1381 _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."));
1382 _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>"));
1383 _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."));
1384 _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."));
1385 _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."));
1386 _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>"));
1387 _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>"));
1388 _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>"));
1389 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
1390 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
1391
1392 _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>"));
1393 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
1394 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
1395 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
1396 _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>"));
1397 _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>"));
1398 _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>"));
1399 _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>"));
1400 _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>"));
1401 _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."));
1402 _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>"));
1403 _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>"));
1404 _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>"));
1405 _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."));
1406 _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)."));
1407 _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."));
1408 _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."));
1409 _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."));
1410 _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>"));
1411 _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."));
1412 _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>."));
1413 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
1414 _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>"));
1415 _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>"));
1416 _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>"));
1417 _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>"));
1418 _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>"));
1419 _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>"));
1420 _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>"));
1421 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
1422 _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>"));
1423 _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>"));
1424 _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>"));
1425 _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>"));
1426 _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>"));
1427 _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX v2 or v3 files.</p>"));
1428 _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>"));
1429 _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>"));
1430 _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>"));
1431 _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>"));
1432 _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."));
1433 _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."));
1434 _gmRadioButton->setWhatsThis(tr("<p>Specify Google Maps as the background for your rover positions."));
1435 _osmRadioButton->setWhatsThis(tr("<p>Specify Open Street Map as the background for your rover positions."));
1436 _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>"));
1437 _mapWinDotColorComboBox->setWhatsThis(tr("<p>Specify the color of dots showing the rover track.</p>"));
1438 _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."));
1439 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
1440 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
1441 _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>"));
1442 _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>"));
1443 _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>"));
1444 _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>"));
1445 _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>"));
1446 _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>"));
1447 _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."));
1448 _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>"));
1449 _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>"));
1450 _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>"));
1451 _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>"));
1452 _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>"));
1453 _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>"));
1454 _pppRefdNLineEdit->setWhatsThis(tr("<p>Enter north antenna excentricity.</p>"));
1455 _pppRefdELineEdit->setWhatsThis(tr("<p>Enter east antenna excentricity.</p>"));
1456 _pppRefdULineEdit->setWhatsThis(tr("<p>Enter up antenna excentricity.</p>"));
1457 _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."));
1458 _pppSync->setWhatsThis(tr(
1459 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
1460 "immediately after its arrival using satellite clock corrections available at "
1461 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
1462 "are buffered and the processing of each epoch is postponed till the satellite clock "
1463 "corrections not older than 'Sync Corr' seconds are available.<p>"));
1464 _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>"));
1465 _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>"));
1466 _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."));
1467 _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>"));
1468 _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>"));
1469 _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>"));
1470 _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>"));
1471 _postObsFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Observation file."));
1472 _postNavFileChooser->setWhatsThis(tr("Full path to RINEX v2/v3 Navigation file."));
1473 _postCorrFileChooser->setWhatsThis(tr("Full path to Broadcast Corrections file as previously saved with BNC in plain ASCII format."));
1474 _postOutLineEdit->setWhatsThis(tr("Full path to file with post processing PPP results. "));
1475 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
1476 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
1477 addUploadRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the stream upload table."));
1478 delUploadRowButton->setWhatsThis(tr("Hit 'Del Row' button to delete the highlighted line from the stream upload table."));
1479 _uploadIntrComboBox->setWhatsThis(tr("Select the length of the SP3 and Clock RINEX files."));
1480 _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."));
1481 _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."));
1482 _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."));
1483 setUploadTrafoButton->setWhatsThis(tr("Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation through 'System' button."));
1484
1485 _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."));
1486 _uploadEphPortLineEdit->setWhatsThis(tr("Specify the IP port of an NTRIP Broadcaster to upload the stream. Default is port 80."));
1487 _uploadEphMountpointLineEdit->setWhatsThis(tr("Specify the mounpoint for stream upload to an NTRIP Broadcaster."));
1488 _uploadEphPasswordLineEdit->setWhatsThis(tr("Specify the stream upload password protecting the mounpoint on an NTRIP Broadcaster."));
1489 _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."));
1490 _uploadEphBytesCounter->setWhatsThis(tr("BNC shows the amount of data uploaded through this stream."));
1491
1492 _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
1493 _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
1494 _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>"));
1495
1496 _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
1497 _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
1498// Weber
1499
1500 // Enable/Disable all Widgets
1501 // --------------------------
1502 slotBncTextChanged();
1503 enableStartStop();
1504
1505 // Auto start
1506 // ----------
1507 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1508 slotStart();
1509 }
1510}
1511
1512// Destructor
1513////////////////////////////////////////////////////////////////////////////
1514bncWindow::~bncWindow() {
1515 delete _caster;
1516 delete _casterEph;
1517}
1518
1519//
1520////////////////////////////////////////////////////////////////////////////
1521void bncWindow::populateMountPointsTable() {
1522
1523 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1524 _mountPointsTable->removeRow(iRow);
1525 }
1526
1527 bncSettings settings;
1528
1529 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1530 int iRow = 0;
1531 while (it.hasNext()) {
1532 QStringList hlp = it.next().split(" ");
1533 if (hlp.size() < 5) continue;
1534 _mountPointsTable->insertRow(iRow);
1535
1536 QUrl url(hlp[0]);
1537
1538 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1539 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1540 QString nmea(hlp[4]);
1541 if (hlp[5] == "S") {
1542 fullPath = hlp[0].replace(0,2,"");
1543 }
1544 QString ntripVersion = "2";
1545 if (hlp.size() >= 6) {
1546 ntripVersion = (hlp[5]);
1547 }
1548
1549 QTableWidgetItem* it;
1550 it = new QTableWidgetItem(url.userInfo());
1551 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1552 _mountPointsTable->setItem(iRow, 0, it);
1553
1554 it = new QTableWidgetItem(fullPath);
1555 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1556 _mountPointsTable->setItem(iRow, 1, it);
1557
1558 it = new QTableWidgetItem(format);
1559 _mountPointsTable->setItem(iRow, 2, it);
1560
1561 if (nmea == "yes") {
1562 it = new QTableWidgetItem(latitude);
1563 _mountPointsTable->setItem(iRow, 3, it);
1564 it = new QTableWidgetItem(longitude);
1565 _mountPointsTable->setItem(iRow, 4, it);
1566 } else {
1567 it = new QTableWidgetItem(latitude);
1568 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1569 _mountPointsTable->setItem(iRow, 3, it);
1570 it = new QTableWidgetItem(longitude);
1571 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1572 _mountPointsTable->setItem(iRow, 4, it);
1573 }
1574
1575 it = new QTableWidgetItem(nmea);
1576 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1577 _mountPointsTable->setItem(iRow, 5, it);
1578
1579 it = new QTableWidgetItem(ntripVersion);
1580 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1581 _mountPointsTable->setItem(iRow, 6, it);
1582
1583 bncTableItem* bncIt = new bncTableItem();
1584 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1585 _mountPointsTable->setItem(iRow, 7, bncIt);
1586
1587 iRow++;
1588 }
1589
1590 _mountPointsTable->sortItems(1);
1591
1592 enableStartStop();
1593}
1594
1595// Retrieve Table
1596////////////////////////////////////////////////////////////////////////////
1597void bncWindow::slotAddMountPoints() {
1598
1599 bncSettings settings;
1600 QString proxyHost = settings.value("proxyHost").toString();
1601 int proxyPort = settings.value("proxyPort").toInt();
1602 if (proxyHost != _proxyHostLineEdit->text() ||
1603 proxyPort != _proxyPortLineEdit->text().toInt()) {
1604 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1605 "changed. Use the new ones?",
1606 QMessageBox::Yes, QMessageBox::No,
1607 QMessageBox::NoButton);
1608 if (iRet == QMessageBox::Yes) {
1609 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1610 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1611 }
1612 }
1613
1614 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1615 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1616
1617 QMessageBox msgBox;
1618 msgBox.setIcon(QMessageBox::Question);
1619 msgBox.setWindowTitle("Add Stream");
1620 msgBox.setText("Add stream(s) coming from:");
1621
1622 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1623 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1624 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1625 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1626 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1627
1628 msgBox.exec();
1629
1630 if (msgBox.clickedButton() == buttonNtrip) {
1631 bncTableDlg* dlg = new bncTableDlg(this);
1632 dlg->move(this->pos().x()+50, this->pos().y()+50);
1633 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1634 this, SLOT(slotNewMountPoints(QStringList*)));
1635 dlg->exec();
1636 delete dlg;
1637 } else if (msgBox.clickedButton() == buttonIP) {
1638 bncIpPort* ipp = new bncIpPort(this);
1639 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1640 this, SLOT(slotNewMountPoints(QStringList*)));
1641 ipp->exec();
1642 delete ipp;
1643 } else if (msgBox.clickedButton() == buttonUDP) {
1644 bncUdpPort* udp = new bncUdpPort(this);
1645 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1646 this, SLOT(slotNewMountPoints(QStringList*)));
1647 udp->exec();
1648 delete udp;
1649 } else if (msgBox.clickedButton() == buttonSerial) {
1650 bncSerialPort* sep = new bncSerialPort(this);
1651 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1652 this, SLOT(slotNewMountPoints(QStringList*)));
1653 sep->exec();
1654 delete sep;
1655 } else if (msgBox.clickedButton() == buttonCancel) {
1656 // Cancel
1657 }
1658
1659 enableStartStop();
1660}
1661
1662// Delete Selected Mount Points
1663////////////////////////////////////////////////////////////////////////////
1664void bncWindow::slotDeleteMountPoints() {
1665
1666 int nRows = _mountPointsTable->rowCount();
1667 bool flg[nRows];
1668 for (int iRow = 0; iRow < nRows; iRow++) {
1669 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1670 flg[iRow] = true;
1671 }
1672 else {
1673 flg[iRow] = false;
1674 }
1675 }
1676 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1677 if (flg[iRow]) {
1678 _mountPointsTable->removeRow(iRow);
1679 }
1680 }
1681 _actDeleteMountPoints->setEnabled(false);
1682
1683 enableStartStop();
1684}
1685
1686// New Mount Points Selected
1687////////////////////////////////////////////////////////////////////////////
1688void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1689 int iRow = 0;
1690 QListIterator<QString> it(*mountPoints);
1691 while (it.hasNext()) {
1692 QStringList hlp = it.next().split(" ");
1693 QUrl url(hlp[0]);
1694 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1695 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1696 QString nmea(hlp[4]);
1697 if (hlp[5] == "S") {
1698 fullPath = hlp[0].replace(0,2,"");
1699 }
1700 QString ntripVersion = "2";
1701 if (hlp.size() >= 6) {
1702 ntripVersion = (hlp[5]);
1703 }
1704
1705 _mountPointsTable->insertRow(iRow);
1706
1707 QTableWidgetItem* it;
1708 it = new QTableWidgetItem(url.userInfo());
1709 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1710 _mountPointsTable->setItem(iRow, 0, it);
1711
1712 it = new QTableWidgetItem(fullPath);
1713 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1714 _mountPointsTable->setItem(iRow, 1, it);
1715
1716 it = new QTableWidgetItem(format);
1717 _mountPointsTable->setItem(iRow, 2, it);
1718
1719 if (nmea == "yes") {
1720 it = new QTableWidgetItem(latitude);
1721 _mountPointsTable->setItem(iRow, 3, it);
1722 it = new QTableWidgetItem(longitude);
1723 _mountPointsTable->setItem(iRow, 4, it);
1724 } else {
1725 it = new QTableWidgetItem(latitude);
1726 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1727 _mountPointsTable->setItem(iRow, 3, it);
1728 it = new QTableWidgetItem(longitude);
1729 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1730 _mountPointsTable->setItem(iRow, 4, it);
1731 }
1732
1733 it = new QTableWidgetItem(nmea);
1734 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1735 _mountPointsTable->setItem(iRow, 5, it);
1736
1737 it = new QTableWidgetItem(ntripVersion);
1738 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1739 _mountPointsTable->setItem(iRow, 6, it);
1740
1741 bncTableItem* bncIt = new bncTableItem();
1742 _mountPointsTable->setItem(iRow, 7, bncIt);
1743
1744 iRow++;
1745 }
1746 _mountPointsTable->hideColumn(0);
1747 _mountPointsTable->sortItems(1);
1748 delete mountPoints;
1749
1750 enableStartStop();
1751}
1752
1753// Save Options (serialize)
1754////////////////////////////////////////////////////////////////////////////
1755void bncWindow::slotSaveOptions() {
1756 saveOptions();
1757 bncSettings settings;
1758 settings.sync();
1759}
1760
1761// Save Options (memory only)
1762////////////////////////////////////////////////////////////////////////////
1763void bncWindow::saveOptions() {
1764
1765 QStringList mountPoints;
1766 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1767
1768 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1769 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1770 "@" + _mountPointsTable->item(iRow, 1)->text() );
1771
1772 mountPoints.append(url.toString() + " " +
1773 _mountPointsTable->item(iRow, 2)->text()
1774 + " " + _mountPointsTable->item(iRow, 3)->text()
1775 + " " + _mountPointsTable->item(iRow, 4)->text()
1776 + " " + _mountPointsTable->item(iRow, 5)->text()
1777 + " " + _mountPointsTable->item(iRow, 6)->text());
1778 } else {
1779 mountPoints.append(
1780 "//" + _mountPointsTable->item(iRow, 1)->text()
1781 + " " + _mountPointsTable->item(iRow, 2)->text()
1782 + " " + _mountPointsTable->item(iRow, 3)->text()
1783 + " " + _mountPointsTable->item(iRow, 4)->text()
1784 + " " + _mountPointsTable->item(iRow, 5)->text()
1785 + " " + _mountPointsTable->item(iRow, 6)->text());
1786 }
1787 }
1788
1789 QStringList combineStreams;
1790 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1791 QString hlp;
1792 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1793 if (_cmbTable->item(iRow, iCol)) {
1794 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1795 }
1796 }
1797 if (!hlp.isEmpty()) {
1798 combineStreams << hlp;
1799 }
1800 }
1801
1802 QStringList uploadMountpointsOut;
1803 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1804 QString hlp;
1805 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1806 if (_uploadTable->cellWidget(iRow, iCol) &&
1807 (iCol == 3 || iCol == 4 || iCol == 5)) {
1808 if (iCol == 3) {
1809 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1810 hlp += passwd->text() + ",";
1811 }
1812 else if (iCol == 4) {
1813 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1814 hlp += system->currentText() + ",";
1815 }
1816 else if (iCol == 5) {
1817 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1818 QString state; state.setNum(com->checkState());
1819 hlp += state + ",";
1820 }
1821 }
1822 else if (_uploadTable->item(iRow, iCol)) {
1823 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1824 }
1825 }
1826 if (!hlp.isEmpty()) {
1827 uploadMountpointsOut << hlp;
1828 }
1829 }
1830
1831 bncSettings settings;
1832
1833 settings.setValue("startTab", _aogroup->currentIndex());
1834 settings.setValue("statusTab", _loggroup->currentIndex());
1835 settings.setValue("mountPoints", mountPoints);
1836// Network
1837 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1838 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1839 settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
1840 settings.setValue("ignoreSslErrors", _ignoreSslErrorsCheckBox->checkState());
1841// General
1842 settings.setValue("logFile", _logFileLineEdit->text());
1843 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1844 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1845 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1846 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1847// RINEX Observations
1848 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1849 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1850 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1851 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1852 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1853 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1854// RINEX Ephemeris
1855 settings.setValue("ephPath", _ephPathLineEdit->text());
1856 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1857 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1858 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1859// Broadcast Corrections
1860 settings.setValue("corrPath", _corrPathLineEdit->text());
1861 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1862 settings.setValue("corrPort", _corrPortLineEdit->text());
1863 settings.setValue("corrTime", _corrTimeSpinBox->value());
1864// Feed Engine
1865 settings.setValue("outPort", _outPortLineEdit->text());
1866 settings.setValue("waitTime", _waitTimeSpinBox->value());
1867 settings.setValue("binSampl", _binSamplSpinBox->value());
1868 settings.setValue("outFile", _outFileLineEdit->text());
1869 settings.setValue("outUPort", _outUPortLineEdit->text());
1870// Serial Output
1871 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1872 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1873 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1874 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1875 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1876 settings.setValue("serialParity", _serialParityComboBox->currentText());
1877 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1878 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1879 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1880 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1881// Outages
1882 settings.setValue("obsRate", _obsRateComboBox->currentText());
1883 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1884 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1885 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1886// Miscellaneous
1887 settings.setValue("miscMount", _miscMountLineEdit->text());
1888 settings.setValue("miscPort", _miscPortLineEdit->text());
1889 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1890 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1891// PPPP
1892 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1893 settings.setValue("pppMount", _pppMountLineEdit->text());
1894 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1895 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1896 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1897 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1898 settings.setValue("pppRefdN", _pppRefdNLineEdit->text());
1899 settings.setValue("pppRefdE", _pppRefdELineEdit->text());
1900 settings.setValue("pppRefdU", _pppRefdULineEdit->text());
1901 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1902 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1903 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1904 settings.setValue("useOsmMap", _osmRadioButton->isChecked());
1905 settings.setValue("mapWinDotSize", _mapWinDotSizeLineEdit->text());
1906 settings.setValue("mapWinDotColor", _mapWinDotColorComboBox->currentText());
1907 settings.setValue("mapSpeed", _mapSpeedSlider->value());
1908 settings.setValue("postObsFile", _postObsFileChooser->fileName());
1909 settings.setValue("postNavFile", _postNavFileChooser->fileName());
1910 settings.setValue("postCorrFile", _postCorrFileChooser->fileName());
1911 settings.setValue("postOutFile", _postOutLineEdit->text());
1912 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1913 settings.setValue("pppAntex", _pppAntexFileChooser->fileName());
1914 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1915 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1916 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1917 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1918 settings.setValue("pppSync", _pppSync->text());
1919 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1920 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1921 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1922 settings.setValue("pppAudioResponse", _pppAudioResponseLineEdit->text());
1923 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1924 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1925 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1926 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1927 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1928 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1929// Reqc
1930 settings.setValue("reqcAction", _reqcActionComboBox->currentText());
1931 settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
1932 settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
1933 settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
1934 settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
1935 settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
1936 settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
1937 settings.setValue("reqcSkyPlotSystems", _reqcSkyPlotSystems->currentText());
1938// Combine Corrections
1939 if (!combineStreams.isEmpty()) {
1940 settings.setValue("combineStreams", combineStreams);
1941 }
1942 else {
1943 settings.setValue("combineStreams", "");
1944 }
1945 settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
1946 settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
1947 settings.setValue("cmbSampl", _cmbSamplSpinBox->value());
1948// Upload Corrections
1949 if (!uploadMountpointsOut.isEmpty()) {
1950 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1951 }
1952 else {
1953 settings.setValue("uploadMountpointsOut", "");
1954 }
1955 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1956 settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrSpinBox->value());
1957 settings.setValue("uploadSamplSp3", _uploadSamplSp3SpinBox->value());
1958 settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
1959// Upload Ephemeris
1960 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1961 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1962 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1963 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1964 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1965
1966 if (_caster) {
1967 _caster->readMountPoints();
1968 }
1969}
1970
1971// All get slots terminated
1972////////////////////////////////////////////////////////////////////////////
1973void bncWindow::slotGetThreadsFinished() {
1974 BNC_CORE->slotMessage("All Get Threads Terminated", true);
1975 delete _caster; _caster = 0;
1976 delete _casterEph; _casterEph = 0;
1977 _runningRealTime = false;
1978}
1979
1980// Start It!
1981////////////////////////////////////////////////////////////////////////////
1982void bncWindow::slotStart() {
1983 saveOptions();
1984 if ( _pppSPPComboBox->currentText() == "Post-Processing" ) {
1985 startPostProcessingPPP();
1986 }
1987 else if ( !_reqcActionComboBox->currentText().isEmpty() ) {
1988 startPostProcessingReqc();
1989 }
1990 else {
1991 startRealTime();
1992 }
1993}
1994
1995// Start Real-Time (Retrieve Data etc.)
1996////////////////////////////////////////////////////////////////////////////
1997void bncWindow::startRealTime() {
1998
1999 _runningRealTime = true;
2000
2001 _bncFigurePPP->reset();
2002
2003 _actDeleteMountPoints->setEnabled(false);
2004
2005 enableStartStop();
2006
2007 _caster = new bncCaster();
2008
2009 BNC_CORE->setPort(_outEphPortLineEdit->text().toInt());
2010 BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
2011 BNC_CORE->initCombination();
2012
2013 connect(_caster, SIGNAL(getThreadsFinished()),
2014 this, SLOT(slotGetThreadsFinished()));
2015
2016 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
2017 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
2018
2019 BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
2020
2021 bncSettings settings;
2022
2023 QDir rnxdir(settings.value("rnxPath").toString());
2024 if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
2025
2026 QString rnx_file = settings.value("rnxScript").toString();
2027 if ( !rnx_file.isEmpty() ) {
2028 QFile rnxfile(settings.value("rnxScript").toString());
2029 if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
2030 }
2031
2032 QDir ephdir(settings.value("ephPath").toString());
2033 if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
2034
2035 QDir corrdir(settings.value("corrPath").toString());
2036 if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
2037
2038 QString advise_file = settings.value("adviseScript").toString();
2039 if ( !advise_file.isEmpty() ) {
2040 QFile advisefile(settings.value("adviseScript").toString());
2041 if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
2042 }
2043
2044 QString ant_file = settings.value("pppAntex").toString();
2045 if ( !ant_file.isEmpty() ) {
2046 QFile anxfile(settings.value("pppAntex").toString());
2047 if (!anxfile.exists()) BNC_CORE->slotMessage("Cannot find IGS ANTEX file", true);
2048 }
2049
2050 _caster->readMountPoints();
2051
2052 _casterEph = new bncEphUploadCaster();
2053 connect(_casterEph, SIGNAL(newBytes(QByteArray,double)),
2054 _uploadEphBytesCounter, SLOT(slotNewBytes(QByteArray,double)));
2055}
2056
2057// Retrieve Data
2058////////////////////////////////////////////////////////////////////////////
2059void bncWindow::slotStop() {
2060 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
2061 QMessageBox::Yes, QMessageBox::No,
2062 QMessageBox::NoButton);
2063 if (iRet == QMessageBox::Yes) {
2064 BNC_CORE->stopCombination();
2065 delete _caster; _caster = 0;
2066 delete _casterEph; _casterEph = 0;
2067 _runningRealTime = false;
2068 enableStartStop();
2069 }
2070}
2071
2072// Close Application gracefully
2073////////////////////////////////////////////////////////////////////////////
2074void bncWindow::closeEvent(QCloseEvent* event) {
2075
2076 int iRet = QMessageBox::question(this, "Close", "Save Options?",
2077 QMessageBox::Yes, QMessageBox::No,
2078 QMessageBox::Cancel);
2079
2080 if (iRet == QMessageBox::Cancel) {
2081 event->ignore();
2082 return;
2083 }
2084 else if (iRet == QMessageBox::Yes) {
2085 slotSaveOptions();
2086 }
2087
2088 if (_postProcessing) {
2089 _postProcessing->terminate();
2090 }
2091
2092 QMainWindow::closeEvent(event);
2093}
2094
2095// User changed the selection of mountPoints
2096////////////////////////////////////////////////////////////////////////////
2097void bncWindow::slotSelectionChanged() {
2098 if (_mountPointsTable->selectedItems().isEmpty()) {
2099 _actDeleteMountPoints->setEnabled(false);
2100 }
2101 else {
2102 _actDeleteMountPoints->setEnabled(true);
2103 }
2104}
2105
2106// Display Program Messages
2107////////////////////////////////////////////////////////////////////////////
2108void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
2109
2110#ifdef DEBUG_RTCM2_2021
2111 const int maxBufferSize = 1000;
2112#else
2113 const int maxBufferSize = 10000;
2114#endif
2115
2116 if (! showOnScreen ) {
2117 return;
2118 }
2119
2120 QString txt = _log->toPlainText() + "\n" +
2121 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
2122 _log->clear();
2123 _log->append(txt.right(maxBufferSize));
2124}
2125
2126// About Message
2127////////////////////////////////////////////////////////////////////////////
2128void bncWindow::slotAbout() {
2129 new bncAboutDlg(0);
2130}
2131
2132//Flowchart
2133////////////////////////////////////////////////////////////////////////////
2134void bncWindow::slotFlowchart() {
2135 new bncFlowchartDlg(0);
2136}
2137
2138// Help Window
2139////////////////////////////////////////////////////////////////////////////
2140void bncWindow::slotHelp() {
2141 QUrl url;
2142 url.setPath(":bnchelp.html");
2143 new bncHlpDlg(0, url);
2144}
2145
2146// Select Fonts
2147////////////////////////////////////////////////////////////////////////////
2148void bncWindow::slotFontSel() {
2149 bool ok;
2150 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
2151 if (ok) {
2152 bncSettings settings;
2153 settings.setValue("font", newFont.toString());
2154 QApplication::setFont(newFont);
2155 int ww = QFontMetrics(newFont).width('w');
2156 setMinimumSize(60*ww, 80*ww);
2157 resize(60*ww, 80*ww);
2158 }
2159}
2160
2161// Whats This Help
2162void bncWindow::slotWhatsThis() {
2163 QWhatsThis::enterWhatsThisMode();
2164}
2165
2166//
2167////////////////////////////////////////////////////////////////////////////
2168void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
2169 _threads = threads;
2170
2171 _bncFigure->updateMountPoints();
2172 _bncFigureLate->updateMountPoints();
2173
2174 populateMountPointsTable();
2175 bncSettings settings;
2176 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
2177 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
2178 QListIterator<bncGetThread*> iTh(threads);
2179 while (iTh.hasNext()) {
2180 bncGetThread* thread = iTh.next();
2181 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
2182 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
2183 "@" + _mountPointsTable->item(iRow, 1)->text() );
2184 if (url == thread->mountPoint() &&
2185 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
2186 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
2187 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
2188 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
2189 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2190 connect(thread, SIGNAL(newBytes(QByteArray, double)),
2191 _bncFigure, SLOT(slotNewData(QByteArray, double)));
2192 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
2193 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2194 connect(thread, SIGNAL(newLatency(QByteArray, double)),
2195 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
2196 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
2197 disconnect(thread,
2198 SIGNAL(newPosition(bncTime, double, double, double)),
2199 _bncFigurePPP,
2200 SLOT(slotNewPosition(bncTime, double, double, double)));
2201 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2202 _bncFigurePPP,
2203 SLOT(slotNewPosition(bncTime, double, double, double)));
2204 }
2205#ifdef QT_WEBKIT
2206 if (_mapWin) {
2207 disconnect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2208 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2209 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2210 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2211 }
2212#endif
2213 break;
2214 }
2215 }
2216 }
2217}
2218
2219//
2220////////////////////////////////////////////////////////////////////////////
2221void bncWindow::CreateMenu() {
2222 // Create Menus
2223 // ------------
2224 _menuFile = menuBar()->addMenu(tr("&File"));
2225 _menuFile->addAction(_actFontSel);
2226 _menuFile->addSeparator();
2227 _menuFile->addAction(_actSaveOpt);
2228 _menuFile->addSeparator();
2229 _menuFile->addAction(_actQuit);
2230
2231 _menuHlp = menuBar()->addMenu(tr("&Help"));
2232 _menuHlp->addAction(_actHelp);
2233 _menuHlp->addAction(_actFlowchart);
2234 _menuHlp->addAction(_actAbout);
2235}
2236
2237// Toolbar
2238////////////////////////////////////////////////////////////////////////////
2239void bncWindow::AddToolbar() {
2240 QToolBar* toolBar = new QToolBar;
2241 addToolBar(Qt::BottomToolBarArea, toolBar);
2242 toolBar->setMovable(false);
2243 toolBar->addAction(_actAddMountPoints);
2244 toolBar->addAction(_actDeleteMountPoints);
2245 toolBar->addAction(_actMapMountPoints);
2246 toolBar->addAction(_actStart);
2247 toolBar->addAction(_actStop);
2248 toolBar->addWidget(new QLabel(" "));
2249 toolBar->addAction(_actwhatsthis);
2250}
2251
2252// About
2253////////////////////////////////////////////////////////////////////////////
2254bncAboutDlg::bncAboutDlg(QWidget* parent) :
2255 QDialog(parent) {
2256
2257 QTextBrowser* tb = new QTextBrowser;
2258 QUrl url; url.setPath(":bncabout.html");
2259 tb->setSource(url);
2260 tb->setReadOnly(true);
2261
2262 int ww = QFontMetrics(font()).width('w');
2263 QPushButton* _closeButton = new QPushButton("Close");
2264 _closeButton->setMaximumWidth(10*ww);
2265 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2266
2267 QGridLayout* dlgLayout = new QGridLayout();
2268 QLabel* img = new QLabel();
2269 img->setPixmap(QPixmap(":ntrip-logo.png"));
2270 dlgLayout->addWidget(img, 0,0);
2271 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
2272 dlgLayout->addWidget(tb,1,0,1,2);
2273 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
2274
2275 setLayout(dlgLayout);
2276 resize(60*ww, 60*ww);
2277 setWindowTitle("About BNC");
2278 show();
2279}
2280
2281//
2282////////////////////////////////////////////////////////////////////////////
2283bncAboutDlg::~bncAboutDlg() {
2284};
2285
2286// Flowchart
2287////////////////////////////////////////////////////////////////////////////
2288bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
2289 QDialog(parent) {
2290
2291 int ww = QFontMetrics(font()).width('w');
2292 QPushButton* _closeButton = new QPushButton("Close");
2293 _closeButton->setMaximumWidth(10*ww);
2294 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
2295
2296 QGridLayout* dlgLayout = new QGridLayout();
2297 QLabel* img = new QLabel();
2298 img->setPixmap(QPixmap(":bncflowchart.png"));
2299 dlgLayout->addWidget(img, 0,0);
2300 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
2301
2302 setLayout(dlgLayout);
2303 setWindowTitle("Flow Chart");
2304 show();
2305}
2306
2307//
2308////////////////////////////////////////////////////////////////////////////
2309bncFlowchartDlg::~bncFlowchartDlg() {
2310};
2311
2312// Enable/Disable Widget (and change its color)
2313////////////////////////////////////////////////////////////////////////////
2314void bncWindow::enableWidget(bool enable, QWidget* widget) {
2315 const static QPalette paletteWhite(QColor(255, 255, 255));
2316 const static QPalette paletteGray(QColor(230, 230, 230));
2317
2318 widget->setEnabled(enable);
2319 if (enable) {
2320 widget->setPalette(paletteWhite);
2321 }
2322 else {
2323 widget->setPalette(paletteGray);
2324 }
2325}
2326
2327// Bnc Text
2328////////////////////////////////////////////////////////////////////////////
2329void bncWindow::slotBncTextChanged(){
2330
2331 bool enable = true;
2332
2333 // Proxy
2334 //------
2335 if (sender() == 0 || sender() == _proxyHostLineEdit) {
2336 enable = !_proxyHostLineEdit->text().isEmpty();
2337 enableWidget(enable, _proxyPortLineEdit);
2338 }
2339
2340 // RINEX Observations
2341 // ------------------
2342 if (sender() == 0 || sender() == _rnxPathLineEdit) {
2343 enable = !_rnxPathLineEdit->text().isEmpty();
2344 enableWidget(enable, _rnxSamplSpinBox);
2345 enableWidget(enable, _rnxSkelLineEdit);
2346 enableWidget(enable, _rnxScrpLineEdit);
2347 enableWidget(enable, _rnxV3CheckBox);
2348 enableWidget(enable, _rnxIntrComboBox);
2349 }
2350
2351 // RINEX Ephemeris
2352 // ---------------
2353 if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
2354 enable = !_ephPathLineEdit->text().isEmpty() || !_outEphPortLineEdit->text().isEmpty();
2355 enableWidget(enable, _ephIntrComboBox);
2356 enableWidget(enable, _ephV3CheckBox);
2357 }
2358
2359 // Broadcast Corrections
2360 // ---------------------
2361 if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
2362 enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
2363 enableWidget(enable, _corrIntrComboBox);
2364 }
2365
2366 // Feed Engine
2367 // -----------
2368 if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
2369 enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
2370 enableWidget(enable, _waitTimeSpinBox);
2371 enableWidget(enable, _binSamplSpinBox);
2372 }
2373
2374 // Serial Output
2375 // -------------
2376 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
2377 sender() == _serialAutoNMEAComboBox) {
2378 enable = !_serialMountPointLineEdit->text().isEmpty();
2379 enableWidget(enable, _serialPortNameLineEdit);
2380 enableWidget(enable, _serialBaudRateComboBox);
2381 enableWidget(enable, _serialParityComboBox);
2382 enableWidget(enable, _serialDataBitsComboBox);
2383 enableWidget(enable, _serialStopBitsComboBox);
2384 enableWidget(enable, _serialFlowControlComboBox);
2385 enableWidget(enable, _serialAutoNMEAComboBox);
2386
2387 bool enable2 = enable && _serialAutoNMEAComboBox->currentText() != "Auto";
2388 enableWidget(enable2, _serialFileNMEALineEdit);
2389 }
2390
2391 // Outages
2392 // -------
2393 if (sender() == 0 || sender() == _obsRateComboBox) {
2394 enable = !_obsRateComboBox->currentText().isEmpty();
2395 enableWidget(enable, _adviseFailSpinBox);
2396 enableWidget(enable, _adviseRecoSpinBox);
2397 enableWidget(enable, _adviseScriptLineEdit);
2398 }
2399
2400 // Miscellaneous
2401 // -------------
2402 if (sender() == 0 || sender() == _miscMountLineEdit) {
2403 enable = !_miscMountLineEdit->text().isEmpty();
2404 enableWidget(enable, _perfIntrComboBox);
2405 enableWidget(enable, _scanRTCMCheckBox);
2406 enableWidget(enable, _miscPortLineEdit);
2407 }
2408
2409 // Enable/disable Broadcast Ephemerides
2410 // ------------------------------------
2411 if (sender() == 0 || sender() == _uploadEphHostLineEdit) {
2412 if (!_uploadEphHostLineEdit->text().isEmpty()) {
2413 _uploadEphPortLineEdit->setStyleSheet("background-color: white");
2414 _uploadEphMountpointLineEdit->setStyleSheet("background-color: white");
2415 _uploadEphPasswordLineEdit->setStyleSheet("background-color: white");
2416 _uploadEphSampleSpinBox->setStyleSheet("background-color: white");
2417 _uploadEphPortLineEdit->setEnabled(true);
2418 _uploadEphMountpointLineEdit->setEnabled(true);
2419 _uploadEphPasswordLineEdit->setEnabled(true);
2420 _uploadEphSampleSpinBox->setEnabled(true);
2421 }
2422 else {
2423 _uploadEphPortLineEdit->setStyleSheet("background-color: lightGray");
2424 _uploadEphMountpointLineEdit->setStyleSheet("background-color: lightGray");
2425 _uploadEphPasswordLineEdit->setStyleSheet("background-color: lightGray");
2426 _uploadEphSampleSpinBox->setStyleSheet("background-color: lightGray");
2427 _uploadEphPortLineEdit->setEnabled(false);
2428 _uploadEphMountpointLineEdit->setEnabled(false);
2429 _uploadEphPasswordLineEdit->setEnabled(false);
2430 _uploadEphSampleSpinBox->setEnabled(false);
2431 }
2432 }
2433
2434 // Combine Corrections
2435 // -------------------
2436 if (sender() == 0 || sender() == _cmbTable) {
2437 int iRow = _cmbTable->rowCount();
2438 if (iRow > 0) {
2439 enableWidget(true, _cmbMethodComboBox);
2440 _cmbMaxresLineEdit->setStyleSheet("background-color: white");
2441 _cmbMaxresLineEdit->setEnabled(true);
2442 _cmbSamplSpinBox->setEnabled(true);
2443 }
2444 else {
2445 enableWidget(false, _cmbMethodComboBox);
2446 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2447 _cmbMaxresLineEdit->setEnabled(false);
2448 _cmbSamplSpinBox->setEnabled(false);
2449 }
2450 }
2451
2452 // Upload(clk)
2453 // -----------
2454 int iRow = _uploadTable->rowCount();
2455 if (iRow > 0) {
2456 enableWidget(true, _uploadIntrComboBox);
2457 enableWidget(true, _uploadSamplRtcmEphCorrSpinBox);
2458 enableWidget(true, _uploadSamplClkRnxSpinBox);
2459 enableWidget(true, _uploadSamplSp3SpinBox);
2460 }
2461 else {
2462 enableWidget(false, _uploadIntrComboBox);
2463 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2464 enableWidget(false, _uploadSamplClkRnxSpinBox);
2465 enableWidget(false, _uploadSamplSp3SpinBox);
2466 }
2467
2468 // PPP Client
2469 // ----------
2470 if (sender() == 0
2471 || sender() == _pppMountLineEdit
2472 || sender() == _pppCorrMountLineEdit
2473 || sender() == _pppRefCrdXLineEdit
2474 || sender() == _pppRefCrdYLineEdit
2475 || sender() == _pppRefCrdZLineEdit
2476 || sender() == _pppRefdNLineEdit
2477 || sender() == _pppRefdELineEdit
2478 || sender() == _pppRefdULineEdit
2479 || sender() == _pppSync
2480 || sender() == _pppSPPComboBox
2481 || sender() == _pppQuickStartLineEdit
2482 || sender() == _pppEstTropoCheckBox
2483 || sender() == _pppUsePhaseCheckBox
2484 || sender() == _pppAntexFileChooser
2485#ifdef QT_WEBKIT
2486 || sender() == _mapWin
2487#endif
2488 ) {
2489
2490
2491 enable = !_pppSPPComboBox->currentText().isEmpty();
2492 if (enable) {
2493 enable = (!_pppMountLineEdit->text().isEmpty() && !_pppCorrMountLineEdit->text().isEmpty()) ||
2494 (!_pppMountLineEdit->text().isEmpty() && _pppSPPComboBox->currentText() == "Realtime-SPP") ||
2495 (_pppSPPComboBox->currentText() == "Post-Processing");
2496 }
2497
2498 enableWidget(enable, _pppNMEALineEdit);
2499 enableWidget(enable, _pppNMEAPortLineEdit);
2500 enableWidget(enable, _pppRefCrdXLineEdit);
2501 enableWidget(enable, _pppRefCrdYLineEdit);
2502 enableWidget(enable, _pppRefCrdZLineEdit);
2503 enableWidget(enable, _pppRefdNLineEdit);
2504 enableWidget(enable, _pppRefdELineEdit);
2505 enableWidget(enable, _pppRefdULineEdit);
2506 enableWidget(enable, _pppUsePhaseCheckBox);
2507 enableWidget(enable, _pppPlotCoordinates);
2508 enableWidget(enable, _mapWinButton);
2509 enableWidget(enable, _mapWinDotSizeLineEdit);
2510 enableWidget(enable, _mapWinDotColorComboBox);
2511 enableWidget(enable, _gmRadioButton);
2512 enableWidget(enable, _osmRadioButton);
2513 enableWidget(enable, _pppEstTropoCheckBox);
2514// enableWidget(enable, _pppGLONASSCheckBox);
2515 enableWidget(enable, _pppGalileoCheckBox);
2516// enableWidget(enable, _pppAntexFileChooser);
2517 enableWidget(enable, _pppSigCLineEdit);
2518 enableWidget(enable, _pppSigCrd0);
2519 enableWidget(enable, _pppSigCrdP);
2520
2521 bool enable2 = enable && !_pppRefCrdXLineEdit->text().isEmpty() &&
2522 !_pppRefCrdYLineEdit->text().isEmpty() &&
2523 !_pppRefCrdZLineEdit->text().isEmpty();
2524
2525 enableWidget(enable2, _pppAverageLineEdit);
2526 enableWidget(enable2, _pppQuickStartLineEdit);
2527
2528 bool enable3 = enable2 && !_pppQuickStartLineEdit->text().isEmpty();
2529 enableWidget(enable3, _pppMaxSolGapLineEdit);
2530 enableWidget(enable3, _pppAudioResponseLineEdit);
2531
2532 bool enable4 = enable && !_pppAntexFileChooser->fileName().isEmpty();
2533 enableWidget(enable4, _pppAntennaLineEdit);
2534
2535 bool enable5 = enable && _pppEstTropoCheckBox->isChecked();
2536 enableWidget(enable5, _pppSigTrp0);
2537 enableWidget(enable5, _pppSigTrpP);
2538
2539 bool enable6 = enable && _pppUsePhaseCheckBox->isChecked();
2540 enableWidget(enable6, _pppSigPLineEdit);
2541
2542 bool enable7 = enable && _pppSPPComboBox->currentText() == "Realtime-PPP";
2543 enableWidget(enable7, _pppSync);
2544
2545 bool enable8 = _pppSPPComboBox->currentText() == "Realtime-PPP";
2546 enableWidget(enable8, _pppCorrMountLineEdit);
2547
2548 bool enable9 = _pppSPPComboBox->currentText() == "Post-Processing";
2549 enableWidget(enable9, _postObsFileChooser);
2550 enableWidget(enable9, _postNavFileChooser);
2551 enableWidget(enable9, _postCorrFileChooser);
2552 enableWidget(enable9, _postOutLineEdit);
2553 enableWidget(enable9, _mapSpeedSlider);
2554
2555 bool enable10 = !_pppSPPComboBox->currentText().isEmpty() && !enable9;
2556 enableWidget(enable10, _pppMountLineEdit);
2557 }
2558
2559 if (sender() == 0 || sender() == _reqcActionComboBox) {
2560 enable = !_reqcActionComboBox->currentText().isEmpty();
2561 bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
2562 enableWidget(enable && enable10, _reqcEditOptionButton);
2563 enableWidget(enable, _reqcObsFileChooser);
2564 enableWidget(enable, _reqcNavFileChooser);
2565 enableWidget(enable && enable10, _reqcOutObsLineEdit);
2566 enableWidget(enable && enable10, _reqcOutNavLineEdit);
2567 enableWidget(enable, _reqcOutLogLineEdit);
2568 enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
2569 enableWidget(enable && !enable10, _reqcSkyPlotSystems);
2570 }
2571
2572 enableStartStop();
2573}
2574
2575//
2576////////////////////////////////////////////////////////////////////////////
2577void bncWindow::slotAddCmbRow() {
2578 int iRow = _cmbTable->rowCount();
2579 _cmbTable->insertRow(iRow);
2580 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2581 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2582 }
2583}
2584
2585//
2586////////////////////////////////////////////////////////////////////////////
2587void bncWindow::slotDelCmbRow() {
2588 int nRows = _cmbTable->rowCount();
2589 bool flg[nRows];
2590 for (int iRow = 0; iRow < nRows; iRow++) {
2591 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2592 flg[iRow] = true;
2593 }
2594 else {
2595 flg[iRow] = false;
2596 }
2597 }
2598 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2599 if (flg[iRow]) {
2600 _cmbTable->removeRow(iRow);
2601 }
2602 }
2603 nRows = _cmbTable->rowCount();
2604 if (nRows < 1) {
2605 enableWidget(false, _cmbMethodComboBox);
2606 _cmbMaxresLineEdit->setStyleSheet("background-color: lightGray");
2607 _cmbMaxresLineEdit->setEnabled(false);
2608 _cmbSamplSpinBox->setEnabled(false);
2609 }
2610}
2611
2612//
2613////////////////////////////////////////////////////////////////////////////
2614void bncWindow::populateCmbTable() {
2615
2616 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2617 _cmbTable->removeRow(iRow);
2618 }
2619
2620 bncSettings settings;
2621
2622 int iRow = -1;
2623 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2624 while (it.hasNext()) {
2625 QStringList hlp = it.next().split(" ");
2626 if (hlp.size() > 2) {
2627 ++iRow;
2628 _cmbTable->insertRow(iRow);
2629 }
2630 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2631 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2632 }
2633 }
2634}
2635
2636//
2637////////////////////////////////////////////////////////////////////////////
2638void bncWindow::slotAddUploadRow() {
2639 int iRow = _uploadTable->rowCount();
2640 _uploadTable->insertRow(iRow);
2641 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2642 if (iCol == 3) {
2643 QLineEdit* passwd = new QLineEdit();
2644 passwd->setFrame(false);
2645 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2646 _uploadTable->setCellWidget(iRow, iCol, passwd);
2647 }
2648 else if (iCol == 4) {
2649 QComboBox* system = new QComboBox();
2650 system->setEditable(false);
2651 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2652 system->setFrame(false);
2653 _uploadTable->setCellWidget(iRow, iCol, system);
2654 }
2655 else if (iCol == 5) {
2656 QCheckBox* com = new QCheckBox();
2657 _uploadTable->setCellWidget(iRow, iCol, com);
2658 }
2659 else if (iCol == 11) {
2660 bncTableItem* bncIt = new bncTableItem();
2661 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2662 _uploadTable->setItem(iRow, iCol, bncIt);
2663 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2664 }
2665 else {
2666 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2667 }
2668 }
2669}
2670
2671//
2672////////////////////////////////////////////////////////////////////////////
2673void bncWindow::slotDelUploadRow() {
2674 BNC_CORE->_uploadTableItems.clear();
2675 int nRows = _uploadTable->rowCount();
2676 bool flg[nRows];
2677 for (int iRow = 0; iRow < nRows; iRow++) {
2678 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2679 flg[iRow] = true;
2680 }
2681 else {
2682 flg[iRow] = false;
2683 }
2684 }
2685 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2686 if (flg[iRow]) {
2687 _uploadTable->removeRow(iRow);
2688 }
2689 }
2690 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2691 BNC_CORE->_uploadTableItems[iRow] =
2692 (bncTableItem*) _uploadTable->item(iRow, 11);
2693 }
2694 nRows = _uploadTable->rowCount();
2695 if (nRows < 1) {
2696 enableWidget(false, _uploadIntrComboBox);
2697 enableWidget(false, _uploadSamplRtcmEphCorrSpinBox);
2698 enableWidget(false, _uploadSamplSp3SpinBox);
2699 enableWidget(false, _uploadSamplClkRnxSpinBox);
2700 }
2701}
2702
2703//
2704////////////////////////////////////////////////////////////////////////////
2705void bncWindow::populateUploadTable() {
2706 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2707 _uploadTable->removeRow(iRow);
2708 }
2709
2710 bncSettings settings;
2711
2712 int iRow = -1;
2713 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2714 while (it.hasNext()) {
2715 QStringList hlp = it.next().split(",");
2716 if (hlp.size() > 6) {
2717 ++iRow;
2718 _uploadTable->insertRow(iRow);
2719 }
2720 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2721 if (iCol == 3) {
2722 QLineEdit* passwd = new QLineEdit();
2723 passwd->setFrame(false);
2724 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2725 passwd->setText(hlp[iCol]);
2726 _uploadTable->setCellWidget(iRow, iCol, passwd);
2727 }
2728 else if (iCol == 4) {
2729 QComboBox* system = new QComboBox();
2730 system->setEditable(false);
2731 system->addItems(QString(",IGS08,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,DREF91,Custom").split(","));
2732 system->setFrame(false);
2733 system->setCurrentIndex(system->findText(hlp[iCol]));
2734 _uploadTable->setCellWidget(iRow, iCol, system);
2735 }
2736 else if (iCol == 5) {
2737 QCheckBox* com = new QCheckBox();
2738 if (hlp[iCol].toInt() == Qt::Checked) {
2739 com->setCheckState(Qt::Checked);
2740 }
2741 _uploadTable->setCellWidget(iRow, iCol, com);
2742 }
2743 else if (iCol == 11) {
2744 bncTableItem* bncIt = new bncTableItem();
2745 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2746 _uploadTable->setItem(iRow, iCol, bncIt);
2747 BNC_CORE->_uploadTableItems[iRow] = bncIt;
2748 }
2749 else {
2750 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2751 }
2752 }
2753 }
2754}
2755
2756//
2757////////////////////////////////////////////////////////////////////////////
2758void bncWindow::slotSetUploadTrafo() {
2759 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2760 dlg->exec();
2761 delete dlg;
2762}
2763
2764// Start Post-Processing PPP
2765////////////////////////////////////////////////////////////////////////////
2766void bncWindow::startPostProcessingPPP() {
2767#ifdef USE_POSTPROCESSING
2768 _runningPostProcessingPPP = true;
2769 _actStart->setText("0 Epochs");
2770 enableStartStop();
2771
2772 _postProcessing = new t_postProcessing(this, _mapSpeedSlider->maximum(), _mapSpeedSlider->value());
2773 connect(_postProcessing, SIGNAL(finished()), this, SLOT(slotFinishedPostProcessingPPP()));
2774 connect(_postProcessing, SIGNAL(progress(int)), this, SLOT(slotPostProgress(int)));
2775 connect(_mapSpeedSlider, SIGNAL(valueChanged(int)), _postProcessing, SLOT(slotSetSpeed(int)));
2776 bncSettings settings;
2777 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
2778 _bncFigurePPP->reset();
2779 connect(_postProcessing, SIGNAL(newPosition(bncTime, double, double, double)),
2780 _bncFigurePPP, SLOT(slotNewPosition(bncTime, double, double, double)));
2781 }
2782#ifdef QT_WEBKIT
2783 if (_mapWin) {
2784 connect(_postProcessing, SIGNAL(newPosition(bncTime, double, double, double)),
2785 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2786 }
2787#endif
2788
2789 _postProcessing->start();
2790#else
2791 QMessageBox::information(this, "Information",
2792 "Post-Processing Not Permitted");
2793#endif
2794}
2795
2796// Post-Processing PPP Finished
2797////////////////////////////////////////////////////////////////////////////
2798void bncWindow::slotFinishedPostProcessingPPP() {
2799#ifdef QT_WEBKIT
2800 if (_mapWin) {
2801 _postProcessing->disconnect(_mapWin);
2802 }
2803#endif
2804 _runningPostProcessingPPP = false;
2805 delete _postProcessing;
2806 _postProcessing = 0;
2807 QMessageBox::information(this, "Information",
2808 "Post-Processing Thread Finished");
2809 _actStart->setText("Start");
2810 enableStartStop();
2811}
2812
2813// Progress Bar Change
2814////////////////////////////////////////////////////////////////////////////
2815void bncWindow::slotPostProgress(int nEpo) {
2816 if (_actStart) {
2817 _actStart->setText(QString("%1 Epochs").arg(nEpo));
2818 }
2819}
2820
2821// Start Post-Processing Reqc
2822////////////////////////////////////////////////////////////////////////////
2823void bncWindow::startPostProcessingReqc() {
2824#ifdef USE_POSTPROCESSING
2825 _runningPostProcessingReqc = true;
2826 enableStartStop();
2827 if (_reqcActionComboBox->currentText() == "Analyze") {
2828 t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
2829 connect(reqcAnalyze, SIGNAL(finished()),
2830 this, SLOT(slotFinishedPostProcessingReqc()));
2831 reqcAnalyze->start();
2832 }
2833 else {
2834 t_reqcEdit* reqcEdit = new t_reqcEdit(this);
2835 connect(reqcEdit, SIGNAL(finished()),
2836 this, SLOT(slotFinishedPostProcessingReqc()));
2837 reqcEdit->start();
2838 }
2839#else
2840 QMessageBox::information(this, "Information",
2841 "Post-Processing Not Permitted");
2842#endif
2843}
2844
2845// Post-Processing Reqc Finished
2846////////////////////////////////////////////////////////////////////////////
2847void bncWindow::slotFinishedPostProcessingReqc() {
2848 _runningPostProcessingReqc = false;
2849 if (_reqcActionComboBox->currentText() != "Analyze") {
2850 QMessageBox::information(this, "Information",
2851 "RINEX Processing Thread Finished");
2852 }
2853 enableStartStop();
2854}
2855
2856// Edit teqc-like editing options
2857////////////////////////////////////////////////////////////////////////////
2858void bncWindow::slotReqcEditOption() {
2859 reqcDlg* dlg = new reqcDlg(this);
2860 dlg->move(this->pos().x()+50, this->pos().y()+50);
2861 dlg->exec();
2862 delete dlg;
2863}
2864
2865// Enable/Disable Start and Stop Buttons
2866////////////////////////////////////////////////////////////////////////////
2867void bncWindow::enableStartStop() {
2868
2869 if ( _pppSPPComboBox && _pppSPPComboBox->currentText() == "Post-Processing" ) {
2870 if (_runningPostProcessingPPP) {
2871 _actStart->setEnabled(false);
2872 }
2873 else {
2874 _actStart->setEnabled(true);
2875 }
2876 _actStop->setEnabled(false);
2877 }
2878 else if ( _reqcActionComboBox && !_reqcActionComboBox->currentText().isEmpty() ) {
2879 if (_runningPostProcessingReqc) {
2880 _actStart->setEnabled(false);
2881 }
2882 else {
2883 _actStart->setEnabled(true);
2884 }
2885 _actStop->setEnabled(false);
2886 }
2887 else {
2888 if (_runningRealTime) {
2889 _actStart->setEnabled(false);
2890 _actStop->setEnabled(true);
2891 }
2892 else {
2893 _actStop->setEnabled(false);
2894 if (_mountPointsTable->rowCount() == 0) {
2895 _actStart->setEnabled(false);
2896 }
2897 else {
2898 _actStart->setEnabled(true);
2899 }
2900 }
2901 }
2902}
2903
2904// Show Map
2905////////////////////////////////////////////////////////////////////////////
2906void bncWindow::slotMapMountPoints() {
2907 saveOptions();
2908 t_bncMap* bncMap = new t_bncMap(this);
2909 bncMap->setMinimumSize(800, 600);
2910 bncMap->setWindowTitle("Selected Mountpoints");
2911
2912 bncSettings settings;
2913 QListIterator<QString> it(settings.value("mountPoints").toStringList());
2914 while (it.hasNext()) {
2915 QStringList hlp = it.next().split(" ");
2916 if (hlp.size() < 5) continue;
2917 QUrl url(hlp[0]);
2918 double latDeg = hlp[2].toDouble();
2919 double lonDeg = hlp[3].toDouble();
2920 bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
2921 }
2922
2923 bncMap->show();
2924}
2925
2926// Show Map
2927////////////////////////////////////////////////////////////////////////////
2928void bncWindow::slotMapPPP() {
2929#ifdef QT_WEBKIT
2930 saveOptions();
2931 enableWidget(false, _mapWinButton);
2932 enableWidget(false, _gmRadioButton);
2933 enableWidget(false, _osmRadioButton);
2934 enableWidget(false, _mapWinDotSizeLineEdit);
2935 enableWidget(false, _mapWinDotColorComboBox);
2936
2937 if (!_mapWin) {
2938 _mapWin = new bncMapWin(this);
2939 connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
2940 QListIterator<bncGetThread*> it(_threads);
2941 while (it.hasNext()) {
2942 bncGetThread* thread = it.next();
2943 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
2944 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2945 }
2946 if (_postProcessing) {
2947 connect(_postProcessing, SIGNAL(newPosition(bncTime, double, double, double)),
2948 _mapWin, SLOT(slotNewPosition(bncTime, double, double, double)));
2949 }
2950 }
2951 _mapWin->show();
2952#else
2953 QMessageBox::information(this, "Information",
2954 "Qt Library compiled without QtWebKit");
2955#endif
2956}
2957
2958// Show Map
2959////////////////////////////////////////////////////////////////////////////
2960void bncWindow::slotMapPPPClosed() {
2961#ifdef QT_WEBKIT
2962 slotBncTextChanged();
2963 if (_mapWin) {
2964 QListIterator<bncGetThread*> it(_threads);
2965 while (it.hasNext()) {
2966 bncGetThread* thread = it.next();
2967 thread->disconnect(_mapWin);
2968 }
2969 if (_postProcessing) {
2970 _postProcessing->disconnect(_mapWin);
2971 }
2972 _mapWin->deleteLater();
2973 _mapWin = 0;
2974 }
2975#endif
2976}
Note: See TracBrowser for help on using the repository browser.