aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDerek Kozel <derek.kozel@gmail.com>2018-11-26 00:43:53 +0000
committerMarcus Müller <marcus@hostalia.de>2020-01-29 12:16:53 +0100
commitae69e247aceda9cb169570e8f2bf645afc051e15 (patch)
treeceb651b0409a12d561edb760f420b43281d16f83
parentImprove complex math speed by disabling NaN/Inf checks (diff)
downloadgnuradio-ae69e247aceda9cb169570e8f2bf645afc051e15.tar.xz
gnuradio-ae69e247aceda9cb169570e8f2bf645afc051e15.zip
gr-uhd: Add filter API functions to the USRP blocks
-rw-r--r--gr-uhd/include/gnuradio/uhd/usrp_block.h30
-rw-r--r--gr-uhd/lib/usrp_block_impl.cc28
-rw-r--r--gr-uhd/lib/usrp_block_impl.h3
-rw-r--r--gr-uhd/swig/uhd_swig.i67
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 eabff061b..57a0fdfee 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 8f82b6727..50edc82b5 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 3d3a9e995..a81bd8a13 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 d8df47fb7..68941248f 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
////////////////////////////////////////////////////////////////////////