aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/b200/b200_io_impl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/b200/b200_io_impl.cpp')
-rw-r--r--host/lib/usrp/b200/b200_io_impl.cpp19
1 files changed, 9 insertions, 10 deletions
diff --git a/host/lib/usrp/b200/b200_io_impl.cpp b/host/lib/usrp/b200/b200_io_impl.cpp
index 98347b114..85d61280f 100644
--- a/host/lib/usrp/b200/b200_io_impl.cpp
+++ b/host/lib/usrp/b200/b200_io_impl.cpp
@@ -82,9 +82,9 @@ void b200_impl::set_auto_tick_rate(
num_chans = std::max(size_t(1), max_chan_count());
}
const double max_tick_rate = ad9361_device_t::AD9361_MAX_CLOCK_RATE/num_chans;
+ using namespace uhd::math;
if (rate != 0.0 and
- (uhd::math::fp_compare::fp_compare_delta<double>(rate, uhd::math::FREQ_COMPARISON_DELTA_HZ) >
- uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ))) {
+ (fp_compare::fp_compare_delta<double>(rate, FREQ_COMPARISON_DELTA_HZ) > max_tick_rate)) {
throw uhd::value_error(str(
boost::format("Requested sampling rate (%.2f Msps) exceeds maximum tick rate of %.2f MHz.")
% (rate / 1e6) % (max_tick_rate / 1e6)
@@ -96,26 +96,25 @@ void b200_impl::set_auto_tick_rate(
boost::uint32_t lcm_rate = (rate == 0) ? 1 : static_cast<boost::uint32_t>(floor(rate + 0.5));
for (int i = 0; i < 2; i++) { // Loop through rx and tx
std::string dir = (i == 0) ? "tx" : "rx";
- // We have no way of knowing which DSPs are used, so we check them all.
+ // We assume all 'set' DSPs are being used.
BOOST_FOREACH(const std::string &dsp_no, _tree->list(str(boost::format("/mboards/0/%s_dsps") % dir))) {
fs_path dsp_path = str(boost::format("/mboards/0/%s_dsps/%s") % dir % dsp_no);
if (dsp_path == tree_dsp_path) {
continue;
}
+ if (not _tree->access<bool>(dsp_path / "rate/set").get()) {
+ continue;
+ }
double this_dsp_rate = _tree->access<double>(dsp_path / "rate/value").get();
// Check if the user selected something completely unreasonable:
- if (uhd::math::fp_compare::fp_compare_delta<double>(this_dsp_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ) >
- uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ)) {
+ if (fp_compare::fp_compare_delta<double>(this_dsp_rate, FREQ_COMPARISON_DELTA_HZ) > max_tick_rate) {
throw uhd::value_error(str(
boost::format("Requested sampling rate (%.2f Msps) exceeds maximum tick rate of %.2f MHz.")
% (this_dsp_rate / 1e6) % (max_tick_rate / 1e6)
));
}
- // If this_dsp_rate == 0.0, the sampling rate for this DSP hasn't been set, so
- // we don't take that into consideration.
- if (this_dsp_rate == 0.0) {
- continue;
- }
+ // Clean up floating point rounding errors if they crept in
+ this_dsp_rate = std::min(max_tick_rate, this_dsp_rate);
lcm_rate = boost::math::lcm<boost::uint32_t>(
lcm_rate,
static_cast<boost::uint32_t>(floor(this_dsp_rate + 0.5))