LibreVNA/Software/PC_Application/CustomWidgets/csvimport.cpp
2022-06-22 23:50:21 +02:00

148 lines
3.7 KiB
C++

#include "csvimport.h"
#include "ui_csvimport.h"
#include "Traces/trace.h"
#include <QFileDialog>
#include <QDebug>
CSVImport::CSVImport(QWidget *parent) :
QWidget(parent),
ui(new Ui::csvimport),
status(false)
{
ui->setupUi(this);
ui->from->setPrecision(5);
ui->to->setPrecision(5);
ui->traces->setPrecision(0);
ui->points->setPrecision(0);
connect(ui->file, &QLineEdit::textChanged, this, &CSVImport::setFile);
}
CSVImport::~CSVImport()
{
delete ui;
}
bool CSVImport::getStatus()
{
return status;
}
CSV CSVImport::getCSV()
{
return csv;
}
QString CSVImport::getFilename()
{
return ui->file->text();
}
bool CSVImport::fillTrace(Trace &t)
{
try {
t.fillFromCSV(csv, ui->traceSelector->currentIndex());
return true;
} catch (const std::exception &e) {
qWarning() << QString("CSV import failed to fill trace: ") + e.what();
return false;
}
}
void CSVImport::setFile(QString filename)
{
ui->file->setText(filename);
evaluateFile();
emit filenameChanged(filename);
}
void CSVImport::selectTrace(unsigned int index)
{
ui->traceSelector->setCurrentIndex(index);
}
void CSVImport::on_browse_clicked()
{
auto filename = QFileDialog::getOpenFileName(nullptr, "Open measurement file", "", "CSV files (*.csv)", nullptr, QFileDialog::DontUseNativeDialog);
if (filename.length() > 0) {
ui->file->setText(filename);
evaluateFile();
}
}
void CSVImport::evaluateFile()
{
// store currently selected trace
auto selectedTrace = ui->traceSelector->currentText();
bool new_status = false;
ui->traces->setText("");
ui->points->setText("");
ui->from->setText("");
ui->to->setText("");
ui->status->clear();
ui->traceSelector->clear();
try {
csv = CSV::fromFile(ui->file->text());
auto domain = Trace::dataTypeFromString(csv.getHeader(0));
if (domain == Trace::DataType::Invalid) {
// just assume frequency domain
domain = Trace::DataType::Frequency;
}
ui->domain->setCurrentText(Trace::dataTypeToString(domain));
switch(domain) {
case Trace::DataType::Frequency:
ui->from->setUnit("Hz");
ui->to->setUnit("Hz");
break;
case Trace::DataType::Time:
case Trace::DataType::TimeZeroSpan:
ui->from->setUnit("s");
ui->to->setUnit("s");
break;
case Trace::DataType::Power:
ui->from->setUnit("dBm");
ui->to->setUnit("dBm");
break;
default:
break;
}
auto xvalues = csv.getColumn(0);
ui->from->setValue(xvalues.front());
ui->to->setValue(xvalues.back());
ui->points->setValue(xvalues.size());
bool okay = true;
int numTraces = 0;
while(okay) {
try {
Trace t;
auto name = t.fillFromCSV(csv, numTraces);
ui->traceSelector->addItem(name);
numTraces++;
} catch (const std::exception &e) {
// no more traces
okay = false;
}
}
ui->traces->setValue(numTraces);
// check if previously selected trace is still available
if(ui->traceSelector->findText(selectedTrace) >= 0) {
ui->traceSelector->setCurrentText(selectedTrace);
} else {
ui->traceSelector->setCurrentIndex(0);
}
new_status = true;
} catch (const std::exception &e) {
ui->status->setText(e.what());
}
if (new_status != status) {
status = new_status;
emit statusChanged(status);
}
emit filenameChanged(ui->file->text());
}