SoapySDR::RangeList SoapySDR::Device::getFrequencyRange(const int dir, const size_t chan) const { //get a list of tunable components const std::vector<std::string> comps = this->listFrequencies(dir, chan); if (comps.empty()) return SoapySDR::RangeList(); //get the range list for the RF component SoapySDR::RangeList ranges = this->getFrequencyRange(dir, chan, comps.front()); //use bandwidth setting to clip the range const double bw = this->getBandwidth(dir, chan); //add to the range list given subsequent components for (size_t comp_i = 1; comp_i < comps.size(); comp_i++) { SoapySDR::RangeList subRange = this->getFrequencyRange(dir, chan, comps[comp_i]); if (subRange.empty()) continue; double subRangeLow = subRange.front().minimum(); if (bw > 0.0) subRangeLow = std::max(-bw/2, subRangeLow); double subRangeHigh = subRange.back().maximum(); if (bw > 0.0) subRangeHigh = std::min(bw/2, subRangeHigh); for (size_t range_i = 0; range_i < ranges.size(); range_i++) { SoapySDR::Range &range = ranges[range_i]; range = SoapySDR::Range( range.minimum() + subRangeLow, range.maximum() + subRangeHigh); } } return ranges; }
SoapySDR::ArgInfoList SoapySDR::Device::getFrequencyArgsInfo(const int dir, const size_t chan) const { SoapySDR::ArgInfoList args; const std::vector<std::string> comps = this->listFrequencies(dir, chan); if (comps.size() < 2) return args; //no tuning options with single components //support offset tuning { SoapySDR::ArgInfo info; info.key = "OFFSET"; info.name = "LO Offset"; info.value = "0.0"; info.units = "Hz"; info.type = SoapySDR::ArgInfo::FLOAT; info.description = "Tune the LO with an offset and compensate with the baseband CORDIC."; SoapySDR::RangeList ranges = this->getFrequencyRange(dir, chan, comps.at(1)); if (not ranges.empty()) info.range = ranges.front(); args.push_back(info); } //every tunable component becomes an option for (size_t comp_i = 1; comp_i < comps.size(); comp_i++) { SoapySDR::ArgInfo info; info.key = comps[comp_i]; info.value = "DEFAULT"; info.units = "Hz"; info.type = SoapySDR::ArgInfo::FLOAT; info.description = "Specify a specific value for this component or IGNORE to skip tuning it."; info.options.push_back("DEFAULT"); info.optionNames.push_back("Default"); info.options.push_back("IGNORE"); info.optionNames.push_back("Ingore"); SoapySDR::RangeList ranges = this->getFrequencyRange(dir, chan, comps.at(comp_i)); if (not ranges.empty()) info.range = ranges.front(); args.push_back(info); } return args; }