restrict SA graph options, show dBm instead dB

This commit is contained in:
Jan Käberich 2022-01-30 17:40:46 +01:00
parent b2ed124240
commit 0c782fc009
10 changed files with 132 additions and 52 deletions

View File

@ -57,6 +57,8 @@ SpectrumAnalyzer::SpectrumAnalyzer(AppWindow *window)
normalize.points = 0; normalize.points = 0;
normalize.dialog.reset(); normalize.dialog.reset();
traceModel.setSource(TraceModel::DataSource::SA);
// Create default traces // Create default traces
auto tPort1 = new Trace("Port1", Qt::yellow); auto tPort1 = new Trace("Port1", Qt::yellow);
tPort1->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::Port1); tPort1->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::Port1);

View File

@ -9,6 +9,7 @@ TraceModel::TraceModel(QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
{ {
traces.clear(); traces.clear();
source = DataSource::Unknown;
} }
TraceModel::~TraceModel() TraceModel::~TraceModel()
@ -208,6 +209,7 @@ void TraceModel::clearLiveData()
void TraceModel::addVNAData(const Protocol::Datapoint &d, TraceMath::DataType datatype) void TraceModel::addVNAData(const Protocol::Datapoint &d, TraceMath::DataType datatype)
{ {
source = DataSource::VNA;
for(auto t : traces) { for(auto t : traces) {
if (t->isLive() && !t->isPaused()) { if (t->isLive() && !t->isPaused()) {
Trace::Data td; Trace::Data td;
@ -238,6 +240,7 @@ void TraceModel::addVNAData(const Protocol::Datapoint &d, TraceMath::DataType da
void TraceModel::addSAData(const Protocol::SpectrumAnalyzerResult& d, const Protocol::SpectrumAnalyzerSettings& settings) void TraceModel::addSAData(const Protocol::SpectrumAnalyzerResult& d, const Protocol::SpectrumAnalyzerSettings& settings)
{ {
source = DataSource::SA;
for(auto t : traces) { for(auto t : traces) {
if (t->isLive() && !t->isPaused()) { if (t->isLive() && !t->isPaused()) {
Trace::Data td; Trace::Data td;
@ -254,6 +257,16 @@ void TraceModel::addSAData(const Protocol::SpectrumAnalyzerResult& d, const Prot
} }
} }
TraceModel::DataSource TraceModel::getSource() const
{
return source;
}
void TraceModel::setSource(const DataSource &value)
{
source = value;
}
MarkerModel *TraceModel::getMarkerModel() const MarkerModel *TraceModel::getMarkerModel() const
{ {
return markerModel; return markerModel;

View File

@ -25,6 +25,12 @@ public:
ColIndexLast, ColIndexLast,
}; };
enum class DataSource {
VNA,
SA,
Unknown,
};
void addTrace(Trace *t); void addTrace(Trace *t);
void removeTrace(unsigned int index); void removeTrace(unsigned int index);
Trace *trace(unsigned int index); Trace *trace(unsigned int index);
@ -46,6 +52,9 @@ public:
MarkerModel *getMarkerModel() const; MarkerModel *getMarkerModel() const;
void setMarkerModel(MarkerModel *value); void setMarkerModel(MarkerModel *value);
DataSource getSource() const;
void setSource(const DataSource &value);
signals: signals:
void SpanChanged(double fmin, double fmax); void SpanChanged(double fmin, double fmax);
void traceAdded(Trace *t); void traceAdded(Trace *t);
@ -59,6 +68,7 @@ public slots:
void addSAData(const Protocol::SpectrumAnalyzerResult& d, const Protocol::SpectrumAnalyzerSettings& settings); void addSAData(const Protocol::SpectrumAnalyzerResult& d, const Protocol::SpectrumAnalyzerSettings& settings);
private: private:
DataSource source;
std::vector<Trace*> traces; std::vector<Trace*> traces;
MarkerModel *markerModel; MarkerModel *markerModel;
}; };

View File

@ -466,6 +466,11 @@ void TracePlot::markerRemoved(Marker *m)
triggerReplot(); triggerReplot();
} }
TraceModel &TracePlot::getModel() const
{
return model;
}
void TracePlot::updateGraphColors() void TracePlot::updateGraphColors()
{ {
replot(); replot();

View File

@ -29,6 +29,8 @@ public:
static std::set<TracePlot *> getPlots(); static std::set<TracePlot *> getPlots();
TraceModel &getModel() const;
public slots: public slots:
void updateGraphColors(); void updateGraphColors();

View File

@ -342,7 +342,7 @@ void TraceXYPlot::draw(QPainter &p)
{ {
auto pref = Preferences::getInstance(); auto pref = Preferences::getInstance();
constexpr int yAxisSpace = 50; constexpr int yAxisSpace = 55;
constexpr int yAxisDisabledSpace = 10; constexpr int yAxisDisabledSpace = 10;
constexpr int xAxisSpace = 30; constexpr int xAxisSpace = 30;
auto w = p.window(); auto w = p.window();
@ -1227,18 +1227,27 @@ QString TraceXYPlot::mouseText(QPoint pos)
QString TraceXYPlot::AxisUnit(TraceXYPlot::YAxisType type) QString TraceXYPlot::AxisUnit(TraceXYPlot::YAxisType type)
{ {
switch(type) { auto source = model.getSource();
case TraceXYPlot::YAxisType::Magnitude: return "dB"; if(source == TraceModel::DataSource::VNA) {
case TraceXYPlot::YAxisType::Phase: return "°"; switch(type) {
case TraceXYPlot::YAxisType::UnwrappedPhase: return "°"; case TraceXYPlot::YAxisType::Magnitude: return "dB";
case TraceXYPlot::YAxisType::VSWR: return ""; case TraceXYPlot::YAxisType::Phase: return "°";
case TraceXYPlot::YAxisType::ImpulseReal: return ""; case TraceXYPlot::YAxisType::UnwrappedPhase: return "°";
case TraceXYPlot::YAxisType::ImpulseMag: return "dB"; case TraceXYPlot::YAxisType::VSWR: return "";
case TraceXYPlot::YAxisType::Step: return ""; case TraceXYPlot::YAxisType::ImpulseReal: return "";
case TraceXYPlot::YAxisType::Impedance: return "Ohm"; case TraceXYPlot::YAxisType::ImpulseMag: return "dB";
case TraceXYPlot::YAxisType::GroupDelay: return "s"; case TraceXYPlot::YAxisType::Step: return "";
default: return ""; case TraceXYPlot::YAxisType::Impedance: return "Ohm";
case TraceXYPlot::YAxisType::GroupDelay: return "s";
default: return "";
}
} else if(source == TraceModel::DataSource::SA) {
switch(type) {
case TraceXYPlot::YAxisType::Magnitude: return "dBm";
default: return "";
}
} }
return "";
} }
QString TraceXYPlot::AxisUnit(TraceXYPlot::XAxisType type) QString TraceXYPlot::AxisUnit(TraceXYPlot::XAxisType type)

View File

@ -78,9 +78,9 @@ private:
static QString AxisTypeToName(YAxisType type); static QString AxisTypeToName(YAxisType type);
static QString AxisTypeToName(XAxisType type); static QString AxisTypeToName(XAxisType type);
static QString AxisModeToName(XAxisMode mode); static QString AxisModeToName(XAxisMode mode);
XAxisType XAxisTypeFromName(QString name); static XAxisType XAxisTypeFromName(QString name);
YAxisType YAxisTypeFromName(QString name); static YAxisType YAxisTypeFromName(QString name);
XAxisMode AxisModeFromName(QString name); static XAxisMode AxisModeFromName(QString name);
void enableTraceAxis(Trace *t, int axis, bool enabled); void enableTraceAxis(Trace *t, int axis, bool enabled);
bool domainMatch(Trace *t); bool domainMatch(Trace *t);
bool supported(Trace *t) override; bool supported(Trace *t) override;
@ -94,7 +94,7 @@ private:
void traceDropped(Trace *t, QPoint position) override; void traceDropped(Trace *t, QPoint position) override;
QString mouseText(QPoint pos) override; QString mouseText(QPoint pos) override;
static QString AxisUnit(YAxisType type); QString AxisUnit(YAxisType type);
static QString AxisUnit(XAxisType type); static QString AxisUnit(XAxisType type);
std::set<Trace*> tracesAxis[2]; std::set<Trace*> tracesAxis[2];

View File

@ -6,6 +6,13 @@
using namespace std; using namespace std;
static void enableComboBoxItem(QComboBox *cb, int itemNum, bool enable) {
auto *model = qobject_cast<QStandardItemModel *>(cb->model());
auto item = model->item(itemNum);
item->setFlags(enable ? item->flags() | Qt::ItemIsEnabled
: item->flags() & ~Qt::ItemIsEnabled);
}
XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
QDialog(nullptr), QDialog(nullptr),
ui(new Ui::XYplotAxisDialog), ui(new Ui::XYplotAxisDialog),
@ -26,8 +33,17 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
ui->XType->addItem(TraceXYPlot::AxisTypeToName((TraceXYPlot::XAxisType) i)); ui->XType->addItem(TraceXYPlot::AxisTypeToName((TraceXYPlot::XAxisType) i));
} }
if(plot->getModel().getSource() == TraceModel::DataSource::SA) {
for(int i=0;i<ui->XType->count();i++) {
auto xtype = TraceXYPlot::XAxisTypeFromName(ui->XType->itemText(i));
if(!isSupported(xtype)) {
enableComboBoxItem(ui->XType, i, false);
}
}
}
// Setup GUI connections // Setup GUI connections
connect(ui->Y1type, qOverload<int>(&QComboBox::currentIndexChanged), [this](int index) { connect(ui->Y1type, qOverload<int>(&QComboBox::currentIndexChanged), [=](int index) {
//ui->Y1log->setEnabled(index != 0); //ui->Y1log->setEnabled(index != 0);
ui->Y1linear->setEnabled(index != 0); ui->Y1linear->setEnabled(index != 0);
ui->Y1auto->setEnabled(index != 0); ui->Y1auto->setEnabled(index != 0);
@ -36,7 +52,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
ui->Y1max->setEnabled(index != 0 && !autoRange); ui->Y1max->setEnabled(index != 0 && !autoRange);
ui->Y1divs->setEnabled(index != 0 && !autoRange); ui->Y1divs->setEnabled(index != 0 && !autoRange);
auto type = (TraceXYPlot::YAxisType) index; auto type = (TraceXYPlot::YAxisType) index;
QString unit = TraceXYPlot::AxisUnit(type); QString unit = plot->AxisUnit(type);
ui->Y1min->setUnit(unit); ui->Y1min->setUnit(unit);
ui->Y1max->setUnit(unit); ui->Y1max->setUnit(unit);
ui->Y1divs->setUnit(unit); ui->Y1divs->setUnit(unit);
@ -47,7 +63,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
ui->Y1divs->setEnabled(!checked); ui->Y1divs->setEnabled(!checked);
}); });
connect(ui->Y2type, qOverload<int>(&QComboBox::currentIndexChanged), [this](int index) { connect(ui->Y2type, qOverload<int>(&QComboBox::currentIndexChanged), [=](int index) {
//ui->Y2log->setEnabled(index != 0); //ui->Y2log->setEnabled(index != 0);
ui->Y2linear->setEnabled(index != 0); ui->Y2linear->setEnabled(index != 0);
ui->Y2auto->setEnabled(index != 0); ui->Y2auto->setEnabled(index != 0);
@ -56,7 +72,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) :
ui->Y2max->setEnabled(index != 0 && !autoRange); ui->Y2max->setEnabled(index != 0 && !autoRange);
ui->Y2divs->setEnabled(index != 0 && !autoRange); ui->Y2divs->setEnabled(index != 0 && !autoRange);
auto type = (TraceXYPlot::YAxisType) index; auto type = (TraceXYPlot::YAxisType) index;
QString unit = TraceXYPlot::AxisUnit(type); QString unit = plot->AxisUnit(type);
ui->Y2min->setUnit(unit); ui->Y2min->setUnit(unit);
ui->Y2max->setUnit(unit); ui->Y2max->setUnit(unit);
ui->Y2divs->setUnit(unit); ui->Y2divs->setUnit(unit);
@ -148,13 +164,6 @@ void XYplotAxisDialog::on_buttonBox_accepted()
plot->setXAxis((TraceXYPlot::XAxisType) ui->XType->currentIndex(), mode, ui->Xlog->isChecked(), ui->Xmin->value(), ui->Xmax->value(), ui->Xdivs->value()); plot->setXAxis((TraceXYPlot::XAxisType) ui->XType->currentIndex(), mode, ui->Xlog->isChecked(), ui->Xmin->value(), ui->Xmax->value(), ui->Xdivs->value());
} }
static void enableComboBoxItem(QComboBox *cb, int itemNum, bool enable) {
auto *model = qobject_cast<QStandardItemModel *>(cb->model());
auto item = model->item(itemNum);
item->setFlags(enable ? item->flags() | Qt::ItemIsEnabled
: item->flags() & ~Qt::ItemIsEnabled);
}
void XYplotAxisDialog::XAxisTypeChanged(int XAxisIndex) void XYplotAxisDialog::XAxisTypeChanged(int XAxisIndex)
{ {
auto type = (TraceXYPlot::XAxisType) XAxisIndex; auto type = (TraceXYPlot::XAxisType) XAxisIndex;
@ -199,31 +208,58 @@ void XYplotAxisDialog::XAxisTypeChanged(int XAxisIndex)
std::set<TraceXYPlot::YAxisType> XYplotAxisDialog::supportedYAxis(TraceXYPlot::XAxisType type) std::set<TraceXYPlot::YAxisType> XYplotAxisDialog::supportedYAxis(TraceXYPlot::XAxisType type)
{ {
set<TraceXYPlot::YAxisType> ret = {TraceXYPlot::YAxisType::Disabled}; set<TraceXYPlot::YAxisType> ret = {TraceXYPlot::YAxisType::Disabled};
switch(type) { auto source = plot->getModel().getSource();
case TraceXYPlot::XAxisType::Frequency: if(source == TraceModel::DataSource::VNA) {
case TraceXYPlot::XAxisType::Power: switch(type) {
ret.insert(TraceXYPlot::YAxisType::Magnitude); case TraceXYPlot::XAxisType::Frequency:
ret.insert(TraceXYPlot::YAxisType::Phase); case TraceXYPlot::XAxisType::Power:
ret.insert(TraceXYPlot::YAxisType::UnwrappedPhase); ret.insert(TraceXYPlot::YAxisType::Magnitude);
ret.insert(TraceXYPlot::YAxisType::VSWR); ret.insert(TraceXYPlot::YAxisType::Phase);
ret.insert(TraceXYPlot::YAxisType::Real); ret.insert(TraceXYPlot::YAxisType::UnwrappedPhase);
ret.insert(TraceXYPlot::YAxisType::Imaginary); ret.insert(TraceXYPlot::YAxisType::VSWR);
ret.insert(TraceXYPlot::YAxisType::SeriesR); ret.insert(TraceXYPlot::YAxisType::Real);
ret.insert(TraceXYPlot::YAxisType::Reactance); ret.insert(TraceXYPlot::YAxisType::Imaginary);
ret.insert(TraceXYPlot::YAxisType::Capacitance); ret.insert(TraceXYPlot::YAxisType::SeriesR);
ret.insert(TraceXYPlot::YAxisType::Inductance); ret.insert(TraceXYPlot::YAxisType::Reactance);
ret.insert(TraceXYPlot::YAxisType::QualityFactor); ret.insert(TraceXYPlot::YAxisType::Capacitance);
ret.insert(TraceXYPlot::YAxisType::GroupDelay); ret.insert(TraceXYPlot::YAxisType::Inductance);
break; ret.insert(TraceXYPlot::YAxisType::QualityFactor);
case TraceXYPlot::XAxisType::Time: ret.insert(TraceXYPlot::YAxisType::GroupDelay);
case TraceXYPlot::XAxisType::Distance: break;
ret.insert(TraceXYPlot::YAxisType::ImpulseReal); case TraceXYPlot::XAxisType::Time:
ret.insert(TraceXYPlot::YAxisType::ImpulseMag); case TraceXYPlot::XAxisType::Distance:
ret.insert(TraceXYPlot::YAxisType::Step); ret.insert(TraceXYPlot::YAxisType::ImpulseReal);
ret.insert(TraceXYPlot::YAxisType::Impedance); ret.insert(TraceXYPlot::YAxisType::ImpulseMag);
break; ret.insert(TraceXYPlot::YAxisType::Step);
default: ret.insert(TraceXYPlot::YAxisType::Impedance);
break; break;
default:
break;
}
} else if(source == TraceModel::DataSource::SA) {
switch(type) {
case TraceXYPlot::XAxisType::Frequency:
ret.insert(TraceXYPlot::YAxisType::Magnitude);
break;
default:
break;
}
} }
return ret; return ret;
} }
bool XYplotAxisDialog::isSupported(TraceXYPlot::XAxisType type)
{
auto source = plot->getModel().getSource();
if(source == TraceModel::DataSource::VNA) {
// all X axis types are supported
return true;
} else if(source == TraceModel::DataSource::SA) {
if (type == TraceXYPlot::XAxisType::Frequency) {
return true;
} else {
return false;
}
}
return false;
}

View File

@ -23,6 +23,7 @@ private slots:
private: private:
std::set<TraceXYPlot::YAxisType> supportedYAxis(TraceXYPlot::XAxisType type); std::set<TraceXYPlot::YAxisType> supportedYAxis(TraceXYPlot::XAxisType type);
bool isSupported(TraceXYPlot::XAxisType type);
Ui::XYplotAxisDialog *ui; Ui::XYplotAxisDialog *ui;
TraceXYPlot *plot; TraceXYPlot *plot;
}; };

View File

@ -64,6 +64,8 @@ VNA::VNA(AppWindow *window)
calEdited = false; calEdited = false;
settings.sweepType = SweepType::Frequency; settings.sweepType = SweepType::Frequency;
traceModel.setSource(TraceModel::DataSource::VNA);
// Create default traces // Create default traces
auto tS11 = new Trace("S11", Qt::yellow); auto tS11 = new Trace("S11", Qt::yellow);
tS11->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::S11); tS11->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::S11);