summaryrefslogtreecommitdiffstats
path: root/lib/usrp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/usrp')
-rw-r--r--lib/usrp/dboard/base.cpp6
-rw-r--r--lib/usrp/dboard/manager.cpp63
-rw-r--r--lib/usrp/mboard/test.cpp57
-rw-r--r--lib/usrp/usrp.cpp23
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;
}
}