Allow multiple calibration measurements at once

This commit is contained in:
Jan Käberich 2021-09-03 13:13:33 +02:00
parent dc885e947e
commit cf22f40630
6 changed files with 135 additions and 20 deletions

View File

@ -25,6 +25,38 @@ Calibration::Calibration()
type = Type::None; type = Type::None;
} }
Calibration::Standard Calibration::getPort1Standard(Calibration::Measurement m)
{
switch(m) {
case Measurement::Port1Open: return Standard::Open;
case Measurement::Port1Short: return Standard::Short;
case Measurement::Port1Load: return Standard::Load;
case Measurement::Port2Open: return Standard::Any;
case Measurement::Port2Short: return Standard::Any;
case Measurement::Port2Load: return Standard::Any;
case Measurement::Through: return Standard::Through;
case Measurement::Isolation: return Standard::Load;
case Measurement::Line: return Standard::Through;
default: return Standard::Any;
}
}
Calibration::Standard Calibration::getPort2Standard(Calibration::Measurement m)
{
switch(m) {
case Measurement::Port1Open: return Standard::Any;
case Measurement::Port1Short: return Standard::Any;
case Measurement::Port1Load: return Standard::Any;
case Measurement::Port2Open: return Standard::Open;
case Measurement::Port2Short: return Standard::Short;
case Measurement::Port2Load: return Standard::Load;
case Measurement::Through: return Standard::Through;
case Measurement::Isolation: return Standard::Load;
case Measurement::Line: return Standard::Through;
default: return Standard::Any;
}
}
void Calibration::clearMeasurements() void Calibration::clearMeasurements()
{ {
qDebug() << "Clearing all calibration measurements..."; qDebug() << "Clearing all calibration measurements...";
@ -33,6 +65,13 @@ void Calibration::clearMeasurements()
} }
} }
void Calibration::clearMeasurements(std::set<Calibration::Measurement> types)
{
for(auto t : types) {
clearMeasurement(t);
}
}
void Calibration::clearMeasurement(Calibration::Measurement type) void Calibration::clearMeasurement(Calibration::Measurement type)
{ {
measurements[type].datapoints.clear(); measurements[type].datapoints.clear();
@ -46,6 +85,13 @@ void Calibration::addMeasurement(Calibration::Measurement type, Protocol::Datapo
measurements[type].timestamp = QDateTime::currentDateTime(); measurements[type].timestamp = QDateTime::currentDateTime();
} }
void Calibration::addMeasurements(std::set<Calibration::Measurement> types, Protocol::Datapoint &d)
{
for(auto t : types) {
addMeasurement(t, d);
}
}
bool Calibration::calculationPossible(Calibration::Type type) bool Calibration::calculationPossible(Calibration::Type type)
{ {
if(type == Type::None) { if(type == Type::None) {

View File

@ -29,9 +29,23 @@ public:
Line, Line,
Last, Last,
}; };
enum class Standard {
Open,
Short,
Load,
Through,
Any,
};
static Standard getPort1Standard(Measurement m);
static Standard getPort2Standard(Measurement m);
void clearMeasurements(); void clearMeasurements();
void clearMeasurements(std::set<Measurement> types);
void clearMeasurement(Measurement type); void clearMeasurement(Measurement type);
void addMeasurement(Measurement type, Protocol::Datapoint &d); void addMeasurement(Measurement type, Protocol::Datapoint &d);
void addMeasurements(std::set<Measurement> types, Protocol::Datapoint &d);
enum class Type { enum class Type {
Port1SOL, Port1SOL,

View File

@ -40,6 +40,13 @@ CalibrationTraceDialog::~CalibrationTraceDialog()
delete ui; delete ui;
} }
void CalibrationTraceDialog::measurementsComplete(std::set<Calibration::Measurement> m)
{
for(auto t : m) {
measurementComplete(t);
}
}
void CalibrationTraceDialog::measurementComplete(Calibration::Measurement m) void CalibrationTraceDialog::measurementComplete(Calibration::Measurement m)
{ {
model->measurementUpdated(m); model->measurementUpdated(m);
@ -69,8 +76,49 @@ void CalibrationTraceDialog::on_bDelete_clicked()
void CalibrationTraceDialog::on_bMeasure_clicked() void CalibrationTraceDialog::on_bMeasure_clicked()
{ {
auto measurement = measurements[ui->tableView->currentIndex().row()]; std::set<Calibration::Measurement> m;
emit triggerMeasurement(measurement); auto selected = ui->tableView->selectionModel()->selectedRows();
for(auto s : selected) {
m.insert(measurements[s.row()]);
}
// check if incompatible measurements are selected
auto p1Standard = Calibration::Standard::Any;
auto p2Standard = Calibration::Standard::Any;
bool okay = true;
for(auto type : m) {
auto p1Required = Calibration::getPort1Standard(type);
auto p2Required = Calibration::getPort2Standard(type);
if(p1Required != Calibration::Standard::Any) {
if(p1Standard == Calibration::Standard::Any) {
// first calibration measurement type that needs a specific standard
p1Standard = p1Required;
} else if(p1Required != p1Standard) {
// needs different standard than other measurement that has also been selected
okay = false;
break;
}
}
// same check for port 2
if(p2Required != Calibration::Standard::Any) {
if(p2Standard == Calibration::Standard::Any) {
// first calibration measurement type that needs a specific standard
p2Standard = p2Required;
} else if(p2Required != p2Standard) {
// needs different standard than other measurement that has also been selected
okay = false;
break;
}
}
}
if(!okay) {
// these measurements should not be taken at once, get user confirmation before continuing
okay = InformationBox::AskQuestion("Confirm selection", "The selected calibration measurements require different standards. Are you sure you want to measure them at the same time?", false);
}
if(okay) {
emit triggerMeasurements(m);
}
} }
void CalibrationTraceDialog::on_bApply_clicked() void CalibrationTraceDialog::on_bApply_clicked()

View File

@ -19,9 +19,10 @@ public:
~CalibrationTraceDialog(); ~CalibrationTraceDialog();
public slots: public slots:
void measurementsComplete(std::set<Calibration::Measurement> m);
void measurementComplete(Calibration::Measurement m); void measurementComplete(Calibration::Measurement m);
signals: signals:
void triggerMeasurement(Calibration::Measurement m); void triggerMeasurements(std::set<Calibration::Measurement> m);
void applyCalibration(Calibration::Type type); void applyCalibration(Calibration::Type type);
void calibrationInvalidated(); void calibrationInvalidated();

View File

@ -715,11 +715,10 @@ void VNA::NewDatapoint(Protocol::Datapoint d)
// this is the last averaging sweep, use values for calibration // this is the last averaging sweep, use values for calibration
if(!calWaitFirst || d.pointNum == 0) { if(!calWaitFirst || d.pointNum == 0) {
calWaitFirst = false; calWaitFirst = false;
cal.addMeasurement(calMeasurement, d); cal.addMeasurements(calMeasurements, d);
if(d.pointNum == settings.npoints - 1) { if(d.pointNum == settings.npoints - 1) {
calMeasuring = false; calMeasuring = false;
qDebug() << "Calibration measurement" << cal.MeasurementToString(calMeasurement) << "complete"; emit CalibrationMeasurementsComplete(calMeasurements);
emit CalibrationMeasurementComplete(calMeasurement);
} }
} }
} }
@ -1025,7 +1024,7 @@ void VNA::ApplyCalibration(Calibration::Type type)
} }
} }
void VNA::StartCalibrationMeasurement(Calibration::Measurement m) void VNA::StartCalibrationMeasurements(std::set<Calibration::Measurement> m)
{ {
auto device = window->getDevice(); auto device = window->getDevice();
if(!device) { if(!device) {
@ -1033,14 +1032,19 @@ void VNA::StartCalibrationMeasurement(Calibration::Measurement m)
} }
// Stop sweep // Stop sweep
StopSweep(); StopSweep();
qDebug() << "Taking" << Calibration::MeasurementToString(m) << "measurement"; calMeasurements = m;
calMeasurement = m;
// Delete any already captured data of this measurement // Delete any already captured data of this measurement
cal.clearMeasurement(m); cal.clearMeasurements(m);
calWaitFirst = true; calWaitFirst = true;
QString text = "Measuring \""; // show messagebox
text.append(Calibration::MeasurementToString(m)); QString text = "Measuring ";
text.append("\" parameters."); if(m.size() == 1) {
text.append("\"");
text.append(Calibration::MeasurementToString(*m.begin()));
text.append("\" parameters.");
} else {
text.append("multiple calibration standards.");
}
calDialog.setLabelText(text); calDialog.setLabelText(text);
calDialog.setCancelButtonText("Abort"); calDialog.setCancelButtonText("Abort");
calDialog.setWindowTitle("Taking calibration measurement..."); calDialog.setWindowTitle("Taking calibration measurement...");
@ -1051,7 +1055,7 @@ void VNA::StartCalibrationMeasurement(Calibration::Measurement m)
connect(&calDialog, &QProgressDialog::canceled, [=]() { connect(&calDialog, &QProgressDialog::canceled, [=]() {
// the user aborted the calibration measurement // the user aborted the calibration measurement
calMeasuring = false; calMeasuring = false;
cal.clearMeasurement(calMeasurement); cal.clearMeasurements(calMeasurements);
}); });
// Trigger sweep to start from beginning // Trigger sweep to start from beginning
SettingsChanged([=](Device::TransmissionResult){ SettingsChanged([=](Device::TransmissionResult){
@ -1256,7 +1260,9 @@ void VNA::SetupSCPI()
// failed to parse string // failed to parse string
return "ERROR"; return "ERROR";
} else { } else {
StartCalibrationMeasurement(meas); std::set<Calibration::Measurement> m;
m.insert(meas);
StartCalibrationMeasurements(m);
} }
} }
return ""; return "";
@ -1340,9 +1346,9 @@ void VNA::StopSweep()
void VNA::StartCalibrationDialog(Calibration::Type type) void VNA::StartCalibrationDialog(Calibration::Type type)
{ {
auto traceDialog = new CalibrationTraceDialog(&cal, settings.Freq.start, settings.Freq.stop, type); auto traceDialog = new CalibrationTraceDialog(&cal, settings.Freq.start, settings.Freq.stop, type);
connect(traceDialog, &CalibrationTraceDialog::triggerMeasurement, this, &VNA::StartCalibrationMeasurement); connect(traceDialog, &CalibrationTraceDialog::triggerMeasurements, this, &VNA::StartCalibrationMeasurements);
connect(traceDialog, &CalibrationTraceDialog::applyCalibration, this, &VNA::ApplyCalibration); connect(traceDialog, &CalibrationTraceDialog::applyCalibration, this, &VNA::ApplyCalibration);
connect(this, &VNA::CalibrationMeasurementComplete, traceDialog, &CalibrationTraceDialog::measurementComplete); connect(this, &VNA::CalibrationMeasurementsComplete, traceDialog, &CalibrationTraceDialog::measurementsComplete);
connect(traceDialog, &CalibrationTraceDialog::calibrationInvalidated, [=](){ connect(traceDialog, &CalibrationTraceDialog::calibrationInvalidated, [=](){
DisableCalibration(true); DisableCalibration(true);
InformationBox::ShowMessageBlocking("Calibration disabled", "The currently active calibration is no longer supported by the available measurements and was disabled."); InformationBox::ShowMessageBlocking("Calibration disabled", "The currently active calibration is no longer supported by the available measurements and was disabled.");

View File

@ -77,11 +77,11 @@ private slots:
// Calibration // Calibration
void DisableCalibration(bool force = false); void DisableCalibration(bool force = false);
void ApplyCalibration(Calibration::Type type); void ApplyCalibration(Calibration::Type type);
void StartCalibrationMeasurement(Calibration::Measurement m); void StartCalibrationMeasurements(std::set<Calibration::Measurement> m);
signals: signals:
void CalibrationMeasurementComplete(Calibration::Measurement m); void CalibrationMeasurementsComplete(std::set<Calibration::Measurement> m);
void graphColorsChanged(); void graphColorsChanged();
private: private:
@ -109,7 +109,7 @@ private:
Calibration cal; Calibration cal;
bool calValid; bool calValid;
bool calEdited; bool calEdited;
Calibration::Measurement calMeasurement; std::set<Calibration::Measurement> calMeasurements;
bool calMeasuring; bool calMeasuring;
bool calWaitFirst; bool calWaitFirst;
QProgressDialog calDialog; QProgressDialog calDialog;