source: ntrip/trunk/BNC/bncwindow.cpp@ 3246

Last change on this file since 3246 was 3245, checked in by mervart, 14 years ago
File size: 115.3 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 "bncapp.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 "upload/bnccustomtrafo.h"
61
62using namespace std;
63
64// Constructor
65////////////////////////////////////////////////////////////////////////////
66bncWindow::bncWindow() {
67
68 _caster = 0;
69
70 _bncFigure = new bncFigure(this);
71 _bncFigureLate = new bncFigureLate(this);
72 _bncFigurePPP = new bncFigurePPP(this);
73
74 int ww = QFontMetrics(this->font()).width('w');
75
76 static const QStringList labels = QString("account, Streams: resource loader / mountpoint, decoder, lat, long, nmea, ntrip, bytes").split(",");
77
78 setMinimumSize(85*ww, 65*ww);
79
80 setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
81
82 connect((bncApp*)qApp, SIGNAL(newMessage(QByteArray,bool)),
83 this, SLOT(slotWindowMessage(QByteArray,bool)));
84
85 // Create Actions
86 // --------------
87 _actHelp = new QAction(tr("&Help Contents"),this);
88 connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
89
90 _actAbout = new QAction(tr("&About BNC"),this);
91 connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
92
93 _actFlowchart = new QAction(tr("&Flow Chart"),this);
94 connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
95
96 _actFontSel = new QAction(tr("Select &Font"),this);
97 connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
98
99 _actSaveOpt = new QAction(tr("&Save && Reread Configuration"),this);
100 connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
101
102 _actQuit = new QAction(tr("&Quit"),this);
103 connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
104
105 _actAddMountPoints = new QAction(tr("Add &Stream"),this);
106 connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
107
108 _actDeleteMountPoints = new QAction(tr("&Delete Stream"),this);
109 connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
110 _actDeleteMountPoints->setEnabled(false);
111
112 _actGetData = new QAction(tr("Sta&rt"),this);
113 connect(_actGetData, SIGNAL(triggered()), SLOT(slotGetData()));
114
115 _actStop = new QAction(tr("Sto&p"),this);
116 connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
117 _actStop->setEnabled(false);
118
119 _actwhatsthis= new QAction(tr("Help ?=Shift+F1"),this);
120 connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
121
122 CreateMenu();
123 AddToolbar();
124
125 bncSettings settings;
126
127 // Proxy Options
128 // -------------
129 _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
130 _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
131
132 connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString &)),
133 this, SLOT(slotBncTextChanged()));
134
135 // General Options
136 // ---------------
137 _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
138 _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
139 _rnxAppendCheckBox = new QCheckBox();
140 _rnxAppendCheckBox->setCheckState(Qt::CheckState(
141 settings.value("rnxAppend").toInt()));
142 _onTheFlyComboBox = new QComboBox();
143 _onTheFlyComboBox->setEditable(false);
144 _onTheFlyComboBox->addItems(QString("1 day,1 hour,1 min").split(","));
145 int ii = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
146 if (ii != -1) {
147 _onTheFlyComboBox->setCurrentIndex(ii);
148 }
149 _autoStartCheckBox = new QCheckBox();
150 _autoStartCheckBox->setCheckState(Qt::CheckState(
151 settings.value("autoStart").toInt()));
152
153 // RINEX Observations Options
154 // --------------------------
155 _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
156 _rnxIntrComboBox = new QComboBox();
157 _rnxIntrComboBox->setEditable(false);
158 _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
159 ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
160 if (ii != -1) {
161 _rnxIntrComboBox->setCurrentIndex(ii);
162 }
163 _rnxSamplSpinBox = new QSpinBox();
164 _rnxSamplSpinBox->setMinimum(0);
165 _rnxSamplSpinBox->setMaximum(60);
166 _rnxSamplSpinBox->setSingleStep(5);
167 _rnxSamplSpinBox->setValue(settings.value("rnxSampl").toInt());
168 _rnxSamplSpinBox->setSuffix(" sec");
169 _rnxSkelLineEdit = new QLineEdit(settings.value("rnxSkel").toString());
170 _rnxSkelLineEdit->setMaximumWidth(5*ww);
171 _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
172 _rnxV3CheckBox = new QCheckBox();
173 _rnxV3CheckBox->setCheckState(Qt::CheckState(settings.value("rnxV3").toInt()));
174
175 connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString &)),
176 this, SLOT(slotBncTextChanged()));
177
178 // RINEX Ephemeris Options
179 // -----------------------
180 _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
181 _ephIntrComboBox = new QComboBox();
182 _ephIntrComboBox->setEditable(false);
183 _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
184 int jj = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
185 if (jj != -1) {
186 _ephIntrComboBox->setCurrentIndex(jj);
187 }
188 _outEphPortLineEdit = new QLineEdit(settings.value("outEphPort").toString());
189 _ephV3CheckBox = new QCheckBox();
190 _ephV3CheckBox->setCheckState(Qt::CheckState(settings.value("ephV3").toInt()));
191
192 connect(_outEphPortLineEdit, SIGNAL(textChanged(const QString &)),
193 this, SLOT(slotBncTextChanged()));
194
195 connect(_ephPathLineEdit, SIGNAL(textChanged(const QString &)),
196 this, SLOT(slotBncTextChanged()));
197
198 // Broadcast Corrections Options
199 // -----------------------------
200 _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
201 _corrIntrComboBox = new QComboBox();
202 _corrIntrComboBox->setEditable(false);
203 _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
204 int mm = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
205 if (mm != -1) {
206 _corrIntrComboBox->setCurrentIndex(mm);
207 }
208 _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
209 _corrTimeSpinBox = new QSpinBox();
210 _corrTimeSpinBox->setMinimum(0);
211 _corrTimeSpinBox->setMaximum(60);
212 _corrTimeSpinBox->setSingleStep(1);
213 _corrTimeSpinBox->setSuffix(" sec");
214 _corrTimeSpinBox->setValue(settings.value("corrTime").toInt());
215
216 connect(_corrPathLineEdit, SIGNAL(textChanged(const QString &)),
217 this, SLOT(slotBncTextChanged()));
218
219 connect(_corrPortLineEdit, SIGNAL(textChanged(const QString &)),
220 this, SLOT(slotBncTextChanged()));
221
222 // Feed Engine Options
223 // -------------------
224 _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
225 _waitTimeSpinBox = new QSpinBox();
226 _waitTimeSpinBox->setMinimum(1);
227 _waitTimeSpinBox->setMaximum(30);
228 _waitTimeSpinBox->setSingleStep(1);
229 _waitTimeSpinBox->setSuffix(" sec");
230 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
231 _binSamplSpinBox = new QSpinBox();
232 _binSamplSpinBox->setMinimum(0);
233 _binSamplSpinBox->setMaximum(60);
234 _binSamplSpinBox->setSingleStep(5);
235 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
236 _binSamplSpinBox->setSuffix(" sec");
237 _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
238 _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
239
240 connect(_outPortLineEdit, SIGNAL(textChanged(const QString &)),
241 this, SLOT(slotBncTextChanged()));
242
243 connect(_outFileLineEdit, SIGNAL(textChanged(const QString &)),
244 this, SLOT(slotBncTextChanged()));
245
246 // Serial Output Options
247 // ---------------------
248 _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
249 _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
250 _serialBaudRateComboBox = new QComboBox();
251 _serialBaudRateComboBox->addItems(QString("110,300,600,"
252 "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
253 int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
254 if (kk != -1) {
255 _serialBaudRateComboBox->setCurrentIndex(kk);
256 }
257 _serialFlowControlComboBox = new QComboBox();
258 _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
259 kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
260 if (kk != -1) {
261 _serialFlowControlComboBox->setCurrentIndex(kk);
262 }
263 _serialDataBitsComboBox = new QComboBox();
264 _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
265 kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
266 if (kk != -1) {
267 _serialDataBitsComboBox->setCurrentIndex(kk);
268 }
269 _serialParityComboBox = new QComboBox();
270 _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
271 kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
272 if (kk != -1) {
273 _serialParityComboBox->setCurrentIndex(kk);
274 }
275 _serialStopBitsComboBox = new QComboBox();
276 _serialStopBitsComboBox->addItems(QString("1,2").split(","));
277 kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
278 if (kk != -1) {
279 _serialStopBitsComboBox->setCurrentIndex(kk);
280 }
281 _serialAutoNMEAComboBox = new QComboBox();
282 _serialAutoNMEAComboBox->addItems(QString("Auto,Manual").split(","));
283 kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
284 if (kk != -1) {
285 _serialAutoNMEAComboBox->setCurrentIndex(kk);
286 }
287 _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
288 _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
289
290 connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString &)),
291 this, SLOT(slotBncTextChanged()));
292
293 connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString &)),
294 this, SLOT(slotBncTextChanged()));
295
296 // Outages Options
297 // ---------------
298 _obsRateComboBox = new QComboBox();
299 _obsRateComboBox->setEditable(false);
300 _obsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
301 kk = _obsRateComboBox->findText(settings.value("obsRate").toString());
302 if (kk != -1) {
303 _obsRateComboBox->setCurrentIndex(kk);
304 }
305 _adviseFailSpinBox = new QSpinBox();
306 _adviseFailSpinBox->setMinimum(0);
307 _adviseFailSpinBox->setMaximum(60);
308 _adviseFailSpinBox->setSingleStep(1);
309 _adviseFailSpinBox->setSuffix(" min");
310 _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
311 _adviseRecoSpinBox = new QSpinBox();
312 _adviseRecoSpinBox->setMinimum(0);
313 _adviseRecoSpinBox->setMaximum(60);
314 _adviseRecoSpinBox->setSingleStep(1);
315 _adviseRecoSpinBox->setSuffix(" min");
316 _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
317 _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
318
319 connect(_obsRateComboBox, SIGNAL(currentIndexChanged(const QString &)),
320 this, SLOT(slotBncTextChanged()));
321
322 // Miscellaneous Options
323 // ---------------------
324 _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
325 _perfIntrComboBox = new QComboBox();
326 _perfIntrComboBox->setEditable(false);
327 _perfIntrComboBox->addItems(QString(",2 sec, 10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
328 int ll = _perfIntrComboBox->findText(settings.value("perfIntr").toString());
329 if (ll != -1) {
330 _perfIntrComboBox->setCurrentIndex(ll);
331 }
332 _scanRTCMCheckBox = new QCheckBox();
333 _scanRTCMCheckBox->setCheckState(Qt::CheckState(
334 settings.value("scanRTCM").toInt()));
335
336 connect(_miscMountLineEdit, SIGNAL(textChanged(const QString &)),
337 this, SLOT(slotBncTextChanged()));
338
339 // PPP Options
340 // -----------
341 _pppMountLineEdit = new QLineEdit(settings.value("pppMount").toString());
342 _pppCorrMountLineEdit = new QLineEdit(settings.value("pppCorrMount").toString());
343 _pppNMEALineEdit = new QLineEdit(settings.value("nmeaFile").toString());
344 _pppNMEAPortLineEdit = new QLineEdit(settings.value("nmeaPort").toString());
345 _pppSigCLineEdit = new QLineEdit(settings.value("pppSigmaCode").toString());
346 _pppSigPLineEdit = new QLineEdit(settings.value("pppSigmaPhase").toString());
347 _pppSigCrd0 = new QLineEdit(settings.value("pppSigCrd0").toString());
348 _pppSigCrdP = new QLineEdit(settings.value("pppSigCrdP").toString());
349 _pppSigTrp0 = new QLineEdit(settings.value("pppSigTrp0").toString());
350 _pppSigTrpP = new QLineEdit(settings.value("pppSigTrpP").toString());
351 _pppAverageLineEdit = new QLineEdit(settings.value("pppAverage").toString());
352 _pppQuickStartLineEdit = new QLineEdit(settings.value("pppQuickStart").toString());
353 _pppMaxSolGapLineEdit = new QLineEdit(settings.value("pppMaxSolGap").toString());
354 _pppRefCrdXLineEdit = new QLineEdit(settings.value("pppRefCrdX").toString());
355 _pppRefCrdYLineEdit = new QLineEdit(settings.value("pppRefCrdY").toString());
356 _pppRefCrdZLineEdit = new QLineEdit(settings.value("pppRefCrdZ").toString());
357 _pppSync = new QLineEdit(settings.value("pppSync").toString());
358 _pppAntennaLineEdit = new QLineEdit(settings.value("pppAntenna").toString());
359 _pppAntexLineEdit = new QLineEdit(settings.value("pppAntex").toString());
360
361
362 _pppSPPComboBox = new QComboBox();
363 _pppSPPComboBox->setEditable(false);
364 _pppSPPComboBox->addItems(QString("PPP,SPP").split(","));
365 int ik = _pppSPPComboBox->findText(settings.value("pppSPP").toString());
366 if (ik != -1) {
367 _pppSPPComboBox->setCurrentIndex(ik);
368 }
369 _pppUsePhaseCheckBox = new QCheckBox();
370 _pppUsePhaseCheckBox->setCheckState(Qt::CheckState(
371 settings.value("pppUsePhase").toInt()));
372 _pppEstTropoCheckBox = new QCheckBox();
373 _pppEstTropoCheckBox->setCheckState(Qt::CheckState(
374 settings.value("pppEstTropo").toInt()));
375 _pppGLONASSCheckBox = new QCheckBox();
376 _pppGLONASSCheckBox->setCheckState(Qt::CheckState(
377 settings.value("pppGLONASS").toInt()));
378 _pppGalileoCheckBox = new QCheckBox();
379 _pppGalileoCheckBox->setCheckState(Qt::CheckState(
380 settings.value("pppGalileo").toInt()));
381
382 _pppPlotCoordinates = new QCheckBox();
383 _pppPlotCoordinates->setCheckState(Qt::CheckState(
384 settings.value("pppPlotCoordinates").toInt()));
385
386 _pppApplySatAntCheckBox = new QCheckBox();
387 _pppApplySatAntCheckBox->setCheckState(Qt::CheckState(
388 settings.value("pppApplySatAnt").toInt()));
389
390 connect(_pppMountLineEdit, SIGNAL(textChanged(const QString &)),
391 this, SLOT(slotBncTextChanged()));
392
393 connect(_pppCorrMountLineEdit, SIGNAL(textChanged(const QString &)),
394 this, SLOT(slotBncTextChanged()));
395
396 connect(_pppUsePhaseCheckBox, SIGNAL(stateChanged(int)),
397 this, SLOT(slotBncTextChanged()));
398
399 connect(_pppRefCrdXLineEdit, SIGNAL(textChanged(const QString &)),
400 this, SLOT(slotBncTextChanged()));
401 connect(_pppRefCrdYLineEdit, SIGNAL(textChanged(const QString &)),
402 this, SLOT(slotBncTextChanged()));
403 connect(_pppRefCrdZLineEdit, SIGNAL(textChanged(const QString &)),
404 this, SLOT(slotBncTextChanged()));
405
406 connect(_pppEstTropoCheckBox, SIGNAL(stateChanged(int)),
407 this, SLOT(slotBncTextChanged()));
408
409 connect(_pppSync, SIGNAL(textChanged(const QString &)),
410 this, SLOT(slotBncTextChanged()));
411
412 connect(_pppSPPComboBox, SIGNAL(currentIndexChanged(const QString &)),
413 this, SLOT(slotBncTextChanged()));
414
415 connect(_pppAntexLineEdit, SIGNAL(textChanged(const QString &)),
416 this, SLOT(slotBncTextChanged()));
417
418 connect(_pppQuickStartLineEdit, SIGNAL(textChanged(const QString &)),
419 this, SLOT(slotBncTextChanged()));
420
421 // Streams
422 // -------
423 _mountPointsTable = new QTableWidget(0,8);
424
425 _mountPointsTable->horizontalHeader()->resizeSection(1,34*ww);
426 _mountPointsTable->horizontalHeader()->resizeSection(2,9*ww);
427 _mountPointsTable->horizontalHeader()->resizeSection(3,7*ww);
428 _mountPointsTable->horizontalHeader()->resizeSection(4,7*ww);
429 _mountPointsTable->horizontalHeader()->resizeSection(5,5*ww);
430 _mountPointsTable->horizontalHeader()->resizeSection(6,5*ww);
431 _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
432 _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
433 _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
434 _mountPointsTable->setHorizontalHeaderLabels(labels);
435 _mountPointsTable->setGridStyle(Qt::NoPen);
436 _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
437 _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
438 _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
439 _mountPointsTable->hideColumn(0);
440 connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
441 SLOT(slotSelectionChanged()));
442 populateMountPointsTable();
443
444 _log = new QTextBrowser();
445 _log->setReadOnly(true);
446
447 // Combination
448 // -----------
449 _cmbTable = new QTableWidget(0,3);
450 _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight").split(","));
451 _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
452 _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
453 _cmbTable->setMaximumWidth(30*ww);
454 _cmbTable->horizontalHeader()->resizeSection(0,10*ww);
455 _cmbTable->horizontalHeader()->resizeSection(1,8*ww);
456 _cmbTable->horizontalHeader()->resizeSection(2,8*ww);
457 _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
458 _cmbTable->horizontalHeader()->setStretchLastSection(true);
459 _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
460
461 QPushButton* addCmbRowButton = new QPushButton("Add Row");
462 QPushButton* delCmbRowButton = new QPushButton("Delete");
463
464 connect(_cmbTable, SIGNAL(itemSelectionChanged()),
465 SLOT(slotBncTextChanged()));
466
467 // Upload Results
468 // -------------
469 _uploadTable = new QTableWidget(0,9);
470 _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mount, Password, System, CoM, SP3 File, RNX File, bytes").split(","));
471 _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
472 _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
473 _uploadTable->horizontalHeader()->resizeSection(0,13*ww);
474 _uploadTable->horizontalHeader()->resizeSection(1,5*ww);
475 _uploadTable->horizontalHeader()->resizeSection(2,6*ww);
476 _uploadTable->horizontalHeader()->resizeSection(3,8*ww);
477 _uploadTable->horizontalHeader()->resizeSection(4,11*ww);
478 _uploadTable->horizontalHeader()->resizeSection(5,4*ww);
479 _uploadTable->horizontalHeader()->resizeSection(6,15*ww);
480 _uploadTable->horizontalHeader()->resizeSection(7,15*ww);
481 _uploadTable->horizontalHeader()->resizeSection(8,10*ww);
482 _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
483 _uploadTable->horizontalHeader()->setStretchLastSection(true);
484 _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
485
486 QPushButton* addUploadRowButton = new QPushButton("Add Row");
487 QPushButton* delUploadRowButton = new QPushButton("Del Row");
488 QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
489 _uploadIntrComboBox = new QComboBox;
490 _uploadSamplSpinBox = new QSpinBox;
491 _uploadIntrComboBox->setEditable(false);
492 _uploadIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
493 ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
494 if (ii != -1) {
495 _uploadIntrComboBox->setCurrentIndex(ii);
496 }
497 _uploadSamplSpinBox = new QSpinBox;
498 _uploadSamplSpinBox->setMinimum(0);
499 _uploadSamplSpinBox->setMaximum(60);
500 _uploadSamplSpinBox->setSingleStep(5);
501 _uploadSamplSpinBox->setMaximumWidth(9*ww);
502 _uploadSamplSpinBox->setValue(settings.value("uploadSampl").toInt());
503 _uploadSamplSpinBox->setSuffix(" sec");
504
505 connect(_uploadTable, SIGNAL(itemSelectionChanged()),
506 SLOT(slotBncTextChanged()));
507
508 // Upload RTCM3 Ephemeris
509 // ----------------------
510 _uploadEphHostLineEdit = new QLineEdit(settings.value("uploadEphHost").toString());
511 _uploadEphPortLineEdit = new QLineEdit(settings.value("uploadEphPort").toString());
512 _uploadEphPasswordLineEdit = new QLineEdit(settings.value("uploadEphPassword").toString());
513 _uploadEphPasswordLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
514 _uploadEphMountpointLineEdit = new QLineEdit(settings.value("uploadEphMountpoint").toString());
515 _uploadEphSampleSpinBox = new QSpinBox;
516 _uploadEphSampleSpinBox->setMinimum(0);
517 _uploadEphSampleSpinBox->setMaximum(60);
518 _uploadEphSampleSpinBox->setSingleStep(5);
519 _uploadEphSampleSpinBox->setMaximumWidth(9*ww);
520 _uploadEphSampleSpinBox->setValue(settings.value("uploadEphSample").toInt());
521 _uploadEphSampleSpinBox->setSuffix(" sec");
522 _uploadEphBytesCounter = new bncBytesCounter;
523
524 // WhatsThis
525 // ---------
526 _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>"));
527 _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC.</p>"));
528 _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 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>"));
529 _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."));
530 _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."));
531 _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."));
532 _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."));
533 _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."));
534 _corrTimeSpinBox->setWhatsThis(tr("<p>Concerning output through IP port, BNC drops Broadcast Ephemeris Corrections received later than 'Wait for full epoch' seconds. A value of 2 to 5 seconds is recommended, depending on the latency of the incoming correction stream(s) and the delay acceptable to your real-time application.</p><p>Specifying a value of '0' means that BNC immediately outputs all incoming Broadcast Epemeris Corrections and does not drop any of them for latency reasons.</p>"));
535 _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."));
536 _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."));
537 _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."));
538 _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>"));
539 _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>"));
540 _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>"));
541 _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options.</p>"));
542 _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p>"));
543
544 _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', '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>"));
545 _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file.</p>"));
546 _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file.</p>"));
547 _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of the Broadcast Ephemeris Correction files.</p>"));
548 _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>"));
549 _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>"));
550 _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>"));
551 _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>"));
552 _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>"));
553 _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."));
554 _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>"));
555 _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>"));
556 _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 'RTIGS'.</p><p>In case you need to log the raw data as is, BNC allows users to by-pass its decoders and 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>"));
557 _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."));
558 _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)."));
559 _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."));
560 _ephV3CheckBox->setWhatsThis(tr("The default format for output of RINEX Navigation data containing Broadcast Ephemeris is RINEX Version 2.11. Select 'Version 3' if you want to output the ephemeris in RINEX Version 3 format."));
561 _rnxV3CheckBox->setWhatsThis(tr("The default format for RINEX Observation files is RINEX Version 2.11. Select 'Version 3' if you want to save the observations in RINEX Version 3 format."));
562 _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>"));
563 _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>"));
564 _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p>"));
565 _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>"));
566 _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>"));
567 _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>"));
568 _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>"));
569 _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>"));
570 _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>"));
571 _serialAutoNMEAComboBox->setWhatsThis(tr("<p>Select 'Auto' to automatically forward NMEA-GGA messages coming from your serial connected receiver to the NTRIP broadcaster and/or save them in a file.</p><p>Select 'Manual' only when handling a VRS stream and your serial connected receiver doesn't generate NMEA-GGA messages.</p>"));
572 _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p>"));
573 _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meter for your VRS to simulate an inital NMEA-GGA message.</p><p>The setting of this option is ignored in case of streams coming from physical reference stations.</p>"));
574 _pppMountLineEdit->setWhatsThis(tr("<p>Specify an observations stream by its mountpoint from the 'Streams' list compiled below if you want BNC to estimate coordinates for the affected receiver position through a PPP solution. Example: 'FFMJ1'</p><p>Note that PPP in BNC requires to also pull a stream carrying RTCM Version 3 satellite orbit and clock corrections to Broadcast Ephemeris referring to the satellites' Antenna Phase Centers (APC). Stream CLK11 on NTRIP broadcaster products.igs-ip.net is an example.</p><p>Pulling in addition a third stream carrying Broadcast Ephemeris messages in high repetition rate is suggested if such messages are comeing from the receiver in low repetition rate or don't come at all from there.</p>"));
575 _pppCorrMountLineEdit->setWhatsThis(tr("<p>You must specify an orbit/clock corrections stream by its mountpoint from the 'Streams' list compiled below. Example: 'CLK10'</p>"));
576 _pppSPPComboBox->setWhatsThis(tr("<p>Choose between plain Single Point Positioning (SPP) and Precise Point Positioning (PPP).</p>"));
577 _pppUsePhaseCheckBox->setWhatsThis(tr("<p>By default BNC applies a PPP solution using an ionosphere free P3 linear combination of code observations.</p><p>Tick 'Use phase obs' for an ionosphere free L3 linear combination of phase observations.</p>"));
578 _pppEstTropoCheckBox->setWhatsThis(tr("<p>By default BNC does not introduce troposphere parameters when estimating coordinates.</p><p>Tick 'Estimate tropo' to introduce troposphere parameters when estimating coordinates.</p>"));
579 _pppGLONASSCheckBox->setWhatsThis(tr("<p>By default BNC does not use GLONASS observations in PPP mode.</p><p>Tick 'Use GLONASS' for a combined processing of both, GPS and GLONASS observations in PPP mode.</p>"));
580 _pppGalileoCheckBox->setWhatsThis(tr("<p>By default BNC does not use Galileo observations in PPP mode.</p><p>Tick 'Use Galileo' for a combined processing of both, GPS and Galileo observations in PPP mode.</p>"));
581 _pppPlotCoordinates->setWhatsThis(tr("<p>BNC will plot PPP results in the 'PPP Plot' tab as North (red), East (green) and Up (blue) displacements when this option is selected. Values will be either referred to an XYZ reference coordinate (if specified) or referred to the first estimated coordinate. The sliding PPP time series window will cover the period of the latest 5 minutes.</p><p>Note that a PPP time series makes only sense for a stationary operated receiver."));
582 _pppNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where PPP results are saved as NMEA messages.</p>"));
583 _pppNMEAPortLineEdit->setWhatsThis(tr("<p>Specify an IP port number to output PPP results as NMEA messages through an IP port.</p>"));
584 _pppSigCLineEdit->setWhatsThis(tr("<p>Enter a sigma for your code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of code observations to a PPP solution based on a combination of code and phase data. 5.0 (default) is likely to be an appropriate choice.</p>"));
585 _pppQuickStartLineEdit->setWhatsThis(tr("<p>Enter the lenght of a startup period in seconds for which you want to fix the PPP solution to a known XYZ coordinate as introduced above and adjust a sigma 'XYZ Ini' according to the coordinate's precision. Fixing the coordinate is done in BNC through setting the 'Sigma XYZ Noise' you define below temporarily to zero.</p><p>This so-called Quick-Start option allows the PPP solution to rapidly converge. It requires that the antenna remains unmoved on the know position throughout the startup period.</p><p>A value of 120 is likely to be an appropriate choice for 'Quick-Start'. Default is an empty option field, meaning that you don't want BNC to operate in Quick-Start mode.</p>"));
586 _pppMaxSolGapLineEdit->setWhatsThis(tr("<p>Specify a 'Maximum Solution Gap' in seconds. Should the time span between two consecutive solutions exceed this limit, the algorithm returns into the Quick-Start mode and fixes the introduced reference coordinate for the specified Quick-Start period. A value of '120' seconds could be an appropriate choice.</p><p>This option makes only sense for a stationary operated receiver where solution convergence can be enforced because a good approximation for the rover position is known. Default is an empty option field, meaning that you don't want BNC to return into the Quick-Start mode after failures caused i.e. by longer lasting outages.</p>"));
587 _pppSigPLineEdit->setWhatsThis(tr("<p>Enter a sigma for your phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of phase observations to a PPP solutions based on a combination of code and phase data. 0.02 (default) is likely to be an appropriate choice.</p>"));
588 _pppAverageLineEdit->setWhatsThis(tr("<p>Enter the length of a sliding time window in minutes. BNC will continuously output moving average positions computed from those individual positions obtained most recently throughout this period.</p><p>An empty option field (default) means that you don't want BNC to output moving average positions.</p>"));
589 _pppSigCrd0->setWhatsThis(tr("<p>Enter a sigma in meters for the initial XYZ coordinate componentes. A value of 100.0 (default) may be an appropriate choice. However, this value may be significantly smaller (i.e. 0.01) when starting for example from a station with known XZY position in Quick-Start mode."));
590 _pppSigCrdP->setWhatsThis(tr("<p>Enter a sigma in meters for the white noise of estimated XYZ coordinate components. A value of 100.0 (default) may be appropriate considering the potential movement of a rover position.</p>"));
591 _pppSigTrp0->setWhatsThis(tr("<p>Enter a sigma in meters for the a-priory model based tropospheric delay estimation. A value of 0.1 (default) may be an appropriate choice.</p>"));
592 _pppSigTrpP->setWhatsThis(tr("<p>Enter a sigma in meters per second to describe the expected variation of the tropospheric effect.</p><p>Supposing 1Hz observation data, a value of 1e-6 (default) would mean that the tropospheric effect may vary for 3600 * 1e-6 = 0.0036 meters per hour.</p>"));
593 _pppRefCrdXLineEdit->setWhatsThis(tr("<p>Enter reference coordinate X of the receiver's position.</p>"));
594 _pppRefCrdYLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Y of the receiver's position.</p>"));
595 _pppRefCrdZLineEdit->setWhatsThis(tr("<p>Enter reference coordinate Z of the receiver's position.</p>"));
596 _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."));
597 _pppSync->setWhatsThis(tr(
598 "<p> Zero value (or empty field, default) means that BNC processes each epoch of data "
599 "immediately after its arrival using satellite clock corrections available at "
600 "that time.</p><p> Non-zero value 'Sync Corr' (i.e. 5) means that the epochs of data "
601 "are buffered and the processing of each epoch is postponed till the satellite clock "
602 "corrections not older than 'Sync Corr' seconds are available.<p>"));
603 _pppAntexLineEdit->setWhatsThis(tr("<p>IGS provides a file containing absolute phase center corrections for GNSS satellite and receiver antennas in ANTEX format. Entering the full path to such an ANTEX file is required for correcting observations for antenna phase center offsets and variations. It allows you to specify the name of your receiver's antenna (as contained in the ANTEX file) to apply such corrections.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets and variations.</p>"));
604 _pppAntennaLineEdit->setWhatsThis(tr("<p>Specify the receiver's antenna name as defined in your ANTEX file. Observations will be corrected for the antenna phase center's offset which may result in a reduction of a few centimeters at max. Corrections for phase center variations are not yet applied by BNC. The specified name must consist of 20 characters. Add trailing blanks if the antenna name has less then 20 characters.</p><p>Default is an empty option field meaning that you don't want to correct observations for antenna phase center offsets.</p>"));
605 _pppApplySatAntCheckBox->setWhatsThis(tr("<p>This option is not yet working.</p><p>Satellite orbit and clock corrections refer to the satellite's antenna phase centers and hence observations are actually <u>not</u> to be corrected for satellite antenna phase center offsets. However, you may like to tick 'Apply Offsets' to force BNC to correct observations for satellite antenna phase center offsets.</p><p>Default is to <u>not</u> correct observations for satellite antenna phase center offsets."));
606 _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 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 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 sequence of rows in the 'Combination Table' is of importance because the orbit information in the final combination stream is just copied from the stream listed in the first row. Hence the first line in the 'Combination Table' defines a kind of 'Master AC'. The update rate of the combination product follows the 'Master AC's update rate.</p><p>The combination process requires Broadcast Ephemeris. Besides the orbit and clock corrections stream(s) BNC must therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p>"));
607 addCmbRowButton->setWhatsThis(tr("Hit 'Add Row' button to add another line to the mountpoints table."));
608 delCmbRowButton->setWhatsThis(tr("Hit 'Delete' button to delete the highlighted line from the mountpoints table."));
609
610 // Canvas with Editable Fields
611 // ---------------------------
612 _canvas = new QWidget;
613 setCentralWidget(_canvas);
614
615 _aogroup = new QTabWidget();
616 QWidget* pgroup = new QWidget();
617 QWidget* ggroup = new QWidget();
618 QWidget* sgroup = new QWidget();
619 QWidget* egroup = new QWidget();
620 QWidget* agroup = new QWidget();
621 QWidget* cgroup = new QWidget();
622 QWidget* ogroup = new QWidget();
623 QWidget* rgroup = new QWidget();
624 QWidget* sergroup = new QWidget();
625 QWidget* pppgroup = new QWidget();
626 QWidget* ppp2group = new QWidget();
627 QWidget* cmbgroup = new QWidget();
628 QWidget* uploadgroup = new QWidget();
629 QWidget* uploadEphgroup = new QWidget();
630 _aogroup->addTab(pgroup,tr("Proxy"));
631 _aogroup->addTab(ggroup,tr("General"));
632 _aogroup->addTab(ogroup,tr("RINEX Observations"));
633 _aogroup->addTab(egroup,tr("RINEX Ephemeris"));
634 _aogroup->addTab(cgroup,tr("Broadcast Corrections"));
635 _aogroup->addTab(sgroup,tr("Feed Engine"));
636 _aogroup->addTab(sergroup,tr("Serial Output"));
637 _aogroup->addTab(agroup,tr("Outages"));
638 _aogroup->addTab(rgroup,tr("Miscellaneous"));
639 _aogroup->addTab(pppgroup,tr("PPP (1)"));
640 _aogroup->addTab(ppp2group,tr("PPP (2)"));
641#ifdef USE_COMBINATION
642 _aogroup->addTab(cmbgroup,tr("Combination"));
643#endif
644 _aogroup->addTab(uploadgroup,tr("Upload (clk)"));
645 _aogroup->addTab(uploadEphgroup,tr("Upload (eph)"));
646
647 // Log Tab
648 // -------
649 _loggroup = new QTabWidget();
650 _loggroup->addTab(_log,tr("Log"));
651 _loggroup->addTab(_bncFigure,tr("Throughput"));
652 _loggroup->addTab(_bncFigureLate,tr("Latency"));
653 _loggroup->addTab(_bncFigurePPP,tr("PPP Plot"));
654
655 // Proxy Tab
656 // ---------
657 QGridLayout* pLayout = new QGridLayout;
658 pLayout->setColumnMinimumWidth(0,13*ww);
659 _proxyPortLineEdit->setMaximumWidth(9*ww);
660
661 pLayout->addWidget(new QLabel("Proxy host"), 0, 0);
662 pLayout->addWidget(_proxyHostLineEdit, 0, 1, 1,10);
663 pLayout->addWidget(new QLabel("Proxy port"), 1, 0);
664 pLayout->addWidget(_proxyPortLineEdit, 1, 1);
665 pLayout->addWidget(new QLabel("Settings for proxy in protected networks, leave boxes blank if none."),2, 0, 1, 50, Qt::AlignLeft);
666 pLayout->addWidget(new QLabel(" "),3,0);
667 pLayout->addWidget(new QLabel(" "),4,0);
668 pLayout->addWidget(new QLabel(" "),5,0);
669 pgroup->setLayout(pLayout);
670
671 // General Tab
672 // -----------
673 QGridLayout* gLayout = new QGridLayout;
674 gLayout->setColumnMinimumWidth(0,14*ww);
675 _onTheFlyComboBox->setMaximumWidth(9*ww);
676
677 gLayout->addWidget(new QLabel("Logfile (full path)"), 0, 0);
678 gLayout->addWidget(_logFileLineEdit, 0, 1, 1,30); // 1
679 gLayout->addWidget(new QLabel("Append files"), 1, 0);
680 gLayout->addWidget(_rnxAppendCheckBox, 1, 1);
681 gLayout->addWidget(new QLabel("Reread configuration"), 2, 0);
682 gLayout->addWidget(_onTheFlyComboBox, 2, 1);
683 gLayout->addWidget(new QLabel("Auto start"), 3, 0);
684 gLayout->addWidget(_autoStartCheckBox, 3, 1);
685 gLayout->addWidget(new QLabel("Raw output file (full path)"), 4, 0);
686 gLayout->addWidget(_rawOutFileLineEdit, 4, 1, 1,30);
687 gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, and auto-start."),5, 0, 1, 50, Qt::AlignLeft);
688 ggroup->setLayout(gLayout);
689
690 // RINEX Observations
691 // ------------------
692 QGridLayout* oLayout = new QGridLayout;
693 oLayout->setColumnMinimumWidth(0,14*ww);
694 _rnxIntrComboBox->setMaximumWidth(9*ww);
695 _rnxSamplSpinBox->setMaximumWidth(9*ww);
696
697 oLayout->addWidget(new QLabel("Directory"), 0, 0);
698 oLayout->addWidget(_rnxPathLineEdit, 0, 1,1,24);
699 oLayout->addWidget(new QLabel("Interval"), 1, 0);
700 oLayout->addWidget(_rnxIntrComboBox, 1, 1);
701 oLayout->addWidget(new QLabel(" Sampling"), 1, 2, Qt::AlignRight);
702 oLayout->addWidget(_rnxSamplSpinBox, 1, 3, Qt::AlignLeft);
703 oLayout->addWidget(new QLabel("Skeleton extension"), 2, 0);
704 oLayout->addWidget(_rnxSkelLineEdit, 2, 1,1,1, Qt::AlignLeft);
705 oLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
706 oLayout->addWidget(_rnxScrpLineEdit, 3, 1,1,24);
707 oLayout->addWidget(new QLabel("Version 3"), 4, 0);
708 oLayout->addWidget(_rnxV3CheckBox, 4, 1);
709 oLayout->addWidget(new QLabel("Saving RINEX observation files."),5,0,1,50, Qt::AlignLeft);
710 ogroup->setLayout(oLayout);
711
712 // RINEX Ephemeris
713 // ---------------
714 QGridLayout* eLayout = new QGridLayout;
715 eLayout->setColumnMinimumWidth(0,14*ww);
716 _ephIntrComboBox->setMaximumWidth(9*ww);
717 _outEphPortLineEdit->setMaximumWidth(9*ww);
718
719 eLayout->addWidget(new QLabel("Directory"), 0, 0);
720 eLayout->addWidget(_ephPathLineEdit, 0, 1, 1,30);
721 eLayout->addWidget(new QLabel("Interval"), 1, 0);
722 eLayout->addWidget(_ephIntrComboBox, 1, 1);
723 eLayout->addWidget(new QLabel("Port"), 2, 0);
724 eLayout->addWidget(_outEphPortLineEdit, 2, 1);
725 eLayout->addWidget(new QLabel("Version 3"), 3, 0);
726 eLayout->addWidget(_ephV3CheckBox, 3, 1);
727 eLayout->addWidget(new QLabel("Saving RINEX ephemeris files and ephemeris output through IP port."),4,0,1,50,Qt::AlignLeft);
728 eLayout->addWidget(new QLabel(" "),5,0);
729 egroup->setLayout(eLayout);
730
731
732 // Broadcast Corrections
733 // ---------------------
734 QGridLayout* cLayout = new QGridLayout;
735 cLayout->setColumnMinimumWidth(0,14*ww);
736 _corrIntrComboBox->setMaximumWidth(9*ww);
737 _corrPortLineEdit->setMaximumWidth(9*ww);
738 _corrTimeSpinBox->setMaximumWidth(9*ww);
739
740 cLayout->addWidget(new QLabel("Directory, ASCII"), 0, 0);
741 cLayout->addWidget(_corrPathLineEdit, 0, 1,1,20);
742 cLayout->addWidget(new QLabel("Interval"), 1, 0);
743 cLayout->addWidget(_corrIntrComboBox, 1, 1);
744 cLayout->addWidget(new QLabel("Port"), 2, 0);
745 cLayout->addWidget(_corrPortLineEdit, 2, 1);
746 cLayout->addWidget(new QLabel(" Wait for full epoch"), 2, 2, Qt::AlignRight);
747 cLayout->addWidget(_corrTimeSpinBox, 2, 3, Qt::AlignLeft);
748 cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port."),3,0,1,50);
749 cLayout->addWidget(new QLabel(" "),4,0);
750 cLayout->addWidget(new QLabel(" "),5,0);
751 cgroup->setLayout(cLayout);
752
753 // Feed Engine
754 // -----------
755 QGridLayout* sLayout = new QGridLayout;
756 sLayout->setColumnMinimumWidth(0,14*ww);
757 _outPortLineEdit->setMaximumWidth(9*ww);
758 _waitTimeSpinBox->setMaximumWidth(9*ww);
759 _binSamplSpinBox->setMaximumWidth(9*ww);
760 _outUPortLineEdit->setMaximumWidth(9*ww);
761
762 sLayout->addWidget(new QLabel("Port"), 0, 0);
763 sLayout->addWidget(_outPortLineEdit, 0, 1);
764 sLayout->addWidget(new QLabel("Wait for full epoch"), 0, 2, Qt::AlignRight);
765 sLayout->addWidget(_waitTimeSpinBox, 0, 3, Qt::AlignLeft);
766 sLayout->addWidget(new QLabel("Sampling"), 1, 0);
767 sLayout->addWidget(_binSamplSpinBox, 1, 1, Qt::AlignLeft);
768 sLayout->addWidget(new QLabel("File (full path)"), 2, 0);
769 sLayout->addWidget(_outFileLineEdit, 2, 1, 1, 20);
770 sLayout->addWidget(new QLabel("Port (unsynchronized)"), 3, 0);
771 sLayout->addWidget(_outUPortLineEdit, 3, 1);
772 sLayout->addWidget(new QLabel("Output decoded observations in a binary format to feed a real-time GNSS network engine."),4,0,1,50);
773 sLayout->addWidget(new QLabel(" "),5,0);
774 sgroup->setLayout(sLayout);
775
776 // Serial Output
777 // -------------
778 QGridLayout* serLayout = new QGridLayout;
779 serLayout->setColumnMinimumWidth(0,14*ww);
780 _serialBaudRateComboBox->setMaximumWidth(9*ww);
781 _serialFlowControlComboBox->setMaximumWidth(11*ww);
782 _serialDataBitsComboBox->setMaximumWidth(5*ww);
783 _serialParityComboBox->setMaximumWidth(9*ww);
784 _serialStopBitsComboBox->setMaximumWidth(5*ww);
785 _serialAutoNMEAComboBox->setMaximumWidth(9*ww);
786 _serialHeightNMEALineEdit->setMaximumWidth(8*ww);
787
788 serLayout->addWidget(new QLabel("Mountpoint"), 0,0, Qt::AlignLeft);
789 serLayout->addWidget(_serialMountPointLineEdit, 0,1,1,2);
790 serLayout->addWidget(new QLabel("Port name"), 1,0, Qt::AlignLeft);
791 serLayout->addWidget(_serialPortNameLineEdit, 1,1,1,2);
792 serLayout->addWidget(new QLabel("Baud rate"), 2,0, Qt::AlignLeft);
793 serLayout->addWidget(_serialBaudRateComboBox, 2,1);
794 serLayout->addWidget(new QLabel("Flow control"), 2,2, Qt::AlignRight);
795 serLayout->addWidget(_serialFlowControlComboBox, 2,3);
796 serLayout->addWidget(new QLabel("Data bits"), 3,0, Qt::AlignLeft);
797 serLayout->addWidget(_serialDataBitsComboBox, 3,1);
798 serLayout->addWidget(new QLabel("Parity"), 3,2, Qt::AlignRight);
799 serLayout->addWidget(_serialParityComboBox, 3,3);
800 serLayout->addWidget(new QLabel(" Stop bits"), 3,4, Qt::AlignRight);
801 serLayout->addWidget(_serialStopBitsComboBox, 3,5);
802 serLayout->addWidget(new QLabel("NMEA"), 4,0);
803 serLayout->addWidget(_serialAutoNMEAComboBox, 4,1);
804 serLayout->addWidget(new QLabel(" File (full path)"), 4,2, Qt::AlignRight);
805 serLayout->addWidget(_serialFileNMEALineEdit, 4,3,1,15);
806 serLayout->addWidget(new QLabel("Height"), 4,20, Qt::AlignRight);
807 serLayout->addWidget(_serialHeightNMEALineEdit, 4,21,1,11);
808 serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver."),5,0,1,30);
809
810 sergroup->setLayout(serLayout);
811
812 // Outages
813 // -------
814 QGridLayout* aLayout = new QGridLayout;
815 aLayout->setColumnMinimumWidth(0,14*ww);
816 _obsRateComboBox->setMaximumWidth(9*ww);
817 _adviseFailSpinBox->setMaximumWidth(9*ww);
818 _adviseRecoSpinBox->setMaximumWidth(9*ww);
819
820 aLayout->addWidget(new QLabel("Observation rate"), 0, 0);
821 aLayout->addWidget(_obsRateComboBox, 0, 1);
822 aLayout->addWidget(new QLabel("Failure threshold"), 1, 0);
823 aLayout->addWidget(_adviseFailSpinBox, 1, 1);
824 aLayout->addWidget(new QLabel("Recovery threshold"), 2, 0);
825 aLayout->addWidget(_adviseRecoSpinBox, 2, 1);
826 aLayout->addWidget(new QLabel("Script (full path)"), 3, 0);
827 aLayout->addWidget(_adviseScriptLineEdit, 3, 1,1,30);
828 aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes."),4,0,1,50,Qt::AlignLeft);
829 aLayout->addWidget(new QLabel(" "), 5, 0);
830 agroup->setLayout(aLayout);
831
832 // Miscellaneous
833 // -------------
834 QGridLayout* rLayout = new QGridLayout;
835 rLayout->setColumnMinimumWidth(0,14*ww);
836 _perfIntrComboBox->setMaximumWidth(9*ww);
837
838 rLayout->addWidget(new QLabel("Mountpoint"), 0, 0);
839 rLayout->addWidget(_miscMountLineEdit, 0, 1, 1,7);
840 rLayout->addWidget(new QLabel("Log latency"), 1, 0);
841 rLayout->addWidget(_perfIntrComboBox, 1, 1);
842 rLayout->addWidget(new QLabel("Scan RTCM"), 2, 0);
843 rLayout->addWidget(_scanRTCMCheckBox, 2, 1);
844 rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for numbers of message types and antenna information."),3, 0,1,30);
845 rLayout->addWidget(new QLabel(" "), 4, 0);
846 rLayout->addWidget(new QLabel(" "), 5, 0);
847 rgroup->setLayout(rLayout);
848
849 // PPP Client
850 // ----------
851 QGridLayout* pppLayout = new QGridLayout;
852 _pppSigCLineEdit->setMaximumWidth(6*ww);
853 _pppSigPLineEdit->setMaximumWidth(6*ww);
854 _pppSigCrd0->setMaximumWidth(6*ww);
855 _pppSigCrdP->setMaximumWidth(6*ww);
856 _pppSigTrp0->setMaximumWidth(6*ww);
857 _pppSigTrpP->setMaximumWidth(6*ww);
858 _pppAverageLineEdit->setMaximumWidth(6*ww);
859 _pppQuickStartLineEdit->setMaximumWidth(6*ww);
860 _pppMaxSolGapLineEdit->setMaximumWidth(6*ww);
861 _pppRefCrdXLineEdit->setMaximumWidth(10*ww);
862 _pppRefCrdYLineEdit->setMaximumWidth(10*ww);
863 _pppRefCrdZLineEdit->setMaximumWidth(10*ww);
864 _pppSync->setMaximumWidth(6*ww);
865 _pppSPPComboBox->setMaximumWidth(8*ww);
866 _pppNMEAPortLineEdit->setMaximumWidth(6*ww);
867 pppLayout->addWidget(new QLabel("Obs Mountpoint"), 0, 0);
868 pppLayout->addWidget(_pppMountLineEdit, 0, 1);
869 pppLayout->addWidget(_pppSPPComboBox, 0, 2);
870 pppLayout->addWidget(new QLabel(" X "), 0, 3, Qt::AlignRight);
871 pppLayout->addWidget(_pppRefCrdXLineEdit, 0, 4);
872 pppLayout->addWidget(new QLabel(" Y "), 0, 5, Qt::AlignRight);
873 pppLayout->addWidget(_pppRefCrdYLineEdit, 0, 6);
874 pppLayout->addWidget(new QLabel(" Z "), 0, 7, Qt::AlignRight);
875 pppLayout->addWidget(_pppRefCrdZLineEdit, 0, 8);
876 pppLayout->addWidget(new QLabel("Corr Mountpoint "), 1, 0);
877 pppLayout->addWidget(_pppCorrMountLineEdit, 1, 1);
878 pppLayout->addWidget(new QLabel("Options"), 2, 0, 1, 5);
879 pppLayout->addWidget(_pppUsePhaseCheckBox, 2, 1, Qt::AlignRight);
880 pppLayout->addWidget(new QLabel("Use phase obs"), 2, 2);
881 pppLayout->addWidget(_pppEstTropoCheckBox, 2, 3, Qt::AlignRight);
882 pppLayout->addWidget(new QLabel("Estimate tropo"), 2, 4);
883 pppLayout->addWidget(_pppGLONASSCheckBox, 2, 5, Qt::AlignRight);
884 pppLayout->addWidget(new QLabel("Use GLONASS"), 2, 6);
885 pppLayout->addWidget(_pppGalileoCheckBox, 2, 7, Qt::AlignRight);
886 pppLayout->addWidget(new QLabel("Use Galileo "), 2, 8);
887 pppLayout->addWidget(new QLabel("Options cont'd"), 3, 0);
888 pppLayout->addWidget(_pppSigCrd0, 3, 1, Qt::AlignRight);
889 pppLayout->addWidget(new QLabel("Sigma XYZ Init "), 3, 2);
890 pppLayout->addWidget(_pppSigCrdP, 3, 3, Qt::AlignRight);
891 pppLayout->addWidget(new QLabel("Sigma XYZ Noise "), 3, 4);
892 pppLayout->addWidget(_pppQuickStartLineEdit, 3, 5, Qt::AlignRight);
893 pppLayout->addWidget(new QLabel("Quick-Start (sec) "), 3, 6);
894 pppLayout->addWidget(_pppMaxSolGapLineEdit, 3, 7, Qt::AlignRight);
895 pppLayout->addWidget(new QLabel("Max Sol. Gap (sec)"), 3, 8);
896 pppLayout->addWidget(new QLabel("Output"), 4, 0);
897 pppLayout->addWidget(_pppNMEALineEdit, 4, 1, 1, 3);
898 pppLayout->addWidget(new QLabel("NMEA File"), 4, 4);
899 pppLayout->addWidget(_pppNMEAPortLineEdit, 4, 5, Qt::AlignRight);
900 pppLayout->addWidget(new QLabel("NMEA Port"), 4, 6);
901 pppLayout->addWidget(_pppPlotCoordinates, 4, 7, Qt::AlignRight);
902 pppLayout->addWidget(new QLabel("PPP Plot"), 4, 8);
903
904
905 pppLayout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP)."),5, 0,1,5);
906
907 pppgroup->setLayout(pppLayout);
908
909 // PPP Client (second panel)
910 // -------------------------
911 QGridLayout* ppp2Layout = new QGridLayout;
912
913 ppp2Layout->addWidget(new QLabel("Antennas"), 0, 0);
914 ppp2Layout->addWidget(_pppAntexLineEdit, 0, 1, 1, 3);
915 ppp2Layout->addWidget(new QLabel("ANTEX File "), 0, 4);
916 ppp2Layout->addWidget(_pppAntennaLineEdit, 0, 5, 1, 3);
917 ppp2Layout->addWidget(new QLabel("Rec. Ant. Name"), 0, 8);
918 ppp2Layout->addWidget(new QLabel("Satellite Antenna "), 1, 0);
919 ppp2Layout->addWidget(_pppApplySatAntCheckBox, 1, 1, Qt::AlignRight);
920 ppp2Layout->addWidget(new QLabel("Apply Offsets"), 1, 2, Qt::AlignLeft);
921 ppp2Layout->addWidget(new QLabel("Sigmas"), 2, 0);
922 ppp2Layout->addWidget(_pppSigCLineEdit, 2, 1, Qt::AlignRight);
923 ppp2Layout->addWidget(new QLabel("Code"), 2, 2);
924 ppp2Layout->addWidget(_pppSigPLineEdit, 2, 3);
925 ppp2Layout->addWidget(new QLabel("Phase"), 2, 4);
926 ppp2Layout->addWidget(_pppSigTrp0, 2, 5, Qt::AlignRight);
927 ppp2Layout->addWidget(new QLabel("Tropo Init "), 2, 6);
928 ppp2Layout->addWidget(_pppSigTrpP, 2, 7);
929 ppp2Layout->addWidget(new QLabel("Tropo White Noise"), 2, 8);
930 ppp2Layout->addWidget(new QLabel("Options cont'd"), 3, 0);
931 ppp2Layout->addWidget(_pppSync, 3, 1);
932 ppp2Layout->addWidget(new QLabel("Sync Corr (sec) "), 3, 2);
933 ppp2Layout->addWidget(_pppAverageLineEdit, 3, 3, Qt::AlignRight);
934 ppp2Layout->addWidget(new QLabel("Averaging (min)") , 3, 4);
935 ppp2Layout->addWidget(new QLabel("Coordinates from Precise Point Positioning (PPP), continued."), 4, 0, 1, 6);
936 ppp2Layout->addWidget(new QLabel(" "), 5, 0);
937
938 ppp2group->setLayout(ppp2Layout);
939
940 // Combination
941 // -----------
942 QGridLayout* cmbLayout = new QGridLayout;
943
944 populateCmbTable();
945 cmbLayout->addWidget(_cmbTable,0,0,6,3);
946
947 cmbLayout->addWidget(addCmbRowButton,1,3);
948 connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
949 cmbLayout->addWidget(delCmbRowButton,2,3);
950 connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
951
952 cmbLayout->addWidget(new QLabel(" Combine Broadcast Ephemeris corrections streams."),5,3,1,3);
953
954 cmbgroup->setLayout(cmbLayout);
955
956 // Upload Layout (Clocks)
957 // ----------------------
958 QGridLayout* uploadHlpLayout = new QGridLayout();
959
960 uploadHlpLayout->addWidget(new QLabel("Upload RTNet or Combination Results"),0,0);
961
962 uploadHlpLayout->addWidget(addUploadRowButton,0,1);
963 connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
964
965 uploadHlpLayout->addWidget(delUploadRowButton,0,2);
966 connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
967
968 uploadHlpLayout->addWidget(setUploadTrafoButton,1,1);
969 connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
970
971 uploadHlpLayout->addWidget(new QLabel("Interval"),0,3, Qt::AlignRight);
972 uploadHlpLayout->addWidget(_uploadIntrComboBox,0,4);
973
974 uploadHlpLayout->addWidget(new QLabel("Sampling"),1,3, Qt::AlignRight);
975 uploadHlpLayout->addWidget(_uploadSamplSpinBox,1,4);
976
977
978 QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
979 populateUploadTable();
980 uploadLayout->addWidget(_uploadTable);
981 uploadLayout->addLayout(uploadHlpLayout);
982
983 uploadgroup->setLayout(uploadLayout);
984
985 // Upload Layout (Ephemeris)
986 // -------------------------
987 QGridLayout* uploadLayoutEph = new QGridLayout;
988
989 uploadLayoutEph->setColumnMinimumWidth(0, 9*ww);
990 _uploadEphPortLineEdit->setMaximumWidth(9*ww);
991 _uploadEphPasswordLineEdit->setMaximumWidth(9*ww);
992 _uploadEphMountpointLineEdit->setMaximumWidth(12*ww);
993
994 uploadLayoutEph->addWidget(new QLabel("Host"), 0, 0);
995 uploadLayoutEph->addWidget(_uploadEphHostLineEdit, 0, 1, 1, 3);
996 uploadLayoutEph->addWidget(new QLabel(" Port"), 0, 4, Qt::AlignRight);
997 uploadLayoutEph->addWidget(_uploadEphPortLineEdit, 0, 5, 1, 1);
998 uploadLayoutEph->addWidget(new QLabel("Mountpoint "), 1, 0);
999 uploadLayoutEph->addWidget(_uploadEphMountpointLineEdit, 1, 1);
1000 uploadLayoutEph->addWidget(new QLabel(" Password"), 1, 2, Qt::AlignRight);
1001 uploadLayoutEph->addWidget(_uploadEphPasswordLineEdit, 1, 3);
1002 uploadLayoutEph->addWidget(new QLabel("Sampling"), 2, 0);
1003 uploadLayoutEph->addWidget(_uploadEphSampleSpinBox, 2, 1);
1004 uploadLayoutEph->addWidget(new QLabel("Upload concatenated RTCMv3 Broadcast Ephemeris to caster."), 3, 0, 1, 5);
1005 uploadLayoutEph->addWidget(_uploadEphBytesCounter, 3, 5);
1006
1007 uploadEphgroup->setLayout(uploadLayoutEph);
1008
1009 connect(_uploadEphHostLineEdit, SIGNAL(textChanged(const QString &)),
1010 this, SLOT(slotBncTextChanged()));
1011
1012 // Main Layout
1013 // -----------
1014 QGridLayout* mLayout = new QGridLayout;
1015 _aogroup->setCurrentIndex(settings.value("startTab").toInt());
1016 mLayout->addWidget(_aogroup, 0,0);
1017 mLayout->addWidget(_mountPointsTable, 1,0);
1018 _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
1019 mLayout->addWidget(_loggroup, 2,0);
1020
1021 _canvas->setLayout(mLayout);
1022
1023 // Enable/Disable all Widgets
1024 // --------------------------
1025 slotBncTextChanged();
1026
1027 // Auto start
1028 // ----------
1029 if ( Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
1030 slotGetData();
1031 }
1032}
1033
1034// Destructor
1035////////////////////////////////////////////////////////////////////////////
1036bncWindow::~bncWindow() {
1037 delete _caster;
1038}
1039
1040//
1041////////////////////////////////////////////////////////////////////////////
1042void bncWindow::populateMountPointsTable() {
1043
1044 for (int iRow = _mountPointsTable->rowCount()-1; iRow >=0; iRow--) {
1045 _mountPointsTable->removeRow(iRow);
1046 }
1047
1048 bncSettings settings;
1049
1050 QListIterator<QString> it(settings.value("mountPoints").toStringList());
1051 if (!it.hasNext()) {
1052 _actGetData->setEnabled(false);
1053 }
1054 int iRow = 0;
1055 while (it.hasNext()) {
1056 QStringList hlp = it.next().split(" ");
1057 if (hlp.size() < 5) continue;
1058 _mountPointsTable->insertRow(iRow);
1059
1060 QUrl url(hlp[0]);
1061
1062 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1063 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1064 QString nmea(hlp[4]);
1065 if (hlp[5] == "S") {
1066 fullPath = hlp[0].replace(0,2,"");
1067 }
1068 QString ntripVersion = "1";
1069 if (hlp.size() >= 6) {
1070 ntripVersion = (hlp[5]);
1071 }
1072
1073 QTableWidgetItem* it;
1074 it = new QTableWidgetItem(url.userInfo());
1075 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1076 _mountPointsTable->setItem(iRow, 0, it);
1077
1078 it = new QTableWidgetItem(fullPath);
1079 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1080 _mountPointsTable->setItem(iRow, 1, it);
1081
1082 it = new QTableWidgetItem(format);
1083 _mountPointsTable->setItem(iRow, 2, it);
1084
1085 if (nmea == "yes") {
1086 it = new QTableWidgetItem(latitude);
1087 _mountPointsTable->setItem(iRow, 3, it);
1088 it = new QTableWidgetItem(longitude);
1089 _mountPointsTable->setItem(iRow, 4, it);
1090 } else {
1091 it = new QTableWidgetItem(latitude);
1092 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1093 _mountPointsTable->setItem(iRow, 3, it);
1094 it = new QTableWidgetItem(longitude);
1095 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1096 _mountPointsTable->setItem(iRow, 4, it);
1097 }
1098
1099 it = new QTableWidgetItem(nmea);
1100 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1101 _mountPointsTable->setItem(iRow, 5, it);
1102
1103 it = new QTableWidgetItem(ntripVersion);
1104 //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1105 _mountPointsTable->setItem(iRow, 6, it);
1106
1107 bncTableItem* bncIt = new bncTableItem();
1108 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
1109 _mountPointsTable->setItem(iRow, 7, bncIt);
1110
1111 iRow++;
1112 }
1113
1114 _mountPointsTable->sortItems(1);
1115}
1116
1117// Retrieve Table
1118////////////////////////////////////////////////////////////////////////////
1119void bncWindow::slotAddMountPoints() {
1120
1121 bncSettings settings;
1122 QString proxyHost = settings.value("proxyHost").toString();
1123 int proxyPort = settings.value("proxyPort").toInt();
1124 if (proxyHost != _proxyHostLineEdit->text() ||
1125 proxyPort != _proxyPortLineEdit->text().toInt()) {
1126 int iRet = QMessageBox::question(this, "Question", "Proxy options "
1127 "changed. Use the new ones?",
1128 QMessageBox::Yes, QMessageBox::No,
1129 QMessageBox::NoButton);
1130 if (iRet == QMessageBox::Yes) {
1131 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1132 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1133 settings.sync();
1134 }
1135 }
1136
1137 QMessageBox msgBox;
1138 msgBox.setIcon(QMessageBox::Question);
1139 msgBox.setWindowTitle("Add Stream");
1140 msgBox.setText("Add stream(s) coming from:");
1141
1142 QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
1143 QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
1144 QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
1145 QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
1146 QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
1147
1148 msgBox.exec();
1149
1150 if (msgBox.clickedButton() == buttonNtrip) {
1151 bncTableDlg* dlg = new bncTableDlg(this);
1152 dlg->move(this->pos().x()+50, this->pos().y()+50);
1153 connect(dlg, SIGNAL(newMountPoints(QStringList*)),
1154 this, SLOT(slotNewMountPoints(QStringList*)));
1155 dlg->exec();
1156 delete dlg;
1157 } else if (msgBox.clickedButton() == buttonIP) {
1158 bncIpPort* ipp = new bncIpPort(this);
1159 connect(ipp, SIGNAL(newMountPoints(QStringList*)),
1160 this, SLOT(slotNewMountPoints(QStringList*)));
1161 ipp->exec();
1162 delete ipp;
1163 } else if (msgBox.clickedButton() == buttonUDP) {
1164 bncUdpPort* udp = new bncUdpPort(this);
1165 connect(udp, SIGNAL(newMountPoints(QStringList*)),
1166 this, SLOT(slotNewMountPoints(QStringList*)));
1167 udp->exec();
1168 delete udp;
1169 } else if (msgBox.clickedButton() == buttonSerial) {
1170 bncSerialPort* sep = new bncSerialPort(this);
1171 connect(sep, SIGNAL(newMountPoints(QStringList*)),
1172 this, SLOT(slotNewMountPoints(QStringList*)));
1173 sep->exec();
1174 delete sep;
1175 } else if (msgBox.clickedButton() == buttonCancel) {
1176 // Cancel
1177 }
1178}
1179
1180// Delete Selected Mount Points
1181////////////////////////////////////////////////////////////////////////////
1182void bncWindow::slotDeleteMountPoints() {
1183
1184 int nRows = _mountPointsTable->rowCount();
1185 bool flg[nRows];
1186 for (int iRow = 0; iRow < nRows; iRow++) {
1187 if (_mountPointsTable->isItemSelected(_mountPointsTable->item(iRow,1))) {
1188 flg[iRow] = true;
1189 }
1190 else {
1191 flg[iRow] = false;
1192 }
1193 }
1194 for (int iRow = nRows-1; iRow >= 0; iRow--) {
1195 if (flg[iRow]) {
1196 _mountPointsTable->removeRow(iRow);
1197 }
1198 }
1199 _actDeleteMountPoints->setEnabled(false);
1200
1201 if (_mountPointsTable->rowCount() == 0) {
1202 _actGetData->setEnabled(false);
1203 }
1204}
1205
1206// New Mount Points Selected
1207////////////////////////////////////////////////////////////////////////////
1208void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
1209 int iRow = 0;
1210 QListIterator<QString> it(*mountPoints);
1211 while (it.hasNext()) {
1212 QStringList hlp = it.next().split(" ");
1213 QUrl url(hlp[0]);
1214 QString fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
1215 QString format(hlp[1]); QString latitude(hlp[2]); QString longitude(hlp[3]);
1216 QString nmea(hlp[4]);
1217 if (hlp[5] == "S") {
1218 fullPath = hlp[0].replace(0,2,"");
1219 }
1220 QString ntripVersion = "1";
1221 if (hlp.size() >= 6) {
1222 ntripVersion = (hlp[5]);
1223 }
1224
1225 _mountPointsTable->insertRow(iRow);
1226
1227 QTableWidgetItem* it;
1228 it = new QTableWidgetItem(url.userInfo());
1229 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1230 _mountPointsTable->setItem(iRow, 0, it);
1231
1232 it = new QTableWidgetItem(fullPath);
1233 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1234 _mountPointsTable->setItem(iRow, 1, it);
1235
1236 it = new QTableWidgetItem(format);
1237 _mountPointsTable->setItem(iRow, 2, it);
1238
1239 if (nmea == "yes") {
1240 it = new QTableWidgetItem(latitude);
1241 _mountPointsTable->setItem(iRow, 3, it);
1242 it = new QTableWidgetItem(longitude);
1243 _mountPointsTable->setItem(iRow, 4, it);
1244 } else {
1245 it = new QTableWidgetItem(latitude);
1246 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1247 _mountPointsTable->setItem(iRow, 3, it);
1248 it = new QTableWidgetItem(longitude);
1249 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1250 _mountPointsTable->setItem(iRow, 4, it);
1251 }
1252
1253 it = new QTableWidgetItem(nmea);
1254 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1255 _mountPointsTable->setItem(iRow, 5, it);
1256
1257 it = new QTableWidgetItem(ntripVersion);
1258 it->setFlags(it->flags() & ~Qt::ItemIsEditable);
1259 _mountPointsTable->setItem(iRow, 6, it);
1260
1261 bncTableItem* bncIt = new bncTableItem();
1262 _mountPointsTable->setItem(iRow, 7, bncIt);
1263
1264 iRow++;
1265 }
1266 _mountPointsTable->hideColumn(0);
1267 _mountPointsTable->sortItems(1);
1268 if (mountPoints->count() > 0 && !_actStop->isEnabled()) {
1269 _actGetData->setEnabled(true);
1270 }
1271 delete mountPoints;
1272}
1273
1274// Save Options
1275////////////////////////////////////////////////////////////////////////////
1276void bncWindow::slotSaveOptions() {
1277
1278 QStringList mountPoints;
1279 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1280
1281 if (_mountPointsTable->item(iRow, 6)->text() != "S") {
1282 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1283 "@" + _mountPointsTable->item(iRow, 1)->text() );
1284
1285 mountPoints.append(url.toString() + " " +
1286 _mountPointsTable->item(iRow, 2)->text()
1287 + " " + _mountPointsTable->item(iRow, 3)->text()
1288 + " " + _mountPointsTable->item(iRow, 4)->text()
1289 + " " + _mountPointsTable->item(iRow, 5)->text()
1290 + " " + _mountPointsTable->item(iRow, 6)->text());
1291 } else {
1292 mountPoints.append(
1293 "//" + _mountPointsTable->item(iRow, 1)->text()
1294 + " " + _mountPointsTable->item(iRow, 2)->text()
1295 + " " + _mountPointsTable->item(iRow, 3)->text()
1296 + " " + _mountPointsTable->item(iRow, 4)->text()
1297 + " " + _mountPointsTable->item(iRow, 5)->text()
1298 + " " + _mountPointsTable->item(iRow, 6)->text());
1299 }
1300 }
1301
1302 QStringList combineStreams;
1303 for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
1304 QString hlp;
1305 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
1306 if (_cmbTable->item(iRow, iCol)) {
1307 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
1308 }
1309 }
1310 if (!hlp.isEmpty()) {
1311 combineStreams << hlp;
1312 }
1313 }
1314
1315 QStringList uploadMountpointsOut;
1316 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
1317 QString hlp;
1318 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
1319 if (_uploadTable->cellWidget(iRow, iCol) &&
1320 (iCol == 3 || iCol == 4 || iCol == 5)) {
1321 if (iCol == 3) {
1322 QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
1323 hlp += passwd->text() + ",";
1324 }
1325 else if (iCol == 4) {
1326 QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
1327 hlp += system->currentText() + ",";
1328 }
1329 else if (iCol == 5) {
1330 QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
1331 QString state; state.setNum(com->checkState());
1332 hlp += state + ",";
1333 }
1334 }
1335 else if (_uploadTable->item(iRow, iCol)) {
1336 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
1337 }
1338 }
1339 if (!hlp.isEmpty()) {
1340 uploadMountpointsOut << hlp;
1341 }
1342 }
1343
1344 bncSettings settings;
1345
1346 settings.setValue("adviseFail", _adviseFailSpinBox->value());
1347 settings.setValue("adviseReco", _adviseRecoSpinBox->value());
1348 settings.setValue("adviseScript",_adviseScriptLineEdit->text());
1349 settings.setValue("autoStart", _autoStartCheckBox->checkState());
1350 settings.setValue("binSampl", _binSamplSpinBox->value());
1351 settings.setValue("corrIntr", _corrIntrComboBox->currentText());
1352 settings.setValue("corrPath", _corrPathLineEdit->text());
1353 settings.setValue("corrPort", _corrPortLineEdit->text());
1354 settings.setValue("corrTime", _corrTimeSpinBox->value());
1355 settings.setValue("ephIntr", _ephIntrComboBox->currentText());
1356 settings.setValue("ephPath", _ephPathLineEdit->text());
1357 settings.setValue("ephV3", _ephV3CheckBox->checkState());
1358 settings.setValue("logFile", _logFileLineEdit->text());
1359 settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
1360 settings.setValue("miscMount", _miscMountLineEdit->text());
1361 settings.setValue("pppMount", _pppMountLineEdit->text());
1362 settings.setValue("pppCorrMount",_pppCorrMountLineEdit->text());
1363 settings.setValue("pppSPP", _pppSPPComboBox->currentText());
1364 settings.setValue("nmeaFile", _pppNMEALineEdit->text());
1365 settings.setValue("nmeaPort", _pppNMEAPortLineEdit->text());
1366 settings.setValue("pppSigmaCode",_pppSigCLineEdit->text());
1367 settings.setValue("pppSigmaPhase",_pppSigPLineEdit->text());
1368 settings.setValue("pppSigCrd0",_pppSigCrd0->text());
1369 settings.setValue("pppSigCrdP",_pppSigCrdP->text());
1370 settings.setValue("pppSigTrp0",_pppSigTrp0->text());
1371 settings.setValue("pppSigTrpP",_pppSigTrpP->text());
1372 settings.setValue("pppAverage", _pppAverageLineEdit->text());
1373 settings.setValue("pppQuickStart", _pppQuickStartLineEdit->text());
1374 settings.setValue("pppMaxSolGap", _pppMaxSolGapLineEdit->text());
1375 settings.setValue("pppRefCrdX", _pppRefCrdXLineEdit->text());
1376 settings.setValue("pppRefCrdY", _pppRefCrdYLineEdit->text());
1377 settings.setValue("pppRefCrdZ", _pppRefCrdZLineEdit->text());
1378 settings.setValue("pppSync", _pppSync->text());
1379 settings.setValue("pppUsePhase", _pppUsePhaseCheckBox->checkState());
1380 settings.setValue("pppPlotCoordinates", _pppPlotCoordinates->checkState());
1381 settings.setValue("pppEstTropo", _pppEstTropoCheckBox->checkState());
1382 settings.setValue("pppGLONASS", _pppGLONASSCheckBox->checkState());
1383 settings.setValue("pppGalileo", _pppGalileoCheckBox->checkState());
1384 settings.setValue("pppAntenna", _pppAntennaLineEdit->text());
1385 settings.setValue("pppAntex", _pppAntexLineEdit->text());
1386 settings.setValue("pppApplySatAnt", _pppApplySatAntCheckBox->checkState());
1387 settings.setValue("mountPoints", mountPoints);
1388 settings.setValue("obsRate", _obsRateComboBox->currentText());
1389 settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
1390 settings.setValue("outEphPort", _outEphPortLineEdit->text());
1391 settings.setValue("outFile", _outFileLineEdit->text());
1392 settings.setValue("outPort", _outPortLineEdit->text());
1393 settings.setValue("outUPort", _outUPortLineEdit->text());
1394 settings.setValue("perfIntr", _perfIntrComboBox->currentText());
1395 settings.setValue("proxyHost", _proxyHostLineEdit->text());
1396 settings.setValue("proxyPort", _proxyPortLineEdit->text());
1397 settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
1398 settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
1399 settings.setValue("rnxPath", _rnxPathLineEdit->text());
1400 settings.setValue("rnxSampl", _rnxSamplSpinBox->value());
1401 settings.setValue("rnxScript", _rnxScrpLineEdit->text());
1402 settings.setValue("rnxSkel", _rnxSkelLineEdit->text());
1403 settings.setValue("rnxV3", _rnxV3CheckBox->checkState());
1404 settings.setValue("scanRTCM", _scanRTCMCheckBox->checkState());
1405 settings.setValue("serialFileNMEA",_serialFileNMEALineEdit->text());
1406 settings.setValue("serialHeightNMEA",_serialHeightNMEALineEdit->text());
1407 settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
1408 settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
1409 settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
1410 settings.setValue("serialMountPoint",_serialMountPointLineEdit->text());
1411 settings.setValue("serialParity", _serialParityComboBox->currentText());
1412 settings.setValue("serialPortName", _serialPortNameLineEdit->text());
1413 settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
1414 settings.setValue("serialFlowControl",_serialFlowControlComboBox->currentText());
1415 settings.setValue("startTab", _aogroup->currentIndex());
1416 settings.setValue("statusTab", _loggroup->currentIndex());
1417 settings.setValue("waitTime", _waitTimeSpinBox->value());
1418 if (!combineStreams.isEmpty()) {
1419 settings.setValue("combineStreams", combineStreams);
1420 }
1421 else {
1422 settings.setValue("combineStreams", "");
1423 }
1424
1425 if (!uploadMountpointsOut.isEmpty()) {
1426 settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
1427 }
1428 else {
1429 settings.setValue("uploadMountpointsOut", "");
1430 }
1431 settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
1432 settings.setValue("uploadSampl", _uploadSamplSpinBox->value());
1433
1434 settings.setValue("uploadEphHost", _uploadEphHostLineEdit->text());
1435 settings.setValue("uploadEphPort", _uploadEphPortLineEdit->text());
1436 settings.setValue("uploadEphPassword", _uploadEphPasswordLineEdit->text());
1437 settings.setValue("uploadEphMountpoint",_uploadEphMountpointLineEdit->text());
1438 settings.setValue("uploadEphSample", _uploadEphSampleSpinBox->value());
1439
1440 if (_caster) {
1441 _caster->slotReadMountPoints();
1442 }
1443 settings.sync();
1444}
1445
1446// All get slots terminated
1447////////////////////////////////////////////////////////////////////////////
1448void bncWindow::slotGetThreadsFinished() {
1449 ((bncApp*)qApp)->slotMessage("All Get Threads Terminated", true);
1450 delete _caster; _caster = 0;
1451 _actGetData->setEnabled(true);
1452 _actStop->setEnabled(false);
1453}
1454
1455// Retrieve Data
1456////////////////////////////////////////////////////////////////////////////
1457void bncWindow::slotGetData() {
1458 slotSaveOptions();
1459
1460 _bncFigurePPP->reset();
1461
1462 _actDeleteMountPoints->setEnabled(false);
1463 _actGetData->setEnabled(false);
1464 _actStop->setEnabled(true);
1465
1466 _caster = new bncCaster(_outFileLineEdit->text(),
1467 _outPortLineEdit->text().toInt());
1468
1469 ((bncApp*)qApp)->setPort(_outEphPortLineEdit->text().toInt());
1470 ((bncApp*)qApp)->setPortCorr(_corrPortLineEdit->text().toInt());
1471 ((bncApp*)qApp)->initCombination();
1472
1473 connect(_caster, SIGNAL(getThreadsFinished()),
1474 this, SLOT(slotGetThreadsFinished()));
1475
1476 connect (_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)),
1477 this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
1478
1479 ((bncApp*)qApp)->slotMessage("========== Start BNC v" BNCVERSION " =========", true);
1480
1481 bncSettings settings;
1482
1483 QDir rnxdir(settings.value("rnxPath").toString());
1484 if (!rnxdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations directory", true);
1485
1486 QString rnx_file = settings.value("rnxScript").toString();
1487 if ( !rnx_file.isEmpty() ) {
1488 QFile rnxfile(settings.value("rnxScript").toString());
1489 if (!rnxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Observations script", true);
1490 }
1491
1492 QDir ephdir(settings.value("ephPath").toString());
1493 if (!ephdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find RINEX Ephemeris directory", true);
1494
1495 QDir corrdir(settings.value("corrPath").toString());
1496 if (!corrdir.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Broadcast Corrections directory", true);
1497
1498 QString advise_file = settings.value("adviseScript").toString();
1499 if ( !advise_file.isEmpty() ) {
1500 QFile advisefile(settings.value("adviseScript").toString());
1501 if (!advisefile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find Outages script", true);
1502 }
1503
1504 QString ant_file = settings.value("pppAntex").toString();
1505 if ( !ant_file.isEmpty() ) {
1506 QFile anxfile(settings.value("pppAntex").toString());
1507 if (!anxfile.exists()) ((bncApp*)qApp)->slotMessage("Cannot find IGS ANTEX file", true);
1508 }
1509
1510 _caster->slotReadMountPoints();
1511}
1512
1513// Retrieve Data
1514////////////////////////////////////////////////////////////////////////////
1515void bncWindow::slotStop() {
1516 int iRet = QMessageBox::question(this, "Stop", "Stop retrieving data?",
1517 QMessageBox::Yes, QMessageBox::No,
1518 QMessageBox::NoButton);
1519 if (iRet == QMessageBox::Yes) {
1520 ((bncApp*)qApp)->stopCombination();
1521 delete _caster; _caster = 0;
1522 _actGetData->setEnabled(true);
1523 _actStop->setEnabled(false);
1524 }
1525}
1526
1527// Close Application gracefully
1528////////////////////////////////////////////////////////////////////////////
1529void bncWindow::closeEvent(QCloseEvent* event) {
1530
1531 int iRet = QMessageBox::question(this, "Close", "Save Options?",
1532 QMessageBox::Yes, QMessageBox::No,
1533 QMessageBox::Cancel);
1534
1535 if (iRet == QMessageBox::Cancel) {
1536 event->ignore();
1537 return;
1538 }
1539 else if (iRet == QMessageBox::Yes) {
1540 slotSaveOptions();
1541 }
1542
1543 QMainWindow::closeEvent(event);
1544}
1545
1546// User changed the selection of mountPoints
1547////////////////////////////////////////////////////////////////////////////
1548void bncWindow::slotSelectionChanged() {
1549 if (_mountPointsTable->selectedItems().isEmpty()) {
1550 _actDeleteMountPoints->setEnabled(false);
1551 }
1552 else {
1553 _actDeleteMountPoints->setEnabled(true);
1554 }
1555}
1556
1557// Display Program Messages
1558////////////////////////////////////////////////////////////////////////////
1559void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
1560
1561#ifdef DEBUG_RTCM2_2021
1562 const int maxBufferSize = 1000;
1563#else
1564 const int maxBufferSize = 10000;
1565#endif
1566
1567 if (! showOnScreen ) {
1568 return;
1569 }
1570
1571 QString txt = _log->toPlainText() + "\n" +
1572 QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg;
1573 _log->clear();
1574 _log->append(txt.right(maxBufferSize));
1575}
1576
1577// About Message
1578////////////////////////////////////////////////////////////////////////////
1579void bncWindow::slotAbout() {
1580 new bncAboutDlg(0);
1581}
1582
1583//Flowchart
1584////////////////////////////////////////////////////////////////////////////
1585void bncWindow::slotFlowchart() {
1586 new bncFlowchartDlg(0);
1587}
1588
1589// Help Window
1590////////////////////////////////////////////////////////////////////////////
1591void bncWindow::slotHelp() {
1592 QUrl url;
1593 url.setPath(":bnchelp.html");
1594 new bncHlpDlg(0, url);
1595}
1596
1597// Select Fonts
1598////////////////////////////////////////////////////////////////////////////
1599void bncWindow::slotFontSel() {
1600 bool ok;
1601 QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
1602 if (ok) {
1603 bncSettings settings;
1604 settings.setValue("font", newFont.toString());
1605 QApplication::setFont(newFont);
1606 int ww = QFontMetrics(newFont).width('w');
1607 setMinimumSize(60*ww, 80*ww);
1608 resize(60*ww, 80*ww);
1609 }
1610}
1611
1612// Whats This Help
1613void bncWindow::slotWhatsThis() {
1614 QWhatsThis::enterWhatsThisMode();
1615}
1616
1617//
1618////////////////////////////////////////////////////////////////////////////
1619void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
1620 _bncFigure->updateMountPoints();
1621 _bncFigureLate->updateMountPoints();
1622
1623 populateMountPointsTable();
1624 bncSettings settings;
1625 _binSamplSpinBox->setValue(settings.value("binSampl").toInt());
1626 _waitTimeSpinBox->setValue(settings.value("waitTime").toInt());
1627 QListIterator<bncGetThread*> iTh(threads);
1628 while (iTh.hasNext()) {
1629 bncGetThread* thread = iTh.next();
1630 for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
1631 QUrl url( "//" + _mountPointsTable->item(iRow, 0)->text() +
1632 "@" + _mountPointsTable->item(iRow, 1)->text() );
1633 if (url == thread->mountPoint() &&
1634 _mountPointsTable->item(iRow, 3)->text() == thread->latitude() &&
1635 _mountPointsTable->item(iRow, 4)->text() == thread->longitude() ) {
1636 ((bncTableItem*) _mountPointsTable->item(iRow, 7))->setGetThread(thread);
1637 disconnect(thread, SIGNAL(newBytes(QByteArray, double)),
1638 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1639 connect(thread, SIGNAL(newBytes(QByteArray, double)),
1640 _bncFigure, SLOT(slotNewData(QByteArray, double)));
1641 disconnect(thread, SIGNAL(newLatency(QByteArray, double)),
1642 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1643 connect(thread, SIGNAL(newLatency(QByteArray, double)),
1644 _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
1645 if ( Qt::CheckState(settings.value("pppPlotCoordinates").toInt()) == Qt::Checked) {
1646 disconnect(thread,
1647 SIGNAL(newPosition(bncTime, double, double, double)),
1648 _bncFigurePPP,
1649 SLOT(slotNewPosition(bncTime, double, double, double)));
1650 connect(thread, SIGNAL(newPosition(bncTime, double, double, double)),
1651 _bncFigurePPP,
1652 SLOT(slotNewPosition(bncTime, double, double, double)));
1653 }
1654 break;
1655 }
1656 }
1657 }
1658}
1659
1660//
1661////////////////////////////////////////////////////////////////////////////
1662void bncWindow::CreateMenu() {
1663 // Create Menus
1664 // ------------
1665 _menuFile = menuBar()->addMenu(tr("&File"));
1666 _menuFile->addAction(_actFontSel);
1667 _menuFile->addSeparator();
1668 _menuFile->addAction(_actSaveOpt);
1669 _menuFile->addSeparator();
1670 _menuFile->addAction(_actQuit);
1671
1672 _menuHlp = menuBar()->addMenu(tr("&Help"));
1673 _menuHlp->addAction(_actHelp);
1674 _menuHlp->addAction(_actFlowchart);
1675 _menuHlp->addAction(_actAbout);
1676}
1677
1678// Toolbar
1679////////////////////////////////////////////////////////////////////////////
1680void bncWindow::AddToolbar() {
1681 // Tool (Command) Bar
1682 // ------------------
1683 QToolBar* toolBar = new QToolBar;
1684 addToolBar(Qt::BottomToolBarArea, toolBar);
1685 toolBar->setMovable(false);
1686 toolBar->addAction(_actAddMountPoints);
1687 toolBar->addAction(_actDeleteMountPoints);
1688 toolBar->addAction(_actGetData);
1689 toolBar->addAction(_actStop);
1690 toolBar->addWidget(new QLabel(" "));
1691 toolBar->addAction(_actwhatsthis);
1692}
1693
1694// About
1695////////////////////////////////////////////////////////////////////////////
1696bncAboutDlg::bncAboutDlg(QWidget* parent) :
1697 QDialog(parent) {
1698
1699 QTextBrowser* tb = new QTextBrowser;
1700 QUrl url; url.setPath(":bncabout.html");
1701 tb->setSource(url);
1702 tb->setReadOnly(true);
1703
1704 int ww = QFontMetrics(font()).width('w');
1705 QPushButton* _closeButton = new QPushButton("Close");
1706 _closeButton->setMaximumWidth(10*ww);
1707 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1708
1709 QGridLayout* dlgLayout = new QGridLayout();
1710 QLabel* img = new QLabel();
1711 img->setPixmap(QPixmap(":ntrip-logo.png"));
1712 dlgLayout->addWidget(img, 0,0);
1713 dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version "BNCVERSION), 0,1);
1714 dlgLayout->addWidget(tb,1,0,1,2);
1715 dlgLayout->addWidget(_closeButton,2,1,Qt::AlignRight);
1716
1717 setLayout(dlgLayout);
1718 resize(60*ww, 60*ww);
1719 setWindowTitle("About BNC");
1720 show();
1721}
1722
1723//
1724////////////////////////////////////////////////////////////////////////////
1725bncAboutDlg::~bncAboutDlg() {
1726};
1727
1728// Flowchart
1729////////////////////////////////////////////////////////////////////////////
1730bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
1731 QDialog(parent) {
1732
1733 int ww = QFontMetrics(font()).width('w');
1734 QPushButton* _closeButton = new QPushButton("Close");
1735 _closeButton->setMaximumWidth(10*ww);
1736 connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
1737
1738 QGridLayout* dlgLayout = new QGridLayout();
1739 QLabel* img = new QLabel();
1740 img->setPixmap(QPixmap(":bncflowchart.png"));
1741 dlgLayout->addWidget(img, 0,0);
1742 dlgLayout->addWidget(_closeButton,1,0,Qt::AlignLeft);
1743
1744 setLayout(dlgLayout);
1745 setWindowTitle("Flow Chart");
1746 show();
1747}
1748
1749//
1750////////////////////////////////////////////////////////////////////////////
1751bncFlowchartDlg::~bncFlowchartDlg() {
1752};
1753
1754// Bnc Text
1755////////////////////////////////////////////////////////////////////////////
1756void bncWindow::slotBncTextChanged(){
1757
1758 QPalette palette_white(QColor(255, 255, 255));
1759 QPalette palette_gray(QColor(230, 230, 230));
1760 bncSettings settings;
1761
1762 // Proxy
1763 //------
1764 if (sender() == 0 || sender() == _proxyHostLineEdit) {
1765 if (!_proxyHostLineEdit->text().isEmpty()) {
1766 _proxyPortLineEdit->setStyleSheet("background-color: white");
1767 _proxyPortLineEdit->setEnabled(true);
1768 }
1769 else {
1770 _proxyPortLineEdit->setStyleSheet("background-color: lightGray");
1771 _proxyPortLineEdit->setEnabled(false);
1772 }
1773 }
1774
1775 // RINEX Observations
1776 // ------------------
1777 if (sender() == 0 || sender() == _rnxPathLineEdit) {
1778 if (!_rnxPathLineEdit->text().isEmpty()) {
1779 _rnxSamplSpinBox->setStyleSheet("background-color: white");
1780 _rnxSkelLineEdit->setStyleSheet("background-color: white");
1781 _rnxScrpLineEdit->setStyleSheet("background-color: white");
1782 _rnxV3CheckBox->setPalette(palette_white);
1783 _rnxIntrComboBox->setStyleSheet("background-color: white");
1784 _rnxSamplSpinBox->setEnabled(true);
1785 _rnxSkelLineEdit->setEnabled(true);
1786 _rnxScrpLineEdit->setEnabled(true);
1787 _rnxV3CheckBox->setEnabled(true);
1788 _rnxIntrComboBox->setEnabled(true);
1789 }
1790 else {
1791 _rnxSamplSpinBox->setStyleSheet("background-color: lightGray");
1792 _rnxSkelLineEdit->setStyleSheet("background-color: lightGray");
1793 _rnxScrpLineEdit->setStyleSheet("background-color: lightGray");
1794 _rnxV3CheckBox->setPalette(palette_gray);
1795 _rnxIntrComboBox->setStyleSheet("background-color: lightGray");
1796 _rnxSamplSpinBox->setEnabled(false);
1797 _rnxSkelLineEdit->setEnabled(false);
1798 _rnxScrpLineEdit->setEnabled(false);
1799 _rnxV3CheckBox->setEnabled(false);
1800 _rnxIntrComboBox->setEnabled(false);
1801 }
1802 }
1803
1804 // RINEX Ephemeris
1805 // ---------------
1806 if (sender() == 0 ||
1807 sender() == _ephPathLineEdit || sender() == _outEphPortLineEdit) {
1808 if (!_ephPathLineEdit->text().isEmpty() ||
1809 !_outEphPortLineEdit->text().isEmpty()) {
1810 _ephIntrComboBox->setStyleSheet("background-color: white");
1811 _ephV3CheckBox->setPalette(palette_white);
1812 _ephIntrComboBox->setEnabled(true);
1813 _ephV3CheckBox->setEnabled(true);
1814 }
1815 else {
1816 _ephIntrComboBox->setStyleSheet("background-color: lightGray");
1817 _ephV3CheckBox->setPalette(palette_gray);
1818 _ephIntrComboBox->setEnabled(false);
1819 _ephV3CheckBox->setEnabled(false);
1820 }
1821 }
1822
1823 // Broadcast Corrections
1824 // ---------------------
1825 if (sender() == 0 ||
1826 sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
1827 if (!_corrPathLineEdit->text().isEmpty() ||
1828 !_corrPortLineEdit->text().isEmpty()) {
1829 _corrIntrComboBox->setStyleSheet("background-color: white");
1830 _corrIntrComboBox->setEnabled(true);
1831 }
1832 else {
1833 _corrIntrComboBox->setStyleSheet("background-color: white");
1834 _corrIntrComboBox->setEnabled(true);
1835 }
1836 }
1837
1838 // Feed Engine
1839 // -----------
1840 if (sender() == 0 ||
1841 sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
1842 if ( !_outPortLineEdit->text().isEmpty() ||
1843 !_outFileLineEdit->text().isEmpty()) {
1844 _waitTimeSpinBox->setStyleSheet("background-color: white");
1845 _binSamplSpinBox->setStyleSheet("background-color: white");
1846 _waitTimeSpinBox->setEnabled(true);
1847 _binSamplSpinBox->setEnabled(true);
1848 }
1849 else {
1850 _waitTimeSpinBox->setStyleSheet("background-color: lightGray");
1851 _binSamplSpinBox->setStyleSheet("background-color: lightGray");
1852 _waitTimeSpinBox->setEnabled(false);
1853 _binSamplSpinBox->setEnabled(false);
1854 }
1855 }
1856
1857 // Serial Output
1858 // -------------
1859 if (sender() == 0 || sender() == _serialMountPointLineEdit ||
1860 sender() == _serialAutoNMEAComboBox) {
1861 if (!_serialMountPointLineEdit->text().isEmpty()) {
1862 _serialPortNameLineEdit->setStyleSheet("background-color: white");
1863 _serialBaudRateComboBox->setStyleSheet("background-color: white");
1864 _serialParityComboBox->setStyleSheet("background-color: white");
1865 _serialDataBitsComboBox->setStyleSheet("background-color: white");
1866 _serialStopBitsComboBox->setStyleSheet("background-color: white");
1867 _serialFlowControlComboBox->setStyleSheet("background-color: white");
1868 _serialAutoNMEAComboBox->setStyleSheet("background-color: white");
1869 _serialPortNameLineEdit->setEnabled(true);
1870 _serialBaudRateComboBox->setEnabled(true);
1871 _serialParityComboBox->setEnabled(true);
1872 _serialDataBitsComboBox->setEnabled(true);
1873 _serialStopBitsComboBox->setEnabled(true);
1874 _serialFlowControlComboBox->setEnabled(true);
1875 _serialAutoNMEAComboBox->setEnabled(true);
1876 if (_serialAutoNMEAComboBox->currentText() != "Auto" ) {
1877 _serialHeightNMEALineEdit->setStyleSheet("background-color: white");
1878 _serialHeightNMEALineEdit->setEnabled(true);
1879 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1880 _serialFileNMEALineEdit->setEnabled(false);
1881 }
1882 else {
1883 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1884 _serialHeightNMEALineEdit->setEnabled(false);
1885 _serialFileNMEALineEdit->setStyleSheet("background-color: white");
1886 _serialFileNMEALineEdit->setEnabled(true);
1887 }
1888 }
1889 else {
1890 _serialPortNameLineEdit->setStyleSheet("background-color: lightGray");
1891 _serialBaudRateComboBox->setStyleSheet("background-color: lightGray");
1892 _serialParityComboBox->setStyleSheet("background-color: lightGray");
1893 _serialDataBitsComboBox->setStyleSheet("background-color: lightGray");
1894 _serialStopBitsComboBox->setStyleSheet("background-color: lightGray");
1895 _serialFlowControlComboBox->setStyleSheet("background-color: lightGray");
1896 _serialAutoNMEAComboBox->setStyleSheet("background-color: lightGray");
1897 _serialFileNMEALineEdit->setStyleSheet("background-color: lightGray");
1898 _serialHeightNMEALineEdit->setStyleSheet("background-color: lightGray");
1899 _serialPortNameLineEdit->setEnabled(false);
1900 _serialBaudRateComboBox->setEnabled(false);
1901 _serialParityComboBox->setEnabled(false);
1902 _serialDataBitsComboBox->setEnabled(false);
1903 _serialStopBitsComboBox->setEnabled(false);
1904 _serialFlowControlComboBox->setEnabled(false);
1905 _serialAutoNMEAComboBox->setEnabled(false);
1906 _serialHeightNMEALineEdit->setEnabled(false);
1907 _serialFileNMEALineEdit->setEnabled(false);
1908 }
1909 }
1910
1911 // Outages
1912 // -------
1913 if (sender() == 0 || sender() == _obsRateComboBox) {
1914 if (!_obsRateComboBox->currentText().isEmpty()) {
1915 _adviseScriptLineEdit->setStyleSheet("background-color: white");
1916 _adviseFailSpinBox->setStyleSheet("background-color: white");
1917 _adviseRecoSpinBox->setStyleSheet("background-color: white");
1918 _adviseFailSpinBox->setEnabled(true);
1919 _adviseRecoSpinBox->setEnabled(true);
1920 _adviseScriptLineEdit->setEnabled(true);
1921 } else {
1922 _adviseScriptLineEdit->setStyleSheet("background-color: lightGray");
1923 _adviseFailSpinBox->setStyleSheet("background-color: lightGray");
1924 _adviseRecoSpinBox->setStyleSheet("background-color: lightGray");
1925 _adviseFailSpinBox->setEnabled(false);
1926 _adviseRecoSpinBox->setEnabled(false);
1927 _adviseScriptLineEdit->setEnabled(false);
1928 }
1929 }
1930
1931 // Miscellaneous
1932 // -------------
1933 if (sender() == 0 || sender() == _miscMountLineEdit) {
1934 if (!_miscMountLineEdit->text().isEmpty()) {
1935 _perfIntrComboBox->setStyleSheet("background-color: white");
1936 _scanRTCMCheckBox->setPalette(palette_white);
1937 _perfIntrComboBox->setEnabled(true);
1938 _scanRTCMCheckBox->setEnabled(true);
1939 } else {
1940 _perfIntrComboBox->setStyleSheet("background-color: lightGray");
1941 _scanRTCMCheckBox->setPalette(palette_gray);
1942 _perfIntrComboBox->setEnabled(false);
1943 _scanRTCMCheckBox->setEnabled(false);
1944 }
1945 }
1946
1947 // PPP Client
1948 // ----------
1949 if (sender() == 0
1950 || sender() == _pppMountLineEdit
1951 || sender() == _pppCorrMountLineEdit
1952 || sender() == _pppRefCrdXLineEdit
1953 || sender() == _pppRefCrdYLineEdit
1954 || sender() == _pppRefCrdZLineEdit
1955 || sender() == _pppSync
1956 || sender() == _pppSPPComboBox
1957 || sender() == _pppQuickStartLineEdit
1958 || sender() == _pppEstTropoCheckBox
1959 || sender() == _pppUsePhaseCheckBox
1960 || sender() == _pppAntexLineEdit ) {
1961 if ((!_pppMountLineEdit->text().isEmpty() &&
1962 !_pppCorrMountLineEdit->text().isEmpty()) ||
1963 ( !_pppMountLineEdit->text().isEmpty() &&
1964 _pppSPPComboBox->currentText() == "SPP")) {
1965 _pppSPPComboBox->setPalette(palette_white);
1966 _pppNMEALineEdit->setPalette(palette_white);
1967 _pppNMEAPortLineEdit->setPalette(palette_white);
1968 _pppRefCrdXLineEdit->setPalette(palette_white);
1969 _pppRefCrdYLineEdit->setPalette(palette_white);
1970 _pppRefCrdZLineEdit->setPalette(palette_white);
1971 _pppUsePhaseCheckBox->setPalette(palette_white);
1972 _pppPlotCoordinates->setPalette(palette_white);
1973 _pppEstTropoCheckBox->setPalette(palette_white);
1974 _pppGLONASSCheckBox->setPalette(palette_white);
1975 _pppGalileoCheckBox->setPalette(palette_white);
1976 _pppAntexLineEdit->setPalette(palette_white);
1977 _pppSPPComboBox->setEnabled(true);
1978 _pppNMEALineEdit->setEnabled(true);
1979 _pppNMEAPortLineEdit->setEnabled(true);
1980 _pppRefCrdXLineEdit->setEnabled(true);
1981 _pppRefCrdYLineEdit->setEnabled(true);
1982 _pppRefCrdZLineEdit->setEnabled(true);
1983 _pppUsePhaseCheckBox->setEnabled(true);
1984 _pppPlotCoordinates->setEnabled(true);
1985 _pppEstTropoCheckBox->setEnabled(true);
1986 _pppGLONASSCheckBox->setEnabled(true);
1987 _pppGalileoCheckBox->setEnabled(true);
1988 _pppRefCrdXLineEdit->setPalette(palette_white);
1989 _pppRefCrdYLineEdit->setPalette(palette_white);
1990 _pppRefCrdZLineEdit->setPalette(palette_white);
1991 _pppAntexLineEdit->setEnabled(true);
1992 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
1993 !_pppRefCrdYLineEdit->text().isEmpty() &&
1994 !_pppRefCrdZLineEdit->text().isEmpty()) {
1995 _pppAverageLineEdit->setPalette(palette_white);
1996 _pppQuickStartLineEdit->setPalette(palette_white);
1997 _pppAverageLineEdit->setEnabled(true);
1998 _pppQuickStartLineEdit->setEnabled(true);
1999 }
2000 else {
2001 _pppAverageLineEdit->setPalette(palette_gray);
2002 _pppQuickStartLineEdit->setPalette(palette_gray);
2003 _pppAverageLineEdit->setEnabled(false);
2004 _pppQuickStartLineEdit->setEnabled(false);
2005 }
2006 if (!_pppRefCrdXLineEdit->text().isEmpty() &&
2007 !_pppRefCrdYLineEdit->text().isEmpty() &&
2008 !_pppRefCrdZLineEdit->text().isEmpty() &&
2009 !_pppQuickStartLineEdit->text().isEmpty()) {
2010 _pppMaxSolGapLineEdit->setPalette(palette_white);
2011 _pppMaxSolGapLineEdit->setEnabled(true);
2012 }
2013 else {
2014 _pppMaxSolGapLineEdit->setPalette(palette_gray);
2015 _pppMaxSolGapLineEdit->setEnabled(false);
2016 }
2017 if (!_pppAntexLineEdit->text().isEmpty() ) {
2018 _pppAntennaLineEdit->setEnabled(true);
2019 _pppApplySatAntCheckBox->setEnabled(true);
2020 _pppAntennaLineEdit->setPalette(palette_white);
2021 _pppApplySatAntCheckBox->setPalette(palette_white);
2022 }
2023 else {
2024 _pppAntennaLineEdit->setEnabled(false);
2025 _pppApplySatAntCheckBox->setEnabled(false);
2026 _pppAntennaLineEdit->setPalette(palette_gray);
2027 _pppApplySatAntCheckBox->setPalette(palette_gray);
2028 }
2029 _pppSigCLineEdit->setPalette(palette_white);
2030 _pppSigCLineEdit->setEnabled(true);
2031 _pppSigCrd0->setPalette(palette_white);
2032 _pppSigCrd0->setEnabled(true);
2033 _pppSigCrdP->setPalette(palette_white);
2034 _pppSigCrdP->setEnabled(true);
2035 if (_pppEstTropoCheckBox->isChecked()
2036 && !_pppMountLineEdit->text().isEmpty()) {
2037 _pppSigTrp0->setPalette(palette_white);
2038 _pppSigTrp0->setEnabled(true);
2039 _pppSigTrpP->setPalette(palette_white);
2040 _pppSigTrpP->setEnabled(true);
2041 }
2042 else {
2043 _pppSigTrp0->setPalette(palette_gray);
2044 _pppSigTrp0->setEnabled(false);
2045 _pppSigTrpP->setPalette(palette_gray);
2046 _pppSigTrpP->setEnabled(false);
2047 }
2048 if (_pppUsePhaseCheckBox->isChecked()
2049 && !_pppMountLineEdit->text().isEmpty()) {
2050 _pppSigPLineEdit->setPalette(palette_white);
2051 _pppSigPLineEdit->setEnabled(true);
2052 }
2053 else {
2054 _pppSigPLineEdit->setPalette(palette_gray);
2055 _pppSigPLineEdit->setEnabled(false);
2056 }
2057 if (_pppSPPComboBox->currentText() == "PPP") {
2058 _pppSync->setPalette(palette_white);
2059 _pppSync->setEnabled(true);
2060 }
2061 else {
2062 _pppSync->setPalette(palette_gray);
2063 _pppSync->setEnabled(false);
2064 }
2065 } else {
2066 _pppSPPComboBox->setPalette(palette_gray);
2067 _pppNMEALineEdit->setPalette(palette_gray);
2068 _pppNMEAPortLineEdit->setPalette(palette_gray);
2069 _pppRefCrdXLineEdit->setPalette(palette_gray);
2070 _pppRefCrdYLineEdit->setPalette(palette_gray);
2071 _pppRefCrdZLineEdit->setPalette(palette_gray);
2072 _pppSync->setPalette(palette_gray);
2073 _pppUsePhaseCheckBox->setPalette(palette_gray);
2074 _pppPlotCoordinates->setPalette(palette_gray);
2075 _pppEstTropoCheckBox->setPalette(palette_gray);
2076 _pppGLONASSCheckBox->setPalette(palette_gray);
2077 _pppGalileoCheckBox->setPalette(palette_gray);
2078 _pppSigCLineEdit->setPalette(palette_gray);
2079 _pppSigPLineEdit->setPalette(palette_gray);
2080 _pppSigCrd0->setPalette(palette_gray);
2081 _pppSigCrdP->setPalette(palette_gray);
2082 _pppSigTrp0->setPalette(palette_gray);
2083 _pppSigTrpP->setPalette(palette_gray);
2084 _pppAverageLineEdit->setPalette(palette_gray);
2085 _pppQuickStartLineEdit->setPalette(palette_gray);
2086 _pppMaxSolGapLineEdit->setPalette(palette_gray);
2087 _pppAntexLineEdit->setPalette(palette_white);
2088 _pppAntennaLineEdit->setPalette(palette_gray);
2089 _pppApplySatAntCheckBox->setPalette(palette_gray);
2090 _pppSPPComboBox->setEnabled(false);
2091 _pppNMEALineEdit->setEnabled(false);
2092 _pppNMEAPortLineEdit->setEnabled(false);
2093 _pppRefCrdXLineEdit->setEnabled(false);
2094 _pppRefCrdYLineEdit->setEnabled(false);
2095 _pppRefCrdZLineEdit->setEnabled(false);
2096 _pppSync->setEnabled(false);
2097 _pppUsePhaseCheckBox->setEnabled(false);
2098 _pppPlotCoordinates->setEnabled(false);
2099 _pppEstTropoCheckBox->setEnabled(false);
2100 _pppGLONASSCheckBox->setEnabled(false);
2101 _pppGalileoCheckBox->setEnabled(false);
2102 _pppSigCLineEdit->setEnabled(false);
2103 _pppSigPLineEdit->setEnabled(false);
2104 _pppSigCrd0->setEnabled(false);
2105 _pppSigCrdP->setEnabled(false);
2106 _pppSigTrp0->setEnabled(false);
2107 _pppSigTrpP->setEnabled(false);
2108 _pppAverageLineEdit->setEnabled(false);
2109 _pppQuickStartLineEdit->setEnabled(false);
2110 _pppMaxSolGapLineEdit->setEnabled(false);
2111 _pppAntexLineEdit->setEnabled(true);
2112 _pppAntennaLineEdit->setEnabled(false);
2113 _pppApplySatAntCheckBox->setEnabled(false);
2114 }
2115//
2116 if (_pppMountLineEdit->text().isEmpty()) {
2117 _pppCorrMountLineEdit->setPalette(palette_gray);
2118 _pppCorrMountLineEdit->setEnabled(false);
2119 } else {
2120 _pppCorrMountLineEdit->setPalette(palette_white);
2121 _pppCorrMountLineEdit->setEnabled(true);
2122 if (_pppCorrMountLineEdit->text().isEmpty()) {
2123 _pppSPPComboBox->setPalette(palette_white);
2124 _pppSPPComboBox->setEnabled(true);
2125 }
2126 }
2127 if (_pppSPPComboBox->currentText() == "SPP") {
2128 _pppCorrMountLineEdit->setPalette(palette_gray);
2129 _pppCorrMountLineEdit->setEnabled(false);
2130 }
2131 }
2132}
2133
2134//
2135////////////////////////////////////////////////////////////////////////////
2136void bncWindow::slotAddCmbRow() {
2137 int iRow = _cmbTable->rowCount();
2138 _cmbTable->insertRow(iRow);
2139 for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
2140 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2141 }
2142}
2143
2144//
2145////////////////////////////////////////////////////////////////////////////
2146void bncWindow::slotDelCmbRow() {
2147 int nRows = _cmbTable->rowCount();
2148 bool flg[nRows];
2149 for (int iRow = 0; iRow < nRows; iRow++) {
2150 if (_cmbTable->isItemSelected(_cmbTable->item(iRow,1))) {
2151 flg[iRow] = true;
2152 }
2153 else {
2154 flg[iRow] = false;
2155 }
2156 }
2157 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2158 if (flg[iRow]) {
2159 _cmbTable->removeRow(iRow);
2160 }
2161 }
2162}
2163
2164//
2165////////////////////////////////////////////////////////////////////////////
2166void bncWindow::populateCmbTable() {
2167
2168 for (int iRow = _cmbTable->rowCount()-1; iRow >=0; iRow--) {
2169 _cmbTable->removeRow(iRow);
2170 }
2171
2172 bncSettings settings;
2173
2174 int iRow = -1;
2175 QListIterator<QString> it(settings.value("combineStreams").toStringList());
2176 while (it.hasNext()) {
2177 QStringList hlp = it.next().split(" ");
2178 if (hlp.size() > 2) {
2179 ++iRow;
2180 _cmbTable->insertRow(iRow);
2181 }
2182 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2183 _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2184 }
2185 }
2186}
2187
2188//
2189////////////////////////////////////////////////////////////////////////////
2190void bncWindow::slotAddUploadRow() {
2191 int iRow = _uploadTable->rowCount();
2192 _uploadTable->insertRow(iRow);
2193 for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
2194 if (iCol == 3) {
2195 QLineEdit* passwd = new QLineEdit();
2196 passwd->setFrame(false);
2197 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2198 _uploadTable->setCellWidget(iRow, iCol, passwd);
2199 }
2200 else if (iCol == 4) {
2201 QComboBox* system = new QComboBox();
2202 system->setEditable(false);
2203 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2204 system->setFrame(false);
2205 _uploadTable->setCellWidget(iRow, iCol, system);
2206 }
2207 else if (iCol == 5) {
2208 QCheckBox* com = new QCheckBox();
2209 _uploadTable->setCellWidget(iRow, iCol, com);
2210 }
2211 else if (iCol == 8) {
2212 bncTableItem* bncIt = new bncTableItem();
2213 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2214 _uploadTable->setItem(iRow, iCol, bncIt);
2215 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2216 }
2217 else {
2218 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
2219 }
2220 }
2221}
2222
2223//
2224////////////////////////////////////////////////////////////////////////////
2225void bncWindow::slotDelUploadRow() {
2226 ((bncApp*)qApp)->_uploadTableItems.clear();
2227 int nRows = _uploadTable->rowCount();
2228 bool flg[nRows];
2229 for (int iRow = 0; iRow < nRows; iRow++) {
2230 if (_uploadTable->isItemSelected(_uploadTable->item(iRow,1))) {
2231 flg[iRow] = true;
2232 }
2233 else {
2234 flg[iRow] = false;
2235 }
2236 }
2237 for (int iRow = nRows-1; iRow >= 0; iRow--) {
2238 if (flg[iRow]) {
2239 _uploadTable->removeRow(iRow);
2240 }
2241 }
2242 for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
2243 ((bncApp*)qApp)->_uploadTableItems[iRow] =
2244 (bncTableItem*) _uploadTable->item(iRow, 8);
2245 }
2246}
2247
2248//
2249////////////////////////////////////////////////////////////////////////////
2250void bncWindow::populateUploadTable() {
2251 for (int iRow = _uploadTable->rowCount()-1; iRow >=0; iRow--) {
2252 _uploadTable->removeRow(iRow);
2253 }
2254
2255 bncSettings settings;
2256
2257 int iRow = -1;
2258 QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
2259 while (it.hasNext()) {
2260 QStringList hlp = it.next().split(",");
2261 if (hlp.size() > 6) {
2262 ++iRow;
2263 _uploadTable->insertRow(iRow);
2264 }
2265 for (int iCol = 0; iCol < hlp.size(); iCol++) {
2266 if (iCol == 3) {
2267 QLineEdit* passwd = new QLineEdit();
2268 passwd->setFrame(false);
2269 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
2270 passwd->setText(hlp[iCol]);
2271 _uploadTable->setCellWidget(iRow, iCol, passwd);
2272 }
2273 else if (iCol == 4) {
2274 QComboBox* system = new QComboBox();
2275 system->setEditable(false);
2276 system->addItems(QString("IGS05,ETRF2000,NAD83,GDA94,SIRGAS95,SIRGAS2000,Custom").split(","));
2277 system->setFrame(false);
2278 system->setCurrentIndex(system->findText(hlp[iCol]));
2279 _uploadTable->setCellWidget(iRow, iCol, system);
2280 }
2281 else if (iCol == 5) {
2282 QCheckBox* com = new QCheckBox();
2283 if (hlp[iCol].toInt() == Qt::Checked) {
2284 com->setCheckState(Qt::Checked);
2285 }
2286 _uploadTable->setCellWidget(iRow, iCol, com);
2287 }
2288 else if (iCol == 8) {
2289 bncTableItem* bncIt = new bncTableItem();
2290 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
2291 _uploadTable->setItem(iRow, iCol, bncIt);
2292 ((bncApp*)qApp)->_uploadTableItems[iRow] = bncIt;
2293 }
2294 else {
2295 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
2296 }
2297 }
2298 }
2299}
2300
2301//
2302////////////////////////////////////////////////////////////////////////////
2303void bncWindow::slotSetUploadTrafo() {
2304 bncCustomTrafo* dlg = new bncCustomTrafo(this);
2305 dlg->exec();
2306 delete dlg;
2307}
Note: See TracBrowser for help on using the repository browser.