diff options
author | Nick Foster <nick@nerdnetworks.org> | 2010-08-12 10:30:53 -0700 |
---|---|---|
committer | Nick Foster <nick@nerdnetworks.org> | 2010-08-12 10:30:53 -0700 |
commit | 0d7c9c86aa3b307b652378d3bb17e052cbc987e1 (patch) | |
tree | 5d5b72467daa93674fa322c9588a1240f01c78ba /host/lib/utils | |
parent | 32c40b5f5956d29e3be1fc3c94a213f8f0d68f42 (diff) | |
parent | ef6953024f1075a729e85f2511c75de337879888 (diff) | |
download | uhd-0d7c9c86aa3b307b652378d3bb17e052cbc987e1.tar.gz uhd-0d7c9c86aa3b307b652378d3bb17e052cbc987e1.tar.bz2 uhd-0d7c9c86aa3b307b652378d3bb17e052cbc987e1.zip |
Merge branch 'master' of git@ettus.sourcerepo.com:ettus/uhdpriv into usrp2p
Diffstat (limited to 'host/lib/utils')
-rw-r--r-- | host/lib/utils/gain_group.cpp | 31 | ||||
-rw-r--r-- | host/lib/utils/paths.cpp | 12 |
2 files changed, 31 insertions, 12 deletions
diff --git a/host/lib/utils/gain_group.cpp b/host/lib/utils/gain_group.cpp index c113719c8..078fe56b2 100644 --- a/host/lib/utils/gain_group.cpp +++ b/host/lib/utils/gain_group.cpp @@ -35,6 +35,25 @@ static bool compare_by_step_size( return fcns.at(rhs).get_range().step > fcns.at(lhs).get_range().step; } +/*! + * Get a multiple of step with the following relation: + * result = step*floor(num/step) + * + * Due to small floating-point inaccuracies: + * num = n*step + e, where e is a small inaccuracy. + * When e is negative, floor would yeild (n-1)*step, + * despite that n*step is really the desired result. + * This function is designed to mitigate that issue. + * + * \param num the number to approximate + * \param step the step size to round with + * \param e the small inaccuracy to account for + * \return a multiple of step approximating num + */ +template <typename T> static T floor_step(T num, T step, T e = T(0.001)){ + return step*int(num/step + e); +} + /*********************************************************************** * gain group implementation **********************************************************************/ @@ -82,9 +101,9 @@ public: float gain_left_to_distribute = gain; BOOST_FOREACH(const gain_fcns_t &fcns, all_fcns){ const gain_range_t range = fcns.get_range(); - gain_bucket.push_back( - max_step*int(std::clip(gain_left_to_distribute, range.min, range.max)/max_step) - ); + gain_bucket.push_back(floor_step(std::clip( + gain_left_to_distribute, range.min, range.max + ), max_step)); gain_left_to_distribute -= gain_bucket.back(); } @@ -106,9 +125,9 @@ public: //fill in the largest step sizes first that are less than the remainder BOOST_FOREACH(size_t i, indexes_step_size_dec){ const gain_range_t range = all_fcns.at(i).get_range(); - float additional_gain = range.step*int( - std::clip(gain_bucket.at(i) + gain_left_to_distribute, range.min, range.max - )/range.step) - gain_bucket.at(i); + float additional_gain = floor_step(std::clip( + gain_bucket.at(i) + gain_left_to_distribute, range.min, range.max + ), range.step) - gain_bucket.at(i); gain_bucket.at(i) += additional_gain; gain_left_to_distribute -= additional_gain; } diff --git a/host/lib/utils/paths.cpp b/host/lib/utils/paths.cpp index 0805a44fe..4029bd989 100644 --- a/host/lib/utils/paths.cpp +++ b/host/lib/utils/paths.cpp @@ -60,12 +60,14 @@ static std::vector<fs::path> get_env_paths(const std::string &var_name){ //split the path at the path separators std::vector<std::string> path_strings; - boost::split(path_strings, var_value, boost::is_any_of(env_path_sep)); + if (not var_value.empty()) boost::split(//dont split empty strings + path_strings, var_value, boost::is_any_of(env_path_sep) + ); //convert to filesystem path, filter blank paths std::vector<fs::path> paths; BOOST_FOREACH(std::string &path_string, path_strings){ - if (path_string.size() == 0) continue; + if (path_string.empty()) continue; paths.push_back(fs::system_complete(path_string)); } return paths; @@ -74,17 +76,15 @@ static std::vector<fs::path> get_env_paths(const std::string &var_name){ /*********************************************************************** * Get a list of special purpose paths **********************************************************************/ -static const fs::path pkg_data_path = fs::path(UHD_INSTALL_PREFIX) / UHD_PKG_DATA_DIR; - std::vector<fs::path> get_image_paths(void){ std::vector<fs::path> paths = get_env_paths("UHD_IMAGE_PATH"); - paths.push_back(pkg_data_path / "images"); + paths.push_back(fs::path(UHD_INSTALL_PREFIX) / UHD_PKG_DATA_DIR / "images"); return paths; } std::vector<fs::path> get_module_paths(void){ std::vector<fs::path> paths = get_env_paths("UHD_MODULE_PATH"); - paths.push_back(pkg_data_path / "modules"); + paths.push_back(fs::path(UHD_INSTALL_PREFIX) / UHD_PKG_DATA_DIR / "modules"); return paths; } |