// Part of BNC, a utility for retrieving decoding and // converting GNSS data streams from NTRIP broadcasters. // // Copyright (C) 2007 // German Federal Agency for Cartography and Geodesy (BKG) // http://www.bkg.bund.de // Czech Technical University Prague, Department of Geodesy // http://www.fsv.cvut.cz // // Email: euref-ip@bkg.bund.de // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation, version 2. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. /* ------------------------------------------------------------------------- * BKG NTRIP Client * ------------------------------------------------------------------------- * * Class: reqcDlg * * Purpose: Displays the teqc-like editing options * * Author: L. Mervart * * Created: 28-Mar-2012 * * Changes: * * -----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include "reqcdlg.h" #include "bncsettings.h" using namespace std; // Constructor //////////////////////////////////////////////////////////////////////////// reqcDlg::reqcDlg(QWidget* parent) : QDialog(parent) { setWindowTitle(tr("RINEX Editing Options")); int ww = QFontMetrics(font()).width('w'); const QString timeFmtString = "yyyy-MM-dd hh:mm:ss"; _reqcRnxVersion = new QComboBox(this); _reqcSampling = new QComboBox(this); _reqcStartDateTime = new QDateTimeEdit(this); _reqcStartDateTime->setDisplayFormat(timeFmtString); _reqcEndDateTime = new QDateTimeEdit(this); _reqcEndDateTime->setDisplayFormat(timeFmtString); _reqcRunBy = new QLineEdit(this); _reqcUseObsTypes = new QLineEdit(this); _reqcComment = new QLineEdit(this); _reqcOldMarkerName = new QLineEdit(this); _reqcNewMarkerName = new QLineEdit(this); _reqcOldAntennaName = new QLineEdit(this); _reqcNewAntennaName = new QLineEdit(this); _reqcOldAntennaNumber = new QLineEdit(this); _reqcNewAntennaNumber = new QLineEdit(this); _reqcOldAntennadN = new QLineEdit(this); _reqcNewAntennadN = new QLineEdit(this); _reqcOldAntennadE = new QLineEdit(this); _reqcNewAntennadE = new QLineEdit(this); _reqcOldAntennadU = new QLineEdit(this); _reqcNewAntennadU = new QLineEdit(this); _reqcOldReceiverName = new QLineEdit(this); _reqcNewReceiverName = new QLineEdit(this); _reqcOldReceiverNumber = new QLineEdit(this); _reqcNewReceiverNumber = new QLineEdit(this); _reqcRnxVersion->setEditable(false); _reqcRnxVersion->addItems(QString("2,3").split(",")); _reqcRnxVersion->setMaximumWidth(7*ww); _reqcSampling->setEditable(false); _reqcSampling->addItems(QString("0.1 sec,1 sec,5 sec,10 sec,15 sec,30 sec,60 sec").split(",")); bncSettings settings; int ll = _reqcSampling->findText(settings.value("reqcSampl").toString()); if (ll != -1) { _reqcSampling->setCurrentIndex(ll); } // Read Options // ------------ int kk = _reqcRnxVersion->findText(settings.value("reqcRnxVersion").toString()); if (kk != -1) { _reqcRnxVersion->setCurrentIndex(kk); } _reqcSampling->findText(settings.value("reqcSampling").toString()); if (settings.value("reqcStartDateTime").toString().isEmpty()) { _reqcStartDateTime->setDateTime(QDateTime::fromString("1967-11-02T00:00:00", Qt::ISODate)); } else { _reqcStartDateTime->setDateTime(settings.value("reqcStartDateTime").toDateTime()); } if (settings.value("reqcEndDateTime").toString().isEmpty()) { _reqcEndDateTime->setDateTime(QDateTime::fromString("2099-01-01T00:00:00", Qt::ISODate)); } else { _reqcEndDateTime->setDateTime(settings.value("reqcEndDateTime").toDateTime()); } _reqcRunBy->setText(settings.value("reqcRunBy").toString()); _reqcUseObsTypes->setText(settings.value("reqcUseObsTypes").toString()); _reqcComment->setText(settings.value("reqcComment").toString()); _reqcOldMarkerName->setText(settings.value("reqcOldMarkerName").toString()); _reqcNewMarkerName->setText(settings.value("reqcNewMarkerName").toString()); _reqcOldAntennaName->setText(settings.value("reqcOldAntennaName").toString()); _reqcNewAntennaName->setText(settings.value("reqcNewAntennaName").toString()); _reqcOldAntennaNumber->setText(settings.value("reqcOldAntennaNumber").toString()); _reqcNewAntennaNumber->setText(settings.value("reqcNewAntennaNumber").toString()); _reqcOldAntennadN->setText(settings.value("reqcOldAntennadN").toString()); _reqcNewAntennadN->setText(settings.value("reqcNewAntennadN").toString()); _reqcOldAntennadE->setText(settings.value("reqcOldAntennadE").toString()); _reqcNewAntennadE->setText(settings.value("reqcNewAntennadE").toString()); _reqcOldAntennadU->setText(settings.value("reqcOldAntennadU").toString()); _reqcNewAntennadU->setText(settings.value("reqcNewAntennadU").toString()); _reqcOldReceiverName->setText(settings.value("reqcOldReceiverName").toString()); _reqcNewReceiverName->setText(settings.value("reqcNewReceiverName").toString()); _reqcOldReceiverNumber->setText(settings.value("reqcOldReceiverNumber").toString()); _reqcNewReceiverNumber->setText(settings.value("reqcNewReceiverNumber").toString()); QString hlp = settings.value("reqcV2Priority").toString(); if (hlp.isEmpty()) { hlp = "G:12&PWCSLXYN_ G:5&IQX_ R:12&PC_ R:3&IQX_ E:16&BCX_ E:578&IQX_ J:1&SLXCZ_ J:26&SLX_ J:5&IQX_ C:IQX_ I:ABCX_ S:1&C_ S:5&IQX_"; } _reqcV2Priority = new QLineEdit(hlp); // Dialog Layout // ------------- QGridLayout* grid = new QGridLayout; int ir = 0; grid->addWidget(new QLabel("RINEX Version"), ir, 1); grid->addWidget(_reqcRnxVersion, ir, 2); grid->addWidget(new QLabel("Sampling"), ir, 3, Qt::AlignRight); grid->addWidget(_reqcSampling, ir, 4); ++ir; grid->addWidget(new QLabel("Version 2 signal priority"), ir, 1); grid->addWidget(_reqcV2Priority, ir, 2, 1, 4); ++ir; grid->addWidget(new QLabel("Start"), ir, 1); grid->addWidget(_reqcStartDateTime, ir, 2); grid->addWidget(new QLabel("End"), ir, 3, Qt::AlignRight); grid->addWidget(_reqcEndDateTime, ir, 4); ++ir; grid->addWidget(new QLabel("Run By"), ir, 0); grid->addWidget(_reqcRunBy, ir, 1); ++ir; grid->addWidget(new QLabel("Use Obs. Types"), ir, 0); grid->addWidget(_reqcUseObsTypes, ir, 1, 1, 4); ++ir; grid->addWidget(new QLabel("Comment(s)"), ir, 0); grid->addWidget(_reqcComment, ir, 1, 1, 4); ++ir; grid->addWidget(new QLabel("Old"), ir, 1, 1, 2, Qt::AlignCenter); grid->addWidget(new QLabel("New"), ir, 3, 1, 2, Qt::AlignCenter); ++ir; grid->addWidget(new QLabel("Marker Name"), ir, 0); grid->addWidget(_reqcOldMarkerName, ir, 1, 1, 2); grid->addWidget(_reqcNewMarkerName, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Antenna Name"), ir, 0); grid->addWidget(_reqcOldAntennaName, ir, 1, 1, 2); grid->addWidget(_reqcNewAntennaName, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Antenna Number"), ir, 0); grid->addWidget(_reqcOldAntennaNumber, ir, 1, 1, 2); grid->addWidget(_reqcNewAntennaNumber, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Antenna ecc. dN"), ir, 0); grid->addWidget(_reqcOldAntennadN, ir, 1, 1, 2); grid->addWidget(_reqcNewAntennadN, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Antenna ecc. dE"), ir, 0); grid->addWidget(_reqcOldAntennadE, ir, 1, 1, 2); grid->addWidget(_reqcNewAntennadE, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Antenna ecc. dU"), ir, 0); grid->addWidget(_reqcOldAntennadU, ir, 1, 1, 2); grid->addWidget(_reqcNewAntennadU, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Receiver Name"), ir, 0); grid->addWidget(_reqcOldReceiverName, ir, 1, 1, 2); grid->addWidget(_reqcNewReceiverName, ir, 3, 1, 2); ++ir; grid->addWidget(new QLabel("Receiver Number"), ir, 0); grid->addWidget(_reqcOldReceiverNumber, ir, 1, 1, 2); grid->addWidget(_reqcNewReceiverNumber, ir, 3, 1, 2); slotReqcTextChanged(); connect(_reqcRnxVersion, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(slotReqcTextChanged())); _buttonWhatsThis = new QPushButton(tr("Help=Shift+F1"), this); connect(_buttonWhatsThis, SIGNAL(clicked()), this, SLOT(slotWhatsThis())); _buttonOK = new QPushButton(tr("OK / Save"), this); connect(_buttonOK, SIGNAL(clicked()), this, SLOT(slotOK())); _buttonCancel = new QPushButton(tr("Cancel"), this); connect(_buttonCancel, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout* buttonLayout = new QHBoxLayout; buttonLayout->addWidget(_buttonWhatsThis); buttonLayout->addStretch(1); buttonLayout->addWidget(_buttonOK); buttonLayout->addWidget(_buttonCancel); QVBoxLayout* mainLayout = new QVBoxLayout(this); mainLayout->addLayout(grid); mainLayout->addLayout(buttonLayout); // WhatsThis, RINEX Editing & QC // ----------------------------- _reqcRnxVersion->setWhatsThis(tr("

