Added single sweep functionality

This commit is contained in:
Jan Käberich 2022-05-17 20:07:40 +02:00
parent 53dcff8745
commit d84d3e80aa
8 changed files with 124 additions and 11 deletions

View file

@ -1,4 +1,4 @@
#include "vna.h"
#include "vna.h"
#include "unit.h"
#include "CustomWidgets/toggleswitch.h"
@ -58,6 +58,7 @@ VNA::VNA(AppWindow *window, QString name)
central(new TileWidget(traceModel))
{
averages = 1;
singleSweep = false;
calValid = false;
calMeasuring = false;
calWaitFirst = false;
@ -257,6 +258,13 @@ VNA::VNA(AppWindow *window, QString name)
cbSweepType->addItem("Power");
tb_sweep->addWidget(cbSweepType);
auto bSingle = new QPushButton("Single");
bSingle->setToolTip("Single sweep");
bSingle->setCheckable(true);
connect(bSingle, &QPushButton::toggled, this, &VNA::SetSingleSweep);
connect(this, &VNA::singleSweepChanged, bSingle, &QPushButton::setChecked);
tb_sweep->addWidget(bSingle);
auto eStart = new SIUnitEdit("Hz", " kMG", 6);
// calculate width required with expected string length
auto width = QFontMetrics(eStart->font()).width("3.00000GHz") + 15;
@ -719,6 +727,7 @@ nlohmann::json VNA::toJSON()
freq["power"] = settings.Freq.excitation_power;
freq["log"] = settings.Freq.logSweep;
sweep["frequency"] = freq;
sweep["single"] = singleSweep;
nlohmann::json power;
power["start"] = settings.Power.start;
power["stop"] = settings.Power.stop;
@ -782,6 +791,7 @@ void VNA::fromJSON(nlohmann::json j)
type = SweepType::Frequency;
}
SetSweepType(type);
SetSingleSweep(sweep.value("single", singleSweep));
}
}
@ -799,6 +809,14 @@ void VNA::NewDatapoint(Protocol::Datapoint d)
return;
}
if(singleSweep && average.getLevel() == averages) {
changingSettings = true;
// single sweep finished
window->getDevice()->SetIdle([=](Device::TransmissionResult){
changingSettings = false;
});
}
bool needsSegmentUpdate = false;
if (settings.segments > 1) {
// using multiple segments, adjust pointNum
@ -1377,6 +1395,17 @@ void VNA::SetupSCPI()
scpi_acq->add(new SCPICommand("LIMit", nullptr, [=](QStringList) -> QString {
return central->allLimitsPassing() ? "PASS" : "FAIL";
}));
scpi_acq->add(new SCPICommand("SINGLE", [=](QStringList params) -> QString {
bool single;
if(!SCPI::paramToBool(params, 0, single)) {
return "ERROR";
} else {
SetSingleSweep(single);
return "";
}
}, [=](QStringList) -> QString {
return singleSweep ? "TRUE" : "FALSE";
}));
auto scpi_stim = new SCPINode("STIMulus");
SCPINode::add(scpi_stim);
scpi_stim->add(new SCPICommand("LVL", [=](QStringList params) -> QString {
@ -1627,6 +1656,15 @@ void VNA::UpdateStatusbar()
}
}
void VNA::SetSingleSweep(bool single)
{
if(singleSweep != single) {
singleSweep = single;
emit singleSweepChanged(single);
}
SettingsChanged();
}
bool VNA::LoadCalibration(QString filename)
{
cal.openFromFile(filename);

View file

@ -123,6 +123,7 @@ private:
private slots:
void EnableDeembedding(bool enable);
void UpdateStatusbar();
void SetSingleSweep(bool single);
private:
Settings settings;
unsigned int averages;
@ -130,6 +131,7 @@ private:
TraceWidget *traceWidget;
MarkerModel *markerModel;
Averaging average;
bool singleSweep;
// Calibration
Calibration cal;
@ -167,6 +169,7 @@ signals:
void centerFreqChanged(double freq);
void spanChanged(double span);
void logSweepChanged(bool log);
void singleSweepChanged(bool single);
void sourceLevelChanged(double level);
void pointsChanged(unsigned int points);