diff options
Diffstat (limited to 'lib/usrp')
-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; } } |