diff options
author | Derek Kozel <derek.kozel@gmail.com> | 2018-11-26 00:43:53 +0000 |
---|---|---|
committer | Marcus Müller <marcus@hostalia.de> | 2020-01-29 12:16:53 +0100 |
commit | ae69e247aceda9cb169570e8f2bf645afc051e15 (patch) | |
tree | ceb651b0409a12d561edb760f420b43281d16f83 | |
parent | 785a889ae877c5e4bb6086b3742a3ab13921919b (diff) |
gr-uhd: Add filter API functions to the USRP blocks
-rw-r--r-- | gr-uhd/include/gnuradio/uhd/usrp_block.h | 30 | ||||
-rw-r--r-- | gr-uhd/lib/usrp_block_impl.cc | 28 | ||||
-rw-r--r-- | gr-uhd/lib/usrp_block_impl.h | 3 | ||||
-rw-r--r-- | gr-uhd/swig/uhd_swig.i | 67 |
4 files changed, 127 insertions, 1 deletions
diff --git a/gr-uhd/include/gnuradio/uhd/usrp_block.h b/gr-uhd/include/gnuradio/uhd/usrp_block.h index eabff061be..57a0fdfee3 100644 --- a/gr-uhd/include/gnuradio/uhd/usrp_block.h +++ b/gr-uhd/include/gnuradio/uhd/usrp_block.h @@ -542,6 +542,36 @@ public: virtual boost::uint32_t get_gpio_attr(const std::string& bank, const std::string& attr, const size_t mboard = 0) = 0; + + /*! + * Enumerate the available filters in the signal path. + * \param search_mask + * \parblock + * Select only certain filter names by specifying this search mask. + * + * E.g. if search mask is set to "rx_frontends/A" only filter names including + * that string will be returned. \endparblock \return a vector of strings + * representing the selected filter names. + */ + virtual std::vector<std::string> + get_filter_names(const std::string& search_mask = "") = 0; + + /*! + * Write back a filter obtained by get_filter() to the signal path. + * This filter can be a modified version of the originally returned one. + * The information about Rx or Tx is contained in the path parameter. + * \param path the name of the filter as returned from get_filter_names(). + * \param filter the filter_info_base::sptr of the filter object to be written + */ + virtual void set_filter(const std::string& path, + ::uhd::filter_info_base::sptr filter) = 0; + + /*! + * Return the filter object for the given name. + * @param path the name of the filter as returned from get_filter_names() + * @return the filter object + */ + virtual ::uhd::filter_info_base::sptr get_filter(const std::string& path) = 0; }; } /* namespace uhd */ diff --git a/gr-uhd/lib/usrp_block_impl.cc b/gr-uhd/lib/usrp_block_impl.cc index 8f82b6727f..50edc82b5b 100644 --- a/gr-uhd/lib/usrp_block_impl.cc +++ b/gr-uhd/lib/usrp_block_impl.cc @@ -355,6 +355,34 @@ boost::uint32_t usrp_block_impl::get_gpio_attr(const std::string& bank, #endif } +std::vector<std::string> usrp_block_impl::get_filter_names(const std::string& search_mask) +{ +#ifdef UHD_USRP_MULTI_FILTER_API + return _dev->get_filter_names(search_mask); +#else + throw std::runtime_error("not implemented in this version"); +#endif +} + +::uhd::filter_info_base::sptr usrp_block_impl::get_filter(const std::string& path) +{ +#ifdef UHD_USRP_MULTI_FILTER_API + return _dev->get_filter(path); +#else + throw std::runtime_error("not implemented in this version"); +#endif +} + +void usrp_block_impl::set_filter(const std::string& path, + ::uhd::filter_info_base::sptr filter) +{ +#ifdef UHD_USRP_MULTI_FILTER_API + _dev->set_filter(path, filter); +#else + throw std::runtime_error("not implemented in this version"); +#endif +} + void usrp_block_impl::set_time_now(const ::uhd::time_spec_t& time_spec, size_t mboard) { return _dev->set_time_now(time_spec, mboard); diff --git a/gr-uhd/lib/usrp_block_impl.h b/gr-uhd/lib/usrp_block_impl.h index 3d3a9e9958..a81bd8a137 100644 --- a/gr-uhd/lib/usrp_block_impl.h +++ b/gr-uhd/lib/usrp_block_impl.h @@ -56,6 +56,8 @@ public: const std::string& attr, const size_t mboard = 0); size_t get_num_mboards(); + std::vector<std::string> get_filter_names(const std::string& search_mask); + ::uhd::filter_info_base::sptr get_filter(const std::string& path); // Setters void set_time_source(const std::string& source, const size_t mboard); @@ -72,6 +74,7 @@ public: const boost::uint32_t value, const boost::uint32_t mask, const size_t mboard); + void set_filter(const std::string& path, ::uhd::filter_info_base::sptr filter); // RPC void setup_rpc(); diff --git a/gr-uhd/swig/uhd_swig.i b/gr-uhd/swig/uhd_swig.i index d8df47fb7d..68941248fb 100644 --- a/gr-uhd/swig/uhd_swig.i +++ b/gr-uhd/swig/uhd_swig.i @@ -14,6 +14,8 @@ #define GR_UHD_API +#include <uhd/version.hpp> + //suppress 319. No access specifier given for base class name (ignored). #pragma SWIG nowarn=319 @@ -105,15 +107,78 @@ %include <uhd/stream.hpp> +%include <uhd/types/filters.hpp> + +%include stdint.i + +// Used for lists of filter taps +%template(uhd_vector_int16_t) std::vector<int16_t>; + //////////////////////////////////////////////////////////////////////// // swig dboard_iface for python access //////////////////////////////////////////////////////////////////////// -%include stdint.i %include <uhd/types/serial.hpp> %include <uhd/usrp/dboard_iface.hpp> +#if UHD_VERSION < 4000000 + +%template(filter_info_base_sptr) boost::shared_ptr<uhd::filter_info_base>; +%template(analog_filter_base_stpr) boost::shared_ptr<uhd::analog_filter_base>; +%template(analog_filter_lp_stpr) boost::shared_ptr<uhd::analog_filter_lp>; +%template(digital_filter_base_int16_t_sptr) boost::shared_ptr<uhd::digital_filter_base<int16_t>>; +%template(digital_filter_fir_int16_t_sptr) boost::shared_ptr<uhd::digital_filter_fir<int16_t>>; + +%extend uhd::filter_info_base{ + boost::shared_ptr<uhd::analog_filter_base> to_analog_info_base(boost::shared_ptr<uhd::filter_info_base> ptr) { + return boost::dynamic_pointer_cast<uhd::analog_filter_base>(ptr); + } + + boost::shared_ptr<uhd::analog_filter_lp> to_analog_filter_lp(boost::shared_ptr<uhd::filter_info_base> ptr) { + return boost::dynamic_pointer_cast<uhd::analog_filter_lp>(ptr); + } + + boost::shared_ptr<uhd::digital_filter_base<int16_t>> to_digital_filter_base_int16(boost::shared_ptr<uhd::filter_info_base> ptr) { + return boost::dynamic_pointer_cast<uhd::digital_filter_base<int16_t>>(ptr); + } + + boost::shared_ptr<uhd::digital_filter_fir<int16_t>> to_digital_filter_fir_int16(boost::shared_ptr<uhd::filter_info_base> ptr) { + return boost::dynamic_pointer_cast<uhd::digital_filter_fir<int16_t>>(ptr); + } +} + %template(dboard_iface_sptr) boost::shared_ptr<uhd::usrp::dboard_iface>; +#else + +%template(filter_info_base_sptr) std::shared_ptr<uhd::filter_info_base>; +%template(analog_filter_base_stpr) std::shared_ptr<uhd::analog_filter_base>; +%template(analog_filter_lp_stpr) std::shared_ptr<uhd::analog_filter_lp>; +%template(digital_filter_base_int16_t_sptr) std::shared_ptr<uhd::digital_filter_base<int16_t>>; +%template(digital_filter_fir_int16_t_sptr) std::shared_ptr<uhd::digital_filter_fir<int16_t>>; + +%extend uhd::filter_info_base{ + std::shared_ptr<uhd::analog_filter_base> to_analog_info_base(std::shared_ptr<uhd::filter_info_base> ptr) { + return std::dynamic_pointer_cast<uhd::analog_filter_base>(ptr); + } + + std::shared_ptr<uhd::analog_filter_lp> to_analog_filter_lp(std::shared_ptr<uhd::filter_info_base> ptr) { + return std::dynamic_pointer_cast<uhd::analog_filter_lp>(ptr); + } + + std::shared_ptr<uhd::digital_filter_base<int16_t>> to_digital_filter_base_int16(std::shared_ptr<uhd::filter_info_base> ptr) { + return std::dynamic_pointer_cast<uhd::digital_filter_base<int16_t>>(ptr); + } + + std::shared_ptr<uhd::digital_filter_fir<int16_t>> to_digital_filter_fir_int16(std::shared_ptr<uhd::filter_info_base> ptr) { + return std::dynamic_pointer_cast<uhd::digital_filter_fir<int16_t>>(ptr); + } + +%template(dboard_iface_sptr) std::shared_ptr<uhd::usrp::dboard_iface>; + +} + +#endif + //////////////////////////////////////////////////////////////////////// // block magic //////////////////////////////////////////////////////////////////////// |