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

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