LibreVNA/Software/PC_Application/CustomWidgets/touchstoneimport.cpp
2020-08-30 22:03:41 +02:00

186 lines
5.5 KiB
C++

#include "touchstoneimport.h"
#include "ui_touchstoneimport.h"
#include <QFileDialog>
#include <QDebug>
#include <QtGlobal>
using namespace std;
TouchstoneImport::TouchstoneImport(QWidget *parent, int ports) :
QWidget(parent),
ui(new Ui::TouchstoneImport),
touchstone(ports),
status(false)
{
ui->setupUi(this);
connect(ui->browse, &QPushButton::clicked, this, &TouchstoneImport::evaluateFile);
ui->port1Group->setId(ui->port1_1, 0);
ui->port1Group->setId(ui->port1_2, 1);
ui->port1Group->setId(ui->port1_3, 2);
ui->port1Group->setId(ui->port1_4, 3);
ui->port2Group->setId(ui->port2_1, 0);
ui->port2Group->setId(ui->port2_2, 1);
ui->port2Group->setId(ui->port2_3, 2);
ui->port2Group->setId(ui->port2_4, 3);
// prevent selection of same port for port1 and 2
connect(ui->port1Group, qOverload<int>(&QButtonGroup::buttonClicked), [=](int id) {
preventCollisionWithGroup(ui->port2Group, id);
});
connect(ui->port2Group, qOverload<int>(&QButtonGroup::buttonClicked), [=](int id) {
preventCollisionWithGroup(ui->port1Group, id);
});
setPorts(ports);
}
TouchstoneImport::~TouchstoneImport()
{
delete ui;
}
bool TouchstoneImport::getStatus()
{
return status;
}
Touchstone TouchstoneImport::getTouchstone()
{
if(required_ports == 1) {
auto t1 = touchstone;
t1.reduceTo1Port(ui->port1Group->checkedId());
return t1;
} else if(required_ports == 2) {
auto t2 = touchstone;
t2.reduceTo2Port(ui->port1Group->checkedId(), ui->port2Group->checkedId());
return t2;
}
return touchstone;
}
void TouchstoneImport::setPorts(int ports)
{
required_ports = ports;
ui->port1Widget->setVisible(ports >= 1);
ui->port2Widget->setVisible(ports >= 2);
}
QString TouchstoneImport::getFilename()
{
return ui->file->text();
}
void TouchstoneImport::selectPort(int destination, int source)
{
switch(destination) {
case 0:
ui->port1Group->button(source)->setChecked(true);
preventCollisionWithGroup(ui->port2Group, source);
break;
case 1:
ui->port2Group->button(source)->setChecked(true);
preventCollisionWithGroup(ui->port1Group, source);
break;
}
}
std::vector<int> TouchstoneImport::getPorts()
{
vector<int> ret;
if(required_ports >= 1) {
ret.push_back(ui->port1Group->checkedId());
}
if(required_ports >= 2) {
ret.push_back(ui->port2Group->checkedId());
}
return ret;
}
void TouchstoneImport::setFile(QString filename)
{
ui->file->setText(filename);
evaluateFile();
}
void TouchstoneImport::on_browse_clicked()
{
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "Touchstone files (*.s1p *.s2p *.s3p *.s4p)", nullptr, QFileDialog::DontUseNativeDialog);
if (filename.length() > 0) {
ui->file->setText(filename);
evaluateFile();
}
}
void TouchstoneImport::evaluateFile()
{
bool new_status = false;
ui->port1_1->setEnabled(false);
ui->port1_2->setEnabled(false);
ui->port1_3->setEnabled(false);
ui->port1_4->setEnabled(false);
if (required_ports != 1) {
ui->port2_1->setEnabled(false);
ui->port2_2->setEnabled(false);
ui->port2_3->setEnabled(false);
ui->port2_4->setEnabled(false);
}
ui->points->setText("");
ui->lowerFreq->setText("");
ui->upperFreq->setText("");
ui->status->clear();
try {
touchstone = Touchstone::fromFile(ui->file->text().toStdString());
if (required_ports > 0 && touchstone.ports() < (unsigned int) required_ports) {
throw runtime_error("Not enough ports in file");
}
ui->port1_1->setEnabled(touchstone.ports() >= 1);
ui->port1_2->setEnabled(touchstone.ports() >= 2);
ui->port1_3->setEnabled(touchstone.ports() >= 3);
ui->port1_4->setEnabled(touchstone.ports() >= 4);
if (required_ports != 1) {
ui->port2_1->setEnabled(touchstone.ports() >= 1);
ui->port2_2->setEnabled(touchstone.ports() >= 2);
ui->port2_3->setEnabled(touchstone.ports() >= 3);
ui->port2_4->setEnabled(touchstone.ports() >= 4);
}
ui->points->setText(QString::number(touchstone.points()));
ui->lowerFreq->setText(QString::number(touchstone.minFreq()));
ui->upperFreq->setText(QString::number(touchstone.maxFreq()));
if(ui->port1Group->checkedId() == -1 || !ui->port1Group->checkedButton()->isEnabled()) {
// no or invalid S parameter selected
ui->port1_1->setChecked(true);
}
if (required_ports != 1) {
preventCollisionWithGroup(ui->port2Group, 0);
}
new_status = true;
} catch (const exception &e) {
ui->status->setText(e.what());
}
if (new_status != status) {
status = new_status;
emit statusChanged(status);
}
emit filenameChanged(ui->file->text());
}
void TouchstoneImport::preventCollisionWithGroup(QButtonGroup *group, int id)
{
for(unsigned int i=0;i<touchstone.ports();i++) {
group->button(i)->setEnabled(true);
}
// change selection in second group and mark invalid
group->button(id)->setEnabled(false);
group->button(id)->setChecked(false);
if (group->checkedId() == -1 || group->checkedId() == id) {
for(int i=0;i<4;i++) {
if(i == id) {
continue;
}
if(group->button(i)->isEnabled()) {
group->button(i)->setChecked(true);
break;
}
}
}
}