diff --git a/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/librevnadriver.cpp b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/librevnadriver.cpp index a51ba48..bae9d11 100644 --- a/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/librevnadriver.cpp +++ b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/librevnadriver.cpp @@ -3,6 +3,7 @@ #include "manualcontroldialogV1.h" #include "manualcontroldialogvff.h" #include "manualcontroldialogvfe.h" +#include "manualcontroldialogvfd.h" #include "deviceconfigurationdialogv1.h" #include "deviceconfigurationdialogvff.h" #include "deviceconfigurationdialogvfe.h" @@ -108,6 +109,13 @@ public: } }; +static_assert(offsetof(Protocol::ManualControl, VFD.SourceFrequency) == 0, "Error"); +static_assert(offsetof(Protocol::ManualControl, VFD.LOFrequency) == 13, "Error"); +static_assert(offsetof(Protocol::ManualControl, VFD.DACFreqA) == 21, "Error"); +static_assert(offsetof(Protocol::ManualControl, VFD.DACFreqB) == 25, "Error"); +static_assert(offsetof(Protocol::ManualControl, VFD.DACAmpA) == 29, "Error"); +static_assert(offsetof(Protocol::ManualControl, VFD.DACAmpB) == 31, "Error"); + LibreVNADriver::LibreVNADriver() { connected = false; @@ -127,6 +135,9 @@ LibreVNADriver::LibreVNADriver() case 1: manualControlDialog = new ManualControlDialogV1(*this); break; + case 0xFD: + manualControlDialog = new ManualControlDialogVFD(*this); + break; case 0xFE: manualControlDialog = new ManualControlDialogVFE(*this); break; diff --git a/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.cpp b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.cpp new file mode 100644 index 0000000..ccc1dbc --- /dev/null +++ b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.cpp @@ -0,0 +1,141 @@ +#include "manualcontroldialogVFD.h" + +#include "ui_manualcontroldialogVFD.h" +#include "Util/util.h" + +#include +#include +#include +#include + + +using namespace std; + +ManualControlDialogVFD::ManualControlDialogVFD(LibreVNADriver &dev, QWidget *parent) : + QDialog(parent), + ui(new Ui::ManualControlDialogVFD), + dev(dev) +{ + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + emit dev.acquireControl(); + + ui->SourceFrequency->setUnit("Hz"); + ui->SourceFrequency->setPrefixes(" MG"); + ui->SourceFrequency->setPrecision(6); + ui->SourceFrequency->setValueQuiet(1000000000); + + ui->LOFrequency->setUnit("Hz"); + ui->LOFrequency->setPrefixes(" MG"); + ui->LOFrequency->setPrecision(6); + ui->LOFrequency->setValueQuiet(1000000000); + + ui->DACFrequencyA->setUnit("Hz"); + ui->DACFrequencyA->setPrefixes(" kM"); + ui->DACFrequencyA->setPrecision(6); + ui->DACFrequencyA->setValueQuiet(1000000); + + ui->DACFrequencyB->setUnit("Hz"); + ui->DACFrequencyB->setPrefixes(" kM"); + ui->DACFrequencyB->setPrecision(6); + ui->DACFrequencyB->setValueQuiet(1000000); + + ui->DACAmplitudeA->setValue(2047); + ui->DACAmplitudeB->setValue(2047); + + auto updateVariableAtt = [=](unsigned int value){ + ui->SourceVariableAttSlider->setValue(value); + ui->SourceVariableAttEntry->setValueQuiet(value); + UpdateDevice(); + }; + connect(ui->SourceVariableAttEntry, &SIUnitEdit::valueChanged, this, [=](double newval){ + updateVariableAtt(newval); + }); + connect(ui->SourceVariableAttSlider, &QSlider::sliderMoved, this, [=](int pos){ + updateVariableAtt(pos); + }); + + // Readonly widgets + auto MakeReadOnly = [](QWidget* w) { + w->setAttribute(Qt::WA_TransparentForMouseEvents); + w->setFocusPolicy(Qt::NoFocus); + }; + 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); + + connect(ui->SourceCE, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->SourceRFEN, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->LOCE, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->LORFEN, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->SourceModEn, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->SourceAmp1En, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->SourceAmp2En, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->LOAmpEn, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + connect(ui->DACEnable, &QCheckBox::toggled, [=](bool) { UpdateDevice(); }); + + connect(ui->SourceFilter, qOverload(&QComboBox::activated), [=](int) { UpdateDevice(); }); + connect(ui->SourceBandsel, qOverload(&QComboBox::activated), [=](int) { UpdateDevice(); }); + connect(ui->SourcePortSel, qOverload(&QComboBox::activated), [=](int) { UpdateDevice(); }); + connect(ui->LOMode, qOverload(&QComboBox::activated), [=](int) { UpdateDevice(); }); + + connect(ui->SourceFrequency, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); }); + connect(ui->LOFrequency, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); }); + connect(ui->DACFrequencyA, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); }); + connect(ui->DACFrequencyB, &SIUnitEdit::valueChanged, [=](double) { UpdateDevice(); }); + + connect(ui->SourceStepAtt, qOverload(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); }); + connect(ui->DACAmplitudeA, qOverload(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); }); + connect(ui->DACAmplitudeB, qOverload(&QSpinBox::valueChanged), [=](int) { UpdateDevice(); }); + + UpdateDevice(); +} + +ManualControlDialogVFD::~ManualControlDialogVFD() +{ + emit dev.releaseControl(); + delete ui; +} + +void ManualControlDialogVFD::UpdateDevice() +{ + Protocol::PacketInfo p; + p.type = Protocol::PacketType::ManualControl; + auto &m = p.manual.VFD; + // Source + m.SourceFrequency = ui->SourceFrequency->value(); + m.SourceCE = ui->SourceCE->isChecked(); + m.SourceRFEN = ui->SourceRFEN->isChecked(); + m.SourceModEn = ui->SourceModEn->isChecked(); + m.SourceAmp1En = ui->SourceAmp1En->isChecked(); + m.SourceAmp2En = ui->SourceAmp2En->isChecked(); + m.SourceBandSel = ui->SourceBandsel->currentIndex(); + m.SourceFilter = ui->SourceFilter->currentIndex(); + m.SourceVariableAttenuator = ui->SourceVariableAttSlider->value(); + m.SourceStepAttenuator = ui->SourceStepAtt->value(); + m.SourcePortSel = ui->SourcePortSel->currentIndex(); + + // LO + m.LOCE = ui->LOCE->isChecked(); + m.LORFEN = ui->LOCE->isChecked(); + m.LOAmplifierEN = ui->LOAmpEn->isChecked(); + m.LOMode = ui->LOMode->currentIndex(); + m.LOFrequency = ui->LOFrequency->value(); + + // DAC + m.DACFreqA = ui->DACFrequencyA->value(); + m.DACFreqB = ui->DACFrequencyB->value(); + m.DACAmpA = ui->DACAmplitudeA->value(); + m.DACAmpB = ui->DACAmplitudeB->value(); + m.DACEn = ui->DACEnable->isChecked(); + + qDebug() << "Updating manual control state"; + + dev.SendPacket(p); +} diff --git a/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.h b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.h new file mode 100644 index 0000000..750aea3 --- /dev/null +++ b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.h @@ -0,0 +1,77 @@ +#ifndef MANUALCONTROLDIALOGVFD_H +#define MANUALCONTROLDIALOGVFD_H + +#include "librevnadriver.h" + +#include +#include + +namespace Ui { +class ManualControlDialogVFD; +} + +class ManualControlDialogVFD : public QDialog +{ + Q_OBJECT + +public: + explicit ManualControlDialogVFD(LibreVNADriver &dev, QWidget *parent = nullptr); + ~ManualControlDialogVFD(); + + void setHighSourceChipEnable(bool enable); + bool getHighSourceChipEnable(); + void setHighSourceRFEnable(bool enable); + bool getHighSourceRFEnable(); + bool getHighSourceLocked(); + bool setHighSourcePower(int dBm); + int getHighSourcePower(); + void setHighSourceFrequency(double f); + double getHighSourceFrequency(); + + enum class LPF { + M947, + M1880, + M3500, + None, + }; + + void setHighSourceLPF(LPF lpf); + LPF getHighSourceLPF(); + void setLowSourceEnable(bool enable); + bool getLowSourceEnable(); + bool setLowSourcePower(int mA); + int getLowSourcePower(); + void setLowSourceFrequency(double f); + double getLowSourceFrequency(); + void setHighband(bool high); + bool getHighband(); + void setAttenuator(double att); + double getAttenuator(); + void setAmplifierEnable(bool enable); + bool getAmplifierEnable(); + bool setPortSwitch(int port); + int getPortSwitch(); + void setLO1ChipEnable(bool enable); + bool getLO1ChipEnable(); + void setLO1RFEnable(bool enable); + bool getLO1RFEnable(); + bool getLO1Locked(); + void setLO1Frequency(double f); + double getLO1Frequency(); + void setIF1Frequency(double f); + double getIF1Frequency(); + void setLO2Enable(bool enable); + bool getLO2Enable(); + void setLO2Frequency(double f); + double getLO2Frequency(); + void setIF2Frequency(double f); + double getIF2Frequency(); + + +private: + void UpdateDevice(); + Ui::ManualControlDialogVFD *ui; + LibreVNADriver &dev; +}; + +#endif // MANUALCONTROLDIALOGV1_H diff --git a/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.ui b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.ui new file mode 100644 index 0000000..aba8701 --- /dev/null +++ b/Software/PC_Application/LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.ui @@ -0,0 +1,439 @@ + + + ManualControlDialogVFD + + + Qt::ApplicationModal + + + + 0 + 0 + 640 + 453 + + + + Manual Control + + + + + + Signal Generation + + + + + + Source + + + + + + Modulator: + + + + + + + + + + + + + + Filter: + + + + + + + + 81 MHz + + + + + 130 MHz + + + + + 213 MHz + + + + + 345 MHz + + + + + 550 MHz + + + + + 910 MHz + + + + + 1480 MHz + + + + + 2370 MHz + + + + + 3840 MHz + + + + + 6200 MHz + + + + + + + + Step Attenuator: + + + + + + + 31 + + + + + + + Variable Attenuator: + + + + + + + + + 1023 + + + Qt::Horizontal + + + + + + + + + + + + Amplifier 1: + + + + + + + + + + + + + + Amplifier 2: + + + + + + + + + + + + + + + + + Frequency: + + + + + + + Band Selection: + + + + + + + + HF + + + + + LF + + + + + LF -20 dBm + + + + + LF -40 dBm + + + + + + + + true + + + Locked + + + + + + + RF Enable + + + + + + + Chip Enable + + + + + + + Port Selection: + + + + + + + + Off + + + + + Port 1 + + + + + Port 2 + + + + + + + + + + + + + LO PLL + + + + + + Frequency: + + + + + + + + + + Mode: + + + + + + + + Internal - HF + + + + + Internal -LF + + + + + External + + + + + + + + true + + + Locked + + + + + + + RF Enable + + + + + + + Chip Enable + + + + + + + Amplifier: + + + + + + + + + + + + + + + + + DAC + + + + + + Enabled: + + + + + + + + + + + + + + Output A Frequency: + + + + + + + + + + Output A Amplitude: + + + + + + + 2047 + + + + + + + Output A Frequency: + + + + + + + + + + Output A Amplitude: + + + + + + + 2047 + + + + + + + + + + + + + + + + SIUnitEdit + QLineEdit +
CustomWidgets/siunitedit.h
+
+
+ + +
diff --git a/Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.pro b/Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.pro index b677201..c0643ab 100644 --- a/Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.pro +++ b/Software/PC_Application/LibreVNA-GUI/LibreVNA-GUI.pro @@ -34,6 +34,7 @@ HEADERS += \ Device/LibreVNA/librevnatcpdriver.h \ Device/LibreVNA/librevnausbdriver.h \ Device/LibreVNA/manualcontroldialogV1.h \ + Device/LibreVNA/manualcontroldialogvfd.h \ Device/LibreVNA/manualcontroldialogvfe.h \ Device/LibreVNA/manualcontroldialogvff.h \ Device/LibreVNA/receivercaldialog.h \ @@ -199,6 +200,7 @@ SOURCES += \ Device/LibreVNA/librevnatcpdriver.cpp \ Device/LibreVNA/librevnausbdriver.cpp \ Device/LibreVNA/manualcontroldialogV1.cpp \ + Device/LibreVNA/manualcontroldialogvfd.cpp \ Device/LibreVNA/manualcontroldialogvfe.cpp \ Device/LibreVNA/manualcontroldialogvff.cpp \ Device/LibreVNA/receivercaldialog.cpp \ @@ -359,6 +361,7 @@ FORMS += \ Device/LibreVNA/frequencycaldialog.ui \ Device/LibreVNA/librevnadriversettingswidget.ui \ Device/LibreVNA/manualcontroldialogV1.ui \ + Device/LibreVNA/manualcontroldialogvfd.ui \ Device/LibreVNA/manualcontroldialogvfe.ui \ Device/LibreVNA/manualcontroldialogvff.ui \ Device/devicelog.ui \ diff --git a/Software/PC_Application/LibreVNA-Test/LibreVNA-Test.pro b/Software/PC_Application/LibreVNA-Test/LibreVNA-Test.pro index 9c25927..2787bea 100644 --- a/Software/PC_Application/LibreVNA-Test/LibreVNA-Test.pro +++ b/Software/PC_Application/LibreVNA-Test/LibreVNA-Test.pro @@ -35,6 +35,7 @@ SOURCES += \ ../LibreVNA-GUI/Device/LibreVNA/librevnatcpdriver.cpp \ ../LibreVNA-GUI/Device/LibreVNA/librevnausbdriver.cpp \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogV1.cpp \ + ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.cpp \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfe.cpp \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvff.cpp \ ../LibreVNA-GUI/Device/LibreVNA/receivercaldialog.cpp \ @@ -221,6 +222,7 @@ HEADERS += \ ../LibreVNA-GUI/Device/LibreVNA/librevnatcpdriver.h \ ../LibreVNA-GUI/Device/LibreVNA/librevnausbdriver.h \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogV1.h \ + ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.h \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfe.h \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvff.h \ ../LibreVNA-GUI/Device/LibreVNA/receivercaldialog.h \ @@ -392,6 +394,7 @@ FORMS += \ ../LibreVNA-GUI/Device/LibreVNA/librevnadriversettingswidget.ui \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogV1.ui \ ../LibreVNA-GUI/Device/LibreVNA/Compound/compounddeviceeditdialog.ui \ + ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfd.ui \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvfe.ui \ ../LibreVNA-GUI/Device/LibreVNA/manualcontroldialogvff.ui \ ../LibreVNA-GUI/Device/devicelog.ui \ diff --git a/Software/PC_Application/LibreVNA-Test/target_wrapper.bat b/Software/PC_Application/LibreVNA-Test/target_wrapper.bat index 9c0c213..f9d74e2 100644 --- a/Software/PC_Application/LibreVNA-Test/target_wrapper.bat +++ b/Software/PC_Application/LibreVNA-Test/target_wrapper.bat @@ -1,10 +1,10 @@ @echo off SetLocal EnableDelayedExpansion -(set PATH=C:\Qt\6.2.4\mingw_64\bin;!PATH!) +(set PATH=C:\Qt\6.8.0\mingw_64\bin;!PATH!) if defined QT_PLUGIN_PATH ( - set QT_PLUGIN_PATH=C:\Qt\6.2.4\mingw_64\plugins;!QT_PLUGIN_PATH! + set QT_PLUGIN_PATH=C:\Qt\6.8.0\mingw_64\plugins;!QT_PLUGIN_PATH! ) else ( - set QT_PLUGIN_PATH=C:\Qt\6.2.4\mingw_64\plugins + set QT_PLUGIN_PATH=C:\Qt\6.8.0\mingw_64\plugins ) %* EndLocal diff --git a/Software/VNA_embedded/Application/Communication/Protocol.hpp b/Software/VNA_embedded/Application/Communication/Protocol.hpp index 8f92a77..5feaa6f 100644 --- a/Software/VNA_embedded/Application/Communication/Protocol.hpp +++ b/Software/VNA_embedded/Application/Communication/Protocol.hpp @@ -320,6 +320,38 @@ using ManualControl = struct _manualControl { uint32_t Samples; uint8_t WindowType :2; } V1; + struct { + uint64_t SourceFrequency; + + uint8_t SourceCE :1; + uint8_t SourceRFEN :1; + uint8_t SourceModEn :1; + uint8_t SourceAmp1En :1; + uint8_t SourceAmp2En :1; + uint8_t SourceBandSel :2; + uint8_t DACEn :1; + + uint16_t SourceFilter :4; + uint16_t SourceVariableAttenuator :10; + uint16_t SourcePortSel :2; + + uint8_t SourceStepAttenuator :5; + + uint8_t LOCE :1; + uint8_t LORFEN :1; + uint8_t LOAmplifierEN :1; + + uint8_t LOMode :2; + uint8_t padding1 :6; + + uint64_t LOFrequency; + + // DAC + uint32_t DACFreqA; + uint32_t DACFreqB; + uint16_t DACAmpA; + uint16_t DACAmpB; + } VFD; struct { // Source uint8_t SourceCE :1;