From d02efdb14629a3a2dc9e102a558c05a63532b844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sun, 12 Feb 2023 13:21:07 +0100 Subject: [PATCH] Add warnings if calibration standard does not cover calibration measurement range --- .../LibreVNA-GUI/Calibration/calibration.cpp | 12 ++-- .../Calibration/calibrationmeasurement.cpp | 61 ++++++++++++------- .../Calibration/calibrationmeasurement.h | 26 ++++++-- 3 files changed, 65 insertions(+), 34 deletions(-) diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp index 2d55072..dbdb476 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/calibration.cpp @@ -524,7 +524,7 @@ void Calibration::edit() ui->table->setItem(i, 0, new QTableWidgetItem(CalibrationMeasurement::Base::TypeToString(measurements[i]->getType()))); ui->table->setCellWidget(i, 1, measurements[i]->createStandardWidget()); ui->table->setCellWidget(i, 2, measurements[i]->createSettingsWidget()); - ui->table->setItem(i, 3, new QTableWidgetItem(measurements[i]->getStatistics())); + ui->table->setItem(i, 3, measurements[i]->getStatisticsItem()); ui->table->setItem(i, 4, new QTableWidgetItem(measurements[i]->getTimestamp().toString())); } ui->table->selectRow(row); @@ -1847,12 +1847,12 @@ bool Calibration::hasFrequencyOverlap(std::vectornumPoints() < 2) { return false; } - auto resolution = (meas->maxFreq() - meas->minFreq()) / (meas->numPoints() - 1); - if(meas->maxFreq() < maxFreq) { - maxFreq = meas->maxFreq(); + auto resolution = (meas->maxUsableFreq() - meas->minUsableFreq()) / (meas->numPoints() - 1); + if(meas->maxUsableFreq() < maxFreq) { + maxFreq = meas->maxUsableFreq(); } - if(meas->minFreq() > minFreq) { - minFreq = meas->minFreq(); + if(meas->minUsableFreq() > minFreq) { + minFreq = meas->minUsableFreq(); } if(resolution < minResolution) { minResolution = resolution; diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.cpp b/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.cpp index 327834f..527e574 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.cpp @@ -66,6 +66,11 @@ bool CalibrationMeasurement::Base::setStandard(CalStandard::Virtual *standard) } } +QTableWidgetItem *CalibrationMeasurement::Base::getStatisticsItem() +{ + return new QTableWidgetItem(getStatistics()); +} + QString CalibrationMeasurement::Base::getStatistics() { if(numPoints() > 0) { @@ -222,7 +227,22 @@ CalStandard::Virtual* CalibrationMeasurement::Base::getStandard() const return standard; } -double CalibrationMeasurement::OnePort::minFreq() +QTableWidgetItem *CalibrationMeasurement::OnePort::getStatisticsItem() +{ + auto ret = Base::getStatisticsItem(); + if(numPoints() > 0) { + if(!standard) { + ret->setBackgroundColor(Qt::red); + ret->setToolTip("No calibration standard assigned, unable to use this measurement"); + } else if(standard->minFrequency() > points.front().frequency || standard->maxFrequency() < points.back().frequency) { + ret->setBackgroundColor(Qt::yellow); + ret->setToolTip("Usable frequency range constrained by calibration standard to "+Unit::ToString(minUsableFreq(), "Hz", " kMG", 4)+" - "+Unit::ToString(maxUsableFreq(), "Hz", " kMG", 4)); + } + } + return ret; +} + +double CalibrationMeasurement::OnePort::minUsableFreq() { if(points.size() > 0 && standard) { return max(points.front().frequency, standard->minFrequency()); @@ -231,7 +251,7 @@ double CalibrationMeasurement::OnePort::minFreq() } } -double CalibrationMeasurement::OnePort::maxFreq() +double CalibrationMeasurement::OnePort::maxUsableFreq() { if(points.size() > 0 && standard) { return min(points.back().frequency, standard->maxFrequency()); @@ -366,7 +386,22 @@ std::vector CalibrationMeasurement::OneP return points; } -double CalibrationMeasurement::TwoPort::minFreq() +QTableWidgetItem *CalibrationMeasurement::TwoPort::getStatisticsItem() +{ + auto ret = Base::getStatisticsItem(); + if(numPoints() > 0) { + if(!standard) { + ret->setBackgroundColor(Qt::red); + ret->setToolTip("No calibration standard assigned, unable to use this measurement"); + } else if(standard->minFrequency() > points.front().frequency || standard->maxFrequency() < points.back().frequency) { + ret->setBackgroundColor(Qt::yellow); + ret->setToolTip("Usable frequency range constrained by calibration standard to "+Unit::ToString(minUsableFreq(), "Hz", " kMG", 4)+" - "+Unit::ToString(maxUsableFreq(), "Hz", " kMG", 4)); + } + } + return ret; +} + +double CalibrationMeasurement::TwoPort::minUsableFreq() { if(points.size() > 0 && standard) { return max(points.front().frequency, standard->minFrequency()); @@ -375,7 +410,7 @@ double CalibrationMeasurement::TwoPort::minFreq() } } -double CalibrationMeasurement::TwoPort::maxFreq() +double CalibrationMeasurement::TwoPort::maxUsableFreq() { if(points.size() > 0 && standard) { return min(points.back().frequency, standard->maxFrequency()); @@ -574,24 +609,6 @@ int CalibrationMeasurement::TwoPort::getPort1() const return port1; } -double CalibrationMeasurement::Isolation::minFreq() -{ - if(points.size() > 0) { - return points.front().frequency; - } else { - return numeric_limits::max(); - } -} - -double CalibrationMeasurement::Isolation::maxFreq() -{ - if(points.size() > 0) { - return points.back().frequency; - } else { - return 0; - } -} - unsigned int CalibrationMeasurement::Isolation::numPoints() { return points.size(); diff --git a/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.h b/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.h index 4d43581..ed1602f 100644 --- a/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.h +++ b/Software/PC_Application/LibreVNA-GUI/Calibration/calibrationmeasurement.h @@ -6,6 +6,7 @@ #include #include +#include class Calibration; @@ -33,8 +34,11 @@ public: virtual bool setFirstSupportedStandard(); virtual bool setStandard(CalStandard::Virtual *standard); + virtual QTableWidgetItem *getStatisticsItem(); QString getStatistics(); + virtual double minUsableFreq() = 0; + virtual double maxUsableFreq() = 0; virtual double minFreq() = 0; virtual double maxFreq() = 0; virtual unsigned int numPoints() = 0; @@ -78,8 +82,12 @@ public: Base(cal), port(0) {} - virtual double minFreq() override; - virtual double maxFreq() override; + virtual QTableWidgetItem *getStatisticsItem() override; + + virtual double minUsableFreq() override; + virtual double maxUsableFreq() override; + virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits::max();} + virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;} virtual unsigned int numPoints() override {return points.size();} virtual bool readyForMeasurement() override {return standard != nullptr;} virtual bool readyForCalculation() override {return standard && points.size() > 0;} @@ -193,8 +201,12 @@ public: port2(0), reverseStandard(false){} - virtual double minFreq() override; - virtual double maxFreq() override; + virtual QTableWidgetItem *getStatisticsItem() override; + + virtual double minUsableFreq() override; + virtual double maxUsableFreq() override; + virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits::max();} + virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;} virtual unsigned int numPoints() override {return points.size();} virtual bool readyForMeasurement() override {return standard != nullptr;} virtual bool readyForCalculation() override {return standard && points.size() > 0;} @@ -265,8 +277,10 @@ public: Isolation(Calibration *cal) : Base(cal){} - virtual double minFreq() override; - virtual double maxFreq() override; + virtual double minUsableFreq() override {return minFreq();} + virtual double maxUsableFreq() override {return maxFreq();} + virtual double minFreq() override {return points.size() > 0 ? points.front().frequency : std::numeric_limits::max();} + virtual double maxFreq() override {return points.size() > 0 ? points.back().frequency : 0;} virtual unsigned int numPoints() override; virtual bool readyForMeasurement() override {return true;} virtual bool readyForCalculation() override {return points.size() > 0;}