diff --git a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp index f585482..e0d1733 100644 --- a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp +++ b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp @@ -57,6 +57,8 @@ SpectrumAnalyzer::SpectrumAnalyzer(AppWindow *window) normalize.points = 0; normalize.dialog.reset(); + traceModel.setSource(TraceModel::DataSource::SA); + // Create default traces auto tPort1 = new Trace("Port1", Qt::yellow); tPort1->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::Port1); diff --git a/Software/PC_Application/Traces/tracemodel.cpp b/Software/PC_Application/Traces/tracemodel.cpp index 78f293f..ac4a387 100644 --- a/Software/PC_Application/Traces/tracemodel.cpp +++ b/Software/PC_Application/Traces/tracemodel.cpp @@ -9,6 +9,7 @@ TraceModel::TraceModel(QObject *parent) : QAbstractTableModel(parent) { traces.clear(); + source = DataSource::Unknown; } TraceModel::~TraceModel() @@ -208,6 +209,7 @@ void TraceModel::clearLiveData() void TraceModel::addVNAData(const Protocol::Datapoint &d, TraceMath::DataType datatype) { + source = DataSource::VNA; for(auto t : traces) { if (t->isLive() && !t->isPaused()) { 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) { + source = DataSource::SA; for(auto t : traces) { if (t->isLive() && !t->isPaused()) { 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 { return markerModel; diff --git a/Software/PC_Application/Traces/tracemodel.h b/Software/PC_Application/Traces/tracemodel.h index 4017c4d..f55d3c2 100644 --- a/Software/PC_Application/Traces/tracemodel.h +++ b/Software/PC_Application/Traces/tracemodel.h @@ -25,6 +25,12 @@ public: ColIndexLast, }; + enum class DataSource { + VNA, + SA, + Unknown, + }; + void addTrace(Trace *t); void removeTrace(unsigned int index); Trace *trace(unsigned int index); @@ -46,6 +52,9 @@ public: MarkerModel *getMarkerModel() const; void setMarkerModel(MarkerModel *value); + DataSource getSource() const; + void setSource(const DataSource &value); + signals: void SpanChanged(double fmin, double fmax); void traceAdded(Trace *t); @@ -59,6 +68,7 @@ public slots: void addSAData(const Protocol::SpectrumAnalyzerResult& d, const Protocol::SpectrumAnalyzerSettings& settings); private: + DataSource source; std::vector traces; MarkerModel *markerModel; }; diff --git a/Software/PC_Application/Traces/traceplot.cpp b/Software/PC_Application/Traces/traceplot.cpp index 609b03f..add37bb 100644 --- a/Software/PC_Application/Traces/traceplot.cpp +++ b/Software/PC_Application/Traces/traceplot.cpp @@ -466,6 +466,11 @@ void TracePlot::markerRemoved(Marker *m) triggerReplot(); } +TraceModel &TracePlot::getModel() const +{ + return model; +} + void TracePlot::updateGraphColors() { replot(); diff --git a/Software/PC_Application/Traces/traceplot.h b/Software/PC_Application/Traces/traceplot.h index 557b987..1c0de54 100644 --- a/Software/PC_Application/Traces/traceplot.h +++ b/Software/PC_Application/Traces/traceplot.h @@ -29,6 +29,8 @@ public: static std::set getPlots(); + TraceModel &getModel() const; + public slots: void updateGraphColors(); diff --git a/Software/PC_Application/Traces/tracexyplot.cpp b/Software/PC_Application/Traces/tracexyplot.cpp index 22673b0..fc067a4 100644 --- a/Software/PC_Application/Traces/tracexyplot.cpp +++ b/Software/PC_Application/Traces/tracexyplot.cpp @@ -342,7 +342,7 @@ void TraceXYPlot::draw(QPainter &p) { auto pref = Preferences::getInstance(); - constexpr int yAxisSpace = 50; + constexpr int yAxisSpace = 55; constexpr int yAxisDisabledSpace = 10; constexpr int xAxisSpace = 30; auto w = p.window(); @@ -1227,18 +1227,27 @@ QString TraceXYPlot::mouseText(QPoint pos) QString TraceXYPlot::AxisUnit(TraceXYPlot::YAxisType type) { - switch(type) { - case TraceXYPlot::YAxisType::Magnitude: return "dB"; - case TraceXYPlot::YAxisType::Phase: return "°"; - case TraceXYPlot::YAxisType::UnwrappedPhase: return "°"; - case TraceXYPlot::YAxisType::VSWR: return ""; - case TraceXYPlot::YAxisType::ImpulseReal: return ""; - case TraceXYPlot::YAxisType::ImpulseMag: return "dB"; - case TraceXYPlot::YAxisType::Step: return ""; - case TraceXYPlot::YAxisType::Impedance: return "Ohm"; - case TraceXYPlot::YAxisType::GroupDelay: return "s"; - default: return ""; + auto source = model.getSource(); + if(source == TraceModel::DataSource::VNA) { + switch(type) { + case TraceXYPlot::YAxisType::Magnitude: return "dB"; + case TraceXYPlot::YAxisType::Phase: return "°"; + case TraceXYPlot::YAxisType::UnwrappedPhase: return "°"; + case TraceXYPlot::YAxisType::VSWR: return ""; + case TraceXYPlot::YAxisType::ImpulseReal: return ""; + case TraceXYPlot::YAxisType::ImpulseMag: return "dB"; + case TraceXYPlot::YAxisType::Step: 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) diff --git a/Software/PC_Application/Traces/tracexyplot.h b/Software/PC_Application/Traces/tracexyplot.h index 8d6e0cb..a93276b 100644 --- a/Software/PC_Application/Traces/tracexyplot.h +++ b/Software/PC_Application/Traces/tracexyplot.h @@ -78,9 +78,9 @@ private: static QString AxisTypeToName(YAxisType type); static QString AxisTypeToName(XAxisType type); static QString AxisModeToName(XAxisMode mode); - XAxisType XAxisTypeFromName(QString name); - YAxisType YAxisTypeFromName(QString name); - XAxisMode AxisModeFromName(QString name); + static XAxisType XAxisTypeFromName(QString name); + static YAxisType YAxisTypeFromName(QString name); + static XAxisMode AxisModeFromName(QString name); void enableTraceAxis(Trace *t, int axis, bool enabled); bool domainMatch(Trace *t); bool supported(Trace *t) override; @@ -94,7 +94,7 @@ private: void traceDropped(Trace *t, QPoint position) override; QString mouseText(QPoint pos) override; - static QString AxisUnit(YAxisType type); + QString AxisUnit(YAxisType type); static QString AxisUnit(XAxisType type); std::set tracesAxis[2]; diff --git a/Software/PC_Application/Traces/xyplotaxisdialog.cpp b/Software/PC_Application/Traces/xyplotaxisdialog.cpp index 0ff6f74..b6ead55 100644 --- a/Software/PC_Application/Traces/xyplotaxisdialog.cpp +++ b/Software/PC_Application/Traces/xyplotaxisdialog.cpp @@ -6,6 +6,13 @@ using namespace std; +static void enableComboBoxItem(QComboBox *cb, int itemNum, bool enable) { + auto *model = qobject_cast(cb->model()); + auto item = model->item(itemNum); + item->setFlags(enable ? item->flags() | Qt::ItemIsEnabled + : item->flags() & ~Qt::ItemIsEnabled); +} + XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : QDialog(nullptr), ui(new Ui::XYplotAxisDialog), @@ -26,8 +33,17 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : ui->XType->addItem(TraceXYPlot::AxisTypeToName((TraceXYPlot::XAxisType) i)); } + if(plot->getModel().getSource() == TraceModel::DataSource::SA) { + for(int i=0;iXType->count();i++) { + auto xtype = TraceXYPlot::XAxisTypeFromName(ui->XType->itemText(i)); + if(!isSupported(xtype)) { + enableComboBoxItem(ui->XType, i, false); + } + } + } + // Setup GUI connections - connect(ui->Y1type, qOverload(&QComboBox::currentIndexChanged), [this](int index) { + connect(ui->Y1type, qOverload(&QComboBox::currentIndexChanged), [=](int index) { //ui->Y1log->setEnabled(index != 0); ui->Y1linear->setEnabled(index != 0); ui->Y1auto->setEnabled(index != 0); @@ -36,7 +52,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : ui->Y1max->setEnabled(index != 0 && !autoRange); ui->Y1divs->setEnabled(index != 0 && !autoRange); auto type = (TraceXYPlot::YAxisType) index; - QString unit = TraceXYPlot::AxisUnit(type); + QString unit = plot->AxisUnit(type); ui->Y1min->setUnit(unit); ui->Y1max->setUnit(unit); ui->Y1divs->setUnit(unit); @@ -47,7 +63,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : ui->Y1divs->setEnabled(!checked); }); - connect(ui->Y2type, qOverload(&QComboBox::currentIndexChanged), [this](int index) { + connect(ui->Y2type, qOverload(&QComboBox::currentIndexChanged), [=](int index) { //ui->Y2log->setEnabled(index != 0); ui->Y2linear->setEnabled(index != 0); ui->Y2auto->setEnabled(index != 0); @@ -56,7 +72,7 @@ XYplotAxisDialog::XYplotAxisDialog(TraceXYPlot *plot) : ui->Y2max->setEnabled(index != 0 && !autoRange); ui->Y2divs->setEnabled(index != 0 && !autoRange); auto type = (TraceXYPlot::YAxisType) index; - QString unit = TraceXYPlot::AxisUnit(type); + QString unit = plot->AxisUnit(type); ui->Y2min->setUnit(unit); ui->Y2max->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()); } -static void enableComboBoxItem(QComboBox *cb, int itemNum, bool enable) { - auto *model = qobject_cast(cb->model()); - auto item = model->item(itemNum); - item->setFlags(enable ? item->flags() | Qt::ItemIsEnabled - : item->flags() & ~Qt::ItemIsEnabled); -} - void XYplotAxisDialog::XAxisTypeChanged(int XAxisIndex) { auto type = (TraceXYPlot::XAxisType) XAxisIndex; @@ -199,31 +208,58 @@ void XYplotAxisDialog::XAxisTypeChanged(int XAxisIndex) std::set XYplotAxisDialog::supportedYAxis(TraceXYPlot::XAxisType type) { set ret = {TraceXYPlot::YAxisType::Disabled}; - switch(type) { - case TraceXYPlot::XAxisType::Frequency: - case TraceXYPlot::XAxisType::Power: - ret.insert(TraceXYPlot::YAxisType::Magnitude); - ret.insert(TraceXYPlot::YAxisType::Phase); - ret.insert(TraceXYPlot::YAxisType::UnwrappedPhase); - ret.insert(TraceXYPlot::YAxisType::VSWR); - ret.insert(TraceXYPlot::YAxisType::Real); - ret.insert(TraceXYPlot::YAxisType::Imaginary); - ret.insert(TraceXYPlot::YAxisType::SeriesR); - ret.insert(TraceXYPlot::YAxisType::Reactance); - ret.insert(TraceXYPlot::YAxisType::Capacitance); - ret.insert(TraceXYPlot::YAxisType::Inductance); - ret.insert(TraceXYPlot::YAxisType::QualityFactor); - ret.insert(TraceXYPlot::YAxisType::GroupDelay); - break; - case TraceXYPlot::XAxisType::Time: - case TraceXYPlot::XAxisType::Distance: - ret.insert(TraceXYPlot::YAxisType::ImpulseReal); - ret.insert(TraceXYPlot::YAxisType::ImpulseMag); - ret.insert(TraceXYPlot::YAxisType::Step); - ret.insert(TraceXYPlot::YAxisType::Impedance); - break; - default: - break; + auto source = plot->getModel().getSource(); + if(source == TraceModel::DataSource::VNA) { + switch(type) { + case TraceXYPlot::XAxisType::Frequency: + case TraceXYPlot::XAxisType::Power: + ret.insert(TraceXYPlot::YAxisType::Magnitude); + ret.insert(TraceXYPlot::YAxisType::Phase); + ret.insert(TraceXYPlot::YAxisType::UnwrappedPhase); + ret.insert(TraceXYPlot::YAxisType::VSWR); + ret.insert(TraceXYPlot::YAxisType::Real); + ret.insert(TraceXYPlot::YAxisType::Imaginary); + ret.insert(TraceXYPlot::YAxisType::SeriesR); + ret.insert(TraceXYPlot::YAxisType::Reactance); + ret.insert(TraceXYPlot::YAxisType::Capacitance); + ret.insert(TraceXYPlot::YAxisType::Inductance); + ret.insert(TraceXYPlot::YAxisType::QualityFactor); + ret.insert(TraceXYPlot::YAxisType::GroupDelay); + break; + case TraceXYPlot::XAxisType::Time: + case TraceXYPlot::XAxisType::Distance: + ret.insert(TraceXYPlot::YAxisType::ImpulseReal); + ret.insert(TraceXYPlot::YAxisType::ImpulseMag); + ret.insert(TraceXYPlot::YAxisType::Step); + ret.insert(TraceXYPlot::YAxisType::Impedance); + 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; } + +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; +} diff --git a/Software/PC_Application/Traces/xyplotaxisdialog.h b/Software/PC_Application/Traces/xyplotaxisdialog.h index 8daa8df..db2c944 100644 --- a/Software/PC_Application/Traces/xyplotaxisdialog.h +++ b/Software/PC_Application/Traces/xyplotaxisdialog.h @@ -23,6 +23,7 @@ private slots: private: std::set supportedYAxis(TraceXYPlot::XAxisType type); + bool isSupported(TraceXYPlot::XAxisType type); Ui::XYplotAxisDialog *ui; TraceXYPlot *plot; }; diff --git a/Software/PC_Application/VNA/vna.cpp b/Software/PC_Application/VNA/vna.cpp index 2479103..7fd032b 100644 --- a/Software/PC_Application/VNA/vna.cpp +++ b/Software/PC_Application/VNA/vna.cpp @@ -64,6 +64,8 @@ VNA::VNA(AppWindow *window) calEdited = false; settings.sweepType = SweepType::Frequency; + traceModel.setSource(TraceModel::DataSource::VNA); + // Create default traces auto tS11 = new Trace("S11", Qt::yellow); tS11->fromLivedata(Trace::LivedataType::Overwrite, Trace::LiveParameter::S11);