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

Last change on this file since 6691 was 6691, checked in by weber, 9 years ago

Documentation completed

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