// // 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 . // #include #include #include #include #include #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("g1", 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("g2", 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(), 80, tolerance); BOOST_CHECK_CLOSE(gg->get_range().start(), -20, tolerance); BOOST_CHECK_CLOSE(gg->get_range().stop(), 100, tolerance); BOOST_CHECK_CLOSE(gg->get_range().step(), 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(), 80, tolerance); BOOST_CHECK_CLOSE(gg->get_range().start(), -20, tolerance); BOOST_CHECK_CLOSE(gg->get_range().stop(), 100, tolerance); BOOST_CHECK_CLOSE(gg->get_range().step(), 0.1, tolerance); //test the the higher priority gain got filled first (gain 2) BOOST_CHECK_CLOSE(g2.get_value(), g2.get_range().stop(), tolerance); }