mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-03-27 01:45:28 +01:00
Added bandwidth and clock selection to USRP source
This commit is contained in:
parent
bad8ecba49
commit
d020dcc4a3
@ -137,13 +137,15 @@ public:
|
|||||||
samplerates.clear();
|
samplerates.clear();
|
||||||
auto srList = dev->get_rx_rates(chanId);
|
auto srList = dev->get_rx_rates(chanId);
|
||||||
for (auto& l : srList) {
|
for (auto& l : srList) {
|
||||||
|
// If a single value, add it to the list
|
||||||
if (l.step() == 0.0 || l.start() == l.stop()) {
|
if (l.step() == 0.0 || l.start() == l.stop()) {
|
||||||
samplerates.define(l.start(), getBandwdithScaled(l.start()), l.start());
|
samplerates.define(l.start(), getBandwdithScaled(l.start()), l.start());
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
for (double f = l.start(); f <= l.stop(); f += l.step()) {
|
// Otherwise, save all entries to the list
|
||||||
samplerates.define(f, getBandwdithScaled(f), f);
|
for (double f = l.start(); f <= l.stop(); f += l.step()) {
|
||||||
}
|
samplerates.define(f, getBandwdithScaled(f), f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,9 +159,38 @@ public:
|
|||||||
// Get gain range
|
// Get gain range
|
||||||
gainRange = dev->get_rx_gain_range(chanId)[0];
|
gainRange = dev->get_rx_gain_range(chanId)[0];
|
||||||
|
|
||||||
|
// Get bandwidth ranges
|
||||||
|
bandwidths.clear();
|
||||||
|
bandwidths.define(0, "Auto", 0);
|
||||||
|
uhd::meta_range_t bwRange = dev->get_rx_bandwidth_range(chanId);
|
||||||
|
for (const auto& r : bwRange) {
|
||||||
|
// If a single value, add it to the list
|
||||||
|
if (r.step() == 0.0 || r.start() == r.stop()) {
|
||||||
|
bandwidths.define((int)r.start(), getBandwdithScaled(r.start()), r.start());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, save all entries to the list
|
||||||
|
for (double i = r.start(); i <= r.stop(); i += r.step()) {
|
||||||
|
bandwidths.define((int)i, getBandwdithScaled(i), i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get clock sources
|
||||||
|
clockSources.clear();
|
||||||
|
auto cSources = dev->get_clock_sources(0);
|
||||||
|
for (const auto& s : cSources) {
|
||||||
|
std::string name = s;
|
||||||
|
name[0] = std::toupper(name[0]);
|
||||||
|
clockSources.define(s, name, s);
|
||||||
|
spdlog::warn(s);
|
||||||
|
}
|
||||||
|
|
||||||
// Load settings
|
// Load settings
|
||||||
srId = 0;
|
srId = 0;
|
||||||
antId = 0;
|
antId = 0;
|
||||||
|
bwId = 0;
|
||||||
|
csId = 0;
|
||||||
gain = gainRange.start();
|
gain = gainRange.start();
|
||||||
config.acquire();
|
config.acquire();
|
||||||
if (config.conf["devices"][selectedSer].contains("channels") && config.conf["devices"][selectedSer]["channels"].contains(selectedChan)) {
|
if (config.conf["devices"][selectedSer].contains("channels") && config.conf["devices"][selectedSer]["channels"].contains(selectedChan)) {
|
||||||
@ -172,6 +203,14 @@ public:
|
|||||||
std::string ant = cconf["antenna"];
|
std::string ant = cconf["antenna"];
|
||||||
if (antennas.keyExists(ant)) { antId = antennas.keyId(ant); }
|
if (antennas.keyExists(ant)) { antId = antennas.keyId(ant); }
|
||||||
}
|
}
|
||||||
|
if (cconf.contains("bandwidth")) {
|
||||||
|
int bw = cconf["bandwidth"];
|
||||||
|
if (bandwidths.keyExists(bw)) { bwId = bandwidths.keyId(bw); }
|
||||||
|
}
|
||||||
|
if (cconf.contains("clock")) {
|
||||||
|
std::string clk = cconf["clock"];
|
||||||
|
if (clockSources.keyExists(clk)) { csId = clockSources.keyId(clk); }
|
||||||
|
}
|
||||||
if (cconf.contains("gain")) {
|
if (cconf.contains("gain")) {
|
||||||
gain = cconf["gain"];
|
gain = cconf["gain"];
|
||||||
gain = std::clamp<float>(gain, gainRange.start(), gainRange.stop());
|
gain = std::clamp<float>(gain, gainRange.start(), gainRange.stop());
|
||||||
@ -184,6 +223,24 @@ public:
|
|||||||
core::setInputSampleRate(sampleRate);
|
core::setInputSampleRate(sampleRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setBandwidth(double bw) {
|
||||||
|
if (bw > 0.0) {
|
||||||
|
dev->set_rx_bandwidth(bw, chanId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If on auto, select the best depending on the samplerate
|
||||||
|
// Note: Starts at 1 because 0 is the 'Auto' entry.
|
||||||
|
int bestId;
|
||||||
|
for (int i = 1; i < bandwidths.size(); i++) {
|
||||||
|
bestId = i;
|
||||||
|
if (bandwidths[i] >= sampleRate) { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set it
|
||||||
|
dev->set_rx_bandwidth(bandwidths[bestId], chanId);
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string getBandwdithScaled(double bw) {
|
std::string getBandwdithScaled(double bw) {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
@ -235,6 +292,8 @@ private:
|
|||||||
_this->dev->set_rx_antenna(_this->antennas.key(_this->antId), _this->chanId);
|
_this->dev->set_rx_antenna(_this->antennas.key(_this->antId), _this->chanId);
|
||||||
_this->dev->set_rx_gain(_this->gain, _this->chanId);
|
_this->dev->set_rx_gain(_this->gain, _this->chanId);
|
||||||
_this->dev->set_rx_freq(_this->freq, _this->chanId);
|
_this->dev->set_rx_freq(_this->freq, _this->chanId);
|
||||||
|
_this->dev->set_clock_source(_this->clockSources.key(_this->csId));
|
||||||
|
_this->setBandwidth(_this->bandwidths[_this->bwId]);
|
||||||
|
|
||||||
uhd::stream_args_t sargs;
|
uhd::stream_args_t sargs;
|
||||||
sargs.channels.clear();
|
sargs.channels.clear();
|
||||||
@ -344,6 +403,36 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_this->bandwidths.size() > 2) {
|
||||||
|
SmGui::LeftLabel("Bandwidth");
|
||||||
|
SmGui::FillWidth();
|
||||||
|
if (SmGui::Combo(CONCAT("##_usrp_bw_sel_", _this->name), &_this->bwId, _this->bandwidths.txt)) {
|
||||||
|
if (_this->running) {
|
||||||
|
_this->setBandwidth(_this->bandwidths[_this->bwId]);
|
||||||
|
}
|
||||||
|
if (!_this->selectedSer.empty() && !_this->selectedChan.empty()) {
|
||||||
|
config.acquire();
|
||||||
|
config.conf["devices"][_this->selectedSer]["channels"][_this->selectedChan]["bandwidth"] = _this->bandwidths.key(_this->bwId);
|
||||||
|
config.release(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_this->clockSources.size() > 1) {
|
||||||
|
SmGui::LeftLabel("Clock");
|
||||||
|
SmGui::FillWidth();
|
||||||
|
if (SmGui::Combo(CONCAT("##_usrp_clk_sel_", _this->name), &_this->csId, _this->clockSources.txt)) {
|
||||||
|
if (_this->running) {
|
||||||
|
_this->dev->set_clock_source(_this->clockSources.key(_this->csId));
|
||||||
|
}
|
||||||
|
if (!_this->selectedSer.empty()) {
|
||||||
|
config.acquire();
|
||||||
|
config.conf["devices"][_this->selectedSer]["channels"][_this->selectedChan]["clock"] = _this->clockSources.key(_this->csId);
|
||||||
|
config.release(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SmGui::LeftLabel("Gain");
|
SmGui::LeftLabel("Gain");
|
||||||
SmGui::FillWidth();
|
SmGui::FillWidth();
|
||||||
if (SmGui::SliderFloatWithSteps(CONCAT("##_usrp_gain_", _this->name), &_this->gain, _this->gainRange.start(), _this->gainRange.stop(), _this->gainRange.step(), SmGui::FMT_STR_FLOAT_DB_ONE_DECIMAL)) {
|
if (SmGui::SliderFloatWithSteps(CONCAT("##_usrp_gain_", _this->name), &_this->gain, _this->gainRange.start(), _this->gainRange.stop(), _this->gainRange.step(), SmGui::FMT_STR_FLOAT_DB_ONE_DECIMAL)) {
|
||||||
@ -396,6 +485,8 @@ private:
|
|||||||
int chanId = 0;
|
int chanId = 0;
|
||||||
int srId = 0;
|
int srId = 0;
|
||||||
int antId = 0;
|
int antId = 0;
|
||||||
|
int bwId = 0;
|
||||||
|
int csId = 0;
|
||||||
std::string selectedSer = "";
|
std::string selectedSer = "";
|
||||||
std::string selectedChan = "";
|
std::string selectedChan = "";
|
||||||
float gain = 0.0f;
|
float gain = 0.0f;
|
||||||
@ -404,6 +495,8 @@ private:
|
|||||||
OptionList<std::string, std::string> channels;
|
OptionList<std::string, std::string> channels;
|
||||||
OptionList<int, double> samplerates;
|
OptionList<int, double> samplerates;
|
||||||
OptionList<std::string, std::string> antennas;
|
OptionList<std::string, std::string> antennas;
|
||||||
|
OptionList<int, double> bandwidths;
|
||||||
|
OptionList<std::string, std::string> clockSources;
|
||||||
uhd::range_t gainRange;
|
uhd::range_t gainRange;
|
||||||
|
|
||||||
uhd::usrp::multi_usrp::sptr dev;
|
uhd::usrp::multi_usrp::sptr dev;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user