AD9913/partial SI5332 support

This commit is contained in:
Jan Käberich 2021-05-29 17:02:13 +02:00
parent 58d42e5108
commit 34a24abb40
10 changed files with 4923 additions and 0 deletions

View file

@ -0,0 +1,225 @@
#include "ad9913.h"
#include "ui_ad9913widget.h"
#include "register.h"
AD9913::AD9913()
{
currentInput = nullptr;
addRegister(new Register("CFR1", 0, 32));
addRegister(new Register("CFR2", 1, 16));
addRegister(new Register("DAC Control", 2, 32));
addRegister(new Register("FTW", 3, 32));
addRegister(new Register("POW", 4, 16));
addRegister(new Register("Lin. Sweep Params", 6, 64));
addRegister(new Register("Lin. Sweep Deltas", 7, 64));
addRegister(new Register("Lin. Sweep Ramp", 8, 32));
addRegister(new Register("Profile 0", 9, 48));
addRegister(new Register("Profile 1", 10, 48));
addRegister(new Register("Profile 2", 11, 48));
addRegister(new Register("Profile 3", 12, 48));
addRegister(new Register("Profile 4", 13, 48));
addRegister(new Register("Profile 5", 14, 48));
addRegister(new Register("Profile 6", 15, 48));
addRegister(new Register("Profile 7", 16, 48));
ui = new Ui::AD9913Widget;
ui->setupUi(widget);
// CFR1
regs[0]->assignUI(ui->sineOutput, 0, 1);
regs[0]->assignUI(ui->autoclearPhaseAcc, 1);
regs[0]->assignUI(ui->autoclearAuxAcc, 2);
regs[0]->assignUI(ui->loadSSR, 3);
regs[0]->assignUI(ui->PD_input, 4);
regs[0]->assignUI(ui->PD_DAC, 5);
regs[0]->assignUI(ui->PD_digital, 6);
regs[0]->assignUI(ui->PD_EXT, 7);
regs[0]->assignUI(ui->linsweep_nodwell, 8);
regs[0]->assignUI(ui->linsweepActiveTrigger, 9, 1);
regs[0]->assignUI(ui->DCoutput, 10);
regs[0]->assignUI(ui->AuxAccEnable, 11);
regs[0]->assignUI(ui->Destination, 12, 2);
regs[0]->assignUI(ui->clearPhaseAcc, 14);
regs[0]->assignUI(ui->autoclearAuxAcc, 15);
regs[0]->assignUI(ui->directSwitchMode, 16);
regs[0]->assignUI(ui->syncClockDisable, 19);
regs[0]->assignUI(ui->InternalProfile, 20, 3);
regs[0]->assignUI(ui->LSBfirst, 23, 1);
regs[0]->assignUI(ui->matchPipelineDelays, 26);
regs[0]->assignUI(ui->UseInternalProfile, 27);
regs[0]->assignUI(ui->enableModulus, 28);
// CFR2
regs[1]->assignUI(ui->PLLlock, 0);
regs[1]->assignUI(ui->PLLreset, 1);
regs[1]->assignUI(ui->VCO2Sel, 2, 1);
regs[1]->assignUI(ui->PLLInputDivBy2, 3);
regs[1]->assignUI(ui->PLLLORange, 4, 1);
regs[1]->assignUI(ui->PLLPowerDown, 5);
regs[1]->assignUI(ui->ClockInputMode, 6, 2);
regs[1]->assignUI(ui->PLLMult, 9, 6);
regs[1]->assignUI(ui->PLLOutputDivBy2, 15);
regs[2]->assignUI(ui->FSC, 0, 10);
regs[3]->assignUI(ui->FreqTuneWord, 0, 32);
regs[4]->assignUI(ui->phaseOffset, 0, 14);
regs[5]->assignUI(ui->SweepParamWord0, 0, 32);
regs[5]->assignUI(ui->SweepParamWord1, 32, 32);
regs[6]->assignUI(ui->RisingDeltaWord, 0, 32);
regs[6]->assignUI(ui->FallingDeltaWord, 32, 32);
regs[7]->assignUI(ui->RisingRamp, 0, 16);
regs[7]->assignUI(ui->FallingRamp, 16, 16);
regs[8]->assignUI(ui->Profile0Freq, 0, 32);
regs[8]->assignUI(ui->Profil0Phase, 32, 14);
regs[9]->assignUI(ui->Profile1Freq, 0, 32);
regs[9]->assignUI(ui->Profil1Phase, 32, 14);
regs[10]->assignUI(ui->Profile2Freq, 0, 32);
regs[10]->assignUI(ui->Profil2Phase, 32, 14);
regs[11]->assignUI(ui->Profile3Freq, 0, 32);
regs[11]->assignUI(ui->Profil3Phase, 32, 14);
regs[12]->assignUI(ui->Profile4Freq, 0, 32);
regs[12]->assignUI(ui->Profil4Phase, 32, 14);
regs[13]->assignUI(ui->Profile5Freq, 0, 32);
regs[13]->assignUI(ui->Profil5Phase, 32, 14);
regs[14]->assignUI(ui->Profile6Freq, 0, 32);
regs[14]->assignUI(ui->Profil6Phase, 32, 14);
regs[15]->assignUI(ui->Profile7Freq, 0, 32);
regs[15]->assignUI(ui->Profil7Phase, 32, 14);
Register::fillTableWidget(ui->table, regs);
ui->ref->setPrefixes(" kMG");
ui->ref->setUnit("Hz");
ui->freqRef->setPrefixes(" kMG");
ui->freqRef->setUnit("Hz");
ui->freqDDS->setPrefixes(" kMG");
ui->freqDDS->setUnit("Hz");
QObject::connect(ui->cbRef, &QComboBox::currentTextChanged, [=](QString input){
SIUnitEdit *newInput = nullptr;
if(possibleInputs.count(input)) {
newInput = possibleInputs[input];
}
if(currentInput) {
QObject::disconnect(currentInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue);
ui->ref->setEnabled(true);
} else {
QObject::disconnect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue);
}
if(newInput) {
QObject::connect(newInput, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue);
ui->ref->setEnabled(false);
ui->freqRef->setValue(newInput->value());
} else {
QObject::connect(ui->ref, &SIUnitEdit::valueChanged, ui->freqRef, &SIUnitEdit::setValue);
ui->freqRef->setValue(ui->ref->value());
}
currentInput = newInput;
});
// user friendly frequency calculation connections
auto updateDDS = [=]() {
auto dds = ui->freqRef->value();
if(!ui->PLLPowerDown->isChecked()) {
// using the PLL
if(ui->PLLInputDivBy2->isChecked()) {
dds /= 2;
}
dds *= ui->PLLMult->currentText().toUInt();
if(ui->PLLOutputDivBy2->isChecked()) {
dds /= 2;
}
}
ui->freqDDS->setValue(dds);
bool valid = dds <= 250000000;
// check value and set background
QPalette palette;
palette.setColor(QPalette::Base,valid ? Qt::white : Qt::red);
ui->freqDDS->setPalette(palette);
};
QObject::connect(ui->freqRef, &SIUnitEdit::valueChanged, updateDDS);
QObject::connect(ui->PLLMult, qOverload<int>(&QComboBox::currentIndexChanged), updateDDS);
QObject::connect(ui->PLLPowerDown, &QCheckBox::toggled, updateDDS);
QObject::connect(ui->PLLInputDivBy2, &QCheckBox::toggled, updateDDS);
QObject::connect(ui->PLLOutputDivBy2, &QCheckBox::toggled, updateDDS);
auto updateOutput = [=]() {
if(ui->DCoutput->isChecked()) {
ui->freqOUT->setValue(0);
} else {
unsigned int word = ui->FreqTuneWord->value();
if(ui->UseInternalProfile->isChecked()) {
switch(ui->InternalProfile->currentIndex()) {
case 0: word = ui->Profile0Freq->value(); break;
case 1: word = ui->Profile1Freq->value(); break;
case 2: word = ui->Profile2Freq->value(); break;
case 3: word = ui->Profile3Freq->value(); break;
case 4: word = ui->Profile4Freq->value(); break;
case 5: word = ui->Profile5Freq->value(); break;
case 6: word = ui->Profile6Freq->value(); break;
case 7: word = ui->Profile7Freq->value(); break;
}
}
auto outFreq = ui->freqDDS->value() * word / (1UL << 32);
ui->freqOUT->setValue(outFreq);
}
};
QObject::connect(ui->freqDDS, &SIUnitEdit::valueChanged, updateOutput);
QObject::connect(ui->UseInternalProfile, &QCheckBox::toggled, updateOutput);
QObject::connect(ui->DCoutput, &QCheckBox::toggled, updateOutput);
QObject::connect(ui->InternalProfile, qOverload<int>(&QComboBox::currentIndexChanged), updateOutput);
QObject::connect(ui->Profile0Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile1Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile2Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile3Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile4Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile5Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile6Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
QObject::connect(ui->Profile7Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
outputs["Output"] = ui->freqOUT;
ui->ref->setValue(100000000);
}
AD9913::~AD9913()
{
delete ui;
}
void AD9913::fromJSON(nlohmann::json j)
{
registersFromJSON(j["registers"]);
ui->cbRef->setCurrentText(QString::fromStdString(j["reference"]));
if(ui->cbRef->currentText() == "Manual") {
ui->ref->setValue(j["reference_frequency"]);
}
}
nlohmann::json AD9913::toJSON()
{
nlohmann::json j;
j["registers"] = registersToJSON();
j["reference"] = ui->cbRef->currentText().toStdString();
if(ui->cbRef->currentText() == "Manual") {
j["reference_frequency"] = ui->ref->value();
}
return j;
}
void AD9913::addPossibleInputs(RegisterDevice *inputDevice)
{
RegisterDevice::addPossibleInputs(inputDevice);
ui->cbRef->clear();
ui->cbRef->addItem("Manual");
for(auto i : possibleInputs) {
ui->cbRef->addItem(i.first);
}
}

View file

@ -0,0 +1,27 @@
#ifndef AD9913_H
#define AD9913_H
#include "registerdevice.h"
#include <QWidget>
#include "CustomWidgets/siunitedit.h"
namespace Ui {
class AD9913Widget;
}
class AD9913 : public RegisterDevice
{
public:
AD9913();
~AD9913();
void fromJSON(nlohmann::json j) override;
nlohmann::json toJSON() override;
void addPossibleInputs(RegisterDevice *inputDevice) override;
private:
SIUnitEdit *currentInput;
Ui::AD9913Widget *ui;
};
#endif // MAX2871_H

File diff suppressed because it is too large Load diff

View file

@ -76,6 +76,32 @@ void Register::assignUI(QSpinBox *sb, int pos, int width, int ui_bitoffset)
});
}
void Register::assignUI(std::vector<Register *> regs, int address, QCheckBox *cb, int bitpos, bool inverted)
{
auto reg = findByAddress(regs, address);
if(reg) {
reg->assignUI(cb, bitpos, inverted);
}
}
void Register::assignUI(std::vector<Register *> regs, int address, QComboBox *cb, int pos, int width, int ui_bitoffset)
{
auto reg = findByAddress(regs, address);
if(reg) {
reg->assignUI(cb, pos, width, ui_bitoffset);
}
}
void Register::assignUI(std::vector<Register *> regs, int address, QSpinBox *sb, int pos, int width, int ui_bitoffset)
{
auto reg = findByAddress(regs, address);
if(reg) {
reg->assignUI(sb, pos, width, ui_bitoffset);
}
}
QString Register::hexString()
{
return "0x" + QString("%1").arg(value, (width-1)/4 + 1, 16, QChar('0'));
@ -124,6 +150,16 @@ void Register::setValue(unsigned long newval, int pos, int width)
}
}
Register *Register::findByAddress(std::vector<Register *> regs, int address)
{
for(auto r : regs) {
if(r->getAddress() == address) {
return r;
}
}
return nullptr;
}
int Register::getAddress() const
{
return address;

View file

@ -21,6 +21,11 @@ public:
void assignUI(QComboBox *cb, int pos, int width, int ui_bitoffset = 0);
void assignUI(QSpinBox *sb, int pos, int width, int ui_bitoffset = 0);
// same as above but by specifying the register address instead of using the register directly
static void assignUI(std::vector<Register*> regs, int address, QCheckBox *cb, int bitpos, bool inverted = false);
static void assignUI(std::vector<Register*> regs, int address, QComboBox *cb, int pos, int width, int ui_bitoffset = 0);
static void assignUI(std::vector<Register*> regs, int address, QSpinBox *sb, int pos, int width, int ui_bitoffset = 0);
QString hexString();
bool setFromString(QString hex);
unsigned long getValue();
@ -37,6 +42,7 @@ public slots:
signals:
void valueChanged(unsigned long newval);
private:
static Register *findByAddress(std::vector<Register*> regs, int address);
QString name;
int address;
int width;

View file

@ -2,6 +2,7 @@
#include "max2871.h"
#include "stw81200.h"
#include "ad9913.h"
#include "Device/device.h"
RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumber, QString name)
@ -11,6 +12,8 @@ RegisterDevice *RegisterDevice::create(Device *dev, int number, QString partnumb
regdev = new MAX2871();
} else if(partnumber == "STW81200") {
regdev = new STW81200();
} else if(partnumber == "AD9913") {
regdev = new AD9913();
}
if(regdev) {
regdev->dev = dev;

View file

@ -0,0 +1,215 @@
#include "si5332.h"
#include "ui_si5332widget.h"
#include "register.h"
SI5332::SI5332()
{
currentInput = nullptr;
currentXTAL = nullptr;
std::vector<int> addresses = {5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12,0x17,0x18,0x19,0x21,0x23,0x25,
0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x32,0x33,0x34,
0x35,0x36,0x38,0x3A,0x3C,0x3D,0x3F,0x40,0x42,0x44,0x46,0x48,0x49,0x4B,0x4C,0x4E,
0x50,0x52,0x54,0x55,0x57,0x58,0x5A,0x5C,0x5E,0x60,0x61,0x63,0x64,0x67,0x69,0x6B,
0x75,0xB8,0xBE,0xBF,0xC0,0xC1,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x80,0x81,0x82,0x83,
0x89,0x8A,0x8B,0x8C,0x8D,0x98,0x99,0x9A,0x9B,0x9C,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,
0xAD,0xAE,0xAF,0xB0,0xB6,0xB7,0x73,0x24};
for(auto addr : addresses) {
addRegister(new Register(QString::number(addr, 16), addr, 8));
}
ui = new Ui::SI5332Widget;
ui->setupUi(widget);
// Register connections
Register::assignUI(regs, 0x05, ui->VDD_XTAL_OK, 7);
Register::assignUI(regs, 0x05, ui->VDDO_OK, 0); // TODO these are actually multiple flags
Register::assignUI(regs, 0x06, ui->USYS_CTRL, 0, 2);
Register::assignUI(regs, 0x08, ui->UDRV_OE_ENA, 0);
Register::assignUI(regs, 0x0D, ui->DEVICE_PN_BASE, 0, 8);
Register::assignUI(regs, 0x0E, ui->DEVICE_REV, 0, 8);
Register::assignUI(regs, 0x0F, ui->DEVICE_GRADE, 0, 8);
Register::assignUI(regs, 0x21, ui->I2C_ADDR, 0, 8);
Register::assignUI(regs, 0x23, ui->I2C_SCL_PUP_ENA, 0);
Register::assignUI(regs, 0x23, ui->I2C_SDA_PUP_ENA, 1);
Register::assignUI(regs, 0x25, ui->OMUX0_SEL0, 0, 2);
Register::assignUI(regs, 0x25, ui->OMUX0_SEL1, 4, 3);
Register::assignUI(regs, 0x26, ui->OMUX1_SEL0, 0, 2);
Register::assignUI(regs, 0x26, ui->OMUX1_SEL1, 4, 3);
Register::assignUI(regs, 0x27, ui->OMUX2_SEL0, 0, 2);
Register::assignUI(regs, 0x27, ui->OMUX2_SEL1, 4, 3);
Register::assignUI(regs, 0x28, ui->OMUX3_SEL0, 0, 2);
Register::assignUI(regs, 0x28, ui->OMUX3_SEL1, 4, 3);
Register::assignUI(regs, 0x29, ui->OMUX4_SEL0, 0, 2);
Register::assignUI(regs, 0x29, ui->OMUX4_SEL1, 4, 3);
Register::assignUI(regs, 0x2A, ui->OMUX5_SEL0, 0, 2);
Register::assignUI(regs, 0x2A, ui->OMUX5_SEL1, 4, 3);
Register::assignUI(regs, 0x2B, ui->HSDIV0A_DIV, 0, 8);
Register::assignUI(regs, 0x2C, ui->HSDIV0B_DIV, 0, 8);
Register::assignUI(regs, 0x2D, ui->HSDIV1A_DIV, 0, 8);
Register::assignUI(regs, 0x2E, ui->HSDIV1B_DIV, 0, 8);
Register::assignUI(regs, 0x2F, ui->HSDIV2A_DIV, 0, 8);
Register::assignUI(regs, 0x30, ui->HSDIV2B_DIV, 0, 8);
Register::assignUI(regs, 0x31, ui->HSDIV3A_DIV, 0, 8);
Register::assignUI(regs, 0x32, ui->HSDIV3B_DIV, 0, 8);
Register::assignUI(regs, 0x33, ui->HSDIV4A_DIV, 0, 8);
Register::assignUI(regs, 0x34, ui->HSDIV4B_DIV, 0, 8);
Register::assignUI(regs, 0x35, ui->HSDIV3_DIV_SEL, 3, 1);
Register::assignUI(regs, 0x35, ui->ID0_CFG_SEL, 6, 1);
Register::assignUI(regs, 0x35, ui->HSDIV4_DIV_SEL, 4, 1);
Register::assignUI(regs, 0x35, ui->ID1_CFG_SEL, 7, 1);
Register::assignUI(regs, 0x35, ui->HSDIV2_DIV_SEL, 3, 1);
Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 2, 1);
Register::assignUI(regs, 0x35, ui->HSDIV3_DIV_SEL, 0, 1);
Register::assignUI(regs, 0x35, ui->HSDIV0_DIV_SEL, 1, 1);
Register::fillTableWidget(ui->table, regs);
ui->ref->setPrefixes(" kMG");
ui->ref->setUnit("Hz");
ui->xtal->setPrefixes(" kMG");
ui->xtal->setUnit("Hz");
QObject::connect(ui->cbRef, &QComboBox::currentTextChanged, [=](QString input){
SIUnitEdit *newInput = nullptr;
if(possibleInputs.count(input)) {
newInput = possibleInputs[input];
}
if(currentInput) {
QObject::disconnect(currentInput, &SIUnitEdit::valueChanged, ui->ref, &SIUnitEdit::setValue);
ui->ref->setEnabled(true);
}
if(newInput) {
QObject::connect(newInput, &SIUnitEdit::valueChanged, ui->ref, &SIUnitEdit::setValue);
ui->ref->setEnabled(false);
ui->ref->setValue(newInput->value());
}
currentInput = newInput;
});
QObject::connect(ui->cbXTAL, &QComboBox::currentTextChanged, [=](QString input){
SIUnitEdit *newXTAL = nullptr;
if(possibleInputs.count(input)) {
newXTAL = possibleInputs[input];
}
if(currentXTAL) {
QObject::disconnect(currentXTAL, &SIUnitEdit::valueChanged, ui->xtal, &SIUnitEdit::setValue);
ui->xtal->setEnabled(true);
}
if(newXTAL) {
QObject::connect(newXTAL, &SIUnitEdit::valueChanged, ui->xtal, &SIUnitEdit::setValue);
ui->ref->setEnabled(false);
ui->ref->setValue(newXTAL->value());
}
currentXTAL = newXTAL;
});
// // user friendly frequency calculation connections
// auto updateDDS = [=]() {
// auto dds = ui->freqRef->value();
// if(!ui->PLLPowerDown->isChecked()) {
// // using the PLL
// if(ui->PLLInputDivBy2->isChecked()) {
// dds /= 2;
// }
// dds *= ui->PLLMult->currentText().toUInt();
// if(ui->PLLOutputDivBy2->isChecked()) {
// dds /= 2;
// }
// }
// ui->freqDDS->setValue(dds);
// bool valid = dds <= 250000000;
// // check value and set background
// QPalette palette;
// palette.setColor(QPalette::Base,valid ? Qt::white : Qt::red);
// ui->freqDDS->setPalette(palette);
// };
// QObject::connect(ui->freqRef, &SIUnitEdit::valueChanged, updateDDS);
// QObject::connect(ui->PLLMult, qOverload<int>(&QComboBox::currentIndexChanged), updateDDS);
// QObject::connect(ui->PLLPowerDown, &QCheckBox::toggled, updateDDS);
// QObject::connect(ui->PLLInputDivBy2, &QCheckBox::toggled, updateDDS);
// QObject::connect(ui->PLLOutputDivBy2, &QCheckBox::toggled, updateDDS);
// auto updateOutput = [=]() {
// if(ui->DCoutput->isChecked()) {
// ui->freqOUT->setValue(0);
// } else {
// unsigned int word = ui->FreqTuneWord->value();
// if(ui->UseInternalProfile->isChecked()) {
// switch(ui->InternalProfile->currentIndex()) {
// case 0: word = ui->Profile0Freq->value(); break;
// case 1: word = ui->Profile1Freq->value(); break;
// case 2: word = ui->Profile2Freq->value(); break;
// case 3: word = ui->Profile3Freq->value(); break;
// case 4: word = ui->Profile4Freq->value(); break;
// case 5: word = ui->Profile5Freq->value(); break;
// case 6: word = ui->Profile6Freq->value(); break;
// case 7: word = ui->Profile7Freq->value(); break;
// }
// }
// auto outFreq = ui->freqDDS->value() * word / (1UL << 32);
// ui->freqOUT->setValue(outFreq);
// }
// };
// QObject::connect(ui->freqDDS, &SIUnitEdit::valueChanged, updateOutput);
// QObject::connect(ui->UseInternalProfile, &QCheckBox::toggled, updateOutput);
// QObject::connect(ui->DCoutput, &QCheckBox::toggled, updateOutput);
// QObject::connect(ui->InternalProfile, qOverload<int>(&QComboBox::currentIndexChanged), updateOutput);
// QObject::connect(ui->Profile0Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile1Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile2Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile3Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile4Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile5Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile6Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
// QObject::connect(ui->Profile7Freq, qOverload<int>(&QSpinBox::valueChanged), updateOutput);
outputs["Out 0"] = ui->freqOUT0;
outputs["Out 1"] = ui->freqOUT1;
outputs["Out 2"] = ui->freqOUT2;
outputs["Out 3"] = ui->freqOUT3;
outputs["Out 4"] = ui->freqOUT4;
outputs["Out 5"] = ui->freqOUT5;
ui->ref->setValue(100000000);
}
SI5332::~SI5332()
{
delete ui;
}
void SI5332::fromJSON(nlohmann::json j)
{
registersFromJSON(j["registers"]);
ui->cbRef->setCurrentText(QString::fromStdString(j["reference"]));
if(ui->cbRef->currentText() == "Manual") {
ui->ref->setValue(j["reference_frequency"]);
}
}
nlohmann::json SI5332::toJSON()
{
nlohmann::json j;
j["registers"] = registersToJSON();
j["reference"] = ui->cbRef->currentText().toStdString();
if(ui->cbRef->currentText() == "Manual") {
j["reference_frequency"] = ui->ref->value();
}
return j;
}
void SI5332::addPossibleInputs(RegisterDevice *inputDevice)
{
RegisterDevice::addPossibleInputs(inputDevice);
ui->cbRef->clear();
ui->cbXTAL->clear();
ui->cbRef->addItem("Manual");
ui->cbXTAL->addItem("Manual");
for(auto i : possibleInputs) {
ui->cbRef->addItem(i.first);
ui->cbXTAL->addItem(i.first);
}
}

