LibreVNA/Software/PC_Application/LibreVNA-GUI/Tools/mixedmodeconversion.cpp
2023-03-01 10:34:54 +01:00

148 lines
5.7 KiB
C++

#include "mixedmodeconversion.h"
#include "ui_mixedmodeconversion.h"
#include <QPushButton>
MixedModeConversion::MixedModeConversion(TraceModel &m, QWidget *parent) :
QDialog(parent),
ui(new Ui::MixedModeConversion)
{
setAttribute(Qt::WA_DeleteOnClose);
ui->setupUi(this);
ui->selector->setModel(&m);
ui->selector->setPorts(4);
connect(ui->selector, qOverload<>(&TraceSetSelector::selectionChanged), this, &MixedModeConversion::selectionChanged);
connect(ui->prefix, &QLineEdit::textChanged, this, &MixedModeConversion::selectionChanged);
connect(ui->buttonBox->button(QDialogButtonBox::Ok), &QPushButton::clicked, this, [=](){
emit tracesCreated(traces);
accept();
});
connect(ui->buttonBox->button(QDialogButtonBox::Cancel), &QPushButton::clicked, this, &QDialog::reject);
selectionChanged();
}
MixedModeConversion::~MixedModeConversion()
{
delete ui;
}
void MixedModeConversion::selectionChanged()
{
for(auto t : traces) {
delete t;
}
traces.clear();
class Source {
public:
Source(TraceSetSelector *sel, QString name) {
this->name = name;
t = sel->getTrace(name.mid(1, 1).toUInt(), name.mid(2, 1).toUInt());
}
QString name;
Trace *t;
};
std::vector<Source> sources = {
Source(ui->selector, "S11"),
Source(ui->selector, "S12"),
Source(ui->selector, "S13"),
Source(ui->selector, "S14"),
Source(ui->selector, "S21"),
Source(ui->selector, "S22"),
Source(ui->selector, "S23"),
Source(ui->selector, "S24"),
Source(ui->selector, "S31"),
Source(ui->selector, "S32"),
Source(ui->selector, "S33"),
Source(ui->selector, "S34"),
Source(ui->selector, "S41"),
Source(ui->selector, "S42"),
Source(ui->selector, "S43"),
Source(ui->selector, "S44"),
};
class Destination {
public:
Destination(std::vector<Source> sources, QString name, QString formula, double reference_impedance)
{
this->name = name;
t = new Trace(name);
t->fromMath();
t->setMathFormula(formula);
t->setReferenceImpedance(reference_impedance);
// is a reflection trace if the last two chars in the name are the same
t->setReflection(name[name.size()-1] == name[name.size()-2]);
// add math sources
int index = 0;
while((index = formula.indexOf("S", index)) != -1) {
QString source = formula.mid(index, 3);
// find the source trace
bool sourceSet = false;
for(auto s : sources) {
if(!s.t) {
// not set, unable to use this source
continue;
}
if(s.name == source) {
if(t->addMathSource(s.t, s.name)) {
// added as source, exit loop
sourceSet = true;
break;
} else {
// failed to add
delete t;
t = nullptr;
return;
}
}
}
if(!sourceSet) {
// can't find this source
delete t;
t = nullptr;
return;
}
index++;
}
}
QString name;
Trace *t;
};
auto prefix = ui->prefix->text();
std::vector<Destination> destinations = {
Destination(sources, prefix+"SDD11", "0.5*(S11-S13-S31+S33)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDD12", "0.5*(S12-S14-S32+S34)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDD21", "0.5*(S21-S23-S41+S43)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDD22", "0.5*(S22-S24-S42+S44)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDC11", "0.5*(S11+S13-S31-S33)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDC12", "0.5*(S12+S14-S32-S34)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDC21", "0.5*(S21+S23-S41-S43)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SDC22", "0.5*(S22+S24-S42-S44)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCD11", "0.5*(S11-S13+S31-S33)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCD12", "0.5*(S12-S14+S32-S34)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCD21", "0.5*(S21-S23+S41-S43)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCD22", "0.5*(S22-S24+S42-S44)", 2*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCC11", "0.5*(S11+S13+S31+S33)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCC12", "0.5*(S12+S14+S32+S34)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCC21", "0.5*(S21+S23+S41+S43)", 0.5*ui->selector->getReferenceImpedance()),
Destination(sources, prefix+"SCC22", "0.5*(S22+S24+S42+S44)", 0.5*ui->selector->getReferenceImpedance()),
};
ui->list->clear();
for(auto d : destinations) {
if(d.t) {
traces.push_back(d.t);
ui->list->addItem(d.name);
}
}
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(traces.size() > 0);
}