LibreVNA/Software/PC_Application/Generator/signalgenwidget.cpp

177 lines
5.8 KiB
C++
Raw Normal View History

#include "signalgenwidget.h"
#include "ui_signalgenwidget.h"
SignalgeneratorWidget::SignalgeneratorWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::SignalgeneratorWidget)
{
ui->setupUi(this);
ui->frequency->setUnit("Hz");
ui->frequency->setPrefixes(" kMG");
ui->frequency->setPrecision(6); // show enough digits
2021-04-06 17:58:48 +08:00
ui->span->setUnit("Hz");
ui->span->setPrefixes(" kMG");
ui->span->setPrecision(6); // show enough digits
2021-04-07 00:29:41 +08:00
ui->span->setValue(0);
2021-04-06 17:58:48 +08:00
ui->current->setUnit("Hz");
ui->current->setPrefixes(" kMG");
ui->current->setPrecision(6); // show enough digits
ui->dwell->setUnit("s");
ui->dwell->setPrefixes(" m");
ui->dwell->setPrecision(6); // show enough digits
2021-04-07 00:29:41 +08:00
ui->dwell->setValue(1);
2021-04-06 17:58:48 +08:00
m_timerId = startTimer(1000);
2021-04-07 00:29:41 +08:00
ui->steps->setValue(100);
2021-04-06 17:58:48 +08:00
ui->steps->setPrefixes(" k");
ui->steps->setPrecision(0);
connect(ui->frequency, &SIUnitEdit::valueChanged, [=](double newval) {
if(newval < Device::Info().limits_minFreq) {
newval = Device::Info().limits_minFreq;
} else if (newval > Device::Info().limits_maxFreq) {
newval = Device::Info().limits_maxFreq;
}
ui->frequency->setValueQuiet(newval);
2021-04-06 20:50:40 +08:00
if (newval < ui->span->value()/2)
ui->span->setValueQuiet(newval/2);
if (newval + ui->span->value()/2 > Device::Info().limits_maxFreq)
ui->span->setValueQuiet((Device::Info().limits_maxFreq - newval)*2);
newval = ui->frequency->value() - ui->span->value()/2;
ui->current->setValueQuiet(newval);
emit SettingsChanged();
});
2021-04-06 17:58:48 +08:00
connect(ui->span, &SIUnitEdit::valueChanged, [=](double newval) {
if(newval < 0 ) {
newval = 0;
} else if (newval > Device::Info().limits_maxFreq - Device::Info().limits_minFreq) {
newval = Device::Info().limits_maxFreq - Device::Info().limits_minFreq;
}
ui->span->setValueQuiet(newval);
double newF = ui->frequency->value() - ui->span->value()/2;
if (newF < 0) {
2021-04-06 20:50:40 +08:00
ui->frequency->setValueQuiet(ui->span->value()/2);
2021-04-06 17:58:48 +08:00
}
2021-04-06 20:50:40 +08:00
newF = ui->frequency->value() + ui->span->value()/2;
2021-04-07 00:29:41 +08:00
if (newF > Device::Info().limits_maxFreq) {
2021-04-06 20:50:40 +08:00
ui->frequency->setValueQuiet(Device::Info().limits_maxFreq - ui->span->value()/2);
2021-04-07 00:29:41 +08:00
}
2021-04-06 20:50:40 +08:00
newval = ui->frequency->value() - ui->span->value()/2;
2021-04-06 17:58:48 +08:00
emit SettingsChanged();
});
connect(ui->current, &SIUnitEdit::valueChanged, [=](double newval) {
if(newval < 0 ) {
newval = 0;
} else if (newval > Device::Info().limits_maxFreq - Device::Info().limits_minFreq) {
newval = Device::Info().limits_maxFreq - Device::Info().limits_minFreq;
}
ui->current->setValueQuiet(newval);
emit SettingsChanged();
});
connect(ui->dwell, &SIUnitEdit::valueChanged, [=](double newval) {
2021-04-07 00:29:41 +08:00
if(newval < 0.01 ) {
newval = 0.01;
2021-04-06 17:58:48 +08:00
} else if (newval > 60) {
newval = 60;
}
ui->dwell->setValueQuiet(newval);
m_timerId = startTimer(newval*1000);
emit SettingsChanged();
});
connect(ui->levelSpin, qOverload<double>(&QDoubleSpinBox::valueChanged), this, &SignalgeneratorWidget::setLevel);
connect(ui->levelSlider, &QSlider::valueChanged, [=](int value) {
setLevel((double) value / 100.0);
});
connect(ui->EnablePort1, &QCheckBox::clicked, [=](){
if(ui->EnablePort1->isChecked() && ui->EnablePort2->isChecked()) {
ui->EnablePort2->setCheckState(Qt::CheckState::Unchecked);
}
emit SettingsChanged();
});
connect(ui->EnablePort2, &QCheckBox::clicked, [=](){
if(ui->EnablePort1->isChecked() && ui->EnablePort2->isChecked()) {
ui->EnablePort1->setCheckState(Qt::CheckState::Unchecked);
}
emit SettingsChanged();
});
2021-04-07 00:29:41 +08:00
connect(ui->EnabledSweep, &QCheckBox::toggled, [=](bool enabled){
ui->current->setEnabled(enabled);
if(enabled) {
2021-04-06 17:58:48 +08:00
double newF = ui->frequency->value() - ui->span->value()/2;
if (newF < 0) {
ui->frequency->setValueQuiet(ui->frequency->value() - newF);
newF = 0;
}
ui->current->setValueQuiet(newF);
} else {
}
emit SettingsChanged();
});
}
2021-04-06 17:58:48 +08:00
SignalgeneratorWidget::~SignalgeneratorWidget()
{
delete ui;
}
2021-04-06 17:58:48 +08:00
void SignalgeneratorWidget::timerEvent(QTimerEvent *event)
{
if (event->timerId() == m_timerId) {
if (ui->EnabledSweep->isChecked()) {
double newF = ui->current->value() + ui->span->value()/ui->steps->value();
if (newF > ui->frequency->value() + ui->span->value()/2)
newF = ui->frequency->value() - ui->span->value()/2;
ui->current->setValueQuiet(newF);
SettingsChanged();
}
}
}
2020-09-14 00:01:32 +08:00
Protocol::GeneratorSettings SignalgeneratorWidget::getDeviceStatus()
{
2020-09-14 00:01:32 +08:00
Protocol::GeneratorSettings s = {};
2021-04-06 17:58:48 +08:00
if (ui->EnabledSweep->isChecked())
s.frequency = ui->current->value();
else
s.frequency = ui->frequency->value();
2020-09-14 00:01:32 +08:00
s.cdbm_level = ui->levelSpin->value() * 100.0;
if(ui->EnablePort1->isChecked()) {
s.activePort = 1;
} else if(ui->EnablePort2->isChecked()) {
s.activePort = 2;
} else {
s.activePort = 0;
}
s.applyAmplitudeCorrection = 1;
return s;
}
void SignalgeneratorWidget::setLevel(double level)
{
// TODO constrain to frequency dependent levels
ui->levelSpin->blockSignals(true);
ui->levelSlider->blockSignals(true);
ui->levelSpin->setValue(level);
ui->levelSlider->setValue(level * 100.0);
ui->levelSpin->blockSignals(false);
ui->levelSlider->blockSignals(false);
SettingsChanged();
}
void SignalgeneratorWidget::setFrequency(double frequency)
{
ui->frequency->setValue(frequency);
}