View file

@ -0,0 +1,28 @@
#ifndef SI5332_H
#define SI5332_H
#include "registerdevice.h"
#include <QWidget>
#include "CustomWidgets/siunitedit.h"
namespace Ui {
class SI5332Widget;
}
class SI5332 : public RegisterDevice
{
public:
SI5332();
~SI5332();
void fromJSON(nlohmann::json j) override;
nlohmann::json toJSON() override;
void addPossibleInputs(RegisterDevice *inputDevice) override;
private:
SIUnitEdit *currentInput;
SIUnitEdit *currentXTAL;
Ui::SI5332Widget *ui;
};
#endif // MAX2871_H

File diff suppressed because it is too large Load diff

View file

@ -17,10 +17,12 @@ HEADERS += \
CustomWidgets/tilewidget.h \
CustomWidgets/toggleswitch.h \
CustomWidgets/touchstoneimport.h \
Device/RegisterAccess/ad9913.h \
Device/RegisterAccess/max2871.h \
Device/RegisterAccess/rawregisterdialog.h \
Device/RegisterAccess/register.h \
Device/RegisterAccess/registerdevice.h \
Device/RegisterAccess/si5332.h \
Device/RegisterAccess/stw81200 \
Device/RegisterAccess/stw81200.h \
Device/device.h \
@ -147,10 +149,12 @@ SOURCES += \
CustomWidgets/tilewidget.cpp \
CustomWidgets/toggleswitch.cpp \
CustomWidgets/touchstoneimport.cpp \
Device/RegisterAccess/ad9913.cpp \
Device/RegisterAccess/max2871.cpp \
Device/RegisterAccess/rawregisterdialog.cpp \
Device/RegisterAccess/register.cpp \
Device/RegisterAccess/registerdevice.cpp \
Device/RegisterAccess/si5332.cpp \
Device/RegisterAccess/stw81200.cpp \
Device/device.cpp \
Device/devicelog.cpp \
@ -262,8 +266,10 @@ FORMS += \
CustomWidgets/jsonpickerdialog.ui \
CustomWidgets/tilewidget.ui \
CustomWidgets/touchstoneimport.ui \
Device/RegisterAccess/ad9913widget.ui \
Device/RegisterAccess/max2871widget.ui \
Device/RegisterAccess/rawregisterdialog.ui \
Device/RegisterAccess/si5332widget.ui \
Device/RegisterAccess/stw81200widget.ui \
Device/devicelog.ui \
Device/firmwareupdatedialog.ui \