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

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