diff --git a/Software/PC_Application/Device/RegisterAccess/ad9913.cpp b/Software/PC_Application/Device/RegisterAccess/ad9913.cpp new file mode 100644 index 0000000..1ba525c --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/ad9913.cpp @@ -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(&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(&QComboBox::currentIndexChanged), updateOutput); + QObject::connect(ui->Profile0Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile1Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile2Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile3Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile4Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile5Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile6Freq, qOverload(&QSpinBox::valueChanged), updateOutput); + QObject::connect(ui->Profile7Freq, qOverload(&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); + } +} diff --git a/Software/PC_Application/Device/RegisterAccess/ad9913.h b/Software/PC_Application/Device/RegisterAccess/ad9913.h new file mode 100644 index 0000000..f61aed7 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/ad9913.h @@ -0,0 +1,27 @@ +#ifndef AD9913_H +#define AD9913_H + +#include "registerdevice.h" +#include +#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 diff --git a/Software/PC_Application/Device/RegisterAccess/ad9913widget.ui b/Software/PC_Application/Device/RegisterAccess/ad9913widget.ui new file mode 100644 index 0000000..cafaa27 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/ad9913widget.ui @@ -0,0 +1,1252 @@ + + + AD9913Widget + + + + 0 + 0 + 1263 + 635 + + + + Form + + + + + + + + + + Registers + + + + + + + + + + + + + + + + + Reference Input + + + + + + + Manual + + + + + + + + + + + + + + Calculated Frequencies + + + + + + Ref In: + + + + + + + true + + + true + + + + + + + DDS Clock: + + + + + + + true + + + true + + + + + + + Output: + + + + + + + true + + + true + + + + + + + + + + + + + + PLL + + + + + + + + Power down + + + + + + + Reset + + + + + + + Input Div-by-2 + + + + + + + + + + + Range: + + + + + + + + Ref >5MHz + + + + + Ref <5MHz + + + + + + + + Multiplication factor: + + + + + + + + 32 + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + 16 + + + + + 17 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 31 + + + + + 64 + + + + + 2 + + + + + 4 + + + + + 6 + + + + + 8 + + + + + 10 + + + + + 12 + + + + + 14 + + + + + 16 + + + + + 18 + + + + + 20 + + + + + 22 + + + + + 24 + + + + + 26 + + + + + 28 + + + + + 30 + + + + + 32 + + + + + 34 + + + + + 36 + + + + + 38 + + + + + 40 + + + + + 42 + + + + + 44 + + + + + 46 + + + + + 48 + + + + + 50 + + + + + 52 + + + + + 54 + + + + + 56 + + + + + 58 + + + + + 60 + + + + + 62 + + + + + + + + VCO mode: + + + + + + + + optimize for power + + + + + optimize for performance + + + + + + + + Input Mode: + + + + + + + + Differential + + + + + XTAL + + + + + CMOS + + + + + XTAL + + + + + + + + + + + + Output Div-by-2 + + + + + + + false + + + PLL lock + + + + + + + + + + + + Linear sweep + + + + + + + + Enable (aux. Accumulator) + + + + + + + Enable Modulus + + + + + + + No dwell + + + + + + + + + + + Trigger mode: + + + + + + + + Edge + + + + + State + + + + + + + + Destination: + + + + + + + + Frequency Word (FSK) + + + + + Phase Word (PSK) + + + + + + + + Parameter lower limit: + + + + + + + 429496729 + + + + + + + Parameter upper limit: + + + + + + + 429496729 + + + + + + + Falling Delta Word: + + + + + + + 429496729 + + + + + + + Rising Delta Word: + + + + + + + 429496729 + + + + + + + Falling Ramp Rate: + + + + + + + 65535 + + + + + + + Rising Ramp Rate: + + + + + + + 65535 + + + + + + + + + + + + + + + + DDS + + + + + + Frequency tuning word: + + + + + + + 429496729 + + + + + + + Phase Offset: + + + + + + + 16384 + + + + + + + + + + Interface + + + + + + Disable SYNC clock + + + + + + + Load SSR@IO_Update + + + + + + + Autoclear Phase Accumulator + + + + + + + Autoclear Auxiliary Accumulator + + + + + + + + + Format: + + + + + + + + MSB first + + + + + LSB first + + + + + + + + + + + + + Power down + + + + + + External power down mode + + + + + + + Power down Input + + + + + + + Power down DAC + + + + + + + Power down digital + + + + + + + + + + Mixed + + + + + + Clear Phase Accumulator + + + + + + + Clear Auxiliary Accumulator + + + + + + + Direct switch mode + + + + + + + Match pipeline delays + + + + + + + + + + + + + + Output + + + + + + + + Output type: + + + + + + + + Cosine + + + + + Sine + + + + + + + + DAC Fullscale: + + + + + + + 1023 + + + + + + + + + DC Output + + + + + + + + + + Profiles + + + + + + Use internal profile + + + + + + + Internal Profile: + + + + + + + + Profile 0/Sweep Off + + + + + Profile 1/Ramp up + + + + + Profile 2/Ramp down + + + + + Profile 3/Bidirectional ramp + + + + + Profile 4/Sweep Off + + + + + Profile 5/Ramp up + + + + + Profile 6/Ramp down + + + + + Profile 7/Bidirectional ramp + + + + + + + + + + 16384 + + + + + + + 429496729 + + + + + + + Frequency Word: + + + + + + + 16384 + + + + + + + 3: + + + + + + + 429496729 + + + + + + + 16384 + + + + + + + 16384 + + + + + + + 16384 + + + + + + + 16384 + + + + + + + 6: + + + + + + + 1: + + + + + + + 16384 + + + + + + + 429496729 + + + + + + + 429496729 + + + + + + + 16384 + + + + + + + 2: + + + + + + + 429496729 + + + + + + + 4: + + + + + + + 5: + + + + + + + 7: + + + + + + + 429496729 + + + + + + + 0: + + + + + + + 429496729 + + + + + + + Phase: + + + + + + + 429496729 + + + + + + + + + + + + + + + SIUnitEdit + QLineEdit +
CustomWidgets/siunitedit.h
+
+
+ + +
diff --git a/Software/PC_Application/Device/RegisterAccess/register.cpp b/Software/PC_Application/Device/RegisterAccess/register.cpp index 600844c..c62b8f4 100644 --- a/Software/PC_Application/Device/RegisterAccess/register.cpp +++ b/Software/PC_Application/Device/RegisterAccess/register.cpp @@ -76,6 +76,32 @@ void Register::assignUI(QSpinBox *sb, int pos, int width, int ui_bitoffset) }); } +void Register::assignUI(std::vector 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 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 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 regs, int address) +{ + for(auto r : regs) { + if(r->getAddress() == address) { + return r; + } + } + return nullptr; +} + int Register::getAddress() const { return address; diff --git a/Software/PC_Application/Device/RegisterAccess/register.h b/Software/PC_Application/Device/RegisterAccess/register.h index 29e683f..c731fe1 100644 --- a/Software/PC_Application/Device/RegisterAccess/register.h +++ b/Software/PC_Application/Device/RegisterAccess/register.h @@ -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 regs, int address, QCheckBox *cb, int bitpos, bool inverted = false); + static void assignUI(std::vector regs, int address, QComboBox *cb, int pos, int width, int ui_bitoffset = 0); + static void assignUI(std::vector 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 regs, int address); QString name; int address; int width; diff --git a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp index 0a7b8a2..37c0c3a 100644 --- a/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp +++ b/Software/PC_Application/Device/RegisterAccess/registerdevice.cpp @@ -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; diff --git a/Software/PC_Application/Device/RegisterAccess/si5332.cpp b/Software/PC_Application/Device/RegisterAccess/si5332.cpp new file mode 100644 index 0000000..e44f140 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/si5332.cpp @@ -0,0 +1,215 @@ +#include "si5332.h" +#include "ui_si5332widget.h" +#include "register.h" + +SI5332::SI5332() +{ + currentInput = nullptr; + currentXTAL = nullptr; + + std::vector 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(&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(&QComboBox::currentIndexChanged), updateOutput); +// QObject::connect(ui->Profile0Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile1Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile2Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile3Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile4Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile5Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile6Freq, qOverload(&QSpinBox::valueChanged), updateOutput); +// QObject::connect(ui->Profile7Freq, qOverload(&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); + } +} diff --git a/Software/PC_Application/Device/RegisterAccess/si5332.h b/Software/PC_Application/Device/RegisterAccess/si5332.h new file mode 100644 index 0000000..230cf17 --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/si5332.h @@ -0,0 +1,28 @@ +#ifndef SI5332_H +#define SI5332_H + +#include "registerdevice.h" +#include +#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 diff --git a/Software/PC_Application/Device/RegisterAccess/si5332widget.ui b/Software/PC_Application/Device/RegisterAccess/si5332widget.ui new file mode 100644 index 0000000..8b3be4c --- /dev/null +++ b/Software/PC_Application/Device/RegisterAccess/si5332widget.ui @@ -0,0 +1,3125 @@ + + + SI5332Widget + + + + 0 + 0 + 1638 + 783 + + + + Form + + + + + + + + Registers + + + + + + + + + + + + External Reference Input + + + + + + + Manual + + + + + + + + + + + + + + XTAL + + + + + + + Manual + + + + + + + + + + + + + + + + + + + + Main PLL + + + + + + Input: + + + + + + + + Disabled + + + + + XOSC + + + + + CLKIN_2 + + + + + Disabled + + + + + + + + Prescaler: + + + + + + + 64 + + + + + + + INTG: + + + + + + + 65535 + + + + + + + RES: + + + + + + + 65535 + + + + + + + DEN: + + + + + + + 65535 + + + + + + + Mode: + + + + + + + VCO Frequency: + + + + + + + true + + + + + + + + 1 + + + + + 2 + + + + + 3 + + + + + 4 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 15 + + + + + + + + + + + System + + + + + + + + Device Mode: + + + + + + + + Reserved + + + + + READY + + + + + ACTIVE + + + + + Reserved + + + + + + + + I2C Address: + + + + + + + true + + + 255 + + + + + + + + + Master Output Enable + + + + + + + + + false + + + VDD XTAL Okay + + + + + + + false + + + VDDO Okay + + + + + + + + + + + Device PN: + + + + + + + false + + + 255 + + + + + + + Device Revision: + + + + + + + false + + + 255 + + + + + + + Device Grade: + + + + + + + false + + + 255 + + + + + + + + + Enable SCL pullup + + + + + + + Enable SDA pullup + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + HSDIV + + + + + + + + 255 + + + + + + + 1: + + + + + + + Div bank A: + + + + + + + + Bank A + + + + + Bank B + + + + + + + + 255 + + + + + + + 255 + + + + + + + + Bank A + + + + + Bank B + + + + + + + + 4: + + + + + + + Div bank B: + + + + + + + 255 + + + + + + + Active bank: + + + + + + + 255 + + + + + + + 2: + + + + + + + 255 + + + + + + + 255 + + + + + + + 255 + + + + + + + 255 + + + + + + + + Bank A + + + + + Bank B + + + + + + + + 0: + + + + + + + + Bank A + + + + + Bank B + + + + + + + + 255 + + + + + + + 3: + + + + + + + + Bank A + + + + + Bank B + + + + + + + + Frequency: + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + ID + + + + + + + + Steps RES: + + + + + + + + + + Bank A: + + + Qt::AlignCenter + + + + + + + 0: + + + + + + + Fractional-N-PLL + + + Qt::AlignCenter + + + + + + + Steps: + + + + + + + + disabled + + + + + center + + + + + invalid + + + + + Down + + + + + + + + 65535 + + + + + + + RES: + + + + + + + Steps INTG: + + + + + + + Steps: + + + + + + + Spread-Spectrum + + + Qt::AlignCenter + + + + + + + Mode: + + + + + + + 65535 + + + + + + + + disabled + + + + + center + + + + + invalid + + + + + Down + + + + + + + + Bank B: + + + Qt::AlignCenter + + + + + + + + + + + + + + + + 4095 + + + + + + + 4095 + + + + + + + Active bank: + + + + + + + Mode: + + + + + + + + Bank A + + + + + Bank B + + + + + + + + 65535 + + + + + + + 65535 + + + + + + + 65535 + + + + + + + 65535 + + + + + + + Steps RES: + + + + + + + true + + + + + + + DEN: + + + + + + + Fractional-N-PLL + + + Qt::AlignCenter + + + + + + + Spread-Spectrum + + + Qt::AlignCenter + + + + + + + INTG: + + + + + + + INTG: + + + + + + + Frequency: + + + + + + + DEN: + + + + + + + RES: + + + + + + + Steps INTG: + + + + + + + 1: + + + + + + + 65535 + + + + + + + 65535 + + + + + + + 65535 + + + + + + + + disabled + + + + + center + + + + + invalid + + + + + Down + + + + + + + + 4095 + + + + + + + + + + + + + 65535 + + + + + + + 65535 + + + + + + + 65535 + + + + + + + + disabled + + + + + center + + + + + invalid + + + + + Down + + + + + + + + 4095 + + + + + + + + + + + + + + Bank A + + + + + Bank B + + + + + + + + true + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + Qt::Vertical + + + + + + + + + + + + + + Output Clock Groups: + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + true + + + + + + + 5: + + + + + + + true + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + SEL1: + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + 3: + + + + + + + 1: + + + + + + + 0: + + + + + + + 4: + + + + + + + Frequency: + + + + + + + true + + + + + + + 2: + + + + + + + true + + + + + + + + HSDIV0 + + + + + HSDIV1 + + + + + HSDIV2 + + + + + HSDIV3 + + + + + HSDIV4 + + + + + ID0 + + + + + ID1 + + + + + Use SEL0 + + + + + + + + + PLL reference w/o presc + + + + + PLL reference w/ presc + + + + + Input buffer CLKIN_2 + + + + + Input buffer CLKIN_3 + + + + + + + + SEL0: + + + + + + + true + + + + + + + true + + + + + + + + + + + + Outputs + + + + + + + + + + + + + + + CMOS Inv: + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + Divider: + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + Mode: + + + + + + + Enable + + + + + + + 0: + + + + + + + + low-Z + + + + + high-Z + + + + + + + + When stopped: + + + + + + + 63 + + + + + + + 1: + + + + + + + 63 + + + + + + + 2: + + + + + + + Skew: + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + 3: + + + + + + + + + + + + + + Frequency: + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + CMOS Imp: + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + true + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + 4: + + + + + + + CMOS Slew: + + + + + + + true + + + + + + + + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + + + + + + + + + low-Z + + + + + high-Z + + + + + + + + 5: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + + off + + + + + CMOS (p only) + + + + + CMOS (n only) + + + + + dual CMOS + + + + + 2.5V/3.3V LVDS + + + + + 1.8V LVDS + + + + + 2.5v/3.3V LVDS fast + + + + + 1.8V LVDS fast + + + + + HCSL 50 Ohm ext + + + + + HCSL 50 Ohm int + + + + + HCSL 42.5 Ohm ext + + + + + HCSL 42.5 Ohm int + + + + + LVPECL + + + + + Reserved + + + + + Reserved + + + + + Reserved + + + + + + + + 63 + + + + + + + 63 + + + + + + + 63 + + + + + + + 63 + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + + 0ps + + + + + 35ps + + + + + 70ps + + + + + 105ps + + + + + 140ps + + + + + 175ps + + + + + 210ps + + + + + 245ps + + + + + + + + + low-Z + + + + + high-Z + + + + + + + + + low-Z + + + + + high-Z + + + + + + + + + low-Z + + + + + high-Z + + + + + + + + + low-Z + + + + + high-Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + + fastest + + + + + slow + + + + + slower + + + + + slowest + + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + + 50 Ohm + + + + + 25 Ohm + + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + true + + + + + + + + + + + + + + + + + SIUnitEdit + QLineEdit +
CustomWidgets/siunitedit.h
+
+
+ + +
diff --git a/Software/PC_Application/LibreVNA-GUI.pro b/Software/PC_Application/LibreVNA-GUI.pro index 6c9f337..96a4c24 100644 --- a/Software/PC_Application/LibreVNA-GUI.pro +++ b/Software/PC_Application/LibreVNA-GUI.pro @@ -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 \