Select version number of emerging new RINEX file.

Note the following:

When converting RINEX Version 2 to Version 3 Observation files, the tracking mode or channel information (signal attribute, see RINEX Version 3 documentation) in the (last out of the three characters) observation code is left blank if unknown.

When converting RINEX Version 3 to Version 2, the mapping of observations follows a 'Signal priority list' with signal attributes as defined in RINEX Version 3. [key: reqcRnxVersion]

")); _reqcSampling->setWhatsThis(tr("

Select sampling rate of emerging new RINEX Observation file. [key: reqcSampling]

")); _reqcV2Priority->setWhatsThis(tr("

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.

Signal priorities can be specified as equal for all systems, as system specific or as system and freq. specific. For example:

  • 'CWPX_?' (General signal priorities valid for all GNSS)
  • 'C:IQX I:ABCX' (System specific signal priorities for BDS and IRNSS)
  • 'G:12&PWCSLXYN G:5&IQX R:12&PC R:3&IQX' (System and frequency specific signal priorities)
Default is the following priority list 'G:12&PWCSLXYN_ G:5&IQX_ R:12&PC_ R:3&IQX_ E:16&BCX_ E:578&IQX_ J:1&SLXCZ_ J:26&SLX_ J:5&IQX_ C:IQX_ I:ABCX_ S:1&C_ S:5&IQX_'. [key: reqcV2Priority]

