diff options
| author | Josh Blum <josh@joshknows.com> | 2010-08-06 15:18:02 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-08-06 15:18:02 -0700 | 
| commit | 03ccbeb6411c0c13adf54bde4c19372ffa141aa0 (patch) | |
| tree | b3b1c1b801495775db74b0c66f273166131b68a0 /host/test | |
| parent | 5fe5ff0655a410aac686d130daf9a77e39fd01b5 (diff) | |
| parent | d1711722dd432ba63b54f93d92270d4050465204 (diff) | |
| download | uhd-03ccbeb6411c0c13adf54bde4c19372ffa141aa0.tar.gz uhd-03ccbeb6411c0c13adf54bde4c19372ffa141aa0.tar.bz2 uhd-03ccbeb6411c0c13adf54bde4c19372ffa141aa0.zip | |
Merge branch 'codec_gains'
Conflicts:
	host/lib/usrp/mimo_usrp.cpp
	host/lib/usrp/simple_usrp.cpp
	host/test/CMakeLists.txt
Diffstat (limited to 'host/test')
| -rw-r--r-- | host/test/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | host/test/gain_group_test.cpp | 122 | ||||
| -rw-r--r-- | host/test/gain_handler_test.cpp | 121 | 
3 files changed, 123 insertions, 122 deletions
| diff --git a/host/test/CMakeLists.txt b/host/test/CMakeLists.txt index 1b909aa39..c620fd641 100644 --- a/host/test/CMakeLists.txt +++ b/host/test/CMakeLists.txt @@ -26,7 +26,7 @@ ADD_EXECUTABLE(main_test      convert_types_test.cpp      dict_test.cpp      error_test.cpp -    gain_handler_test.cpp +    gain_group_test.cpp      subdev_spec_test.cpp      tune_helper_test.cpp      vrt_test.cpp diff --git a/host/test/gain_group_test.cpp b/host/test/gain_group_test.cpp new file mode 100644 index 000000000..6a6af8eb2 --- /dev/null +++ b/host/test/gain_group_test.cpp @@ -0,0 +1,122 @@ +// +// Copyright 2010 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <boost/test/unit_test.hpp> +#include <uhd/utils/gain_group.hpp> +#include <boost/bind.hpp> +#include <boost/math/special_functions/round.hpp> +#include <iostream> + +#define rint(x) boost::math::iround(x) + +using namespace uhd; + +/*********************************************************************** + * Define gain element classes with needed functions + **********************************************************************/ +class gain_element1{ +public: + +    gain_range_t get_range(void){ +        return gain_range_t(0, 90, 1); +    } + +    float get_value(void){ +        return _gain; +    } + +    void set_value(float gain){ +        float step = get_range().step; +        _gain = step*rint(gain/step); +    } + +private: +    float _gain; +}; + +class gain_element2{ +public: + +    gain_range_t get_range(void){ +        return gain_range_t(-20, 10, 0.1); +    } + +    float get_value(void){ +        return _gain; +    } + +    void set_value(float gain){ +        float step = get_range().step; +        _gain = step*rint(gain/step); +    } + +private: +    float _gain; +}; + +//create static instances of gain elements to be shared by the tests +static gain_element1 g1; +static gain_element2 g2; + +static gain_group::sptr get_gain_group(size_t pri1 = 0, size_t pri2 = 0){ +    //create instance of gain group +    gain_fcns_t gain_fcns; +    gain_group::sptr gg(gain_group::make()); + +    //load gain group with function sets +    gain_fcns.get_range = boost::bind(&gain_element1::get_range, &g1); +    gain_fcns.get_value = boost::bind(&gain_element1::get_value, &g1); +    gain_fcns.set_value = boost::bind(&gain_element1::set_value, &g1, _1); +    gg->register_fcns(gain_fcns, pri1); + +    gain_fcns.get_range = boost::bind(&gain_element2::get_range, &g2); +    gain_fcns.get_value = boost::bind(&gain_element2::get_value, &g2); +    gain_fcns.set_value = boost::bind(&gain_element2::set_value, &g2, _1); +    gg->register_fcns(gain_fcns, pri2); + +    return gg; +} + +/*********************************************************************** + * Test cases + **********************************************************************/ +static const double tolerance = 0.001; + +BOOST_AUTO_TEST_CASE(test_gain_group_overall){ +    gain_group::sptr gg = get_gain_group(); + +    //test the overall stuff +    gg->set_value(80); +    BOOST_CHECK_CLOSE(gg->get_value(), float(80), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().min, float(-20), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().max, float(100), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().step, float(0.1), tolerance); +} + +BOOST_AUTO_TEST_CASE(test_gain_group_priority){ +    gain_group::sptr gg = get_gain_group(0, 1); + +    //test the overall stuff +    gg->set_value(80); +    BOOST_CHECK_CLOSE(gg->get_value(), float(80), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().min, float(-20), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().max, float(100), tolerance); +    BOOST_CHECK_CLOSE(gg->get_range().step, float(0.1), tolerance); + +    //test the the higher priority gain got filled first (gain 2) +    BOOST_CHECK_CLOSE(g2.get_value(), g2.get_range().max, tolerance); +} diff --git a/host/test/gain_handler_test.cpp b/host/test/gain_handler_test.cpp deleted file mode 100644 index 5a9f2b714..000000000 --- a/host/test/gain_handler_test.cpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// Copyright 2010 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program.  If not, see <http://www.gnu.org/licenses/>. -// - -#include <boost/test/unit_test.hpp> -#include <uhd/utils/gain_handler.hpp> -#include <uhd/types/ranges.hpp> -#include <uhd/types/dict.hpp> -#include <uhd/utils/props.hpp> -#include <boost/bind.hpp> -#include <iostream> - -using namespace uhd; - -enum prop_t{ -    PROP_GAIN_VALUE, -    PROP_GAIN_RANGE, -    PROP_GAIN_NAMES -}; - -class gainful_obj : public wax::obj{ -public: -    gainful_obj(void){ -        //initialize gain props struct -        gain_handler::props_t gain_props; -        gain_props.value = PROP_GAIN_VALUE; -        gain_props.range = PROP_GAIN_RANGE; -        gain_props.names = PROP_GAIN_NAMES; -        //make a new gain handler -        _gain_handler = gain_handler::make( -            this->get_link(), gain_props, -            boost::bind(&gain_handler::is_equal<prop_t>, _1, _2) -        ); -        _gain_values["g0"] = 0; -        _gain_values["g1"] = 0; -        _gain_ranges["g0"] = gain_range_t(-10, 0, float(.1)); -        _gain_ranges["g1"] = gain_range_t(0, 100, float(1.5)); -    } - -    ~gainful_obj(void){} - -private: -    void get(const wax::obj &key_, wax::obj &val){ -        if (_gain_handler->intercept_get(key_, val)) return; - -        wax::obj key; std::string name; -        boost::tie(key, name) = extract_named_prop(key_); - -        //handle the get request conditioned on the key -        switch(key.as<prop_t>()){ -        case PROP_GAIN_VALUE: -            val = _gain_values[name]; -            return; - -        case PROP_GAIN_RANGE: -            val = _gain_ranges[name]; -            return; - -        case PROP_GAIN_NAMES: -            val = _gain_values.keys(); -            return; - -        default: UHD_THROW_PROP_GET_ERROR(); -        } -    } - -    void set(const wax::obj &key_, const wax::obj &val){ -        if (_gain_handler->intercept_set(key_, val)) return; - -        wax::obj key; std::string name; -        boost::tie(key, name) = extract_named_prop(key_); - -        //handle the get request conditioned on the key -        switch(key.as<prop_t>()){ -        case PROP_GAIN_VALUE: -            _gain_values[name] = val.as<float>(); -            return; - -        default: UHD_THROW_PROP_SET_ERROR(); -        } -    } - -    gain_handler::sptr _gain_handler; -    uhd::dict<std::string, float> _gain_values; -    uhd::dict<std::string, gain_range_t> _gain_ranges; - -}; - -BOOST_AUTO_TEST_CASE(test_gain_handler){ -    std::cout << "Testing the gain handler..." << std::endl; -    gainful_obj go0; - -    BOOST_CHECK_THROW( -        go0[named_prop_t(PROP_GAIN_VALUE, "fail")].as<float>(), -        std::exception -    ); - -    std::cout << "verifying the overall min, max, step" << std::endl; -    gain_range_t gain = go0[PROP_GAIN_RANGE].as<gain_range_t>(); -    BOOST_CHECK_EQUAL(gain.min, float(-10)); -    BOOST_CHECK_EQUAL(gain.max, float(100)); -    BOOST_CHECK_EQUAL(gain.step, float(1.5)); - -    std::cout << "verifying the overall gain" << std::endl; -    go0[named_prop_t(PROP_GAIN_VALUE, "g0")] = float(-5); -    go0[named_prop_t(PROP_GAIN_VALUE, "g1")] = float(30); -    BOOST_CHECK_EQUAL(go0[PROP_GAIN_VALUE].as<float>(), float(25)); -} | 
