WIP: ADC spectrum

This commit is contained in:
Jan Käberich 2025-05-19 16:50:24 +02:00
parent f76e3a209d
commit be7cf38e05
9 changed files with 861 additions and 575 deletions

View file

@ -146,7 +146,7 @@ LibreVNADriver::LibreVNADriver()
break;
}
if(manualControlDialog) {
manualControlDialog->show();
manualControlDialog->showMaximized();
connect(manualControlDialog, &QDialog::finished, this, [=](){
manualControlDialog = nullptr;
});

View file

@ -6,6 +6,7 @@
#include <QComboBox>
#include <QDebug>
#include <QButtonGroup>
#include <QValueAxis>
#include <complex>
@ -18,6 +19,7 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
setWindowFlags(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
emit dev.acquireControl();
@ -44,6 +46,8 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
ui->DACAmplitudeA->setValue(2047);
ui->DACAmplitudeB->setValue(2047);
ui->ADCSamples->setValue(1024);
auto updateVariableAtt = [=](unsigned int value){
ui->SourceVariableAttSlider->setValue(value);
ui->SourceVariableAttEntry->setValueQuiet(value);
@ -64,11 +68,38 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
MakeReadOnly(ui->SourceLocked);
MakeReadOnly(ui->LOLocked);
// connect(&dev, &LibreVNADriver::receivedPacket, this, [=](const Protocol::PacketInfo &p){
// if(p.type == Protocol::PacketType::ManualStatus) {
// NewStatus(p.manualStatus);
// }
// }, Qt::QueuedConnection);
// ADC spectrum charts
for(int i=0;i<4;i++) {
charts[i] = new QChart();
spectrumSeries[i] = new QLineSeries;
auto pen = spectrumSeries[i]->pen();
pen.setWidth(2);
pen.setBrush(QBrush("blue"));
spectrumSeries[i]->setPen(pen);
auto xAxis = new QValueAxis;
xAxis->setTitleText("Frequency [MHz]");
xAxis->setRange(0,12.5);
auto yAxis = new QValueAxis;
yAxis->setTitleText("Amplitude [dBFS]");
yAxis->setRange(-120, 0);
charts[i]->legend()->hide();
charts[i]->addSeries(spectrumSeries[i]);
charts[i]->addAxis(xAxis, Qt::AlignBottom);
charts[i]->addAxis(yAxis, Qt::AlignLeft);
spectrumSeries[i]->attachAxis(xAxis);
spectrumSeries[i]->attachAxis(yAxis);
}
ui->spectrumA->setChart(charts[0]);
charts[0]->setTitle("ADC A Spectrum");
ui->spectrumB->setChart(charts[1]);
charts[1]->setTitle("ADC B Spectrum");
ui->spectrumC->setChart(charts[2]);
charts[2]->setTitle("ADC C Spectrum");
ui->spectrumD->setChart(charts[3]);
charts[3]->setTitle("ADC D Spectrum");
connect(ui->SourceCE, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
connect(ui->SourceRFEN, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
@ -79,11 +110,13 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
connect(ui->SourceAmp2En, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
connect(ui->LOAmpEn, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
connect(ui->DACEnable, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
connect(ui->ADCEnable, &QCheckBox::toggled, [=](bool) { UpdateDevice(); });
connect(ui->SourceFilter, qOverload<int>(&QComboBox::currentIndexChanged), [=](int) { UpdateDevice(); });
connect(ui->SourceBandsel, qOverload<int>(&QComboBox::currentIndexChanged), [=](int) { UpdateDevice(); });
connect(ui->SourcePortSel, qOverload<int>(&QComboBox::currentIndexChanged), [=](int) { UpdateDevice(); });
connect(ui->LOMode, qOverload<int>(&QComboBox::currentIndexChanged), [=](int) { UpdateDevice(); });
connect(ui->ADCTestPattern, qOverload<int>(&QComboBox::currentIndexChanged), [=](int) { UpdateDevice(); });
connect(ui->SourceFrequency, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); });
connect(ui->LOFrequency, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); });
@ -93,6 +126,7 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
connect(ui->SourceStepAtt, qOverload<int>(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); });
connect(ui->DACAmplitudeA, qOverload<int>(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); });
connect(ui->DACAmplitudeB, qOverload<int>(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); });
connect(ui->ADCSamples, qOverload<int>(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); });
// Create the SCPI commands
@ -333,6 +367,47 @@ ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *par
addDoubleManualSetting("MANual:DACB_FREQ", &ManualControlDialogVFD::setDACBFrequency, &ManualControlDialogVFD::getDACBFrequency);
addIntegerManualSetting("MANual:DACB_AMPlitude", &ManualControlDialogVFD::setDACBAmplitude, &ManualControlDialogVFD::getDACBAmplitude);
addBooleanManualSetting("MANual:ADC_EN", &ManualControlDialogVFD::setADCEnable, &ManualControlDialogVFD::getADCEnable);
addIntegerManualSetting("MANual:ADC_SAMPLES", &ManualControlDialogVFD::setADCSamples, &ManualControlDialogVFD::getADCSamples);
addIntegerManualSetting("MANual:ADC_TESTPATTERN", &ManualControlDialogVFD::setADCTestPattern, &ManualControlDialogVFD::getADCTestPattern);
connect(&dev, &LibreVNADriver::receivedPacket, this, [=](const Protocol::PacketInfo &p){
if(p.type == Protocol::PacketType::ArrayData) {
// incoming spectrum data
const Protocol::ArrayData data = p.arrayData;
int index = 0;
auto series = spectrumSeries[data.id];
auto chart = charts[data.id];
chart->removeSeries(series);
// qDebug() << "Incoming spectrum data";
for(unsigned int i=0;i<data.values/2;i++) {
auto freq = data.xbegin + (data.xend - data.xbegin) * i / (data.values/2);
freq /= 1000000; // convert to MHz
auto d = std::complex<double>(data.data[i*2], data.data[i*2+1]);
auto dB = 20*log10(abs(d));
auto point = QPointF(freq, dB);
// get index at which this point should be inserted
while(index < series->count() && series->at(index).x() < freq) {
index++;
}
// qDebug() << "point at" << freq <<": " << dB << "(index:" << index << ")";
if(index >= series->count()) {
// append at the end
series->append(point);
} else if(freq == series->at(index).x()) {
// replace existing point
series->replace(index, point);
} else {
// insert at position
series->insert(index, point);
}
}
chart->addSeries(series);
series->attachAxis(chart->axes(Qt::Horizontal)[0]);
series->attachAxis(chart->axes(Qt::Vertical)[0]);
}
}, Qt::QueuedConnection);
for(auto c : commands) {
emit dev.addSCPICommand(c);
}
@ -627,6 +702,36 @@ int ManualControlDialogVFD::getDACBAmplitude()
return ui->DACAmplitudeB->value();
}
void ManualControlDialogVFD::setADCEnable(bool enable)
{
ui->ADCEnable->setChecked(enable);
}
bool ManualControlDialogVFD::getADCEnable()
{
return ui->ADCEnable->isChecked();
}
void ManualControlDialogVFD::setADCSamples(int samples)
{
ui->ADCSamples->setValue(samples);
}
int ManualControlDialogVFD::getADCSamples()
{
return ui->ADCSamples->value();
}
void ManualControlDialogVFD::setADCTestPattern(int tp)
{
ui->ADCTestPattern->setCurrentIndex(tp);
}
int ManualControlDialogVFD::getADCTestPattern()
{
return ui->ADCTestPattern->currentIndex();
}
void ManualControlDialogVFD::UpdateDevice()
{
Protocol::PacketInfo p;
@ -659,6 +764,11 @@ void ManualControlDialogVFD::UpdateDevice()
m.DACAmpB = ui->DACAmplitudeB->value();
m.DACEn = ui->DACEnable->isChecked();
// ADC
m.ADCEn = ui->ADCEnable->isChecked();
m.ADCSamples = ui->ADCSamples->value();
m.ADCTestPattern = ui->ADCTestPattern->currentIndex();
qDebug() << "Updating manual control state";
dev.SendPacket(p);

View file

@ -4,6 +4,8 @@
#include "librevnadriver.h"
#include <QDialog>
#include <QChart>
#include <QLineSeries>
#include <complex>
namespace Ui {
@ -106,12 +108,24 @@ public:
void setDACBAmplitude(int a);
int getDACBAmplitude();
void setADCEnable(bool enable);
bool getADCEnable();
void setADCSamples(int samples);
int getADCSamples();
void setADCTestPattern(int tp);
int getADCTestPattern();
private:
void UpdateDevice();
Ui::ManualControlDialogVFD *ui;
LibreVNADriver &dev;
std::vector<SCPICommand*> commands;
std::array<QChart*, 4> charts;
std::array<QLineSeries*, 4> spectrumSeries;
};
#endif // MANUALCONTROLDIALOGV1_H

View file

@ -9,20 +9,20 @@
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>453</height>
<width>1270</width>
<height>827</height>
</rect>
</property>
<property name="windowTitle">
<string>Manual Control</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,1">
<item>
<widget class="QGroupBox" name="groupBox_10">
<property name="title">
<string>Signal Generation</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
@ -265,162 +265,292 @@
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>LO PLL</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Frequency:</string>
</property>
</widget>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>DAC</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Enabled:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="DACEnable">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Output A Frequency:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="SIUnitEdit" name="DACFrequencyA"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Output A Amplitude:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="DACAmplitudeA">
<property name="maximum">
<number>2047</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Output A Frequency:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="SIUnitEdit" name="DACFrequencyB"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Output A Amplitude:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="DACAmplitudeB">
<property name="maximum">
<number>2047</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>LO PLL</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Frequency:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="SIUnitEdit" name="LOFrequency"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Mode:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="LOMode">
<item>
<property name="text">
<string>Internal - HF</string>
</property>
</item>
<item row="3" column="1">
<widget class="SIUnitEdit" name="LOFrequency"/>
<item>
<property name="text">
<string>Internal -LF</string>
</property>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Mode:</string>
</property>
</widget>
<item>
<property name="text">
<string>External</string>
</property>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="LOMode">
<item>
<property name="text">
<string>Internal - HF</string>
</property>
</item>
<item>
<property name="text">
<string>Internal -LF</string>
</property>
</item>
<item>
<property name="text">
<string>External</string>
</property>
</item>
</widget>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="LOLocked">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Locked</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="LORFEN">
<property name="text">
<string>RF Enable</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="LOCE">
<property name="text">
<string>Chip Enable</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Amplifier:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="LOAmpEn">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_4">
<property name="title">
<string>Data Acquisition</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox_6">
<property name="title">
<string>Spectrum View</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QChartView" name="spectrumA"/>
</item>
<item row="0" column="1">
<widget class="QChartView" name="spectrumB"/>
</item>
<item row="1" column="0">
<widget class="QChartView" name="spectrumC"/>
</item>
<item row="1" column="1">
<widget class="QChartView" name="spectrumD"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_5">
<property name="title">
<string>Settings</string>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>ADC Enable:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="ADCEnable">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Samples:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="ADCSamples">
<property name="minimum">
<number>16</number>
</property>
<property name="maximum">
<number>131072</number>
</property>
<property name="singleStep">
<number>16</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Testpattern:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="ADCTestPattern">
<item>
<property name="text">
<string>Off</string>
</property>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="LOLocked">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Locked</string>
</property>
</widget>
<item>
<property name="text">
<string>Zeros</string>
</property>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="LORFEN">
<property name="text">
<string>RF Enable</string>
</property>
</widget>
<item>
<property name="text">
<string>Ones</string>
</property>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="LOCE">
<property name="text">
<string>Chip Enable</string>
</property>
</widget>
<item>
<property name="text">
<string>Toggle</string>
</property>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Amplifier:</string>
</property>
</widget>
<item>
<property name="text">
<string>Ramp</string>
</property>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="LOAmpEn">
<property name="text">
<string/>
</property>
</widget>
<item>
<property name="text">
<string>Custom</string>
</property>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>DAC</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Enabled:</string>
</property>
</widget>
<item>
<property name="text">
<string>Deskew</string>
</property>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="DACEnable">
<property name="text">
<string/>
</property>
</widget>
<item>
<property name="text">
<string>Reserved</string>
</property>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Output A Frequency:</string>
</property>
</widget>
<item>
<property name="text">
<string>PRBS</string>
</property>
</item>
<item row="1" column="1">
<widget class="SIUnitEdit" name="DACFrequencyA"/>
<item>
<property name="text">
<string>Sine</string>
</property>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Output A Amplitude:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="DACAmplitudeA">
<property name="maximum">
<number>2047</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Output A Frequency:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="SIUnitEdit" name="DACFrequencyB"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>Output A Amplitude:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="DACAmplitudeB">
<property name="maximum">
<number>2047</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
@ -433,6 +563,11 @@
<extends>QLineEdit</extends>
<header>CustomWidgets/siunitedit.h</header>
</customwidget>
<customwidget>
<class>QChartView</class>
<extends>QGraphicsView</extends>
<header>QtCharts</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View file

@ -330,7 +330,7 @@ mac{
PKGCONFIG += libusb-1.0
}
QT += widgets network
QT += widgets network charts
FORMS += \
Calibration/CalStandardLineEditDialog.ui \