")); _reqcStartDateTime->setWhatsThis(tr("

Specify begin of emerging new RINEX Observation file. [key: reqcStartDateTime]

")); _reqcEndDateTime->setWhatsThis(tr("

Specify end of emerging new RINEX Observation file. [key: reqcEndDateTime]

")); _reqcRunBy->setWhatsThis(tr("

Specify a 'RUN BY' string to be included in the emerging new RINEX file header.

Default is an empty option field, meaning the operator's user ID is used as 'RUN BY' string. [key: reqcRunBy]

")); _reqcComment->setWhatsThis(tr("

Specifying a comment line text to be added to the emerging new RINEX file header is an option. Any introduction of newline specification '\\n' in this enforces the beginning of a further comment line. Comment line(s) will be added to the header after the 'PGM / RUN BY / DATE' record.

Default is an empty option field meaning that no additional comment line is added to the RINEX header. [key: reqcComment]

")); _reqcUseObsTypes->setWhatsThis(tr("

This option lets you limit the RINEX output to specific observation types. Examples:

  • G:C1C G:L1C R:C1C R:C1P S:C1C C:C1I C:L1I E:C1X E:L1X
    (Valid for output of RINEX Version 3; output contains GPS C1C and L1C, GLONASS C1C and C1P, SBAS C1C, BeiDou C1C, C1I andL1I, Galileo C1X and L1X.)
  • C1 L2 L5
    (Valid for output of RINEX Version 2 with mapping of Version 3 signals to Version 2 according to 'Version 2 Signal Priority'; output contains C1, L2 and L5 observations from any GNSS system.)

Default is an empty option field, meaning that the RINEX output file contains all observations made available through RINEX input file. [key: reqcUseObsTypes]

