Changeset 10791 in ntrip for trunk/BNC/src/bncwindow.cpp


Ignore:
Timestamp:
Dec 3, 2025, 5:37:16 PM (2 days ago)
Author:
mervart
Message:

BNC Multifrequency and PPPAR Client (initial version)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/bncwindow.cpp

    r10776 r10791  
    102102bncWindow::bncWindow() {
    103103
    104     const static QPalette paletteWhite(QColor(255, 255, 255));
    105     const static QPalette paletteGray(QColor(230, 230, 230));
    106 
    107     _caster = 0;
    108     _casterEph = 0;
    109 
    110     _bncFigure = new bncFigure(this);
    111     _bncFigureLate = new bncFigureLate(this);
    112     _bncFigurePPP = new bncFigurePPP(this);
    113 
    114     connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
    115         _bncFigurePPP, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
    116 
    117     connect(BNC_CORE, SIGNAL(progressRnxPPP(int)), this, SLOT(slotPostProcessingProgress(int)));
    118     connect(BNC_CORE, SIGNAL(finishedRnxPPP()), this, SLOT(slotPostProcessingFinished()));
    119 
    120     _runningRealTime = false;
    121     _runningPPP = false;
    122     _runningEdit = false;
    123     _runningQC = false;
    124     _runningSp3Comp = false;
    125     _reqcActionComboBox = 0; // necessary for enableStartStop()
    126 
    127     _mapWin = 0;
    128 
    129     int ww = QFontMetrics(this->font()).horizontalAdvance('w');
    130 
    131     static const QStringList labels = QString("account, Streams:   resource loader / mountpoint, decoder, country, lat, long, nmea, ntrip, bytes").split(",");
    132 
    133     setMinimumSize(100 * ww, 70 * ww);
    134 
    135     setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
    136 
    137     connect(BNC_CORE, SIGNAL(newMessage(QByteArray, bool)),
    138         this, SLOT(slotWindowMessage(QByteArray, bool)));
    139 
    140     // Create Actions
    141     // --------------
    142     _actHelp = new QAction(tr("&Help Contents"), this);
    143     connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
    144 
    145     _actAbout = new QAction(tr("&About BNC"), this);
    146     connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
    147 
    148     _actFlowchart = new QAction(tr("&Flow Chart"), this);
    149     connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
    150 
    151     _actFontSel = new QAction(tr("Select &Font"), this);
    152     connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
    153 
    154     _actSaveOpt = new QAction(tr("&Reread && Save Configuration"), this);
    155     connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
    156 
    157     _actQuit = new QAction(tr("&Quit"), this);
    158     connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
    159 
    160     _actAddMountPoints = new QAction(tr("Add &Stream"), this);
    161     connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
    162 
    163     _actDeleteMountPoints = new QAction(tr("&Delete Stream"), this);
    164     connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
    165     _actDeleteMountPoints->setEnabled(false);
    166 
    167     _actMapMountPoints = new QAction(tr("&Map"), this);
    168     connect(_actMapMountPoints, SIGNAL(triggered()), SLOT(slotMapMountPoints()));
    169 
    170     _actStart = new QAction(tr("Sta&rt"), this);
    171     connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
    172 
    173     _actStop = new QAction(tr("Sto&p"), this);
    174     connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
    175     connect(_actStop, SIGNAL(triggered()), SLOT(slotMapPPPClosed()));
    176 
    177     _actwhatsthis = new QAction(tr("Help?=Shift+F1"), this);
    178     connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
    179 
    180     CreateMenu();
    181     AddToolbar();
    182 
    183     bncSettings settings;
    184 
    185     // Network Options
    186     // ---------------
    187     _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
    188     _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
    189 
    190     connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString&)),
    191         this, SLOT(slotBncTextChanged()));
    192 
    193     _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
    194     _sslClientCertPathLineEdit = new QLineEdit(settings.value("sslClientCertPath").toString());
    195     _sslIgnoreErrorsCheckBox = new QCheckBox();
    196     _sslIgnoreErrorsCheckBox->setCheckState(Qt::CheckState(
    197         settings.value("sslIgnoreErrors").toInt()));
    198 
    199     // General Options
    200     // ---------------
    201     _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
    202     _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
    203     _rnxAppendCheckBox = new QCheckBox();
    204     _rnxAppendCheckBox->setCheckState(Qt::CheckState(
    205         settings.value("rnxAppend").toInt()));
    206     _onTheFlyComboBox = new QComboBox();
    207     _onTheFlyComboBox->setEditable(false);
    208     _onTheFlyComboBox->addItems(QString("no,1 day,1 hour,5 min,1 min").split(","));
    209     int go = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
    210     if (go != -1) {
    211         _onTheFlyComboBox->setCurrentIndex(go);
    212     }
    213     _autoStartCheckBox = new QCheckBox();
    214     _autoStartCheckBox->setCheckState(Qt::CheckState(
    215         settings.value("autoStart").toInt()));
    216 
    217     // RINEX Observations Options
    218     // --------------------------
    219     _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
    220     _rnxIntrComboBox = new QComboBox();
    221     _rnxIntrComboBox->setEditable(false);
    222     _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
    223     int ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
    224     if (ii != -1) {
    225         _rnxIntrComboBox->setCurrentIndex(ii);
    226     }
    227     _rnxSamplComboBox = new QComboBox();
    228     _rnxSamplComboBox->setEditable(false);
    229     _rnxSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
    230     int ij = _rnxSamplComboBox->findText(settings.value("rnxSampl").toString());
    231     if (ij != -1) {
    232         _rnxSamplComboBox->setCurrentIndex(ij);
    233     }
    234     _rnxFileCheckBox = new QCheckBox();
    235     _rnxFileCheckBox->setCheckState(Qt::CheckState(settings.value("rnxOnlyWithSKL").toInt()));
    236     _rnxSkelExtComboBox = new QComboBox();
    237     _rnxSkelExtComboBox->setEditable(false);
    238     _rnxSkelExtComboBox->addItems(QString("skl,SKL").split(","));
    239     int ik = _rnxSkelExtComboBox->findText(settings.value("rnxSkel").toString());
    240     if (ik != -1) {
    241         _rnxSkelExtComboBox->setCurrentIndex(ik);
    242     }
    243     _rnxSkelPathLineEdit = new QLineEdit(settings.value("rnxSkelPath").toString());
    244     _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
    245     _rnxVersComboBox = new QComboBox();
    246     _rnxVersComboBox->setEditable(false);
    247     _rnxVersComboBox->addItems(QString("4,3,2").split(","));
    248     _rnxVersComboBox->setMaximumWidth(7 * ww);
    249     int il = _rnxVersComboBox->findText(settings.value("rnxVersion").toString());
    250     if (il != -1) {
    251         _rnxVersComboBox->setCurrentIndex(il);
    252     }
    253     QString hlp = settings.value("rnxV2Priority").toString();
    254     if (hlp.isEmpty()) {
    255         hlp = "G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX";
    256     }
    257     _rnxV2Priority = new QLineEdit(hlp);
    258 
    259     connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotBncTextChanged()));
    260     connect(_rnxSkelPathLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotBncTextChanged()));
    261     connect(_rnxVersComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotBncTextChanged()));
    262 
    263     // RINEX Ephemeris Options
    264     // -----------------------
    265     _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
    266     _ephIntrComboBox = new QComboBox();
    267     _ephIntrComboBox->setEditable(false);
    268     _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
    269     int ji = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
    270     if (ji != -1) {
    271         _ephIntrComboBox->setCurrentIndex(ji);
    272     }
    273     _ephOutPortLineEdit = new QLineEdit(settings.value("ephOutPort").toString());
    274     _ephVersComboBox = new QComboBox();
    275     _ephVersComboBox->setEditable(false);
    276     _ephVersComboBox->addItems(QString("4,3,2").split(","));
    277     _ephVersComboBox->setMaximumWidth(7 * ww);
    278     int jk = _ephVersComboBox->findText(settings.value("ephVersion").toString());
    279     if (jk != -1) {
    280         _ephVersComboBox->setCurrentIndex(jk);
    281     }
    282     //_ephFilePerStation = new QCheckBox();
    283     //_ephFilePerStation->setCheckState(Qt::CheckState(settings.value("ephFilePerStation").toInt()));
    284 
    285     connect(_ephOutPortLineEdit, SIGNAL(textChanged(const QString&)),
    286         this, SLOT(slotBncTextChanged()));
    287 
    288     connect(_ephPathLineEdit, SIGNAL(textChanged(const QString&)),
    289         this, SLOT(slotBncTextChanged()));
    290 
    291     // Broadcast Corrections Options
    292     // -----------------------------
    293     _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
    294     _corrIntrComboBox = new QComboBox();
    295     _corrIntrComboBox->setEditable(false);
    296     _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
    297     int bi = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
    298     if (bi != -1) {
    299         _corrIntrComboBox->setCurrentIndex(bi);
    300     }
    301     _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
    302 
    303     connect(_corrPathLineEdit, SIGNAL(textChanged(const QString&)),
    304         this, SLOT(slotBncTextChanged()));
    305 
    306     connect(_corrPortLineEdit, SIGNAL(textChanged(const QString&)),
    307         this, SLOT(slotBncTextChanged()));
    308 
    309     // Feed Engine Options
    310     // -------------------
    311     _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
    312     _outWaitSpinBox = new QSpinBox();
    313     _outWaitSpinBox->setMinimum(0);
    314     _outWaitSpinBox->setMaximum(30);
    315     _outWaitSpinBox->setSingleStep(1);
    316     _outWaitSpinBox->setSuffix(" sec");
    317     _outWaitSpinBox->setValue(settings.value("outWait").toInt());
    318     _outSamplComboBox = new QComboBox();
    319     _outSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
    320     int nn = _outSamplComboBox->findText(settings.value("outSampl").toString());
    321     if (nn != -1) {
    322         _outSamplComboBox->setCurrentIndex(nn);
    323     }
    324     _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
    325     _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
    326     _outLockTimeCheckBox = new QCheckBox();
    327     _outLockTimeCheckBox->setCheckState(Qt::CheckState(settings.value("outLockTime").toInt()));
    328 
    329     connect(_outPortLineEdit, SIGNAL(textChanged(const QString&)),
    330         this, SLOT(slotBncTextChanged()));
    331 
    332     connect(_outFileLineEdit, SIGNAL(textChanged(const QString&)),
    333         this, SLOT(slotBncTextChanged()));
    334 
    335     connect(_outLockTimeCheckBox, SIGNAL(stateChanged(int)),
    336         this, SLOT(slotBncTextChanged()));
    337 
    338     // Serial Output Options
    339     // ---------------------
    340     _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
    341     _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
    342     _serialBaudRateComboBox = new QComboBox();
    343     _serialBaudRateComboBox->addItems(QString("110,300,600,"
    344         "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
    345     int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
    346     if (kk != -1) {
    347         _serialBaudRateComboBox->setCurrentIndex(kk);
    348     }
    349     _serialFlowControlComboBox = new QComboBox();
    350     _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
    351     kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
    352     if (kk != -1) {
    353         _serialFlowControlComboBox->setCurrentIndex(kk);
    354     }
    355     _serialDataBitsComboBox = new QComboBox();
    356     _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
    357     kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
    358     if (kk != -1) {
    359         _serialDataBitsComboBox->setCurrentIndex(kk);
    360     }
    361     _serialParityComboBox = new QComboBox();
    362     _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
    363     kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
    364     if (kk != -1) {
    365         _serialParityComboBox->setCurrentIndex(kk);
    366     }
    367     _serialStopBitsComboBox = new QComboBox();
    368     _serialStopBitsComboBox->addItems(QString("1,2").split(","));
    369     kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
    370     if (kk != -1) {
    371         _serialStopBitsComboBox->setCurrentIndex(kk);
    372     }
    373     _serialAutoNMEAComboBox = new QComboBox();
    374     _serialAutoNMEAComboBox->addItems(QString("no,Auto,Manual GPGGA,Manual GNGGA").split(","));
    375     kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
    376     if (kk != -1) {
    377         _serialAutoNMEAComboBox->setCurrentIndex(kk);
    378     }
    379     _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
    380     _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
    381 
    382     _serialNMEASamplingSpinBox = new QSpinBox();
    383     _serialNMEASamplingSpinBox->setMinimum(0);
    384     _serialNMEASamplingSpinBox->setMaximum(300);
    385     _serialNMEASamplingSpinBox->setSingleStep(10);
    386     _serialNMEASamplingSpinBox->setValue(settings.value("serialNMEASampling").toInt());
    387     _serialNMEASamplingSpinBox->setSuffix(" sec");
    388 
    389     connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString&)),
    390         this, SLOT(slotBncTextChanged()));
    391 
    392     connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString&)),
    393         this, SLOT(slotBncTextChanged()));
    394 
    395     // Outages Options
    396     // ---------------
    397     _adviseObsRateComboBox = new QComboBox();
    398     _adviseObsRateComboBox->setEditable(false);
    399     _adviseObsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
    400     kk = _adviseObsRateComboBox->findText(settings.value("adviseObsRate").toString());
    401     if (kk != -1) {
    402         _adviseObsRateComboBox->setCurrentIndex(kk);
    403     }
    404     _adviseFailSpinBox = new QSpinBox();
    405     _adviseFailSpinBox->setMinimum(0);
    406     _adviseFailSpinBox->setMaximum(60);
    407     _adviseFailSpinBox->setSingleStep(1);
    408     _adviseFailSpinBox->setSuffix(" min");
    409     _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
    410     _adviseRecoSpinBox = new QSpinBox();
    411     _adviseRecoSpinBox->setMinimum(0);
    412     _adviseRecoSpinBox->setMaximum(60);
    413     _adviseRecoSpinBox->setSingleStep(1);
    414     _adviseRecoSpinBox->setSuffix(" min");
    415     _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
    416     _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
    417 
    418     connect(_adviseObsRateComboBox, SIGNAL(currentIndexChanged(const QString&)),
    419         this, SLOT(slotBncTextChanged()));
    420 
    421     // Miscellaneous Options
    422     // ---------------------
    423     _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
    424     _miscPortLineEdit = new QLineEdit(settings.value("miscPort").toString());
    425     _miscIntrComboBox = new QComboBox();
    426     _miscIntrComboBox->setEditable(false);
    427     _miscIntrComboBox->addItems(QString(",2 sec,10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
    428     int ll = _miscIntrComboBox->findText(settings.value("miscIntr").toString());
    429     if (ll != -1) {
    430         _miscIntrComboBox->setCurrentIndex(ll);
    431     }
    432     _miscScanRTCMCheckBox = new QCheckBox();
    433     _miscScanRTCMCheckBox->setCheckState(Qt::CheckState(
    434         settings.value("miscScanRTCM").toInt()));
    435 
    436     connect(_miscMountLineEdit, SIGNAL(textChanged(const QString&)),
    437         this, SLOT(slotBncTextChanged()));
    438 
    439     // Streams
    440     // -------
    441     _mountPointsTable = new QTableWidget(0, 9);
    442 
    443     _mountPointsTable->horizontalHeader()->resizeSection(1, 34 * ww);
    444     _mountPointsTable->horizontalHeader()->resizeSection(2, 9 * ww);
    445     _mountPointsTable->horizontalHeader()->resizeSection(3, 9 * ww);
    446     _mountPointsTable->horizontalHeader()->resizeSection(4, 7 * ww);
    447     _mountPointsTable->horizontalHeader()->resizeSection(5, 7 * ww);
    448     _mountPointsTable->horizontalHeader()->resizeSection(6, 5 * ww);
    449     _mountPointsTable->horizontalHeader()->resizeSection(7, 5 * ww);
     104  const static QPalette paletteWhite(QColor(255, 255, 255));
     105  const static QPalette paletteGray(QColor(230, 230, 230));
     106
     107  _caster = 0;
     108  _casterEph = 0;
     109
     110  _bncFigure = new bncFigure(this);
     111  _bncFigureLate = new bncFigureLate(this);
     112  _bncFigurePPP = new bncFigurePPP(this);
     113
     114  connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
     115          _bncFigurePPP, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
     116
     117  connect(BNC_CORE, SIGNAL(progressRnxPPP(int)), this, SLOT(slotPostProcessingProgress(int)));
     118  connect(BNC_CORE, SIGNAL(finishedRnxPPP()), this, SLOT(slotPostProcessingFinished()));
     119
     120  _runningRealTime = false;
     121  _runningPPP = false;
     122  _runningEdit = false;
     123  _runningQC = false;
     124  _runningSp3Comp = false;
     125  _reqcActionComboBox = 0; // necessary for enableStartStop()
     126
     127  _mapWin = 0;
     128
     129  int ww = QFontMetrics(this->font()).horizontalAdvance('w');
     130
     131  static const QStringList labels = QString("account, Streams:   resource loader / mountpoint, decoder, country, lat, long, nmea, ntrip, bytes").split(",");
     132
     133  setMinimumSize(100 * ww, 70 * ww);
     134
     135  setWindowTitle(tr("BKG Ntrip Client (BNC) Version " BNCVERSION));
     136
     137  connect(BNC_CORE, SIGNAL(newMessage(QByteArray, bool)),
     138          this, SLOT(slotWindowMessage(QByteArray, bool)));
     139
     140  // Create Actions
     141  // --------------
     142  _actHelp = new QAction(tr("&Help Contents"), this);
     143  connect(_actHelp, SIGNAL(triggered()), SLOT(slotHelp()));
     144
     145  _actAbout = new QAction(tr("&About BNC"), this);
     146  connect(_actAbout, SIGNAL(triggered()), SLOT(slotAbout()));
     147
     148  _actFlowchart = new QAction(tr("&Flow Chart"), this);
     149  connect(_actFlowchart, SIGNAL(triggered()), SLOT(slotFlowchart()));
     150
     151  _actFontSel = new QAction(tr("Select &Font"), this);
     152  connect(_actFontSel, SIGNAL(triggered()), SLOT(slotFontSel()));
     153
     154  _actSaveOpt = new QAction(tr("&Reread && Save Configuration"), this);
     155  connect(_actSaveOpt, SIGNAL(triggered()), SLOT(slotSaveOptions()));
     156
     157  _actQuit = new QAction(tr("&Quit"), this);
     158  connect(_actQuit, SIGNAL(triggered()), SLOT(close()));
     159
     160  _actAddMountPoints = new QAction(tr("Add &Stream"), this);
     161  connect(_actAddMountPoints, SIGNAL(triggered()), SLOT(slotAddMountPoints()));
     162
     163  _actDeleteMountPoints = new QAction(tr("&Delete Stream"), this);
     164  connect(_actDeleteMountPoints, SIGNAL(triggered()), SLOT(slotDeleteMountPoints()));
     165  _actDeleteMountPoints->setEnabled(false);
     166
     167  _actMapMountPoints = new QAction(tr("&Map"), this);
     168  connect(_actMapMountPoints, SIGNAL(triggered()), SLOT(slotMapMountPoints()));
     169
     170  _actStart = new QAction(tr("Sta&rt"), this);
     171  connect(_actStart, SIGNAL(triggered()), SLOT(slotStart()));
     172
     173  _actStop = new QAction(tr("Sto&p"), this);
     174  connect(_actStop, SIGNAL(triggered()), SLOT(slotStop()));
     175  connect(_actStop, SIGNAL(triggered()), SLOT(slotMapPPPClosed()));
     176
     177  _actwhatsthis = new QAction(tr("Help?=Shift+F1"), this);
     178  connect(_actwhatsthis, SIGNAL(triggered()), SLOT(slotWhatsThis()));
     179
     180  CreateMenu();
     181  AddToolbar();
     182
     183  bncSettings settings;
     184
     185  // Network Options
     186  // ---------------
     187  _proxyHostLineEdit = new QLineEdit(settings.value("proxyHost").toString());
     188  _proxyPortLineEdit = new QLineEdit(settings.value("proxyPort").toString());
     189
     190  connect(_proxyHostLineEdit, SIGNAL(textChanged(const QString&)),
     191          this, SLOT(slotBncTextChanged()));
     192
     193  _sslCaCertPathLineEdit = new QLineEdit(settings.value("sslCaCertPath").toString());
     194  _sslClientCertPathLineEdit = new QLineEdit(settings.value("sslClientCertPath").toString());
     195  _sslIgnoreErrorsCheckBox = new QCheckBox();
     196  _sslIgnoreErrorsCheckBox->setCheckState(Qt::CheckState(
     197                                                         settings.value("sslIgnoreErrors").toInt()));
     198
     199  // General Options
     200  // ---------------
     201  _logFileLineEdit = new QLineEdit(settings.value("logFile").toString());
     202  _rawOutFileLineEdit = new QLineEdit(settings.value("rawOutFile").toString());
     203  _rnxAppendCheckBox = new QCheckBox();
     204  _rnxAppendCheckBox->setCheckState(Qt::CheckState(
     205                                                   settings.value("rnxAppend").toInt()));
     206  _onTheFlyComboBox = new QComboBox();
     207  _onTheFlyComboBox->setEditable(false);
     208  _onTheFlyComboBox->addItems(QString("no,1 day,1 hour,5 min,1 min").split(","));
     209  int go = _onTheFlyComboBox->findText(settings.value("onTheFlyInterval").toString());
     210  if (go != -1) {
     211    _onTheFlyComboBox->setCurrentIndex(go);
     212  }
     213  _autoStartCheckBox = new QCheckBox();
     214  _autoStartCheckBox->setCheckState(Qt::CheckState(
     215                                                   settings.value("autoStart").toInt()));
     216
     217  // RINEX Observations Options
     218  // --------------------------
     219  _rnxPathLineEdit = new QLineEdit(settings.value("rnxPath").toString());
     220  _rnxIntrComboBox = new QComboBox();
     221  _rnxIntrComboBox->setEditable(false);
     222  _rnxIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
     223  int ii = _rnxIntrComboBox->findText(settings.value("rnxIntr").toString());
     224  if (ii != -1) {
     225    _rnxIntrComboBox->setCurrentIndex(ii);
     226  }
     227  _rnxSamplComboBox = new QComboBox();
     228  _rnxSamplComboBox->setEditable(false);
     229  _rnxSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
     230  int ij = _rnxSamplComboBox->findText(settings.value("rnxSampl").toString());
     231  if (ij != -1) {
     232    _rnxSamplComboBox->setCurrentIndex(ij);
     233  }
     234  _rnxFileCheckBox = new QCheckBox();
     235  _rnxFileCheckBox->setCheckState(Qt::CheckState(settings.value("rnxOnlyWithSKL").toInt()));
     236  _rnxSkelExtComboBox = new QComboBox();
     237  _rnxSkelExtComboBox->setEditable(false);
     238  _rnxSkelExtComboBox->addItems(QString("skl,SKL").split(","));
     239  int ik = _rnxSkelExtComboBox->findText(settings.value("rnxSkel").toString());
     240  if (ik != -1) {
     241    _rnxSkelExtComboBox->setCurrentIndex(ik);
     242  }
     243  _rnxSkelPathLineEdit = new QLineEdit(settings.value("rnxSkelPath").toString());
     244  _rnxScrpLineEdit = new QLineEdit(settings.value("rnxScript").toString());
     245  _rnxVersComboBox = new QComboBox();
     246  _rnxVersComboBox->setEditable(false);
     247  _rnxVersComboBox->addItems(QString("4,3,2").split(","));
     248  _rnxVersComboBox->setMaximumWidth(7 * ww);
     249  int il = _rnxVersComboBox->findText(settings.value("rnxVersion").toString());
     250  if (il != -1) {
     251    _rnxVersComboBox->setCurrentIndex(il);
     252  }
     253  QString hlp = settings.value("rnxV2Priority").toString();
     254  if (hlp.isEmpty()) {
     255    hlp = "G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX";
     256  }
     257  _rnxV2Priority = new QLineEdit(hlp);
     258
     259  connect(_rnxPathLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotBncTextChanged()));
     260  connect(_rnxSkelPathLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotBncTextChanged()));
     261  connect(_rnxVersComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotBncTextChanged()));
     262
     263  // RINEX Ephemeris Options
     264  // -----------------------
     265  _ephPathLineEdit = new QLineEdit(settings.value("ephPath").toString());
     266  _ephIntrComboBox = new QComboBox();
     267  _ephIntrComboBox->setEditable(false);
     268  _ephIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
     269  int ji = _ephIntrComboBox->findText(settings.value("ephIntr").toString());
     270  if (ji != -1) {
     271    _ephIntrComboBox->setCurrentIndex(ji);
     272  }
     273  _ephOutPortLineEdit = new QLineEdit(settings.value("ephOutPort").toString());
     274  _ephVersComboBox = new QComboBox();
     275  _ephVersComboBox->setEditable(false);
     276  _ephVersComboBox->addItems(QString("4,3,2").split(","));
     277  _ephVersComboBox->setMaximumWidth(7 * ww);
     278  int jk = _ephVersComboBox->findText(settings.value("ephVersion").toString());
     279  if (jk != -1) {
     280    _ephVersComboBox->setCurrentIndex(jk);
     281  }
     282  //_ephFilePerStation = new QCheckBox();
     283  //_ephFilePerStation->setCheckState(Qt::CheckState(settings.value("ephFilePerStation").toInt()));
     284
     285  connect(_ephOutPortLineEdit, SIGNAL(textChanged(const QString&)),
     286          this, SLOT(slotBncTextChanged()));
     287
     288  connect(_ephPathLineEdit, SIGNAL(textChanged(const QString&)),
     289          this, SLOT(slotBncTextChanged()));
     290
     291  // Broadcast Corrections Options
     292  // -----------------------------
     293  _corrPathLineEdit = new QLineEdit(settings.value("corrPath").toString());
     294  _corrIntrComboBox = new QComboBox();
     295  _corrIntrComboBox->setEditable(false);
     296  _corrIntrComboBox->addItems(QString("1 min,2 min,5 min,10 min,15 min,30 min,1 hour,1 day").split(","));
     297  int bi = _corrIntrComboBox->findText(settings.value("corrIntr").toString());
     298  if (bi != -1) {
     299    _corrIntrComboBox->setCurrentIndex(bi);
     300  }
     301  _corrPortLineEdit = new QLineEdit(settings.value("corrPort").toString());
     302
     303  connect(_corrPathLineEdit, SIGNAL(textChanged(const QString&)),
     304          this, SLOT(slotBncTextChanged()));
     305
     306  connect(_corrPortLineEdit, SIGNAL(textChanged(const QString&)),
     307          this, SLOT(slotBncTextChanged()));
     308
     309  // Feed Engine Options
     310  // -------------------
     311  _outPortLineEdit = new QLineEdit(settings.value("outPort").toString());
     312  _outWaitSpinBox = new QSpinBox();
     313  _outWaitSpinBox->setMinimum(0);
     314  _outWaitSpinBox->setMaximum(30);
     315  _outWaitSpinBox->setSingleStep(1);
     316  _outWaitSpinBox->setSuffix(" sec");
     317  _outWaitSpinBox->setValue(settings.value("outWait").toInt());
     318  _outSamplComboBox = new QComboBox();
     319  _outSamplComboBox->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
     320  int nn = _outSamplComboBox->findText(settings.value("outSampl").toString());
     321  if (nn != -1) {
     322    _outSamplComboBox->setCurrentIndex(nn);
     323  }
     324  _outFileLineEdit = new QLineEdit(settings.value("outFile").toString());
     325  _outUPortLineEdit = new QLineEdit(settings.value("outUPort").toString());
     326  _outLockTimeCheckBox = new QCheckBox();
     327  _outLockTimeCheckBox->setCheckState(Qt::CheckState(settings.value("outLockTime").toInt()));
     328
     329  connect(_outPortLineEdit, SIGNAL(textChanged(const QString&)),
     330          this, SLOT(slotBncTextChanged()));
     331
     332  connect(_outFileLineEdit, SIGNAL(textChanged(const QString&)),
     333          this, SLOT(slotBncTextChanged()));
     334
     335  connect(_outLockTimeCheckBox, SIGNAL(stateChanged(int)),
     336          this, SLOT(slotBncTextChanged()));
     337
     338  // Serial Output Options
     339  // ---------------------
     340  _serialMountPointLineEdit = new QLineEdit(settings.value("serialMountPoint").toString());
     341  _serialPortNameLineEdit = new QLineEdit(settings.value("serialPortName").toString());
     342  _serialBaudRateComboBox = new QComboBox();
     343  _serialBaudRateComboBox->addItems(QString("110,300,600,"
     344                                            "1200,2400,4800,9600,19200,38400,57600,115200").split(","));
     345  int kk = _serialBaudRateComboBox->findText(settings.value("serialBaudRate").toString());
     346  if (kk != -1) {
     347    _serialBaudRateComboBox->setCurrentIndex(kk);
     348  }
     349  _serialFlowControlComboBox = new QComboBox();
     350  _serialFlowControlComboBox->addItems(QString("OFF,XONXOFF,HARDWARE").split(","));
     351  kk = _serialFlowControlComboBox->findText(settings.value("serialFlowControl").toString());
     352  if (kk != -1) {
     353    _serialFlowControlComboBox->setCurrentIndex(kk);
     354  }
     355  _serialDataBitsComboBox = new QComboBox();
     356  _serialDataBitsComboBox->addItems(QString("5,6,7,8").split(","));
     357  kk = _serialDataBitsComboBox->findText(settings.value("serialDataBits").toString());
     358  if (kk != -1) {
     359    _serialDataBitsComboBox->setCurrentIndex(kk);
     360  }
     361  _serialParityComboBox = new QComboBox();
     362  _serialParityComboBox->addItems(QString("NONE,ODD,EVEN,SPACE").split(","));
     363  kk = _serialParityComboBox->findText(settings.value("serialParity").toString());
     364  if (kk != -1) {
     365    _serialParityComboBox->setCurrentIndex(kk);
     366  }
     367  _serialStopBitsComboBox = new QComboBox();
     368  _serialStopBitsComboBox->addItems(QString("1,2").split(","));
     369  kk = _serialStopBitsComboBox->findText(settings.value("serialStopBits").toString());
     370  if (kk != -1) {
     371    _serialStopBitsComboBox->setCurrentIndex(kk);
     372  }
     373  _serialAutoNMEAComboBox = new QComboBox();
     374  _serialAutoNMEAComboBox->addItems(QString("no,Auto,Manual GPGGA,Manual GNGGA").split(","));
     375  kk = _serialAutoNMEAComboBox->findText(settings.value("serialAutoNMEA").toString());
     376  if (kk != -1) {
     377    _serialAutoNMEAComboBox->setCurrentIndex(kk);
     378  }
     379  _serialFileNMEALineEdit = new QLineEdit(settings.value("serialFileNMEA").toString());
     380  _serialHeightNMEALineEdit = new QLineEdit(settings.value("serialHeightNMEA").toString());
     381
     382  _serialNMEASamplingSpinBox = new QSpinBox();
     383  _serialNMEASamplingSpinBox->setMinimum(0);
     384  _serialNMEASamplingSpinBox->setMaximum(300);
     385  _serialNMEASamplingSpinBox->setSingleStep(10);
     386  _serialNMEASamplingSpinBox->setValue(settings.value("serialNMEASampling").toInt());
     387  _serialNMEASamplingSpinBox->setSuffix(" sec");
     388
     389  connect(_serialMountPointLineEdit, SIGNAL(textChanged(const QString&)),
     390          this, SLOT(slotBncTextChanged()));
     391
     392  connect(_serialAutoNMEAComboBox, SIGNAL(currentIndexChanged(const QString&)),
     393          this, SLOT(slotBncTextChanged()));
     394
     395  // Outages Options
     396  // ---------------
     397  _adviseObsRateComboBox = new QComboBox();
     398  _adviseObsRateComboBox->setEditable(false);
     399  _adviseObsRateComboBox->addItems(QString(",0.1 Hz,0.2 Hz,0.5 Hz,1 Hz,5 Hz").split(","));
     400  kk = _adviseObsRateComboBox->findText(settings.value("adviseObsRate").toString());
     401  if (kk != -1) {
     402    _adviseObsRateComboBox->setCurrentIndex(kk);
     403  }
     404  _adviseFailSpinBox = new QSpinBox();
     405  _adviseFailSpinBox->setMinimum(0);
     406  _adviseFailSpinBox->setMaximum(60);
     407  _adviseFailSpinBox->setSingleStep(1);
     408  _adviseFailSpinBox->setSuffix(" min");
     409  _adviseFailSpinBox->setValue(settings.value("adviseFail").toInt());
     410  _adviseRecoSpinBox = new QSpinBox();
     411  _adviseRecoSpinBox->setMinimum(0);
     412  _adviseRecoSpinBox->setMaximum(60);
     413  _adviseRecoSpinBox->setSingleStep(1);
     414  _adviseRecoSpinBox->setSuffix(" min");
     415  _adviseRecoSpinBox->setValue(settings.value("adviseReco").toInt());
     416  _adviseScriptLineEdit = new QLineEdit(settings.value("adviseScript").toString());
     417
     418  connect(_adviseObsRateComboBox, SIGNAL(currentIndexChanged(const QString&)),
     419          this, SLOT(slotBncTextChanged()));
     420
     421  // Miscellaneous Options
     422  // ---------------------
     423  _miscMountLineEdit = new QLineEdit(settings.value("miscMount").toString());
     424  _miscPortLineEdit = new QLineEdit(settings.value("miscPort").toString());
     425  _miscIntrComboBox = new QComboBox();
     426  _miscIntrComboBox->setEditable(false);
     427  _miscIntrComboBox->addItems(QString(",2 sec,10 sec,1 min,5 min,15 min,1 hour,6 hours,1 day").split(","));
     428  int ll = _miscIntrComboBox->findText(settings.value("miscIntr").toString());
     429  if (ll != -1) {
     430    _miscIntrComboBox->setCurrentIndex(ll);
     431  }
     432  _miscScanRTCMCheckBox = new QCheckBox();
     433  _miscScanRTCMCheckBox->setCheckState(Qt::CheckState(
     434                                                      settings.value("miscScanRTCM").toInt()));
     435
     436  connect(_miscMountLineEdit, SIGNAL(textChanged(const QString&)),
     437          this, SLOT(slotBncTextChanged()));
     438
     439  // Streams
     440  // -------
     441  _mountPointsTable = new QTableWidget(0, 9);
     442
     443  _mountPointsTable->horizontalHeader()->resizeSection(1, 34 * ww);
     444  _mountPointsTable->horizontalHeader()->resizeSection(2, 9 * ww);
     445  _mountPointsTable->horizontalHeader()->resizeSection(3, 9 * ww);
     446  _mountPointsTable->horizontalHeader()->resizeSection(4, 7 * ww);
     447  _mountPointsTable->horizontalHeader()->resizeSection(5, 7 * ww);
     448  _mountPointsTable->horizontalHeader()->resizeSection(6, 5 * ww);
     449  _mountPointsTable->horizontalHeader()->resizeSection(7, 5 * ww);
    450450#if QT_VERSION < 0x050000
    451     _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     451  _mountPointsTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
    452452#else
    453     _mountPointsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
     453  _mountPointsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    454454#endif
    455     _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
    456     _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    457     _mountPointsTable->setHorizontalHeaderLabels(labels);
    458     _mountPointsTable->setGridStyle(Qt::NoPen);
    459     _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    460     _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    461     _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    462     _mountPointsTable->hideColumn(0);
    463     _mountPointsTable->hideColumn(3);
    464     connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
    465         SLOT(slotSelectionChanged()));
    466     populateMountPointsTable();
    467 
    468     _log = new QTextEdit();
    469     _log->setReadOnly(true);
    470     QFont msFont(""); msFont.setStyleHint(QFont::TypeWriter); // default monospace font
    471     _log->setFont(msFont);
    472     _log->document()->setMaximumBlockCount(1000);
    473 
    474     // Combine Corrections
    475     // -------------------
    476     _cmbTable = new QTableWidget(0, 4);
    477     _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight Factor, Exclude Satellites").split(","));
    478     _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    479     _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    480     _cmbTable->setMaximumWidth(40 * ww);
    481     _cmbTable->horizontalHeader()->resizeSection(0, 10 * ww);
    482     _cmbTable->horizontalHeader()->resizeSection(1, 6 * ww);
    483     _cmbTable->horizontalHeader()->resizeSection(2, 9 * ww);
    484     _cmbTable->horizontalHeader()->resizeSection(3, 9 * ww);
     455  _mountPointsTable->horizontalHeader()->setStretchLastSection(true);
     456  _mountPointsTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
     457  _mountPointsTable->setHorizontalHeaderLabels(labels);
     458  _mountPointsTable->setGridStyle(Qt::NoPen);
     459  _mountPointsTable->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
     460  _mountPointsTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     461  _mountPointsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     462  _mountPointsTable->hideColumn(0);
     463  _mountPointsTable->hideColumn(3);
     464  connect(_mountPointsTable, SIGNAL(itemSelectionChanged()),
     465          SLOT(slotSelectionChanged()));
     466  populateMountPointsTable();
     467
     468  _log = new QTextEdit();
     469  _log->setReadOnly(true);
     470  QFont msFont(""); msFont.setStyleHint(QFont::TypeWriter); // default monospace font
     471  _log->setFont(msFont);
     472  _log->document()->setMaximumBlockCount(1000);
     473
     474  // Combine Corrections
     475  // -------------------
     476  _cmbTable = new QTableWidget(0, 4);
     477  _cmbTable->setHorizontalHeaderLabels(QString("Mountpoint, AC Name, Weight Factor, Exclude Satellites").split(","));
     478  _cmbTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     479  _cmbTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     480  _cmbTable->setMaximumWidth(40 * ww);
     481  _cmbTable->horizontalHeader()->resizeSection(0, 10 * ww);
     482  _cmbTable->horizontalHeader()->resizeSection(1, 6 * ww);
     483  _cmbTable->horizontalHeader()->resizeSection(2, 9 * ww);
     484  _cmbTable->horizontalHeader()->resizeSection(3, 9 * ww);
    485485#if QT_VERSION < 0x050000
    486     _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     486  _cmbTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
    487487#else
    488     _cmbTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
     488  _cmbTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    489489#endif
    490     _cmbTable->horizontalHeader()->setStretchLastSection(true);
    491     _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    492 
    493     _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
    494     _cmbMaxdisplacementLineEdit = new QLineEdit(settings.value("cmbMaxdisplacement").toString());
    495 
    496     _cmbSamplComboBox = new QComboBox();
    497     _cmbSamplComboBox->setEditable(false);
    498     _cmbSamplComboBox->addItems(QString("1 sec,2 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
    499     int kl = _cmbSamplComboBox->findText(settings.value("cmbSampl").toString());
    500     if (kl != -1) {
    501         _cmbSamplComboBox->setCurrentIndex(kl);
    502     }
    503 
    504     _cmbLogPath = new QLineEdit(settings.value("cmbLogpath").toString());
    505 
    506     QPushButton* addCmbRowButton = new QPushButton("Add Row");
    507     QPushButton* delCmbRowButton = new QPushButton("Delete");
    508 
    509     connect(_cmbTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
    510 
    511     _cmbMethodComboBox = new QComboBox();
    512     _cmbMethodComboBox->setEditable(false);
    513     _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
    514     int cm = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
    515     if (cm != -1) {
    516         _cmbMethodComboBox->setCurrentIndex(cm);
    517     }
    518 
    519     int iRow = _cmbTable->rowCount();
    520     if (iRow > 0) {
    521         enableWidget(true, _cmbMethodComboBox);
    522         enableWidget(true, _cmbMaxresLineEdit);
    523         enableWidget(true, _cmbMaxdisplacementLineEdit);
    524         enableWidget(true, _cmbSamplComboBox);
    525         enableWidget(true, _cmbLogPath);
     490  _cmbTable->horizontalHeader()->setStretchLastSection(true);
     491  _cmbTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
     492
     493  _cmbMaxresLineEdit = new QLineEdit(settings.value("cmbMaxres").toString());
     494  _cmbMaxdisplacementLineEdit = new QLineEdit(settings.value("cmbMaxdisplacement").toString());
     495
     496  _cmbSamplComboBox = new QComboBox();
     497  _cmbSamplComboBox->setEditable(false);
     498  _cmbSamplComboBox->addItems(QString("1 sec,2 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
     499  int kl = _cmbSamplComboBox->findText(settings.value("cmbSampl").toString());
     500  if (kl != -1) {
     501    _cmbSamplComboBox->setCurrentIndex(kl);
     502  }
     503
     504  _cmbLogPath = new QLineEdit(settings.value("cmbLogpath").toString());
     505
     506  QPushButton* addCmbRowButton = new QPushButton("Add Row");
     507  QPushButton* delCmbRowButton = new QPushButton("Delete");
     508
     509  connect(_cmbTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
     510
     511  _cmbMethodComboBox = new QComboBox();
     512  _cmbMethodComboBox->setEditable(false);
     513  _cmbMethodComboBox->addItems(QString("Kalman Filter,Single-Epoch").split(","));
     514  int cm = _cmbMethodComboBox->findText(settings.value("cmbMethod").toString());
     515  if (cm != -1) {
     516    _cmbMethodComboBox->setCurrentIndex(cm);
     517  }
     518
     519  int iRow = _cmbTable->rowCount();
     520  if (iRow > 0) {
     521    enableWidget(true, _cmbMethodComboBox);
     522    enableWidget(true, _cmbMaxresLineEdit);
     523    enableWidget(true, _cmbMaxdisplacementLineEdit);
     524    enableWidget(true, _cmbSamplComboBox);
     525    enableWidget(true, _cmbLogPath);
     526  }
     527  else {
     528    enableWidget(false, _cmbMethodComboBox);
     529    enableWidget(false, _cmbMaxresLineEdit);
     530    enableWidget(false, _cmbMaxdisplacementLineEdit);
     531    enableWidget(false, _cmbSamplComboBox);
     532    enableWidget(false, _cmbLogPath);
     533  }
     534  _cmbGpsCheckBox = new QCheckBox();
     535  _cmbGpsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGps").toInt()));
     536  _cmbGloCheckBox = new QCheckBox();
     537  _cmbGloCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGlo").toInt()));
     538  _cmbGalCheckBox = new QCheckBox();
     539  _cmbGalCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGal").toInt()));
     540  _cmbBdsCheckBox = new QCheckBox();
     541  _cmbBdsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbBds").toInt()));
     542  _cmbQzssCheckBox = new QCheckBox();
     543  _cmbQzssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbQzss").toInt()));
     544  _cmbSbasCheckBox = new QCheckBox();
     545  _cmbSbasCheckBox->setCheckState(Qt::CheckState(settings.value("cmbSbas").toInt()));
     546  _cmbNavicCheckBox = new QCheckBox();
     547  _cmbNavicCheckBox->setCheckState(Qt::CheckState(settings.value("cmbNavic").toInt()));
     548
     549  connect(_cmbGpsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     550  connect(_cmbGloCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     551  connect(_cmbGalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     552  connect(_cmbBdsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     553  connect(_cmbQzssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     554  connect(_cmbSbasCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     555  connect(_cmbNavicCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
     556
     557  _cmbBsxFile = new qtFileChooser(0, qtFileChooser::File);
     558  _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
     559
     560  // Upload Results
     561  // -------------
     562  _uploadTable = new QTableWidget(0, 16);
     563  _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mountpoint, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, Bytes").split(","));
     564  _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     565  _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     566  _uploadTable->horizontalHeader()->resizeSection(0, 13 * ww);
     567  _uploadTable->horizontalHeader()->resizeSection(1, 5 * ww);
     568  _uploadTable->horizontalHeader()->resizeSection(2, 10 * ww);
     569  _uploadTable->horizontalHeader()->resizeSection(3, 6 * ww);
     570  _uploadTable->horizontalHeader()->resizeSection(4, 8 * ww);
     571  _uploadTable->horizontalHeader()->resizeSection(5, 8 * ww);
     572  _uploadTable->horizontalHeader()->resizeSection(6, 11 * ww);
     573  _uploadTable->horizontalHeader()->resizeSection(7, 11 * ww);
     574  _uploadTable->horizontalHeader()->resizeSection(8, 4 * ww);
     575  _uploadTable->horizontalHeader()->resizeSection(9, 15 * ww);
     576  _uploadTable->horizontalHeader()->resizeSection(10, 15 * ww);
     577  _uploadTable->horizontalHeader()->resizeSection(11, 15 * ww);
     578  _uploadTable->horizontalHeader()->resizeSection(12, 4 * ww);
     579  _uploadTable->horizontalHeader()->resizeSection(13, 4 * ww);
     580  _uploadTable->horizontalHeader()->resizeSection(14, 4 * ww);
     581  _uploadTable->horizontalHeader()->resizeSection(15, 12 * ww);
     582#if QT_VERSION < 0x050000
     583  _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     584#else
     585  _uploadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
     586#endif
     587  _uploadTable->horizontalHeader()->setStretchLastSection(true);
     588  _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
     589
     590  connect(_uploadTable, SIGNAL(itemSelectionChanged()),
     591          SLOT(slotBncTextChanged()));
     592
     593  QPushButton* addUploadRowButton = new QPushButton("Add Row");
     594  QPushButton* delUploadRowButton = new QPushButton("Del Row");
     595  QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
     596  _uploadIntrComboBox = new QComboBox;
     597  _uploadIntrComboBox->setEditable(false);
     598  _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
     599  ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
     600  if (ii != -1) {
     601    _uploadIntrComboBox->setCurrentIndex(ii);
     602  }
     603
     604  _uploadAntexFile = new qtFileChooser(0, qtFileChooser::File);
     605  _uploadAntexFile->setFileName(settings.value("uploadAntexFile").toString());
     606
     607  _uploadSamplRtcmEphCorrComboBox = new QComboBox();
     608  _uploadSamplRtcmEphCorrComboBox->setEditable(false);
     609  _uploadSamplRtcmEphCorrComboBox->addItems(QString("0 sec,1 sec,2 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
     610  int pp = _uploadSamplRtcmEphCorrComboBox->findText(settings.value("uploadSamplRtcmEphCorr").toString());
     611  if (pp != -1) {
     612    _uploadSamplRtcmEphCorrComboBox->setCurrentIndex(pp);
     613  }
     614
     615  _uploadSamplSp3ComboBox = new QComboBox();
     616  _uploadSamplSp3ComboBox->setEditable(false);
     617  _uploadSamplSp3ComboBox->addItems(QString("0 sec,30 sec,60 sec,300 sec,900 sec").split(","));
     618  int oo = _uploadSamplSp3ComboBox->findText(settings.value("uploadSamplSp3").toString());
     619  if (oo != -1) {
     620    _uploadSamplSp3ComboBox->setCurrentIndex(oo);
     621  }
     622
     623  _uploadSamplClkRnxSpinBox = new QSpinBox;
     624  _uploadSamplClkRnxSpinBox->setMinimum(0);
     625  _uploadSamplClkRnxSpinBox->setMaximum(60);
     626  _uploadSamplClkRnxSpinBox->setSingleStep(5);
     627  _uploadSamplClkRnxSpinBox->setMaximumWidth(9 * ww);
     628  _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
     629  _uploadSamplClkRnxSpinBox->setSuffix(" sec");
     630
     631  _uploadSamplBiaSnxSpinBox = new QSpinBox;
     632  _uploadSamplBiaSnxSpinBox->setMinimum(0);
     633  _uploadSamplBiaSnxSpinBox->setMaximum(60);
     634  _uploadSamplBiaSnxSpinBox->setSingleStep(5);
     635  _uploadSamplBiaSnxSpinBox->setMaximumWidth(9 * ww);
     636  _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
     637  _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
     638
     639  int iRowT = _uploadTable->rowCount();
     640  if (iRowT > 0) {
     641    enableWidget(true, _uploadIntrComboBox);
     642    enableWidget(true, _uploadSamplRtcmEphCorrComboBox);
     643    enableWidget(true, _uploadSamplSp3ComboBox);
     644    enableWidget(true, _uploadSamplClkRnxSpinBox);
     645    enableWidget(true, _uploadSamplBiaSnxSpinBox);
     646    enableWidget(true, _uploadAntexFile);
     647  }
     648  else {
     649    enableWidget(false, _uploadIntrComboBox);
     650    enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
     651    enableWidget(false, _uploadSamplSp3ComboBox);
     652    enableWidget(false, _uploadSamplClkRnxSpinBox);
     653    enableWidget(true, _uploadSamplBiaSnxSpinBox);
     654    enableWidget(false, _uploadAntexFile);
     655  }
     656
     657  // Upload RTCM3 Ephemeris
     658  // ----------------------
     659  _uploadEphTable = new QTableWidget(0, 7);
     660  _uploadEphTable->setColumnCount(8);
     661  _uploadEphTable->setRowCount(0);
     662  _uploadEphTable->setHorizontalHeaderLabels(QString("Host, Port, Mountpoint,  Ntrip, User, Password, System, Bytes").split(","));
     663  _uploadEphTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     664  _uploadEphTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     665  _uploadEphTable->horizontalHeader()->resizeSection(0, 13 * ww);
     666  _uploadEphTable->horizontalHeader()->resizeSection(1, 5 * ww);
     667  _uploadEphTable->horizontalHeader()->resizeSection(2, 8 * ww);
     668  _uploadEphTable->horizontalHeader()->resizeSection(3, 6 * ww);
     669  _uploadEphTable->horizontalHeader()->resizeSection(4, 8 * ww);
     670  _uploadEphTable->horizontalHeader()->resizeSection(5, 8 * ww);
     671  _uploadEphTable->horizontalHeader()->resizeSection(6, 10 * ww);
     672  _uploadEphTable->horizontalHeader()->resizeSection(7, 12 * ww);
     673#if QT_VERSION < 0x050000
     674  _uploadEphTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     675#else
     676  _uploadEphTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
     677#endif
     678  _uploadEphTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
     679
     680  connect(_uploadEphTable, SIGNAL(itemSelectionChanged()),
     681          SLOT(slotBncTextChanged()));
     682
     683  QPushButton* addUploadEphRowButton = new QPushButton("Add Row");
     684  addUploadEphRowButton->setMaximumWidth(9 * ww);
     685  QPushButton* delUploadEphRowButton = new QPushButton("Del Row");
     686  delUploadEphRowButton->setMaximumWidth(9 * ww);
     687
     688  _uploadSamplRtcmEphSpinBox = new QSpinBox;
     689  _uploadSamplRtcmEphSpinBox->setMinimum(0);
     690  _uploadSamplRtcmEphSpinBox->setMaximum(60);
     691  _uploadSamplRtcmEphSpinBox->setSingleStep(5);
     692  _uploadSamplRtcmEphSpinBox->setMaximumWidth(9 * ww);
     693  _uploadSamplRtcmEphSpinBox->setValue(settings.value("uploadSamplRtcmEph").toInt());
     694  _uploadSamplRtcmEphSpinBox->setSuffix(" sec");
     695
     696  iRowT = _uploadEphTable->rowCount();
     697  if (iRowT > 0) {
     698    enableWidget(true, _uploadSamplRtcmEphSpinBox);
     699  }
     700  else {
     701    enableWidget(false, _uploadSamplRtcmEphSpinBox);
     702  }
     703
     704  // Upload Raw data
     705  // ----------------------
     706  _uploadRawTable = new QTableWidget(0, 7);
     707  _uploadRawTable->setColumnCount(8);
     708  _uploadRawTable->setRowCount(0);
     709  _uploadRawTable->setHorizontalHeaderLabels(QString("Source Mountpoint, Host, Port, Upload Mountpoint,  Ntrip, User, Password, Bytes").split(","));
     710  _uploadRawTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
     711  _uploadRawTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     712  _uploadRawTable->horizontalHeader()->resizeSection(0, 13 * ww);
     713  _uploadRawTable->horizontalHeader()->resizeSection(1, 13 * ww);
     714  _uploadRawTable->horizontalHeader()->resizeSection(2, 5 * ww);
     715  _uploadRawTable->horizontalHeader()->resizeSection(3, 13 * ww);
     716  _uploadRawTable->horizontalHeader()->resizeSection(4, 6 * ww);
     717  _uploadRawTable->horizontalHeader()->resizeSection(5, 8 * ww);
     718  _uploadRawTable->horizontalHeader()->resizeSection(6, 8 * ww);
     719  _uploadRawTable->horizontalHeader()->resizeSection(7, 10 * ww);
     720  _uploadRawTable->horizontalHeader()->resizeSection(8, 12 * ww);
     721#if QT_VERSION < 0x050000
     722  _uploadRawTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
     723#else
     724  _uploadRawTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
     725#endif
     726  _uploadRawTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
     727
     728  connect(_uploadRawTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
     729
     730  QPushButton* addUploadRawRowButton = new QPushButton("Add Row");
     731  addUploadRawRowButton->setMaximumWidth(9 * ww);
     732  QPushButton* delUploadRawRowButton = new QPushButton("Del Row");
     733  delUploadRawRowButton->setMaximumWidth(9 * ww);
     734
     735  // Canvas with Editable Fields
     736  // ---------------------------
     737  _canvas = new QWidget;
     738  setCentralWidget(_canvas);
     739
     740  _aogroup = new QTabWidget();
     741  _aogroup->setElideMode(Qt::ElideNone);
     742  _aogroup->setUsesScrollButtons(true);
     743  QWidget* pgroup = new QWidget();
     744  QWidget* ggroup = new QWidget();
     745  QWidget* sgroup = new QWidget();
     746  QWidget* egroup = new QWidget();
     747  QWidget* agroup = new QWidget();
     748  QWidget* cgroup = new QWidget();
     749  QWidget* ogroup = new QWidget();
     750  QWidget* rgroup = new QWidget();
     751  QWidget* sergroup = new QWidget();
     752  QWidget* pppGroup1 = new QWidget();
     753  QWidget* pppGroup2 = new QWidget();
     754  QWidget* pppGroup3 = new QWidget();
     755  QWidget* pppGroup4 = new QWidget();
     756  QWidget* reqcgroup = new QWidget();
     757  QWidget* sp3CompGroup = new QWidget();
     758  QWidget* cmbgroup = new QWidget();
     759  QWidget* uploadgroup = new QWidget();
     760  QWidget* uploadEphgroup = new QWidget();
     761  QWidget* uploadRawgroup = new QWidget();
     762  _aogroup->addTab(pgroup, tr("Network"));
     763  _aogroup->addTab(ggroup, tr("General"));
     764  _aogroup->addTab(ogroup, tr("RINEX Observations"));
     765  _aogroup->addTab(egroup, tr("RINEX Ephemeris"));
     766  _aogroup->addTab(reqcgroup, tr("RINEX Editing && QC"));
     767  _aogroup->addTab(sp3CompGroup, tr("SP3 Comparison"));
     768  _aogroup->addTab(cgroup, tr("Broadcast Corrections"));
     769  _aogroup->addTab(sgroup, tr("Feed Engine"));
     770  _aogroup->addTab(sergroup, tr("Serial Output"));
     771  _aogroup->addTab(agroup, tr("Outages"));
     772  _aogroup->addTab(rgroup, tr("Miscellaneous"));
     773  _aogroup->addTab(pppGroup1, tr("PPP (1)"));
     774  _aogroup->addTab(pppGroup2, tr("PPP (2)"));
     775  _aogroup->addTab(pppGroup3, tr("PPP (3)"));
     776  _aogroup->addTab(pppGroup4, tr("PPP (4)"));
     777  _aogroup->addTab(cmbgroup, tr("Combine Corrections"));
     778  _aogroup->addTab(uploadgroup, tr("Upload Corrections"));
     779  _aogroup->addTab(uploadEphgroup, tr("Upload Ephemeris"));
     780  _aogroup->addTab(uploadRawgroup, tr("Upload Raw Data"));
     781
     782  // Log Tab
     783  // -------
     784  _loggroup = new QTabWidget();
     785  _loggroup->addTab(_log, tr("Log"));
     786  _loggroup->addTab(_bncFigure, tr("Throughput"));
     787  _loggroup->addTab(_bncFigureLate, tr("Latency"));
     788  _loggroup->addTab(_bncFigurePPP, tr("PPP Plot"));
     789
     790  // Netowork (Proxy and SSL) Tab
     791  // ----------------------------
     792  QGridLayout* pLayout = new QGridLayout;
     793  pLayout->setColumnMinimumWidth(0, 13 * ww);
     794  _proxyPortLineEdit->setMaximumWidth(9 * ww);
     795
     796  pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none.<br>"), 0, 0, 1, 50);
     797  pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
     798  pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1, 10);
     799  pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
     800  pLayout->addWidget(_proxyPortLineEdit, 2, 1);
     801  pLayout->addWidget(new QLabel("Path to SSL certificates"), 3, 0);
     802  pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1, 10);
     803  pLayout->addWidget(new QLabel("Default:  " + bncSslConfig::defaultPath()), 3, 11, 1, 20);
     804  pLayout->addWidget(new QLabel("Path to SSL client certificates"), 4, 0);
     805  pLayout->addWidget(_sslClientCertPathLineEdit, 4, 1, 1, 10);
     806  pLayout->addWidget(new QLabel("Ignore SSL authorization errors"), 5, 0);
     807  pLayout->addWidget(_sslIgnoreErrorsCheckBox, 5, 1, 1, 10);
     808  pLayout->addWidget(new QLabel(""), 6, 1);
     809  pLayout->setRowStretch(6, 999);
     810
     811  pgroup->setLayout(pLayout);
     812
     813  // General Tab
     814  // -----------
     815  QGridLayout* gLayout = new QGridLayout;
     816  gLayout->setColumnMinimumWidth(0, 14 * ww);
     817  _onTheFlyComboBox->setMaximumWidth(9 * ww);
     818
     819  gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, auto-start, and raw file output.<br>"), 0, 0, 1, 50);
     820  gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
     821  gLayout->addWidget(_logFileLineEdit, 1, 1, 1, 20);
     822  gLayout->addWidget(new QLabel("Append files"), 2, 0);
     823  gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
     824  gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
     825  gLayout->addWidget(_onTheFlyComboBox, 3, 1);
     826  gLayout->addWidget(new QLabel("Auto start"), 4, 0);
     827  gLayout->addWidget(_autoStartCheckBox, 4, 1);
     828  gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
     829  gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1, 20);
     830  gLayout->addWidget(new QLabel(""), 6, 1);
     831  gLayout->setRowStretch(7, 999);
     832
     833  ggroup->setLayout(gLayout);
     834
     835  // RINEX Observations
     836  // ------------------
     837  QGridLayout* oLayout = new QGridLayout;
     838  oLayout->setColumnMinimumWidth(0, 14 * ww);
     839  _rnxIntrComboBox->setMaximumWidth(9 * ww);
     840  _rnxSamplComboBox->setMaximumWidth(9 * ww);
     841  _rnxSkelExtComboBox->setMaximumWidth(9 * ww);
     842
     843  oLayout->addWidget(new QLabel("Saving RINEX observation files.<br>"), 0, 0, 1, 50);
     844  oLayout->addWidget(new QLabel("Directory"), 1, 0);
     845  oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1, 15);
     846  oLayout->addWidget(new QLabel("Interval"), 2, 0);
     847  oLayout->addWidget(_rnxIntrComboBox, 2, 1);
     848  oLayout->addWidget(new QLabel("  Sampling"), 2, 2, Qt::AlignRight);
     849  oLayout->addWidget(_rnxSamplComboBox, 2, 3, Qt::AlignRight);
     850  oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
     851  oLayout->addWidget(_rnxSkelExtComboBox, 3, 1, Qt::AlignLeft);
     852  oLayout->addWidget(new QLabel("Skeleton mandatory"), 3, 2, Qt::AlignRight);
     853  oLayout->addWidget(_rnxFileCheckBox, 3, 3);
     854  oLayout->addWidget(new QLabel("Skeleton Directory"), 4, 0);
     855  oLayout->addWidget(_rnxSkelPathLineEdit, 4, 1, 1, 15);
     856  oLayout->addWidget(new QLabel("Script (full path)"), 5, 0);
     857  oLayout->addWidget(_rnxScrpLineEdit, 5, 1, 1, 15);
     858  oLayout->addWidget(new QLabel("Version"), 6, 0);
     859  oLayout->addWidget(_rnxVersComboBox, 6, 1);
     860  oLayout->addWidget(new QLabel("Signal priority"), 6, 2, Qt::AlignRight);
     861  oLayout->addWidget(_rnxV2Priority, 6, 3, 1, 13);
     862  oLayout->addWidget(new QLabel(""), 7, 1);
     863  oLayout->setRowStretch(8, 999);
     864
     865  ogroup->setLayout(oLayout);
     866
     867  // RINEX Ephemeris
     868  // ---------------
     869  QGridLayout* eLayout = new QGridLayout;
     870  eLayout->setColumnMinimumWidth(0, 14 * ww);
     871  _ephIntrComboBox->setMaximumWidth(9 * ww);
     872  _ephOutPortLineEdit->setMaximumWidth(9 * ww);
     873
     874  eLayout->addWidget(new QLabel("Saving RINEX navigation files and ephemeris output through IP port.<br>"), 0, 0, 1, 70);
     875  eLayout->addWidget(new QLabel("Directory"), 1, 0);
     876  eLayout->addWidget(_ephPathLineEdit, 1, 1, 1, 30);
     877  eLayout->addWidget(new QLabel("Interval"), 2, 0);
     878  eLayout->addWidget(_ephIntrComboBox, 2, 1);
     879  eLayout->addWidget(new QLabel("Port"), 3, 0);
     880  eLayout->addWidget(_ephOutPortLineEdit, 3, 1);
     881  eLayout->addWidget(new QLabel("Version"), 4, 0);
     882  eLayout->addWidget(_ephVersComboBox, 4, 1);
     883  eLayout->setRowStretch(5, 999);
     884  //eLayout->addWidget(new QLabel("File per Station"),              5, 0);
     885  //eLayout->addWidget(_ephFilePerStation,                          5, 1);
     886  //eLayout->setRowStretch(6, 999);
     887
     888  egroup->setLayout(eLayout);
     889
     890
     891  // Broadcast Corrections
     892  // ---------------------
     893  QGridLayout* cLayout = new QGridLayout;
     894  cLayout->setColumnMinimumWidth(0, 14 * ww);
     895  _corrIntrComboBox->setMaximumWidth(9 * ww);
     896  _corrPortLineEdit->setMaximumWidth(9 * ww);
     897
     898  cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port.<br>"), 0, 0, 1, 70);
     899  cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
     900  cLayout->addWidget(_corrPathLineEdit, 1, 1, 1, 30);
     901  cLayout->addWidget(new QLabel("Interval"), 2, 0);
     902  cLayout->addWidget(_corrIntrComboBox, 2, 1);
     903  cLayout->addWidget(new QLabel("Port"), 3, 0);
     904  cLayout->addWidget(_corrPortLineEdit, 3, 1);
     905  cLayout->addWidget(new QLabel(""), 4, 1);
     906  cLayout->setRowStretch(7, 999);
     907  cgroup->setLayout(cLayout);
     908
     909  // Feed Engine
     910  // -----------
     911  QGridLayout* sLayout = new QGridLayout;
     912  sLayout->setColumnMinimumWidth(0, 14 * ww);
     913  _outPortLineEdit->setMaximumWidth(9 * ww);
     914  _outWaitSpinBox->setMaximumWidth(9 * ww);
     915  _outSamplComboBox->setMaximumWidth(9 * ww);
     916  _outUPortLineEdit->setMaximumWidth(9 * ww);
     917
     918  sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine.<br>"), 0, 0, 1, 50);
     919  sLayout->addWidget(new QLabel("Port"), 1, 0);
     920  sLayout->addWidget(_outPortLineEdit, 1, 1);
     921  sLayout->addWidget(new QLabel("       Wait for full obs epoch"), 1, 2, Qt::AlignRight);
     922  sLayout->addWidget(_outWaitSpinBox, 1, 3, Qt::AlignLeft);
     923  sLayout->addWidget(new QLabel("Sampling"), 2, 0);
     924  sLayout->addWidget(_outSamplComboBox, 2, 1, Qt::AlignLeft);
     925  sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
     926  sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 10);
     927  sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
     928  sLayout->addWidget(_outUPortLineEdit, 4, 1);
     929  sLayout->addWidget(new QLabel("Print lock time"), 5, 0);
     930  sLayout->addWidget(_outLockTimeCheckBox, 5, 1);
     931  sLayout->addWidget(new QLabel(""), 6, 1);
     932  sLayout->setRowStretch(7, 999);
     933
     934  sgroup->setLayout(sLayout);
     935
     936  // Serial Output
     937  // -------------
     938  QGridLayout* serLayout = new QGridLayout;
     939  serLayout->setColumnMinimumWidth(0, 12 * ww);
     940  _serialBaudRateComboBox->setMaximumWidth(9 * ww);
     941  _serialFlowControlComboBox->setMaximumWidth(11 * ww);
     942  _serialDataBitsComboBox->setMaximumWidth(5 * ww);
     943  _serialParityComboBox->setMaximumWidth(9 * ww);
     944  _serialStopBitsComboBox->setMaximumWidth(5 * ww);
     945  _serialAutoNMEAComboBox->setMaximumWidth(14 * ww);
     946  _serialHeightNMEALineEdit->setMaximumWidth(8 * ww);
     947  _serialNMEASamplingSpinBox->setMaximumWidth(8 * ww);
     948
     949  serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver.<br>"), 0, 0, 1, 30);
     950  serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
     951  serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
     952  serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
     953  serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
     954  serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
     955  serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
     956  serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
     957  serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
     958  serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
     959  serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
     960  serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
     961  serLayout->addWidget(_serialParityComboBox, 4, 3);
     962  serLayout->addWidget(new QLabel("   Stop bits"), 4, 4, Qt::AlignRight);
     963  serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
     964  serLayout->addWidget(new QLabel("NMEA"), 5, 0);
     965  serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
     966  serLayout->addWidget(new QLabel("    File (full path)"), 5, 2, Qt::AlignRight);
     967  serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1, 10);
     968  serLayout->addWidget(new QLabel("Height"), 5, 14, Qt::AlignRight);
     969  serLayout->addWidget(_serialHeightNMEALineEdit, 5, 15, 1, 11);
     970  serLayout->addWidget(new QLabel("Sampling"), 5, 25, Qt::AlignRight);
     971  serLayout->addWidget(_serialNMEASamplingSpinBox, 5, 26, 1, 12);
     972  serLayout->addWidget(new QLabel(""), 6, 1);
     973  serLayout->setRowStretch(7, 999);
     974
     975  sergroup->setLayout(serLayout);
     976
     977  // Outages
     978  // -------
     979  QGridLayout* aLayout = new QGridLayout;
     980  aLayout->setColumnMinimumWidth(0, 14 * ww);
     981  _adviseObsRateComboBox->setMaximumWidth(9 * ww);
     982  _adviseFailSpinBox->setMaximumWidth(9 * ww);
     983  _adviseRecoSpinBox->setMaximumWidth(9 * ww);
     984
     985  aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes.<br>"), 0, 0, 1, 50, Qt::AlignLeft);
     986  aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
     987  aLayout->addWidget(_adviseObsRateComboBox, 1, 1);
     988  aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
     989  aLayout->addWidget(_adviseFailSpinBox, 2, 1);
     990  aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
     991  aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
     992  aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
     993  aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1, 20);
     994  aLayout->addWidget(new QLabel(""), 5, 1);
     995  aLayout->setRowStretch(6, 999);
     996
     997  agroup->setLayout(aLayout);
     998
     999  // Miscellaneous
     1000  // -------------
     1001  QGridLayout* rLayout = new QGridLayout;
     1002  rLayout->setColumnMinimumWidth(0, 14 * ww);
     1003  _miscIntrComboBox->setMaximumWidth(9 * ww);
     1004  _miscPortLineEdit->setMaximumWidth(9 * ww);
     1005
     1006  rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for message types and antenna information or output raw data through TCP/IP port.<br>"), 0, 0, 1, 50);
     1007  rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
     1008  rLayout->addWidget(_miscMountLineEdit, 1, 1, 1, 7);
     1009  rLayout->addWidget(new QLabel("Log latency"), 2, 0);
     1010  rLayout->addWidget(_miscIntrComboBox, 2, 1);
     1011  rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
     1012  rLayout->addWidget(_miscScanRTCMCheckBox, 3, 1);
     1013  rLayout->addWidget(new QLabel("Port"), 4, 0);
     1014  rLayout->addWidget(_miscPortLineEdit, 4, 1);
     1015  rLayout->addWidget(new QLabel(""), 5, 1);
     1016  rLayout->setRowStretch(6, 999);
     1017
     1018  rgroup->setLayout(rLayout);
     1019
     1020  // PPP
     1021  // ---
     1022  _pppWidgets._dataSource->setMaximumWidth(15 * ww);
     1023  _pppWidgets._corrMount->setMaximumWidth(15 * ww);
     1024  _pppWidgets._biasMount->setMaximumWidth(15 * ww);
     1025  _pppWidgets._nmeaPath->setMaximumWidth(35 * ww);
     1026  _pppWidgets._logPath->setMaximumWidth(15 * ww);
     1027  _pppWidgets._snxtroPath->setMaximumWidth(35 * ww);
     1028  _pppWidgets._snxtroIntr->setMaximumWidth(7 * ww);
     1029  _pppWidgets._snxtroAc->setMaximumWidth(7 * ww);
     1030  _pppWidgets._snxtroSolId->setMaximumWidth(7 * ww);
     1031  _pppWidgets._snxtroSolType->setMaximumWidth(7 * ww);
     1032  _pppWidgets._snxtroCampId->setMaximumWidth(7 * ww);
     1033  _pppWidgets._ionoMount->setMaximumWidth(15 * ww);
     1034
     1035
     1036  QGridLayout* pppLayout1 = new QGridLayout();
     1037  int ir = 0;
     1038  pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
     1039  ++ir;
     1040  pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
     1041  pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
     1042  pppLayout1->addWidget(new QLabel("   Logfile directory"), ir, 4);
     1043  pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 2);
     1044  pppLayout1->addWidget(_pppWidgets._logMode, ir, 7);
     1045  ++ir;
     1046  pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
     1047  pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
     1048  pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
     1049  pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
     1050  pppLayout1->addWidget(new QLabel("   NMEA directory"), ir, 4);
     1051  pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
     1052  ++ir;
     1053  pppLayout1->addWidget(new QLabel("Biases stream"), ir, 0);
     1054  pppLayout1->addWidget(_pppWidgets._biasMount, ir, 1);
     1055  pppLayout1->addWidget(new QLabel("Biases file"), ir, 2);
     1056  pppLayout1->addWidget(_pppWidgets._biasFile, ir, 3);
     1057  pppLayout1->addWidget(new QLabel("   SNX TRO directory"), ir, 4);
     1058  pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
     1059  ++ir;
     1060  pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
     1061  pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
     1062  pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
     1063  pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
     1064  pppLayout1->addWidget(new QLabel("   SNX TRO interval"), ir, 4);
     1065  pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
     1066  pppLayout1->addWidget(new QLabel("   SNX TRO sampling"), ir, 6);
     1067  pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
     1068  ++ir;
     1069  pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
     1070  pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
     1071  pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
     1072  pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
     1073  pppLayout1->addWidget(new QLabel("   SNX TRO AC"), ir, 4);
     1074  pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
     1075  pppLayout1->addWidget(new QLabel("   SNX TRO solution ID"), ir, 6);
     1076  pppLayout1->addWidget(_pppWidgets._snxtroSolId, ir, 7, Qt::AlignRight);
     1077  ++ir;
     1078  pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 0);
     1079  pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1);
     1080  pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 2);
     1081  pppLayout1->addWidget(_pppWidgets._crdFile, ir, 3);
     1082  pppLayout1->addWidget(new QLabel("   SNX TRO campaign ID"), ir, 4);
     1083  pppLayout1->addWidget(_pppWidgets._snxtroCampId, ir, 5);
     1084  pppLayout1->addWidget(new QLabel("   SNX TRO solution type"), ir, 6);
     1085  pppLayout1->addWidget(_pppWidgets._snxtroSolType, ir, 7, Qt::AlignRight);
     1086  ++ir;
     1087  pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
     1088  pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
     1089
     1090  pppLayout1->setRowStretch(ir + 1, 999);
     1091  pppGroup1->setLayout(pppLayout1);
     1092
     1093  QGridLayout* pppLayout2 = new QGridLayout();
     1094  ir = 0;
     1095  pppLayout2->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
     1096  ++ir;
     1097  pppLayout2->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
     1098  pppLayout2->addWidget(_pppWidgets._lcGPS, ir, 1);
     1099  pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 2);
     1100  pppLayout2->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
     1101  pppLayout2->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8 * ww);
     1102  pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 5);
     1103  pppLayout2->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
     1104  pppLayout2->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8 * ww);
     1105  ++ir;
     1106  pppLayout2->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
     1107  pppLayout2->addWidget(_pppWidgets._lcGLONASS, ir, 1);
     1108  pppLayout2->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
     1109  pppLayout2->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8 * ww);
     1110  pppLayout2->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
     1111  pppLayout2->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8 * ww);
     1112  ++ir;
     1113  pppLayout2->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
     1114  pppLayout2->addWidget(_pppWidgets._lcGalileo, ir, 1);
     1115  pppLayout2->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
     1116  pppLayout2->addWidget(_pppWidgets._eleWgtCode, ir, 4);
     1117  pppLayout2->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
     1118  pppLayout2->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
     1119  ++ir;
     1120  pppLayout2->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
     1121  pppLayout2->addWidget(_pppWidgets._lcBDS, ir, 1);
     1122  pppLayout2->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
     1123  pppLayout2->addWidget(_pppWidgets._minObs, ir, 4);
     1124  pppLayout2->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
     1125  pppLayout2->addWidget(_pppWidgets._minEle, ir, 7); _pppWidgets._minEle->setMaximumWidth(8 * ww);
     1126  ++ir;
     1127  pppLayout2->addWidget(new QLabel("Constraints"), ir, 0, Qt::AlignLeft);
     1128  pppLayout2->addWidget(_pppWidgets._constraints, ir, 1);
     1129  pppLayout2->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
     1130  pppLayout2->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8 * ww);
     1131  pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 5);
     1132  pppLayout2->addWidget(new QLabel("Wait for clock corr."), ir, 6, Qt::AlignLeft);
     1133  pppLayout2->addWidget(_pppWidgets._corrWaitTime, ir, 7);
     1134  ++ir;
     1135  pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 2);
     1136  pppLayout2->addWidget(new QLabel("Max Res GIM"), ir, 3, Qt::AlignLeft);
     1137  pppLayout2->addWidget(_pppWidgets._maxResGIM, ir, 4); _pppWidgets._maxResGIM->setMaximumWidth(8 * ww);
     1138  pppLayout2->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
     1139  pppLayout2->addWidget(_pppWidgets._seedingTime, ir, 7); _pppWidgets._seedingTime->setMaximumWidth(8 * ww);
     1140  ++ir;
     1141  QFrame* hLine = new QFrame();
     1142  hLine->setFrameShape(QFrame::HLine);
     1143  hLine->setFrameShadow(QFrame::Sunken);
     1144  pppLayout2->addWidget(hLine, ir, 0, 2, 8);
     1145  ++ir;
     1146  ++ir;
     1147  pppLayout2->addWidget(new QLabel("Amb. Res."), ir, 0);
     1148  QHBoxLayout* pL1 = new QHBoxLayout();
     1149  pL1->setSpacing(0);
     1150  pL1->setContentsMargins(0,0,0,0);
     1151  pL1->addWidget(new QLabel("GPS"));
     1152  pL1->addWidget(_pppWidgets._arGPS);
     1153  QHBoxLayout* pL2 = new QHBoxLayout();
     1154  pL2->setSpacing(0);
     1155  pL2->setContentsMargins(0,0,0,0);
     1156  pL2->addWidget(new QLabel("Gal"));
     1157  pL2->addWidget(_pppWidgets._arGalileo);
     1158  QHBoxLayout* pL3 = new QHBoxLayout();
     1159  pL3->setSpacing(0);
     1160  pL3->setContentsMargins(0,0,0,0);
     1161  pL3->addWidget(new QLabel("BDS"));
     1162  pL3->addWidget(_pppWidgets._arBDS);
     1163  QHBoxLayout* arLayout = new QHBoxLayout();
     1164  arLayout->addLayout(pL1);
     1165  arLayout->addLayout(pL2);
     1166  arLayout->addLayout(pL3);
     1167  pppLayout2->addLayout(arLayout, ir, 1);
     1168  ++ir;
     1169  _pppWidgets._arMinNumEpo->setMaximumWidth(8 * ww);
     1170  _pppWidgets._arMinNumSat->setMaximumWidth(8 * ww);
     1171  _pppWidgets._arMaxFrac->setMaximumWidth(8 * ww);
     1172  _pppWidgets._arMaxSig->setMaximumWidth(8 * ww);
     1173  QHBoxLayout* pAR = new QHBoxLayout();
     1174  pAR->addWidget(new QLabel("Min # Epo"));
     1175  pAR->addWidget(_pppWidgets._arMinNumEpo);
     1176  pAR->addStretch();
     1177  pAR->addWidget(new QLabel("Min # Sat"));
     1178  pAR->addWidget(_pppWidgets._arMinNumSat);
     1179  pAR->addStretch();
     1180  pAR->addWidget(new QLabel("Max Frac"));
     1181  pAR->addWidget(_pppWidgets._arMaxFrac);
     1182  pAR->addStretch();
     1183  pAR->addWidget(new QLabel("Max Sig"));
     1184  pAR->addWidget(_pppWidgets._arMaxSig);
     1185  pAR->addStretch();
     1186  pAR->addWidget(new QLabel("Use Yaw"));
     1187  pAR->addWidget(_pppWidgets._arUseYaw);
     1188  pppLayout2->addLayout(pAR, ir, 0, 1, 8);
     1189  ++ir;
     1190  pppLayout2->addWidget(new QLabel(""), ir, 8);
     1191  pppLayout2->setColumnStretch(8, 999);
     1192 
     1193  pppGroup2->setLayout(pppLayout2);
     1194
     1195  QVBoxLayout* pppLayout3 = new QVBoxLayout();
     1196  pppLayout3->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
     1197  pppLayout3->addWidget(_pppWidgets._staTable, 99);
     1198  QHBoxLayout* pppLayout3sub = new QHBoxLayout();
     1199  pppLayout3sub->addWidget(_pppWidgets._addStaButton);
     1200  pppLayout3sub->addWidget(_pppWidgets._delStaButton);
     1201  pppLayout3sub->addStretch(99);
     1202
     1203  pppLayout3->addLayout(pppLayout3sub);
     1204
     1205  pppGroup3->setLayout(pppLayout3);
     1206
     1207  // ------------------------
     1208  connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
     1209  _pppWidgets._mapSpeedSlider->setMinimumWidth(33 * ww);
     1210  _pppWidgets._audioResponse->setMaximumWidth(8 * ww);
     1211
     1212  QGridLayout* pppLayout4 = new QGridLayout();
     1213  ir = 0;
     1214  pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
     1215  ++ir;
     1216  pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
     1217  pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
     1218  pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
     1219  pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
     1220  pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
     1221  ++ir;
     1222  pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
     1223  pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
     1224  ++ir;
     1225  pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
     1226  pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
     1227  pppLayout4->addWidget(new QLabel("Size    "), ir, 2, Qt::AlignLeft);
     1228  pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
     1229  pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
     1230  ++ir;
     1231  pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
     1232  pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
     1233  ++ir;
     1234  pppLayout4->addWidget(new QLabel(""), ir, 1);
     1235  pppLayout4->setRowStretch(ir, 999);
     1236
     1237  pppGroup4->setLayout(pppLayout4);
     1238
     1239  // Reqc Processing
     1240  // ---------------
     1241  _reqcActionComboBox = new QComboBox();
     1242  _reqcActionComboBox->setEditable(false);
     1243  _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
     1244  int ip = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
     1245  if (ip != -1) {
     1246    _reqcActionComboBox->setCurrentIndex(ip);
     1247  }
     1248  connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString&)),
     1249          this, SLOT(slotBncTextChanged()));
     1250
     1251  QGridLayout* reqcLayout = new QGridLayout;
     1252  _reqcActionComboBox->setMinimumWidth(15 * ww);
     1253  _reqcActionComboBox->setMaximumWidth(20 * ww);
     1254
     1255  _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
     1256  _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
     1257
     1258  _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
     1259  _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
     1260  _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
     1261  _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
     1262  _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
     1263  _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
     1264  _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
     1265
     1266  connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString&)),
     1267          this, SLOT(slotBncTextChanged()));
     1268
     1269  _reqcLogSummaryOnly = new QCheckBox();
     1270  _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
     1271
     1272  ir = 0;
     1273  reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"), ir, 0, 1, 8);
     1274  ++ir;
     1275  reqcLayout->addWidget(new QLabel("Action"), ir, 0);
     1276  reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
     1277  _reqcEditOptionButton = new QPushButton("Set Edit Options");
     1278  _reqcEditOptionButton->setMinimumWidth(15 * ww);
     1279  _reqcEditOptionButton->setMaximumWidth(20 * ww);
     1280
     1281  reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
     1282  ++ir;
     1283  reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
     1284  reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
     1285  _reqcObsFileChooser->setMaximumWidth(40 * ww);
     1286  reqcLayout->addWidget(new QLabel("  Obs"), ir, 2);
     1287  reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
     1288  _reqcNavFileChooser->setMaximumWidth(40 * ww);
     1289  reqcLayout->addWidget(new QLabel("  Nav"), ir, 4);
     1290  ++ir;
     1291  reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
     1292  reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
     1293  _reqcOutObsLineEdit->setMaximumWidth(40 * ww);
     1294  reqcLayout->addWidget(new QLabel("  Obs"), ir, 2);
     1295  reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
     1296  _reqcOutNavLineEdit->setMaximumWidth(40 * ww);
     1297  reqcLayout->addWidget(new QLabel("  Nav"), ir, 4);
     1298  ++ir;
     1299  reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
     1300  reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
     1301  _reqcOutLogLineEdit->setMaximumWidth(40 * ww);
     1302  reqcLayout->addWidget(new QLabel("  Summary only"), ir, 2);
     1303  reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
     1304  ++ir;
     1305  reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
     1306  reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
     1307  _reqcSkyPlotSignals->setMaximumWidth(40 * ww);
     1308  ++ir;
     1309  reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
     1310  reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
     1311  _reqcPlotDirLineEdit->setMaximumWidth(40 * ww);
     1312  ++ir;
     1313  reqcLayout->setRowStretch(ir, 999);
     1314
     1315  reqcLayout->setColumnMinimumWidth(2, 8 * ww);
     1316  reqcLayout->setColumnMinimumWidth(4, 8 * ww);
     1317
     1318  reqcgroup->setLayout(reqcLayout);
     1319
     1320  connect(_reqcEditOptionButton, SIGNAL(clicked()),
     1321          this, SLOT(slotReqcEditOption()));
     1322
     1323  QGridLayout* sp3CompLayout = new QGridLayout;
     1324
     1325  _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
     1326  _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
     1327  _sp3CompFileChooser->setMinimumWidth(15 * ww);
     1328  _sp3CompFileChooser->setMaximumWidth(40 * ww);
     1329
     1330  _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
     1331  _sp3CompExclude->setMinimumWidth(18 * ww);
     1332  _sp3CompExclude->setMaximumWidth(18 * ww);
     1333
     1334  _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
     1335  _sp3CompLogLineEdit->setMinimumWidth(18 * ww);
     1336  _sp3CompLogLineEdit->setMaximumWidth(18 * ww);
     1337
     1338  _sp3CompSummaryOnly = new QCheckBox();
     1339  _sp3CompSummaryOnly->setCheckState(Qt::CheckState(settings.value("sp3CompSummaryOnly").toInt()));
     1340
     1341  ir = 0;
     1342  sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
     1343  ++ir;
     1344  sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
     1345  sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
     1346  ++ir;
     1347  sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
     1348  sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
     1349  ++ir;
     1350  sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
     1351  sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
     1352  ++ir;
     1353  sp3CompLayout->addWidget(new QLabel("Summary only"), ir, 0);
     1354  sp3CompLayout->addWidget(_sp3CompSummaryOnly, ir, 1);
     1355  ++ir;
     1356  sp3CompLayout->addWidget(new QLabel(""), ir, 1);
     1357  ++ir;
     1358  sp3CompLayout->setRowStretch(ir, 999);
     1359
     1360  sp3CompLayout->setColumnMinimumWidth(2, 8 * ww);
     1361  sp3CompLayout->setColumnMinimumWidth(4, 8 * ww);
     1362
     1363  sp3CompGroup->setLayout(sp3CompLayout);
     1364
     1365  connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString&)),
     1366          this, SLOT(slotBncTextChanged()));
     1367
     1368  // Combine Corrections
     1369  // -------------------
     1370  QGridLayout* cmbLayout = new QGridLayout;
     1371
     1372  populateCmbTable();
     1373  cmbLayout->addWidget(_cmbTable, 0, 0, 8, 10);
     1374  cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams"), 0, 10, 1, 10);
     1375  cmbLayout->addWidget(addCmbRowButton, 1, 10);
     1376  cmbLayout->addWidget(delCmbRowButton, 1, 11);
     1377  cmbLayout->addWidget(new QLabel("Method"), 2, 10, Qt::AlignLeft);
     1378  cmbLayout->addWidget(_cmbMethodComboBox, 2, 11);
     1379  cmbLayout->addWidget(new QLabel("BSX File"), 3, 10, Qt::AlignLeft);
     1380  cmbLayout->addWidget(_cmbBsxFile, 3, 11, Qt::AlignRight);
     1381  cmbLayout->addWidget(new QLabel("Max Clk Residual"), 4, 10, Qt::AlignLeft);
     1382  cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 11, Qt::AlignRight);
     1383  cmbLayout->addWidget(new QLabel("Max Orb Displacement"), 5, 10, Qt::AlignLeft);
     1384  cmbLayout->addWidget(_cmbMaxdisplacementLineEdit, 5, 11, Qt::AlignRight);
     1385  cmbLayout->addWidget(new QLabel("Logfile directory"), 6, 10, Qt::AlignLeft);
     1386  cmbLayout->addWidget(_cmbLogPath, 6, 11, Qt::AlignRight);
     1387  cmbLayout->addWidget(new QLabel("Sampling"), 7, 10, Qt::AlignLeft);
     1388  cmbLayout->addWidget(_cmbSamplComboBox, 7, 11, Qt::AlignRight);
     1389
     1390
     1391  cmbLayout->addWidget(new QLabel("GNSS"), 0, 14, Qt::AlignLeft);
     1392  cmbLayout->addWidget(new QLabel("GPS (C1W/C2W)"), 1, 14);
     1393  cmbLayout->addWidget(_cmbGpsCheckBox, 1, 15);
     1394
     1395  cmbLayout->addWidget(new QLabel("GLONASS (C1P/C2P)"), 2, 14);
     1396  cmbLayout->addWidget(_cmbGloCheckBox, 2, 15);
     1397
     1398  cmbLayout->addWidget(new QLabel("Galileo (C1C/C5Q)"), 3, 14);
     1399  cmbLayout->addWidget(_cmbGalCheckBox, 3, 15);
     1400
     1401  cmbLayout->addWidget(new QLabel("Beidou (C2I/C6I)"), 4, 14);
     1402  cmbLayout->addWidget(_cmbBdsCheckBox, 4, 15);
     1403
     1404  cmbLayout->addWidget(new QLabel("QZSS (C1C/C2L)"), 5, 14);
     1405  cmbLayout->addWidget(_cmbQzssCheckBox, 5, 15);
     1406
     1407  cmbLayout->addWidget(new QLabel("SBAS (C1C/C5Q)"), 6, 14);
     1408  cmbLayout->addWidget(_cmbSbasCheckBox, 6, 15);
     1409
     1410  cmbLayout->addWidget(new QLabel("NavIC"), 7, 14);
     1411  cmbLayout->addWidget(_cmbNavicCheckBox, 7, 15);
     1412  cmbLayout->setRowStretch(9, 999);
     1413
     1414  connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
     1415  connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
     1416
     1417  cmbgroup->setLayout(cmbLayout);
     1418
     1419  // Upload Layout (Clocks)
     1420  // ----------------------
     1421  QGridLayout* uploadHlpLayout = new QGridLayout();
     1422
     1423  connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
     1424  connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
     1425  connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
     1426
     1427  uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
     1428  uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
     1429  uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
     1430  uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
     1431  uploadHlpLayout->addWidget(new QLabel("     Sampling:    Orb"), 0, 4, Qt::AlignRight);
     1432  uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrComboBox, 0, 5);
     1433  uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
     1434  uploadHlpLayout->addWidget(_uploadSamplSp3ComboBox, 0, 7);
     1435  uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
     1436  uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
     1437  uploadHlpLayout->addWidget(new QLabel("BSX"), 0, 10, Qt::AlignRight);
     1438  uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox, 0, 11);
     1439  uploadHlpLayout->addWidget(setUploadTrafoButton, 0, 12);
     1440  uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
     1441  uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
     1442
     1443  QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
     1444  populateUploadTable();
     1445
     1446  uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to Broadcaster.<br>"));
     1447  uploadLayout->addWidget(_uploadTable);
     1448  uploadLayout->addLayout(uploadHlpLayout);
     1449
     1450  uploadgroup->setLayout(uploadLayout);
     1451
     1452  // Upload Layout (Ephemeris)
     1453  // -------------------------
     1454  QGridLayout* uploadHlpLayoutEph = new QGridLayout();
     1455
     1456  connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
     1457  connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
     1458
     1459  uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
     1460  uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
     1461  uploadHlpLayoutEph->addWidget(new QLabel("     Sampling"), 0, 2, Qt::AlignRight);
     1462  uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
     1463
     1464  QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
     1465  populateUploadEphTable();
     1466
     1467  uploadLayoutEph->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Ephemeris to Broadcaster.<br>"));
     1468  uploadLayoutEph->addWidget(_uploadEphTable);
     1469  uploadLayoutEph->addLayout(uploadHlpLayoutEph);
     1470
     1471  uploadEphgroup->setLayout(uploadLayoutEph);
     1472
     1473
     1474  // Upload Layout (Raw Data)
     1475  // -------------------------
     1476  QGridLayout* uploadHlpLayoutRaw = new QGridLayout();
     1477
     1478  connect(addUploadRawRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRawRow()));
     1479  connect(delUploadRawRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRawRow()));
     1480
     1481  uploadHlpLayoutRaw->addWidget(addUploadRawRowButton, 0, 0);
     1482  uploadHlpLayoutRaw->addWidget(delUploadRawRowButton, 0, 1);
     1483
     1484  QBoxLayout* uploadLayoutRaw = new QBoxLayout(QBoxLayout::TopToBottom);
     1485  populateUploadRawTable();
     1486
     1487  uploadLayoutRaw->addWidget(new QLabel("Upload Raw Data to Broadcaster (Ntrip Server Functionality).<br>"));
     1488  uploadLayoutRaw->addWidget(_uploadRawTable);
     1489  uploadLayoutRaw->addLayout(uploadHlpLayoutRaw);
     1490
     1491  uploadRawgroup->setLayout(uploadLayoutRaw);
     1492
     1493  // Main Layout
     1494  // -----------
     1495  QGridLayout* mLayout = new QGridLayout;
     1496  _aogroup->setCurrentIndex(settings.value("startTab").toInt());
     1497  mLayout->addWidget(_aogroup, 0, 0);
     1498  mLayout->addWidget(_mountPointsTable, 1, 0);
     1499  _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
     1500  mLayout->addWidget(_loggroup, 2, 0);
     1501
     1502  _canvas->setLayout(mLayout);
     1503
     1504  // WhatsThis, Network
     1505  // ------------------
     1506  _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you may 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. Without any entry, BNC will try to use the system proxies. </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 this is not possible, you may need to run BNC outside your LAN on a network that has unobstructed connection to the Internet. <i>[key: proxyHost]</i></p>"));
     1507  _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC. <i>[key: proxyPort]</i></p>"));
     1508  _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an Ntrip Broadcaster over SSL requires the exchange of server certificates. Specify the path to a directory where you save CA certificates on your system. </p><p>BNC creates from *.crt and *.pem files a CA certificate database, which is used by the socket during the handshake phase to validate the peer's certificate. </p><p>Note that SSL communication is usually done over port 443. <i>[key: sslCaCertPath]</i></p>"));
     1509  _sslClientCertPathLineEdit->setWhatsThis(tr("<p>Two-sided communication with an Ntrip Broadcaster over SSL requires in addition the exchange of client certificates. Specify the full path to the client certificates on your system.</p><p></p><p>The file naming convention for client certificates in BNC is as follows: &lt;hostname&gt;.&lt;port&gt;.crt for the certificate and &lt;hostname&gt;.&lt;port&gt;.key for the private key, where &lt;hostname&gt; is without https://. </p><p> If available, the client or personal authentication certificate is presented to the peer during the SSL handshake process. Password protected key files are not supported. </p><p>Don't try communication via two sided SSL if you are not sure whether this is supported by the involved Ntrip Broadcaster. </p><p>Note that SSL communication is usually done over port 443. <i>[key: sslClientCertPath]</i></p>"));
     1510  _sslIgnoreErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the Ntrip Broadcaster. Tick 'Ignore SSL authorization errors' if you don't want to be bothered with this. <i>[key: sslIgnoreErrors]</i></p>"));
     1511
     1512  // WhatsThis, General
     1513  // ------------------
     1514  _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 for that 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. <i>[key: logFile]</i></p>"));
     1515  _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and file content already available under the same name will be overwritten. However, users might want to append already existing files following a regular restart or a crash of BNC or its platform.</p><p>Tick 'Append files' to continue with existing files and keep what has been recorded so far. <i>[key: rnxAppend]</i></p>"));
     1516  _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. The default entry is 'no' that means the reread function is switched of. <p></p>Select '1 min', '5 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, five minutes, 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 via button 'Save & Reread Configuration'. <i>[key: onTheFlyInterval]</i></p>"));
     1517  _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options. <i>[key: autoStart]</i></p>"));
     1518  _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p><p>This option is primarily meant for debugging purposes. <i>[key: rawOutFile]</i></p>"));
     1519
     1520  // WhatsThis, RINEX Observations
     1521  // -----------------------------
     1522  _rnxPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where the RINEX Observation files will be stored.</p><p>If the specified directory does not exist, BNC will not create RINEX Observation files. <i>[key: rnxPath]</i></p>"));
     1523  _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
     1524  _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
     1525  _rnxSkelExtComboBox->setWhatsThis(tr("<p>BNC allows using personal RINEX skeleton files that contain the RINEX header records you would like to include. You can derive a skeleton file from information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' skl or SKL is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream. <i>[key: rnxSkel]</i></p>"));
     1526  _rnxSkelPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where local skeleton files are located.</p><p> If no directory is specified, the path is assumed to where the RINEX Observation files will stored. <i>[key: rnxSkelPath]</i></p>"));
     1527  _rnxFileCheckBox->setWhatsThis(tr("<p>Tick check box 'Skeleton mandatory' in case you want that RINEX files are only produced if skeleton files are available for BNC. If no skeleton file is available for a particular source then no RINEX Observation file will be produced from the affected stream.</p><p>Note that a skeleton file contains RINEX header information such as receiver and antenna types. In case of stream conversion to RINEX Version 3, a skeleton file should also contain information on potentially available observation types. A missing skeleton file will therefore enforce BNC to only save a default set of RINEX 3 observation types. <i>[key: rnxOnlyWithSKL]</i></p>"));
     1528  _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is finally saved, you may want to compress, copy or upload it immediately, for example via FTP. BNC allows you to execute a script/batch file to carry out such operation.</p><p>Specify the full path of a script or batch file. BNC will pass the full RINEX Observation file path to the script as command line parameter (%1 on Windows systems, $1 on Unix/Linux/Mac systems). <i>[key: rnxScript]</i></p>"));
     1529  _rnxV2Priority->setWhatsThis(tr("<p>Specify a priority list of characters defining signal attributes as defined in RINEX Version 3. Priorities will be used to map observations with RINEX Version 3 attributes from incoming streams to Version 2. The underscore character '_' stands for undefined attributes. A question mark '?' can be used as wildcard which represents any one character.</p><p>Signal priorities can be specified as equal for all systems, as system specific or as system and freq. specific. For example: </li><ul><li>'CWPX_?' (General signal priorities valid for all GNSS) </li><li>'I:ABCX' (System specific signal priorities for NavIC) </li><li>'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX' (System and frequency specific signal priorities) </li></ul>Default is the following priority list 'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX'. <i>[key: rnxV2Priority]</i></p>"));
     1530  _rnxVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Observation files. <i>[key: rnxVersion]</i></p>"));
     1531
     1532  // WhatsThis, RINEX Ephemeris
     1533  // --------------------------
     1534  _ephPathLineEdit->setWhatsThis(tr("<p>Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files.</p><p>If the specified directory does not exist, BNC will not create RINEX Navigation files. <i>[key: ephPath]</i></p>"));
     1535  _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
     1536  _ephOutPortLineEdit->setWhatsThis(tr("<p>BNC can produce ephemeris data in RINEX Navigation ASCII format on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: ephOutPort]</i></p>"));
     1537  _ephVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Navigation files. <i>[key: ephVersion]</i></p>"));
     1538  //_ephFilePerStation->setWhatsThis(tr("<p>By default, all received Broadcast Ephemeris data will be stored within one File. Thick 'File per Stations' to get separate files per station/mountpoint. <i>[key: ephFilePerStation]</i></p>"));
     1539
     1540  // WhatsThis, RINEX Editing & QC
     1541  // -----------------------------
     1542  _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to 'Edit or Concatenate' RINEX Version 2 or 3 files or to perform a Quality Check (QC) and 'Analyze' data following UNAVCO's famous 'teqc' program. <i>[key: reqcAction]</i></p>"));
     1543  _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
     1544  _reqcObsFileChooser->setWhatsThis(tr("<p>Specify the full path to input observation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX observation file is mandatory. <i>[key: reqcObsFile]</i></p>"));
     1545  _reqcNavFileChooser->setWhatsThis(tr("<p>Specify the full path to input navigation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX navigation file is mandatory. <i>[key: reqcNavFile]</i></p>"));
     1546  _reqcOutObsLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Observation output file.</p><p>Default is an empty option field, meaning that no RINEX Observation output file will be produced. <i>[key: reqcOutObsFile]</i></p>"));
     1547  _reqcOutNavLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Navigation output file.</p><p>Default is an empty option field, meaning that no RINEX Navigation output file will be produced. <i>[key: reqcOutNavFile]</i></p>"));
     1548  _reqcOutLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile.</p><p>Default is an empty option field, meaning that no 'RINEX Editing & QC' logfile will be produced. <i>[key: reqcOutLogFile]</i></p>"));
     1549  _reqcLogSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from editing or analyzing RINEX data. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: reqcLogSummaryOnly]</i></p>"));
     1550  _reqcPlotDirLineEdit->setWhatsThis(tr("<p>Specify a directory for saving plots in PNG format.</p><p>Default is an empty option field, meaning that plots will not be saved on disk. <i>[key: reqcPlotDir]</i></p>"));
     1551  _reqcSkyPlotSignals->setWhatsThis(tr("<p>BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values. The 'Plots for signals' option lets you exactly specify observation signals to be used for that and also enables the plot generation. You can specify the navigation system, the frequency, and the tracking mode or channel as defined in RINEX Version 3. Specifications for frequency and tracking mode or channel must be separated by ampersand character '&'. Specifications for navigation systems must be separated by blank character ' '.</p><p>Examples for 'Plots for signals' option:<ul><li> G:1&2&5 R:1&2&3 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
     1552
     1553  // WhatsThis, SP3 Comparison
     1554  // -------------------------
     1555  _sp3CompFileChooser->setWhatsThis(tr("<p>BNC can compare two SP3 files containing GNSS satellite orbit and clock information.</p></p>Specify the full path to two files with orbits and clocks in SP3 format, separate them by comma. <i>[key: sp3CompFile]</i></p>"));
     1556  _sp3CompExclude->setWhatsThis(tr("<p>Specify satellites to exclude them from orbit and clock comparison. Example:<p>G04,G31,R</p><p>This excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from the comparison.</p><p>Default is an empty option field, meaning that no satellite is excluded from the comparison. <i>[key: sp3CompExclude]</i></p>"));
     1557  _sp3CompLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile saving comparison results.</p><p>Specifying a logfile is mandatory. Comparing SP3 files and not saving comparison results on disk would be useless. <i>[key: sp3CompOutLogFile]</i></p>"));
     1558  _sp3CompSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from comparing SP3 files. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: sp3CompSummaryOnly]</i></p>"));
     1559
     1560  // WhatsThis, Broadcast Corrections
     1561  // --------------------------------
     1562  _corrPathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving Broadcast Ephemeris Correction files.</p><p>If the specified directory does not exist, BNC will not create the files. <i>[key: corrPath]</i></p>"));
     1563  _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
     1564  _corrPortLineEdit->setWhatsThis(tr("<p>BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: corrPort]</i></p>"));
     1565
     1566  // WhatsThis, Feed Engine
     1567  // ----------------------
     1568  _outPortLineEdit->setWhatsThis(tr("<p>BNC can produce synchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outPort]</i></p>"));
     1569  _outWaitSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full obs epoch' seconds.</p><p>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 product. <i>[key: outWait]</i></p>"));
     1570  _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
     1571  _outFileLineEdit->setWhatsThis(tr("<p>Specify the full path to a file where synchronized observations are saved in plain ASCII format.</p><p>Beware that the size of this file can rapidly increase depending on the number of incoming streams. <i>[key: outFile]</i></p>"));
     1572  _outUPortLineEdit->setWhatsThis(tr("<p>BNC can produce unsynchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outUPort]</i></p>"));
     1573  _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
     1574
     1575  // WhatsThis, Serial Output
     1576  // ------------------------
     1577  _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p><p>Depending on the stream content, the receiver may use it for example for Differential GNSS, Precise Point Positioning or any other purpose supported by its firmware. <i>[key: serialMountPoint]</i></p>"));
     1578  _serialPortNameLineEdit->setWhatsThis(tr("<p>Enter the serial 'Port name' selected for communication with your serial connected receiver. Valid port names are e.g.</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 before you start BNC, you must plug a serial cable in the port defined here. <i>[key: serialPortName]</i></p>"));
     1579  _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. Using a high baud rate is recommended. <i>[key: serialBaudRate]</i></p>"));
     1580  _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. <i>[key: serialFlowControl]</i></p>"));
     1581  _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. <i>[key: serialDataBits]</i></p>"));
     1582  _serialParityComboBox->setWhatsThis(tr("<p>Select a 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. The parity is often set to 'NONE'. <i>[key: serialParity]</i></p>"));
     1583  _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. <i>[key: serialStopBits]</i></p>"));
     1584  _serialAutoNMEAComboBox->setWhatsThis(tr("<p>The 'NMEA' option supports the so-called 'Virtual Reference Station' (VRS) concept which requires the receiver to send approximate position information to the Ntrip Broadcaster. Select 'no' if you don't want BNC to forward or upload any NMEA message to the Ntrip Broadcaster in support of VRS.</p><p>Select 'Auto' to automatically forward NMEA messages of type GGA from your serial connected receiver to the Ntrip Broadcaster and/or save them in a file.</p><p>Select 'Manual GPGGA' or 'Manual GNGGA' if you want BNC to produce and upload GPGGA or GNGGA NMEA messages to the Ntrip Broadcaster because your serial connected receiver doesn't generate these messages. A Talker ID 'GP' preceding the GGA string stands for GPS solutions while a Talker ID 'GN' stands for multi constellation solutions.</p><p>Note that selecting 'Auto' or 'Manual' works only for VRS streams which show up under the 'Streams' canvas on BNC's main window with 'nmea' stream attribute set to 'yes'. This attribute is either extracted from the Ntrip Broadcaster's source-table or introduced by the user via editing the BNC configuration file. <i>[key: serialAutoNMEA]</i></p>"));
     1585  _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p><p>Default is an empty option field, meaning that NMEA messages will not be saved on disk. <i>[key: serialFileNMEA]</i></p>"));
     1586  _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meters for the reference station introduced by option 'Mountpoint'. Together with the latitude and longitude from the source-table, the height information is used to build GGA messages to be sent to the Ntrip Broadcaster.</p><p>For adjusting latitude and longitude values of a VRS stream given in the 'Streams' canvas, you can double click the latitude/longitude data fields, specify appropriate values and then hit Enter.</p><p>This option is only relevant when option 'NMEA' is set to 'Manual GPGGA' or 'Manual GNGGA' respectively. <i>[key: serialHeightNMEA]</i></p>"));
     1587  _serialNMEASamplingSpinBox->setWhatsThis(tr("<p>Select a sampling interval in seconds for manual or receiver generated NMEA GGA sentences and their upload.</p><p>A sampling rate of '0' means, a GGA sentence will be send only once to initialize the requested VRS stream. Note that some VRS systems need GGA sentences at regular intervals. <i>[key: serialNMEASampling]</i></p>"));
     1588
     1589  // WhatsThis, Outages
     1590  // ------------------
     1591  _adviseObsRateComboBox->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><p>Default is an empty option field, meaning that you don't want BNC to report on stream failures or recoveries when exceeding a threshold time span. <i>[key: adviseObsRate]</i></p>"));
     1592  _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. <i>[key: adviseFail]</i></p>"));
     1593  _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. <i>[key: adviseReco]</i></p>"));
     1594  _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 a comment '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.</p><p>An empty option field (default) or invalid path means that you don't want to use this option. <i>[key: adviseScript]</i></p>"));
     1595
     1596  // WhatsThis, Miscellaneous
     1597  // ------------------------
     1598  _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. <i>[key: miscMount]</i></p>"));
     1599  _miscIntrComboBox->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. <i>[key: miscIntr]</i></p>"));
     1600  _miscScanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incoming message types as well as contained antenna coordinates, antenna height, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types. <i>[key: miscScanRTCM]</i></p>"));
     1601  _miscPortLineEdit->setWhatsThis(tr("<p>BNC can output an incoming stream through an IP port of your local host.</p><p>Specify a port number to activate this function. In this case, the stream content remains untouched; BNC does not decode or reformat the data for this output.</p><p> If the decoder string is not an accepted one ('RTCM_2.x', 'RTCM_3.x' and 'RTNET'), please change the decoder string to <ul>"
     1602                                     "<li> 'ZERO' (forward the raw data) or </li>"
     1603                                     "<li> 'ZERO2FILE' (forward and store the raw data)</li> </ul> in addition. <i>[key: miscPort]</i></p>"));
     1604
     1605  // WhatsThis, PPP (1)
     1606  // ------------------
     1607  _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations. <i>[key: PPP/dataSource]</i></p>"));
     1608  _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
     1609  _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
     1610  _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP. <i>[key: PPP/corrMount]</i></p>"));
     1611  _pppWidgets._ionoMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides VTEC informations in SSR format.</p><p>If you don't specify a corrections stream via this option, BNC will use VTEC informations from the Corrections stream 'mountpoint', if available. <i>[key: PPP/ionoMount]</i></p>"));
     1612  _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP. <i>[key: PPP/corrFile]</i></p>"));
     1613  _pppWidgets._ionoFile->setWhatsThis(tr("<p>Specify the VTEC file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will use VTEC informations from the Corrections file, if available. <i>[key: PPP/ionoFile]</i></p>"));
     1614  _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets and variations</li><li>Satellite APC offsets and variations.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations for satellites and receiver.</p> <i>[key: PPP/antexFile]</i></p>"));
     1615  _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:</p><ul><li>Specify the station either by:<ul><li>the 'Mountpoint' of the station's RTCM stream (in real-time PPP mode), or</li><li>the 9-char station ID of the RINEX Version 3 or 4 Observations file (in post processing PPP mode), or </li><li>the 4-char station ID of the RINEX Version 2 Observations file (in post processing PPP mode).</li></ul><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown). </li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored.. <i>[key: PPP/crdFile]</i></p>"));
     1616  _pppWidgets._blqFile->setWhatsThis(tr("<p>Specify the full path to a 'BLQ file' containing the ocean loading coefficients for different stations. These coefficients can be obtained from the ocean loading service under request trough the web site http://holt.oso.chalmers.se/loading/. <i>[key: PPP/blqFile]</i></p>"));
     1617  _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logfiles shall be produced. <i>[key: PPP/logPath]</i></p>"));
     1618  _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced. <i>[key: PPP/nmeaPath]</i></p>"));
     1619  _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced. <i>[key: PPP/snxtroPath]</i></p>"));
     1620  _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'. <i>[key: PPP/snxtroIntr]</i></p>"));
     1621  _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
     1622  _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
     1623  _pppWidgets._snxtroSolId->setWhatsThis(tr("<p>Specify a 1-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSolId]</i></p>"));
     1624  _pppWidgets._snxtroSolType->setWhatsThis(tr("<p>Specify a 3-character solution type, e.g. real-time (RTS), unknown (UNK), .. <i>[key: PPP/snxtroSolType]</i></p>"));
     1625  _pppWidgets._snxtroCampId->setWhatsThis(tr("<p>Specify a 3-character campaign ID, e.g. operational (OPS), demonstration (DEM), testing (TST), .. <i>[key: PPP/snxtroCampId]</i></p>"));
     1626
     1627  // WhatsThis, PPP (2)
     1628  // ------------------
     1629  _pppWidgets._lcGPS->setWhatsThis(tr("<p>Specify which kind of GPS observations you want to use and on which kind of linear combination the GPS ambiguity resolutions shall be based:</p><p><ul>"
     1630                                      "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
     1631                                      "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
     1632                                      "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
     1633                                      "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
     1634                                      "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
     1635                                      "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
     1636                                      "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
     1637                                      "<li>'no'    means that you don't want BNC to use GPS data.</li></ul></p><p><i>[key: PPP/lcGPS]</i></p>"));
     1638  _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use and on which kind of linear combination the GLONASS ambiguity resolutions shall be based:</p><p><ul>"
     1639                                          "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
     1640                                          "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
     1641                                          "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
     1642                                          "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
     1643                                          "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
     1644                                          "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
     1645                                          "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
     1646                                          "<li>'no'    means that you don't want BNC to use GLONASS data.</li></ul></p><p><i>[key: PPP/lcGLONASS]</i></p>"));
     1647  _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use and on which kind of linear combination the Galileo ambiguity resolutions shall be based:</p><p><ul>"
     1648                                          "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
     1649                                          "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
     1650                                          "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
     1651                                          "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
     1652                                          "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
     1653                                          "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
     1654                                          "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
     1655                                          "<li>'no'    means that you don't want BNC to use Galileo data.</li></ul></p><p><i>[key: PPP/lcGalileo]</i></p>"));
     1656  _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use and on which kind of linear combination the BDS ambiguity resolutions shall be based:</p><p><ul>"
     1657                                      "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
     1658                                      "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
     1659                                      "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
     1660                                      "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
     1661                                      "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
     1662                                      "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
     1663                                      "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
     1664                                      "<li>'no'    means that you don't want BNC to use BDS data.</li></ul></p><p><i>[key: PPP/lcBDS]</i></p>"));
     1665  _pppWidgets._constraints->setWhatsThis(tr("<p>Specify, whether ionospheric constraints in form of pseudo-observations shall be added. Please note, this is only valid, if no ionosphere-free linear-combination is used and only helpful as soon as the ionosphere information is more accurate than the code data accuracy. <i>[key: PPP/constraints]</i></p>"));
     1666  _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS C1 code observations to a PPP solution from combined code and phase data. 1.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma C1 = 1.0' <i>[key: PPP/sigmaC1]</i></p>"));
     1667  _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS L1 phase observations to a PPP solutions from combined code and phase data. 0.01 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma L1 = 0.01' <i>[key: PPP/sigmaL1]</i></p>"));
     1668  _pppWidgets._sigmaGIM->setWhatsThis(tr("<p>Enter a Sigma for GIM pseudo observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GIM pseudo observations to a PPP solution. 5.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 1.0' <i>[key: PPP/sigmaGIM]</i></p>"));
     1669  _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS C1 code observations in a PPP solution. '2.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res C1 = 3.0' <i>[key: PPP/maxResC1]</i></p>"));
     1670  _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS L1 phase observations in a PPP solution. '0.02' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res L1 = 0.03' <i>[key: PPP/maxResL1]</i></p>"));
     1671  _pppWidgets._maxResGIM->setWhatsThis(tr("<p>Specify a maximum for residuals from GIM pseudo observations in a PPP solution. '5.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res GIM = 3.0' <i>[key: PPP/maxResGIM]</i></p>"));
     1672  _pppWidgets._eleWgtCode->setWhatsThis(tr("<p>Tic 'Ele Wgt Code' to use satellite Elevation depending Weights for Code observations in the PPP solution. <i>[key: PPP/eleWgtCode]</i></p>"));
     1673  _pppWidgets._eleWgtPhase->setWhatsThis(tr("<p>Tic 'Ele Wgt Phase' to use satellite Elevation depending Weights for Phase observations in the PPP solution. <i>[key: PPP/eleWgtPhase]</i></p>"));
     1674  _pppWidgets._minObs->setWhatsThis(tr("<p>Select a Minimum Number of Observations per epoch for a PPP solution.</p><p>BNC will only process epochs with observation numbers reaching or exceeding this minimum. <i>[key: PPP/minObs]</i></p>"));
     1675  _pppWidgets._minEle->setWhatsThis(tr("<p>Select a Minimum satellite Elevation for observations.</p><p>BNC will ignore an observation if the associated satellite Elevation does not reach or exceed this minimum.</p><p>Selecting '10 deg' may be an appropriate choice in order to avoid too noisy observations. <i>[key: PPP/minEle]</i></p>"));
     1676
     1677  // WhatsThis, Combine Corrections
     1678  // ------------------------------
     1679  _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock correction streams in real-time to produce, encode, upload and save a combination of correctors coming from different providers. </p><p>To add a line to the 'Combine Corrections' table hit the 'Add Row' button, double click on the 'Mountpoint' field to specify a Broadcast Ephemeris Correction 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. Double click on the 'Weight Factor' field to enter a weight factor to be applied for this stream in the combination. A Factor greater than 1 will enlarge the sigma of the clock pseudo-observations and with it down-weight its contribution. Finally, double click on the 'Exclude Satellites' field and specify satellites, to exclude them for an individual AC. An entry 'G04,G31,R' means to excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from one individual AC. Default is an empty option field, meaning that no satellite is excluded from this individual AC.</p><p>Note that the orbit information in the resulting combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides orbit and clock correction streams BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris Correction stream in the 'Combine Corrections' table. Instead of combining corrections BNC will then add the corrections to the Broadcast Ephemeris with the possibility to save final orbit and clock results in SP3 and/or Clock RINEX format. <i>[key: cmbStreams]</i></p>"));
     1680  addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
     1681  delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
     1682  _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'.</p><p>It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning. <i>[key: cmbMethod]</i></p>"));
     1683  _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Clk 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'. <i>[key: cmbMaxres]</i></p>"));
     1684  _cmbMaxdisplacementLineEdit->setWhatsThis(tr("<p>BNC builds mean values for all incoming orbit corrections per satellite. Individual orbit corrections that differ by more than 'Maximal Orb Displacement' meters from the average of all orbit corrections per satellite will be ignored.<p></p>It is suggested to specify a value of about 0.5 m.</p><p>Default is a value of '2.0'. <i>[key: cmbMaxdisplacement]</i></p>"));
     1685  _cmbSamplComboBox->setWhatsThis(tr("<p>Select a combination Sampling interval for the clocks. Clock corrections will be produced following that interval.</p><p>A value of 10 sec may be an appropriate choice. <i>[key: cmbSampl]</i></p>"));
     1686  _cmbLogPath->setWhatsThis(tr("<p>Specify a directory for saving daily Combination logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no Combination logfiles shall be produced. <i>[key: cmbLogpath]</i></p>"));
     1687  _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGps]</i></p>"));
     1688  _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
     1689  _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
     1690  _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; BDS Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
     1691  _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
     1692  _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
     1693  _cmbNavicCheckBox->setWhatsThis(tr("<p>NavIC clock corrections shall be combined; NavIC Broadcast ephemeris and corrections are required. <i>[key: cmbNavic]</i></p>"));
     1694  _cmbBsxFile->setWhatsThis(tr("<p> Specify a Bias SINEX File that will be used to add satellite code biases to the combined clocks. <i>[key: cmbBsxFile]</i></p>"));
     1695
     1696  // WhatsThis, Upload Corrections
     1697  // -----------------------------
     1698  _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) as well as Code Biases in different SSR formats. You may have a situation where clocks, orbits and code biases come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified Ntrip Broadcaster Host and Port</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris Corrections if you specify correction streams in the 'Combine Corrections' table.</p><p>To fill the 'Upload Corrections' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference System (e.g. IGS20) for outgoing clock and orbit corrections.</p><p>Select a target SSR format (e.g. IGS-SSR) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.SP3.</p><p>Specify a path for saving generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.CLK.</p><p>Specify a path for saving generated Code Biases as SINEX Bias files. If the specified directory does not exist, BNC will not create SINEX Bias files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.BIA.</p><p>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
     1699  addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
     1700  delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
     1701  _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
     1702  _uploadSamplRtcmEphCorrComboBox->setWhatsThis(tr("<p>Select a stream's orbit correction sampling interval in seconds.</p><p>A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages. <i>[key: uploadSamplRtcmEphCorr]</i></p>"));
     1703  _uploadSamplSp3ComboBox->setWhatsThis(tr("<p>Select a SP3 orbit file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into SP3 orbit files. <i>[key: uploadSamplSp3]</i></p>"));
     1704  _uploadSamplClkRnxSpinBox->setWhatsThis(tr("<p>Select a Clock RINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Clock RINEX files. <i>[key: uploadSamplClkRnx]</i></p>"));
     1705  _uploadSamplBiaSnxSpinBox->setWhatsThis(tr("<p>Select a Bias SINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Bias SINEX files. <i>[key: uploadSamplBiaSnx]</i></p>"));
     1706  setUploadTrafoButton->setWhatsThis(tr("<p>Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation via option 'System'.</p>"));
     1707  _uploadAntexFile->setWhatsThis(tr("<p>When producing SP3 files or referring orbit and clock corrections to the satellite's Center of Mass (CoM) instead Antenna Phase Center (APC), an offset has to be applied which is available from the IGS 'ANTEX file'. You must therefore specify an 'ANTEX file' path if you want to save the stream content in SP3 format and/or refer correctors to CoM.</p><p>If you don't specify an 'ANTEX file' path, the SP3 file content as well as the orbit and clock correctors will be referred to satellite APCs. <i>[key: uploadAntexFile]</i></p>"));
     1708
     1709  // WhatsThis, Upload Ephemeris
     1710  // ---------------------------
     1711  _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. </p><p>To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphMountpointsOut]</i></p>"));
     1712  addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
     1713  delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
     1714  _uploadSamplRtcmEphSpinBox->setWhatsThis(tr("<p>Select the Broadcast Ephemeris sampling interval in seconds.</p><p>Default is '5', meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds. <i>[key: uploadSamplRtcmEph]</i></p>"));
     1715
     1716  // WhatsThis, Upload Raw Data
     1717  // ---------------------------
     1718  _uploadRawTable->setWhatsThis(tr("<p>BNC can upload Raw Data streams in any format like a NtripServer. </p><p>To fill the 'Upload Raw Data' table, hit the 'Add Row' button and double click on the 'Source Mountpoint' field to enter the Source of data from the 'Streams' section below, which shall be forwarded without decoding and hit Enter. Double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Upload Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the stream upload mountpoint and password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. </p><p> If the decoder string is not an accepted one ('RTCM_2.x', 'RTCM_3.x' and 'RTNET'), please change the decoder string to <ul>"
     1719                                   "<li> 'ZERO' (forward the raw data) or </li>"
     1720                                   "<li> 'ZERO2FILE' (forward and store the raw data)</li> </ul> in addition <i>[key: uploadRawMountpointsOut]</i></p>"));
     1721  addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Raw Data' table.</p>"));
     1722  delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Raw Data' table.</p>"));
     1723
     1724
     1725  // WhatsThis, Streams Canvas
     1726  // -------------------------
     1727  _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. "
     1728                                     "Clicking on 'Add Stream' button opens a window that allows the user to select data streams from an Ntrip Broadcaster "
     1729                                     "according to their mountpoints. To remove a stream from the 'Streams' list, highlight it by clicking on it "
     1730                                     "and hit the 'Delete Stream' button. You can also remove multiple streams by highlighting them using +Shift and +Ctrl.</p><p>"
     1731                                     "BNC automatically allocates one of its internal decoders to a stream based on the stream's 'format' as given in the source-table. "
     1732                                     "BNC allows users to change this selection by editing the decoder string. "
     1733                                     "Double click on the 'decoder' field, enter your preferred decoder and then hit Enter. "
     1734                                     "Accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x' and 'RTNET'.</p><p>"
     1735                                     "In case you need to log raw data as is, BNC allows to by-pass its decoders and directly save the input in daily log files. "
     1736                                     "To do this, specify the decoder string as 'ZERO2FILE'.</p><p>"
     1737                                     "BNC allows as well to forward streams related to the specified 'Mountpoint' on top of the 'Miscellaneous Panel' "
     1738                                     "through a TCP/IP port of your local host. "
     1739                                     "In this case, the stream content remains untouched; BNC does not decode or reformat the data for this output. "
     1740                                     "If the decoder string is not an accepted one, please change the decoder string to 'ZERO' (forward the raw data only) or 'ZERO2FILE' (forward and store the raw data) in addition.</p><p>"
     1741                                     "BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. "
     1742                                     "To initiate such stream, the approximate latitude/longitude rover position is sent to the Ntrip Broadcaster "
     1743                                     "together with an approximation for the height. Default values for latitude and longitude can be change according to your requirement. "
     1744                                     "Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter. <i>[key: mountPoints]</i></p>"));
     1745  _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
     1746  _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
     1747  _actMapMountPoints->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
     1748  _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
     1749  _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
     1750
     1751  // WhatsThis, Log Canvas
     1752  // ---------------------
     1753  _log->setWhatsThis(tr("<p>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 problems that occur in the communication link, stream availability, stream delay, stream conversion etc.</p>"));
     1754  _bncFigure->setWhatsThis(tr("<p>The bandwith consumption per stream is shown in the 'Throughput' tab in bits per second (bps) or kilobits per second (kbps).</p>"));
     1755  _bncFigureLate->setWhatsThis(tr("<p>The individual latency of observations of incoming streams is shown in the 'Latency' tab. Streams not carrying observations (e.g. those providing only Broadcast Ephemeris) remain unconsidered.</p><p>Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized.</p>"));
     1756  _bncFigurePPP->setWhatsThis(tr("<p>PPP time series of North (red), East (green) and Up (blue) displacements are shown in the 'PPP Plot' tab when the corresponding option is selected.</p><p>Values are referred to an XYZ a priori coordinate. The sliding PPP time series window covers the period of the latest 5 minutes.</p>"));
     1757
     1758
     1759  // Enable/Disable all Widgets
     1760  // --------------------------
     1761  slotBncTextChanged();
     1762  enableStartStop();
     1763
     1764  // Auto start
     1765  // ----------
     1766  if (Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
     1767    slotStart();
     1768  }
     1769}
     1770
     1771// Destructor
     1772////////////////////////////////////////////////////////////////////////////
     1773bncWindow::~bncWindow() {
     1774  if (_caster) {
     1775    delete _caster; BNC_CORE->setCaster(0);
     1776  }
     1777  if (_casterEph) {
     1778    delete _casterEph;
     1779  }
     1780  delete _bncFigureLate;
     1781  delete _bncFigurePPP;
     1782  delete _actHelp;
     1783  delete _actAbout;
     1784  delete _actFlowchart;
     1785  delete _actFontSel;
     1786  delete _actSaveOpt;
     1787  delete _actQuit;
     1788  delete _actAddMountPoints;
     1789  delete _actDeleteMountPoints;
     1790  delete _actMapMountPoints;
     1791  delete _actStart;
     1792  delete _actStop;
     1793  delete _actwhatsthis;
     1794  delete _proxyHostLineEdit;
     1795  delete _proxyPortLineEdit;
     1796  delete _sslCaCertPathLineEdit;
     1797  delete _sslClientCertPathLineEdit;
     1798  delete _sslIgnoreErrorsCheckBox;
     1799  delete _logFileLineEdit;
     1800  delete _rawOutFileLineEdit;
     1801  delete _rnxAppendCheckBox;
     1802  delete _onTheFlyComboBox;
     1803  delete _autoStartCheckBox;
     1804  delete _rnxPathLineEdit;
     1805  delete _rnxIntrComboBox;
     1806  delete _rnxSamplComboBox;
     1807  delete _rnxSkelExtComboBox;
     1808  delete _rnxSkelPathLineEdit;
     1809  delete _rnxFileCheckBox;
     1810  delete _rnxScrpLineEdit;
     1811  delete _rnxVersComboBox;
     1812  delete _rnxV2Priority;
     1813  delete _ephPathLineEdit;
     1814  //delete _ephFilePerStation;
     1815  delete _ephIntrComboBox;
     1816  delete _ephOutPortLineEdit;
     1817  delete _ephVersComboBox;
     1818  delete _corrPathLineEdit;
     1819  delete _corrIntrComboBox;
     1820  delete _corrPortLineEdit;
     1821  delete _outPortLineEdit;
     1822  delete _outWaitSpinBox;
     1823  delete _outSamplComboBox;
     1824  delete _outFileLineEdit;
     1825  delete _outUPortLineEdit;
     1826  delete _outLockTimeCheckBox;
     1827  delete _serialMountPointLineEdit;
     1828  delete _serialPortNameLineEdit;
     1829  delete _serialBaudRateComboBox;
     1830  delete _serialFlowControlComboBox;
     1831  delete _serialDataBitsComboBox;
     1832  delete _serialParityComboBox;
     1833  delete _serialStopBitsComboBox;
     1834  delete _serialAutoNMEAComboBox;
     1835  delete _serialFileNMEALineEdit;
     1836  delete _serialHeightNMEALineEdit;
     1837  delete _serialNMEASamplingSpinBox;
     1838  delete _adviseObsRateComboBox;
     1839  delete _adviseFailSpinBox;
     1840  delete _adviseRecoSpinBox;
     1841  delete _adviseScriptLineEdit;
     1842  delete _miscMountLineEdit;
     1843  delete _miscPortLineEdit;
     1844  delete _miscIntrComboBox;
     1845  delete _miscScanRTCMCheckBox;
     1846  _mountPointsTable->deleteLater();
     1847  delete _log;
     1848  delete _loggroup;
     1849  _cmbTable->deleteLater();
     1850  delete _cmbMaxresLineEdit;
     1851  delete _cmbMaxdisplacementLineEdit;
     1852  delete _cmbSamplComboBox;
     1853  delete _cmbLogPath;
     1854  delete _cmbMethodComboBox;
     1855  delete _cmbGpsCheckBox;
     1856  delete _cmbGloCheckBox;
     1857  delete _cmbGalCheckBox;
     1858  delete _cmbBdsCheckBox;
     1859  delete _cmbQzssCheckBox;
     1860  delete _cmbSbasCheckBox;
     1861  delete _cmbNavicCheckBox;
     1862  delete _cmbBsxFile;
     1863  delete _uploadSamplRtcmEphCorrComboBox;
     1864  _uploadEphTable->deleteLater();
     1865  _uploadRawTable->deleteLater();
     1866  _uploadTable->deleteLater();
     1867  delete _uploadIntrComboBox;
     1868  delete _uploadAntexFile;
     1869  delete _uploadSamplRtcmEphSpinBox;
     1870  delete _uploadSamplSp3ComboBox;
     1871  delete _uploadSamplClkRnxSpinBox;
     1872  delete _uploadSamplBiaSnxSpinBox;
     1873  delete _reqcActionComboBox;
     1874  delete _reqcObsFileChooser;
     1875  delete _reqcNavFileChooser;
     1876  delete _reqcOutObsLineEdit;
     1877  delete _reqcOutNavLineEdit;
     1878  delete _reqcOutLogLineEdit;
     1879  delete _reqcPlotDirLineEdit;
     1880  delete _reqcSkyPlotSignals;
     1881  delete _reqcLogSummaryOnly;
     1882  delete _reqcEditOptionButton;
     1883  delete _sp3CompFileChooser;
     1884  delete _sp3CompExclude;
     1885  delete _sp3CompLogLineEdit;
     1886  delete _sp3CompSummaryOnly;
     1887  //delete _canvas;
     1888}
     1889
     1890//
     1891////////////////////////////////////////////////////////////////////////////
     1892void bncWindow::populateMountPointsTable() {
     1893
     1894  for (int iRow = _mountPointsTable->rowCount() - 1; iRow >= 0; iRow--) {
     1895    _mountPointsTable->removeRow(iRow);
     1896  }
     1897
     1898  bncSettings settings;
     1899
     1900  QListIterator<QString> it(settings.value("mountPoints").toStringList());
     1901  int iRow = 0;
     1902  while (it.hasNext()) {
     1903    QStringList hlp = it.next().split(" ");
     1904    if (hlp.size() < 7) continue;
     1905    _mountPointsTable->insertRow(iRow);
     1906
     1907    QUrl    url(hlp[0]);
     1908
     1909    QString format(hlp[1]);
     1910    QString country(hlp[2]);
     1911    QString latitude(hlp[3]);
     1912    QString longitude(hlp[4]);
     1913    QString nmea(hlp[5]);
     1914    QString ntripVersion(hlp[6]);
     1915
     1916    QString fullPath;
     1917    if (ntripVersion == 'S') {
     1918      // url.userInfo() contains the case sensitive portName
     1919      // the portName shall be part of the mountpointString
     1920      // to inform the user about the source of the stream
     1921      if (url.host().contains(url.userInfo().toLower())) {
     1922        fullPath = url.host() + url.path();
     1923      }
     1924      else {
     1925        fullPath =  url.userInfo() + "-" + url.host() + url.path();
     1926      }
     1927    } else {
     1928      fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
     1929    }
     1930
     1931    QTableWidgetItem* it;
     1932    it = new QTableWidgetItem(url.userInfo());
     1933    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1934    _mountPointsTable->setItem(iRow, 0, it);
     1935
     1936    it = new QTableWidgetItem(fullPath);
     1937    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1938    _mountPointsTable->setItem(iRow, 1, it);
     1939
     1940    it = new QTableWidgetItem(format);
     1941    _mountPointsTable->setItem(iRow, 2, it);
     1942
     1943    it = new QTableWidgetItem(country);
     1944    _mountPointsTable->setItem(iRow, 3, it);
     1945
     1946    if (nmea == "yes") {
     1947      it = new QTableWidgetItem(latitude);
     1948      _mountPointsTable->setItem(iRow, 4, it);
     1949      it = new QTableWidgetItem(longitude);
     1950      _mountPointsTable->setItem(iRow, 5, it);
    5261951    }
    5271952    else {
    528         enableWidget(false, _cmbMethodComboBox);
    529         enableWidget(false, _cmbMaxresLineEdit);
    530         enableWidget(false, _cmbMaxdisplacementLineEdit);
    531         enableWidget(false, _cmbSamplComboBox);
    532         enableWidget(false, _cmbLogPath);
    533     }
    534     _cmbGpsCheckBox = new QCheckBox();
    535     _cmbGpsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGps").toInt()));
    536     _cmbGloCheckBox = new QCheckBox();
    537     _cmbGloCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGlo").toInt()));
    538     _cmbGalCheckBox = new QCheckBox();
    539     _cmbGalCheckBox->setCheckState(Qt::CheckState(settings.value("cmbGal").toInt()));
    540     _cmbBdsCheckBox = new QCheckBox();
    541     _cmbBdsCheckBox->setCheckState(Qt::CheckState(settings.value("cmbBds").toInt()));
    542     _cmbQzssCheckBox = new QCheckBox();
    543     _cmbQzssCheckBox->setCheckState(Qt::CheckState(settings.value("cmbQzss").toInt()));
    544     _cmbSbasCheckBox = new QCheckBox();
    545     _cmbSbasCheckBox->setCheckState(Qt::CheckState(settings.value("cmbSbas").toInt()));
    546     _cmbNavicCheckBox = new QCheckBox();
    547     _cmbNavicCheckBox->setCheckState(Qt::CheckState(settings.value("cmbNavic").toInt()));
    548 
    549     connect(_cmbGpsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    550     connect(_cmbGloCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    551     connect(_cmbGalCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    552     connect(_cmbBdsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    553     connect(_cmbQzssCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    554     connect(_cmbSbasCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    555     connect(_cmbNavicCheckBox, SIGNAL(stateChanged(int)), this, SLOT(slotBncTextChanged()));
    556 
    557     _cmbBsxFile = new qtFileChooser(0, qtFileChooser::File);
    558     _cmbBsxFile->setFileName(settings.value("cmbBsxFile").toString());
    559 
    560     // Upload Results
    561     // -------------
    562     _uploadTable = new QTableWidget(0, 16);
    563     _uploadTable->setHorizontalHeaderLabels(QString("Host, Port, Mountpoint, Ntrip, User, Password, System, Format, CoM, SP3 File, RNX File, BSX File, PID, SID, IOD, Bytes").split(","));
    564     _uploadTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    565     _uploadTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    566     _uploadTable->horizontalHeader()->resizeSection(0, 13 * ww);
    567     _uploadTable->horizontalHeader()->resizeSection(1, 5 * ww);
    568     _uploadTable->horizontalHeader()->resizeSection(2, 10 * ww);
    569     _uploadTable->horizontalHeader()->resizeSection(3, 6 * ww);
    570     _uploadTable->horizontalHeader()->resizeSection(4, 8 * ww);
    571     _uploadTable->horizontalHeader()->resizeSection(5, 8 * ww);
    572     _uploadTable->horizontalHeader()->resizeSection(6, 11 * ww);
    573     _uploadTable->horizontalHeader()->resizeSection(7, 11 * ww);
    574     _uploadTable->horizontalHeader()->resizeSection(8, 4 * ww);
    575     _uploadTable->horizontalHeader()->resizeSection(9, 15 * ww);
    576     _uploadTable->horizontalHeader()->resizeSection(10, 15 * ww);
    577     _uploadTable->horizontalHeader()->resizeSection(11, 15 * ww);
    578     _uploadTable->horizontalHeader()->resizeSection(12, 4 * ww);
    579     _uploadTable->horizontalHeader()->resizeSection(13, 4 * ww);
    580     _uploadTable->horizontalHeader()->resizeSection(14, 4 * ww);
    581     _uploadTable->horizontalHeader()->resizeSection(15, 12 * ww);
    582 #if QT_VERSION < 0x050000
    583     _uploadTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
    584 #else
    585     _uploadTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    586 #endif
    587     _uploadTable->horizontalHeader()->setStretchLastSection(true);
    588     _uploadTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    589 
    590     connect(_uploadTable, SIGNAL(itemSelectionChanged()),
    591         SLOT(slotBncTextChanged()));
    592 
    593     QPushButton* addUploadRowButton = new QPushButton("Add Row");
    594     QPushButton* delUploadRowButton = new QPushButton("Del Row");
    595     QPushButton* setUploadTrafoButton = new QPushButton("Custom Trafo");
    596     _uploadIntrComboBox = new QComboBox;
    597     _uploadIntrComboBox->setEditable(false);
    598     _uploadIntrComboBox->addItems(QString("1 day,1 hour, 30 min,15 min,10 min,5 min,2 min,1 min").split(","));
    599     ii = _uploadIntrComboBox->findText(settings.value("uploadIntr").toString());
    600     if (ii != -1) {
    601         _uploadIntrComboBox->setCurrentIndex(ii);
    602     }
    603 
    604     _uploadAntexFile = new qtFileChooser(0, qtFileChooser::File);
    605     _uploadAntexFile->setFileName(settings.value("uploadAntexFile").toString());
    606 
    607     _uploadSamplRtcmEphCorrComboBox = new QComboBox();
    608     _uploadSamplRtcmEphCorrComboBox->setEditable(false);
    609     _uploadSamplRtcmEphCorrComboBox->addItems(QString("0 sec,1 sec,2 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(","));
    610     int pp = _uploadSamplRtcmEphCorrComboBox->findText(settings.value("uploadSamplRtcmEphCorr").toString());
    611     if (pp != -1) {
    612         _uploadSamplRtcmEphCorrComboBox->setCurrentIndex(pp);
    613     }
    614 
    615     _uploadSamplSp3ComboBox = new QComboBox();
    616     _uploadSamplSp3ComboBox->setEditable(false);
    617     _uploadSamplSp3ComboBox->addItems(QString("0 sec,30 sec,60 sec,300 sec,900 sec").split(","));
    618     int oo = _uploadSamplSp3ComboBox->findText(settings.value("uploadSamplSp3").toString());
    619     if (oo != -1) {
    620         _uploadSamplSp3ComboBox->setCurrentIndex(oo);
    621     }
    622 
    623     _uploadSamplClkRnxSpinBox = new QSpinBox;
    624     _uploadSamplClkRnxSpinBox->setMinimum(0);
    625     _uploadSamplClkRnxSpinBox->setMaximum(60);
    626     _uploadSamplClkRnxSpinBox->setSingleStep(5);
    627     _uploadSamplClkRnxSpinBox->setMaximumWidth(9 * ww);
    628     _uploadSamplClkRnxSpinBox->setValue(settings.value("uploadSamplClkRnx").toInt());
    629     _uploadSamplClkRnxSpinBox->setSuffix(" sec");
    630 
    631     _uploadSamplBiaSnxSpinBox = new QSpinBox;
    632     _uploadSamplBiaSnxSpinBox->setMinimum(0);
    633     _uploadSamplBiaSnxSpinBox->setMaximum(60);
    634     _uploadSamplBiaSnxSpinBox->setSingleStep(5);
    635     _uploadSamplBiaSnxSpinBox->setMaximumWidth(9 * ww);
    636     _uploadSamplBiaSnxSpinBox->setValue(settings.value("uploadSamplBiaSnx").toInt());
    637     _uploadSamplBiaSnxSpinBox->setSuffix(" sec");
    638 
    639     int iRowT = _uploadTable->rowCount();
    640     if (iRowT > 0) {
    641         enableWidget(true, _uploadIntrComboBox);
    642         enableWidget(true, _uploadSamplRtcmEphCorrComboBox);
    643         enableWidget(true, _uploadSamplSp3ComboBox);
    644         enableWidget(true, _uploadSamplClkRnxSpinBox);
    645         enableWidget(true, _uploadSamplBiaSnxSpinBox);
    646         enableWidget(true, _uploadAntexFile);
     1953      it = new QTableWidgetItem(latitude);
     1954      it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1955      _mountPointsTable->setItem(iRow, 4, it);
     1956
     1957      it = new QTableWidgetItem(longitude);
     1958      it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1959      _mountPointsTable->setItem(iRow, 5, it);
     1960    }
     1961
     1962    it = new QTableWidgetItem(nmea);
     1963    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1964    _mountPointsTable->setItem(iRow, 6, it);
     1965
     1966    it = new QTableWidgetItem(ntripVersion);
     1967    ////    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     1968    _mountPointsTable->setItem(iRow, 7, it);
     1969
     1970    bncTableItem* bncIt = new bncTableItem();
     1971    bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     1972    _mountPointsTable->setItem(iRow, 8, bncIt);
     1973
     1974    iRow++;
     1975  }
     1976
     1977  _mountPointsTable->sortItems(1);
     1978
     1979  enableStartStop();
     1980}
     1981
     1982// Retrieve Table
     1983////////////////////////////////////////////////////////////////////////////
     1984void bncWindow::slotAddMountPoints() {
     1985
     1986  bncSettings settings;
     1987  QString proxyHost = settings.value("proxyHost").toString();
     1988  int     proxyPort = settings.value("proxyPort").toInt();
     1989  if (proxyHost != _proxyHostLineEdit->text() ||
     1990      proxyPort != _proxyPortLineEdit->text().toInt()) {
     1991    int iRet = QMessageBox::question(this, "Question", "Proxy options "
     1992                                     "changed. Use the new ones?",
     1993                                     QMessageBox::Yes, QMessageBox::No,
     1994                                     QMessageBox::NoButton);
     1995    if (iRet == QMessageBox::Yes) {
     1996      settings.setValue("proxyHost", _proxyHostLineEdit->text());
     1997      settings.setValue("proxyPort", _proxyPortLineEdit->text());
     1998    }
     1999  }
     2000
     2001  settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
     2002  settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
     2003  settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
     2004
     2005  QMessageBox msgBox;
     2006  msgBox.setIcon(QMessageBox::Question);
     2007  msgBox.setWindowTitle("Add Stream");
     2008  msgBox.setText("Add stream(s) coming from:");
     2009
     2010  QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
     2011  QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
     2012  QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
     2013  QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
     2014  QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
     2015
     2016  msgBox.exec();
     2017
     2018  if (msgBox.clickedButton() == buttonNtrip) {
     2019    bncTableDlg* dlg = new bncTableDlg(this);
     2020    dlg->move(this->pos().x() + 50, this->pos().y() + 50);
     2021    connect(dlg, SIGNAL(newMountPoints(QStringList*)),
     2022            this, SLOT(slotNewMountPoints(QStringList*)));
     2023    dlg->exec();
     2024    delete dlg;
     2025  }
     2026  else if (msgBox.clickedButton() == buttonIP) {
     2027    bncIpPort* ipp = new bncIpPort(this);
     2028    connect(ipp, SIGNAL(newMountPoints(QStringList*)),
     2029            this, SLOT(slotNewMountPoints(QStringList*)));
     2030    ipp->exec();
     2031    delete ipp;
     2032  }
     2033  else if (msgBox.clickedButton() == buttonUDP) {
     2034    bncUdpPort* udp = new bncUdpPort(this);
     2035    connect(udp, SIGNAL(newMountPoints(QStringList*)),
     2036            this, SLOT(slotNewMountPoints(QStringList*)));
     2037    udp->exec();
     2038    delete udp;
     2039  }
     2040  else if (msgBox.clickedButton() == buttonSerial) {
     2041    bncSerialPort* sep = new bncSerialPort(this);
     2042    connect(sep, SIGNAL(newMountPoints(QStringList*)),
     2043            this, SLOT(slotNewMountPoints(QStringList*)));
     2044    sep->exec();
     2045    delete sep;
     2046  }
     2047  else if (msgBox.clickedButton() == buttonCancel) {
     2048    // Cancel
     2049  }
     2050
     2051  enableStartStop();
     2052}
     2053
     2054// Delete Selected Mount Points
     2055////////////////////////////////////////////////////////////////////////////
     2056void bncWindow::slotDeleteMountPoints() {
     2057
     2058  int nRows = _mountPointsTable->rowCount();
     2059  std::vector <bool> flg(nRows);
     2060  for (int iRow = 0; iRow < nRows; iRow++) {
     2061    if (_mountPointsTable->item(iRow, 1)->isSelected()) {
     2062      flg[iRow] = true;
    6472063    }
    6482064    else {
    649         enableWidget(false, _uploadIntrComboBox);
    650         enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
    651         enableWidget(false, _uploadSamplSp3ComboBox);
    652         enableWidget(false, _uploadSamplClkRnxSpinBox);
    653         enableWidget(true, _uploadSamplBiaSnxSpinBox);
    654         enableWidget(false, _uploadAntexFile);
    655     }
    656 
    657     // Upload RTCM3 Ephemeris
    658     // ----------------------
    659     _uploadEphTable = new QTableWidget(0, 7);
    660     _uploadEphTable->setColumnCount(8);
    661     _uploadEphTable->setRowCount(0);
    662     _uploadEphTable->setHorizontalHeaderLabels(QString("Host, Port, Mountpoint,  Ntrip, User, Password, System, Bytes").split(","));
    663     _uploadEphTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    664     _uploadEphTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    665     _uploadEphTable->horizontalHeader()->resizeSection(0, 13 * ww);
    666     _uploadEphTable->horizontalHeader()->resizeSection(1, 5 * ww);
    667     _uploadEphTable->horizontalHeader()->resizeSection(2, 8 * ww);
    668     _uploadEphTable->horizontalHeader()->resizeSection(3, 6 * ww);
    669     _uploadEphTable->horizontalHeader()->resizeSection(4, 8 * ww);
    670     _uploadEphTable->horizontalHeader()->resizeSection(5, 8 * ww);
    671     _uploadEphTable->horizontalHeader()->resizeSection(6, 10 * ww);
    672     _uploadEphTable->horizontalHeader()->resizeSection(7, 12 * ww);
    673 #if QT_VERSION < 0x050000
    674     _uploadEphTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
    675 #else
    676     _uploadEphTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    677 #endif
    678     _uploadEphTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    679 
    680     connect(_uploadEphTable, SIGNAL(itemSelectionChanged()),
    681         SLOT(slotBncTextChanged()));
    682 
    683     QPushButton* addUploadEphRowButton = new QPushButton("Add Row");
    684     addUploadEphRowButton->setMaximumWidth(9 * ww);
    685     QPushButton* delUploadEphRowButton = new QPushButton("Del Row");
    686     delUploadEphRowButton->setMaximumWidth(9 * ww);
    687 
    688     _uploadSamplRtcmEphSpinBox = new QSpinBox;
    689     _uploadSamplRtcmEphSpinBox->setMinimum(0);
    690     _uploadSamplRtcmEphSpinBox->setMaximum(60);
    691     _uploadSamplRtcmEphSpinBox->setSingleStep(5);
    692     _uploadSamplRtcmEphSpinBox->setMaximumWidth(9 * ww);
    693     _uploadSamplRtcmEphSpinBox->setValue(settings.value("uploadSamplRtcmEph").toInt());
    694     _uploadSamplRtcmEphSpinBox->setSuffix(" sec");
    695 
    696     iRowT = _uploadEphTable->rowCount();
    697     if (iRowT > 0) {
    698         enableWidget(true, _uploadSamplRtcmEphSpinBox);
     2065      flg[iRow] = false;
     2066    }
     2067  }
     2068  for (int iRow = nRows - 1; iRow >= 0; iRow--) {
     2069    if (flg[iRow]) {
     2070      _mountPointsTable->removeRow(iRow);
     2071    }
     2072  }
     2073  _actDeleteMountPoints->setEnabled(false);
     2074
     2075  enableStartStop();
     2076}
     2077
     2078// New Mount Points Selected
     2079////////////////////////////////////////////////////////////////////////////
     2080void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
     2081  int iRow = 0;
     2082  QListIterator<QString> it(*mountPoints);
     2083  while (it.hasNext()) {
     2084    QStringList hlp = it.next().split(" ");
     2085
     2086    QUrl url(hlp[0]);
     2087
     2088    QString format(hlp[1]);
     2089    QString country(hlp[2]);
     2090    QString latitude(hlp[3]);
     2091    QString longitude(hlp[4]);
     2092    QString nmea(hlp[5]);
     2093    QString ntripVersion(hlp[6]);
     2094
     2095    QString fullPath;
     2096    if (ntripVersion == 'S') {
     2097      // url.userInfo() contains the case sensitive portName
     2098      // the portName shall be part of the mountpointString
     2099      // to inform the user about the source of the stream
     2100      if (url.host().contains(url.userInfo().toLower())) {
     2101        fullPath = url.host() + url.path();
     2102      }
     2103      else {
     2104        fullPath =  url.userInfo() + "-" + url.host() + url.path();
     2105      }
     2106    } else {
     2107      fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
     2108    }
     2109
     2110    _mountPointsTable->insertRow(iRow);
     2111
     2112    QTableWidgetItem* it;
     2113    it = new QTableWidgetItem(url.userInfo());
     2114    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2115    _mountPointsTable->setItem(iRow, 0, it);
     2116
     2117    it = new QTableWidgetItem(fullPath);
     2118    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2119    _mountPointsTable->setItem(iRow, 1, it);
     2120
     2121    it = new QTableWidgetItem(format);
     2122    _mountPointsTable->setItem(iRow, 2, it);
     2123
     2124    it = new QTableWidgetItem(country);
     2125    _mountPointsTable->setItem(iRow, 3, it);
     2126
     2127    if (nmea == "yes") {
     2128      it = new QTableWidgetItem(latitude);
     2129      _mountPointsTable->setItem(iRow, 4, it);
     2130      it = new QTableWidgetItem(longitude);
     2131      _mountPointsTable->setItem(iRow, 5, it);
    6992132    }
    7002133    else {
    701         enableWidget(false, _uploadSamplRtcmEphSpinBox);
    702     }
    703 
    704     // Upload Raw data
    705     // ----------------------
    706     _uploadRawTable = new QTableWidget(0, 7);
    707     _uploadRawTable->setColumnCount(8);
    708     _uploadRawTable->setRowCount(0);
    709     _uploadRawTable->setHorizontalHeaderLabels(QString("Source Mountpoint, Host, Port, Upload Mountpoint,  Ntrip, User, Password, Bytes").split(","));
    710     _uploadRawTable->setSelectionMode(QAbstractItemView::ExtendedSelection);
    711     _uploadRawTable->setSelectionBehavior(QAbstractItemView::SelectRows);
    712     _uploadRawTable->horizontalHeader()->resizeSection(0, 13 * ww);
    713     _uploadRawTable->horizontalHeader()->resizeSection(1, 13 * ww);
    714     _uploadRawTable->horizontalHeader()->resizeSection(2, 5 * ww);
    715     _uploadRawTable->horizontalHeader()->resizeSection(3, 13 * ww);
    716     _uploadRawTable->horizontalHeader()->resizeSection(4, 6 * ww);
    717     _uploadRawTable->horizontalHeader()->resizeSection(5, 8 * ww);
    718     _uploadRawTable->horizontalHeader()->resizeSection(6, 8 * ww);
    719     _uploadRawTable->horizontalHeader()->resizeSection(7, 10 * ww);
    720     _uploadRawTable->horizontalHeader()->resizeSection(8, 12 * ww);
    721 #if QT_VERSION < 0x050000
    722     _uploadRawTable->horizontalHeader()->setResizeMode(QHeaderView::Interactive);
    723 #else
    724     _uploadRawTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
    725 #endif
    726     _uploadRawTable->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
    727 
    728     connect(_uploadRawTable, SIGNAL(itemSelectionChanged()), SLOT(slotBncTextChanged()));
    729 
    730     QPushButton* addUploadRawRowButton = new QPushButton("Add Row");
    731     addUploadRawRowButton->setMaximumWidth(9 * ww);
    732     QPushButton* delUploadRawRowButton = new QPushButton("Del Row");
    733     delUploadRawRowButton->setMaximumWidth(9 * ww);
    734 
    735     // Canvas with Editable Fields
    736     // ---------------------------
    737     _canvas = new QWidget;
    738     setCentralWidget(_canvas);
    739 
    740     _aogroup = new QTabWidget();
    741     _aogroup->setElideMode(Qt::ElideNone);
    742     _aogroup->setUsesScrollButtons(true);
    743     QWidget* pgroup = new QWidget();
    744     QWidget* ggroup = new QWidget();
    745     QWidget* sgroup = new QWidget();
    746     QWidget* egroup = new QWidget();
    747     QWidget* agroup = new QWidget();
    748     QWidget* cgroup = new QWidget();
    749     QWidget* ogroup = new QWidget();
    750     QWidget* rgroup = new QWidget();
    751     QWidget* sergroup = new QWidget();
    752     QWidget* pppGroup1 = new QWidget();
    753     QWidget* pppGroup2 = new QWidget();
    754     QWidget* pppGroup3 = new QWidget();
    755     QWidget* pppGroup4 = new QWidget();
    756     QWidget* reqcgroup = new QWidget();
    757     QWidget* sp3CompGroup = new QWidget();
    758     QWidget* cmbgroup = new QWidget();
    759     QWidget* uploadgroup = new QWidget();
    760     QWidget* uploadEphgroup = new QWidget();
    761     QWidget* uploadRawgroup = new QWidget();
    762     _aogroup->addTab(pgroup, tr("Network"));
    763     _aogroup->addTab(ggroup, tr("General"));
    764     _aogroup->addTab(ogroup, tr("RINEX Observations"));
    765     _aogroup->addTab(egroup, tr("RINEX Ephemeris"));
    766     _aogroup->addTab(reqcgroup, tr("RINEX Editing && QC"));
    767     _aogroup->addTab(sp3CompGroup, tr("SP3 Comparison"));
    768     _aogroup->addTab(cgroup, tr("Broadcast Corrections"));
    769     _aogroup->addTab(sgroup, tr("Feed Engine"));
    770     _aogroup->addTab(sergroup, tr("Serial Output"));
    771     _aogroup->addTab(agroup, tr("Outages"));
    772     _aogroup->addTab(rgroup, tr("Miscellaneous"));
    773     _aogroup->addTab(pppGroup1, tr("PPP (1)"));
    774     _aogroup->addTab(pppGroup2, tr("PPP (2)"));
    775     _aogroup->addTab(pppGroup3, tr("PPP (3)"));
    776     _aogroup->addTab(pppGroup4, tr("PPP (4)"));
    777     _aogroup->addTab(cmbgroup, tr("Combine Corrections"));
    778     _aogroup->addTab(uploadgroup, tr("Upload Corrections"));
    779     _aogroup->addTab(uploadEphgroup, tr("Upload Ephemeris"));
    780     _aogroup->addTab(uploadRawgroup, tr("Upload Raw Data"));
    781 
    782     // Log Tab
    783     // -------
    784     _loggroup = new QTabWidget();
    785     _loggroup->addTab(_log, tr("Log"));
    786     _loggroup->addTab(_bncFigure, tr("Throughput"));
    787     _loggroup->addTab(_bncFigureLate, tr("Latency"));
    788     _loggroup->addTab(_bncFigurePPP, tr("PPP Plot"));
    789 
    790     // Netowork (Proxy and SSL) Tab
    791     // ----------------------------
    792     QGridLayout* pLayout = new QGridLayout;
    793     pLayout->setColumnMinimumWidth(0, 13 * ww);
    794     _proxyPortLineEdit->setMaximumWidth(9 * ww);
    795 
    796     pLayout->addWidget(new QLabel("Settings for proxy in protected networks and for SSL authorization, leave boxes blank if none.<br>"), 0, 0, 1, 50);
    797     pLayout->addWidget(new QLabel("Proxy host"), 1, 0);
    798     pLayout->addWidget(_proxyHostLineEdit, 1, 1, 1, 10);
    799     pLayout->addWidget(new QLabel("Proxy port"), 2, 0);
    800     pLayout->addWidget(_proxyPortLineEdit, 2, 1);
    801     pLayout->addWidget(new QLabel("Path to SSL certificates"), 3, 0);
    802     pLayout->addWidget(_sslCaCertPathLineEdit, 3, 1, 1, 10);
    803     pLayout->addWidget(new QLabel("Default:  " + bncSslConfig::defaultPath()), 3, 11, 1, 20);
    804     pLayout->addWidget(new QLabel("Path to SSL client certificates"), 4, 0);
    805     pLayout->addWidget(_sslClientCertPathLineEdit, 4, 1, 1, 10);
    806     pLayout->addWidget(new QLabel("Ignore SSL authorization errors"), 5, 0);
    807     pLayout->addWidget(_sslIgnoreErrorsCheckBox, 5, 1, 1, 10);
    808     pLayout->addWidget(new QLabel(""), 6, 1);
    809     pLayout->setRowStretch(6, 999);
    810 
    811     pgroup->setLayout(pLayout);
    812 
    813     // General Tab
    814     // -----------
    815     QGridLayout* gLayout = new QGridLayout;
    816     gLayout->setColumnMinimumWidth(0, 14 * ww);
    817     _onTheFlyComboBox->setMaximumWidth(9 * ww);
    818 
    819     gLayout->addWidget(new QLabel("General settings for logfile, file handling, configuration on-the-fly, auto-start, and raw file output.<br>"), 0, 0, 1, 50);
    820     gLayout->addWidget(new QLabel("Logfile (full path)"), 1, 0);
    821     gLayout->addWidget(_logFileLineEdit, 1, 1, 1, 20);
    822     gLayout->addWidget(new QLabel("Append files"), 2, 0);
    823     gLayout->addWidget(_rnxAppendCheckBox, 2, 1);
    824     gLayout->addWidget(new QLabel("Reread configuration"), 3, 0);
    825     gLayout->addWidget(_onTheFlyComboBox, 3, 1);
    826     gLayout->addWidget(new QLabel("Auto start"), 4, 0);
    827     gLayout->addWidget(_autoStartCheckBox, 4, 1);
    828     gLayout->addWidget(new QLabel("Raw output file (full path)"), 5, 0);
    829     gLayout->addWidget(_rawOutFileLineEdit, 5, 1, 1, 20);
    830     gLayout->addWidget(new QLabel(""), 6, 1);
    831     gLayout->setRowStretch(7, 999);
    832 
    833     ggroup->setLayout(gLayout);
    834 
    835     // RINEX Observations
    836     // ------------------
    837     QGridLayout* oLayout = new QGridLayout;
    838     oLayout->setColumnMinimumWidth(0, 14 * ww);
    839     _rnxIntrComboBox->setMaximumWidth(9 * ww);
    840     _rnxSamplComboBox->setMaximumWidth(9 * ww);
    841     _rnxSkelExtComboBox->setMaximumWidth(9 * ww);
    842 
    843     oLayout->addWidget(new QLabel("Saving RINEX observation files.<br>"), 0, 0, 1, 50);
    844     oLayout->addWidget(new QLabel("Directory"), 1, 0);
    845     oLayout->addWidget(_rnxPathLineEdit, 1, 1, 1, 15);
    846     oLayout->addWidget(new QLabel("Interval"), 2, 0);
    847     oLayout->addWidget(_rnxIntrComboBox, 2, 1);
    848     oLayout->addWidget(new QLabel("  Sampling"), 2, 2, Qt::AlignRight);
    849     oLayout->addWidget(_rnxSamplComboBox, 2, 3, Qt::AlignRight);
    850     oLayout->addWidget(new QLabel("Skeleton extension"), 3, 0);
    851     oLayout->addWidget(_rnxSkelExtComboBox, 3, 1, Qt::AlignLeft);
    852     oLayout->addWidget(new QLabel("Skeleton mandatory"), 3, 2, Qt::AlignRight);
    853     oLayout->addWidget(_rnxFileCheckBox, 3, 3);
    854     oLayout->addWidget(new QLabel("Skeleton Directory"), 4, 0);
    855     oLayout->addWidget(_rnxSkelPathLineEdit, 4, 1, 1, 15);
    856     oLayout->addWidget(new QLabel("Script (full path)"), 5, 0);
    857     oLayout->addWidget(_rnxScrpLineEdit, 5, 1, 1, 15);
    858     oLayout->addWidget(new QLabel("Version"), 6, 0);
    859     oLayout->addWidget(_rnxVersComboBox, 6, 1);
    860     oLayout->addWidget(new QLabel("Signal priority"), 6, 2, Qt::AlignRight);
    861     oLayout->addWidget(_rnxV2Priority, 6, 3, 1, 13);
    862     oLayout->addWidget(new QLabel(""), 7, 1);
    863     oLayout->setRowStretch(8, 999);
    864 
    865     ogroup->setLayout(oLayout);
    866 
    867     // RINEX Ephemeris
    868     // ---------------
    869     QGridLayout* eLayout = new QGridLayout;
    870     eLayout->setColumnMinimumWidth(0, 14 * ww);
    871     _ephIntrComboBox->setMaximumWidth(9 * ww);
    872     _ephOutPortLineEdit->setMaximumWidth(9 * ww);
    873 
    874     eLayout->addWidget(new QLabel("Saving RINEX navigation files and ephemeris output through IP port.<br>"), 0, 0, 1, 70);
    875     eLayout->addWidget(new QLabel("Directory"), 1, 0);
    876     eLayout->addWidget(_ephPathLineEdit, 1, 1, 1, 30);
    877     eLayout->addWidget(new QLabel("Interval"), 2, 0);
    878     eLayout->addWidget(_ephIntrComboBox, 2, 1);
    879     eLayout->addWidget(new QLabel("Port"), 3, 0);
    880     eLayout->addWidget(_ephOutPortLineEdit, 3, 1);
    881     eLayout->addWidget(new QLabel("Version"), 4, 0);
    882     eLayout->addWidget(_ephVersComboBox, 4, 1);
    883     eLayout->setRowStretch(5, 999);
    884     //eLayout->addWidget(new QLabel("File per Station"),              5, 0);
    885     //eLayout->addWidget(_ephFilePerStation,                          5, 1);
    886     //eLayout->setRowStretch(6, 999);
    887 
    888     egroup->setLayout(eLayout);
    889 
    890 
    891     // Broadcast Corrections
    892     // ---------------------
    893     QGridLayout* cLayout = new QGridLayout;
    894     cLayout->setColumnMinimumWidth(0, 14 * ww);
    895     _corrIntrComboBox->setMaximumWidth(9 * ww);
    896     _corrPortLineEdit->setMaximumWidth(9 * ww);
    897 
    898     cLayout->addWidget(new QLabel("Saving Broadcast Ephemeris correction files and correction output through IP port.<br>"), 0, 0, 1, 70);
    899     cLayout->addWidget(new QLabel("Directory, ASCII"), 1, 0);
    900     cLayout->addWidget(_corrPathLineEdit, 1, 1, 1, 30);
    901     cLayout->addWidget(new QLabel("Interval"), 2, 0);
    902     cLayout->addWidget(_corrIntrComboBox, 2, 1);
    903     cLayout->addWidget(new QLabel("Port"), 3, 0);
    904     cLayout->addWidget(_corrPortLineEdit, 3, 1);
    905     cLayout->addWidget(new QLabel(""), 4, 1);
    906     cLayout->setRowStretch(7, 999);
    907     cgroup->setLayout(cLayout);
    908 
    909     // Feed Engine
    910     // -----------
    911     QGridLayout* sLayout = new QGridLayout;
    912     sLayout->setColumnMinimumWidth(0, 14 * ww);
    913     _outPortLineEdit->setMaximumWidth(9 * ww);
    914     _outWaitSpinBox->setMaximumWidth(9 * ww);
    915     _outSamplComboBox->setMaximumWidth(9 * ww);
    916     _outUPortLineEdit->setMaximumWidth(9 * ww);
    917 
    918     sLayout->addWidget(new QLabel("Output decoded observations in ASCII format to feed a real-time GNSS network engine.<br>"), 0, 0, 1, 50);
    919     sLayout->addWidget(new QLabel("Port"), 1, 0);
    920     sLayout->addWidget(_outPortLineEdit, 1, 1);
    921     sLayout->addWidget(new QLabel("       Wait for full obs epoch"), 1, 2, Qt::AlignRight);
    922     sLayout->addWidget(_outWaitSpinBox, 1, 3, Qt::AlignLeft);
    923     sLayout->addWidget(new QLabel("Sampling"), 2, 0);
    924     sLayout->addWidget(_outSamplComboBox, 2, 1, Qt::AlignLeft);
    925     sLayout->addWidget(new QLabel("File (full path)"), 3, 0);
    926     sLayout->addWidget(_outFileLineEdit, 3, 1, 1, 10);
    927     sLayout->addWidget(new QLabel("Port (unsynchronized)"), 4, 0);
    928     sLayout->addWidget(_outUPortLineEdit, 4, 1);
    929     sLayout->addWidget(new QLabel("Print lock time"), 5, 0);
    930     sLayout->addWidget(_outLockTimeCheckBox, 5, 1);
    931     sLayout->addWidget(new QLabel(""), 6, 1);
    932     sLayout->setRowStretch(7, 999);
    933 
    934     sgroup->setLayout(sLayout);
    935 
    936     // Serial Output
    937     // -------------
    938     QGridLayout* serLayout = new QGridLayout;
    939     serLayout->setColumnMinimumWidth(0, 12 * ww);
    940     _serialBaudRateComboBox->setMaximumWidth(9 * ww);
    941     _serialFlowControlComboBox->setMaximumWidth(11 * ww);
    942     _serialDataBitsComboBox->setMaximumWidth(5 * ww);
    943     _serialParityComboBox->setMaximumWidth(9 * ww);
    944     _serialStopBitsComboBox->setMaximumWidth(5 * ww);
    945     _serialAutoNMEAComboBox->setMaximumWidth(14 * ww);
    946     _serialHeightNMEALineEdit->setMaximumWidth(8 * ww);
    947     _serialNMEASamplingSpinBox->setMaximumWidth(8 * ww);
    948 
    949     serLayout->addWidget(new QLabel("Port settings to feed a serial connected receiver.<br>"), 0, 0, 1, 30);
    950     serLayout->addWidget(new QLabel("Mountpoint"), 1, 0, Qt::AlignLeft);
    951     serLayout->addWidget(_serialMountPointLineEdit, 1, 1, 1, 2);
    952     serLayout->addWidget(new QLabel("Port name"), 2, 0, Qt::AlignLeft);
    953     serLayout->addWidget(_serialPortNameLineEdit, 2, 1, 1, 2);
    954     serLayout->addWidget(new QLabel("Baud rate"), 3, 0, Qt::AlignLeft);
    955     serLayout->addWidget(_serialBaudRateComboBox, 3, 1);
    956     serLayout->addWidget(new QLabel("Flow control"), 3, 2, Qt::AlignRight);
    957     serLayout->addWidget(_serialFlowControlComboBox, 3, 3);
    958     serLayout->addWidget(new QLabel("Data bits"), 4, 0, Qt::AlignLeft);
    959     serLayout->addWidget(_serialDataBitsComboBox, 4, 1);
    960     serLayout->addWidget(new QLabel("Parity"), 4, 2, Qt::AlignRight);
    961     serLayout->addWidget(_serialParityComboBox, 4, 3);
    962     serLayout->addWidget(new QLabel("   Stop bits"), 4, 4, Qt::AlignRight);
    963     serLayout->addWidget(_serialStopBitsComboBox, 4, 5);
    964     serLayout->addWidget(new QLabel("NMEA"), 5, 0);
    965     serLayout->addWidget(_serialAutoNMEAComboBox, 5, 1);
    966     serLayout->addWidget(new QLabel("    File (full path)"), 5, 2, Qt::AlignRight);
    967     serLayout->addWidget(_serialFileNMEALineEdit, 5, 3, 1, 10);
    968     serLayout->addWidget(new QLabel("Height"), 5, 14, Qt::AlignRight);
    969     serLayout->addWidget(_serialHeightNMEALineEdit, 5, 15, 1, 11);
    970     serLayout->addWidget(new QLabel("Sampling"), 5, 25, Qt::AlignRight);
    971     serLayout->addWidget(_serialNMEASamplingSpinBox, 5, 26, 1, 12);
    972     serLayout->addWidget(new QLabel(""), 6, 1);
    973     serLayout->setRowStretch(7, 999);
    974 
    975     sergroup->setLayout(serLayout);
    976 
    977     // Outages
    978     // -------
    979     QGridLayout* aLayout = new QGridLayout;
    980     aLayout->setColumnMinimumWidth(0, 14 * ww);
    981     _adviseObsRateComboBox->setMaximumWidth(9 * ww);
    982     _adviseFailSpinBox->setMaximumWidth(9 * ww);
    983     _adviseRecoSpinBox->setMaximumWidth(9 * ww);
    984 
    985     aLayout->addWidget(new QLabel("Failure and recovery reports, advisory notes.<br>"), 0, 0, 1, 50, Qt::AlignLeft);
    986     aLayout->addWidget(new QLabel("Observation rate"), 1, 0);
    987     aLayout->addWidget(_adviseObsRateComboBox, 1, 1);
    988     aLayout->addWidget(new QLabel("Failure threshold"), 2, 0);
    989     aLayout->addWidget(_adviseFailSpinBox, 2, 1);
    990     aLayout->addWidget(new QLabel("Recovery threshold"), 3, 0);
    991     aLayout->addWidget(_adviseRecoSpinBox, 3, 1);
    992     aLayout->addWidget(new QLabel("Script (full path)"), 4, 0);
    993     aLayout->addWidget(_adviseScriptLineEdit, 4, 1, 1, 20);
    994     aLayout->addWidget(new QLabel(""), 5, 1);
    995     aLayout->setRowStretch(6, 999);
    996 
    997     agroup->setLayout(aLayout);
    998 
    999     // Miscellaneous
    1000     // -------------
    1001     QGridLayout* rLayout = new QGridLayout;
    1002     rLayout->setColumnMinimumWidth(0, 14 * ww);
    1003     _miscIntrComboBox->setMaximumWidth(9 * ww);
    1004     _miscPortLineEdit->setMaximumWidth(9 * ww);
    1005 
    1006     rLayout->addWidget(new QLabel("Log latencies or scan RTCM streams for message types and antenna information or output raw data through TCP/IP port.<br>"), 0, 0, 1, 50);
    1007     rLayout->addWidget(new QLabel("Mountpoint"), 1, 0);
    1008     rLayout->addWidget(_miscMountLineEdit, 1, 1, 1, 7);
    1009     rLayout->addWidget(new QLabel("Log latency"), 2, 0);
    1010     rLayout->addWidget(_miscIntrComboBox, 2, 1);
    1011     rLayout->addWidget(new QLabel("Scan RTCM"), 3, 0);
    1012     rLayout->addWidget(_miscScanRTCMCheckBox, 3, 1);
    1013     rLayout->addWidget(new QLabel("Port"), 4, 0);
    1014     rLayout->addWidget(_miscPortLineEdit, 4, 1);
    1015     rLayout->addWidget(new QLabel(""), 5, 1);
    1016     rLayout->setRowStretch(6, 999);
    1017 
    1018     rgroup->setLayout(rLayout);
    1019 
    1020     // PPP
    1021     // ---
    1022     _pppWidgets._dataSource->setMaximumWidth(15 * ww);
    1023     _pppWidgets._corrMount->setMaximumWidth(15 * ww);
    1024     _pppWidgets._nmeaPath->setMaximumWidth(35 * ww);
    1025     _pppWidgets._logPath->setMaximumWidth(35 * ww);
    1026     _pppWidgets._snxtroPath->setMaximumWidth(35 * ww);
    1027     _pppWidgets._snxtroIntr->setMaximumWidth(7 * ww);
    1028     _pppWidgets._snxtroAc->setMaximumWidth(7 * ww);
    1029     _pppWidgets._snxtroSolId->setMaximumWidth(7 * ww);
    1030     _pppWidgets._snxtroSolType->setMaximumWidth(7 * ww);
    1031     _pppWidgets._snxtroCampId->setMaximumWidth(7 * ww);
    1032     _pppWidgets._ionoMount->setMaximumWidth(15 * ww);
    1033 
    1034 
    1035     QGridLayout* pppLayout1 = new QGridLayout();
    1036     int ir = 0;
    1037     pppLayout1->addWidget(new QLabel("Precise Point Positioning - Input and Output.<br>"), ir, 0, 1, 7, Qt::AlignLeft);
    1038     ++ir;
    1039     pppLayout1->addWidget(new QLabel("Data source"), ir, 0);
    1040     pppLayout1->addWidget(_pppWidgets._dataSource, ir, 1);
    1041     pppLayout1->addWidget(new QLabel("   Logfile directory"), ir, 4);
    1042     pppLayout1->addWidget(_pppWidgets._logPath, ir, 5, 1, 3);
    1043     ++ir;
    1044     pppLayout1->addWidget(new QLabel("Corrections stream"), ir, 0);
    1045     pppLayout1->addWidget(_pppWidgets._corrMount, ir, 1);
    1046     pppLayout1->addWidget(new QLabel("Corrections file"), ir, 2);
    1047     pppLayout1->addWidget(_pppWidgets._corrFile, ir, 3);
    1048     pppLayout1->addWidget(new QLabel("   NMEA directory"), ir, 4);
    1049     pppLayout1->addWidget(_pppWidgets._nmeaPath, ir, 5, 1, 3);
    1050     ++ir;
    1051 #ifdef USE_PPP
    1052     pppLayout1->addWidget(new QLabel("Ionosphere stream"), ir, 0);
    1053     pppLayout1->addWidget(_pppWidgets._ionoMount, ir, 1);
    1054     pppLayout1->addWidget(new QLabel("Ionosphere file"), ir, 2);
    1055     pppLayout1->addWidget(_pppWidgets._ionoFile, ir, 3);
    1056 #endif
    1057     pppLayout1->addWidget(new QLabel("   SNX TRO directory"), ir, 4);
    1058     pppLayout1->addWidget(_pppWidgets._snxtroPath, ir, 5, 1, 3);
    1059     ++ir;
    1060     pppLayout1->addWidget(new QLabel("RINEX Obs file"), ir, 0);
    1061     pppLayout1->addWidget(_pppWidgets._rinexObs, ir, 1);
    1062     pppLayout1->addWidget(new QLabel("RINEX Nav file"), ir, 2);
    1063     pppLayout1->addWidget(_pppWidgets._rinexNav, ir, 3);
    1064     pppLayout1->addWidget(new QLabel("   SNX TRO interval"), ir, 4);
    1065     pppLayout1->addWidget(_pppWidgets._snxtroIntr, ir, 5);
    1066     pppLayout1->addWidget(new QLabel("   SNX TRO sampling"), ir, 6);
    1067     pppLayout1->addWidget(_pppWidgets._snxtroSampl, ir, 7, Qt::AlignRight);
    1068     ++ir;
    1069     pppLayout1->addWidget(new QLabel("ANTEX file"), ir, 0);
    1070     pppLayout1->addWidget(_pppWidgets._antexFile, ir, 1);
    1071     pppLayout1->addWidget(new QLabel("Coordinates file"), ir, 2);
    1072     pppLayout1->addWidget(_pppWidgets._crdFile, ir, 3);
    1073     pppLayout1->addWidget(new QLabel("   SNX TRO AC"), ir, 4);
    1074     pppLayout1->addWidget(_pppWidgets._snxtroAc, ir, 5);
    1075     pppLayout1->addWidget(new QLabel("   SNX TRO solution ID"), ir, 6);
    1076     pppLayout1->addWidget(_pppWidgets._snxtroSolId, ir, 7, Qt::AlignRight);
    1077     ++ir;
    1078 #ifdef USE_PPP
    1079     pppLayout1->addWidget(new QLabel("BLQ file"), ir, 0);
    1080     pppLayout1->addWidget(_pppWidgets._blqFile, ir, 1);
    1081     pppLayout1->addWidget(new QLabel("   SNX TRO campaign ID"), ir, 4);
    1082     pppLayout1->addWidget(_pppWidgets._snxtroCampId, ir, 5);
    1083     pppLayout1->addWidget(new QLabel("   SNX TRO solution type"), ir, 6);
    1084     pppLayout1->addWidget(_pppWidgets._snxtroSolType, ir, 7, Qt::AlignRight);
    1085 #endif
    1086     pppLayout1->setRowStretch(ir + 1, 999);
    1087     pppGroup1->setLayout(pppLayout1);
    1088 
    1089     QGridLayout* pppLayout2 = new QGridLayout();
    1090     ir = 0;
    1091     pppLayout2->addWidget(new QLabel("Precise Point Positioning - Options.<br>"), ir, 0, 1, 2, Qt::AlignLeft);
    1092     ++ir;
    1093     pppLayout2->addWidget(new QLabel("GPS LCs"), ir, 0, Qt::AlignLeft);
    1094     pppLayout2->addWidget(_pppWidgets._lcGPS, ir, 1);
    1095     pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 2);
    1096     pppLayout2->addWidget(new QLabel("Sigma C1"), ir, 3, Qt::AlignLeft);
    1097     pppLayout2->addWidget(_pppWidgets._sigmaC1, ir, 4); _pppWidgets._sigmaC1->setMaximumWidth(8 * ww);
    1098     pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 5);
    1099     pppLayout2->addWidget(new QLabel("Sigma L1"), ir, 6, Qt::AlignLeft);
    1100     pppLayout2->addWidget(_pppWidgets._sigmaL1, ir, 7); _pppWidgets._sigmaL1->setMaximumWidth(8 * ww);
    1101     ++ir;
    1102     pppLayout2->addWidget(new QLabel("GLONASS LCs"), ir, 0, Qt::AlignLeft);
    1103     pppLayout2->addWidget(_pppWidgets._lcGLONASS, ir, 1);
    1104     pppLayout2->addWidget(new QLabel("Max Res C1"), ir, 3, Qt::AlignLeft);
    1105     pppLayout2->addWidget(_pppWidgets._maxResC1, ir, 4); _pppWidgets._maxResC1->setMaximumWidth(8 * ww);
    1106     pppLayout2->addWidget(new QLabel("Max Res L1"), ir, 6, Qt::AlignLeft);
    1107     pppLayout2->addWidget(_pppWidgets._maxResL1, ir, 7); _pppWidgets._maxResL1->setMaximumWidth(8 * ww);
    1108     ++ir;
    1109     pppLayout2->addWidget(new QLabel("Galileo LCs"), ir, 0, Qt::AlignLeft);
    1110     pppLayout2->addWidget(_pppWidgets._lcGalileo, ir, 1);
    1111     pppLayout2->addWidget(new QLabel("Ele Wgt Code"), ir, 3, Qt::AlignLeft);
    1112     pppLayout2->addWidget(_pppWidgets._eleWgtCode, ir, 4);
    1113     pppLayout2->addWidget(new QLabel("Ele Wgt Phase"), ir, 6, Qt::AlignLeft);
    1114     pppLayout2->addWidget(_pppWidgets._eleWgtPhase, ir, 7);
    1115     ++ir;
    1116     pppLayout2->addWidget(new QLabel("BDS LCs"), ir, 0, Qt::AlignLeft);
    1117     pppLayout2->addWidget(_pppWidgets._lcBDS, ir, 1);
    1118     pppLayout2->addWidget(new QLabel("Min # of Obs"), ir, 3, Qt::AlignLeft);
    1119     pppLayout2->addWidget(_pppWidgets._minObs, ir, 4);
    1120     pppLayout2->addWidget(new QLabel("Min Elevation"), ir, 6, Qt::AlignLeft);
    1121     pppLayout2->addWidget(_pppWidgets._minEle, ir, 7); _pppWidgets._minEle->setMaximumWidth(8 * ww);
    1122     ++ir;
    1123 #ifdef USE_PPP
    1124     pppLayout2->addWidget(new QLabel("Constraints"), ir, 0, Qt::AlignLeft);
    1125     pppLayout2->addWidget(_pppWidgets._constraints, ir, 1);
    1126     pppLayout2->addWidget(new QLabel("Sigma GIM"), ir, 3, Qt::AlignLeft);
    1127     pppLayout2->addWidget(_pppWidgets._sigmaGIM, ir, 4); _pppWidgets._sigmaGIM->setMaximumWidth(8 * ww);
    1128 #endif
    1129     pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 5);
    1130     pppLayout2->addWidget(new QLabel("Wait for clock corr."), ir, 6, Qt::AlignLeft);
    1131     pppLayout2->addWidget(_pppWidgets._corrWaitTime, ir, 7);
    1132     ++ir;
    1133     pppLayout2->addItem(new QSpacerItem(8 * ww, 0), ir, 2);
    1134 #ifdef USE_PPP
    1135     pppLayout2->addWidget(new QLabel("Max Res GIM"), ir, 3, Qt::AlignLeft);
    1136     pppLayout2->addWidget(_pppWidgets._maxResGIM, ir, 4); _pppWidgets._maxResGIM->setMaximumWidth(8 * ww);
    1137 #endif
    1138     pppLayout2->addWidget(new QLabel("Seeding (sec)"), ir, 6, Qt::AlignLeft);
    1139     pppLayout2->addWidget(_pppWidgets._seedingTime, ir, 7); _pppWidgets._seedingTime->setMaximumWidth(8 * ww);
    1140     ++ir;
    1141     pppLayout2->addWidget(new QLabel(""), ir, 8);
    1142     pppLayout2->setColumnStretch(8, 999);
    1143     ++ir;
    1144     pppLayout2->addWidget(new QLabel(""), ir, 1);
    1145     pppLayout2->setRowStretch(ir, 999);
    1146 
    1147     pppGroup2->setLayout(pppLayout2);
    1148 
    1149     QVBoxLayout* pppLayout3 = new QVBoxLayout();
    1150     pppLayout3->addWidget(new QLabel("Precise Point Positioning - Processed Stations.<br>"));
    1151     pppLayout3->addWidget(_pppWidgets._staTable, 99);
    1152     QHBoxLayout* pppLayout3sub = new QHBoxLayout();
    1153     pppLayout3sub->addWidget(_pppWidgets._addStaButton);
    1154     pppLayout3sub->addWidget(_pppWidgets._delStaButton);
    1155     pppLayout3sub->addStretch(99);
    1156 
    1157     pppLayout3->addLayout(pppLayout3sub);
    1158 
    1159     pppGroup3->setLayout(pppLayout3);
    1160 
    1161     // ------------------------
    1162     connect(_pppWidgets._mapWinButton, SIGNAL(clicked()), SLOT(slotMapPPP()));
    1163     _pppWidgets._mapSpeedSlider->setMinimumWidth(33 * ww);
    1164     _pppWidgets._audioResponse->setMaximumWidth(8 * ww);
    1165 
    1166     QGridLayout* pppLayout4 = new QGridLayout();
    1167     ir = 0;
    1168     pppLayout4->addWidget(new QLabel("Precise Point Positioning - Plots.<br>"), ir, 0, 1, 50, Qt::AlignLeft);
    1169     ++ir;
    1170     pppLayout4->addWidget(new QLabel("PPP Plot"), ir, 0, Qt::AlignLeft);
    1171     pppLayout4->addWidget(_pppWidgets._plotCoordinates, ir, 1, Qt::AlignLeft);
    1172     pppLayout4->addWidget(new QLabel("Mountpoint"), ir, 2, 1, 10, Qt::AlignLeft);
    1173     pppLayout4->addWidget(_pppWidgets._audioResponse, ir, 4, Qt::AlignLeft);
    1174     pppLayout4->addWidget(new QLabel("Audio response"), ir, 5, Qt::AlignRight);
    1175     ++ir;
    1176     pppLayout4->addWidget(new QLabel("Track map"), ir, 0, Qt::AlignLeft);
    1177     pppLayout4->addWidget(_pppWidgets._mapWinButton, ir, 1, Qt::AlignLeft);
    1178     ++ir;
    1179     pppLayout4->addWidget(new QLabel("Dot-properties"), ir, 0, Qt::AlignLeft);
    1180     pppLayout4->addWidget(_pppWidgets._mapWinDotSize, ir, 1, Qt::AlignLeft);
    1181     pppLayout4->addWidget(new QLabel("Size    "), ir, 2, Qt::AlignLeft);
    1182     pppLayout4->addWidget(_pppWidgets._mapWinDotColor, ir, 3, Qt::AlignLeft);
    1183     pppLayout4->addWidget(new QLabel("Color"), ir, 4, Qt::AlignLeft);
    1184     ++ir;
    1185     pppLayout4->addWidget(new QLabel("Post-processing speed"), ir, 0, Qt::AlignLeft);
    1186     pppLayout4->addWidget(_pppWidgets._mapSpeedSlider, ir, 1, 1, 20, Qt::AlignLeft);
    1187     ++ir;
    1188     pppLayout4->addWidget(new QLabel(""), ir, 1);
    1189     pppLayout4->setRowStretch(ir, 999);
    1190 
    1191     pppGroup4->setLayout(pppLayout4);
    1192 
    1193     // Reqc Processing
    1194     // ---------------
    1195     _reqcActionComboBox = new QComboBox();
    1196     _reqcActionComboBox->setEditable(false);
    1197     _reqcActionComboBox->addItems(QString(",Edit/Concatenate,Analyze").split(","));
    1198     int ip = _reqcActionComboBox->findText(settings.value("reqcAction").toString());
    1199     if (ip != -1) {
    1200         _reqcActionComboBox->setCurrentIndex(ip);
    1201     }
    1202     connect(_reqcActionComboBox, SIGNAL(currentIndexChanged(const QString&)),
    1203         this, SLOT(slotBncTextChanged()));
    1204 
    1205     QGridLayout* reqcLayout = new QGridLayout;
    1206     _reqcActionComboBox->setMinimumWidth(15 * ww);
    1207     _reqcActionComboBox->setMaximumWidth(20 * ww);
    1208 
    1209     _reqcObsFileChooser = new qtFileChooser(0, qtFileChooser::Files);
    1210     _reqcObsFileChooser->setFileName(settings.value("reqcObsFile").toString());
    1211 
    1212     _reqcNavFileChooser = new qtFileChooser(0, qtFileChooser::Files);
    1213     _reqcNavFileChooser->setFileName(settings.value("reqcNavFile").toString());
    1214     _reqcOutObsLineEdit = new QLineEdit(settings.value("reqcOutObsFile").toString());
    1215     _reqcOutNavLineEdit = new QLineEdit(settings.value("reqcOutNavFile").toString());
    1216     _reqcOutLogLineEdit = new QLineEdit(settings.value("reqcOutLogFile").toString());
    1217     _reqcPlotDirLineEdit = new QLineEdit(settings.value("reqcPlotDir").toString());
    1218     _reqcSkyPlotSignals = new QLineEdit(settings.value("reqcSkyPlotSignals").toString());
    1219 
    1220     connect(_reqcSkyPlotSignals, SIGNAL(textChanged(const QString&)),
    1221         this, SLOT(slotBncTextChanged()));
    1222 
    1223     _reqcLogSummaryOnly = new QCheckBox();
    1224     _reqcLogSummaryOnly->setCheckState(Qt::CheckState(settings.value("reqcLogSummaryOnly").toInt()));
    1225 
    1226     ir = 0;
    1227     reqcLayout->addWidget(new QLabel("RINEX file editing, concatenation and quality check.<br>"), ir, 0, 1, 8);
    1228     ++ir;
    1229     reqcLayout->addWidget(new QLabel("Action"), ir, 0);
    1230     reqcLayout->addWidget(_reqcActionComboBox, ir, 1);
    1231     _reqcEditOptionButton = new QPushButton("Set Edit Options");
    1232     _reqcEditOptionButton->setMinimumWidth(15 * ww);
    1233     _reqcEditOptionButton->setMaximumWidth(20 * ww);
    1234 
    1235     reqcLayout->addWidget(_reqcEditOptionButton, ir, 3);
    1236     ++ir;
    1237     reqcLayout->addWidget(new QLabel("Input files (full path)"), ir, 0);
    1238     reqcLayout->addWidget(_reqcObsFileChooser, ir, 1);
    1239     _reqcObsFileChooser->setMaximumWidth(40 * ww);
    1240     reqcLayout->addWidget(new QLabel("  Obs"), ir, 2);
    1241     reqcLayout->addWidget(_reqcNavFileChooser, ir, 3);
    1242     _reqcNavFileChooser->setMaximumWidth(40 * ww);
    1243     reqcLayout->addWidget(new QLabel("  Nav"), ir, 4);
    1244     ++ir;
    1245     reqcLayout->addWidget(new QLabel("Output file (full path)"), ir, 0);
    1246     reqcLayout->addWidget(_reqcOutObsLineEdit, ir, 1);
    1247     _reqcOutObsLineEdit->setMaximumWidth(40 * ww);
    1248     reqcLayout->addWidget(new QLabel("  Obs"), ir, 2);
    1249     reqcLayout->addWidget(_reqcOutNavLineEdit, ir, 3);
    1250     _reqcOutNavLineEdit->setMaximumWidth(40 * ww);
    1251     reqcLayout->addWidget(new QLabel("  Nav"), ir, 4);
    1252     ++ir;
    1253     reqcLayout->addWidget(new QLabel("Logfile"), ir, 0);
    1254     reqcLayout->addWidget(_reqcOutLogLineEdit, ir, 1);
    1255     _reqcOutLogLineEdit->setMaximumWidth(40 * ww);
    1256     reqcLayout->addWidget(new QLabel("  Summary only"), ir, 2);
    1257     reqcLayout->addWidget(_reqcLogSummaryOnly, ir, 3);
    1258     ++ir;
    1259     reqcLayout->addWidget(new QLabel("Plots for signals"), ir, 0);
    1260     reqcLayout->addWidget(_reqcSkyPlotSignals, ir, 1);
    1261     _reqcSkyPlotSignals->setMaximumWidth(40 * ww);
    1262     ++ir;
    1263     reqcLayout->addWidget(new QLabel("Directory for plots"), ir, 0);
    1264     reqcLayout->addWidget(_reqcPlotDirLineEdit, ir, 1);
    1265     _reqcPlotDirLineEdit->setMaximumWidth(40 * ww);
    1266     ++ir;
    1267     reqcLayout->setRowStretch(ir, 999);
    1268 
    1269     reqcLayout->setColumnMinimumWidth(2, 8 * ww);
    1270     reqcLayout->setColumnMinimumWidth(4, 8 * ww);
    1271 
    1272     reqcgroup->setLayout(reqcLayout);
    1273 
    1274     connect(_reqcEditOptionButton, SIGNAL(clicked()),
    1275         this, SLOT(slotReqcEditOption()));
    1276 
    1277     QGridLayout* sp3CompLayout = new QGridLayout;
    1278 
    1279     _sp3CompFileChooser = new qtFileChooser(0, qtFileChooser::Files);
    1280     _sp3CompFileChooser->setFileName(settings.value("sp3CompFile").toString());
    1281     _sp3CompFileChooser->setMinimumWidth(15 * ww);
    1282     _sp3CompFileChooser->setMaximumWidth(40 * ww);
    1283 
    1284     _sp3CompExclude = new QLineEdit(settings.value("sp3CompExclude").toString());
    1285     _sp3CompExclude->setMinimumWidth(18 * ww);
    1286     _sp3CompExclude->setMaximumWidth(18 * ww);
    1287 
    1288     _sp3CompLogLineEdit = new QLineEdit(settings.value("sp3CompOutLogFile").toString());
    1289     _sp3CompLogLineEdit->setMinimumWidth(18 * ww);
    1290     _sp3CompLogLineEdit->setMaximumWidth(18 * ww);
    1291 
    1292     _sp3CompSummaryOnly = new QCheckBox();
    1293     _sp3CompSummaryOnly->setCheckState(Qt::CheckState(settings.value("sp3CompSummaryOnly").toInt()));
    1294 
    1295     ir = 0;
    1296     sp3CompLayout->addWidget(new QLabel("Orbit and clock comparison.<br>"), ir, 0, 1, 40);
    1297     ++ir;
    1298     sp3CompLayout->addWidget(new QLabel("Input SP3 files (full path)"), ir, 0, Qt::AlignLeft);
    1299     sp3CompLayout->addWidget(_sp3CompFileChooser, ir, 1, 1, 20);
    1300     ++ir;
    1301     sp3CompLayout->addWidget(new QLabel("Exclude satellites"), ir, 0, Qt::AlignLeft);
    1302     sp3CompLayout->addWidget(_sp3CompExclude, ir, 1, Qt::AlignRight);
    1303     ++ir;
    1304     sp3CompLayout->addWidget(new QLabel("Logfile"), ir, 0, Qt::AlignLeft);
    1305     sp3CompLayout->addWidget(_sp3CompLogLineEdit, ir, 1, Qt::AlignRight);
    1306     ++ir;
    1307     sp3CompLayout->addWidget(new QLabel("Summary only"), ir, 0);
    1308     sp3CompLayout->addWidget(_sp3CompSummaryOnly, ir, 1);
    1309     ++ir;
    1310     sp3CompLayout->addWidget(new QLabel(""), ir, 1);
    1311     ++ir;
    1312     sp3CompLayout->setRowStretch(ir, 999);
    1313 
    1314     sp3CompLayout->setColumnMinimumWidth(2, 8 * ww);
    1315     sp3CompLayout->setColumnMinimumWidth(4, 8 * ww);
    1316 
    1317     sp3CompGroup->setLayout(sp3CompLayout);
    1318 
    1319     connect(_sp3CompFileChooser, SIGNAL(fileNameChanged(const QString&)),
    1320         this, SLOT(slotBncTextChanged()));
    1321 
    1322     // Combine Corrections
    1323     // -------------------
    1324     QGridLayout* cmbLayout = new QGridLayout;
    1325 
    1326     populateCmbTable();
    1327     cmbLayout->addWidget(_cmbTable, 0, 0, 8, 10);
    1328     cmbLayout->addWidget(new QLabel(" Combine Broadcast Correction streams"), 0, 10, 1, 10);
    1329     cmbLayout->addWidget(addCmbRowButton, 1, 10);
    1330     cmbLayout->addWidget(delCmbRowButton, 1, 11);
    1331     cmbLayout->addWidget(new QLabel("Method"), 2, 10, Qt::AlignLeft);
    1332     cmbLayout->addWidget(_cmbMethodComboBox, 2, 11);
    1333     cmbLayout->addWidget(new QLabel("BSX File"), 3, 10, Qt::AlignLeft);
    1334     cmbLayout->addWidget(_cmbBsxFile, 3, 11, Qt::AlignRight);
    1335     cmbLayout->addWidget(new QLabel("Max Clk Residual"), 4, 10, Qt::AlignLeft);
    1336     cmbLayout->addWidget(_cmbMaxresLineEdit, 4, 11, Qt::AlignRight);
    1337     cmbLayout->addWidget(new QLabel("Max Orb Displacement"), 5, 10, Qt::AlignLeft);
    1338     cmbLayout->addWidget(_cmbMaxdisplacementLineEdit, 5, 11, Qt::AlignRight);
    1339     cmbLayout->addWidget(new QLabel("Logfile directory"), 6, 10, Qt::AlignLeft);
    1340     cmbLayout->addWidget(_cmbLogPath, 6, 11, Qt::AlignRight);
    1341     cmbLayout->addWidget(new QLabel("Sampling"), 7, 10, Qt::AlignLeft);
    1342     cmbLayout->addWidget(_cmbSamplComboBox, 7, 11, Qt::AlignRight);
    1343 
    1344 
    1345     cmbLayout->addWidget(new QLabel("GNSS"), 0, 14, Qt::AlignLeft);
    1346     cmbLayout->addWidget(new QLabel("GPS (C1W/C2W)"), 1, 14);
    1347     cmbLayout->addWidget(_cmbGpsCheckBox, 1, 15);
    1348 
    1349     cmbLayout->addWidget(new QLabel("GLONASS (C1P/C2P)"), 2, 14);
    1350     cmbLayout->addWidget(_cmbGloCheckBox, 2, 15);
    1351 
    1352     cmbLayout->addWidget(new QLabel("Galileo (C1C/C5Q)"), 3, 14);
    1353     cmbLayout->addWidget(_cmbGalCheckBox, 3, 15);
    1354 
    1355     cmbLayout->addWidget(new QLabel("Beidou (C2I/C6I)"), 4, 14);
    1356     cmbLayout->addWidget(_cmbBdsCheckBox, 4, 15);
    1357 
    1358     cmbLayout->addWidget(new QLabel("QZSS (C1C/C2L)"), 5, 14);
    1359     cmbLayout->addWidget(_cmbQzssCheckBox, 5, 15);
    1360 
    1361     cmbLayout->addWidget(new QLabel("SBAS (C1C/C5Q)"), 6, 14);
    1362     cmbLayout->addWidget(_cmbSbasCheckBox, 6, 15);
    1363 
    1364     cmbLayout->addWidget(new QLabel("NavIC"), 7, 14);
    1365     cmbLayout->addWidget(_cmbNavicCheckBox, 7, 15);
    1366     cmbLayout->setRowStretch(9, 999);
    1367 
    1368     connect(addCmbRowButton, SIGNAL(clicked()), this, SLOT(slotAddCmbRow()));
    1369     connect(delCmbRowButton, SIGNAL(clicked()), this, SLOT(slotDelCmbRow()));
    1370 
    1371     cmbgroup->setLayout(cmbLayout);
    1372 
    1373     // Upload Layout (Clocks)
    1374     // ----------------------
    1375     QGridLayout* uploadHlpLayout = new QGridLayout();
    1376 
    1377     connect(addUploadRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRow()));
    1378     connect(delUploadRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRow()));
    1379     connect(setUploadTrafoButton, SIGNAL(clicked()), this, SLOT(slotSetUploadTrafo()));
    1380 
    1381     uploadHlpLayout->addWidget(addUploadRowButton, 0, 0);
    1382     uploadHlpLayout->addWidget(delUploadRowButton, 0, 1);
    1383     uploadHlpLayout->addWidget(new QLabel("Interval"), 0, 2, Qt::AlignRight);
    1384     uploadHlpLayout->addWidget(_uploadIntrComboBox, 0, 3);
    1385     uploadHlpLayout->addWidget(new QLabel("     Sampling:    Orb"), 0, 4, Qt::AlignRight);
    1386     uploadHlpLayout->addWidget(_uploadSamplRtcmEphCorrComboBox, 0, 5);
    1387     uploadHlpLayout->addWidget(new QLabel("SP3"), 0, 6, Qt::AlignRight);
    1388     uploadHlpLayout->addWidget(_uploadSamplSp3ComboBox, 0, 7);
    1389     uploadHlpLayout->addWidget(new QLabel("RNX"), 0, 8, Qt::AlignRight);
    1390     uploadHlpLayout->addWidget(_uploadSamplClkRnxSpinBox, 0, 9);
    1391     uploadHlpLayout->addWidget(new QLabel("BSX"), 0, 10, Qt::AlignRight);
    1392     uploadHlpLayout->addWidget(_uploadSamplBiaSnxSpinBox, 0, 11);
    1393     uploadHlpLayout->addWidget(setUploadTrafoButton, 0, 12);
    1394     uploadHlpLayout->addWidget(new QLabel("ANTEX file"), 1, 0, Qt::AlignLeft);
    1395     uploadHlpLayout->addWidget(_uploadAntexFile, 1, 1, 1, 4);
    1396 
    1397     QBoxLayout* uploadLayout = new QBoxLayout(QBoxLayout::TopToBottom);
    1398     populateUploadTable();
    1399 
    1400     uploadLayout->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Corrections to Broadcaster.<br>"));
    1401     uploadLayout->addWidget(_uploadTable);
    1402     uploadLayout->addLayout(uploadHlpLayout);
    1403 
    1404     uploadgroup->setLayout(uploadLayout);
    1405 
    1406     // Upload Layout (Ephemeris)
    1407     // -------------------------
    1408     QGridLayout* uploadHlpLayoutEph = new QGridLayout();
    1409 
    1410     connect(addUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadEphRow()));
    1411     connect(delUploadEphRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadEphRow()));
    1412 
    1413     uploadHlpLayoutEph->addWidget(addUploadEphRowButton, 0, 0);
    1414     uploadHlpLayoutEph->addWidget(delUploadEphRowButton, 0, 1);
    1415     uploadHlpLayoutEph->addWidget(new QLabel("     Sampling"), 0, 2, Qt::AlignRight);
    1416     uploadHlpLayoutEph->addWidget(_uploadSamplRtcmEphSpinBox, 0, 3);
    1417 
    1418     QBoxLayout* uploadLayoutEph = new QBoxLayout(QBoxLayout::TopToBottom);
    1419     populateUploadEphTable();
    1420 
    1421     uploadLayoutEph->addWidget(new QLabel("Upload RTCM Version 3 Broadcast Ephemeris to Broadcaster.<br>"));
    1422     uploadLayoutEph->addWidget(_uploadEphTable);
    1423     uploadLayoutEph->addLayout(uploadHlpLayoutEph);
    1424 
    1425     uploadEphgroup->setLayout(uploadLayoutEph);
    1426 
    1427 
    1428     // Upload Layout (Raw Data)
    1429     // -------------------------
    1430     QGridLayout* uploadHlpLayoutRaw = new QGridLayout();
    1431 
    1432     connect(addUploadRawRowButton, SIGNAL(clicked()), this, SLOT(slotAddUploadRawRow()));
    1433     connect(delUploadRawRowButton, SIGNAL(clicked()), this, SLOT(slotDelUploadRawRow()));
    1434 
    1435     uploadHlpLayoutRaw->addWidget(addUploadRawRowButton, 0, 0);
    1436     uploadHlpLayoutRaw->addWidget(delUploadRawRowButton, 0, 1);
    1437 
    1438     QBoxLayout* uploadLayoutRaw = new QBoxLayout(QBoxLayout::TopToBottom);
    1439     populateUploadRawTable();
    1440 
    1441     uploadLayoutRaw->addWidget(new QLabel("Upload Raw Data to Broadcaster (Ntrip Server Functionality).<br>"));
    1442     uploadLayoutRaw->addWidget(_uploadRawTable);
    1443     uploadLayoutRaw->addLayout(uploadHlpLayoutRaw);
    1444 
    1445     uploadRawgroup->setLayout(uploadLayoutRaw);
    1446 
    1447     // Main Layout
    1448     // -----------
    1449     QGridLayout* mLayout = new QGridLayout;
    1450     _aogroup->setCurrentIndex(settings.value("startTab").toInt());
    1451     mLayout->addWidget(_aogroup, 0, 0);
    1452     mLayout->addWidget(_mountPointsTable, 1, 0);
    1453     _loggroup->setCurrentIndex(settings.value("statusTab").toInt());
    1454     mLayout->addWidget(_loggroup, 2, 0);
    1455 
    1456     _canvas->setLayout(mLayout);
    1457 
    1458     // WhatsThis, Network
    1459     // ------------------
    1460     _proxyHostLineEdit->setWhatsThis(tr("<p>If you are running BNC within a protected Local Area Network (LAN), you may 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. Without any entry, BNC will try to use the system proxies. </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 this is not possible, you may need to run BNC outside your LAN on a network that has unobstructed connection to the Internet. <i>[key: proxyHost]</i></p>"));
    1461     _proxyPortLineEdit->setWhatsThis(tr("<p>Enter your proxy server port number in case a proxy is operated in front of BNC. <i>[key: proxyPort]</i></p>"));
    1462     _sslCaCertPathLineEdit->setWhatsThis(tr("<p>Communication with an Ntrip Broadcaster over SSL requires the exchange of server certificates. Specify the path to a directory where you save CA certificates on your system. </p><p>BNC creates from *.crt and *.pem files a CA certificate database, which is used by the socket during the handshake phase to validate the peer's certificate. </p><p>Note that SSL communication is usually done over port 443. <i>[key: sslCaCertPath]</i></p>"));
    1463     _sslClientCertPathLineEdit->setWhatsThis(tr("<p>Two-sided communication with an Ntrip Broadcaster over SSL requires in addition the exchange of client certificates. Specify the full path to the client certificates on your system.</p><p></p><p>The file naming convention for client certificates in BNC is as follows: &lt;hostname&gt;.&lt;port&gt;.crt for the certificate and &lt;hostname&gt;.&lt;port&gt;.key for the private key, where &lt;hostname&gt; is without https://. </p><p> If available, the client or personal authentication certificate is presented to the peer during the SSL handshake process. Password protected key files are not supported. </p><p>Don't try communication via two sided SSL if you are not sure whether this is supported by the involved Ntrip Broadcaster. </p><p>Note that SSL communication is usually done over port 443. <i>[key: sslClientCertPath]</i></p>"));
    1464     _sslIgnoreErrorsCheckBox->setWhatsThis(tr("<p>SSL communication may involve queries coming from the Ntrip Broadcaster. Tick 'Ignore SSL authorization errors' if you don't want to be bothered with this. <i>[key: sslIgnoreErrors]</i></p>"));
    1465 
    1466     // WhatsThis, General
    1467     // ------------------
    1468     _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 for that 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. <i>[key: logFile]</i></p>"));
    1469     _rnxAppendCheckBox->setWhatsThis(tr("<p>When BNC is started, new files are created by default and file content already available under the same name will be overwritten. However, users might want to append already existing files following a regular restart or a crash of BNC or its platform.</p><p>Tick 'Append files' to continue with existing files and keep what has been recorded so far. <i>[key: rnxAppend]</i></p>"));
    1470     _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. The default entry is 'no' that means the reread function is switched of. <p></p>Select '1 min', '5 min', '1 hour', or '1 day' to force BNC to reread its configuration every full minute, five minutes, 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 via button 'Save & Reread Configuration'. <i>[key: onTheFlyInterval]</i></p>"));
    1471     _autoStartCheckBox->setWhatsThis(tr("<p>Tick 'Auto start' for auto-start of BNC at startup time in window mode with preassigned processing options. <i>[key: autoStart]</i></p>"));
    1472     _rawOutFileLineEdit->setWhatsThis(tr("<p>Save all data coming in through various streams in the received order and format in one file.</p><p>This option is primarily meant for debugging purposes. <i>[key: rawOutFile]</i></p>"));
    1473 
    1474     // WhatsThis, RINEX Observations
    1475     // -----------------------------
    1476     _rnxPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where the RINEX Observation files will be stored.</p><p>If the specified directory does not exist, BNC will not create RINEX Observation files. <i>[key: rnxPath]</i></p>"));
    1477     _rnxIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Observation file. <i>[key: rnxIntr]</i></p>"));
    1478     _rnxSamplComboBox->setWhatsThis(tr("<p>Select the RINEX Observation sampling interval in seconds. <i>[key: rnxSampl]</i></p>"));
    1479     _rnxSkelExtComboBox->setWhatsThis(tr("<p>BNC allows using personal RINEX skeleton files that contain the RINEX header records you would like to include. You can derive a skeleton file from information given in an up to date sitelog.</p><p>A file in the RINEX Observations 'Directory' with a 'Skeleton extension' skl or SKL is interpreted by BNC as a personal RINEX header skeleton file for the corresponding stream. <i>[key: rnxSkel]</i></p>"));
    1480     _rnxSkelPathLineEdit->setWhatsThis(tr("<p>Here you specify the path to where local skeleton files are located.</p><p> If no directory is specified, the path is assumed to where the RINEX Observation files will stored. <i>[key: rnxSkelPath]</i></p>"));
    1481     _rnxFileCheckBox->setWhatsThis(tr("<p>Tick check box 'Skeleton mandatory' in case you want that RINEX files are only produced if skeleton files are available for BNC. If no skeleton file is available for a particular source then no RINEX Observation file will be produced from the affected stream.</p><p>Note that a skeleton file contains RINEX header information such as receiver and antenna types. In case of stream conversion to RINEX Version 3, a skeleton file should also contain information on potentially available observation types. A missing skeleton file will therefore enforce BNC to only save a default set of RINEX 3 observation types. <i>[key: rnxOnlyWithSKL]</i></p>"));
    1482     _rnxScrpLineEdit->setWhatsThis(tr("<p>Whenever a RINEX Observation file is finally saved, you may want to compress, copy or upload it immediately, for example via FTP. BNC allows you to execute a script/batch file to carry out such operation.</p><p>Specify the full path of a script or batch file. BNC will pass the full RINEX Observation file path to the script as command line parameter (%1 on Windows systems, $1 on Unix/Linux/Mac systems). <i>[key: rnxScript]</i></p>"));
    1483     _rnxV2Priority->setWhatsThis(tr("<p>Specify a priority list of characters defining signal attributes as defined in RINEX Version 3. Priorities will be used to map observations with RINEX Version 3 attributes from incoming streams to Version 2. The underscore character '_' stands for undefined attributes. A question mark '?' can be used as wildcard which represents any one character.</p><p>Signal priorities can be specified as equal for all systems, as system specific or as system and freq. specific. For example: </li><ul><li>'CWPX_?' (General signal priorities valid for all GNSS) </li><li>'I:ABCX' (System specific signal priorities for NavIC) </li><li>'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX' (System and frequency specific signal priorities) </li></ul>Default is the following priority list 'G:12&PWCSLX G:5&IQX R:12&PC R:3&IQX R:46&ABX E:16&BCXZ E:578&IQX J:1&SLXCZ J:26&SLX J:5&IQX C:267&IQX C:18&DPX I:ABCX S:1&C S:5&IQX'. <i>[key: rnxV2Priority]</i></p>"));
    1484     _rnxVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Observation files. <i>[key: rnxVersion]</i></p>"));
    1485 
    1486     // WhatsThis, RINEX Ephemeris
    1487     // --------------------------
    1488     _ephPathLineEdit->setWhatsThis(tr("<p>Specify the path for saving Broadcast Ephemeris data as RINEX Navigation files.</p><p>If the specified directory does not exist, BNC will not create RINEX Navigation files. <i>[key: ephPath]</i></p>"));
    1489     _ephIntrComboBox->setWhatsThis(tr("<p>Select the length of the RINEX Navigation file. <i>[key: ephIntr]</i></p>"));
    1490     _ephOutPortLineEdit->setWhatsThis(tr("<p>BNC can produce ephemeris data in RINEX Navigation ASCII format on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: ephOutPort]</i></p>"));
    1491     _ephVersComboBox->setWhatsThis(tr("<p>Select the format for RINEX Navigation files. <i>[key: ephVersion]</i></p>"));
    1492     //_ephFilePerStation->setWhatsThis(tr("<p>By default, all received Broadcast Ephemeris data will be stored within one File. Thick 'File per Stations' to get separate files per station/mountpoint. <i>[key: ephFilePerStation]</i></p>"));
    1493 
    1494     // WhatsThis, RINEX Editing & QC
    1495     // -----------------------------
    1496     _reqcActionComboBox->setWhatsThis(tr("<p>BNC allows to 'Edit or Concatenate' RINEX Version 2 or 3 files or to perform a Quality Check (QC) and 'Analyze' data following UNAVCO's famous 'teqc' program. <i>[key: reqcAction]</i></p>"));
    1497     _reqcEditOptionButton->setWhatsThis(tr("<p>Specify options for editing RINEX Version 2 or 3 files.</p>"));
    1498     _reqcObsFileChooser->setWhatsThis(tr("<p>Specify the full path to input observation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX observation file is mandatory. <i>[key: reqcObsFile]</i></p>"));
    1499     _reqcNavFileChooser->setWhatsThis(tr("<p>Specify the full path to input navigation files in RINEX Version 2 or 3 format.</p><p>Note that when in 'Analyze' mode, specifying at least one RINEX navigation file is mandatory. <i>[key: reqcNavFile]</i></p>"));
    1500     _reqcOutObsLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Observation output file.</p><p>Default is an empty option field, meaning that no RINEX Observation output file will be produced. <i>[key: reqcOutObsFile]</i></p>"));
    1501     _reqcOutNavLineEdit->setWhatsThis(tr("<p>Specify the full path to a RINEX Navigation output file.</p><p>Default is an empty option field, meaning that no RINEX Navigation output file will be produced. <i>[key: reqcOutNavFile]</i></p>"));
    1502     _reqcOutLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile.</p><p>Default is an empty option field, meaning that no 'RINEX Editing & QC' logfile will be produced. <i>[key: reqcOutLogFile]</i></p>"));
    1503     _reqcLogSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from editing or analyzing RINEX data. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: reqcLogSummaryOnly]</i></p>"));
    1504     _reqcPlotDirLineEdit->setWhatsThis(tr("<p>Specify a directory for saving plots in PNG format.</p><p>Default is an empty option field, meaning that plots will not be saved on disk. <i>[key: reqcPlotDir]</i></p>"));
    1505     _reqcSkyPlotSignals->setWhatsThis(tr("<p>BNC can produce plots for multipath, signal-to-noise ratio, satellite availability, satellite elevation, and PDOP values. The 'Plots for signals' option lets you exactly specify observation signals to be used for that and also enables the plot generation. You can specify the navigation system, the frequency, and the tracking mode or channel as defined in RINEX Version 3. Specifications for frequency and tracking mode or channel must be separated by ampersand character '&'. Specifications for navigation systems must be separated by blank character ' '.</p><p>Examples for 'Plots for signals' option:<ul><li> G:1&2&5 R:1&2&3 E:1&7 C:2&6 J:1&2 I:5&9 S:1&5 <br>(Plots will be based on GPS observations on 1st and 2nd frequency, GLONASS observations on 1st and 2nd frequency, QZSS observations on 1st and 2nd frequency, Galileo observations on 1st and 7th frequency, BeiDou observations on 1st and 6th frequency, SBAS observations on 1st frequency.)</li><li>G:1C&5X<br>(Plots will be based on GPS observations on 1st frequency in C tracking mode and GPS observations on 5th frequency in X tracking mode.)</li><li>C:6I&7I<br>(Plots will be based on BeiDou observations on 6th frequency in I tracking mode and BeiDou observations on 7th frequency in I tracking mode.)<li></ul></p><p>Default is 'G:1&2 R:1&2 E:1&5 C:2&6 J:1&2 I:5&9 S:1&5'. Specifying an empty option string would be overruled by this default. <i>[key: reqcSkyPlotSignals]</i></p>"));
    1506 
    1507     // WhatsThis, SP3 Comparison
    1508     // -------------------------
    1509     _sp3CompFileChooser->setWhatsThis(tr("<p>BNC can compare two SP3 files containing GNSS satellite orbit and clock information.</p></p>Specify the full path to two files with orbits and clocks in SP3 format, separate them by comma. <i>[key: sp3CompFile]</i></p>"));
    1510     _sp3CompExclude->setWhatsThis(tr("<p>Specify satellites to exclude them from orbit and clock comparison. Example:<p>G04,G31,R</p><p>This excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from the comparison.</p><p>Default is an empty option field, meaning that no satellite is excluded from the comparison. <i>[key: sp3CompExclude]</i></p>"));
    1511     _sp3CompLogLineEdit->setWhatsThis(tr("<p>Specify the full path to a logfile saving comparison results.</p><p>Specifying a logfile is mandatory. Comparing SP3 files and not saving comparison results on disk would be useless. <i>[key: sp3CompOutLogFile]</i></p>"));
    1512     _sp3CompSummaryOnly->setWhatsThis(tr("<p>By default BNC produces a detailed 'Logfile' providing all information resulting from comparing SP3 files. If that is too much information, you can limit the logfile content to a short summary.</p><p>Tick 'Summary only' to suppress full logfile output and instead produce a logfile containing only summary information. <i>[key: sp3CompSummaryOnly]</i></p>"));
    1513 
    1514     // WhatsThis, Broadcast Corrections
    1515     // --------------------------------
    1516     _corrPathLineEdit->setWhatsThis(tr("<p>Specify a directory for saving Broadcast Ephemeris Correction files.</p><p>If the specified directory does not exist, BNC will not create the files. <i>[key: corrPath]</i></p>"));
    1517     _corrIntrComboBox->setWhatsThis(tr("<p>Select the length of Broadcast Ephemeris Correction files. <i>[key: corrIntr]</i></p>"));
    1518     _corrPortLineEdit->setWhatsThis(tr("<p>BNC can produce Broadcast Ephemeris Corrections on your local host through an IP port.</p><p>Specify a port number here to activate this function. <i>[key: corrPort]</i></p>"));
    1519 
    1520     // WhatsThis, Feed Engine
    1521     // ----------------------
    1522     _outPortLineEdit->setWhatsThis(tr("<p>BNC can produce synchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outPort]</i></p>"));
    1523     _outWaitSpinBox->setWhatsThis(tr("<p>When feeding a real-time GNSS network engine waiting for synchronized input epoch by epoch, BNC drops whatever is received later than 'Wait for full obs epoch' seconds.</p><p>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 product. <i>[key: outWait]</i></p>"));
    1524     _outSamplComboBox->setWhatsThis(tr("<p>Select a synchronized observation sampling interval in seconds. <i>[key: outSampl]</i></p>"));
    1525     _outFileLineEdit->setWhatsThis(tr("<p>Specify the full path to a file where synchronized observations are saved in plain ASCII format.</p><p>Beware that the size of this file can rapidly increase depending on the number of incoming streams. <i>[key: outFile]</i></p>"));
    1526     _outUPortLineEdit->setWhatsThis(tr("<p>BNC can produce unsynchronized observations in a plain ASCII format on your local host via IP port.</p><p>Specify a port number to activate this function. <i>[key: outUPort]</i></p>"));
    1527     _outLockTimeCheckBox->setWhatsThis(tr("<p>Print the lock time in seconds in the feed engine output.<i>[key: outLockTime]</i></p>"));
    1528 
    1529     // WhatsThis, Serial Output
    1530     // ------------------------
    1531     _serialMountPointLineEdit->setWhatsThis(tr("<p>Enter a 'Mountpoint' to forward the corresponding stream to a serial connected receiver.</p><p>Depending on the stream content, the receiver may use it for example for Differential GNSS, Precise Point Positioning or any other purpose supported by its firmware. <i>[key: serialMountPoint]</i></p>"));
    1532     _serialPortNameLineEdit->setWhatsThis(tr("<p>Enter the serial 'Port name' selected for communication with your serial connected receiver. Valid port names are e.g.</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 before you start BNC, you must plug a serial cable in the port defined here. <i>[key: serialPortName]</i></p>"));
    1533     _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. Using a high baud rate is recommended. <i>[key: serialBaudRate]</i></p>"));
    1534     _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. <i>[key: serialFlowControl]</i></p>"));
    1535     _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. <i>[key: serialDataBits]</i></p>"));
    1536     _serialParityComboBox->setWhatsThis(tr("<p>Select a 'Parity' for the serial output link.</p><p>Note that your selection must equal the parity selection configured to the serial connected receiver. The parity is often set to 'NONE'. <i>[key: serialParity]</i></p>"));
    1537     _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. <i>[key: serialStopBits]</i></p>"));
    1538     _serialAutoNMEAComboBox->setWhatsThis(tr("<p>The 'NMEA' option supports the so-called 'Virtual Reference Station' (VRS) concept which requires the receiver to send approximate position information to the Ntrip Broadcaster. Select 'no' if you don't want BNC to forward or upload any NMEA message to the Ntrip Broadcaster in support of VRS.</p><p>Select 'Auto' to automatically forward NMEA messages of type GGA from your serial connected receiver to the Ntrip Broadcaster and/or save them in a file.</p><p>Select 'Manual GPGGA' or 'Manual GNGGA' if you want BNC to produce and upload GPGGA or GNGGA NMEA messages to the Ntrip Broadcaster because your serial connected receiver doesn't generate these messages. A Talker ID 'GP' preceding the GGA string stands for GPS solutions while a Talker ID 'GN' stands for multi constellation solutions.</p><p>Note that selecting 'Auto' or 'Manual' works only for VRS streams which show up under the 'Streams' canvas on BNC's main window with 'nmea' stream attribute set to 'yes'. This attribute is either extracted from the Ntrip Broadcaster's source-table or introduced by the user via editing the BNC configuration file. <i>[key: serialAutoNMEA]</i></p>"));
    1539     _serialFileNMEALineEdit->setWhatsThis(tr("<p>Specify the full path to a file where NMEA messages coming from your serial connected receiver are saved.</p><p>Default is an empty option field, meaning that NMEA messages will not be saved on disk. <i>[key: serialFileNMEA]</i></p>"));
    1540     _serialHeightNMEALineEdit->setWhatsThis(tr("<p>Specify an approximate 'Height' above mean sea level in meters for the reference station introduced by option 'Mountpoint'. Together with the latitude and longitude from the source-table, the height information is used to build GGA messages to be sent to the Ntrip Broadcaster.</p><p>For adjusting latitude and longitude values of a VRS stream given in the 'Streams' canvas, you can double click the latitude/longitude data fields, specify appropriate values and then hit Enter.</p><p>This option is only relevant when option 'NMEA' is set to 'Manual GPGGA' or 'Manual GNGGA' respectively. <i>[key: serialHeightNMEA]</i></p>"));
    1541     _serialNMEASamplingSpinBox->setWhatsThis(tr("<p>Select a sampling interval in seconds for manual or receiver generated NMEA GGA sentences and their upload.</p><p>A sampling rate of '0' means, a GGA sentence will be send only once to initialize the requested VRS stream. Note that some VRS systems need GGA sentences at regular intervals. <i>[key: serialNMEASampling]</i></p>"));
    1542 
    1543     // WhatsThis, Outages
    1544     // ------------------
    1545     _adviseObsRateComboBox->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><p>Default is an empty option field, meaning that you don't want BNC to report on stream failures or recoveries when exceeding a threshold time span. <i>[key: adviseObsRate]</i></p>"));
    1546     _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. <i>[key: adviseFail]</i></p>"));
    1547     _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. <i>[key: adviseReco]</i></p>"));
    1548     _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 a comment '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.</p><p>An empty option field (default) or invalid path means that you don't want to use this option. <i>[key: adviseScript]</i></p>"));
    1549 
    1550     // WhatsThis, Miscellaneous
    1551     // ------------------------
    1552     _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. <i>[key: miscMount]</i></p>"));
    1553     _miscIntrComboBox->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. <i>[key: miscIntr]</i></p>"));
    1554     _miscScanRTCMCheckBox->setWhatsThis(tr("<p>Tick 'Scan RTCM' to log the numbers of incoming message types as well as contained antenna coordinates, antenna height, and antenna descriptor.</p><p>In case of RTCM Version 3 MSM streams, BNC will also log contained RINEX Version 3 observation types. <i>[key: miscScanRTCM]</i></p>"));
    1555     _miscPortLineEdit->setWhatsThis(tr("<p>BNC can output an incoming stream through an IP port of your local host.</p><p>Specify a port number to activate this function. In this case, the stream content remains untouched; BNC does not decode or reformat the data for this output.</p><p> If the decoder string is not an accepted one ('RTCM_2.x', 'RTCM_3.x' and 'RTNET'), please change the decoder string to <ul>"
    1556         "<li> 'ZERO' (forward the raw data) or </li>"
    1557         "<li> 'ZERO2FILE' (forward and store the raw data)</li> </ul> in addition. <i>[key: miscPort]</i></p>"));
    1558 
    1559     // WhatsThis, PPP (1)
    1560     // ------------------
    1561     _pppWidgets._dataSource->setWhatsThis(tr("<p>Select 'Real-time Streams' for real-time PPP from RTCM streams or 'RINEX Files' for post processing PPP from RINEX files.</p><p><ul><li>Real-time PPP requires that you pull a RTCM stream carrying GNSS observations plus a stream providing corrections to Broadcast Ephemeris. If the observations stream does not contain Broadcast Ephemeris then you must in addition pull a Broadcast Ephemeris stream like 'RTCM3EPH' from Ntrip Broadcaster <u>products.igs-ip.net</u>.<br></li><li>Post processing PPP requires RINEX Observation files, RINEX Navigation files and a file with corrections to Broadcast Ephemeris in plain ASCII format as saved beforehand using BNC.</li></ul></p><p>Note that BNC allows to carry out PPP solutions simultaneously for several stations. <i>[key: PPP/dataSource]</i></p>"));
    1562     _pppWidgets._rinexObs->setWhatsThis(tr("<p>Specify the RINEX Observation file. <i>[key: PPP/rinexObs]</i></p>"));
    1563     _pppWidgets._rinexNav->setWhatsThis(tr("<p>Specify the RINEX Navigation file. <i>[key: PPP/rinexNav]</i></p>"));
    1564     _pppWidgets._corrMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides corrections to Broadcast Ephemeris.</p><p>If you don't specify a corrections stream via this option, BNC will fall back to Single Point Positioning (SPP, positioning from observations and Broadcast Ephemeris only) instead of doing PPP. <i>[key: PPP/corrMount]</i></p>"));
    1565     _pppWidgets._ionoMount->setWhatsThis(tr("<p>Specify a 'mountpoint' from the 'Streams' canvas below which provides VTEC informations in SSR format.</p><p>If you don't specify a corrections stream via this option, BNC will use VTEC informations from the Corrections stream 'mountpoint', if available. <i>[key: PPP/ionoMount]</i></p>"));
    1566     _pppWidgets._corrFile->setWhatsThis(tr("<p>Specify the Broadcast Ephemeris Corrections file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will fall back to Single Point Positioning (SPP, positioning from RINEX Obs and RINEX Nav files only) instead of doing PPP. <i>[key: PPP/corrFile]</i></p>"));
    1567     _pppWidgets._ionoFile->setWhatsThis(tr("<p>Specify the VTEC file as saved beforehand using BNC.</p><p>If you don't specify corrections by this option, BNC will use VTEC informations from the Corrections file, if available. <i>[key: PPP/ionoFile]</i></p>"));
    1568     _pppWidgets._antexFile->setWhatsThis(tr("<p>Observations in RTCM streams or RINEX files should be referred to the receiver's and to the satellite's Antenna Phase Center (APC) and therefore be corrected for<ul><li>Receiver APC offsets and variations</li><li>Satellite APC offsets and variations.</li></ul> Specify the full path to an IGS 'ANTEX file' which contains APC offsets and variations for satellites and receiver.</p> <i>[key: PPP/antexFile]</i></p>"));
    1569     _pppWidgets._crdFile->setWhatsThis(tr("<p>Enter the full path to an ASCII file which specifies the streams or files of those stations you want to process. Specifying a 'Coordinates file' is optional. If it exists, it should contain one record per station with the following parameters separated by blank character:</p><ul><li>Specify the station either by:<ul><li>the 'Mountpoint' of the station's RTCM stream (in real-time PPP mode), or</li><li>the 9-char station ID of the RINEX Version 3 or 4 Observations file (in post processing PPP mode), or </li><li>the 4-char station ID of the RINEX Version 2 Observations file (in post processing PPP mode).</li></ul><li>Approximate X,Y,Z coordinate of station's Antenna Reference Point [m] (ARP, specify '0.0 0.0 0.0' if unknown).</li><li>North, East and Up component of antenna eccentricity [m] (specify '0.0 0.0 0.0' if unknown). </li><li>20 Characters describing the antenna type and radome following the IGS 'ANTEX file' standard (leave blank if unknown).</li><li>Receiver type following the naming conventions for IGS equipment.</li></ul>Records with exclamation mark '!' in the first column or blank records will be interpreted as comment lines and ignored.. <i>[key: PPP/crdFile]</i></p>"));
    1570     _pppWidgets._blqFile->setWhatsThis(tr("<p>Specify the full path to a 'BLQ file' containing the ocean loading coefficients for different stations. These coefficients can be obtained from the ocean loading service under request trough the web site http://holt.oso.chalmers.se/loading/. <i>[key: PPP/blqFile]</i></p>"));
    1571     _pppWidgets._logPath->setWhatsThis(tr("<p>Specify a directory for saving daily PPP logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no PPP logfiles shall be produced. <i>[key: PPP/logPath]</i></p>"));
    1572     _pppWidgets._nmeaPath->setWhatsThis(tr("<p>Specify a directory for saving coordinates in daily NMEA files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no NMEA file shall be produced. <i>[key: PPP/nmeaPath]</i></p>"));
    1573     _pppWidgets._snxtroPath->setWhatsThis(tr("<p>Specify a directory for saving SINEX Troposphere files. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no SINEX Troposphere files shall be produced. <i>[key: PPP/snxtroPath]</i></p>"));
    1574     _pppWidgets._snxtroIntr->setWhatsThis(tr("<p>Select a length for SINEX Troposphere files.</p><p>Default 'SNX TRO interval' for saving SINEX Troposphere files on disk is '1 hour'. <i>[key: PPP/snxtroIntr]</i></p>"));
    1575     _pppWidgets._snxtroSampl->setWhatsThis(tr("<p>Select a 'Sampling' rate for saving troposphere parameters. <i>[key: PPP/snxtroSampl]</i></p>"));
    1576     _pppWidgets._snxtroAc->setWhatsThis(tr("<p>Specify a 3-character abbreviation describing you as the generating Analysis Center (AC) in your SINEX troposphere files. <i>[key: PPP/snxtroAc]</i></p>"));
    1577     _pppWidgets._snxtroSolId->setWhatsThis(tr("<p>Specify a 1-character solution ID to allow a distinction between different solutions per AC. <i>[key: PPP/snxtroSolId]</i></p>"));
    1578     _pppWidgets._snxtroSolType->setWhatsThis(tr("<p>Specify a 3-character solution type, e.g. real-time (RTS), unknown (UNK), .. <i>[key: PPP/snxtroSolType]</i></p>"));
    1579     _pppWidgets._snxtroCampId->setWhatsThis(tr("<p>Specify a 3-character campaign ID, e.g. operational (OPS), demonstration (DEM), testing (TST), .. <i>[key: PPP/snxtroCampId]</i></p>"));
    1580 
    1581     // WhatsThis, PPP (2)
    1582     // ------------------
    1583     _pppWidgets._lcGPS->setWhatsThis(tr("<p>Specify which kind of GPS observations you want to use and on which kind of linear combination the GPS ambiguity resolutions shall be based:</p><p><ul>"
    1584 #ifdef USE_PPP_SSR_I
    1585         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1586         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1587 #else
    1588         "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
    1589         "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
    1590         "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
    1591         "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
    1592         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1593         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1594         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1595 #endif
    1596         "<li>'no'    means that you don't want BNC to use GPS data.</li></ul></p><p><i>[key: PPP/lcGPS]</i></p>"));
    1597     _pppWidgets._lcGLONASS->setWhatsThis(tr("<p>Specify which kind of GLONASS observations you want to use and on which kind of linear combination the GLONASS ambiguity resolutions shall be based:</p><p><ul>"
    1598 #ifdef USE_PPP_SSR_I
    1599         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1600         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1601         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1602 #else
    1603         "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
    1604         "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
    1605         "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
    1606         "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
    1607         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1608         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1609         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1610 #endif
    1611         "<li>'no'    means that you don't want BNC to use GLONASS data.</li></ul></p><p><i>[key: PPP/lcGLONASS]</i></p>"));
    1612     _pppWidgets._lcGalileo->setWhatsThis(tr("<p>Specify which kind of Galileo observations you want to use and on which kind of linear combination the Galileo ambiguity resolutions shall be based:</p><p><ul>"
    1613 #ifdef USE_PPP_SSR_I
    1614         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1615         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1616         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1617 #else
    1618         "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
    1619         "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
    1620         "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
    1621         "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
    1622         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1623         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1624         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1625 #endif
    1626         "<li>'no'    means that you don't want BNC to use Galileo data.</li></ul></p><p><i>[key: PPP/lcGalileo]</i></p>"));
    1627     _pppWidgets._lcBDS->setWhatsThis(tr("<p>Specify which kind of BDS observations you want to use and on which kind of linear combination the BDS ambiguity resolutions shall be based:</p><p><ul>"
    1628 #ifdef USE_PPP_SSR_I
    1629         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1630         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1631         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1632 #else
    1633         "<li>'Pi&Li' means that uncombined code and phase data of two frequencies shall be used.</li>"
    1634         "<li>'Pi'    means that uncombined code data of two frequencies shall be used.</li>"
    1635         "<li>'P1&L1' means that uncombined code and phase data of one frequency shall be used.</li>"
    1636         "<li>'P1'    means that uncombined code data of one frequency shall be used.</li>"
    1637         "<li>'P3&L3' means that the inonosphere-free linear combination of code and phase data shall be used.</li>"
    1638         "<li>'P3'    means that the inonosphere-free linear combination of code data shall be used.</li>"
    1639         "<li>'L3'    means that the inonosphere-free linear combination of phase data shall be used.</li> "
    1640 #endif
    1641         "<li>'no'    means that you don't want BNC to use BDS data.</li></ul></p><p><i>[key: PPP/lcBDS]</i></p>"));
    1642     _pppWidgets._constraints->setWhatsThis(tr("<p>Specify, whether ionospheric constraints in form of pseudo-observations shall be added. Please note, this is only valid, if no ionosphere-free linear-combination is used and only helpful as soon as the ionosphere information is more accurate than the code data accuracy. <i>[key: PPP/constraints]</i></p>"));
    1643     _pppWidgets._sigmaC1->setWhatsThis(tr("<p>Enter a Sigma for GPS C1 code observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS C1 code observations to a PPP solution from combined code and phase data. 1.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma C1 = 1.0' <i>[key: PPP/sigmaC1]</i></p>"));
    1644     _pppWidgets._sigmaL1->setWhatsThis(tr("<p>Enter a Sigma for GPS L1 phase observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GPS L1 phase observations to a PPP solutions from combined code and phase data. 0.01 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma L1 = 0.01' <i>[key: PPP/sigmaL1]</i></p>"));
    1645 #ifdef USE_PPP
    1646     _pppWidgets._sigmaGIM->setWhatsThis(tr("<p>Enter a Sigma for GIM pseudo observations in meters.</p><p>The higher the sigma you enter, the less the contribution of GIM pseudo observations to a PPP solution. 5.0 is likely to be an appropriate choice.</p><p>Default is an empty option field, meaning<br>'Sigma GIM = 1.0' <i>[key: PPP/sigmaGIM]</i></p>"));
    1647 #endif
    1648     _pppWidgets._maxResC1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS C1 code observations in a PPP solution. '2.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res C1 = 3.0' <i>[key: PPP/maxResC1]</i></p>"));
    1649     _pppWidgets._maxResL1->setWhatsThis(tr("<p>Specify a maximum for residuals from GPS L1 phase observations in a PPP solution. '0.02' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res L1 = 0.03' <i>[key: PPP/maxResL1]</i></p>"));
    1650 #ifdef USE_PPP
    1651     _pppWidgets._maxResGIM->setWhatsThis(tr("<p>Specify a maximum for residuals from GIM pseudo observations in a PPP solution. '5.0' meters may be an appropriate choice for that.</p><p>If the maximum is exceeded, contributions from the corresponding observation will be ignored in the PPP solution.</p><p>Default is an empty option field, meaning<br>'Max Res GIM = 3.0' <i>[key: PPP/maxResGIM]</i></p>"));
    1652 #endif
    1653     _pppWidgets._eleWgtCode->setWhatsThis(tr("<p>Tic 'Ele Wgt Code' to use satellite Elevation depending Weights for Code observations in the PPP solution. <i>[key: PPP/eleWgtCode]</i></p>"));
    1654     _pppWidgets._eleWgtPhase->setWhatsThis(tr("<p>Tic 'Ele Wgt Phase' to use satellite Elevation depending Weights for Phase observations in the PPP solution. <i>[key: PPP/eleWgtPhase]</i></p>"));
    1655     _pppWidgets._minObs->setWhatsThis(tr("<p>Select a Minimum Number of Observations per epoch for a PPP solution.</p><p>BNC will only process epochs with observation numbers reaching or exceeding this minimum. <i>[key: PPP/minObs]</i></p>"));
    1656     _pppWidgets._minEle->setWhatsThis(tr("<p>Select a Minimum satellite Elevation for observations.</p><p>BNC will ignore an observation if the associated satellite Elevation does not reach or exceed this minimum.</p><p>Selecting '10 deg' may be an appropriate choice in order to avoid too noisy observations. <i>[key: PPP/minEle]</i></p>"));
    1657 
    1658     // WhatsThis, Combine Corrections
    1659     // ------------------------------
    1660     _cmbTable->setWhatsThis(tr("<p>BNC allows to process several orbit and clock correction streams in real-time to produce, encode, upload and save a combination of correctors coming from different providers. </p><p>To add a line to the 'Combine Corrections' table hit the 'Add Row' button, double click on the 'Mountpoint' field to specify a Broadcast Ephemeris Correction 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. Double click on the 'Weight Factor' field to enter a weight factor to be applied for this stream in the combination. A Factor greater than 1 will enlarge the sigma of the clock pseudo-observations and with it down-weight its contribution. Finally, double click on the 'Exclude Satellites' field and specify satellites, to exclude them for an individual AC. An entry 'G04,G31,R' means to excludes GPS satellites PRN 4 and 31 as well as all GLONASS satellites from one individual AC. Default is an empty option field, meaning that no satellite is excluded from this individual AC.</p><p>Note that the orbit information in the resulting combination stream is just copied from one of the incoming streams. The stream used for providing the orbits may vary over time: if the orbit providing stream has an outage then BNC switches to the next remaining stream for getting hold of the orbit information.</p><p>The combination process requires Broadcast Ephemeris. Besides orbit and clock correction streams BNC should therefore pull a stream carrying Broadcast Ephemeris in the form of RTCM Version 3 messages.</p><p>It is possible to specify only one Broadcast Ephemeris Correction stream in the 'Combine Corrections' table. Instead of combining corrections BNC will then add the corrections to the Broadcast Ephemeris with the possibility to save final orbit and clock results in SP3 and/or Clock RINEX format. <i>[key: cmbStreams]</i></p>"));
    1661     addCmbRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Combine Corrections' table.</p>"));
    1662     delCmbRowButton->setWhatsThis(tr("<p>Hit 'Delete' button to delete the highlighted line(s) from the 'Combine Corrections' table.</p>"));
    1663     _cmbMethodComboBox->setWhatsThis(tr("<p>Select a clock combination approach. Options are 'Single-Epoch' and Kalman 'Filter'.</p><p>It is suggested to use the Kalman filter approach for the purpose of Precise Point Positioning. <i>[key: cmbMethod]</i></p>"));
    1664     _cmbMaxresLineEdit->setWhatsThis(tr("<p>BNC combines all incoming clocks according to specified weights. Individual clock estimates that differ by more than 'Maximal Clk 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'. <i>[key: cmbMaxres]</i></p>"));
    1665     _cmbMaxdisplacementLineEdit->setWhatsThis(tr("<p>BNC builds mean values for all incoming orbit corrections per satellite. Individual orbit corrections that differ by more than 'Maximal Orb Displacement' meters from the average of all orbit corrections per satellite will be ignored.<p></p>It is suggested to specify a value of about 0.5 m.</p><p>Default is a value of '2.0'. <i>[key: cmbMaxdisplacement]</i></p>"));
    1666     _cmbSamplComboBox->setWhatsThis(tr("<p>Select a combination Sampling interval for the clocks. Clock corrections will be produced following that interval.</p><p>A value of 10 sec may be an appropriate choice. <i>[key: cmbSampl]</i></p>"));
    1667     _cmbLogPath->setWhatsThis(tr("<p>Specify a directory for saving daily Combination logfiles. If the specified directory does not exist, BNC will not create such files.</p><p>Default is an empty option field, meaning that no Combination logfiles shall be produced. <i>[key: cmbLogpath]</i></p>"));
    1668     _cmbGpsCheckBox->setWhatsThis(tr("<p>GPS clock corrections shall be combined. GPS Broadcast ephemeris and corrections are required. <i>[key: cmbGps]</i></p>"));
    1669     _cmbGloCheckBox->setWhatsThis(tr("<p>GLONASS clock corrections shall be combined; GLONASS Broadcast ephemeris and corrections are required. <i>[key: cmbGlo]</i></p>"));
    1670     _cmbGalCheckBox->setWhatsThis(tr("<p>Galileo clock corrections shall be combined; Galileo Broadcast ephemeris and corrections are required. <i>[key: cmbGal]</i></p>"));
    1671     _cmbBdsCheckBox->setWhatsThis(tr("<p>Beidou clock corrections shall be combined; BDS Broadcast ephemeris and corrections are required. <i>[key: cmbBds]</i></p>"));
    1672     _cmbQzssCheckBox->setWhatsThis(tr("<p>QZSS clock corrections shall be combined; QZSS Broadcast ephemeris and corrections are required. <i>[key: cmbQzss]</i></p>"));
    1673     _cmbSbasCheckBox->setWhatsThis(tr("<p>SBAS clock corrections shall be combined; SBAS Broadcast ephemeris and corrections are required. <i>[key: cmbSbas]</i></p>"));
    1674     _cmbNavicCheckBox->setWhatsThis(tr("<p>NavIC clock corrections shall be combined; NavIC Broadcast ephemeris and corrections are required. <i>[key: cmbNavic]</i></p>"));
    1675     _cmbBsxFile->setWhatsThis(tr("<p> Specify a Bias SINEX File that will be used to add satellite code biases to the combined clocks. <i>[key: cmbBsxFile]</i></p>"));
    1676 
    1677     // WhatsThis, Upload Corrections
    1678     // -----------------------------
    1679     _uploadTable->setWhatsThis(tr("<p>BNC can upload clock and orbit corrections to Broadcast Ephemeris (Broadcast Corrections) as well as Code Biases in different SSR formats. You may have a situation where clocks, orbits and code biases come from an external Real-time Network Engine (1) or a situation where clock and orbit corrections are combined within BNC (2).</p><p>(1) BNC identifies a stream as coming from a Real-time Network Engine if its format is specified as 'RTNET' and hence its decoder string in the 'Streams' canvas is 'RTNET'. It encodes and uploads that stream to the specified Ntrip Broadcaster Host and Port</p><p>(2) BNC understands that it is expected to encode and upload combined Broadcast Ephemeris Corrections if you specify correction streams in the 'Combine Corrections' table.</p><p>To fill the 'Upload Corrections' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. An empty 'Host' option field means that you don't want to upload corrections.</p><p>Select a target coordinate reference System (e.g. IGS20) for outgoing clock and orbit corrections.</p><p>Select a target SSR format (e.g. IGS-SSR) for outgoing clock and orbit corrections.</p><p>By default orbit and clock corrections refer to Antenna Phase Center (APC). Tick 'CoM' to refer uploaded corrections to Center of Mass instead of APC.</p><p>Specify a path for saving generated Broadcast Corrections plus Broadcast Ephemeris as SP3 orbit files. If the specified directory does not exist, BNC will not create such files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.SP3.</p><p>Specify a path for saving generated Broadcast Correction clocks plus Broadcast Ephemeris clocks as Clock RINEX files. If the specified directory does not exist, BNC will not create Clock RINEX files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.CLK.</p><p>Specify a path for saving generated Code Biases as SINEX Bias files. If the specified directory does not exist, BNC will not create SINEX Bias files. The following is a path example for a Linux system: /home/user/BKG0MGXRTS${V3PROD}.BIA.</p><p>Note that '${V3PROD}' produces the time stamp in the filename, which is related to the RINEX version 3 filename concept.</p><p>Finally, specify a SSR Provider ID (issued by RTCM), SSR Solution ID, and SSR Issue of Data number.</p><p>In case the 'Combine Corrections' table contains only one Broadcast Correction stream, BNC will add that stream content to the Broadcast Ephemeris to save results in files specified via SP3 and/or Clock RINEX file path. You should then define only the SP3 and Clock RINEX file path and no further option in the 'Upload Corrections' table. <i>[key: uploadMountpointsOut]</i></p>"));
    1680     addUploadRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Corrections' table.</p>"));
    1681     delUploadRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Corrections' table.</p>"));
    1682     _uploadIntrComboBox->setWhatsThis(tr("<p>Select the length of the SP3, Clock RINEX and Bias SINEX files. <i>[key: uploadIntr]</i></p>"));
    1683     _uploadSamplRtcmEphCorrComboBox->setWhatsThis(tr("<p>Select a stream's orbit correction sampling interval in seconds.</p><p>A value of zero '0' tells BNC to upload all available orbit and clock correction samples together in combined messages. <i>[key: uploadSamplRtcmEphCorr]</i></p>"));
    1684     _uploadSamplSp3ComboBox->setWhatsThis(tr("<p>Select a SP3 orbit file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into SP3 orbit files. <i>[key: uploadSamplSp3]</i></p>"));
    1685     _uploadSamplClkRnxSpinBox->setWhatsThis(tr("<p>Select a Clock RINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Clock RINEX files. <i>[key: uploadSamplClkRnx]</i></p>"));
    1686     _uploadSamplBiaSnxSpinBox->setWhatsThis(tr("<p>Select a Bias SINEX file sampling interval in seconds.</p><p>A value of zero '0' tells BNC to store all available samples into Bias SINEX files. <i>[key: uploadSamplBiaSnx]</i></p>"));
    1687     setUploadTrafoButton->setWhatsThis(tr("<p>Hit 'Custom Trafo' to specify your own 14 parameter Helmert Transformation instead of selecting a predefined transformation via option 'System'.</p>"));
    1688     _uploadAntexFile->setWhatsThis(tr("<p>When producing SP3 files or referring orbit and clock corrections to the satellite's Center of Mass (CoM) instead Antenna Phase Center (APC), an offset has to be applied which is available from the IGS 'ANTEX file'. You must therefore specify an 'ANTEX file' path if you want to save the stream content in SP3 format and/or refer correctors to CoM.</p><p>If you don't specify an 'ANTEX file' path, the SP3 file content as well as the orbit and clock correctors will be referred to satellite APCs. <i>[key: uploadAntexFile]</i></p>"));
    1689 
    1690     // WhatsThis, Upload Ephemeris
    1691     // ---------------------------
    1692     _uploadEphTable->setWhatsThis(tr("<p>BNC can upload Broadcast Ephemeris streams in RTCM Version 3 format. </p><p>To fill the 'Upload Ephemeris' table, hit the 'Add Row' button, double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the mountpoint and the stream upload password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. Specify the satellite system(s) that shall be part of the uploaded stream (e.g. G for GPS or GRE for GPS+GLONASS+Galileo, or ALL). <i>[key: uploadEphMountpointsOut]</i></p>"));
    1693     addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Ephemeris' table.</p>"));
    1694     delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Ephemeris' table.</p>"));
    1695     _uploadSamplRtcmEphSpinBox->setWhatsThis(tr("<p>Select the Broadcast Ephemeris sampling interval in seconds.</p><p>Default is '5', meaning that a complete set of Broadcast Ephemeris is uploaded every 5 seconds. <i>[key: uploadSamplRtcmEph]</i></p>"));
    1696 
    1697     // WhatsThis, Upload Raw Data
    1698     // ---------------------------
    1699     _uploadRawTable->setWhatsThis(tr("<p>BNC can upload Raw Data streams in any format like a NtripServer. </p><p>To fill the 'Upload Raw Data' table, hit the 'Add Row' button and double click on the 'Source Mountpoint' field to enter the Source of data from the 'Streams' section below, which shall be forwarded without decoding and hit Enter. Double click on the 'Host' field to enter the IP or URL of an Ntrip Broadcaster and hit Enter. Select the Ntrip Version that shall be used for data upload. Then double click on the 'Port', 'Upload Mountpoint' and 'Password' fields to enter the Ntrip Broadcaster IP port, the stream upload mountpoint and password. If Ntrip Version 2 is chosen, click to the 'User' field to enter a stream upload user name. </p><p> If the decoder string is not an accepted one ('RTCM_2.x', 'RTCM_3.x' and 'RTNET'), please change the decoder string to <ul>"
    1700         "<li> 'ZERO' (forward the raw data) or </li>"
    1701         "<li> 'ZERO2FILE' (forward and store the raw data)</li> </ul> in addition <i>[key: uploadRawMountpointsOut]</i></p>"));
    1702     addUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Add Row' button to add another line to the 'Upload Raw Data' table.</p>"));
    1703     delUploadEphRowButton->setWhatsThis(tr("<p>Hit 'Del Row' button to delete the highlighted line(s) from the 'Upload Raw Data' table.</p>"));
    1704 
    1705 
    1706     // WhatsThis, Streams Canvas
    1707     // -------------------------
    1708     _mountPointsTable->setWhatsThis(tr("<p>Streams selected for retrieval are listed in the 'Streams' section. "
    1709         "Clicking on 'Add Stream' button opens a window that allows the user to select data streams from an Ntrip Broadcaster "
    1710         "according to their mountpoints. To remove a stream from the 'Streams' list, highlight it by clicking on it "
    1711         "and hit the 'Delete Stream' button. You can also remove multiple streams by highlighting them using +Shift and +Ctrl.</p><p>"
    1712         "BNC automatically allocates one of its internal decoders to a stream based on the stream's 'format' as given in the source-table. "
    1713         "BNC allows users to change this selection by editing the decoder string. "
    1714         "Double click on the 'decoder' field, enter your preferred decoder and then hit Enter. "
    1715         "Accepted decoder strings are 'RTCM_2.x', 'RTCM_3.x' and 'RTNET'.</p><p>"
    1716         "In case you need to log raw data as is, BNC allows to by-pass its decoders and directly save the input in daily log files. "
    1717         "To do this, specify the decoder string as 'ZERO2FILE'.</p><p>"
    1718         "BNC allows as well to forward streams related to the specified 'Mountpoint' on top of the 'Miscellaneous Panel' "
    1719         "through a TCP/IP port of your local host. "
    1720         "In this case, the stream content remains untouched; BNC does not decode or reformat the data for this output. "
    1721         "If the decoder string is not an accepted one, please change the decoder string to 'ZERO' (forward the raw data only) or 'ZERO2FILE' (forward and store the raw data) in addition.</p><p>"
    1722         "BNC can also retrieve streams from virtual reference stations (VRS). VRS streams are indicated by a 'yes' in the 'nmea' column. "
    1723         "To initiate such stream, the approximate latitude/longitude rover position is sent to the Ntrip Broadcaster "
    1724         "together with an approximation for the height. Default values for latitude and longitude can be change according to your requirement. "
    1725         "Double click on 'lat' and 'long' fields, enter the values you wish to send and then hit Enter. <i>[key: mountPoints]</i></p>"));
    1726     _actAddMountPoints->setWhatsThis(tr("<p>Add stream(s) to selection presented in the 'Streams' canvas.</p>"));
    1727     _actDeleteMountPoints->setWhatsThis(tr("<p>Delete stream(s) from selection presented in the 'Streams' canvas.</p>"));
    1728     _actMapMountPoints->setWhatsThis(tr("<p> Draw distribution map of stream selection presented in the 'Streams' canvas. Use mouse to zoom in or out.</p><p>Left button: Draw rectangle to zoom in.<br>Right button: Zoom out.<br>Middle button: Zoom back.</p>"));
    1729     _actStart->setWhatsThis(tr("<p> Start running BNC.</p>"));
    1730     _actStop->setWhatsThis(tr("<p> Stop running BNC.</p>"));
    1731 
    1732     // WhatsThis, Log Canvas
    1733     // ---------------------
    1734     _log->setWhatsThis(tr("<p>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 problems that occur in the communication link, stream availability, stream delay, stream conversion etc.</p>"));
    1735     _bncFigure->setWhatsThis(tr("<p>The bandwith consumption per stream is shown in the 'Throughput' tab in bits per second (bps) or kilobits per second (kbps).</p>"));
    1736     _bncFigureLate->setWhatsThis(tr("<p>The individual latency of observations of incoming streams is shown in the 'Latency' tab. Streams not carrying observations (e.g. those providing only Broadcast Ephemeris) remain unconsidered.</p><p>Note that the calculation of correct latencies requires the clock of the host computer to be properly synchronized.</p>"));
    1737     _bncFigurePPP->setWhatsThis(tr("<p>PPP time series of North (red), East (green) and Up (blue) displacements are shown in the 'PPP Plot' tab when the corresponding option is selected.</p><p>Values are referred to an XYZ a priori coordinate. The sliding PPP time series window covers the period of the latest 5 minutes.</p>"));
    1738 
    1739 
    1740     // Enable/Disable all Widgets
    1741     // --------------------------
    1742     slotBncTextChanged();
    1743     enableStartStop();
    1744 
    1745     // Auto start
    1746     // ----------
    1747     if (Qt::CheckState(settings.value("autoStart").toInt()) == Qt::Checked) {
    1748         slotStart();
    1749     }
    1750 }
    1751 
    1752 // Destructor
    1753 ////////////////////////////////////////////////////////////////////////////
    1754 bncWindow::~bncWindow() {
    1755     if (_caster) {
    1756         delete _caster; BNC_CORE->setCaster(0);
    1757     }
    1758     if (_casterEph) {
    1759         delete _casterEph;
    1760     }
    1761     delete _bncFigureLate;
    1762     delete _bncFigurePPP;
    1763     delete _actHelp;
    1764     delete _actAbout;
    1765     delete _actFlowchart;
    1766     delete _actFontSel;
    1767     delete _actSaveOpt;
    1768     delete _actQuit;
    1769     delete _actAddMountPoints;
    1770     delete _actDeleteMountPoints;
    1771     delete _actMapMountPoints;
    1772     delete _actStart;
    1773     delete _actStop;
    1774     delete _actwhatsthis;
    1775     delete _proxyHostLineEdit;
    1776     delete _proxyPortLineEdit;
    1777     delete _sslCaCertPathLineEdit;
    1778     delete _sslClientCertPathLineEdit;
    1779     delete _sslIgnoreErrorsCheckBox;
    1780     delete _logFileLineEdit;
    1781     delete _rawOutFileLineEdit;
    1782     delete _rnxAppendCheckBox;
    1783     delete _onTheFlyComboBox;
    1784     delete _autoStartCheckBox;
    1785     delete _rnxPathLineEdit;
    1786     delete _rnxIntrComboBox;
    1787     delete _rnxSamplComboBox;
    1788     delete _rnxSkelExtComboBox;
    1789     delete _rnxSkelPathLineEdit;
    1790     delete _rnxFileCheckBox;
    1791     delete _rnxScrpLineEdit;
    1792     delete _rnxVersComboBox;
    1793     delete _rnxV2Priority;
    1794     delete _ephPathLineEdit;
    1795     //delete _ephFilePerStation;
    1796     delete _ephIntrComboBox;
    1797     delete _ephOutPortLineEdit;
    1798     delete _ephVersComboBox;
    1799     delete _corrPathLineEdit;
    1800     delete _corrIntrComboBox;
    1801     delete _corrPortLineEdit;
    1802     delete _outPortLineEdit;
    1803     delete _outWaitSpinBox;
    1804     delete _outSamplComboBox;
    1805     delete _outFileLineEdit;
    1806     delete _outUPortLineEdit;
    1807     delete _outLockTimeCheckBox;
    1808     delete _serialMountPointLineEdit;
    1809     delete _serialPortNameLineEdit;
    1810     delete _serialBaudRateComboBox;
    1811     delete _serialFlowControlComboBox;
    1812     delete _serialDataBitsComboBox;
    1813     delete _serialParityComboBox;
    1814     delete _serialStopBitsComboBox;
    1815     delete _serialAutoNMEAComboBox;
    1816     delete _serialFileNMEALineEdit;
    1817     delete _serialHeightNMEALineEdit;
    1818     delete _serialNMEASamplingSpinBox;
    1819     delete _adviseObsRateComboBox;
    1820     delete _adviseFailSpinBox;
    1821     delete _adviseRecoSpinBox;
    1822     delete _adviseScriptLineEdit;
    1823     delete _miscMountLineEdit;
    1824     delete _miscPortLineEdit;
    1825     delete _miscIntrComboBox;
    1826     delete _miscScanRTCMCheckBox;
    1827     _mountPointsTable->deleteLater();
    1828     delete _log;
    1829     delete _loggroup;
    1830     _cmbTable->deleteLater();
    1831     delete _cmbMaxresLineEdit;
    1832     delete _cmbMaxdisplacementLineEdit;
    1833     delete _cmbSamplComboBox;
    1834     delete _cmbLogPath;
    1835     delete _cmbMethodComboBox;
    1836     delete _cmbGpsCheckBox;
    1837     delete _cmbGloCheckBox;
    1838     delete _cmbGalCheckBox;
    1839     delete _cmbBdsCheckBox;
    1840     delete _cmbQzssCheckBox;
    1841     delete _cmbSbasCheckBox;
    1842     delete _cmbNavicCheckBox;
    1843     delete _cmbBsxFile;
    1844     delete _uploadSamplRtcmEphCorrComboBox;
    1845     _uploadEphTable->deleteLater();
    1846     _uploadRawTable->deleteLater();
    1847     _uploadTable->deleteLater();
    1848     delete _uploadIntrComboBox;
    1849     delete _uploadAntexFile;
    1850     delete _uploadSamplRtcmEphSpinBox;
    1851     delete _uploadSamplSp3ComboBox;
    1852     delete _uploadSamplClkRnxSpinBox;
    1853     delete _uploadSamplBiaSnxSpinBox;
    1854     delete _reqcActionComboBox;
    1855     delete _reqcObsFileChooser;
    1856     delete _reqcNavFileChooser;
    1857     delete _reqcOutObsLineEdit;
    1858     delete _reqcOutNavLineEdit;
    1859     delete _reqcOutLogLineEdit;
    1860     delete _reqcPlotDirLineEdit;
    1861     delete _reqcSkyPlotSignals;
    1862     delete _reqcLogSummaryOnly;
    1863     delete _reqcEditOptionButton;
    1864     delete _sp3CompFileChooser;
    1865     delete _sp3CompExclude;
    1866     delete _sp3CompLogLineEdit;
    1867     delete _sp3CompSummaryOnly;
    1868     //delete _canvas;
    1869 }
    1870 
    1871 //
    1872 ////////////////////////////////////////////////////////////////////////////
    1873 void bncWindow::populateMountPointsTable() {
    1874 
    1875     for (int iRow = _mountPointsTable->rowCount() - 1; iRow >= 0; iRow--) {
    1876         _mountPointsTable->removeRow(iRow);
    1877     }
    1878 
    1879     bncSettings settings;
    1880 
    1881     QListIterator<QString> it(settings.value("mountPoints").toStringList());
    1882     int iRow = 0;
    1883     while (it.hasNext()) {
    1884         QStringList hlp = it.next().split(" ");
    1885         if (hlp.size() < 7) continue;
    1886         _mountPointsTable->insertRow(iRow);
    1887 
    1888         QUrl    url(hlp[0]);
    1889 
    1890         QString format(hlp[1]);
    1891         QString country(hlp[2]);
    1892         QString latitude(hlp[3]);
    1893         QString longitude(hlp[4]);
    1894         QString nmea(hlp[5]);
    1895         QString ntripVersion(hlp[6]);
    1896 
    1897         QString fullPath;
    1898         if (ntripVersion == 'S') {
    1899           // url.userInfo() contains the case sensitive portName
    1900           // the portName shall be part of the mountpointString
    1901           // to inform the user about the source of the stream
    1902           if (url.host().contains(url.userInfo().toLower())) {
    1903             fullPath = url.host() + url.path();
    1904           }
    1905           else {
    1906             fullPath =  url.userInfo() + "-" + url.host() + url.path();
    1907           }
    1908         } else {
    1909           fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
     2134      it = new QTableWidgetItem(latitude);
     2135      it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2136      _mountPointsTable->setItem(iRow, 4, it);
     2137      it = new QTableWidgetItem(longitude);
     2138      it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2139      _mountPointsTable->setItem(iRow, 5, it);
     2140    }
     2141
     2142    it = new QTableWidgetItem(nmea);
     2143    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2144    _mountPointsTable->setItem(iRow, 6, it);
     2145
     2146    it = new QTableWidgetItem(ntripVersion);
     2147    //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
     2148    _mountPointsTable->setItem(iRow, 7, it);
     2149
     2150    bncTableItem* bncIt = new bncTableItem();
     2151    _mountPointsTable->setItem(iRow, 8, bncIt);
     2152
     2153    iRow++;
     2154  }
     2155  _mountPointsTable->hideColumn(0);
     2156  _mountPointsTable->hideColumn(3);
     2157  _mountPointsTable->sortItems(1);
     2158  delete mountPoints;
     2159
     2160  enableStartStop();
     2161}
     2162
     2163// Save Options (serialize)
     2164////////////////////////////////////////////////////////////////////////////
     2165void bncWindow::slotSaveOptions() {
     2166  saveOptions();
     2167  bncSettings settings;
     2168  settings.sync();
     2169}
     2170
     2171// Save Options (memory only)
     2172////////////////////////////////////////////////////////////////////////////
     2173void bncWindow::saveOptions() {
     2174
     2175  QStringList mountPoints;
     2176  for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
     2177
     2178    QUrl url("//"
     2179             + _mountPointsTable->item(iRow, 0)->text() + "@"
     2180             + _mountPointsTable->item(iRow, 1)->text());
     2181
     2182    mountPoints.append(url.toString()
     2183                       + " " + _mountPointsTable->item(iRow, 2)->text()
     2184                       + " " + _mountPointsTable->item(iRow, 3)->text()
     2185                       + " " + _mountPointsTable->item(iRow, 4)->text()
     2186                       + " " + _mountPointsTable->item(iRow, 5)->text()
     2187                       + " " + _mountPointsTable->item(iRow, 6)->text()
     2188                       + " " + _mountPointsTable->item(iRow, 7)->text());
     2189  }
     2190
     2191  QStringList cmbStreams;
     2192  for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
     2193    QString hlp;
     2194    for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
     2195      if (_cmbTable->item(iRow, iCol)) {
     2196        hlp += _cmbTable->item(iRow, iCol)->text() + " ";
     2197      }
     2198    }
     2199    if (!hlp.isEmpty()) {
     2200      cmbStreams << hlp;
     2201    }
     2202  }
     2203
     2204  QStringList uploadMountpointsOut;
     2205  for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
     2206    QString hlp;
     2207    for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
     2208      if (_uploadTable->cellWidget(iRow, iCol) &&
     2209          (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
     2210        if (iCol == 3) {
     2211          QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
     2212          hlp += ntripversion->currentText() + ",";
    19102213        }
    1911 
    1912         QTableWidgetItem* it;
    1913         it = new QTableWidgetItem(url.userInfo());
    1914         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1915         _mountPointsTable->setItem(iRow, 0, it);
    1916 
    1917         it = new QTableWidgetItem(fullPath);
    1918         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1919         _mountPointsTable->setItem(iRow, 1, it);
    1920 
    1921         it = new QTableWidgetItem(format);
    1922         _mountPointsTable->setItem(iRow, 2, it);
    1923 
    1924         it = new QTableWidgetItem(country);
    1925         _mountPointsTable->setItem(iRow, 3, it);
    1926 
    1927         if (nmea == "yes") {
    1928             it = new QTableWidgetItem(latitude);
    1929             _mountPointsTable->setItem(iRow, 4, it);
    1930             it = new QTableWidgetItem(longitude);
    1931             _mountPointsTable->setItem(iRow, 5, it);
     2214        else if (iCol == 4) {
     2215          QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
     2216          hlp += user->text() + ",";
    19322217        }
    1933         else {
    1934             it = new QTableWidgetItem(latitude);
    1935             it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1936             _mountPointsTable->setItem(iRow, 4, it);
    1937 
    1938             it = new QTableWidgetItem(longitude);
    1939             it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1940             _mountPointsTable->setItem(iRow, 5, it);
     2218        else if (iCol == 5) {
     2219          QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
     2220          hlp += passwd->text() + ",";
    19412221        }
    1942 
    1943         it = new QTableWidgetItem(nmea);
    1944         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1945         _mountPointsTable->setItem(iRow, 6, it);
    1946 
    1947         it = new QTableWidgetItem(ntripVersion);
    1948         ////    it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    1949         _mountPointsTable->setItem(iRow, 7, it);
    1950 
    1951         bncTableItem* bncIt = new bncTableItem();
    1952         bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    1953         _mountPointsTable->setItem(iRow, 8, bncIt);
    1954 
    1955         iRow++;
    1956     }
    1957 
    1958     _mountPointsTable->sortItems(1);
    1959 
    1960     enableStartStop();
    1961 }
    1962 
    1963 // Retrieve Table
    1964 ////////////////////////////////////////////////////////////////////////////
    1965 void bncWindow::slotAddMountPoints() {
    1966 
    1967     bncSettings settings;
    1968     QString proxyHost = settings.value("proxyHost").toString();
    1969     int     proxyPort = settings.value("proxyPort").toInt();
    1970     if (proxyHost != _proxyHostLineEdit->text() ||
    1971         proxyPort != _proxyPortLineEdit->text().toInt()) {
    1972         int iRet = QMessageBox::question(this, "Question", "Proxy options "
    1973             "changed. Use the new ones?",
    1974             QMessageBox::Yes, QMessageBox::No,
    1975             QMessageBox::NoButton);
    1976         if (iRet == QMessageBox::Yes) {
    1977             settings.setValue("proxyHost", _proxyHostLineEdit->text());
    1978             settings.setValue("proxyPort", _proxyPortLineEdit->text());
     2222        else if (iCol == 6) {
     2223          QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
     2224          hlp += system->currentText() + ",";
    19792225        }
    1980     }
    1981 
    1982     settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
    1983     settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
    1984     settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
    1985 
    1986     QMessageBox msgBox;
    1987     msgBox.setIcon(QMessageBox::Question);
    1988     msgBox.setWindowTitle("Add Stream");
    1989     msgBox.setText("Add stream(s) coming from:");
    1990 
    1991     QPushButton* buttonNtrip = msgBox.addButton(tr("Caster"), QMessageBox::ActionRole);
    1992     QPushButton* buttonIP = msgBox.addButton(tr("TCP/IP port"), QMessageBox::ActionRole);
    1993     QPushButton* buttonUDP = msgBox.addButton(tr("UDP port"), QMessageBox::ActionRole);
    1994     QPushButton* buttonSerial = msgBox.addButton(tr("Serial port"), QMessageBox::ActionRole);
    1995     QPushButton* buttonCancel = msgBox.addButton(tr("Cancel"), QMessageBox::ActionRole);
    1996 
    1997     msgBox.exec();
    1998 
    1999     if (msgBox.clickedButton() == buttonNtrip) {
    2000         bncTableDlg* dlg = new bncTableDlg(this);
    2001         dlg->move(this->pos().x() + 50, this->pos().y() + 50);
    2002         connect(dlg, SIGNAL(newMountPoints(QStringList*)),
    2003             this, SLOT(slotNewMountPoints(QStringList*)));
    2004         dlg->exec();
    2005         delete dlg;
    2006     }
    2007     else if (msgBox.clickedButton() == buttonIP) {
    2008         bncIpPort* ipp = new bncIpPort(this);
    2009         connect(ipp, SIGNAL(newMountPoints(QStringList*)),
    2010             this, SLOT(slotNewMountPoints(QStringList*)));
    2011         ipp->exec();
    2012         delete ipp;
    2013     }
    2014     else if (msgBox.clickedButton() == buttonUDP) {
    2015         bncUdpPort* udp = new bncUdpPort(this);
    2016         connect(udp, SIGNAL(newMountPoints(QStringList*)),
    2017             this, SLOT(slotNewMountPoints(QStringList*)));
    2018         udp->exec();
    2019         delete udp;
    2020     }
    2021     else if (msgBox.clickedButton() == buttonSerial) {
    2022         bncSerialPort* sep = new bncSerialPort(this);
    2023         connect(sep, SIGNAL(newMountPoints(QStringList*)),
    2024             this, SLOT(slotNewMountPoints(QStringList*)));
    2025         sep->exec();
    2026         delete sep;
    2027     }
    2028     else if (msgBox.clickedButton() == buttonCancel) {
    2029         // Cancel
    2030     }
    2031 
    2032     enableStartStop();
    2033 }
    2034 
    2035 // Delete Selected Mount Points
    2036 ////////////////////////////////////////////////////////////////////////////
    2037 void bncWindow::slotDeleteMountPoints() {
    2038 
    2039     int nRows = _mountPointsTable->rowCount();
    2040     std::vector <bool> flg(nRows);
    2041     for (int iRow = 0; iRow < nRows; iRow++) {
    2042         if (_mountPointsTable->item(iRow, 1)->isSelected()) {
    2043             flg[iRow] = true;
     2226        else if (iCol == 7) {
     2227          QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
     2228          hlp += format->currentText() + ",";
    20442229        }
    2045         else {
    2046             flg[iRow] = false;
    2047         }
    2048     }
    2049     for (int iRow = nRows - 1; iRow >= 0; iRow--) {
    2050         if (flg[iRow]) {
    2051             _mountPointsTable->removeRow(iRow);
    2052         }
    2053     }
    2054     _actDeleteMountPoints->setEnabled(false);
    2055 
    2056     enableStartStop();
    2057 }
    2058 
    2059 // New Mount Points Selected
    2060 ////////////////////////////////////////////////////////////////////////////
    2061 void bncWindow::slotNewMountPoints(QStringList* mountPoints) {
    2062     int iRow = 0;
    2063     QListIterator<QString> it(*mountPoints);
    2064     while (it.hasNext()) {
    2065         QStringList hlp = it.next().split(" ");
    2066 
    2067         QUrl url(hlp[0]);
    2068 
    2069         QString format(hlp[1]);
    2070         QString country(hlp[2]);
    2071         QString latitude(hlp[3]);
    2072         QString longitude(hlp[4]);
    2073         QString nmea(hlp[5]);
    2074         QString ntripVersion(hlp[6]);
    2075 
    2076         QString fullPath;
    2077         if (ntripVersion == 'S') {
    2078           // url.userInfo() contains the case sensitive portName
    2079           // the portName shall be part of the mountpointString
    2080           // to inform the user about the source of the stream
    2081           if (url.host().contains(url.userInfo().toLower())) {
    2082             fullPath = url.host() + url.path();
    2083           }
    2084           else {
    2085             fullPath =  url.userInfo() + "-" + url.host() + url.path();
    2086           }
    2087         } else {
    2088           fullPath = url.host() + QString(":%1").arg(url.port()) + url.path();
    2089         }
    2090 
    2091         _mountPointsTable->insertRow(iRow);
    2092 
    2093         QTableWidgetItem* it;
    2094         it = new QTableWidgetItem(url.userInfo());
    2095         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2096         _mountPointsTable->setItem(iRow, 0, it);
    2097 
    2098         it = new QTableWidgetItem(fullPath);
    2099         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2100         _mountPointsTable->setItem(iRow, 1, it);
    2101 
    2102         it = new QTableWidgetItem(format);
    2103         _mountPointsTable->setItem(iRow, 2, it);
    2104 
    2105         it = new QTableWidgetItem(country);
    2106         _mountPointsTable->setItem(iRow, 3, it);
    2107 
    2108         if (nmea == "yes") {
    2109             it = new QTableWidgetItem(latitude);
    2110             _mountPointsTable->setItem(iRow, 4, it);
    2111             it = new QTableWidgetItem(longitude);
    2112             _mountPointsTable->setItem(iRow, 5, it);
    2113         }
    2114         else {
    2115             it = new QTableWidgetItem(latitude);
    2116             it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2117             _mountPointsTable->setItem(iRow, 4, it);
    2118             it = new QTableWidgetItem(longitude);
    2119             it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2120             _mountPointsTable->setItem(iRow, 5, it);
    2121         }
    2122 
    2123         it = new QTableWidgetItem(nmea);
    2124         it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2125         _mountPointsTable->setItem(iRow, 6, it);
    2126 
    2127         it = new QTableWidgetItem(ntripVersion);
    2128         //// it->setFlags(it->flags() & ~Qt::ItemIsEditable);
    2129         _mountPointsTable->setItem(iRow, 7, it);
    2130 
    2131         bncTableItem* bncIt = new bncTableItem();
    2132         _mountPointsTable->setItem(iRow, 8, bncIt);
    2133 
    2134         iRow++;
    2135     }
    2136     _mountPointsTable->hideColumn(0);
    2137     _mountPointsTable->hideColumn(3);
    2138     _mountPointsTable->sortItems(1);
    2139     delete mountPoints;
    2140 
    2141     enableStartStop();
    2142 }
    2143 
    2144 // Save Options (serialize)
    2145 ////////////////////////////////////////////////////////////////////////////
    2146 void bncWindow::slotSaveOptions() {
    2147     saveOptions();
    2148     bncSettings settings;
    2149     settings.sync();
    2150 }
    2151 
    2152 // Save Options (memory only)
    2153 ////////////////////////////////////////////////////////////////////////////
    2154 void bncWindow::saveOptions() {
    2155 
    2156     QStringList mountPoints;
    2157     for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
    2158 
    2159           QUrl url("//"
    2160               + _mountPointsTable->item(iRow, 0)->text() + "@"
    2161               + _mountPointsTable->item(iRow, 1)->text());
    2162 
    2163           mountPoints.append(url.toString()
    2164               + " " + _mountPointsTable->item(iRow, 2)->text()
    2165               + " " + _mountPointsTable->item(iRow, 3)->text()
    2166               + " " + _mountPointsTable->item(iRow, 4)->text()
    2167               + " " + _mountPointsTable->item(iRow, 5)->text()
    2168               + " " + _mountPointsTable->item(iRow, 6)->text()
    2169               + " " + _mountPointsTable->item(iRow, 7)->text());
    2170     }
    2171 
    2172     QStringList cmbStreams;
    2173     for (int iRow = 0; iRow < _cmbTable->rowCount(); iRow++) {
    2174         QString hlp;
    2175         for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
    2176             if (_cmbTable->item(iRow, iCol)) {
    2177                 hlp += _cmbTable->item(iRow, iCol)->text() + " ";
    2178             }
    2179         }
    2180         if (!hlp.isEmpty()) {
    2181             cmbStreams << hlp;
    2182         }
    2183     }
    2184 
    2185     QStringList uploadMountpointsOut;
    2186     for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
    2187         QString hlp;
    2188         for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
    2189             if (_uploadTable->cellWidget(iRow, iCol) &&
    2190                 (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6 || iCol == 7 || iCol == 8)) {
    2191                 if (iCol == 3) {
    2192                     QComboBox* ntripversion = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
    2193                     hlp += ntripversion->currentText() + ",";
    2194                 }
    2195                 else if (iCol == 4) {
    2196                     QLineEdit* user = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
    2197                     hlp += user->text() + ",";
    2198                 }
    2199                 else if (iCol == 5) {
    2200                     QLineEdit* passwd = (QLineEdit*)(_uploadTable->cellWidget(iRow, iCol));
    2201                     hlp += passwd->text() + ",";
    2202                 }
    2203                 else if (iCol == 6) {
    2204                     QComboBox* system = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
    2205                     hlp += system->currentText() + ",";
    2206                 }
    2207                 else if (iCol == 7) {
    2208                     QComboBox* format = (QComboBox*)(_uploadTable->cellWidget(iRow, iCol));
    2209                     hlp += format->currentText() + ",";
    2210                 }
    2211                 else if (iCol == 8) {
    2212                     QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
    2213                     QString state; state.setNum(com->checkState());
    2214                     hlp += state + ",";
    2215                 }
    2216             }
    2217             else if (_uploadTable->item(iRow, iCol)) {
    2218                 hlp += _uploadTable->item(iRow, iCol)->text() + ",";
    2219             }
    2220         }
    2221         if (!hlp.isEmpty()) {
    2222             uploadMountpointsOut << hlp;
    2223         }
    2224     }
    2225 
    2226     QStringList uploadEphMountpointsOut;
    2227     for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
    2228       QString hlp;
    2229       for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
    2230           if (_uploadEphTable->cellWidget(iRow, iCol) &&
    2231               (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
    2232               if      (iCol == 3) {
    2233                   QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
    2234                   hlp += ntripversion->currentText() + ",";
    2235               }
    2236               else if (iCol == 4) {
    2237                   QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
    2238                   hlp += user->text() + ",";
    2239               }
    2240               else if (iCol == 5) {
    2241                   QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
    2242                   hlp += passwd->text() + ",";
    2243               }
    2244               else if (iCol == 6) {
    2245                   QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
    2246                   hlp += system->text() + ",";
    2247               }
    2248           }
    2249           else if (_uploadEphTable->item(iRow, iCol)) {
    2250               hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
    2251           }
    2252       }
    2253       if (!hlp.isEmpty()) {
    2254           uploadEphMountpointsOut << hlp;
    2255       }
    2256     }
    2257 
    2258     QStringList uploadRawMountpointsOut;
    2259     for (int iRow = 0; iRow < _uploadRawTable->rowCount(); iRow++) {
    2260       QString hlp;
    2261       for (int iCol = 0; iCol < _uploadRawTable->columnCount(); iCol++) {
    2262         if (_uploadRawTable->cellWidget(iRow, iCol) &&
    2263             (iCol == 4 || iCol == 5 || iCol == 6)) {
    2264             if      (iCol == 4) {
    2265                 QComboBox* ntripversion = (QComboBox*)(_uploadRawTable->cellWidget(iRow, iCol));
    2266                 hlp += ntripversion->currentText() + ",";
    2267             }
    2268             else if (iCol == 5) {
    2269                 QLineEdit* user = (QLineEdit*)(_uploadRawTable->cellWidget(iRow, iCol));
    2270                 hlp += user->text() + ",";
    2271             }
    2272             else if (iCol == 6) {
    2273                 QLineEdit* passwd = (QLineEdit*)(_uploadRawTable->cellWidget(iRow, iCol));
    2274                 hlp += passwd->text() + ",";
    2275             }
    2276         }
    2277         else if (_uploadRawTable->item(iRow, iCol)) {
    2278             hlp += _uploadRawTable->item(iRow, iCol)->text() + ",";
     2230        else if (iCol == 8) {
     2231          QCheckBox* com = (QCheckBox*)(_uploadTable->cellWidget(iRow, iCol));
     2232          QString state; state.setNum(com->checkState());
     2233          hlp += state + ",";
    22792234        }
    22802235      }
    2281       if (!hlp.isEmpty()) {
    2282           uploadRawMountpointsOut << hlp;
     2236      else if (_uploadTable->item(iRow, iCol)) {
     2237        hlp += _uploadTable->item(iRow, iCol)->text() + ",";
    22832238      }
    22842239    }
    2285 
    2286     bncSettings settings;
    2287 
    2288     settings.setValue("startTab", _aogroup->currentIndex());
    2289     settings.setValue("statusTab", _loggroup->currentIndex());
    2290     settings.setValue("mountPoints", mountPoints);
    2291     // Network
    2292     settings.setValue("proxyHost", _proxyHostLineEdit->text());
    2293     settings.setValue("proxyPort", _proxyPortLineEdit->text());
    2294     settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
    2295     settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
    2296     settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
    2297     // General
    2298     settings.setValue("logFile", _logFileLineEdit->text());
    2299     settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
    2300     settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
    2301     settings.setValue("autoStart", _autoStartCheckBox->checkState());
    2302     settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
    2303     // RINEX Observations
    2304     settings.setValue("rnxPath", _rnxPathLineEdit->text());
    2305     settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
    2306     settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
    2307     settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
    2308     settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
    2309     settings.setValue("rnxOnlyWithSKL", _rnxFileCheckBox->checkState());
    2310     settings.setValue("rnxScript", _rnxScrpLineEdit->text());
    2311     settings.setValue("rnxV2Priority", _rnxV2Priority->text());
    2312     settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
    2313     // RINEX Ephemeris
    2314     settings.setValue("ephPath", _ephPathLineEdit->text());
    2315     settings.setValue("ephIntr", _ephIntrComboBox->currentText());
    2316     settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
    2317     settings.setValue("ephVersion", _ephVersComboBox->currentText());
    2318     //settings.setValue("ephFilePerStation", _ephFilePerStation->checkState());
     2240    if (!hlp.isEmpty()) {
     2241      uploadMountpointsOut << hlp;
     2242    }
     2243  }
     2244
     2245  QStringList uploadEphMountpointsOut;
     2246  for (int iRow = 0; iRow < _uploadEphTable->rowCount(); iRow++) {
     2247    QString hlp;
     2248    for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
     2249      if (_uploadEphTable->cellWidget(iRow, iCol) &&
     2250          (iCol == 3 || iCol == 4 || iCol == 5 || iCol == 6)) {
     2251        if      (iCol == 3) {
     2252          QComboBox* ntripversion = (QComboBox*)(_uploadEphTable->cellWidget(iRow, iCol));
     2253          hlp += ntripversion->currentText() + ",";
     2254        }
     2255        else if (iCol == 4) {
     2256          QLineEdit* user = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
     2257          hlp += user->text() + ",";
     2258        }
     2259        else if (iCol == 5) {
     2260          QLineEdit* passwd = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
     2261          hlp += passwd->text() + ",";
     2262        }
     2263        else if (iCol == 6) {
     2264          QLineEdit* system = (QLineEdit*)(_uploadEphTable->cellWidget(iRow, iCol));
     2265          hlp += system->text() + ",";
     2266        }
     2267      }
     2268      else if (_uploadEphTable->item(iRow, iCol)) {
     2269        hlp += _uploadEphTable->item(iRow, iCol)->text() + ",";
     2270      }
     2271    }
     2272    if (!hlp.isEmpty()) {
     2273      uploadEphMountpointsOut << hlp;
     2274    }
     2275  }
     2276
     2277  QStringList uploadRawMountpointsOut;
     2278  for (int iRow = 0; iRow < _uploadRawTable->rowCount(); iRow++) {
     2279    QString hlp;
     2280    for (int iCol = 0; iCol < _uploadRawTable->columnCount(); iCol++) {
     2281      if (_uploadRawTable->cellWidget(iRow, iCol) &&
     2282          (iCol == 4 || iCol == 5 || iCol == 6)) {
     2283        if      (iCol == 4) {
     2284          QComboBox* ntripversion = (QComboBox*)(_uploadRawTable->cellWidget(iRow, iCol));
     2285          hlp += ntripversion->currentText() + ",";
     2286        }
     2287        else if (iCol == 5) {
     2288          QLineEdit* user = (QLineEdit*)(_uploadRawTable->cellWidget(iRow, iCol));
     2289          hlp += user->text() + ",";
     2290        }
     2291        else if (iCol == 6) {
     2292          QLineEdit* passwd = (QLineEdit*)(_uploadRawTable->cellWidget(iRow, iCol));
     2293          hlp += passwd->text() + ",";
     2294        }
     2295      }
     2296      else if (_uploadRawTable->item(iRow, iCol)) {
     2297        hlp += _uploadRawTable->item(iRow, iCol)->text() + ",";
     2298      }
     2299    }
     2300    if (!hlp.isEmpty()) {
     2301      uploadRawMountpointsOut << hlp;
     2302    }
     2303  }
     2304
     2305  bncSettings settings;
     2306
     2307  settings.setValue("startTab", _aogroup->currentIndex());
     2308  settings.setValue("statusTab", _loggroup->currentIndex());
     2309  settings.setValue("mountPoints", mountPoints);
     2310  // Network
     2311  settings.setValue("proxyHost", _proxyHostLineEdit->text());
     2312  settings.setValue("proxyPort", _proxyPortLineEdit->text());
     2313  settings.setValue("sslCaCertPath", _sslCaCertPathLineEdit->text());
     2314  settings.setValue("sslClientCertPath", _sslClientCertPathLineEdit->text());
     2315  settings.setValue("sslIgnoreErrors", _sslIgnoreErrorsCheckBox->checkState());
     2316  // General
     2317  settings.setValue("logFile", _logFileLineEdit->text());
     2318  settings.setValue("rnxAppend", _rnxAppendCheckBox->checkState());
     2319  settings.setValue("onTheFlyInterval", _onTheFlyComboBox->currentText());
     2320  settings.setValue("autoStart", _autoStartCheckBox->checkState());
     2321  settings.setValue("rawOutFile", _rawOutFileLineEdit->text());
     2322  // RINEX Observations
     2323  settings.setValue("rnxPath", _rnxPathLineEdit->text());
     2324  settings.setValue("rnxIntr", _rnxIntrComboBox->currentText());
     2325  settings.setValue("rnxSampl", _rnxSamplComboBox->currentText());
     2326  settings.setValue("rnxSkel", _rnxSkelExtComboBox->currentText());
     2327  settings.setValue("rnxSkelPath", _rnxSkelPathLineEdit->text());
     2328  settings.setValue("rnxOnlyWithSKL", _rnxFileCheckBox->checkState());
     2329  settings.setValue("rnxScript", _rnxScrpLineEdit->text());
     2330  settings.setValue("rnxV2Priority", _rnxV2Priority->text());
     2331  settings.setValue("rnxVersion", _rnxVersComboBox->currentText());
     2332  // RINEX Ephemeris
     2333  settings.setValue("ephPath", _ephPathLineEdit->text());
     2334  settings.setValue("ephIntr", _ephIntrComboBox->currentText());
     2335  settings.setValue("ephOutPort", _ephOutPortLineEdit->text());
     2336  settings.setValue("ephVersion", _ephVersComboBox->currentText());
     2337  //settings.setValue("ephFilePerStation", _ephFilePerStation->checkState());
    23192338  // Broadcast Corrections
    2320     settings.setValue("corrPath", _corrPathLineEdit->text());
    2321     settings.setValue("corrIntr", _corrIntrComboBox->currentText());
    2322     settings.setValue("corrPort", _corrPortLineEdit->text());
    2323     // Feed Engine
    2324     settings.setValue("outPort", _outPortLineEdit->text());
    2325     settings.setValue("outWait", _outWaitSpinBox->value());
    2326     settings.setValue("outSampl", _outSamplComboBox->currentText());
    2327     settings.setValue("outFile", _outFileLineEdit->text());
    2328     settings.setValue("outLockTime", _outLockTimeCheckBox->checkState());
    2329     settings.setValue("outUPort", _outUPortLineEdit->text());
    2330     // Serial Output
    2331     settings.setValue("serialMountPoint", _serialMountPointLineEdit->text());
    2332     settings.setValue("serialPortName", _serialPortNameLineEdit->text());
    2333     settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
    2334     settings.setValue("serialFlowControl", _serialFlowControlComboBox->currentText());
    2335     settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
    2336     settings.setValue("serialParity", _serialParityComboBox->currentText());
    2337     settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
    2338     settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
    2339     settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
    2340     settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
    2341     settings.setValue("serialNMEASampling", _serialNMEASamplingSpinBox->value());
    2342     // Outages
    2343     settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
    2344     settings.setValue("adviseFail", _adviseFailSpinBox->value());
    2345     settings.setValue("adviseReco", _adviseRecoSpinBox->value());
    2346     settings.setValue("adviseScript", _adviseScriptLineEdit->text());
    2347     // Miscellaneous
    2348     settings.setValue("miscMount", _miscMountLineEdit->text());
    2349     settings.setValue("miscPort", _miscPortLineEdit->text());
    2350     settings.setValue("miscIntr", _miscIntrComboBox->currentText());
    2351     settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
    2352     // Reqc
    2353     settings.setValue("reqcAction", _reqcActionComboBox->currentText());
    2354     settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
    2355     settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
    2356     settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
    2357     settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
    2358     settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
    2359     settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
    2360     settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
    2361     settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
    2362     // SP3 Comparison
    2363     settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
    2364     settings.setValue("sp3CompExclude", _sp3CompExclude->text());
    2365     settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
    2366     settings.setValue("sp3CompSummaryOnly", _sp3CompSummaryOnly->checkState());
    2367     // Combine Corrections
    2368     if (!cmbStreams.isEmpty()) {
    2369         settings.setValue("cmbStreams", cmbStreams);
     2339  settings.setValue("corrPath", _corrPathLineEdit->text());
     2340  settings.setValue("corrIntr", _corrIntrComboBox->currentText());
     2341  settings.setValue("corrPort", _corrPortLineEdit->text());
     2342  // Feed Engine
     2343  settings.setValue("outPort", _outPortLineEdit->text());
     2344  settings.setValue("outWait", _outWaitSpinBox->value());
     2345  settings.setValue("outSampl", _outSamplComboBox->currentText());
     2346  settings.setValue("outFile", _outFileLineEdit->text());
     2347  settings.setValue("outLockTime", _outLockTimeCheckBox->checkState());
     2348  settings.setValue("outUPort", _outUPortLineEdit->text());
     2349  // Serial Output
     2350  settings.setValue("serialMountPoint", _serialMountPointLineEdit->text());
     2351  settings.setValue("serialPortName", _serialPortNameLineEdit->text());
     2352  settings.setValue("serialBaudRate", _serialBaudRateComboBox->currentText());
     2353  settings.setValue("serialFlowControl", _serialFlowControlComboBox->currentText());
     2354  settings.setValue("serialDataBits", _serialDataBitsComboBox->currentText());
     2355  settings.setValue("serialParity", _serialParityComboBox->currentText());
     2356  settings.setValue("serialStopBits", _serialStopBitsComboBox->currentText());
     2357  settings.setValue("serialAutoNMEA", _serialAutoNMEAComboBox->currentText());
     2358  settings.setValue("serialFileNMEA", _serialFileNMEALineEdit->text());
     2359  settings.setValue("serialHeightNMEA", _serialHeightNMEALineEdit->text());
     2360  settings.setValue("serialNMEASampling", _serialNMEASamplingSpinBox->value());
     2361  // Outages
     2362  settings.setValue("adviseObsRate", _adviseObsRateComboBox->currentText());
     2363  settings.setValue("adviseFail", _adviseFailSpinBox->value());
     2364  settings.setValue("adviseReco", _adviseRecoSpinBox->value());
     2365  settings.setValue("adviseScript", _adviseScriptLineEdit->text());
     2366  // Miscellaneous
     2367  settings.setValue("miscMount", _miscMountLineEdit->text());
     2368  settings.setValue("miscPort", _miscPortLineEdit->text());
     2369  settings.setValue("miscIntr", _miscIntrComboBox->currentText());
     2370  settings.setValue("miscScanRTCM", _miscScanRTCMCheckBox->checkState());
     2371  // Reqc
     2372  settings.setValue("reqcAction", _reqcActionComboBox->currentText());
     2373  settings.setValue("reqcObsFile", _reqcObsFileChooser->fileName());
     2374  settings.setValue("reqcNavFile", _reqcNavFileChooser->fileName());
     2375  settings.setValue("reqcOutObsFile", _reqcOutObsLineEdit->text());
     2376  settings.setValue("reqcOutNavFile", _reqcOutNavLineEdit->text());
     2377  settings.setValue("reqcOutLogFile", _reqcOutLogLineEdit->text());
     2378  settings.setValue("reqcPlotDir", _reqcPlotDirLineEdit->text());
     2379  settings.setValue("reqcSkyPlotSignals", _reqcSkyPlotSignals->text());
     2380  settings.setValue("reqcLogSummaryOnly", _reqcLogSummaryOnly->checkState());
     2381  // SP3 Comparison
     2382  settings.setValue("sp3CompFile", _sp3CompFileChooser->fileName());
     2383  settings.setValue("sp3CompExclude", _sp3CompExclude->text());
     2384  settings.setValue("sp3CompOutLogFile", _sp3CompLogLineEdit->text());
     2385  settings.setValue("sp3CompSummaryOnly", _sp3CompSummaryOnly->checkState());
     2386  // Combine Corrections
     2387  if (!cmbStreams.isEmpty()) {
     2388    settings.setValue("cmbStreams", cmbStreams);
     2389  }
     2390  else {
     2391    settings.setValue("cmbStreams", "");
     2392  }
     2393  settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
     2394  settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
     2395  settings.setValue("cmbMaxdisplacement", _cmbMaxdisplacementLineEdit->text());
     2396  settings.setValue("cmbSampl", _cmbSamplComboBox->currentText());
     2397  settings.setValue("cmbLogpath", _cmbLogPath->text());
     2398  settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
     2399  settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
     2400  settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
     2401  settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
     2402  settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
     2403  settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
     2404  settings.setValue("cmbNavic", _cmbNavicCheckBox->checkState());
     2405  settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
     2406
     2407  // Upload Corrections
     2408  if (!uploadMountpointsOut.isEmpty()) {
     2409    settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
     2410  }
     2411  else {
     2412    settings.setValue("uploadMountpointsOut", "");
     2413  }
     2414  settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
     2415  settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrComboBox->currentText());
     2416  settings.setValue("uploadSamplSp3", _uploadSamplSp3ComboBox->currentText());
     2417  settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
     2418  settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
     2419  settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
     2420  // Upload Ephemeris
     2421  if (!uploadEphMountpointsOut.isEmpty()) {
     2422    settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
     2423  }
     2424  else {
     2425    settings.setValue("uploadEphMountpointsOut", "");
     2426  }
     2427  settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
     2428  // Upload Raw Data
     2429  if (!uploadRawMountpointsOut.isEmpty()) {
     2430    settings.setValue("uploadRawMountpointsOut", uploadRawMountpointsOut);
     2431  }
     2432  else {
     2433    settings.setValue("uploadRawMountpointsOut", "");
     2434  }
     2435  if (_caster) {
     2436    _caster->readMountPoints();
     2437  }
     2438
     2439  _pppWidgets.saveOptions();
     2440}
     2441
     2442// All get slots terminated
     2443////////////////////////////////////////////////////////////////////////////
     2444void bncWindow::slotGetThreadsFinished() {
     2445  BNC_CORE->slotMessage("All Get Threads Terminated", true);
     2446  delete _caster;    _caster = 0; BNC_CORE->setCaster(0);
     2447  delete _casterEph; _casterEph = 0;
     2448  _runningRealTime = false;
     2449  enableStartStop();
     2450}
     2451
     2452// Start It!
     2453////////////////////////////////////////////////////////////////////////////
     2454void bncWindow::slotStart() {
     2455  saveOptions();
     2456  if (_pppWidgets._dataSource->currentText() == "RINEX Files") {
     2457    _runningPPP = true;
     2458    enableStartStop();
     2459    _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
     2460    BNC_CORE->startPPP();
     2461    _bncFigurePPP->reset();
     2462  }
     2463  else if (!_reqcActionComboBox->currentText().isEmpty()) {
     2464    if (_reqcActionComboBox->currentText() == "Analyze") {
     2465      _runningQC = true;
     2466      t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
     2467      connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
     2468      reqcAnalyze->start();
    23702469    }
    23712470    else {
    2372         settings.setValue("cmbStreams", "");
    2373     }
    2374     settings.setValue("cmbMethod", _cmbMethodComboBox->currentText());
    2375     settings.setValue("cmbMaxres", _cmbMaxresLineEdit->text());
    2376     settings.setValue("cmbMaxdisplacement", _cmbMaxdisplacementLineEdit->text());
    2377     settings.setValue("cmbSampl", _cmbSamplComboBox->currentText());
    2378     settings.setValue("cmbLogpath", _cmbLogPath->text());
    2379     settings.setValue("cmbGps", _cmbGpsCheckBox->checkState());
    2380     settings.setValue("cmbGlo", _cmbGloCheckBox->checkState());
    2381     settings.setValue("cmbGal", _cmbGalCheckBox->checkState());
    2382     settings.setValue("cmbBds", _cmbBdsCheckBox->checkState());
    2383     settings.setValue("cmbQzss", _cmbQzssCheckBox->checkState());
    2384     settings.setValue("cmbSbas", _cmbSbasCheckBox->checkState());
    2385     settings.setValue("cmbNavic", _cmbNavicCheckBox->checkState());
    2386     settings.setValue("cmbBsxFile", _cmbBsxFile->fileName());
    2387 
    2388     // Upload Corrections
    2389     if (!uploadMountpointsOut.isEmpty()) {
    2390         settings.setValue("uploadMountpointsOut", uploadMountpointsOut);
    2391     }
    2392     else {
    2393         settings.setValue("uploadMountpointsOut", "");
    2394     }
    2395     settings.setValue("uploadIntr", _uploadIntrComboBox->currentText());
    2396     settings.setValue("uploadSamplRtcmEphCorr", _uploadSamplRtcmEphCorrComboBox->currentText());
    2397     settings.setValue("uploadSamplSp3", _uploadSamplSp3ComboBox->currentText());
    2398     settings.setValue("uploadSamplClkRnx", _uploadSamplClkRnxSpinBox->value());
    2399     settings.setValue("uploadSamplBiaSnx", _uploadSamplBiaSnxSpinBox->value());
    2400     settings.setValue("uploadAntexFile", _uploadAntexFile->fileName());
    2401     // Upload Ephemeris
    2402     if (!uploadEphMountpointsOut.isEmpty()) {
    2403         settings.setValue("uploadEphMountpointsOut", uploadEphMountpointsOut);
    2404     }
    2405     else {
    2406         settings.setValue("uploadEphMountpointsOut", "");
    2407     }
    2408     settings.setValue("uploadSamplRtcmEph", _uploadSamplRtcmEphSpinBox->value());
    2409     // Upload Raw Data
    2410     if (!uploadRawMountpointsOut.isEmpty()) {
    2411         settings.setValue("uploadRawMountpointsOut", uploadRawMountpointsOut);
    2412     }
    2413     else {
    2414         settings.setValue("uploadRawMountpointsOut", "");
    2415     }
    2416     if (_caster) {
    2417         _caster->readMountPoints();
    2418     }
    2419 
    2420     _pppWidgets.saveOptions();
    2421 }
    2422 
    2423 // All get slots terminated
    2424 ////////////////////////////////////////////////////////////////////////////
    2425 void bncWindow::slotGetThreadsFinished() {
    2426     BNC_CORE->slotMessage("All Get Threads Terminated", true);
     2471      _runningEdit = true;
     2472      t_reqcEdit* reqcEdit = new t_reqcEdit(this);
     2473      connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
     2474      reqcEdit->start();
     2475    }
     2476    enableStartStop();
     2477  }
     2478  else if (!_sp3CompFileChooser->fileName().isEmpty()) {
     2479    _runningSp3Comp = true;
     2480    t_sp3Comp* sp3Comp = new t_sp3Comp(this);
     2481    connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
     2482    sp3Comp->start();
     2483    enableStartStop();
     2484  }
     2485  else {
     2486    startRealTime();
     2487    BNC_CORE->startPPP();
     2488  }
     2489}
     2490
     2491// Start Real-Time (Retrieve Data etc.)
     2492////////////////////////////////////////////////////////////////////////////
     2493void bncWindow::startRealTime() {
     2494
     2495  _runningRealTime = true;
     2496
     2497  _bncFigurePPP->reset();
     2498
     2499  _actDeleteMountPoints->setEnabled(false);
     2500
     2501  enableStartStop();
     2502
     2503  _caster = new bncCaster();
     2504
     2505  BNC_CORE->setCaster(_caster);
     2506  BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
     2507  BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
     2508  BNC_CORE->initCombination();
     2509
     2510  connect(_caster, SIGNAL(getThreadsFinished()), this, SLOT(slotGetThreadsFinished()));
     2511
     2512  connect(_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)), this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
     2513
     2514  BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
     2515
     2516  bncSettings settings;
     2517
     2518  // Active panels
     2519  // -------------
     2520  if (!_rnxPathLineEdit->text().isEmpty())
     2521    BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
     2522  if (!_ephPathLineEdit->text().isEmpty())
     2523    BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
     2524  if (!_corrPathLineEdit->text().isEmpty())
     2525    BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
     2526  if (!_outPortLineEdit->text().isEmpty())
     2527    BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
     2528  if (!_serialMountPointLineEdit->text().isEmpty())
     2529    BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
     2530  if (!_adviseObsRateComboBox->currentText().isEmpty())
     2531    BNC_CORE->slotMessage("Panel 'Outages' active", true);
     2532  if (!_miscMountLineEdit->text().isEmpty())
     2533    BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
     2534  if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
     2535    BNC_CORE->slotMessage("Panel 'PPP' active", true);
     2536  if (_cmbTable->rowCount() > 0)
     2537    BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
     2538  if (_uploadTable->rowCount() > 0)
     2539    BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
     2540  if (_uploadEphTable->rowCount() > 0)
     2541    BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
     2542
     2543  QDir rnxdir(settings.value("rnxPath").toString());
     2544  if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
     2545
     2546  QString rnx_file = settings.value("rnxScript").toString();
     2547  if (!rnx_file.isEmpty()) {
     2548    QFile rnxfile(settings.value("rnxScript").toString());
     2549    if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
     2550  }
     2551
     2552  QDir ephdir(settings.value("ephPath").toString());
     2553  if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
     2554
     2555  QDir corrdir(settings.value("corrPath").toString());
     2556  if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
     2557
     2558  QString advise_file = settings.value("adviseScript").toString();
     2559  if (!advise_file.isEmpty()) {
     2560    QFile advisefile(settings.value("adviseScript").toString());
     2561    if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
     2562  }
     2563
     2564  _caster->readMountPoints();
     2565
     2566  _casterEph = new bncEphUploadCaster();
     2567}
     2568
     2569// Retrieve Data
     2570////////////////////////////////////////////////////////////////////////////
     2571void bncWindow::slotStop() {
     2572  int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
     2573                                   QMessageBox::Yes, QMessageBox::No,
     2574                                   QMessageBox::NoButton);
     2575  if (iRet == QMessageBox::Yes) {
     2576    BNC_CORE->stopPPP();
     2577    BNC_CORE->stopCombination();
    24272578    delete _caster;    _caster = 0; BNC_CORE->setCaster(0);
    24282579    delete _casterEph; _casterEph = 0;
    24292580    _runningRealTime = false;
     2581    _runningPPP = false;
    24302582    enableStartStop();
    2431 }
    2432 
    2433 // Start It!
    2434 ////////////////////////////////////////////////////////////////////////////
    2435 void bncWindow::slotStart() {
    2436     saveOptions();
    2437     if (_pppWidgets._dataSource->currentText() == "RINEX Files") {
    2438         _runningPPP = true;
    2439         enableStartStop();
    2440         _caster = new bncCaster(); BNC_CORE->setCaster(_caster);
    2441         BNC_CORE->startPPP();
    2442         _bncFigurePPP->reset();
    2443     }
    2444     else if (!_reqcActionComboBox->currentText().isEmpty()) {
    2445         if (_reqcActionComboBox->currentText() == "Analyze") {
    2446             _runningQC = true;
    2447             t_reqcAnalyze* reqcAnalyze = new t_reqcAnalyze(this);
    2448             connect(reqcAnalyze, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
    2449             reqcAnalyze->start();
    2450         }
    2451         else {
    2452             _runningEdit = true;
    2453             t_reqcEdit* reqcEdit = new t_reqcEdit(this);
    2454             connect(reqcEdit, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
    2455             reqcEdit->start();
    2456         }
    2457         enableStartStop();
    2458     }
    2459     else if (!_sp3CompFileChooser->fileName().isEmpty()) {
    2460         _runningSp3Comp = true;
    2461         t_sp3Comp* sp3Comp = new t_sp3Comp(this);
    2462         connect(sp3Comp, SIGNAL(finished()), this, SLOT(slotPostProcessingFinished()));
    2463         sp3Comp->start();
    2464         enableStartStop();
    2465     }
    2466     else {
    2467         startRealTime();
    2468         BNC_CORE->startPPP();
    2469     }
    2470 }
    2471 
    2472 // Start Real-Time (Retrieve Data etc.)
    2473 ////////////////////////////////////////////////////////////////////////////
    2474 void bncWindow::startRealTime() {
    2475 
    2476     _runningRealTime = true;
    2477 
    2478     _bncFigurePPP->reset();
    2479 
     2583  }
     2584}
     2585
     2586// Close Application gracefully
     2587////////////////////////////////////////////////////////////////////////////
     2588void bncWindow::closeEvent(QCloseEvent* event) {
     2589
     2590  int iRet = QMessageBox::question(this, "Close", "Save Options?",
     2591                                   QMessageBox::Yes, QMessageBox::No,
     2592                                   QMessageBox::Cancel);
     2593
     2594  if (iRet == QMessageBox::Cancel) {
     2595    event->ignore();
     2596    return;
     2597  }
     2598  else if (iRet == QMessageBox::Yes) {
     2599    slotSaveOptions();
     2600  }
     2601
     2602  BNC_CORE->stopPPP();
     2603
     2604  QMainWindow::closeEvent(event);
     2605}
     2606
     2607// User changed the selection of mountPoints
     2608////////////////////////////////////////////////////////////////////////////
     2609void bncWindow::slotSelectionChanged() {
     2610  if (_mountPointsTable->selectedItems().isEmpty()) {
    24802611    _actDeleteMountPoints->setEnabled(false);
    2481 
    2482     enableStartStop();
    2483 
    2484     _caster = new bncCaster();
    2485 
    2486     BNC_CORE->setCaster(_caster);
    2487     BNC_CORE->setPortEph(_ephOutPortLineEdit->text().toInt());
    2488     BNC_CORE->setPortCorr(_corrPortLineEdit->text().toInt());
    2489     BNC_CORE->initCombination();
    2490 
    2491     connect(_caster, SIGNAL(getThreadsFinished()), this, SLOT(slotGetThreadsFinished()));
    2492 
    2493     connect(_caster, SIGNAL(mountPointsRead(QList<bncGetThread*>)), this, SLOT(slotMountPointsRead(QList<bncGetThread*>)));
    2494 
    2495     BNC_CORE->slotMessage("========== Start BNC v" BNCVERSION " (" BNC_OS ") ==========", true);
    2496 
     2612  }
     2613  else {
     2614    _actDeleteMountPoints->setEnabled(true);
     2615  }
     2616}
     2617
     2618// Display Program Messages
     2619////////////////////////////////////////////////////////////////////////////
     2620void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
     2621  if (showOnScreen) {
     2622    _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
     2623  }
     2624}
     2625
     2626// About Message
     2627////////////////////////////////////////////////////////////////////////////
     2628void bncWindow::slotAbout() {
     2629  new bncAboutDlg(0);
     2630}
     2631
     2632//Flowchart
     2633////////////////////////////////////////////////////////////////////////////
     2634void bncWindow::slotFlowchart() {
     2635  new bncFlowchartDlg(0);
     2636}
     2637
     2638// Help Window
     2639////////////////////////////////////////////////////////////////////////////
     2640void bncWindow::slotHelp() {
     2641  QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
     2642  new bncHlpDlg(0, url);
     2643}
     2644
     2645// Select Fonts
     2646////////////////////////////////////////////////////////////////////////////
     2647void bncWindow::slotFontSel() {
     2648  bool ok;
     2649  QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
     2650  if (ok) {
    24972651    bncSettings settings;
    2498 
    2499     // Active panels
    2500     // -------------
    2501     if (!_rnxPathLineEdit->text().isEmpty())
    2502         BNC_CORE->slotMessage("Panel 'RINEX Observations' active", true);
    2503     if (!_ephPathLineEdit->text().isEmpty())
    2504         BNC_CORE->slotMessage("Panel 'RINEX Ephemeris' active", true);
    2505     if (!_corrPathLineEdit->text().isEmpty())
    2506         BNC_CORE->slotMessage("Panel 'Broadcast Corrections' active", true);
    2507     if (!_outPortLineEdit->text().isEmpty())
    2508         BNC_CORE->slotMessage("Panel 'Feed Engine' active", true);
    2509     if (!_serialMountPointLineEdit->text().isEmpty())
    2510         BNC_CORE->slotMessage("Panel 'Serial Output' active", true);
    2511     if (!_adviseObsRateComboBox->currentText().isEmpty())
    2512         BNC_CORE->slotMessage("Panel 'Outages' active", true);
    2513     if (!_miscMountLineEdit->text().isEmpty())
    2514         BNC_CORE->slotMessage("Panel 'Miscellaneous' active", true);
    2515     if (_pppWidgets._dataSource->currentText() == "Real-Time Streams")
    2516         BNC_CORE->slotMessage("Panel 'PPP' active", true);
    2517     if (_cmbTable->rowCount() > 0)
    2518         BNC_CORE->slotMessage("Panel 'Combine Corrections' active", true);
    2519     if (_uploadTable->rowCount() > 0)
    2520         BNC_CORE->slotMessage("Panel 'Upload Corrections' active", true);
    2521     if (_uploadEphTable->rowCount() > 0)
    2522         BNC_CORE->slotMessage("Panel 'UploadEphemeris' active", true);
    2523 
    2524     QDir rnxdir(settings.value("rnxPath").toString());
    2525     if (!rnxdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations directory", true);
    2526 
    2527     QString rnx_file = settings.value("rnxScript").toString();
    2528     if (!rnx_file.isEmpty()) {
    2529         QFile rnxfile(settings.value("rnxScript").toString());
    2530         if (!rnxfile.exists()) BNC_CORE->slotMessage("Cannot find RINEX Observations script", true);
    2531     }
    2532 
    2533     QDir ephdir(settings.value("ephPath").toString());
    2534     if (!ephdir.exists()) BNC_CORE->slotMessage("Cannot find RINEX Ephemeris directory", true);
    2535 
    2536     QDir corrdir(settings.value("corrPath").toString());
    2537     if (!corrdir.exists()) BNC_CORE->slotMessage("Cannot find Broadcast Corrections directory", true);
    2538 
    2539     QString advise_file = settings.value("adviseScript").toString();
    2540     if (!advise_file.isEmpty()) {
    2541         QFile advisefile(settings.value("adviseScript").toString());
    2542         if (!advisefile.exists()) BNC_CORE->slotMessage("Cannot find Outages script", true);
    2543     }
    2544 
    2545     _caster->readMountPoints();
    2546 
    2547     _casterEph = new bncEphUploadCaster();
    2548 }
    2549 
    2550 // Retrieve Data
    2551 ////////////////////////////////////////////////////////////////////////////
    2552 void bncWindow::slotStop() {
    2553     int iRet = QMessageBox::question(this, "Stop", "Stop retrieving/processing data?",
    2554         QMessageBox::Yes, QMessageBox::No,
    2555         QMessageBox::NoButton);
    2556     if (iRet == QMessageBox::Yes) {
    2557         BNC_CORE->stopPPP();
    2558         BNC_CORE->stopCombination();
    2559         delete _caster;    _caster = 0; BNC_CORE->setCaster(0);
    2560         delete _casterEph; _casterEph = 0;
    2561         _runningRealTime = false;
    2562         _runningPPP = false;
    2563         enableStartStop();
    2564     }
    2565 }
    2566 
    2567 // Close Application gracefully
    2568 ////////////////////////////////////////////////////////////////////////////
    2569 void bncWindow::closeEvent(QCloseEvent* event) {
    2570 
    2571     int iRet = QMessageBox::question(this, "Close", "Save Options?",
    2572         QMessageBox::Yes, QMessageBox::No,
    2573         QMessageBox::Cancel);
    2574 
    2575     if (iRet == QMessageBox::Cancel) {
    2576         event->ignore();
    2577         return;
    2578     }
    2579     else if (iRet == QMessageBox::Yes) {
    2580         slotSaveOptions();
    2581     }
    2582 
    2583     BNC_CORE->stopPPP();
    2584 
    2585     QMainWindow::closeEvent(event);
    2586 }
    2587 
    2588 // User changed the selection of mountPoints
    2589 ////////////////////////////////////////////////////////////////////////////
    2590 void bncWindow::slotSelectionChanged() {
    2591     if (_mountPointsTable->selectedItems().isEmpty()) {
    2592         _actDeleteMountPoints->setEnabled(false);
    2593     }
    2594     else {
    2595         _actDeleteMountPoints->setEnabled(true);
    2596     }
    2597 }
    2598 
    2599 // Display Program Messages
    2600 ////////////////////////////////////////////////////////////////////////////
    2601 void bncWindow::slotWindowMessage(const QByteArray msg, bool showOnScreen) {
    2602     if (showOnScreen) {
    2603         _log->append(QDateTime::currentDateTime().toUTC().toString("yy-MM-dd hh:mm:ss ") + msg);
    2604     }
    2605 }
    2606 
    2607 // About Message
    2608 ////////////////////////////////////////////////////////////////////////////
    2609 void bncWindow::slotAbout() {
    2610     new bncAboutDlg(0);
    2611 }
    2612 
    2613 //Flowchart
    2614 ////////////////////////////////////////////////////////////////////////////
    2615 void bncWindow::slotFlowchart() {
    2616     new bncFlowchartDlg(0);
    2617 }
    2618 
    2619 // Help Window
    2620 ////////////////////////////////////////////////////////////////////////////
    2621 void bncWindow::slotHelp() {
    2622     QUrl url = QUrl::fromLocalFile(":/bnchelp.html");
    2623     new bncHlpDlg(0, url);
    2624 }
    2625 
    2626 // Select Fonts
    2627 ////////////////////////////////////////////////////////////////////////////
    2628 void bncWindow::slotFontSel() {
    2629     bool ok;
    2630     QFont newFont = QFontDialog::getFont(&ok, this->font(), this);
    2631     if (ok) {
    2632         bncSettings settings;
    2633         settings.setValue("font", newFont.toString());
    2634         QApplication::setFont(newFont);
    2635         int ww = QFontMetrics(newFont).horizontalAdvance('w');
    2636         setMinimumSize(60 * ww, 80 * ww);
    2637         resize(60 * ww, 80 * ww);
    2638     }
     2652    settings.setValue("font", newFont.toString());
     2653    QApplication::setFont(newFont);
     2654    int ww = QFontMetrics(newFont).horizontalAdvance('w');
     2655    setMinimumSize(60 * ww, 80 * ww);
     2656    resize(60 * ww, 80 * ww);
     2657  }
    26392658}
    26402659
    26412660// Whats This Help
    26422661void bncWindow::slotWhatsThis() {
    2643     QWhatsThis::enterWhatsThisMode();
     2662  QWhatsThis::enterWhatsThisMode();
    26442663}
    26452664
     
    26472666////////////////////////////////////////////////////////////////////////////
    26482667void bncWindow::slotMountPointsRead(QList<bncGetThread*> threads) {
    2649     _threads = threads;
    2650 
    2651     _bncFigure->updateMountPoints();
    2652     _bncFigureLate->updateMountPoints();
    2653 
    2654     populateMountPointsTable();
    2655     bncSettings settings;
    2656     _outSamplComboBox->findText(settings.value("outSampl").toString());
    2657     _outWaitSpinBox->setValue(settings.value("outWait").toInt());
    2658     QListIterator<bncGetThread*> iTh(threads);
    2659     while (iTh.hasNext()) {
    2660         bncGetThread* thread = iTh.next();
    2661         for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
    2662             QUrl url("//" + _mountPointsTable->item(iRow, 0)->text() +
    2663                 "@" + _mountPointsTable->item(iRow, 1)->text());
    2664             if (url == thread->mountPoint() &&
    2665                 _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
    2666                 _mountPointsTable->item(iRow, 5)->text() == thread->longitude()) {
    2667                 ((bncTableItem*)_mountPointsTable->item(iRow, 8))->setGetThread(thread);
    2668                 disconnect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
    2669                 connect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
    2670                 disconnect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
    2671                 connect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
    2672                 break;
    2673             }
    2674         }
    2675     }
     2668  _threads = threads;
     2669
     2670  _bncFigure->updateMountPoints();
     2671  _bncFigureLate->updateMountPoints();
     2672
     2673  populateMountPointsTable();
     2674  bncSettings settings;
     2675  _outSamplComboBox->findText(settings.value("outSampl").toString());
     2676  _outWaitSpinBox->setValue(settings.value("outWait").toInt());
     2677  QListIterator<bncGetThread*> iTh(threads);
     2678  while (iTh.hasNext()) {
     2679    bncGetThread* thread = iTh.next();
     2680    for (int iRow = 0; iRow < _mountPointsTable->rowCount(); iRow++) {
     2681      QUrl url("//" + _mountPointsTable->item(iRow, 0)->text() +
     2682               "@" + _mountPointsTable->item(iRow, 1)->text());
     2683      if (url == thread->mountPoint() &&
     2684          _mountPointsTable->item(iRow, 4)->text() == thread->latitude() &&
     2685          _mountPointsTable->item(iRow, 5)->text() == thread->longitude()) {
     2686        ((bncTableItem*)_mountPointsTable->item(iRow, 8))->setGetThread(thread);
     2687        disconnect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
     2688        connect(thread, SIGNAL(newBytes(QByteArray, double)), _bncFigure, SLOT(slotNewData(QByteArray, double)));
     2689        disconnect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
     2690        connect(thread, SIGNAL(newLatency(QByteArray, double)), _bncFigureLate, SLOT(slotNewLatency(QByteArray, double)));
     2691        break;
     2692      }
     2693    }
     2694  }
    26762695}
    26772696
     
    26792698////////////////////////////////////////////////////////////////////////////
    26802699void bncWindow::CreateMenu() {
    2681     // Create Menus
    2682     // ------------
    2683     _menuFile = menuBar()->addMenu(tr("&File"));
    2684     _menuFile->addAction(_actFontSel);
    2685     _menuFile->addSeparator();
    2686     _menuFile->addAction(_actSaveOpt);
    2687     _menuFile->addSeparator();
    2688     _menuFile->addAction(_actQuit);
    2689 
    2690     _menuHlp = menuBar()->addMenu(tr("&Help"));
    2691     _menuHlp->addAction(_actHelp);
    2692     _menuHlp->addAction(_actFlowchart);
    2693     _menuHlp->addAction(_actAbout);
     2700  // Create Menus
     2701  // ------------
     2702  _menuFile = menuBar()->addMenu(tr("&File"));
     2703  _menuFile->addAction(_actFontSel);
     2704  _menuFile->addSeparator();
     2705  _menuFile->addAction(_actSaveOpt);
     2706  _menuFile->addSeparator();
     2707  _menuFile->addAction(_actQuit);
     2708
     2709  _menuHlp = menuBar()->addMenu(tr("&Help"));
     2710  _menuHlp->addAction(_actHelp);
     2711  _menuHlp->addAction(_actFlowchart);
     2712  _menuHlp->addAction(_actAbout);
    26942713}
    26952714
     
    26972716////////////////////////////////////////////////////////////////////////////
    26982717void bncWindow::AddToolbar() {
    2699     QToolBar* toolBar = new QToolBar;
    2700     addToolBar(Qt::BottomToolBarArea, toolBar);
    2701     toolBar->setMovable(false);
    2702     toolBar->addAction(_actAddMountPoints);
    2703     toolBar->addAction(_actDeleteMountPoints);
    2704     toolBar->addAction(_actMapMountPoints);
    2705     toolBar->addAction(_actStart);
    2706     toolBar->addAction(_actStop);
    2707     toolBar->addWidget(new QLabel("                                           "));
    2708     toolBar->addAction(_actwhatsthis);
     2718  QToolBar* toolBar = new QToolBar;
     2719  addToolBar(Qt::BottomToolBarArea, toolBar);
     2720  toolBar->setMovable(false);
     2721  toolBar->addAction(_actAddMountPoints);
     2722  toolBar->addAction(_actDeleteMountPoints);
     2723  toolBar->addAction(_actMapMountPoints);
     2724  toolBar->addAction(_actStart);
     2725  toolBar->addAction(_actStop);
     2726  toolBar->addWidget(new QLabel("                                           "));
     2727  toolBar->addAction(_actwhatsthis);
    27092728}
    27102729
     
    27122731////////////////////////////////////////////////////////////////////////////
    27132732bncAboutDlg::bncAboutDlg(QWidget* parent) :
    2714     QDialog(parent) {
    2715 
    2716     QTextBrowser* tb = new QTextBrowser;
    2717     QUrl url = QUrl::fromLocalFile(":/bncabout.html");
    2718     tb->setSource(url);
    2719     tb->setReadOnly(true);
    2720 
    2721     int ww = QFontMetrics(font()).horizontalAdvance('w');
    2722     QPushButton* _closeButton = new QPushButton("Close");
    2723     _closeButton->setMaximumWidth(10 * ww);
    2724     connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
    2725 
    2726     QGridLayout* dlgLayout = new QGridLayout();
    2727     QLabel* img = new QLabel();
    2728     img->setPixmap(QPixmap(":ntrip-logo.png"));
    2729     dlgLayout->addWidget(img, 0, 0);
    2730     dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0, 1);
    2731     dlgLayout->addWidget(tb, 1, 0, 1, 2);
    2732     dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
    2733 
    2734     setLayout(dlgLayout);
    2735     resize(60 * ww, 60 * ww);
    2736     setWindowTitle("About BNC");
    2737     show();
     2733  QDialog(parent) {
     2734
     2735  QTextBrowser* tb = new QTextBrowser;
     2736  QUrl url = QUrl::fromLocalFile(":/bncabout.html");
     2737  tb->setSource(url);
     2738  tb->setReadOnly(true);
     2739
     2740  int ww = QFontMetrics(font()).horizontalAdvance('w');
     2741  QPushButton* _closeButton = new QPushButton("Close");
     2742  _closeButton->setMaximumWidth(10 * ww);
     2743  connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
     2744
     2745  QGridLayout* dlgLayout = new QGridLayout();
     2746  QLabel* img = new QLabel();
     2747  img->setPixmap(QPixmap(":ntrip-logo.png"));
     2748  dlgLayout->addWidget(img, 0, 0);
     2749  dlgLayout->addWidget(new QLabel("BKG Ntrip Client (BNC) Version " BNCVERSION), 0, 1);
     2750  dlgLayout->addWidget(tb, 1, 0, 1, 2);
     2751  dlgLayout->addWidget(_closeButton, 2, 1, Qt::AlignRight);
     2752
     2753  setLayout(dlgLayout);
     2754  resize(60 * ww, 60 * ww);
     2755  setWindowTitle("About BNC");
     2756  show();
    27382757}
    27392758
     
    27472766////////////////////////////////////////////////////////////////////////////
    27482767bncFlowchartDlg::bncFlowchartDlg(QWidget* parent) :
    2749     QDialog(parent) {
    2750 
    2751     int ww = QFontMetrics(font()).horizontalAdvance('w');
    2752     QPushButton* _closeButton = new QPushButton("Close");
    2753     _closeButton->setMaximumWidth(10 * ww);
    2754     connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
    2755 
    2756     QGridLayout* dlgLayout = new QGridLayout();
    2757     QLabel* img = new QLabel();
    2758     img->setPixmap(QPixmap(":bncflowchart.png"));
    2759     dlgLayout->addWidget(img, 0, 0);
    2760     dlgLayout->addWidget(_closeButton, 1, 0, Qt::AlignLeft);
    2761 
    2762     setLayout(dlgLayout);
    2763     setWindowTitle("Flow Chart");
    2764     show();
     2768  QDialog(parent) {
     2769
     2770  int ww = QFontMetrics(font()).horizontalAdvance('w');
     2771  QPushButton* _closeButton = new QPushButton("Close");
     2772  _closeButton->setMaximumWidth(10 * ww);
     2773  connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
     2774
     2775  QGridLayout* dlgLayout = new QGridLayout();
     2776  QLabel* img = new QLabel();
     2777  img->setPixmap(QPixmap(":bncflowchart.png"));
     2778  dlgLayout->addWidget(img, 0, 0);
     2779  dlgLayout->addWidget(_closeButton, 1, 0, Qt::AlignLeft);
     2780
     2781  setLayout(dlgLayout);
     2782  setWindowTitle("Flow Chart");
     2783  show();
    27652784}
    27662785
     
    27742793void bncWindow::enableWidget(bool enable, QWidget* widget) {
    27752794
    2776     const static QPalette paletteWhite(QColor(255, 255, 255));
    2777     const static QPalette paletteGray(QColor(230, 230, 230));
    2778 
    2779     widget->setEnabled(enable);
    2780     if (enable) {
    2781         widget->setPalette(paletteWhite);
     2795  const static QPalette paletteWhite(QColor(255, 255, 255));
     2796  const static QPalette paletteGray(QColor(230, 230, 230));
     2797
     2798  widget->setEnabled(enable);
     2799  if (enable) {
     2800    widget->setPalette(paletteWhite);
     2801  }
     2802  else {
     2803    widget->setPalette(paletteGray);
     2804  }
     2805}
     2806
     2807//  Bnc Text
     2808////////////////////////////////////////////////////////////////////////////
     2809void bncWindow::slotBncTextChanged() {
     2810
     2811  const static QPalette paletteWhite(QColor(255, 255, 255));
     2812  const static QPalette paletteGray(QColor(230, 230, 230));
     2813
     2814  bool enable = true;
     2815
     2816  // Proxy
     2817  //------
     2818  if (sender() == 0 || sender() == _proxyHostLineEdit) {
     2819    enable = !_proxyHostLineEdit->text().isEmpty();
     2820    enableWidget(enable, _proxyPortLineEdit);
     2821  }
     2822
     2823  // RINEX Observations
     2824  // ------------------
     2825  if (sender() == 0 || sender() == _rnxPathLineEdit) {
     2826    enable = !_rnxPathLineEdit->text().isEmpty();
     2827    enableWidget(enable, _rnxIntrComboBox);
     2828    enableWidget(enable, _rnxSamplComboBox);
     2829    enableWidget(enable, _rnxSkelExtComboBox);
     2830    enableWidget(enable, _rnxSkelPathLineEdit);
     2831    enableWidget(enable, _rnxFileCheckBox);
     2832    enableWidget(enable, _rnxScrpLineEdit);
     2833    enableWidget(enable, _rnxV2Priority);
     2834    enableWidget(enable, _rnxVersComboBox);
     2835
     2836    bool enable1 = true;
     2837    enable1 = _rnxVersComboBox->currentText() == "2";
     2838    if (enable && enable1) {
     2839      enableWidget(true, _rnxV2Priority);
     2840    }
     2841    if (enable && !enable1) {
     2842      enableWidget(false, _rnxV2Priority);
     2843    }
     2844  }
     2845
     2846  // RINEX Observations, Signal Priority
     2847  // -----------------------------------
     2848  if (sender() == 0 || sender() == _rnxVersComboBox) {
     2849    if (!_rnxPathLineEdit->text().isEmpty()) {
     2850      enableWidget(enable, _rnxIntrComboBox);
     2851      enable = _rnxVersComboBox->currentText() == "2";
     2852      enableWidget(enable, _rnxV2Priority);
     2853    }
     2854  }
     2855
     2856  // RINEX Ephemeris
     2857  // ---------------
     2858  if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
     2859    enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
     2860    enableWidget(enable, _ephIntrComboBox);
     2861    enableWidget(enable, _ephVersComboBox);
     2862    //enableWidget(enable, _ephVersComboBox);
     2863    //enableWidget(enable, _ephFilePerStation);
     2864  }
     2865
     2866  // Broadcast Corrections
     2867  // ---------------------
     2868  if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
     2869    enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
     2870    enableWidget(enable, _corrIntrComboBox);
     2871  }
     2872
     2873  // Feed Engine
     2874  // -----------
     2875  if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
     2876    enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
     2877    enableWidget(enable, _outWaitSpinBox);
     2878    enableWidget(enable, _outSamplComboBox);
     2879  }
     2880
     2881  // Serial Output
     2882  // -------------
     2883  if (sender() == 0 ||
     2884      sender() == _serialMountPointLineEdit ||
     2885      sender() == _serialAutoNMEAComboBox) {
     2886    enable = !_serialMountPointLineEdit->text().isEmpty();
     2887    enableWidget(enable, _serialPortNameLineEdit);
     2888    enableWidget(enable, _serialBaudRateComboBox);
     2889    enableWidget(enable, _serialParityComboBox);
     2890    enableWidget(enable, _serialDataBitsComboBox);
     2891    enableWidget(enable, _serialStopBitsComboBox);
     2892    enableWidget(enable, _serialFlowControlComboBox);
     2893    enableWidget(enable, _serialAutoNMEAComboBox);
     2894    if (enable && _serialAutoNMEAComboBox->currentText() == "Auto") {
     2895      enableWidget(true, _serialFileNMEALineEdit);
     2896      enableWidget(false, _serialHeightNMEALineEdit);
     2897      enableWidget(true, _serialNMEASamplingSpinBox);
     2898    }
     2899    else if (enable && _serialAutoNMEAComboBox->currentText().contains("Manual")) {
     2900      enableWidget(false, _serialFileNMEALineEdit);
     2901      enableWidget(true, _serialHeightNMEALineEdit);
     2902      enableWidget(true, _serialNMEASamplingSpinBox);
    27822903    }
    27832904    else {
    2784         widget->setPalette(paletteGray);
    2785     }
    2786 }
    2787 
    2788 //  Bnc Text
    2789 ////////////////////////////////////////////////////////////////////////////
    2790 void bncWindow::slotBncTextChanged() {
    2791 
    2792     const static QPalette paletteWhite(QColor(255, 255, 255));
    2793     const static QPalette paletteGray(QColor(230, 230, 230));
    2794 
    2795     bool enable = true;
    2796 
    2797     // Proxy
    2798     //------
    2799     if (sender() == 0 || sender() == _proxyHostLineEdit) {
    2800         enable = !_proxyHostLineEdit->text().isEmpty();
    2801         enableWidget(enable, _proxyPortLineEdit);
    2802     }
    2803 
    2804     // RINEX Observations
    2805     // ------------------
    2806     if (sender() == 0 || sender() == _rnxPathLineEdit) {
    2807         enable = !_rnxPathLineEdit->text().isEmpty();
    2808         enableWidget(enable, _rnxIntrComboBox);
    2809         enableWidget(enable, _rnxSamplComboBox);
    2810         enableWidget(enable, _rnxSkelExtComboBox);
    2811         enableWidget(enable, _rnxSkelPathLineEdit);
    2812         enableWidget(enable, _rnxFileCheckBox);
    2813         enableWidget(enable, _rnxScrpLineEdit);
    2814         enableWidget(enable, _rnxV2Priority);
    2815         enableWidget(enable, _rnxVersComboBox);
    2816 
    2817         bool enable1 = true;
    2818         enable1 = _rnxVersComboBox->currentText() == "2";
    2819         if (enable && enable1) {
    2820             enableWidget(true, _rnxV2Priority);
     2905      enableWidget(false, _serialFileNMEALineEdit);
     2906      enableWidget(false, _serialHeightNMEALineEdit);
     2907      enableWidget(false, _serialNMEASamplingSpinBox);
     2908    }
     2909  }
     2910
     2911  // Outages
     2912  // -------
     2913  if (sender() == 0 || sender() == _adviseObsRateComboBox) {
     2914    enable = !_adviseObsRateComboBox->currentText().isEmpty();
     2915    enableWidget(enable, _adviseFailSpinBox);
     2916    enableWidget(enable, _adviseRecoSpinBox);
     2917    enableWidget(enable, _adviseScriptLineEdit);
     2918  }
     2919
     2920  // Miscellaneous
     2921  // -------------
     2922  if (sender() == 0 || sender() == _miscMountLineEdit) {
     2923    enable = !_miscMountLineEdit->text().isEmpty();
     2924    enableWidget(enable, _miscIntrComboBox);
     2925    enableWidget(enable, _miscScanRTCMCheckBox);
     2926    enableWidget(enable, _miscPortLineEdit);
     2927  }
     2928
     2929  // Combine Corrections
     2930  // -------------------
     2931  if (sender() == 0 || sender() == _cmbTable) {
     2932    int iRow = _cmbTable->rowCount();
     2933    if (iRow > 0) {
     2934      enableWidget(true, _cmbMethodComboBox);
     2935      enableWidget(true, _cmbMaxresLineEdit);
     2936      enableWidget(true, _cmbMaxdisplacementLineEdit);
     2937      enableWidget(true, _cmbSamplComboBox);
     2938      enableWidget(true, _cmbLogPath);
     2939      enableWidget(true, _cmbGpsCheckBox);
     2940      enableWidget(true, _cmbGloCheckBox);
     2941      enableWidget(true, _cmbGalCheckBox);
     2942      enableWidget(true, _cmbBdsCheckBox);
     2943      enableWidget(true, _cmbQzssCheckBox);
     2944      enableWidget(true, _cmbSbasCheckBox);
     2945      enableWidget(true, _cmbNavicCheckBox);
     2946      enableWidget(true, _cmbBsxFile);
     2947    }
     2948    else {
     2949      enableWidget(false, _cmbMethodComboBox);
     2950      enableWidget(false, _cmbMaxresLineEdit);
     2951      enableWidget(false, _cmbMaxdisplacementLineEdit);
     2952      enableWidget(false, _cmbSamplComboBox);
     2953      enableWidget(false, _cmbLogPath);
     2954      enableWidget(false, _cmbGpsCheckBox);
     2955      enableWidget(false, _cmbGloCheckBox);
     2956      enableWidget(false, _cmbGalCheckBox);
     2957      enableWidget(false, _cmbBdsCheckBox);
     2958      enableWidget(false, _cmbQzssCheckBox);
     2959      enableWidget(false, _cmbSbasCheckBox);
     2960      enableWidget(false, _cmbNavicCheckBox);
     2961      enableWidget(false, _cmbBsxFile);
     2962    }
     2963  }
     2964
     2965  // Upload(clk)
     2966  // -----------
     2967  int iRow = _uploadTable->rowCount();
     2968  if (iRow > 0) {
     2969    enableWidget(true, _uploadIntrComboBox);
     2970    enableWidget(true, _uploadSamplRtcmEphCorrComboBox);
     2971    enableWidget(true, _uploadSamplClkRnxSpinBox);
     2972    enableWidget(true, _uploadSamplBiaSnxSpinBox);
     2973    enableWidget(true, _uploadSamplSp3ComboBox);
     2974    enableWidget(true, _uploadAntexFile);
     2975  }
     2976  else {
     2977    enableWidget(false, _uploadIntrComboBox);
     2978    enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
     2979    enableWidget(false, _uploadSamplClkRnxSpinBox);
     2980    enableWidget(false, _uploadSamplBiaSnxSpinBox);
     2981    enableWidget(false, _uploadSamplSp3ComboBox);
     2982    enableWidget(false, _uploadAntexFile);
     2983  }
     2984
     2985  // Upload(eph)
     2986  // -----------
     2987  iRow = _uploadEphTable->rowCount();
     2988  if (iRow > 0) {
     2989    enableWidget(true, _uploadSamplRtcmEphSpinBox);
     2990  }
     2991  else {
     2992    enableWidget(false, _uploadSamplRtcmEphSpinBox);
     2993  }
     2994
     2995  // QC
     2996  // --
     2997  if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
     2998    enable = !_reqcActionComboBox->currentText().isEmpty();
     2999    bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
     3000    //  bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
     3001    enableWidget(enable, _reqcObsFileChooser);
     3002    enableWidget(enable, _reqcNavFileChooser);
     3003    enableWidget(enable, _reqcOutLogLineEdit);
     3004    enableWidget(enable && enable10, _reqcEditOptionButton);
     3005    enableWidget(enable && enable10, _reqcOutObsLineEdit);
     3006    enableWidget(enable && enable10, _reqcOutNavLineEdit);
     3007    enableWidget(enable && !enable10, _reqcLogSummaryOnly);
     3008    enableWidget(enable && !enable10, _reqcSkyPlotSignals);
     3009    //  enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
     3010    enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
     3011  }
     3012
     3013  // SP3 File Comparison
     3014  // -------------------
     3015  if (sender() == 0 || sender() == _sp3CompFileChooser) {
     3016    enable = !_sp3CompFileChooser->fileName().isEmpty();
     3017    enableWidget(enable, _sp3CompLogLineEdit);
     3018    enableWidget(enable, _sp3CompExclude);
     3019    enableWidget(enable, _sp3CompSummaryOnly);
     3020  }
     3021
     3022  enableStartStop();
     3023}
     3024
     3025//
     3026////////////////////////////////////////////////////////////////////////////
     3027void bncWindow::slotAddCmbRow() {
     3028  int iRow = _cmbTable->rowCount();
     3029  _cmbTable->insertRow(iRow);
     3030  for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
     3031    _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
     3032  }
     3033}
     3034
     3035//
     3036////////////////////////////////////////////////////////////////////////////
     3037void bncWindow::slotDelCmbRow() {
     3038
     3039  const static QPalette paletteWhite(QColor(255, 255, 255));
     3040  const static QPalette paletteGray(QColor(230, 230, 230));
     3041
     3042  int nRows = _cmbTable->rowCount();
     3043  std::vector <bool> flg(nRows);
     3044  for (int iRow = 0; iRow < nRows; iRow++) {
     3045    if (_cmbTable->item(iRow, 1)->isSelected()) {
     3046      flg[iRow] = true;
     3047    }
     3048    else {
     3049      flg[iRow] = false;
     3050    }
     3051  }
     3052  for (int iRow = nRows - 1; iRow >= 0; iRow--) {
     3053    if (flg[iRow]) {
     3054      _cmbTable->removeRow(iRow);
     3055    }
     3056  }
     3057  nRows = _cmbTable->rowCount();
     3058  if (nRows < 1) {
     3059    enableWidget(false, _cmbMethodComboBox);
     3060    enableWidget(false, _cmbMaxresLineEdit);
     3061    enableWidget(false, _cmbMaxdisplacementLineEdit);
     3062    enableWidget(false, _cmbSamplComboBox);
     3063    enableWidget(false, _cmbLogPath);
     3064  }
     3065}
     3066
     3067//
     3068////////////////////////////////////////////////////////////////////////////
     3069void bncWindow::populateCmbTable() {
     3070
     3071  for (int iRow = _cmbTable->rowCount() - 1; iRow >= 0; iRow--) {
     3072    _cmbTable->removeRow(iRow);
     3073  }
     3074
     3075  bncSettings settings;
     3076
     3077  int iRow = -1;
     3078  QListIterator<QString> it(settings.value("cmbStreams").toStringList());
     3079  while (it.hasNext()) {
     3080    QStringList hlp = it.next().split(" ");
     3081    if (hlp.size() > 2) {
     3082      ++iRow;
     3083      _cmbTable->insertRow(iRow);
     3084    }
     3085    for (int iCol = 0; iCol < hlp.size(); iCol++) {
     3086      _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
     3087    }
     3088  }
     3089}
     3090
     3091//
     3092////////////////////////////////////////////////////////////////////////////
     3093void bncWindow::slotAddUploadRow() {
     3094  int iRow = _uploadTable->rowCount();
     3095  _uploadTable->insertRow(iRow);
     3096  for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
     3097    if (iCol == 3) {
     3098      QComboBox* ntripversion = new QComboBox();
     3099      ntripversion->setEditable(false);
     3100      ntripversion->addItems(QString("2s,2,1").split(","));
     3101      ntripversion->setFrame(false);
     3102      _uploadTable->setCellWidget(iRow, iCol, ntripversion);
     3103
     3104    }
     3105    else if (iCol == 4) {
     3106      QLineEdit* user = new QLineEdit();
     3107      user->setFrame(false);
     3108      _uploadTable->setCellWidget(iRow, iCol, user);
     3109    }
     3110    else if (iCol == 5) {
     3111      QLineEdit* passwd = new QLineEdit();
     3112      passwd->setFrame(false);
     3113      passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3114      _uploadTable->setCellWidget(iRow, iCol, passwd);
     3115    }
     3116    else if (iCol == 6) {
     3117      QComboBox* system = new QComboBox();
     3118      system->setEditable(false);
     3119      system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
     3120      system->setFrame(false);
     3121      _uploadTable->setCellWidget(iRow, iCol, system);
     3122    }
     3123    else if (iCol == 7) {
     3124      QComboBox* format = new QComboBox();
     3125      format->setEditable(false);
     3126      //format->addItems(QString("IGS-SSR,RTCM-SSR,RTCM-NEW-SSR").split(","));
     3127      format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
     3128      format->setFrame(false);
     3129      _uploadTable->setCellWidget(iRow, iCol, format);
     3130    }
     3131    else if (iCol == 8) {
     3132      QCheckBox* com = new QCheckBox();
     3133      _uploadTable->setCellWidget(iRow, iCol, com);
     3134    }
     3135    else if (iCol == 15) {
     3136      bncTableItem* bncIt = new bncTableItem();
     3137      bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3138      _uploadTable->setItem(iRow, iCol, bncIt);
     3139      BNC_CORE->_uploadTableItems[iRow] = bncIt;
     3140    }
     3141    else {
     3142      _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
     3143    }
     3144  }
     3145}
     3146
     3147//
     3148////////////////////////////////////////////////////////////////////////////
     3149void bncWindow::slotDelUploadRow() {
     3150  BNC_CORE->_uploadTableItems.clear();
     3151  int nRows = _uploadTable->rowCount();
     3152  std::vector <bool> flg(nRows);
     3153  for (int iRow = 0; iRow < nRows; iRow++) {
     3154    if (_uploadTable->item(iRow, 1)->isSelected()) {
     3155      flg[iRow] = true;
     3156    }
     3157    else {
     3158      flg[iRow] = false;
     3159    }
     3160  }
     3161  for (int iRow = nRows - 1; iRow >= 0; iRow--) {
     3162    if (flg[iRow]) {
     3163      _uploadTable->removeRow(iRow);
     3164    }
     3165  }
     3166  for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
     3167    BNC_CORE->_uploadTableItems[iRow] =
     3168      (bncTableItem*)_uploadTable->item(iRow, 14);
     3169  }
     3170  nRows = _uploadTable->rowCount();
     3171  if (nRows < 1) {
     3172    enableWidget(false, _uploadIntrComboBox);
     3173    enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
     3174    enableWidget(false, _uploadSamplSp3ComboBox);
     3175    enableWidget(false, _uploadSamplClkRnxSpinBox);
     3176    enableWidget(false, _uploadAntexFile);
     3177  }
     3178}
     3179
     3180//
     3181////////////////////////////////////////////////////////////////////////////
     3182void bncWindow::populateUploadTable() {
     3183  for (int iRow = _uploadTable->rowCount() - 1; iRow >= 0; iRow--) {
     3184    _uploadTable->removeRow(iRow);
     3185  }
     3186
     3187  bncSettings settings;
     3188
     3189  int iRow = -1;
     3190  QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
     3191
     3192  while (it.hasNext()) {
     3193    QStringList hlp = it.next().split(",");
     3194    if (hlp.size() > 6) {
     3195      ++iRow;
     3196      _uploadTable->insertRow(iRow);
     3197    }
     3198    for (int iCol = 0; iCol < hlp.size(); iCol++) {
     3199      if (iCol == 3) {
     3200        QComboBox* ntripversion = new QComboBox();
     3201        ntripversion->setEditable(false);
     3202        ntripversion->addItems(QString("1,2,2s").split(","));
     3203        ntripversion->setFrame(false);
     3204        ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
     3205        _uploadTable->setCellWidget(iRow, iCol, ntripversion);
     3206      }
     3207      else if (iCol == 4) {
     3208        QLineEdit* user = new QLineEdit();
     3209        user->setFrame(false);
     3210        user->setText(hlp[iCol]);
     3211        _uploadTable->setCellWidget(iRow, iCol, user);
     3212      }
     3213      else if (iCol == 5) {
     3214        QLineEdit* passwd = new QLineEdit();
     3215        passwd->setFrame(false);
     3216        passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3217        passwd->setText(hlp[iCol]);
     3218        _uploadTable->setCellWidget(iRow, iCol, passwd);
     3219      }
     3220      else if (iCol == 6) {
     3221        QComboBox* system = new QComboBox();
     3222        system->setEditable(false);
     3223        system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
     3224        system->setFrame(false);
     3225        system->setCurrentIndex(system->findText(hlp[iCol]));
     3226        _uploadTable->setCellWidget(iRow, iCol, system);
     3227      }
     3228      else if (iCol == 7) {
     3229        QComboBox* format = new QComboBox();
     3230        format->setEditable(false);
     3231        //format->addItems(QString("IGS-SSR,RTCM-SSR,RTCM-NEW-SSR").split(","));
     3232        format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
     3233        format->setFrame(false);
     3234        format->setCurrentIndex(format->findText(hlp[iCol]));
     3235        _uploadTable->setCellWidget(iRow, iCol, format);
     3236      }
     3237      else if (iCol == 8) {
     3238        QCheckBox* com = new QCheckBox();
     3239        if (hlp[iCol].toInt() == Qt::Checked) {
     3240          com->setCheckState(Qt::Checked);
    28213241        }
    2822         if (enable && !enable1) {
    2823             enableWidget(false, _rnxV2Priority);
    2824         }
    2825     }
    2826 
    2827     // RINEX Observations, Signal Priority
    2828     // -----------------------------------
    2829     if (sender() == 0 || sender() == _rnxVersComboBox) {
    2830         if (!_rnxPathLineEdit->text().isEmpty()) {
    2831             enableWidget(enable, _rnxIntrComboBox);
    2832             enable = _rnxVersComboBox->currentText() == "2";
    2833             enableWidget(enable, _rnxV2Priority);
    2834         }
    2835     }
    2836 
    2837     // RINEX Ephemeris
    2838     // ---------------
    2839     if (sender() == 0 || sender() == _ephPathLineEdit || sender() == _ephOutPortLineEdit) {
    2840         enable = !_ephPathLineEdit->text().isEmpty() || !_ephOutPortLineEdit->text().isEmpty();
    2841         enableWidget(enable, _ephIntrComboBox);
    2842         enableWidget(enable, _ephVersComboBox);
    2843         //enableWidget(enable, _ephVersComboBox);
    2844         //enableWidget(enable, _ephFilePerStation);
    2845     }
    2846 
    2847     // Broadcast Corrections
    2848     // ---------------------
    2849     if (sender() == 0 || sender() == _corrPathLineEdit || sender() == _corrPortLineEdit) {
    2850         enable = !_corrPathLineEdit->text().isEmpty() || !_corrPortLineEdit->text().isEmpty();
    2851         enableWidget(enable, _corrIntrComboBox);
    2852     }
    2853 
    2854     // Feed Engine
    2855     // -----------
    2856     if (sender() == 0 || sender() == _outPortLineEdit || sender() == _outFileLineEdit) {
    2857         enable = !_outPortLineEdit->text().isEmpty() || !_outFileLineEdit->text().isEmpty();
    2858         enableWidget(enable, _outWaitSpinBox);
    2859         enableWidget(enable, _outSamplComboBox);
    2860     }
    2861 
    2862     // Serial Output
    2863     // -------------
    2864     if (sender() == 0 ||
    2865         sender() == _serialMountPointLineEdit ||
    2866         sender() == _serialAutoNMEAComboBox) {
    2867         enable = !_serialMountPointLineEdit->text().isEmpty();
    2868         enableWidget(enable, _serialPortNameLineEdit);
    2869         enableWidget(enable, _serialBaudRateComboBox);
    2870         enableWidget(enable, _serialParityComboBox);
    2871         enableWidget(enable, _serialDataBitsComboBox);
    2872         enableWidget(enable, _serialStopBitsComboBox);
    2873         enableWidget(enable, _serialFlowControlComboBox);
    2874         enableWidget(enable, _serialAutoNMEAComboBox);
    2875         if (enable && _serialAutoNMEAComboBox->currentText() == "Auto") {
    2876             enableWidget(true, _serialFileNMEALineEdit);
    2877             enableWidget(false, _serialHeightNMEALineEdit);
    2878             enableWidget(true, _serialNMEASamplingSpinBox);
    2879         }
    2880         else if (enable && _serialAutoNMEAComboBox->currentText().contains("Manual")) {
    2881             enableWidget(false, _serialFileNMEALineEdit);
    2882             enableWidget(true, _serialHeightNMEALineEdit);
    2883             enableWidget(true, _serialNMEASamplingSpinBox);
    2884         }
    2885         else {
    2886             enableWidget(false, _serialFileNMEALineEdit);
    2887             enableWidget(false, _serialHeightNMEALineEdit);
    2888             enableWidget(false, _serialNMEASamplingSpinBox);
    2889         }
    2890     }
    2891 
    2892     // Outages
    2893     // -------
    2894     if (sender() == 0 || sender() == _adviseObsRateComboBox) {
    2895         enable = !_adviseObsRateComboBox->currentText().isEmpty();
    2896         enableWidget(enable, _adviseFailSpinBox);
    2897         enableWidget(enable, _adviseRecoSpinBox);
    2898         enableWidget(enable, _adviseScriptLineEdit);
    2899     }
    2900 
    2901     // Miscellaneous
    2902     // -------------
    2903     if (sender() == 0 || sender() == _miscMountLineEdit) {
    2904         enable = !_miscMountLineEdit->text().isEmpty();
    2905         enableWidget(enable, _miscIntrComboBox);
    2906         enableWidget(enable, _miscScanRTCMCheckBox);
    2907         enableWidget(enable, _miscPortLineEdit);
    2908     }
    2909 
    2910     // Combine Corrections
    2911     // -------------------
    2912     if (sender() == 0 || sender() == _cmbTable) {
    2913         int iRow = _cmbTable->rowCount();
    2914         if (iRow > 0) {
    2915             enableWidget(true, _cmbMethodComboBox);
    2916             enableWidget(true, _cmbMaxresLineEdit);
    2917             enableWidget(true, _cmbMaxdisplacementLineEdit);
    2918             enableWidget(true, _cmbSamplComboBox);
    2919             enableWidget(true, _cmbLogPath);
    2920             enableWidget(true, _cmbGpsCheckBox);
    2921             enableWidget(true, _cmbGloCheckBox);
    2922             enableWidget(true, _cmbGalCheckBox);
    2923             enableWidget(true, _cmbBdsCheckBox);
    2924             enableWidget(true, _cmbQzssCheckBox);
    2925             enableWidget(true, _cmbSbasCheckBox);
    2926             enableWidget(true, _cmbNavicCheckBox);
    2927             enableWidget(true, _cmbBsxFile);
    2928         }
    2929         else {
    2930             enableWidget(false, _cmbMethodComboBox);
    2931             enableWidget(false, _cmbMaxresLineEdit);
    2932             enableWidget(false, _cmbMaxdisplacementLineEdit);
    2933             enableWidget(false, _cmbSamplComboBox);
    2934             enableWidget(false, _cmbLogPath);
    2935             enableWidget(false, _cmbGpsCheckBox);
    2936             enableWidget(false, _cmbGloCheckBox);
    2937             enableWidget(false, _cmbGalCheckBox);
    2938             enableWidget(false, _cmbBdsCheckBox);
    2939             enableWidget(false, _cmbQzssCheckBox);
    2940             enableWidget(false, _cmbSbasCheckBox);
    2941             enableWidget(false, _cmbNavicCheckBox);
    2942             enableWidget(false, _cmbBsxFile);
    2943         }
    2944     }
    2945 
    2946     // Upload(clk)
    2947     // -----------
    2948     int iRow = _uploadTable->rowCount();
    2949     if (iRow > 0) {
    2950         enableWidget(true, _uploadIntrComboBox);
    2951         enableWidget(true, _uploadSamplRtcmEphCorrComboBox);
    2952         enableWidget(true, _uploadSamplClkRnxSpinBox);
    2953         enableWidget(true, _uploadSamplBiaSnxSpinBox);
    2954         enableWidget(true, _uploadSamplSp3ComboBox);
    2955         enableWidget(true, _uploadAntexFile);
     3242        _uploadTable->setCellWidget(iRow, iCol, com);
     3243      }
     3244      else if (iCol == 15) {
     3245        bncTableItem* bncIt = new bncTableItem();
     3246        bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3247        _uploadTable->setItem(iRow, iCol, bncIt);
     3248        BNC_CORE->_uploadTableItems[iRow] = bncIt;
     3249      }
     3250      else {
     3251        _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
     3252      }
     3253    }
     3254  }
     3255}
     3256
     3257//
     3258////////////////////////////////////////////////////////////////////////////
     3259void bncWindow::slotSetUploadTrafo() {
     3260  bncCustomTrafo* dlg = new bncCustomTrafo(this);
     3261  dlg->exec();
     3262  delete dlg;
     3263}
     3264
     3265//
     3266////////////////////////////////////////////////////////////////////////////
     3267void bncWindow::slotAddUploadEphRow() {
     3268  int iRow = _uploadEphTable->rowCount();
     3269  _uploadEphTable->insertRow(iRow);
     3270  for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
     3271    if (iCol == 3) {
     3272      QComboBox* ntripversion = new QComboBox();
     3273      ntripversion->setEditable(false);
     3274      ntripversion->addItems(QString("2s,2,1").split(","));
     3275      ntripversion->setFrame(false);
     3276      _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
     3277
     3278    }
     3279    else if (iCol == 4) {
     3280      QLineEdit* user = new QLineEdit();
     3281      user->setFrame(false);
     3282      _uploadEphTable->setCellWidget(iRow, iCol, user);
     3283    }
     3284    else if (iCol == 5) {
     3285      QLineEdit* passwd = new QLineEdit();
     3286      passwd->setFrame(false);
     3287      passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3288      _uploadEphTable->setCellWidget(iRow, iCol, passwd);
     3289    }
     3290    else if (iCol == 6) {
     3291      QLineEdit* system = new QLineEdit("GREC");
     3292      system->setFrame(false);
     3293      _uploadEphTable->setCellWidget(iRow, iCol, system);
     3294    }
     3295    else if (iCol == 7) {
     3296      bncTableItem* bncIt = new bncTableItem();
     3297      bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3298      _uploadEphTable->setItem(iRow, iCol, bncIt);
     3299      BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
    29563300    }
    29573301    else {
    2958         enableWidget(false, _uploadIntrComboBox);
    2959         enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
    2960         enableWidget(false, _uploadSamplClkRnxSpinBox);
    2961         enableWidget(false, _uploadSamplBiaSnxSpinBox);
    2962         enableWidget(false, _uploadSamplSp3ComboBox);
    2963         enableWidget(false, _uploadAntexFile);
    2964     }
    2965 
    2966     // Upload(eph)
    2967     // -----------
    2968     iRow = _uploadEphTable->rowCount();
    2969     if (iRow > 0) {
    2970         enableWidget(true, _uploadSamplRtcmEphSpinBox);
     3302      _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
     3303    }
     3304  }
     3305}
     3306
     3307//
     3308////////////////////////////////////////////////////////////////////////////
     3309void bncWindow::slotDelUploadEphRow() {
     3310  BNC_CORE->_uploadEphTableItems.clear();
     3311  int nRows = _uploadEphTable->rowCount();
     3312  std::vector <bool> flg(nRows);
     3313  for (int iRow = 0; iRow < nRows; iRow++) {
     3314    if (_uploadEphTable->item(iRow, 1)->isSelected()) {
     3315      flg[iRow] = true;
    29713316    }
    29723317    else {
    2973         enableWidget(false, _uploadSamplRtcmEphSpinBox);
    2974     }
    2975 
    2976     // QC
    2977     // --
    2978     if (sender() == 0 || sender() == _reqcActionComboBox || sender() == _reqcSkyPlotSignals) {
    2979         enable = !_reqcActionComboBox->currentText().isEmpty();
    2980         bool enable10 = _reqcActionComboBox->currentText() == "Edit/Concatenate";
    2981         //  bool enablePlot = !_reqcSkyPlotSignals->text().isEmpty();
    2982         enableWidget(enable, _reqcObsFileChooser);
    2983         enableWidget(enable, _reqcNavFileChooser);
    2984         enableWidget(enable, _reqcOutLogLineEdit);
    2985         enableWidget(enable && enable10, _reqcEditOptionButton);
    2986         enableWidget(enable && enable10, _reqcOutObsLineEdit);
    2987         enableWidget(enable && enable10, _reqcOutNavLineEdit);
    2988         enableWidget(enable && !enable10, _reqcLogSummaryOnly);
    2989         enableWidget(enable && !enable10, _reqcSkyPlotSignals);
    2990         //  enableWidget(enable && !enable10 && enablePlot, _reqcPlotDirLineEdit);
    2991         enableWidget(enable && !enable10, _reqcPlotDirLineEdit);
    2992     }
    2993 
    2994     // SP3 File Comparison
    2995     // -------------------
    2996     if (sender() == 0 || sender() == _sp3CompFileChooser) {
    2997         enable = !_sp3CompFileChooser->fileName().isEmpty();
    2998         enableWidget(enable, _sp3CompLogLineEdit);
    2999         enableWidget(enable, _sp3CompExclude);
    3000         enableWidget(enable, _sp3CompSummaryOnly);
    3001     }
    3002 
    3003     enableStartStop();
     3318      flg[iRow] = false;
     3319    }
     3320  }
     3321  for (int iRow = nRows - 1; iRow >= 0; iRow--) {
     3322    if (flg[iRow]) {
     3323      _uploadEphTable->removeRow(iRow);
     3324    }
     3325  }
     3326  for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
     3327    BNC_CORE->_uploadEphTableItems[iRow] =
     3328      (bncTableItem*)_uploadEphTable->item(iRow, 7);
     3329  }
     3330  nRows = _uploadEphTable->rowCount();
     3331  if (nRows < 1) {
     3332    enableWidget(false, _uploadSamplRtcmEphSpinBox);
     3333  }
    30043334}
    30053335
    30063336//
    30073337////////////////////////////////////////////////////////////////////////////
    3008 void bncWindow::slotAddCmbRow() {
    3009     int iRow = _cmbTable->rowCount();
    3010     _cmbTable->insertRow(iRow);
    3011     for (int iCol = 0; iCol < _cmbTable->columnCount(); iCol++) {
    3012         _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(""));
    3013     }
     3338void bncWindow::populateUploadEphTable() {
     3339  for (int iRow = _uploadEphTable->rowCount() - 1; iRow >= 0; iRow--) {
     3340    _uploadEphTable->removeRow(iRow);
     3341  }
     3342
     3343  bncSettings settings;
     3344
     3345  int iRow = -1;
     3346  QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
     3347  while (it.hasNext()) {
     3348    QStringList hlp = it.next().split(",");
     3349    if (hlp.size() > 6) {
     3350      ++iRow;
     3351      _uploadEphTable->insertRow(iRow);
     3352    }
     3353    for (int iCol = 0; iCol < hlp.size(); iCol++) {
     3354      if (iCol == 3) {
     3355        QComboBox* ntripversion = new QComboBox();
     3356        ntripversion->setEditable(false);
     3357        ntripversion->addItems(QString("1,2,2s").split(","));
     3358        ntripversion->setFrame(false);
     3359        ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
     3360        _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
     3361      }
     3362      else if (iCol == 4) {
     3363        QLineEdit* user = new QLineEdit();
     3364        user->setFrame(false);
     3365        user->setText(hlp[iCol]);
     3366        _uploadEphTable->setCellWidget(iRow, iCol, user);
     3367      }
     3368      else if (iCol == 5) {
     3369        QLineEdit* passwd = new QLineEdit();
     3370        passwd->setFrame(false);
     3371        passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3372        passwd->setText(hlp[iCol]);
     3373        _uploadEphTable->setCellWidget(iRow, iCol, passwd);
     3374      }
     3375      else if (iCol == 6) {
     3376        QLineEdit* system = new QLineEdit();
     3377        system->setFrame(false);
     3378        system->setText(hlp[iCol]);
     3379        _uploadEphTable->setCellWidget(iRow, iCol, system);
     3380      }
     3381      else if (iCol == 7) {
     3382        bncTableItem* bncIt = new bncTableItem();
     3383        bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3384        _uploadEphTable->setItem(iRow, iCol, bncIt);
     3385        BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
     3386      }
     3387      else {
     3388        _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
     3389      }
     3390    }
     3391  }
    30143392}
    30153393
    30163394//
    30173395////////////////////////////////////////////////////////////////////////////
    3018 void bncWindow::slotDelCmbRow() {
    3019 
    3020     const static QPalette paletteWhite(QColor(255, 255, 255));
    3021     const static QPalette paletteGray(QColor(230, 230, 230));
    3022 
    3023     int nRows = _cmbTable->rowCount();
    3024     std::vector <bool> flg(nRows);
    3025     for (int iRow = 0; iRow < nRows; iRow++) {
    3026         if (_cmbTable->item(iRow, 1)->isSelected()) {
    3027             flg[iRow] = true;
    3028         }
    3029         else {
    3030             flg[iRow] = false;
    3031         }
    3032     }
    3033     for (int iRow = nRows - 1; iRow >= 0; iRow--) {
    3034         if (flg[iRow]) {
    3035             _cmbTable->removeRow(iRow);
    3036         }
    3037     }
    3038     nRows = _cmbTable->rowCount();
    3039     if (nRows < 1) {
    3040         enableWidget(false, _cmbMethodComboBox);
    3041         enableWidget(false, _cmbMaxresLineEdit);
    3042         enableWidget(false, _cmbMaxdisplacementLineEdit);
    3043         enableWidget(false, _cmbSamplComboBox);
    3044         enableWidget(false, _cmbLogPath);
    3045     }
     3396void bncWindow::slotAddUploadRawRow() {
     3397  int iRow = _uploadRawTable->rowCount();
     3398  _uploadRawTable->insertRow(iRow);
     3399  for (int iCol = 0; iCol < _uploadRawTable->columnCount(); iCol++) {
     3400    if (iCol == 4) {
     3401      QComboBox* ntripversion = new QComboBox();
     3402      ntripversion->setEditable(false);
     3403      ntripversion->addItems(QString("2s,2,1").split(","));
     3404      ntripversion->setFrame(false);
     3405      _uploadRawTable->setCellWidget(iRow, iCol, ntripversion);
     3406
     3407    }
     3408    else if (iCol == 5) {
     3409      QLineEdit* user = new QLineEdit();
     3410      user->setFrame(false);
     3411      _uploadRawTable->setCellWidget(iRow, iCol, user);
     3412    }
     3413    else if (iCol == 6) {
     3414      QLineEdit* passwd = new QLineEdit();
     3415      passwd->setFrame(false);
     3416      passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3417      _uploadRawTable->setCellWidget(iRow, iCol, passwd);
     3418    }
     3419    else if (iCol == 7) {
     3420      bncTableItem* bncIt = new bncTableItem();
     3421      bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3422      _uploadRawTable->setItem(iRow, iCol, bncIt);
     3423      BNC_CORE->_uploadRawTableItems[iRow] = bncIt;
     3424    }
     3425    else {
     3426      _uploadRawTable->setItem(iRow, iCol, new QTableWidgetItem(""));
     3427    }
     3428  }
    30463429}
    30473430
    30483431//
    30493432////////////////////////////////////////////////////////////////////////////
    3050 void bncWindow::populateCmbTable() {
    3051 
    3052     for (int iRow = _cmbTable->rowCount() - 1; iRow >= 0; iRow--) {
    3053         _cmbTable->removeRow(iRow);
    3054     }
    3055 
    3056     bncSettings settings;
    3057 
    3058     int iRow = -1;
    3059     QListIterator<QString> it(settings.value("cmbStreams").toStringList());
    3060     while (it.hasNext()) {
    3061         QStringList hlp = it.next().split(" ");
    3062         if (hlp.size() > 2) {
    3063             ++iRow;
    3064             _cmbTable->insertRow(iRow);
    3065         }
    3066         for (int iCol = 0; iCol < hlp.size(); iCol++) {
    3067             _cmbTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
    3068         }
    3069     }
     3433void bncWindow::slotDelUploadRawRow() {
     3434  BNC_CORE->_uploadRawTableItems.clear();
     3435  int nRows = _uploadRawTable->rowCount();
     3436  std::vector <bool> flg(nRows);
     3437  for (int iRow = 0; iRow < nRows; iRow++) {
     3438    if (_uploadRawTable->item(iRow, 1)->isSelected()) {
     3439      flg[iRow] = true;
     3440    }
     3441    else {
     3442      flg[iRow] = false;
     3443    }
     3444  }
     3445  for (int iRow = nRows - 1; iRow >= 0; iRow--) {
     3446    if (flg[iRow]) {
     3447      _uploadRawTable->removeRow(iRow);
     3448    }
     3449  }
     3450  for (int iRow = 0; iRow < _uploadRawTable->rowCount(); iRow++) {
     3451    BNC_CORE->_uploadRawTableItems[iRow] =
     3452      (bncTableItem*)_uploadRawTable->item(iRow, 7);
     3453  }
    30703454}
    30713455
    30723456//
    30733457////////////////////////////////////////////////////////////////////////////
    3074 void bncWindow::slotAddUploadRow() {
    3075     int iRow = _uploadTable->rowCount();
    3076     _uploadTable->insertRow(iRow);
    3077     for (int iCol = 0; iCol < _uploadTable->columnCount(); iCol++) {
    3078         if (iCol == 3) {
    3079             QComboBox* ntripversion = new QComboBox();
    3080             ntripversion->setEditable(false);
    3081             ntripversion->addItems(QString("2s,2,1").split(","));
    3082             ntripversion->setFrame(false);
    3083             _uploadTable->setCellWidget(iRow, iCol, ntripversion);
    3084 
    3085         }
    3086         else if (iCol == 4) {
    3087             QLineEdit* user = new QLineEdit();
    3088             user->setFrame(false);
    3089             _uploadTable->setCellWidget(iRow, iCol, user);
    3090         }
    3091         else if (iCol == 5) {
    3092             QLineEdit* passwd = new QLineEdit();
    3093             passwd->setFrame(false);
    3094             passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3095             _uploadTable->setCellWidget(iRow, iCol, passwd);
    3096         }
    3097         else if (iCol == 6) {
    3098             QComboBox* system = new QComboBox();
    3099             system->setEditable(false);
    3100             system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
    3101             system->setFrame(false);
    3102             _uploadTable->setCellWidget(iRow, iCol, system);
    3103         }
    3104         else if (iCol == 7) {
    3105             QComboBox* format = new QComboBox();
    3106             format->setEditable(false);
    3107             //format->addItems(QString("IGS-SSR,RTCM-SSR,RTCM-NEW-SSR").split(","));
    3108             format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
    3109             format->setFrame(false);
    3110             _uploadTable->setCellWidget(iRow, iCol, format);
    3111         }
    3112         else if (iCol == 8) {
    3113             QCheckBox* com = new QCheckBox();
    3114             _uploadTable->setCellWidget(iRow, iCol, com);
    3115         }
    3116         else if (iCol == 15) {
    3117             bncTableItem* bncIt = new bncTableItem();
    3118             bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3119             _uploadTable->setItem(iRow, iCol, bncIt);
    3120             BNC_CORE->_uploadTableItems[iRow] = bncIt;
    3121         }
    3122         else {
    3123             _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(""));
    3124         }
    3125     }
    3126 }
    3127 
    3128 //
    3129 ////////////////////////////////////////////////////////////////////////////
    3130 void bncWindow::slotDelUploadRow() {
    3131     BNC_CORE->_uploadTableItems.clear();
    3132     int nRows = _uploadTable->rowCount();
    3133     std::vector <bool> flg(nRows);
    3134     for (int iRow = 0; iRow < nRows; iRow++) {
    3135         if (_uploadTable->item(iRow, 1)->isSelected()) {
    3136             flg[iRow] = true;
    3137         }
    3138         else {
    3139             flg[iRow] = false;
    3140         }
    3141     }
    3142     for (int iRow = nRows - 1; iRow >= 0; iRow--) {
    3143         if (flg[iRow]) {
    3144             _uploadTable->removeRow(iRow);
    3145         }
    3146     }
    3147     for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
    3148         BNC_CORE->_uploadTableItems[iRow] =
    3149             (bncTableItem*)_uploadTable->item(iRow, 14);
    3150     }
    3151     nRows = _uploadTable->rowCount();
    3152     if (nRows < 1) {
    3153         enableWidget(false, _uploadIntrComboBox);
    3154         enableWidget(false, _uploadSamplRtcmEphCorrComboBox);
    3155         enableWidget(false, _uploadSamplSp3ComboBox);
    3156         enableWidget(false, _uploadSamplClkRnxSpinBox);
    3157         enableWidget(false, _uploadAntexFile);
    3158     }
    3159 }
    3160 
    3161 //
    3162 ////////////////////////////////////////////////////////////////////////////
    3163 void bncWindow::populateUploadTable() {
    3164     for (int iRow = _uploadTable->rowCount() - 1; iRow >= 0; iRow--) {
    3165         _uploadTable->removeRow(iRow);
    3166     }
    3167 
    3168     bncSettings settings;
    3169 
    3170     int iRow = -1;
    3171     QListIterator<QString> it(settings.value("uploadMountpointsOut").toStringList());
    3172 
    3173     while (it.hasNext()) {
    3174         QStringList hlp = it.next().split(",");
    3175         if (hlp.size() > 6) {
    3176             ++iRow;
    3177             _uploadTable->insertRow(iRow);
    3178         }
    3179         for (int iCol = 0; iCol < hlp.size(); iCol++) {
    3180             if (iCol == 3) {
    3181                 QComboBox* ntripversion = new QComboBox();
    3182                 ntripversion->setEditable(false);
    3183                 ntripversion->addItems(QString("1,2,2s").split(","));
    3184                 ntripversion->setFrame(false);
    3185                 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
    3186                 _uploadTable->setCellWidget(iRow, iCol, ntripversion);
    3187             }
    3188             else if (iCol == 4) {
    3189                 QLineEdit* user = new QLineEdit();
    3190                 user->setFrame(false);
    3191                 user->setText(hlp[iCol]);
    3192                 _uploadTable->setCellWidget(iRow, iCol, user);
    3193             }
    3194             else if (iCol == 5) {
    3195                 QLineEdit* passwd = new QLineEdit();
    3196                 passwd->setFrame(false);
    3197                 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3198                 passwd->setText(hlp[iCol]);
    3199                 _uploadTable->setCellWidget(iRow, iCol, passwd);
    3200             }
    3201             else if (iCol == 6) {
    3202                 QComboBox* system = new QComboBox();
    3203                 system->setEditable(false);
    3204                 system->addItems(QString("IGS20,ETRF2000,GDA2020,SIRGAS2000,DREF91,Custom").split(","));
    3205                 system->setFrame(false);
    3206                 system->setCurrentIndex(system->findText(hlp[iCol]));
    3207                 _uploadTable->setCellWidget(iRow, iCol, system);
    3208             }
    3209             else if (iCol == 7) {
    3210                 QComboBox* format = new QComboBox();
    3211                 format->setEditable(false);
    3212                 //format->addItems(QString("IGS-SSR,RTCM-SSR,RTCM-NEW-SSR").split(","));
    3213                 format->addItems(QString("IGS-SSR,RTCM-SSR").split(","));
    3214                 format->setFrame(false);
    3215                 format->setCurrentIndex(format->findText(hlp[iCol]));
    3216                 _uploadTable->setCellWidget(iRow, iCol, format);
    3217             }
    3218             else if (iCol == 8) {
    3219                 QCheckBox* com = new QCheckBox();
    3220                 if (hlp[iCol].toInt() == Qt::Checked) {
    3221                     com->setCheckState(Qt::Checked);
    3222                 }
    3223                 _uploadTable->setCellWidget(iRow, iCol, com);
    3224             }
    3225             else if (iCol == 15) {
    3226                 bncTableItem* bncIt = new bncTableItem();
    3227                 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3228                 _uploadTable->setItem(iRow, iCol, bncIt);
    3229                 BNC_CORE->_uploadTableItems[iRow] = bncIt;
    3230             }
    3231             else {
    3232                 _uploadTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
    3233             }
    3234         }
    3235     }
    3236 }
    3237 
    3238 //
    3239 ////////////////////////////////////////////////////////////////////////////
    3240 void bncWindow::slotSetUploadTrafo() {
    3241     bncCustomTrafo* dlg = new bncCustomTrafo(this);
    3242     dlg->exec();
    3243     delete dlg;
    3244 }
    3245 
    3246 //
    3247 ////////////////////////////////////////////////////////////////////////////
    3248 void bncWindow::slotAddUploadEphRow() {
    3249     int iRow = _uploadEphTable->rowCount();
    3250     _uploadEphTable->insertRow(iRow);
    3251     for (int iCol = 0; iCol < _uploadEphTable->columnCount(); iCol++) {
    3252         if (iCol == 3) {
    3253             QComboBox* ntripversion = new QComboBox();
    3254             ntripversion->setEditable(false);
    3255             ntripversion->addItems(QString("2s,2,1").split(","));
    3256             ntripversion->setFrame(false);
    3257             _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
    3258 
    3259         }
    3260         else if (iCol == 4) {
    3261             QLineEdit* user = new QLineEdit();
    3262             user->setFrame(false);
    3263             _uploadEphTable->setCellWidget(iRow, iCol, user);
    3264         }
    3265         else if (iCol == 5) {
    3266             QLineEdit* passwd = new QLineEdit();
    3267             passwd->setFrame(false);
    3268             passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3269             _uploadEphTable->setCellWidget(iRow, iCol, passwd);
    3270         }
    3271         else if (iCol == 6) {
    3272             QLineEdit* system = new QLineEdit("GREC");
    3273             system->setFrame(false);
    3274             _uploadEphTable->setCellWidget(iRow, iCol, system);
    3275         }
    3276         else if (iCol == 7) {
    3277             bncTableItem* bncIt = new bncTableItem();
    3278             bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3279             _uploadEphTable->setItem(iRow, iCol, bncIt);
    3280             BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
    3281         }
    3282         else {
    3283             _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(""));
    3284         }
    3285     }
    3286 }
    3287 
    3288 //
    3289 ////////////////////////////////////////////////////////////////////////////
    3290 void bncWindow::slotDelUploadEphRow() {
    3291     BNC_CORE->_uploadEphTableItems.clear();
    3292     int nRows = _uploadEphTable->rowCount();
    3293     std::vector <bool> flg(nRows);
    3294     for (int iRow = 0; iRow < nRows; iRow++) {
    3295         if (_uploadEphTable->item(iRow, 1)->isSelected()) {
    3296             flg[iRow] = true;
    3297         }
    3298         else {
    3299             flg[iRow] = false;
    3300         }
    3301     }
    3302     for (int iRow = nRows - 1; iRow >= 0; iRow--) {
    3303         if (flg[iRow]) {
    3304             _uploadEphTable->removeRow(iRow);
    3305         }
    3306     }
    3307     for (int iRow = 0; iRow < _uploadTable->rowCount(); iRow++) {
    3308         BNC_CORE->_uploadEphTableItems[iRow] =
    3309             (bncTableItem*)_uploadEphTable->item(iRow, 7);
    3310     }
    3311     nRows = _uploadEphTable->rowCount();
    3312     if (nRows < 1) {
    3313         enableWidget(false, _uploadSamplRtcmEphSpinBox);
    3314     }
    3315 }
    3316 
    3317 //
    3318 ////////////////////////////////////////////////////////////////////////////
    3319 void bncWindow::populateUploadEphTable() {
    3320     for (int iRow = _uploadEphTable->rowCount() - 1; iRow >= 0; iRow--) {
    3321         _uploadEphTable->removeRow(iRow);
    3322     }
    3323 
    3324     bncSettings settings;
    3325 
    3326     int iRow = -1;
    3327     QListIterator<QString> it(settings.value("uploadEphMountpointsOut").toStringList());
    3328     while (it.hasNext()) {
    3329         QStringList hlp = it.next().split(",");
    3330         if (hlp.size() > 6) {
    3331             ++iRow;
    3332             _uploadEphTable->insertRow(iRow);
    3333         }
    3334         for (int iCol = 0; iCol < hlp.size(); iCol++) {
    3335             if (iCol == 3) {
    3336                 QComboBox* ntripversion = new QComboBox();
    3337                 ntripversion->setEditable(false);
    3338                 ntripversion->addItems(QString("1,2,2s").split(","));
    3339                 ntripversion->setFrame(false);
    3340                 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
    3341                 _uploadEphTable->setCellWidget(iRow, iCol, ntripversion);
    3342             }
    3343             else if (iCol == 4) {
    3344                 QLineEdit* user = new QLineEdit();
    3345                 user->setFrame(false);
    3346                 user->setText(hlp[iCol]);
    3347                 _uploadEphTable->setCellWidget(iRow, iCol, user);
    3348             }
    3349             else if (iCol == 5) {
    3350                 QLineEdit* passwd = new QLineEdit();
    3351                 passwd->setFrame(false);
    3352                 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3353                 passwd->setText(hlp[iCol]);
    3354                 _uploadEphTable->setCellWidget(iRow, iCol, passwd);
    3355             }
    3356             else if (iCol == 6) {
    3357                 QLineEdit* system = new QLineEdit();
    3358                 system->setFrame(false);
    3359                 system->setText(hlp[iCol]);
    3360                 _uploadEphTable->setCellWidget(iRow, iCol, system);
    3361             }
    3362             else if (iCol == 7) {
    3363                 bncTableItem* bncIt = new bncTableItem();
    3364                 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3365                 _uploadEphTable->setItem(iRow, iCol, bncIt);
    3366                 BNC_CORE->_uploadEphTableItems[iRow] = bncIt;
    3367             }
    3368             else {
    3369                 _uploadEphTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
    3370             }
    3371         }
    3372     }
    3373 }
    3374 
    3375 //
    3376 ////////////////////////////////////////////////////////////////////////////
    3377 void bncWindow::slotAddUploadRawRow() {
    3378     int iRow = _uploadRawTable->rowCount();
    3379     _uploadRawTable->insertRow(iRow);
    3380     for (int iCol = 0; iCol < _uploadRawTable->columnCount(); iCol++) {
    3381         if (iCol == 4) {
    3382             QComboBox* ntripversion = new QComboBox();
    3383             ntripversion->setEditable(false);
    3384             ntripversion->addItems(QString("2s,2,1").split(","));
    3385             ntripversion->setFrame(false);
    3386             _uploadRawTable->setCellWidget(iRow, iCol, ntripversion);
    3387 
    3388         }
    3389         else if (iCol == 5) {
    3390             QLineEdit* user = new QLineEdit();
    3391             user->setFrame(false);
    3392             _uploadRawTable->setCellWidget(iRow, iCol, user);
    3393         }
    3394         else if (iCol == 6) {
    3395             QLineEdit* passwd = new QLineEdit();
    3396             passwd->setFrame(false);
    3397             passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3398             _uploadRawTable->setCellWidget(iRow, iCol, passwd);
    3399         }
    3400         else if (iCol == 7) {
    3401             bncTableItem* bncIt = new bncTableItem();
    3402             bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3403             _uploadRawTable->setItem(iRow, iCol, bncIt);
    3404             BNC_CORE->_uploadRawTableItems[iRow] = bncIt;
    3405         }
    3406         else {
    3407           _uploadRawTable->setItem(iRow, iCol, new QTableWidgetItem(""));
    3408         }
    3409     }
    3410 }
    3411 
    3412 //
    3413 ////////////////////////////////////////////////////////////////////////////
    3414 void bncWindow::slotDelUploadRawRow() {
    3415     BNC_CORE->_uploadRawTableItems.clear();
    3416     int nRows = _uploadRawTable->rowCount();
    3417     std::vector <bool> flg(nRows);
    3418     for (int iRow = 0; iRow < nRows; iRow++) {
    3419         if (_uploadRawTable->item(iRow, 1)->isSelected()) {
    3420             flg[iRow] = true;
    3421         }
    3422         else {
    3423             flg[iRow] = false;
    3424         }
    3425     }
    3426     for (int iRow = nRows - 1; iRow >= 0; iRow--) {
    3427         if (flg[iRow]) {
    3428             _uploadRawTable->removeRow(iRow);
    3429         }
    3430     }
    3431     for (int iRow = 0; iRow < _uploadRawTable->rowCount(); iRow++) {
    3432         BNC_CORE->_uploadRawTableItems[iRow] =
    3433             (bncTableItem*)_uploadRawTable->item(iRow, 7);
    3434     }
    3435 }
    3436 
    3437 //
    3438 ////////////////////////////////////////////////////////////////////////////
    34393458void bncWindow::populateUploadRawTable() {
    3440     for (int iRow = _uploadRawTable->rowCount() - 1; iRow >= 0; iRow--) {
    3441       _uploadRawTable->removeRow(iRow);
    3442     }
    3443 
    3444     bncSettings settings;
    3445 
    3446     int iRow = -1;
    3447     QListIterator<QString> it(settings.value("uploadRawMountpointsOut").toStringList());
    3448     while (it.hasNext()) {
    3449         QStringList hlp = it.next().split(",");
    3450         if (hlp.size() > 6) {
    3451             ++iRow;
    3452             _uploadRawTable->insertRow(iRow);
    3453         }
    3454         for (int iCol = 0; iCol < hlp.size(); iCol++) {
    3455             if (iCol == 4) {
    3456                 QComboBox* ntripversion = new QComboBox();
    3457                 ntripversion->setEditable(false);
    3458                 ntripversion->addItems(QString("1,2,2s").split(","));
    3459                 ntripversion->setFrame(false);
    3460                 ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
    3461                 _uploadRawTable->setCellWidget(iRow, iCol, ntripversion);
    3462             }
    3463             else if (iCol == 5) {
    3464                 QLineEdit* user = new QLineEdit();
    3465                 user->setFrame(false);
    3466                 user->setText(hlp[iCol]);
    3467                 _uploadRawTable->setCellWidget(iRow, iCol, user);
    3468             }
    3469             else if (iCol == 6) {
    3470                 QLineEdit* passwd = new QLineEdit();
    3471                 passwd->setFrame(false);
    3472                 passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
    3473                 passwd->setText(hlp[iCol]);
    3474                 _uploadRawTable->setCellWidget(iRow, iCol, passwd);
    3475             }
    3476             else if (iCol == 7) {
    3477                 bncTableItem* bncIt = new bncTableItem();
    3478                 bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
    3479                 _uploadRawTable->setItem(iRow, iCol, bncIt);
    3480                 BNC_CORE->_uploadRawTableItems[iRow] = bncIt;
    3481             }
    3482             else {
    3483               _uploadRawTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
    3484             }
    3485         }
    3486     }
     3459  for (int iRow = _uploadRawTable->rowCount() - 1; iRow >= 0; iRow--) {
     3460    _uploadRawTable->removeRow(iRow);
     3461  }
     3462
     3463  bncSettings settings;
     3464
     3465  int iRow = -1;
     3466  QListIterator<QString> it(settings.value("uploadRawMountpointsOut").toStringList());
     3467  while (it.hasNext()) {
     3468    QStringList hlp = it.next().split(",");
     3469    if (hlp.size() > 6) {
     3470      ++iRow;
     3471      _uploadRawTable->insertRow(iRow);
     3472    }
     3473    for (int iCol = 0; iCol < hlp.size(); iCol++) {
     3474      if (iCol == 4) {
     3475        QComboBox* ntripversion = new QComboBox();
     3476        ntripversion->setEditable(false);
     3477        ntripversion->addItems(QString("1,2,2s").split(","));
     3478        ntripversion->setFrame(false);
     3479        ntripversion->setCurrentIndex(ntripversion->findText(hlp[iCol]));
     3480        _uploadRawTable->setCellWidget(iRow, iCol, ntripversion);
     3481      }
     3482      else if (iCol == 5) {
     3483        QLineEdit* user = new QLineEdit();
     3484        user->setFrame(false);
     3485        user->setText(hlp[iCol]);
     3486        _uploadRawTable->setCellWidget(iRow, iCol, user);
     3487      }
     3488      else if (iCol == 6) {
     3489        QLineEdit* passwd = new QLineEdit();
     3490        passwd->setFrame(false);
     3491        passwd->setEchoMode(QLineEdit::PasswordEchoOnEdit);
     3492        passwd->setText(hlp[iCol]);
     3493        _uploadRawTable->setCellWidget(iRow, iCol, passwd);
     3494      }
     3495      else if (iCol == 7) {
     3496        bncTableItem* bncIt = new bncTableItem();
     3497        bncIt->setFlags(bncIt->flags() & ~Qt::ItemIsEditable);
     3498        _uploadRawTable->setItem(iRow, iCol, bncIt);
     3499        BNC_CORE->_uploadRawTableItems[iRow] = bncIt;
     3500      }
     3501      else {
     3502        _uploadRawTable->setItem(iRow, iCol, new QTableWidgetItem(hlp[iCol]));
     3503      }
     3504    }
     3505  }
    34873506}
    34883507
     
    34903509////////////////////////////////////////////////////////////////////////////
    34913510void bncWindow::slotPostProcessingProgress(int nEpo) {
    3492     _actStart->setText(QString("%1 Epochs").arg(nEpo));
     3511  _actStart->setText(QString("%1 Epochs").arg(nEpo));
    34933512}
    34943513
     
    34963515////////////////////////////////////////////////////////////////////////////
    34973516void bncWindow::slotPostProcessingFinished() {
    3498     delete _caster; _caster = 0; BNC_CORE->setCaster(0);
    3499     _runningPPP = false;
    3500     _runningEdit = false;
    3501     _runningQC = false;
    3502     _runningSp3Comp = false;
    3503     _actStart->setText(tr("Sta&rt"));
    3504     enableStartStop();
     3517  delete _caster; _caster = 0; BNC_CORE->setCaster(0);
     3518  _runningPPP = false;
     3519  _runningEdit = false;
     3520  _runningQC = false;
     3521  _runningSp3Comp = false;
     3522  _actStart->setText(tr("Sta&rt"));
     3523  enableStartStop();
    35053524}
    35063525
     
    35083527////////////////////////////////////////////////////////////////////////////
    35093528void bncWindow::slotReqcEditOption() {
    3510     saveOptions();
    3511     reqcDlg* dlg = new reqcDlg(this);
    3512     dlg->move(this->pos().x() + 50, this->pos().y() + 50);
    3513     dlg->exec();
    3514     delete dlg;
     3529  saveOptions();
     3530  reqcDlg* dlg = new reqcDlg(this);
     3531  dlg->move(this->pos().x() + 50, this->pos().y() + 50);
     3532  dlg->exec();
     3533  delete dlg;
    35153534}
    35163535
     
    35193538void bncWindow::enableStartStop() {
    35203539
    3521     if (running()) {
    3522         _actStart->setEnabled(false);
    3523         if (_runningRealTime || _runningPPP) {
    3524             _actStop->setEnabled(true);
    3525         }
    3526     }
    3527     else {
    3528         _actStart->setEnabled(true);
    3529         _actStop->setEnabled(false);
    3530     }
     3540  if (running()) {
     3541    _actStart->setEnabled(false);
     3542    if (_runningRealTime || _runningPPP) {
     3543      _actStop->setEnabled(true);
     3544    }
     3545  }
     3546  else {
     3547    _actStart->setEnabled(true);
     3548    _actStop->setEnabled(false);
     3549  }
    35313550}
    35323551
     
    35343553////////////////////////////////////////////////////////////////////////////
    35353554void bncWindow::slotMapMountPoints() {
    3536     saveOptions();
    3537     t_bncMap* bncMap = new t_bncMap(this);
    3538     bncMap->setMinimumSize(800, 600);
    3539     bncMap->setWindowTitle("Selected Mountpoints");
    3540 
    3541     bncSettings settings;
    3542     QListIterator<QString> it(settings.value("mountPoints").toStringList());
    3543     while (it.hasNext()) {
    3544         QStringList hlp = it.next().split(" ");
    3545         if (hlp.size() < 5) continue;
    3546         QUrl   url(hlp[0]);
    3547         double latDeg = hlp[3].toDouble();
    3548         double lonDeg = hlp[4].toDouble();
    3549         bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
    3550     }
    3551 
    3552     bncMap->show();
     3555  saveOptions();
     3556  t_bncMap* bncMap = new t_bncMap(this);
     3557  bncMap->setMinimumSize(800, 600);
     3558  bncMap->setWindowTitle("Selected Mountpoints");
     3559
     3560  bncSettings settings;
     3561  QListIterator<QString> it(settings.value("mountPoints").toStringList());
     3562  while (it.hasNext()) {
     3563    QStringList hlp = it.next().split(" ");
     3564    if (hlp.size() < 5) continue;
     3565    QUrl   url(hlp[0]);
     3566    double latDeg = hlp[3].toDouble();
     3567    double lonDeg = hlp[4].toDouble();
     3568    bncMap->slotNewPoint(QFileInfo(url.path()).fileName(), latDeg, lonDeg);
     3569  }
     3570
     3571  bncMap->show();
    35533572}
    35543573
     
    35573576void bncWindow::slotMapPPP() {
    35583577#ifdef QT_WEBENGINE
    3559     saveOptions();
    3560     enableWidget(false, _pppWidgets._mapWinButton);
    3561     enableWidget(false, _pppWidgets._mapWinDotSize);
    3562     enableWidget(false, _pppWidgets._mapWinDotColor);
    3563 
    3564     if (!_mapWin) {
    3565         _mapWin = new bncMapWin(this);
    3566         connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
    3567         connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
     3578  saveOptions();
     3579  enableWidget(false, _pppWidgets._mapWinButton);
     3580  enableWidget(false, _pppWidgets._mapWinDotSize);
     3581  enableWidget(false, _pppWidgets._mapWinDotColor);
     3582
     3583  if (!_mapWin) {
     3584    _mapWin = new bncMapWin(this);
     3585    connect(_mapWin, SIGNAL(mapClosed()), this, SLOT(slotMapPPPClosed()));
     3586    connect(BNC_CORE, SIGNAL(newPosition(QByteArray, bncTime, QVector<double>)),
    35683587            _mapWin, SLOT(slotNewPosition(QByteArray, bncTime, QVector<double>)));
    3569     }
    3570     _mapWin->show();
     3588  }
     3589  _mapWin->show();
    35713590#else
    3572     QMessageBox::information(this, "Information",
    3573         "Qt Library compiled without QT_WEBENGINE");
     3591  QMessageBox::information(this, "Information",
     3592                           "Qt Library compiled without QT_WEBENGINE");
    35743593#endif
    35753594}
     
    35793598void bncWindow::slotMapPPPClosed() {
    35803599#ifdef QT_WEBENGINE
    3581     enableWidget(true, _pppWidgets._mapWinButton);
    3582     enableWidget(true, _pppWidgets._mapWinDotSize);
    3583     enableWidget(true, _pppWidgets._mapWinDotColor);
    3584     if (_mapWin) {
    3585         QListIterator<bncGetThread*> it(_threads);
    3586         while (it.hasNext()) {
    3587             bncGetThread* thread = it.next();
    3588             thread->disconnect(_mapWin);
    3589         }
    3590         _mapWin->deleteLater();
    3591         _mapWin = 0;
    3592     }
     3600  enableWidget(true, _pppWidgets._mapWinButton);
     3601  enableWidget(true, _pppWidgets._mapWinDotSize);
     3602  enableWidget(true, _pppWidgets._mapWinDotColor);
     3603  if (_mapWin) {
     3604    QListIterator<bncGetThread*> it(_threads);
     3605    while (it.hasNext()) {
     3606      bncGetThread* thread = it.next();
     3607      thread->disconnect(_mapWin);
     3608    }
     3609    _mapWin->deleteLater();
     3610    _mapWin = 0;
     3611  }
    35933612#endif
    35943613}
Note: See TracChangeset for help on using the changeset viewer.