diff options
| author | Josh Blum <josh@joshknows.com> | 2010-01-28 19:54:55 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-01-28 19:54:55 -0800 | 
| commit | d5d9da3114bf069c05a8dcb7fca32ccd70405512 (patch) | |
| tree | 5c2c63efe9175ebd2b22c6b4899b997e9fed5b11 /include/usrp_uhd | |
| parent | fc1bffcfd9761c1f60cf322bb58e7f9c8096a5c0 (diff) | |
| download | uhd-d5d9da3114bf069c05a8dcb7fca32ccd70405512.tar.gz uhd-d5d9da3114bf069c05a8dcb7fca32ccd70405512.tar.bz2 uhd-d5d9da3114bf069c05a8dcb7fca32ccd70405512.zip  | |
Added gain handler class to manage wildcard gain settings.
Gets overall gains and sets overall gains when used.
Wild card gain will be a gain with an empty string name.
Diffstat (limited to 'include/usrp_uhd')
| -rw-r--r-- | include/usrp_uhd/Makefile.am | 1 | ||||
| -rw-r--r-- | include/usrp_uhd/gain_handler.hpp | 88 | ||||
| -rw-r--r-- | include/usrp_uhd/props.hpp | 12 | ||||
| -rw-r--r-- | include/usrp_uhd/utils.hpp | 47 | 
4 files changed, 142 insertions, 6 deletions
diff --git a/include/usrp_uhd/Makefile.am b/include/usrp_uhd/Makefile.am index fdb881498..0a19bfe56 100644 --- a/include/usrp_uhd/Makefile.am +++ b/include/usrp_uhd/Makefile.am @@ -10,6 +10,7 @@ this_includedir = $(includedir)/usrp_uhd  this_include_HEADERS = \  	device.hpp \  	device_addr.hpp \ +	gain_handler.hpp \  	props.hpp \  	utils.hpp \  	wax.hpp diff --git a/include/usrp_uhd/gain_handler.hpp b/include/usrp_uhd/gain_handler.hpp new file mode 100644 index 000000000..c2f3d0884 --- /dev/null +++ b/include/usrp_uhd/gain_handler.hpp @@ -0,0 +1,88 @@ +// +// Copyright 2010 Ettus Research LLC +// + +#include <boost/shared_ptr.hpp> +#include <usrp_uhd/wax.hpp> +#include <usrp_uhd/props.hpp> +#include <boost/function.hpp> +#include <boost/bind.hpp> + +#ifndef INCLUDED_USRP_UHD_GAIN_HANDLER_HPP +#define INCLUDED_USRP_UHD_GAIN_HANDLER_HPP + +namespace usrp_uhd{ + +class gain_handler{ +public: +    typedef boost::shared_ptr<gain_handler> sptr; + +    template <class T> gain_handler( +        wax::obj::ptr wax_obj_ptr, const T &gain_prop, +        const T &gain_min_prop, const T &gain_max_prop, +        const T &gain_step_prop, const T &gain_names_prop +    ){ +        _wax_obj_ptr = wax_obj_ptr; +        _gain_prop = gain_prop; +        _gain_min_prop = gain_min_prop; +        _gain_max_prop = gain_max_prop; +        _gain_step_prop = gain_step_prop; +        _gain_names_prop = gain_names_prop; +        _is_equal = boost::bind(&gain_handler::is_equal<T>, _1, _2); +    } + +    ~gain_handler(void); + +    /*! +     * Intercept gets for overall gain, min, max, step. +     * Ensures that the gain name is valid. +     * \return true for handled, false to pass on +     */ +    bool intercept_get(const wax::type &key, wax::type &val); + +    /*! +     * Intercept sets for overall gain. +     * Ensures that the gain name is valid. +     * Ensures that the new gain is within range. +     * \return true for handled, false to pass on +     */ +    bool intercept_set(const wax::type &key, const wax::type &val); + +private: + +    wax::obj::ptr  _wax_obj_ptr; +    wax::type      _gain_prop; +    wax::type      _gain_min_prop; +    wax::type      _gain_max_prop; +    wax::type      _gain_step_prop; +    wax::type      _gain_names_prop; + +    /*! +     * Verify that the key is valid: +     * If its a named prop for gain, ensure that name is valid. +     * If the name if not valid, throw a std::invalid_argument. +     * The name can only be valid if its in the list of gain names. +     */ +    void _check_key(const wax::type &key); + +    /* +     * Private interface to test if two wax types are equal: +     * The constructor will bind an instance of this for a specific type. +     * This bound equals functions allows the intercept methods to be non-templated. +     */ +    template <class T> static bool is_equal(const wax::type &a, const wax::type &b){ +        try{ +            return wax::cast<T>(a) == wax::cast<T>(b); +        } +        catch(const wax::bad_cast &){ +            return false; +        } +    } +    boost::function<bool(const wax::type &, const wax::type &)> _is_equal; + +}; + +} //namespace usrp_uhd + +#endif /* INCLUDED_USRP_UHD_GAIN_HANDLER_HPP */ + diff --git a/include/usrp_uhd/props.hpp b/include/usrp_uhd/props.hpp index 426554a53..b74493961 100644 --- a/include/usrp_uhd/props.hpp +++ b/include/usrp_uhd/props.hpp @@ -62,6 +62,18 @@ namespace usrp_uhd{      typedef boost::tuple<wax::type, std::string> named_prop_t;      /*! +     * Utility function to separate a named property into its components. +     * \param key a reference to the prop object +     * \param name a reference to the name object +     */ +    inline named_prop_t extract_named_prop(const wax::type &key, const std::string &name = ""){ +        if (key.type() == typeid(named_prop_t)){ +            return wax::cast<named_prop_t>(key); +        } +        return named_prop_t(key, name); +    } + +    /*!      * Possible device properties:      *   In general, a device will have a single mboard.      *   In certain mimo applications, multiple boards diff --git a/include/usrp_uhd/utils.hpp b/include/usrp_uhd/utils.hpp index a45473ab4..c1b2bad5c 100644 --- a/include/usrp_uhd/utils.hpp +++ b/include/usrp_uhd/utils.hpp @@ -3,15 +3,19 @@  //  #include <boost/foreach.hpp> -#include <map> +#include <boost/format.hpp> +#include <boost/function.hpp> +#include <stdexcept> +#include <algorithm>  #include <vector> +#include <map>  #ifndef INCLUDED_USRP_UHD_UTILS_HPP  #define INCLUDED_USRP_UHD_UTILS_HPP  namespace usrp_uhd{ -template <class Key, class T> +template <class Key, class T> //TODO template this better  std::vector<Key> get_map_keys(const std::map<Key, T> &m){      std::vector<Key> v;      std::pair<Key, T> p; @@ -21,12 +25,43 @@ std::vector<Key> get_map_keys(const std::map<Key, T> &m){      return v;  } -//TODO implement a set and get gains that takes a wx obj ptr, and gain properties +} //namespace usrp_uhd + +/*! + * Useful templated functions and classes that I like to pretend are part of stl + */ +namespace std{ -//TODO check name in vector of names +    class assert_error : public std::logic_error{ +    public: +        explicit assert_error(const string& what_arg) : logic_error(what_arg){ +            /* NOP */ +        } +    }; -//TODO optionally extract a name from the named_prop_t +    #define ASSERT_THROW(_x) if (not (_x)) { \ +        throw std::assert_error("Assertion Failed: " + std::string(#_x)); \ +    } -} //namespace usrp_uhd +    template<class T, class InputIterator, class Function> +    T reduce(InputIterator first, InputIterator last, Function fcn, T init = 0){ +        T tmp = init; +        for ( ; first != last; ++first ){ +            tmp = fcn(tmp, *first); +        } +        return tmp; +    } + +    template<class T, class InputIterator> +    bool has(InputIterator first, InputIterator last, const T &elem){ +        return last != std::find(first, last, elem); +    } + +    template <class T> +    T sum(const T &a, const T &b){ +        return a + b; +    } + +}//namespace std  #endif /* INCLUDED_USRP_UHD_UTILS_HPP */  | 
