| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Copyright (C) 2022 F4EXB                                                      //
 | 
					
						
							|  |  |  | // written by Edouard Griffiths                                                  //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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 as version 3 of the License, or                  //
 | 
					
						
							|  |  |  | // (at your option) any later version.                                           //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // 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 V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QFileDialog>
 | 
					
						
							|  |  |  | #include <QFile>
 | 
					
						
							|  |  |  | #include <QStandardPaths>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "util/db.h"
 | 
					
						
							|  |  |  | #include "util/csv.h"
 | 
					
						
							|  |  |  | #include "dsp/spectrummarkers.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "spectrumcalibrationpointsdialog.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ui_spectrumcalibrationpointsdialog.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpectrumCalibrationPointsDialog::SpectrumCalibrationPointsDialog( | 
					
						
							|  |  |  |     QList<SpectrumCalibrationPoint>& calibrationPoints, | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     SpectrumSettings::CalibrationInterpolationMode& calibrationInterpMode, | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     const SpectrumHistogramMarker *markerZero, | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     QWidget* parent | 
					
						
							|  |  |  | ) : | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     QDialog(parent), | 
					
						
							|  |  |  |     ui(new Ui::SpectrumCalibrationPointsDialog), | 
					
						
							|  |  |  |     m_calibrationPoints(calibrationPoints), | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     m_calibrationInterpMode(calibrationInterpMode), | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     m_markerZero(markerZero), | 
					
						
							|  |  |  |     m_calibrationPointIndex(0), | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     m_centerFrequency(0), | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     m_globalCorrection(0.0), | 
					
						
							|  |  |  |     m_setElseCorrectGlobal(false) | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     ui->setupUi(this); | 
					
						
							|  |  |  |     ui->calibPointFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold)); | 
					
						
							|  |  |  |     ui->calibPointFrequency->setValueRange(false, 10, -9999999999L, 9999999999L); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->calibrationGlobalCorr->setColorMapper(ColorMapper(ColorMapper::GrayYellow)); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     ui->calibrationGlobalCorr->setValueRange(false, 5, -20000L, 4000L, 2); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->relativePower->setColorMapper(ColorMapper(ColorMapper::GrayYellow)); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     ui->relativePower->setValueRange(false, 5, -20000L, 4000L, 2); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->calibratedPower->setColorMapper(ColorMapper(ColorMapper::GrayYellow)); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     ui->calibratedPower->setValueRange(false, 5, -20000L, 4000L, 2); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     ui->calibPoint->setMaximum(m_calibrationPoints.size() - 1); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->calibInterpMode->blockSignals(true); | 
					
						
							|  |  |  |     ui->calibInterpMode->setCurrentIndex((int) m_calibrationInterpMode); | 
					
						
							|  |  |  |     ui->calibInterpMode->blockSignals(false); | 
					
						
							|  |  |  |     ui->calibrationGlobalCorr->setValue(m_globalCorrection * 100.0); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     ui->corrOrSet->setText("Cor"); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SpectrumCalibrationPointsDialog::~SpectrumCalibrationPointsDialog() | 
					
						
							|  |  |  | {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::displayCalibrationPoint() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ui->calibPointFrequency->blockSignals(true); | 
					
						
							|  |  |  |     ui->calibPoint->blockSignals(true); | 
					
						
							|  |  |  |     ui->relativePower->blockSignals(true); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->calibratedPower->blockSignals(true); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->calibPoint->setEnabled(false); | 
					
						
							|  |  |  |         ui->calibPointDel->setEnabled(false); | 
					
						
							|  |  |  |         ui->relativePower->setEnabled(false); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |         ui->calibratedPower->setEnabled(false); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |         ui->calibPointFrequency->setEnabled(false); | 
					
						
							|  |  |  |         ui->importMarkerZero->setEnabled(false); | 
					
						
							|  |  |  |         ui->centerFrequency->setEnabled(false); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->calibPoint->setEnabled(true); | 
					
						
							|  |  |  |         ui->calibPointDel->setEnabled(true); | 
					
						
							|  |  |  |         ui->relativePower->setEnabled(true); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |         ui->calibratedPower->setEnabled(true); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |         ui->calibPointFrequency->setEnabled(true); | 
					
						
							|  |  |  |         ui->importMarkerZero->setEnabled(true); | 
					
						
							|  |  |  |         ui->centerFrequency->setEnabled(true); | 
					
						
							|  |  |  |         ui->calibPoint->setValue(m_calibrationPointIndex); | 
					
						
							|  |  |  |         ui->calibPointText->setText(tr("%1").arg(m_calibrationPointIndex)); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |         double powerDB = CalcDb::dbPower(m_calibrationPoints[m_calibrationPointIndex].m_powerRelativeReference, 1e-20); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |         ui->relativePower->setValue(round(powerDB*100.0)); // fixed point 2 decimals
 | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |         powerDB = CalcDb::dbPower(m_calibrationPoints[m_calibrationPointIndex].m_powerCalibratedReference, 1e-20); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |         ui->calibratedPower->setValue(round(powerDB*100.0)); // fixed point 2 decimals
 | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |         ui->calibPointFrequency->setValue(m_calibrationPoints[m_calibrationPointIndex].m_frequency); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ui->calibPointFrequency->blockSignals(false); | 
					
						
							|  |  |  |     ui->calibPoint->blockSignals(false); | 
					
						
							|  |  |  |     ui->relativePower->blockSignals(false); | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     ui->calibratedPower->blockSignals(false); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibPoint_valueChanged(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPointIndex = value; | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibPointAdd_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_calibrationPoints.append(SpectrumCalibrationPoint()); | 
					
						
							|  |  |  |     m_calibrationPoints.back().m_frequency = m_centerFrequency; | 
					
						
							|  |  |  |     m_calibrationPointIndex = m_calibrationPoints.size() - 1; | 
					
						
							|  |  |  |     ui->calibPoint->setMaximum(m_calibrationPoints.size() - 1); | 
					
						
							|  |  |  |     ui->calibPoint->setMinimum(0); | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibPointDel_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPoints.removeAt(m_calibrationPointIndex); | 
					
						
							|  |  |  |     m_calibrationPointIndex = m_calibrationPointIndex < m_calibrationPoints.size() ? | 
					
						
							|  |  |  |         m_calibrationPointIndex : m_calibrationPointIndex - 1; | 
					
						
							|  |  |  |     ui->calibPoint->setMaximum(m_calibrationPoints.size() - 1); | 
					
						
							|  |  |  |     ui->calibPoint->setMinimum(0); | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_relativePower_changed(qint64 value) | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     float powerDB = value / 100.0f; | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_powerRelativeReference = CalcDb::powerFromdB(powerDB); | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_calibratedPower_changed(qint64 value) | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     float powerDB = value / 100.0f; | 
					
						
							|  |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_powerCalibratedReference = CalcDb::powerFromdB(powerDB); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibPointFrequency_changed(qint64 value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_frequency = value; | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_calibPointDuplicate_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPoints.push_back(SpectrumCalibrationPoint(m_calibrationPoints[m_calibrationPointIndex])); | 
					
						
							|  |  |  |     ui->calibPoint->setMaximum(m_calibrationPoints.size() - 1); | 
					
						
							|  |  |  |     ui->calibPoint->setMinimum(0); | 
					
						
							|  |  |  |     m_calibrationPointIndex = m_calibrationPoints.size() - 1; | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_calibPointsSort_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     std::sort(m_calibrationPoints.begin(), m_calibrationPoints.end(), calibrationPointsLessThan); | 
					
						
							|  |  |  |     m_calibrationPointIndex = 0; | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_importMarkerZero_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if ((m_calibrationPoints.size() == 0) || (m_markerZero == nullptr)) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_frequency = m_markerZero->m_frequency; | 
					
						
							|  |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_powerRelativeReference = CalcDb::powerFromdB(m_markerZero->m_powerMax); | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_centerFrequency_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_calibrationPoints.size() == 0) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_calibrationPoints[m_calibrationPointIndex].m_frequency = m_centerFrequency; | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_calibInterpMode_currentIndexChanged(int index) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_calibrationInterpMode = (SpectrumSettings::CalibrationInterpolationMode) index; | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibrationGlobalCorr_changed(qint64 value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_globalCorrection = value / 100.0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_corrOrSet_toggled(bool checked) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (checked) { | 
					
						
							|  |  |  |         ui->corrOrSet->setText("Set"); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         ui->corrOrSet->setText("Cor"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_setElseCorrectGlobal = checked; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_globalRelativeCorrection_clicked() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     for (auto& calibrationPoint : m_calibrationPoints) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_setElseCorrectGlobal) { | 
					
						
							|  |  |  |             calibrationPoint.m_powerRelativeReference = CalcDb::powerFromdB(m_globalCorrection); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             calibrationPoint.m_powerRelativeReference *= CalcDb::powerFromdB(m_globalCorrection); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_globalCalibratedCorrection_clicked() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |     for (auto& calibrationPoint : m_calibrationPoints) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (m_setElseCorrectGlobal) { | 
					
						
							|  |  |  |             calibrationPoint.m_powerCalibratedReference = CalcDb::powerFromdB(m_globalCorrection); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             calibrationPoint.m_powerCalibratedReference *= CalcDb::powerFromdB(m_globalCorrection); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-04 08:38:04 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     displayCalibrationPoint(); | 
					
						
							|  |  |  |     emit updateCalibrationPoints(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | void SpectrumCalibrationPointsDialog::on_calibPointsExport_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFileDialog fileDialog( | 
					
						
							|  |  |  |         nullptr, | 
					
						
							|  |  |  |         "Select file to write calibration points to", | 
					
						
							|  |  |  |         QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), | 
					
						
							|  |  |  |         "*.csv" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     fileDialog.setAcceptMode(QFileDialog::AcceptSave); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (fileDialog.exec()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QStringList fileNames = fileDialog.selectedFiles(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (fileNames.size() > 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QFile file(fileNames[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (file.open(QIODevice::WriteOnly | QIODevice::Text)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 QTextStream stream; | 
					
						
							|  |  |  |                 stream.setDevice(&file); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |                 stream << "Frequency,Relative,Calibrated\n"; | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 for (const auto &calibrationPint : m_calibrationPoints) | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |                     stream << calibrationPint.m_frequency << "," | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |                         << CalcDb::dbPower(calibrationPint.m_powerRelativeReference, 1e-20) << "," | 
					
						
							|  |  |  |                         << CalcDb::dbPower(calibrationPint.m_powerCalibratedReference, 1e-20) << "\n"; | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 stream.flush(); | 
					
						
							|  |  |  |                 file.close(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SpectrumCalibrationPointsDialog::on_calibPointsImport_clicked() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     QFileDialog fileDialog( | 
					
						
							|  |  |  |         nullptr, | 
					
						
							|  |  |  |         "Select .csv calibration points file to read", | 
					
						
							|  |  |  |         QStandardPaths::writableLocation(QStandardPaths::AppDataLocation), | 
					
						
							|  |  |  |         "*.csv" | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (fileDialog.exec()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         QStringList fileNames = fileDialog.selectedFiles(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (fileNames.size() > 0) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             QFile file(fileNames[0]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (file.open(QIODevice::ReadOnly | QIODevice::Text)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 QTextStream in(&file); | 
					
						
							|  |  |  |                 QString error; | 
					
						
							|  |  |  |                 QHash<QString, int> colIndexes = CSV::readHeader( | 
					
						
							|  |  |  |                     in, | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |                     {"Frequency", "Relative", "Calibrated"}, | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |                     error | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (error.isEmpty()) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     QStringList cols; | 
					
						
							|  |  |  |                     int frequencyCol = colIndexes.value("Frequency"); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |                     int referenceCol = colIndexes.value("Relative"); | 
					
						
							|  |  |  |                     int absoluteCol = colIndexes.value("Calibrated"); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |                     m_calibrationPoints.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     while (CSV::readRow(in, &cols)) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         m_calibrationPoints.push_back(SpectrumCalibrationPoint()); | 
					
						
							|  |  |  |                         m_calibrationPoints.back().m_frequency = cols[frequencyCol].toLongLong(); | 
					
						
							| 
									
										
										
										
											2022-02-05 11:56:08 +01:00
										 |  |  |                         m_calibrationPoints.back().m_powerRelativeReference = CalcDb::powerFromdB(cols[referenceCol].toFloat()); | 
					
						
							|  |  |  |                         m_calibrationPoints.back().m_powerCalibratedReference = CalcDb::powerFromdB(cols[absoluteCol].toFloat()); | 
					
						
							| 
									
										
										
										
											2022-01-30 07:43:50 +01:00
										 |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     m_calibrationPointIndex = 0; | 
					
						
							|  |  |  |                     ui->calibPoint->setMaximum(m_calibrationPoints.size() - 1); | 
					
						
							|  |  |  |                     ui->calibPoint->setMinimum(0); | 
					
						
							|  |  |  |                     displayCalibrationPoint(); | 
					
						
							|  |  |  |                     emit updateCalibrationPoints(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |