diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/CMakeLists.txt | 31 | ||||
| -rw-r--r-- | host/lib/gain_handler.cpp | 28 | ||||
| -rw-r--r-- | host/lib/load_modules.cpp | 117 | ||||
| -rw-r--r-- | host/lib/simple_device.cpp | 34 | ||||
| -rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp (renamed from host/lib/transport/udp_zero_copy_none.cpp) | 0 | ||||
| -rw-r--r-- | host/lib/types.cpp | 57 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/basic.cpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dboard_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dsp_impl.cpp | 4 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 84 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 54 | 
12 files changed, 289 insertions, 127 deletions
diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index e547fef85..a7dded86b 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -22,9 +22,11 @@ SET(libuhd_sources      device.cpp      device_addr.cpp      gain_handler.cpp +    load_modules.cpp      metadata.cpp      simple_device.cpp      time_spec.cpp +    types.cpp      wax.cpp      transport/udp_simple.cpp      transport/vrt.cpp @@ -44,7 +46,7 @@ SET(libuhd_sources  # Conditionally add the udp sources  ########################################################################  LIST(APPEND libuhd_sources -    transport/udp_zero_copy_none.cpp +    transport/udp_zero_copy_asio.cpp  )  ######################################################################## @@ -78,13 +80,34 @@ ELSE(HAS_USRP1E_REQUIRED_HEADERS)  ENDIF(HAS_USRP1E_REQUIRED_HEADERS)  ######################################################################## +# Setup defines for module loading +######################################################################## +INCLUDE(CheckIncludeFileCXX) + +CHECK_INCLUDE_FILE_CXX(dlfcn.h HAVE_DLFCN_H) +CHECK_INCLUDE_FILE_CXX(Winbase.h HAVE_WINBASE_H) + +IF(HAVE_DLFCN_H) +    MESSAGE(STATUS "Module loading supported through dlopen...") +    ADD_DEFINITIONS(-DHAVE_DLFCN_H) +ELSEIF(HAVE_WINBASE_H) +    MESSAGE(STATUS "Module loading supported through LoadLibrary...") +    ADD_DEFINITIONS(-DHAVE_WINBASE_H) +ELSE(HAVE_DLFCN_H) +    MESSAGE(STATUS "Module loading not supported...") +ENDIF(HAVE_DLFCN_H) + +########################################################################  # Setup libuhd library  ########################################################################  ADD_LIBRARY(uhd SHARED ${libuhd_sources}) -TARGET_LINK_LIBRARIES(uhd ${Boost_LIBRARIES}) +TARGET_LINK_LIBRARIES(uhd ${Boost_LIBRARIES} ${CMAKE_DL_LIBS}) + +SET_TARGET_PROPERTIES(uhd PROPERTIES DEFINE_SYMBOL "UHD_DLL_EXPORTS")  INSTALL(TARGETS uhd -    LIBRARY DESTINATION ${LIBRARY_DIR} -    ARCHIVE DESTINATION ${LIBRARY_DIR} +    LIBRARY DESTINATION ${LIBRARY_DIR} # .so file +    ARCHIVE DESTINATION ${LIBRARY_DIR} # .lib file +    RUNTIME DESTINATION ${LIBRARY_DIR} # .dll file  ) diff --git a/host/lib/gain_handler.cpp b/host/lib/gain_handler.cpp index 847bc0528..7dd1547cb 100644 --- a/host/lib/gain_handler.cpp +++ b/host/lib/gain_handler.cpp @@ -17,10 +17,12 @@  #include <uhd/gain_handler.hpp>  #include <uhd/utils.hpp> +#include <uhd/types.hpp>  #include <uhd/props.hpp>  #include <boost/assign/list_of.hpp>  #include <boost/foreach.hpp>  #include <boost/format.hpp> +#include <cmath>  #include <vector>  using namespace uhd; @@ -99,12 +101,10 @@ gain_t gain_handler_impl::get_overall_gain_val(void){  gain_range_t gain_handler_impl::get_overall_gain_range(void){      gain_t gain_min = 0, gain_max = 0, gain_step = 0;      BOOST_FOREACH(std::string name, get_gain_names()){ -        gain_t gain_min_tmp, gain_max_tmp, gain_step_tmp; -        boost::tie(gain_min_tmp, gain_max_tmp, gain_step_tmp) = \ -            get_named_prop<gain_range_t>(_props.range, name); -        gain_min += gain_min_tmp; -        gain_max += gain_max_tmp; -        gain_step = std::max(gain_step, gain_step_tmp); +        gain_range_t gain_tmp = get_named_prop<gain_range_t>(_props.range, name); +        gain_min += gain_tmp.min; +        gain_max += gain_tmp.max; +        gain_step = std::max(gain_step, gain_tmp.step);      }      return gain_range_t(gain_min, gain_max, gain_step);  } @@ -150,12 +150,10 @@ bool gain_handler_impl::intercept_set(const wax::obj &key_, const wax::obj &val)      //not a wildcard... dont handle (but check name and range)      if (name != ""){          assert_has(get_gain_names(), name, "gain name"); -        gain_t gain_min, gain_max, gain_step; -        boost::tie(gain_min, gain_max, gain_step) = \ -            get_named_prop<gain_range_t>(_props.range, name); -        if (gain_val > gain_max or gain_val < gain_min) throw std::range_error(str( +        gain_range_t gain = get_named_prop<gain_range_t>(_props.range, name); +        if (gain_val > gain.max or gain_val < gain.min) throw std::range_error(str(              boost::format("A value of %f for gain %s is out of range of (%f, %f)") -            % gain_val % name % gain_min % gain_max +            % gain_val % name % gain.min % gain.max          ));          return false;      } @@ -163,14 +161,12 @@ bool gain_handler_impl::intercept_set(const wax::obj &key_, const wax::obj &val)      //set the overall gain      BOOST_FOREACH(std::string name, get_gain_names()){          //get the min, max, step for this gain name -        gain_t gain_min, gain_max, gain_step; -        boost::tie(gain_min, gain_max, gain_step) = \ -            get_named_prop<gain_range_t>(_props.range, name); +        gain_range_t gain = get_named_prop<gain_range_t>(_props.range, name);          //clip g to be within the allowed range -        gain_t g = std::min(std::max(gain_val, gain_min), gain_max); +        gain_t g = std::min(std::max(gain_val, gain.min), gain.max);          //set g to be a multiple of the step size -        g -= fmod(g, gain_step); +        g -= std::fmod(g, gain.step);          //set g to be the new gain          _link[named_prop_t(_props.value, name)] = g;          //subtract g out of the total gain left to apply diff --git a/host/lib/load_modules.cpp b/host/lib/load_modules.cpp new file mode 100644 index 000000000..700afcd3f --- /dev/null +++ b/host/lib/load_modules.cpp @@ -0,0 +1,117 @@ +// +// 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 <uhd/utils.hpp> +#include <boost/format.hpp> +#include <boost/foreach.hpp> +#include <boost/algorithm/string.hpp> +#include <boost/filesystem.hpp> +#include <iostream> +#include <stdexcept> +#include <cstdlib> + +namespace fs = boost::filesystem; + +/*********************************************************************** + * Module Load Function + **********************************************************************/ +#ifdef HAVE_DLFCN_H +#include <dlfcn.h> + +static void load_module(const std::string &file_name){ +    if (dlopen(file_name.c_str(), RTLD_LAZY) == NULL){ +        throw std::runtime_error(str( +            boost::format("dlopen failed to load \"%s\"") % file_name +        )); +    } +} + +#elif HAVE_WINBASE_H +#include <Winbase.h> + +static void load_module(const std::string &file_name){ +    if (LoadLibrary(file_name.c_str()) == NULL){ +        throw std::runtime_error(str( +            boost::format("LoadLibrary failed to load \"%s\"") % file_name +        )); +    } +} + +#else + +static void load_module(const std::string &file_name){ +    throw std::runtime_error(str( +        boost::format("Module loading not supported: Cannot load \"%s\"") % file_name +    )); +} + +#endif + +/*********************************************************************** + * Load Modules + **********************************************************************/ +/*! + * Load all modules in a given path. + * This will recurse into sub-directories. + * Does not throw, prints to std error. + * \param path the filesystem path + */ +static void load_path(const fs::path &path){ +    if (not fs::exists(path)){ +        std::cerr << boost::format("Module path \"%s\" not found.") % path.file_string() << std::endl; +        return; +    } + +    //try to load the files in this path +    if (fs::is_directory(path)){ +        for( +            fs::directory_iterator dir_itr(path); +            dir_itr != fs::directory_iterator(); +            ++dir_itr +        ){ +            load_path(dir_itr->path()); +        } +        return; +    } + +    //its not a directory, try to load it +    try{ +        load_module(path.file_string()); +    } +    catch(const std::exception &err){ +        std::cerr << boost::format("Error: %s") % err.what() << std::endl; +    } +} + +/*! + * Load all the modules given by the module path enviroment variable. + * The path variable may be several paths split by path separators. + */ +STATIC_BLOCK(load_modules){ +    //get the environment variable module path +    char *env_module_path = std::getenv("UHD_MODULE_PATH"); +    if (env_module_path == NULL) return; + +    //split the path at the path separators +    std::vector<std::string> module_paths; +    boost::split(module_paths, env_module_path, boost::is_any_of(":;")); + +    //load modules in each path +    BOOST_FOREACH(const std::string &module_path, module_paths){ +        load_path(fs::system_complete(fs::path(module_path))); +    } +} diff --git a/host/lib/simple_device.cpp b/host/lib/simple_device.cpp index 79b035071..ba1966e0d 100644 --- a/host/lib/simple_device.cpp +++ b/host/lib/simple_device.cpp @@ -19,18 +19,14 @@  #include <uhd/device.hpp>  #include <uhd/utils.hpp>  #include <uhd/props.hpp> +#include <uhd/types.hpp>  #include <boost/algorithm/string.hpp> -#include <boost/algorithm/string/trim.hpp>  #include <boost/foreach.hpp>  #include <boost/format.hpp>  #include <stdexcept>  using namespace uhd; -tune_result_t::tune_result_t(void){ -    /* NOP */ -} -  /***********************************************************************   * Tune Helper Function   **********************************************************************/ @@ -196,11 +192,8 @@ public:          return tune(target_freq, lo_offset, _rx_subdev, _rx_ddc, false/* not tx */);      } -    std::vector<double> get_rx_freq_range(void){ -        std::vector<double> range(2); -        boost::tie(range[0], range[1]) = \ -            _rx_subdev[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(); -        return range; +    freq_range_t get_rx_freq_range(void){ +        return _rx_subdev[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>();      }      void set_rx_gain(float gain){ @@ -211,11 +204,8 @@ public:          return _rx_subdev[SUBDEV_PROP_GAIN].as<gain_t>();      } -    std::vector<float> get_rx_gain_range(void){ -        std::vector<float> range(3); -        boost::tie(range[0], range[1], range[2]) = \ -            _rx_subdev[SUBDEV_PROP_GAIN_RANGE].as<gain_range_t>(); -        return range; +    gain_range_t get_rx_gain_range(void){ +        return _rx_subdev[SUBDEV_PROP_GAIN_RANGE].as<gain_range_t>();      }      void set_rx_antenna(const std::string &ant){ @@ -258,11 +248,8 @@ public:          return tune(target_freq, lo_offset, _tx_subdev, _tx_duc, true/* is tx */);      } -    std::vector<double> get_tx_freq_range(void){ -        std::vector<double> range(2); -        boost::tie(range[0], range[1]) = \ -            _tx_subdev[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(); -        return range; +    freq_range_t get_tx_freq_range(void){ +        return _tx_subdev[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>();      }      void set_tx_gain(float gain){ @@ -273,11 +260,8 @@ public:          return _tx_subdev[SUBDEV_PROP_GAIN].as<gain_t>();      } -    std::vector<float> get_tx_gain_range(void){ -        std::vector<float> range(3); -        boost::tie(range[0], range[1], range[2]) = \ -            _tx_subdev[SUBDEV_PROP_GAIN_RANGE].as<gain_range_t>(); -        return range; +    gain_range_t get_tx_gain_range(void){ +        return _tx_subdev[SUBDEV_PROP_GAIN_RANGE].as<gain_range_t>();      }      void set_tx_antenna(const std::string &ant){ diff --git a/host/lib/transport/udp_zero_copy_none.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 219ae8720..219ae8720 100644 --- a/host/lib/transport/udp_zero_copy_none.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp diff --git a/host/lib/types.cpp b/host/lib/types.cpp new file mode 100644 index 000000000..f8a9a9b36 --- /dev/null +++ b/host/lib/types.cpp @@ -0,0 +1,57 @@ +// +// 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 <uhd/types.hpp> + +using namespace uhd; + +/*********************************************************************** + * gain range + **********************************************************************/ +gain_range_t::gain_range_t(float min_, float max_, float step_){ +    min = min_; +    max = max_; +    step = step_; +} + +/*********************************************************************** + * freq range + **********************************************************************/ +freq_range_t::freq_range_t(double min_, double max_){ +    min = min_; +    max = max_; +} + +/*********************************************************************** + * tune result + **********************************************************************/ +tune_result_t::tune_result_t(void){ +    target_inter_freq = 0.0; +    actual_inter_freq = 0.0; +    target_dxc_freq = 0.0; +    actual_dxc_freq = 0.0; +    spectrum_inverted = false; +} + +/*********************************************************************** + * clock config + **********************************************************************/ +clock_config_t::clock_config_t(void){ +    ref_source = ""; //not a valid setting +    pps_source = ""; //not a valid setting +    pps_polarity = POLARITY_NEG; +} diff --git a/host/lib/usrp/dboard/basic.cpp b/host/lib/usrp/dboard/basic.cpp index 02b391244..82485ae6a 100644 --- a/host/lib/usrp/dboard/basic.cpp +++ b/host/lib/usrp/dboard/basic.cpp @@ -17,6 +17,7 @@  #include <uhd/utils.hpp>  #include <uhd/props.hpp> +#include <uhd/types.hpp>  #include <uhd/usrp/dboard_base.hpp>  #include <uhd/usrp/dboard_manager.hpp>  #include <boost/assign/list_of.hpp> diff --git a/host/lib/usrp/usrp2/dboard_impl.cpp b/host/lib/usrp/usrp2/dboard_impl.cpp index 60622ca47..66e02d469 100644 --- a/host/lib/usrp/usrp2/dboard_impl.cpp +++ b/host/lib/usrp/usrp2/dboard_impl.cpp @@ -45,11 +45,11 @@ void usrp2_impl::dboard_init(void){      );      //load dboards -    _rx_dboards[""] = wax_obj_proxy( +    _rx_dboards[""] = wax_obj_proxy::make(          boost::bind(&usrp2_impl::rx_dboard_get, this, _1, _2),          boost::bind(&usrp2_impl::rx_dboard_set, this, _1, _2)      ); -    _tx_dboards[""] = wax_obj_proxy( +    _tx_dboards[""] = wax_obj_proxy::make(          boost::bind(&usrp2_impl::tx_dboard_get, this, _1, _2),          boost::bind(&usrp2_impl::tx_dboard_set, this, _1, _2)      ); diff --git a/host/lib/usrp/usrp2/dsp_impl.cpp b/host/lib/usrp/usrp2/dsp_impl.cpp index 54ed45e41..34cce0afb 100644 --- a/host/lib/usrp/usrp2/dsp_impl.cpp +++ b/host/lib/usrp/usrp2/dsp_impl.cpp @@ -53,7 +53,7 @@ static boost::uint32_t calculate_iq_scale_word(boost::int16_t i, boost::int16_t  void usrp2_impl::init_ddc_config(void){      //create the ddc in the rx dsp dict -    _rx_dsps["ddc0"] = wax_obj_proxy( +    _rx_dsps["ddc0"] = wax_obj_proxy::make(          boost::bind(&usrp2_impl::ddc_get, this, _1, _2),          boost::bind(&usrp2_impl::ddc_set, this, _1, _2)      ); @@ -201,7 +201,7 @@ void usrp2_impl::ddc_set(const wax::obj &key, const wax::obj &val){   **********************************************************************/  void usrp2_impl::init_duc_config(void){      //create the duc in the tx dsp dict -    _tx_dsps["duc0"] = wax_obj_proxy( +    _tx_dsps["duc0"] = wax_obj_proxy::make(          boost::bind(&usrp2_impl::duc_get, this, _1, _2),          boost::bind(&usrp2_impl::duc_set, this, _1, _2)      ); diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 4b15c7f3e..cbca8eec7 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -16,7 +16,6 @@  //  #include <uhd/utils.hpp> -#include <boost/assign/list_of.hpp>  #include "usrp2_impl.hpp"  using namespace uhd; @@ -25,7 +24,7 @@ using namespace uhd;   * Helper Methods   **********************************************************************/  void usrp2_impl::mboard_init(void){ -    _mboards[""] = wax_obj_proxy( +    _mboards[""] = wax_obj_proxy::make(          boost::bind(&usrp2_impl::mboard_get, this, _1, _2),          boost::bind(&usrp2_impl::mboard_set, this, _1, _2)      ); @@ -36,21 +35,27 @@ void usrp2_impl::mboard_init(void){  }  void usrp2_impl::init_clock_config(void){ +    //init the ref source clock config +    _ref_source_dict = boost::assign::map_list_of +        ("int", USRP2_REF_SOURCE_INT) +        ("sma", USRP2_REF_SOURCE_SMA) +        ("mimo", USRP2_REF_SOURCE_MIMO) +    ; +    _clock_config.ref_source = "int"; +      //init the pps source clock config -    _pps_source_dict["sma"]  = USRP2_PPS_SOURCE_SMA; -    _pps_source_dict["mimo"] = USRP2_PPS_SOURCE_MIMO; -    _pps_source = "sma"; +    _pps_source_dict = boost::assign::map_list_of +        ("sma", USRP2_PPS_SOURCE_SMA) +        ("mimo", USRP2_PPS_SOURCE_MIMO) +    ; +    _clock_config.pps_source = "sma";      //init the pps polarity clock config -    _pps_polarity_dict["pos"] = USRP2_PPS_POLARITY_POS; -    _pps_polarity_dict["neg"] = USRP2_PPS_POLARITY_NEG; -    _pps_polarity = "neg"; - -    //init the ref source clock config -    _ref_source_dict["int"]  = USRP2_REF_SOURCE_INT; -    _ref_source_dict["sma"]  = USRP2_REF_SOURCE_SMA; -    _ref_source_dict["mimo"] = USRP2_REF_SOURCE_MIMO; -    _ref_source = "int"; +    _pps_polarity_dict = boost::assign::map_list_of +        (clock_config_t::POLARITY_POS, USRP2_PPS_POLARITY_POS) +        (clock_config_t::POLARITY_NEG, USRP2_PPS_POLARITY_NEG) +    ; +    _clock_config.pps_polarity = clock_config_t::POLARITY_NEG;      //update the clock config (sends a control packet)      update_clock_config(); @@ -60,9 +65,9 @@ void usrp2_impl::update_clock_config(void){      //setup the out data      usrp2_ctrl_data_t out_data;      out_data.id = htonl(USRP2_CTRL_ID_HERES_A_NEW_CLOCK_CONFIG_BRO); -    out_data.data.clock_config.pps_source   = _pps_source_dict  [_pps_source]; -    out_data.data.clock_config.pps_polarity = _pps_polarity_dict[_pps_polarity]; -    out_data.data.clock_config.ref_source   = _ref_source_dict  [_ref_source]; +    out_data.data.clock_config.ref_source   = _ref_source_dict  [_clock_config.ref_source]; +    out_data.data.clock_config.pps_source   = _pps_source_dict  [_clock_config.pps_source]; +    out_data.data.clock_config.pps_polarity = _pps_polarity_dict[_clock_config.pps_polarity];      //send and recv      usrp2_ctrl_data_t in_data = ctrl_send_and_recv(out_data); @@ -137,7 +142,7 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){      case MBOARD_PROP_RX_DBOARD:          ASSERT_THROW(_rx_dboards.has_key(name)); -        val = _rx_dboards[name].get_link(); +        val = _rx_dboards[name]->get_link();          return;      case MBOARD_PROP_RX_DBOARD_NAMES: @@ -146,7 +151,7 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){      case MBOARD_PROP_TX_DBOARD:          ASSERT_THROW(_tx_dboards.has_key(name)); -        val = _tx_dboards[name].get_link(); +        val = _tx_dboards[name]->get_link();          return;      case MBOARD_PROP_TX_DBOARD_NAMES: @@ -159,7 +164,7 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){      case MBOARD_PROP_RX_DSP:          ASSERT_THROW(_rx_dsps.has_key(name)); -        val = _rx_dsps[name].get_link(); +        val = _rx_dsps[name]->get_link();          return;      case MBOARD_PROP_RX_DSP_NAMES: @@ -168,29 +173,21 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){      case MBOARD_PROP_TX_DSP:          ASSERT_THROW(_tx_dsps.has_key(name)); -        val = _tx_dsps[name].get_link(); +        val = _tx_dsps[name]->get_link();          return;      case MBOARD_PROP_TX_DSP_NAMES:          val = prop_names_t(_tx_dsps.get_keys());          return; -    case MBOARD_PROP_PPS_SOURCE: -        val = _pps_source; +    case MBOARD_PROP_CLOCK_CONFIG: +        val = _clock_config;          return;      case MBOARD_PROP_PPS_SOURCE_NAMES:          val = prop_names_t(_pps_source_dict.get_keys());          return; -    case MBOARD_PROP_PPS_POLARITY: -        val = _pps_polarity; -        return; - -    case MBOARD_PROP_REF_SOURCE: -        val = _ref_source; -        return; -      case MBOARD_PROP_REF_SOURCE_NAMES:          val = prop_names_t(_ref_source_dict.get_keys());          return; @@ -237,26 +234,11 @@ void usrp2_impl::mboard_set(const wax::obj &key, const wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<mboard_prop_t>()){ -    case MBOARD_PROP_PPS_SOURCE:{ -            std::string name = val.as<std::string>(); -            assert_has(_pps_source_dict.get_keys(), name, "usrp2 pps source"); -            _pps_source = name; //shadow -            update_clock_config(); -        } -        return; - -    case MBOARD_PROP_PPS_POLARITY:{ -            std::string name = val.as<std::string>(); -            assert_has(_pps_polarity_dict.get_keys(), name, "usrp2 pps polarity"); -            _pps_polarity = name; //shadow -            update_clock_config(); -        } -        return; - -    case MBOARD_PROP_REF_SOURCE:{ -            std::string name = val.as<std::string>(); -            assert_has(_ref_source_dict.get_keys(), name, "usrp2 reference source"); -            _ref_source = name; //shadow +    case MBOARD_PROP_CLOCK_CONFIG:{ +            clock_config_t clock_config = val.as<clock_config_t>(); +            assert_has(_pps_source_dict.get_keys(), clock_config.pps_source, "usrp2 pps source"); +            assert_has(_ref_source_dict.get_keys(), clock_config.ref_source, "usrp2 ref source"); +            _clock_config = clock_config; //shadow              update_clock_config();          }          return; diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index e1371a094..85d73e83a 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -193,7 +193,7 @@ void usrp2_impl::get(const wax::obj &key_, wax::obj &val){      case DEVICE_PROP_MBOARD:          ASSERT_THROW(_mboards.has_key(name)); -        val = _mboards[name].get_link(); +        val = _mboards[name]->get_link();          return;      case DEVICE_PROP_MBOARD_NAMES: diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index 765c523fe..70420fd49 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -15,22 +15,23 @@  // along with this program.  If not, see <http://www.gnu.org/licenses/>.  // +#ifndef INCLUDED_USRP2_IMPL_HPP +#define INCLUDED_USRP2_IMPL_HPP +  #include <uhd/usrp/usrp2.hpp>  #include <uhd/dict.hpp> -#include <uhd/props.hpp> +#include <uhd/types.hpp>  #include <uhd/time_spec.hpp>  #include <boost/thread.hpp>  #include <boost/shared_ptr.hpp>  #include <boost/function.hpp> +#include <boost/assign/list_of.hpp>  #include <uhd/transport/vrt.hpp>  #include <uhd/transport/udp_simple.hpp>  #include <uhd/transport/udp_zero_copy.hpp>  #include <uhd/usrp/dboard_manager.hpp>  #include "fw_common.h" -#ifndef INCLUDED_USRP2_IMPL_HPP -#define INCLUDED_USRP2_IMPL_HPP -  class usrp2_impl; //dummy class declaration  /*! @@ -50,20 +51,25 @@ class wax_obj_proxy : public wax::obj{  public:      typedef boost::function<void(const wax::obj &, wax::obj &)>       get_t;      typedef boost::function<void(const wax::obj &, const wax::obj &)> set_t; +    typedef boost::shared_ptr<wax_obj_proxy> sptr; + +    static sptr make(const get_t &get, const set_t &set){ +        return sptr(new wax_obj_proxy(get, set)); +    } -    wax_obj_proxy(void){ +    ~wax_obj_proxy(void){          /* NOP */      } +private: +    get_t _get; +    set_t _set; +      wax_obj_proxy(const get_t &get, const set_t &set){          _get = get;          _set = set;      }; -    ~wax_obj_proxy(void){ -        /* NOP */ -    } -      void get(const wax::obj &key, wax::obj &val){          return _get(key, val);      } @@ -71,10 +77,6 @@ public:      void set(const wax::obj &key, const wax::obj &val){          return _set(key, val);      } - -private: -    get_t _get; -    set_t _set;  };  /*! @@ -98,10 +100,6 @@ public:      ~usrp2_impl(void); -    //properties interface -    void get(const wax::obj &, wax::obj &); -    void set(const wax::obj &, const wax::obj &); -      //performs a control transaction      usrp2_ctrl_data_t ctrl_send_and_recv(const usrp2_ctrl_data_t &); @@ -113,6 +111,10 @@ public:      size_t recv(const boost::asio::mutable_buffer &, uhd::rx_metadata_t &, const std::string &);  private: +    //device properties interface +    void get(const wax::obj &, wax::obj &); +    void set(const wax::obj &, const wax::obj &); +      //the raw io interface (samples are in the usrp2 native format)      void recv_raw(uhd::rx_metadata_t &);      uhd::dict<boost::uint32_t, size_t> _tx_stream_id_to_packet_seq; @@ -141,15 +143,15 @@ private:      boost::mutex _ctrl_mutex;      //methods and shadows for clock configuration -    std::string _pps_source, _pps_polarity, _ref_source; +    uhd::clock_config_t _clock_config;      void init_clock_config(void);      void update_clock_config(void);      void set_time_spec(const uhd::time_spec_t &time_spec, bool now);      //mappings from clock config strings to over the wire enums -    uhd::dict<std::string, usrp2_pps_source_t>   _pps_source_dict; -    uhd::dict<std::string, usrp2_pps_polarity_t> _pps_polarity_dict; -    uhd::dict<std::string, usrp2_ref_source_t>   _ref_source_dict; +    uhd::dict<std::string, usrp2_ref_source_t> _ref_source_dict; +    uhd::dict<std::string, usrp2_pps_source_t> _pps_source_dict; +    uhd::dict<uhd::clock_config_t::polarity_t, usrp2_pps_polarity_t> _pps_polarity_dict;      //rx and tx dboard methods and objects      uhd::usrp::dboard_manager::sptr _dboard_manager; @@ -159,18 +161,18 @@ private:      void mboard_init(void);      void mboard_get(const wax::obj &, wax::obj &);      void mboard_set(const wax::obj &, const wax::obj &); -    uhd::dict<std::string, wax_obj_proxy> _mboards; +    uhd::dict<std::string, wax_obj_proxy::sptr> _mboards;      //properties interface for rx dboard      void rx_dboard_get(const wax::obj &, wax::obj &);      void rx_dboard_set(const wax::obj &, const wax::obj &); -    uhd::dict<std::string, wax_obj_proxy> _rx_dboards; +    uhd::dict<std::string, wax_obj_proxy::sptr> _rx_dboards;      uhd::prop_names_t _rx_subdevs_in_use;      //properties interface for tx dboard      void tx_dboard_get(const wax::obj &, wax::obj &);      void tx_dboard_set(const wax::obj &, const wax::obj &); -    uhd::dict<std::string, wax_obj_proxy> _tx_dboards; +    uhd::dict<std::string, wax_obj_proxy::sptr> _tx_dboards;      uhd::prop_names_t _tx_subdevs_in_use;      void update_mux_config(void); @@ -193,12 +195,12 @@ private:      //properties interface for ddc      void ddc_get(const wax::obj &, wax::obj &);      void ddc_set(const wax::obj &, const wax::obj &); -    uhd::dict<std::string, wax_obj_proxy> _rx_dsps; +    uhd::dict<std::string, wax_obj_proxy::sptr> _rx_dsps;      //properties interface for duc      void duc_get(const wax::obj &, wax::obj &);      void duc_set(const wax::obj &, const wax::obj &); -    uhd::dict<std::string, wax_obj_proxy> _tx_dsps; +    uhd::dict<std::string, wax_obj_proxy::sptr> _tx_dsps;  };  | 
