From 4e391500b54a22dbaae8692750ec25ae8a97ee6d Mon Sep 17 00:00:00 2001 From: Lane Kolbly Date: Wed, 8 Dec 2021 14:12:28 -0600 Subject: host: Implement nameless_gain_mixin --- .../rfnoc/rf_control/nameless_gain_mixin.hpp | 58 ++++++++++++++++++++++ .../include/uhdlib/usrp/dboard/zbx/zbx_dboard.hpp | 26 ++++------ 2 files changed, 68 insertions(+), 16 deletions(-) create mode 100644 host/lib/include/uhdlib/rfnoc/rf_control/nameless_gain_mixin.hpp (limited to 'host/lib/include') diff --git a/host/lib/include/uhdlib/rfnoc/rf_control/nameless_gain_mixin.hpp b/host/lib/include/uhdlib/rfnoc/rf_control/nameless_gain_mixin.hpp new file mode 100644 index 000000000..149623352 --- /dev/null +++ b/host/lib/include/uhdlib/rfnoc/rf_control/nameless_gain_mixin.hpp @@ -0,0 +1,58 @@ +// +// Copyright 2021 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace uhd { namespace rfnoc { namespace rf_control { + +/*! Partially implements core_iface for the gain functions which take no name parameter + */ +class nameless_gain_mixin : virtual public core_iface +{ +public: + using name_selector = + std::function; + + /*! Sets the name selector for the mixin. The closure receives the direction + * of the call and the channel, and returns the gain to use for the call. The + * name selector may simply return a string, or may do a more complex algorithm. + */ + nameless_gain_mixin(name_selector name_selector); + + virtual ~nameless_gain_mixin() = default; + + double set_tx_gain(const double gain, const size_t chan) override; + double get_tx_gain(const size_t chan) override; + + double set_rx_gain(const double gain, const size_t chan) override; + double get_rx_gain(const size_t chan) override; + + // Getting the gain ranges is a bit different - these always use the empty name + gain_range_t get_tx_gain_range(const size_t chan) const override; + gain_range_t get_rx_gain_range(const size_t chan) const override; + +private: + name_selector _name_selector; + + using core_iface::get_tx_gain; + using core_iface::get_tx_gain_range; + using core_iface::set_tx_gain; + + using core_iface::get_rx_gain; + using core_iface::get_rx_gain_range; + using core_iface::set_rx_gain; +}; + +}}} // namespace uhd::rfnoc::rf_control diff --git a/host/lib/include/uhdlib/usrp/dboard/zbx/zbx_dboard.hpp b/host/lib/include/uhdlib/usrp/dboard/zbx/zbx_dboard.hpp index 6e1d31381..60666fd83 100644 --- a/host/lib/include/uhdlib/usrp/dboard/zbx/zbx_dboard.hpp +++ b/host/lib/include/uhdlib/usrp/dboard/zbx/zbx_dboard.hpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,8 @@ const static uint16_t ZBX_PID = 0x4002; */ class zbx_dboard_impl : public uhd::usrp::x400::x400_dboard_iface, - public uhd::rfnoc::rf_control::antenna_radio_control_mixin + public uhd::rfnoc::rf_control::antenna_radio_control_mixin, + public uhd::rfnoc::rf_control::nameless_gain_mixin { public: using sptr = std::shared_ptr; @@ -140,28 +142,20 @@ public: .get(); } - double set_tx_gain(const double gain, const size_t chan) override; + using core_iface::set_tx_gain; + using core_iface::get_tx_gain; + using core_iface::set_rx_gain; + using core_iface::get_rx_gain; + using core_iface::get_tx_gain_range; + using core_iface::get_rx_gain_range; + double set_tx_gain( const double gain, const std::string& name, const size_t chan) override; - double set_rx_gain(const double gain, const size_t chan) override; double set_rx_gain( const double gain, const std::string& name, const size_t chan) override; - double get_rx_gain(const size_t chan) override; - double get_tx_gain(const size_t chan) override; double get_rx_gain(const std::string& name, const size_t chan) override; double get_tx_gain(const std::string& name, const size_t chan) override; - uhd::gain_range_t get_tx_gain_range(const size_t /*chan*/) const override - { - return ZBX_TX_GAIN_RANGE; - } - uhd::gain_range_t get_rx_gain_range(const size_t /*chan*/) const override - { - // FIXME This should return a ZBX_RX_LOW_FREQ_GAIN_RANGE when freq is - // low, but this function is const - return ZBX_RX_GAIN_RANGE; - } - // LO Property Getters std::vector get_tx_lo_names(const size_t /*chan*/) const override { -- cgit v1.2.3