")); _reqcOldMarkerName->setWhatsThis(tr("

Enter old Marker Name in RINEX Observation file.

Default is an empty option field. [key: reqcOldMarkerName]

")); _reqcNewMarkerName->setWhatsThis(tr("

Enter new Marker Name in RINEX Observation file.

If option 'Old Marker Name' is either left blank or its content is specified as given in the RINEX input file, then the marker name in the RINEX output file will be specified by 'New Marker Name'

Default is an empty option field, meaning that the content of the Marker Name data field in the RINEX file will not be changed. [key: reqcNewMarkerName]

")); _reqcOldAntennaName->setWhatsThis(tr("

Enter old Antenna Name in RINEX Observation file.

Default is an empty option field. [key: reqcOldAntennaName]

")); _reqcNewAntennaName->setWhatsThis(tr("

Enter new Antenna Name in RINEX Observation file.

If option 'Old Antenna Name' is either left blank or its content is specified as given in the RINEX input file, then the antenna name in the RINEX output file will be specified by 'New Antenna Name'

Default is an empty option field, meaning that the content of the Antenna Name data field in the RINEX file will not be changed. [key: reqcNewAntennaName]

")); _reqcOldAntennaNumber->setWhatsThis(tr("

Enter old Antenna Number in RINEX Observation file.

Default is an empty option field. [key: reqcOldAntennaNumber]

")); _reqcNewAntennaNumber->setWhatsThis(tr("

Enter new Antenna Number in RINEX Observation file.

If option 'Old Antenna Number' is either left blank or its content is specified as given in the RINEX input file, then the antenna number in the RINEX output file will be specified by 'New Antenna Number'

Default is an empty option field, meaning that the content of the Antenna Number data field in the RINEX file will not be changed. [key: reqcNewAntennaNumber]

")); _reqcOldAntennadN->setWhatsThis(tr("

Enter old North Antenna Eccentricity in RINEX Observation file.

Default is an empty option field. [key: reqcOldAntennadN]

")); _reqcNewAntennadN->setWhatsThis(tr("

Enter new North Antenna Eccentricity in RINEX Observation file.

If option 'Old Antenna North Eccentricity' is either left blank or its content is specified as given in the RINEX input file, then the north antenna eccentricity in the RINEX output file will be specified by 'New North Antenna Eccentricity'

Default is an empty option field, meaning that the content of the North Antenna Eccentricity data field in the RINEX file will not be changed. [key: reqcNewAntennadN]

")); _reqcOldAntennadE->setWhatsThis(tr("

Enter old East Antenna Eccentricity in RINEX Observation file.

Default is an empty option field. [key: reqcOldAntennadE]

")); _reqcNewAntennadE->setWhatsThis(tr("

Enter new East Antenna Eccentricity in RINEX Observation file.

If option 'Old Antenna East Eccentricity' is either left blank or its content is specified as given in the RINEX input file, then the east antenna eccentricity in the RINEX output file will be specified by 'New East Antenna Eccentricity'

Default is an empty option field, meaning that the content of the East Antenna Eccentricity data field in the RINEX file will not be changed. [key: reqcNewAntennadE]

")); _reqcOldAntennadU->setWhatsThis(tr("

Enter old Up Antenna Eccentricity in RINEX Observation file.

Default is an empty option field. [key: reqcOldAntennadU]

")); _reqcNewAntennadU->setWhatsThis(tr("

Enter new Up Antenna Eccentricity in RINEX Observation file.

If option 'Old Antenna Up Eccentricity' is either left blank or its content is specified as given in the RINEX input file, then the up antenna eccentricity in the RINEX output file will be specified by 'New Up Antenna Eccentricity'

Default is an empty option field, meaning that the content of the Up Antenna Eccentricity data field in the RINEX file will not be changed. [key: reqcNewAntennadU]

")); _reqcOldReceiverName->setWhatsThis(tr("

Enter old Receiver Name in RINEX Observation file.

Default is an empty option field. [key: reqcOldReceiverName]

")); _reqcNewReceiverName->setWhatsThis(tr("

Enter new Receiver Name in RINEX Observation file.

If option 'Old Receiver Name' is either left blank or its content is specified as given in the RINEX input file, then the receiver name in the RINEX output file will be specified by 'New Receiver Name'

Default is an empty option field, meaning that the content of the Receiver Name data field in the RINEX file will not be changed. [key: reqcNewReceiverName]

