diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/usrp/dboard/base.cpp | 6 | ||||
| -rw-r--r-- | lib/usrp/dboard/manager.cpp | 63 | ||||
| -rw-r--r-- | lib/usrp/mboard/test.cpp | 57 | ||||
| -rw-r--r-- | lib/usrp/usrp.cpp | 23 | 
4 files changed, 86 insertions, 63 deletions
diff --git a/lib/usrp/dboard/base.cpp b/lib/usrp/dboard/base.cpp index c80cdadeb..82f4b4016 100644 --- a/lib/usrp/dboard/base.cpp +++ b/lib/usrp/dboard/base.cpp @@ -10,15 +10,15 @@ using namespace usrp_uhd::usrp::dboard;   * base dboard base class   **********************************************************************/  base::base(ctor_args_t const& args){ -    boost::tie(_subdev_index, _dboard_interface) = args; +    boost::tie(_subdev_name, _dboard_interface) = args;  }  base::~base(void){      /* NOP */  } -size_t base::get_subdev_index(void){ -    return _subdev_index; +std::string base::get_subdev_name(void){ +    return _subdev_name;  }  interface::sptr base::get_interface(void){ diff --git a/lib/usrp/dboard/manager.cpp b/lib/usrp/dboard/manager.cpp index 6486fadf2..e9d973cb5 100644 --- a/lib/usrp/dboard/manager.cpp +++ b/lib/usrp/dboard/manager.cpp @@ -3,10 +3,13 @@  //  #include <usrp_uhd/usrp/dboard/manager.hpp> +#include <usrp_uhd/utils.hpp> +#include <boost/assign/list_of.hpp>  #include <boost/format.hpp> -#include <map> +#include <boost/foreach.hpp>  #include "dboards.hpp" +using namespace usrp_uhd;  using namespace usrp_uhd::usrp::dboard;  /*********************************************************************** @@ -26,8 +29,8 @@ static void register_internal_dboards(void){      static bool called = false;      if (called) return; called = true;      //register the known dboards (dboard id, constructor, num subdevs) -    manager::register_subdevs(0x0000, &basic_tx::make, 1); -    manager::register_subdevs(0x0001, &basic_rx::make, 3); +    manager::register_subdevs(0x0000, &basic_tx::make, boost::assign::list_of("")); +    manager::register_subdevs(0x0001, &basic_rx::make, boost::assign::list_of("a")("b")("ab"));  }  /*********************************************************************** @@ -36,17 +39,17 @@ static void register_internal_dboards(void){  //map a dboard id to a dboard constructor  static std::map<manager::dboard_id_t, manager::dboard_ctor_t> id_to_ctor_map; -//map a dboard constructor to number of subdevices -static std::map<manager::dboard_ctor_t, size_t> ctor_to_num_map; +//map a dboard constructor to subdevice names +static std::map<manager::dboard_ctor_t, prop_names_t> ctor_to_names_map;  void manager::register_subdevs(      dboard_id_t dboard_id,      dboard_ctor_t dboard_ctor, -    size_t num_subdevs +    const prop_names_t &subdev_names  ){      register_internal_dboards(); //always call first      id_to_ctor_map[dboard_id] = dboard_ctor; -    ctor_to_num_map[dboard_ctor] = num_subdevs; +    ctor_to_names_map[dboard_ctor] = subdev_names;  }  /*********************************************************************** @@ -119,27 +122,27 @@ manager::manager(      const dboard_ctor_t tx_dboard_ctor = get_dboard_ctor(tx_dboard_id, "tx");      //make xcvr subdevs (make one subdev for both rx and tx dboards)      if (rx_dboard_ctor == tx_dboard_ctor){ -        for (size_t i = 0; i < ctor_to_num_map[rx_dboard_ctor]; i++){ +        BOOST_FOREACH(std::string name, ctor_to_names_map[rx_dboard_ctor]){              base::sptr xcvr_dboard = rx_dboard_ctor( -                base::ctor_args_t(i, dboard_interface) +                base::ctor_args_t(name, dboard_interface)              ); -            _rx_dboards.push_back(xcvr_dboard); -            _tx_dboards.push_back(xcvr_dboard); +            _rx_dboards[name] = xcvr_dboard; +            _tx_dboards[name] = xcvr_dboard;          }      }      //make tx and rx subdevs (separate subdevs for rx and tx dboards)      else{          //make the rx subdevs -        for (size_t i = 0; i < ctor_to_num_map[rx_dboard_ctor]; i++){ -            _rx_dboards.push_back(rx_dboard_ctor( -                base::ctor_args_t(i, dboard_interface) -            )); +        BOOST_FOREACH(std::string name, ctor_to_names_map[rx_dboard_ctor]){ +            _rx_dboards[name] = rx_dboard_ctor( +                base::ctor_args_t(name, dboard_interface) +            );          }          //make the tx subdevs -        for (size_t i = 0; i < ctor_to_num_map[tx_dboard_ctor]; i++){ -            _tx_dboards.push_back(tx_dboard_ctor( -                base::ctor_args_t(i, dboard_interface) -            )); +        BOOST_FOREACH(std::string name, ctor_to_names_map[tx_dboard_ctor]){ +            _tx_dboards[name] = tx_dboard_ctor( +                base::ctor_args_t(name, dboard_interface) +            );          }      }  } @@ -148,22 +151,28 @@ manager::~manager(void){      /* NOP */  } -size_t manager::get_num_rx_subdevs(void){ -    return _rx_dboards.size(); +prop_names_t manager::get_rx_subdev_names(void){ +    return get_map_keys(_rx_dboards);  } -size_t manager::get_num_tx_subdevs(void){ -    return _tx_dboards.size(); +prop_names_t manager::get_tx_subdev_names(void){ +    return get_map_keys(_tx_dboards);  } -wax::obj::sptr manager::get_rx_subdev(size_t subdev_index){ +wax::obj::sptr manager::get_rx_subdev(const std::string &subdev_name){ +    if (_rx_dboards.count(subdev_name) == 0) throw std::invalid_argument( +        str(boost::format("Unknown rx subdev name %s") % subdev_name) +    );      return wax::obj::sptr(new subdev_proxy( -        _rx_dboards.at(subdev_index), subdev_proxy::RX_TYPE) +        _rx_dboards[subdev_name], subdev_proxy::RX_TYPE)      );  } -wax::obj::sptr manager::get_tx_subdev(size_t subdev_index){ +wax::obj::sptr manager::get_tx_subdev(const std::string &subdev_name){ +    if (_tx_dboards.count(subdev_name) == 0) throw std::invalid_argument( +        str(boost::format("Unknown tx subdev name %s") % subdev_name) +    );      return wax::obj::sptr(new subdev_proxy( -        _tx_dboards.at(subdev_index), subdev_proxy::TX_TYPE) +        _tx_dboards[subdev_name], subdev_proxy::TX_TYPE)      );  } diff --git a/lib/usrp/mboard/test.cpp b/lib/usrp/mboard/test.cpp index 6bcbea94f..cf9a5cb52 100644 --- a/lib/usrp/mboard/test.cpp +++ b/lib/usrp/mboard/test.cpp @@ -3,7 +3,10 @@  //  #include <usrp_uhd/usrp/mboard/test.hpp> +#include <usrp_uhd/utils.hpp>  #include <usrp_uhd/props.hpp> +#include <boost/lexical_cast.hpp> +#include <boost/format.hpp>  #include <stdexcept>  using namespace usrp_uhd; @@ -42,10 +45,10 @@ public:      ~shell_dboard(void){}  private:      void get(const wax::type &key_, wax::type &val){ -        //extract the index if key is an indexed prop -        wax::type key = key_; size_t index = 0; -        if (key.type() == typeid(indexed_prop_t)){ -            boost::tie(key, index) = wax::cast<indexed_prop_t>(key); +        //extract the index if key is a named prop +        wax::type key = key_; std::string name = ""; +        if (key.type() == typeid(named_prop_t)){ +            boost::tie(key, name) = wax::cast<named_prop_t>(key);          }          //handle the get request conditioned on the key @@ -57,22 +60,22 @@ private:          case DBOARD_PROP_SUBDEV:              switch(_type){              case TYPE_RX: -                val = _mgr->get_rx_subdev(index); +                val = _mgr->get_rx_subdev(name);                  return;              case TYPE_TX: -                val = _mgr->get_tx_subdev(index); +                val = _mgr->get_tx_subdev(name);                  return;              } -        case DBOARD_PROP_NUM_SUBDEVS: +        case DBOARD_PROP_SUBDEV_NAMES:              switch(_type){              case TYPE_RX: -                val = _mgr->get_num_rx_subdevs(); +                val = _mgr->get_rx_subdev_names();                  return;              case TYPE_TX: -                val = _mgr->get_num_tx_subdevs(); +                val = _mgr->get_tx_subdev_names();                  return;              } @@ -97,9 +100,9 @@ test::test(const device_addr_t &device_addr){      //create a manager for each dboard      for (size_t i = 0; i < device_addr.virtual_args.num_dboards; i++){          dboard::interface::sptr ifc(new dummy_interface()); -        _dboard_managers.push_back(dboard::manager::sptr( +        _dboard_managers[boost::lexical_cast<std::string>(i)] = dboard::manager::sptr(              new dboard::manager(0x0001, 0x0000, ifc) -        )); +        );      }  } @@ -108,10 +111,10 @@ test::~test(void){  }  void test::get(const wax::type &key_, wax::type &val){ -    //extract the index if key is an indexed prop -    wax::type key = key_; size_t index = 0; -    if (key.type() == typeid(indexed_prop_t)){ -        boost::tie(key, index) = wax::cast<indexed_prop_t>(key); +    //extract the index if key is a named prop +    wax::type key = key_; std::string name = ""; +    if (key.type() == typeid(named_prop_t)){ +        boost::tie(key, name) = wax::cast<named_prop_t>(key);      }      //handle the get request conditioned on the key @@ -121,34 +124,42 @@ void test::get(const wax::type &key_, wax::type &val){          return;      case MBOARD_PROP_RX_DBOARD: +        if (_dboard_managers.count(name) == 0) throw std::invalid_argument( +            str(boost::format("Unknown rx dboard name %s") % name) +        );          val = wax::obj::sptr( -            new shell_dboard(_dboard_managers.at(index), shell_dboard::TYPE_RX) +            new shell_dboard(_dboard_managers[name], shell_dboard::TYPE_RX)          );          return; -    case MBOARD_PROP_NUM_RX_DBOARDS: -        val = size_t(_dboard_managers.size()); +    case MBOARD_PROP_RX_DBOARD_NAMES: +        val = prop_names_t(get_map_keys(_dboard_managers));          return;      case MBOARD_PROP_TX_DBOARD: +        if (_dboard_managers.count(name) == 0) throw std::invalid_argument( +            str(boost::format("Unknown tx dboard name %s") % name) +        );          val = wax::obj::sptr( -            new shell_dboard(_dboard_managers.at(index), shell_dboard::TYPE_TX) +            new shell_dboard(_dboard_managers[name], shell_dboard::TYPE_TX)          );          return; -    case MBOARD_PROP_NUM_TX_DBOARDS: -        val = size_t(_dboard_managers.size()); +    case MBOARD_PROP_TX_DBOARD_NAMES: +        val = prop_names_t(get_map_keys(_dboard_managers));          return;      case MBOARD_PROP_MTU:      case MBOARD_PROP_CLOCK_RATE:      case MBOARD_PROP_RX_DSP: -    case MBOARD_PROP_NUM_RX_DSPS: +    case MBOARD_PROP_RX_DSP_NAMES:      case MBOARD_PROP_TX_DSP: -    case MBOARD_PROP_NUM_TX_DSPS: +    case MBOARD_PROP_TX_DSP_NAMES:      case MBOARD_PROP_PPS_SOURCE: +    case MBOARD_PROP_PPS_SOURCE_NAMES:      case MBOARD_PROP_PPS_POLARITY:      case MBOARD_PROP_REF_SOURCE: +    case MBOARD_PROP_REF_SOURCE_NAMES:      case MBOARD_PROP_TIME_NOW:      case MBOARD_PROP_TIME_NEXT_PPS:          throw std::runtime_error("unhandled prop is usrp test mboard"); diff --git a/lib/usrp/usrp.cpp b/lib/usrp/usrp.cpp index 5838ab90a..02446c8d1 100644 --- a/lib/usrp/usrp.cpp +++ b/lib/usrp/usrp.cpp @@ -4,6 +4,8 @@  #include <usrp_uhd/usrp/usrp.hpp>  #include <usrp_uhd/usrp/mboard/test.hpp> +#include <usrp_uhd/utils.hpp> +#include <boost/format.hpp>  #include <boost/bind.hpp>  #include <stdexcept> @@ -31,9 +33,7 @@ usrp::usrp(const device_addr_t & device_addr){      //create mboard based on the device addr      if (device_addr.type == DEVICE_ADDR_TYPE_VIRTUAL){ -        _mboards.push_back( -            mboard::base::sptr(new mboard::test(device_addr)) -        ); +        _mboards[""] = mboard::base::sptr(new mboard::test(device_addr));      }  } @@ -42,10 +42,10 @@ usrp::~usrp(void){  }  void usrp::get(const wax::type &key_, wax::type &val){ -    //extract the index if key is an indexed prop -    wax::type key = key_; size_t index = 0; -    if (key.type() == typeid(indexed_prop_t)){ -        boost::tie(key, index) = wax::cast<indexed_prop_t>(key); +    //extract the index if key is a named prop +    wax::type key = key_; std::string name = ""; +    if (key.type() == typeid(named_prop_t)){ +        boost::tie(key, name) = wax::cast<named_prop_t>(key);      }      //handle the get request conditioned on the key @@ -55,13 +55,16 @@ void usrp::get(const wax::type &key_, wax::type &val){          return;      case DEVICE_PROP_MBOARD: +        if (_mboards.count(name) == 0) throw std::invalid_argument( +            str(boost::format("Unknown mboard name %s") % name) +        );          //turn the mboard sptr object into a wax::obj::sptr          //this allows the properties access through the wax::proxy -        val = wax::obj::cast(_mboards.at(index)); +        val = wax::obj::cast(_mboards[name]);          return; -    case DEVICE_PROP_NUM_MBOARDS: -        val = size_t(_mboards.size()); +    case DEVICE_PROP_MBOARD_NAMES: +        val = prop_names_t(get_map_keys(_mboards));          return;      }  }  | 