")); _reqcOldReceiverNumber->setWhatsThis(tr("

Enter old Receiver Number in RINEX Observation file.

Default is an empty option field. [key: reqcOldReceiverNumber]

")); _reqcNewReceiverNumber->setWhatsThis(tr("

Enter new Receiver Number in RINEX Observation file.

If option 'Old Receiver Number' is either left blank or its content is specified as given in the RINEX input file, then the receiver number in the RINEX output file will be specified by 'New Receiver Number'

Default is an empty option field, meaning that the content of the Receiver Number data field in the RINEX file will not be changed. [key: reqcNewReceiverNumber]

")); } // Destructor //////////////////////////////////////////////////////////////////////////// reqcDlg::~reqcDlg() { delete _buttonOK; delete _buttonCancel; delete _buttonWhatsThis; } // Accept the Options //////////////////////////////////////////////////////////////////////////// void reqcDlg::slotOK() { saveOptions(); done(0); } // Whats This Help //////////////////////////////////////////////////////////////////////////// void reqcDlg::slotWhatsThis() { QWhatsThis::enterWhatsThisMode(); } // Close Dialog gracefully //////////////////////////////////////////////////////////////////////////// void reqcDlg::closeEvent(QCloseEvent* event) { int iRet = QMessageBox::question(this, "Close", "Save Options?", QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel); if (iRet == QMessageBox::Cancel) { event->ignore(); return; } else if (iRet == QMessageBox::Yes) { saveOptions(); } QDialog::closeEvent(event); } // Save Selected Options //////////////////////////////////////////////////////////////////////////// void reqcDlg::saveOptions() { bncSettings settings; settings.setValue("reqcRnxVersion" , _reqcRnxVersion->currentText()); settings.setValue("reqcSampling" , _reqcSampling->currentText()); settings.setValue("reqcV2Priority" , _reqcV2Priority->text()); settings.setValue("reqcStartDateTime" , _reqcStartDateTime->dateTime().toString(Qt::ISODate)); settings.setValue("reqcEndDateTime" , _reqcEndDateTime->dateTime().toString(Qt::ISODate)); settings.setValue("reqcRunBy" , _reqcRunBy->text()); settings.setValue("reqcUseObsTypes" , _reqcUseObsTypes->text()); settings.setValue("reqcComment" , _reqcComment->text()); settings.setValue("reqcOldMarkerName" , _reqcOldMarkerName->text()); settings.setValue("reqcNewMarkerName" , _reqcNewMarkerName->text()); settings.setValue("reqcOldAntennaName" , _reqcOldAntennaName->text()); settings.setValue("reqcNewAntennaName" , _reqcNewAntennaName->text()); settings.setValue("reqcOldAntennaNumber" , _reqcOldAntennaNumber->text()); settings.setValue("reqcNewAntennaNumber" , _reqcNewAntennaNumber->text()); settings.setValue("reqcOldAntennadN" , _reqcOldAntennadN->text()); settings.setValue("reqcNewAntennadN" , _reqcNewAntennadN->text()); settings.setValue("reqcOldAntennadE" , _reqcOldAntennadE->text()); settings.setValue("reqcNewAntennadE" , _reqcNewAntennadE->text()); settings.setValue("reqcOldAntennadU" , _reqcOldAntennadU->text()); settings.setValue("reqcNewAntennadU" , _reqcNewAntennadU->text()); settings.setValue("reqcNewAntennaNumber" , _reqcNewAntennaNumber->text()); settings.setValue("reqcOldReceiverName" , _reqcOldReceiverName->text()); settings.setValue("reqcNewReceiverName" , _reqcNewReceiverName->text()); settings.setValue("reqcOldReceiverNumber", _reqcOldReceiverNumber->text()); settings.setValue("reqcNewReceiverNumber", _reqcNewReceiverNumber->text()); } // Reqc Text Changed //////////////////////////////////////////////////////////////////////////// void reqcDlg::slotReqcTextChanged(){ const static QPalette paletteWhite(QColor(255, 255, 255)); const static QPalette paletteGray(QColor(230, 230, 230)); if (sender() == 0 || sender() == _reqcRnxVersion) { if (_reqcRnxVersion->currentText() == "2") { _reqcV2Priority->setPalette(paletteWhite); _reqcV2Priority->setEnabled(true); } else { _reqcV2Priority->setPalette(paletteGray); _reqcV2Priority->setEnabled(false); } } }