summaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/include/uhd/usrp/dboard_base.hpp62
-rw-r--r--host/include/uhd/usrp/dboard_manager.hpp24
-rw-r--r--host/lib/usrp/b100/b100_impl.cpp21
-rw-r--r--host/lib/usrp/dboard/CMakeLists.txt22
-rw-r--r--host/lib/usrp/dboard_base.cpp41
-rw-r--r--host/lib/usrp/dboard_ctor_args.hpp2
-rw-r--r--host/lib/usrp/dboard_manager.cpp273
-rw-r--r--host/lib/usrp/e100/e100_impl.cpp21
-rw-r--r--host/lib/usrp/usrp1/usrp1_impl.cpp21
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp21
10 files changed, 85 insertions, 423 deletions
diff --git a/host/include/uhd/usrp/dboard_base.hpp b/host/include/uhd/usrp/dboard_base.hpp
index 7e9557a95..31b3643c7 100644
--- a/host/include/uhd/usrp/dboard_base.hpp
+++ b/host/include/uhd/usrp/dboard_base.hpp
@@ -19,7 +19,7 @@
#define INCLUDED_UHD_USRP_DBOARD_BASE_HPP
#include <uhd/config.hpp>
-#include <uhd/wax.hpp>
+#include <uhd/property_tree.hpp>
#include <uhd/utils/pimpl.hpp>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
@@ -28,43 +28,6 @@
namespace uhd{ namespace usrp{
- /*!
- * Possible subdev connection types:
- *
- * A complex subdevice is physically connected to both channels,
- * which may be connected in one of two ways: IQ or QI (swapped).
- *
- * A real subdevice is only physically connected one channel,
- * either only the I channel or only the Q channel.
- */
- enum subdev_conn_t{
- SUBDEV_CONN_COMPLEX_IQ = 'C',
- SUBDEV_CONN_COMPLEX_QI = 'c',
- SUBDEV_CONN_REAL_I = 'R',
- SUBDEV_CONN_REAL_Q = 'r'
- };
-
- /*!
- * Possible device subdev properties
- */
- enum subdev_prop_t{
- SUBDEV_PROP_NAME, //ro, std::string
- SUBDEV_PROP_OTHERS, //ro, prop_names_t
- SUBDEV_PROP_SENSOR, //ro, sensor_value_t
- SUBDEV_PROP_SENSOR_NAMES, //ro, prop_names_t
- SUBDEV_PROP_GAIN, //rw, double
- SUBDEV_PROP_GAIN_RANGE, //ro, gain_range_t
- SUBDEV_PROP_GAIN_NAMES, //ro, prop_names_t
- SUBDEV_PROP_FREQ, //rw, double
- SUBDEV_PROP_FREQ_RANGE, //ro, freq_range_t
- SUBDEV_PROP_ANTENNA, //rw, std::string
- SUBDEV_PROP_ANTENNA_NAMES, //ro, prop_names_t
- SUBDEV_PROP_CONNECTION, //ro, subdev_conn_t
- SUBDEV_PROP_ENABLED, //rw, bool
- SUBDEV_PROP_USE_LO_OFFSET, //ro, bool
- SUBDEV_PROP_BANDWIDTH //rw, double
- };
-
/*!
* A daughter board dboard_base class for all dboards.
* Only other dboard dboard_base classes should inherit this.
@@ -81,19 +44,14 @@ public:
//structors
dboard_base(ctor_args_t);
- virtual ~dboard_base(void);
-
- //interface
- virtual void rx_get(const wax::obj &key, wax::obj &val) = 0;
- virtual void rx_set(const wax::obj &key, const wax::obj &val) = 0;
- virtual void tx_get(const wax::obj &key, wax::obj &val) = 0;
- virtual void tx_set(const wax::obj &key, const wax::obj &val) = 0;
protected:
std::string get_subdev_name(void);
dboard_iface::sptr get_iface(void);
dboard_id_t get_rx_id(void);
dboard_id_t get_tx_id(void);
+ property_tree::sptr get_rx_subtree(void);
+ property_tree::sptr get_tx_subtree(void);
private:
UHD_PIMPL_DECL(impl) _impl;
@@ -109,8 +67,6 @@ public:
* Create a new xcvr dboard object, override in subclasses.
*/
xcvr_dboard_base(ctor_args_t);
-
- virtual ~xcvr_dboard_base(void);
};
/*!
@@ -123,12 +79,6 @@ public:
* Create a new rx dboard object, override in subclasses.
*/
rx_dboard_base(ctor_args_t);
-
- virtual ~rx_dboard_base(void);
-
- //override here so the derived classes cannot
- void tx_get(const wax::obj &key, wax::obj &val);
- void tx_set(const wax::obj &key, const wax::obj &val);
};
/*!
@@ -141,12 +91,6 @@ public:
* Create a new rx dboard object, override in subclasses.
*/
tx_dboard_base(ctor_args_t);
-
- virtual ~tx_dboard_base(void);
-
- //override here so the derived classes cannot
- void rx_get(const wax::obj &key, wax::obj &val);
- void rx_set(const wax::obj &key, const wax::obj &val);
};
}} //namespace
diff --git a/host/include/uhd/usrp/dboard_manager.hpp b/host/include/uhd/usrp/dboard_manager.hpp
index 091769a5c..d3a3ffb5c 100644
--- a/host/include/uhd/usrp/dboard_manager.hpp
+++ b/host/include/uhd/usrp/dboard_manager.hpp
@@ -20,11 +20,12 @@
#include <uhd/config.hpp>
#include <uhd/property_tree.hpp>
-#include <uhd/utils/props.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
+#include <string>
+#include <vector>
namespace uhd{ namespace usrp{
@@ -37,11 +38,6 @@ class UHD_API dboard_manager : boost::noncopyable{
public:
typedef boost::shared_ptr<dboard_manager> sptr;
- //! It does what it says...
- static void populate_prop_tree_from_subdev(
- property_tree::sptr subtree, wax::obj subdev
- );
-
//dboard constructor (each dboard should have a ::make with this signature)
typedef dboard_base::sptr(*dboard_ctor_t)(dboard_base::ctor_args_t);
@@ -57,7 +53,7 @@ public:
const dboard_id_t &dboard_id,
dboard_ctor_t dboard_ctor,
const std::string &name,
- const prop_names_t &subdev_names = prop_names_t(1, "0")
+ const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0")
);
/*!
@@ -74,27 +70,25 @@ public:
const dboard_id_t &tx_dboard_id,
dboard_ctor_t dboard_ctor,
const std::string &name,
- const prop_names_t &subdev_names = prop_names_t(1, "0")
+ const std::vector<std::string> &subdev_names = std::vector<std::string>(1, "0")
);
/*!
* Make a new dboard manager.
* \param rx_dboard_id the id of the rx dboard
* \param tx_dboard_id the id of the tx dboard
+ * \param gdboard_id the id of the grand-dboard
* \param iface the custom dboard interface
+ * \param subtree the subtree to load with props
* \return an sptr to the new dboard manager
*/
static sptr make(
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
- dboard_iface::sptr iface
+ dboard_id_t gdboard_id,
+ dboard_iface::sptr iface,
+ property_tree::sptr subtree
);
-
- //dboard manager interface
- virtual prop_names_t get_rx_subdev_names(void) = 0;
- virtual prop_names_t get_tx_subdev_names(void) = 0;
- virtual wax::obj get_rx_subdev(const std::string &subdev_name) = 0;
- virtual wax::obj get_tx_subdev(const std::string &subdev_name) = 0;
};
}} //namespace
diff --git a/host/lib/usrp/b100/b100_impl.cpp b/host/lib/usrp/b100/b100_impl.cpp
index c15816cc2..c506559be 100644
--- a/host/lib/usrp/b100/b100_impl.cpp
+++ b/host/lib/usrp/b100/b100_impl.cpp
@@ -404,22 +404,9 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
_dboard_iface = make_b100_dboard_iface(_fpga_ctrl, _fpga_i2c_ctrl, _fpga_spi_ctrl, _clock_ctrl, _codec_ctrl);
_tree->create<dboard_iface::sptr>(mb_path / "dboards/A/iface").set(_dboard_iface);
_dboard_manager = dboard_manager::make(
- rx_db_eeprom.id,
- ((gdb_eeprom.id == dboard_id_t::none())? tx_db_eeprom : gdb_eeprom).id,
- _dboard_iface
+ rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
+ _dboard_iface, _tree->subtree(mb_path / "dboards/A")
);
- BOOST_FOREACH(const std::string &name, _dboard_manager->get_rx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/rx_frontends" / name),
- _dboard_manager->get_rx_subdev(name)
- );
- }
- BOOST_FOREACH(const std::string &name, _dboard_manager->get_tx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/tx_frontends" / name),
- _dboard_manager->get_tx_subdev(name)
- );
- }
//initialize io handling
this->io_init();
@@ -432,8 +419,8 @@ b100_impl::b100_impl(const device_addr_t &device_addr){
_tree->access<double>(mb_path / "tick_rate") //now subscribe the clock rate setter
.subscribe(boost::bind(&b100_clock_ctrl::set_fpga_clock_rate, _clock_ctrl, _1));
- _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(subdev_spec_t("A:"+_dboard_manager->get_rx_subdev_names()[0]));
- _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(subdev_spec_t("A:"+_dboard_manager->get_tx_subdev_names()[0]));
+ _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/rx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/tx_frontends").at(0)));
_tree->access<std::string>(mb_path / "clock_source/value").set("internal");
_tree->access<std::string>(mb_path / "time_source/value").set("none");
}
diff --git a/host/lib/usrp/dboard/CMakeLists.txt b/host/lib/usrp/dboard/CMakeLists.txt
index c7b46e7c4..b5474ed16 100644
--- a/host/lib/usrp/dboard/CMakeLists.txt
+++ b/host/lib/usrp/dboard/CMakeLists.txt
@@ -20,16 +20,16 @@
########################################################################
LIBUHD_APPEND_SOURCES(
- ${CMAKE_CURRENT_SOURCE_DIR}/db_basic_and_lf.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_rfx.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_xcvr2450.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_sbx.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_common.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_simple.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_dbsrx.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_unknown.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_tvrx.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_dbsrx2.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/db_tvrx2.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_basic_and_lf.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_rfx.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_xcvr2450.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_sbx.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_common.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_simple.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_dbsrx.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_unknown.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_tvrx.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_dbsrx2.cpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/db_tvrx2.cpp
)
diff --git a/host/lib/usrp/dboard_base.cpp b/host/lib/usrp/dboard_base.cpp
index e14c9d144..fe14c02b9 100644
--- a/host/lib/usrp/dboard_base.cpp
+++ b/host/lib/usrp/dboard_base.cpp
@@ -20,6 +20,7 @@
#include <boost/format.hpp>
#include <stdexcept>
+using namespace uhd;
using namespace uhd::usrp;
/***********************************************************************
@@ -34,10 +35,6 @@ dboard_base::dboard_base(ctor_args_t args){
_impl->args = *static_cast<dboard_ctor_args_t *>(args);
}
-dboard_base::~dboard_base(void){
- /* NOP */
-}
-
std::string dboard_base::get_subdev_name(void){
return _impl->args.sd_name;
}
@@ -54,6 +51,14 @@ dboard_id_t dboard_base::get_tx_id(void){
return _impl->args.tx_id;
}
+property_tree::sptr dboard_base::get_rx_subtree(void){
+ return _impl->args.rx_subtree;
+}
+
+property_tree::sptr dboard_base::get_tx_subtree(void){
+ return _impl->args.tx_subtree;
+}
+
/***********************************************************************
* xcvr dboard dboard_base class
**********************************************************************/
@@ -70,10 +75,6 @@ xcvr_dboard_base::xcvr_dboard_base(ctor_args_t args) : dboard_base(args){
}
}
-xcvr_dboard_base::~xcvr_dboard_base(void){
- /* NOP */
-}
-
/***********************************************************************
* rx dboard dboard_base class
**********************************************************************/
@@ -86,18 +87,6 @@ rx_dboard_base::rx_dboard_base(ctor_args_t args) : dboard_base(args){
}
}
-rx_dboard_base::~rx_dboard_base(void){
- /* NOP */
-}
-
-void rx_dboard_base::tx_get(const wax::obj &, wax::obj &){
- throw uhd::runtime_error("cannot call tx_get on a rx dboard");
-}
-
-void rx_dboard_base::tx_set(const wax::obj &, const wax::obj &){
- throw uhd::runtime_error("cannot call tx_set on a rx dboard");
-}
-
/***********************************************************************
* tx dboard dboard_base class
**********************************************************************/
@@ -109,15 +98,3 @@ tx_dboard_base::tx_dboard_base(ctor_args_t args) : dboard_base(args){
) % get_rx_id().to_pp_string() % dboard_id_t::none().to_pp_string()));
}
}
-
-tx_dboard_base::~tx_dboard_base(void){
- /* NOP */
-}
-
-void tx_dboard_base::rx_get(const wax::obj &, wax::obj &){
- throw uhd::runtime_error("cannot call rx_get on a tx dboard");
-}
-
-void tx_dboard_base::rx_set(const wax::obj &, const wax::obj &){
- throw uhd::runtime_error("cannot call rx_set on a tx dboard");
-}
diff --git a/host/lib/usrp/dboard_ctor_args.hpp b/host/lib/usrp/dboard_ctor_args.hpp
index 708f2ea08..99c071ff8 100644
--- a/host/lib/usrp/dboard_ctor_args.hpp
+++ b/host/lib/usrp/dboard_ctor_args.hpp
@@ -18,6 +18,7 @@
#ifndef INCLUDED_LIBUHD_USRP_DBOARD_CTOR_ARGS_HPP
#define INCLUDED_LIBUHD_USRP_DBOARD_CTOR_ARGS_HPP
+#include <uhd/property_tree.hpp>
#include <uhd/usrp/dboard_id.hpp>
#include <uhd/usrp/dboard_base.hpp>
#include <uhd/usrp/dboard_iface.hpp>
@@ -29,6 +30,7 @@ namespace uhd{ namespace usrp{
std::string sd_name;
dboard_iface::sptr db_iface;
dboard_id_t rx_id, tx_id;
+ property_tree::sptr rx_subtree, tx_subtree;
};
}} //namespace
diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp
index 0326c28ce..816fba0c4 100644
--- a/host/lib/usrp/dboard_manager.cpp
+++ b/host/lib/usrp/dboard_manager.cpp
@@ -79,7 +79,7 @@ bool operator==(const dboard_key_t &lhs, const dboard_key_t &rhs){
* storage and registering for dboards
**********************************************************************/
//dboard registry tuple: dboard constructor, canonical name, subdev names
-typedef boost::tuple<dboard_manager::dboard_ctor_t, std::string, prop_names_t> args_t;
+typedef boost::tuple<dboard_manager::dboard_ctor_t, std::string, std::vector<std::string> > args_t;
//map a dboard id to a dboard constructor
typedef uhd::dict<dboard_key_t, args_t> id_to_args_map_t;
@@ -89,7 +89,7 @@ static void register_dboard_key(
const dboard_key_t &dboard_key,
dboard_manager::dboard_ctor_t dboard_ctor,
const std::string &name,
- const prop_names_t &subdev_names
+ const std::vector<std::string> &subdev_names
){
UHD_LOGV(always) << "registering: " << name << std::endl;
if (get_id_to_args_map().has_key(dboard_key)){
@@ -110,7 +110,7 @@ void dboard_manager::register_dboard(
const dboard_id_t &dboard_id,
dboard_ctor_t dboard_ctor,
const std::string &name,
- const prop_names_t &subdev_names
+ const std::vector<std::string> &subdev_names
){
register_dboard_key(dboard_key_t(dboard_id), dboard_ctor, name, subdev_names);
}
@@ -120,7 +120,7 @@ void dboard_manager::register_dboard(
const dboard_id_t &tx_dboard_id,
dboard_ctor_t dboard_ctor,
const std::string &name,
- const prop_names_t &subdev_names
+ const std::vector<std::string> &subdev_names
){
register_dboard_key(dboard_key_t(rx_dboard_id, tx_dboard_id), dboard_ctor, name, subdev_names);
}
@@ -144,46 +144,6 @@ std::string dboard_id_t::to_pp_string(void) const{
}
/***********************************************************************
- * internal helper classes
- **********************************************************************/
-/*!
- * A special wax proxy object that forwards calls to a subdev.
- * A sptr to an instance will be used in the properties structure.
- */
-class subdev_proxy : boost::noncopyable, public wax::obj{
-public:
- typedef boost::shared_ptr<subdev_proxy> sptr;
- enum type_t{RX_TYPE, TX_TYPE};
-
- //structors
- subdev_proxy(dboard_base::sptr subdev, type_t type):
- _subdev(subdev), _type(type)
- {
- /* NOP */
- }
-
-private:
- dboard_base::sptr _subdev;
- type_t _type;
-
- //forward the get calls to the rx or tx
- void get(const wax::obj &key, wax::obj &val){
- switch(_type){
- case RX_TYPE: return _subdev->rx_get(key, val);
- case TX_TYPE: return _subdev->tx_get(key, val);
- }
- }
-
- //forward the set calls to the rx or tx
- void set(const wax::obj &key, const wax::obj &val){
- switch(_type){
- case RX_TYPE: return _subdev->rx_set(key, val);
- case TX_TYPE: return _subdev->tx_set(key, val);
- }
- }
-};
-
-/***********************************************************************
* dboard manager implementation class
**********************************************************************/
class dboard_manager_impl : public dboard_manager{
@@ -192,23 +152,18 @@ public:
dboard_manager_impl(
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
- dboard_iface::sptr iface
+ dboard_iface::sptr iface,
+ property_tree::sptr subtree
);
~dboard_manager_impl(void);
- //dboard_iface
- prop_names_t get_rx_subdev_names(void);
- prop_names_t get_tx_subdev_names(void);
- wax::obj get_rx_subdev(const std::string &subdev_name);
- wax::obj get_tx_subdev(const std::string &subdev_name);
-
private:
- void init(dboard_id_t, dboard_id_t);
+ void init(dboard_id_t, dboard_id_t, property_tree::sptr);
//list of rx and tx dboards in this dboard_manager
//each dboard here is actually a subdevice proxy
//the subdevice proxy is internal to the cpp file
- uhd::dict<std::string, subdev_proxy::sptr> _rx_dboards;
- uhd::dict<std::string, subdev_proxy::sptr> _tx_dboards;
+ uhd::dict<std::string, dboard_base::sptr> _rx_dboards;
+ uhd::dict<std::string, dboard_base::sptr> _tx_dboards;
dboard_iface::sptr _iface;
void set_nice_dboard_if(void);
};
@@ -219,10 +174,16 @@ private:
dboard_manager::sptr dboard_manager::make(
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
- dboard_iface::sptr iface
+ dboard_id_t gdboard_id,
+ dboard_iface::sptr iface,
+ property_tree::sptr subtree
){
return dboard_manager::sptr(
- new dboard_manager_impl(rx_dboard_id, tx_dboard_id, iface)
+ new dboard_manager_impl(
+ rx_dboard_id,
+ (gdboard_id == dboard_id_t::none())? tx_dboard_id : gdboard_id,
+ iface, subtree
+ )
);
}
@@ -232,21 +193,22 @@ dboard_manager::sptr dboard_manager::make(
dboard_manager_impl::dboard_manager_impl(
dboard_id_t rx_dboard_id,
dboard_id_t tx_dboard_id,
- dboard_iface::sptr iface
+ dboard_iface::sptr iface,
+ property_tree::sptr subtree
):
_iface(iface)
{
try{
- this->init(rx_dboard_id, tx_dboard_id);
+ this->init(rx_dboard_id, tx_dboard_id, subtree);
}
catch(const std::exception &e){
UHD_MSG(error) << "The daughterboard manager encountered a recoverable error in init" << std::endl << e.what();
- this->init(dboard_id_t::none(), dboard_id_t::none());
+ this->init(dboard_id_t::none(), dboard_id_t::none(), subtree);
}
}
void dboard_manager_impl::init(
- dboard_id_t rx_dboard_id, dboard_id_t tx_dboard_id
+ dboard_id_t rx_dboard_id, dboard_id_t tx_dboard_id, property_tree::sptr subtree
){
//find the dboard key matches for the dboard ids
dboard_key_t rx_dboard_key, tx_dboard_key, xcvr_dboard_key;
@@ -283,7 +245,7 @@ void dboard_manager_impl::init(
if (xcvr_dboard_key.is_xcvr()){
//extract data for the xcvr dboard key
- dboard_ctor_t dboard_ctor; std::string name; prop_names_t subdevs;
+ dboard_ctor_t dboard_ctor; std::string name; std::vector<std::string> subdevs;
boost::tie(dboard_ctor, name, subdevs) = get_id_to_args_map()[xcvr_dboard_key];
//create the xcvr object for each subdevice
@@ -291,15 +253,11 @@ void dboard_manager_impl::init(
db_ctor_args.sd_name = subdev;
db_ctor_args.rx_id = rx_dboard_id;
db_ctor_args.tx_id = tx_dboard_id;
+ db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + subdev);
+ db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + subdev);
dboard_base::sptr xcvr_dboard = dboard_ctor(&db_ctor_args);
- //create a rx proxy for this xcvr board
- _rx_dboards[subdev] = subdev_proxy::sptr(
- new subdev_proxy(xcvr_dboard, subdev_proxy::RX_TYPE)
- );
- //create a tx proxy for this xcvr board
- _tx_dboards[subdev] = subdev_proxy::sptr(
- new subdev_proxy(xcvr_dboard, subdev_proxy::TX_TYPE)
- );
+ _rx_dboards[subdev] = xcvr_dboard;
+ _tx_dboards[subdev] = xcvr_dboard;
}
}
@@ -312,7 +270,7 @@ void dboard_manager_impl::init(
}
//extract data for the rx dboard key
- dboard_ctor_t rx_dboard_ctor; std::string rx_name; prop_names_t rx_subdevs;
+ dboard_ctor_t rx_dboard_ctor; std::string rx_name; std::vector<std::string> rx_subdevs;
boost::tie(rx_dboard_ctor, rx_name, rx_subdevs) = get_id_to_args_map()[rx_dboard_key];
//make the rx subdevs
@@ -320,11 +278,9 @@ void dboard_manager_impl::init(
db_ctor_args.sd_name = subdev;
db_ctor_args.rx_id = rx_dboard_id;
db_ctor_args.tx_id = dboard_id_t::none();
- dboard_base::sptr rx_dboard = rx_dboard_ctor(&db_ctor_args);
- //create a rx proxy for this rx board
- _rx_dboards[subdev] = subdev_proxy::sptr(
- new subdev_proxy(rx_dboard, subdev_proxy::RX_TYPE)
- );
+ db_ctor_args.rx_subtree = subtree->subtree("rx_frontends/" + subdev);
+ db_ctor_args.tx_subtree = property_tree::sptr(); //null
+ _rx_dboards[subdev] = rx_dboard_ctor(&db_ctor_args);
}
//force the tx key to the unknown board for bad combinations
@@ -333,7 +289,7 @@ void dboard_manager_impl::init(
}
//extract data for the tx dboard key
- dboard_ctor_t tx_dboard_ctor; std::string tx_name; prop_names_t tx_subdevs;
+ dboard_ctor_t tx_dboard_ctor; std::string tx_name; std::vector<std::string> tx_subdevs;
boost::tie(tx_dboard_ctor, tx_name, tx_subdevs) = get_id_to_args_map()[tx_dboard_key];
//make the tx subdevs
@@ -341,11 +297,9 @@ void dboard_manager_impl::init(
db_ctor_args.sd_name = subdev;
db_ctor_args.rx_id = dboard_id_t::none();
db_ctor_args.tx_id = tx_dboard_id;
- dboard_base::sptr tx_dboard = tx_dboard_ctor(&db_ctor_args);
- //create a tx proxy for this tx board
- _tx_dboards[subdev] = subdev_proxy::sptr(
- new subdev_proxy(tx_dboard, subdev_proxy::TX_TYPE)
- );
+ db_ctor_args.rx_subtree = property_tree::sptr(); //null
+ db_ctor_args.tx_subtree = subtree->subtree("tx_frontends/" + subdev);
+ _tx_dboards[subdev] = tx_dboard_ctor(&db_ctor_args);
}
}
}
@@ -354,30 +308,6 @@ dboard_manager_impl::~dboard_manager_impl(void){UHD_SAFE_CALL(
set_nice_dboard_if();
)}
-prop_names_t dboard_manager_impl::get_rx_subdev_names(void){
- return _rx_dboards.keys();
-}
-
-prop_names_t dboard_manager_impl::get_tx_subdev_names(void){
- return _tx_dboards.keys();
-}
-
-wax::obj dboard_manager_impl::get_rx_subdev(const std::string &subdev_name){
- if (not _rx_dboards.has_key(subdev_name)) throw uhd::key_error(
- str(boost::format("Unknown rx subdev name %s") % subdev_name)
- );
- //get a link to the rx subdev proxy
- return _rx_dboards[subdev_name]->get_link();
-}
-
-wax::obj dboard_manager_impl::get_tx_subdev(const std::string &subdev_name){
- if (not _tx_dboards.has_key(subdev_name)) throw uhd::key_error(
- str(boost::format("Unknown tx subdev name %s") % subdev_name)
- );
- //get a link to the tx subdev proxy
- return _tx_dboards[subdev_name]->get_link();
-}
-
void dboard_manager_impl::set_nice_dboard_if(void){
//make a list of possible unit types
std::vector<dboard_iface::unit_t> units = boost::assign::list_of
@@ -392,137 +322,4 @@ void dboard_manager_impl::set_nice_dboard_if(void){
_iface->set_pin_ctrl(unit, 0x0000); //all gpio
_iface->set_clock_enabled(unit, false); //clock off
}
-
- //disable all rx subdevices
- BOOST_FOREACH(const std::string &sd_name, this->get_rx_subdev_names()){
- this->get_rx_subdev(sd_name)[SUBDEV_PROP_ENABLED] = false;
- }
-
- //disable all tx subdevices
- BOOST_FOREACH(const std::string &sd_name, this->get_tx_subdev_names()){
- this->get_tx_subdev(sd_name)[SUBDEV_PROP_ENABLED] = false;
- }
-}
-
-/***********************************************************************
- * Populate a properties tree from a subdev waxy object
- **********************************************************************/
-#include <uhd/types/ranges.hpp>
-#include <uhd/types/sensors.hpp>
-
-static sensor_value_t get_sensor(wax::obj subdev, const std::string &name){
- return subdev[named_prop_t(SUBDEV_PROP_SENSOR, name)].as<sensor_value_t>();
-}
-
-static void set_gain(wax::obj subdev, const std::string &name, const double gain){
- subdev[named_prop_t(SUBDEV_PROP_GAIN, name)] = gain;
-}
-
-static double get_gain(wax::obj subdev, const std::string &name){
- return subdev[named_prop_t(SUBDEV_PROP_GAIN, name)].as<double>();
-}
-
-static meta_range_t get_gain_range(wax::obj subdev, const std::string &name){
- return subdev[named_prop_t(SUBDEV_PROP_GAIN_RANGE, name)].as<meta_range_t>();
-}
-
-static void set_freq(wax::obj subdev, const double freq){
- subdev[SUBDEV_PROP_FREQ] = freq;
-}
-
-static double get_freq(wax::obj subdev){
- return subdev[SUBDEV_PROP_FREQ].as<double>();
-}
-
-static meta_range_t get_freq_range(wax::obj subdev){
- return subdev[SUBDEV_PROP_FREQ_RANGE].as<meta_range_t>();
-}
-
-static void set_ant(wax::obj subdev, const std::string &ant){
- subdev[SUBDEV_PROP_ANTENNA] = ant;
-}
-
-static std::string get_ant(wax::obj subdev){
- return subdev[SUBDEV_PROP_ANTENNA].as<std::string>();
-}
-
-static std::vector<std::string> get_ants(wax::obj subdev){
- return subdev[SUBDEV_PROP_ANTENNA_NAMES].as<std::vector<std::string> >();
-}
-
-static std::string get_conn(wax::obj subdev){
- switch(subdev[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()){
- case SUBDEV_CONN_COMPLEX_IQ: return "IQ";
- case SUBDEV_CONN_COMPLEX_QI: return "QI";
- case SUBDEV_CONN_REAL_I: return "I";
- case SUBDEV_CONN_REAL_Q: return "Q";
- }
- UHD_THROW_INVALID_CODE_PATH();
-}
-
-static bool get_use_lo_off(wax::obj subdev){
- return subdev[SUBDEV_PROP_USE_LO_OFFSET].as<bool>();
-}
-
-static bool get_set_enb(wax::obj subdev, const bool enb){
- subdev[SUBDEV_PROP_ENABLED] = enb;
- return subdev[SUBDEV_PROP_ENABLED].as<bool>();
-}
-
-static void set_bw(wax::obj subdev, const double freq){
- subdev[SUBDEV_PROP_BANDWIDTH] = freq;
-}
-
-static double get_bw(wax::obj subdev){
- return subdev[SUBDEV_PROP_BANDWIDTH].as<double>();
-}
-
-void dboard_manager::populate_prop_tree_from_subdev(
- property_tree::sptr subtree, wax::obj subdev
-){
- subtree->create<std::string>("name").set(subdev[SUBDEV_PROP_NAME].as<std::string>());
-
- const prop_names_t sensor_names = subdev[SUBDEV_PROP_SENSOR_NAMES].as<prop_names_t>();
- subtree->create<int>("sensors"); //phony property so this dir exists
- BOOST_FOREACH(const std::string &name, sensor_names){
- subtree->create<sensor_value_t>("sensors/" + name)
- .publish(boost::bind(&get_sensor, subdev, name));
- }
-
- const prop_names_t gain_names = subdev[SUBDEV_PROP_GAIN_NAMES].as<prop_names_t>();
- subtree->create<int>("gains"); //phony property so this dir exists
- BOOST_FOREACH(const std::string &name, gain_names){
- subtree->create<double>("gains/" + name + "/value")
- .publish(boost::bind(&get_gain, subdev, name))
- .subscribe(boost::bind(&set_gain, subdev, name, _1));
- subtree->create<meta_range_t>("gains/" + name + "/range")
- .publish(boost::bind(&get_gain_range, subdev, name));
- }
-
- subtree->create<double>("freq/value")
- .publish(boost::bind(&get_freq, subdev))
- .subscribe(boost::bind(&set_freq, subdev, _1));
-
- subtree->create<meta_range_t>("freq/range")
- .publish(boost::bind(&get_freq_range, subdev));
-
- subtree->create<std::string>("antenna/value")
- .publish(boost::bind(&get_ant, subdev))
- .subscribe(boost::bind(&set_ant, subdev, _1));
-
- subtree->create<std::vector<std::string> >("antenna/options")
- .publish(boost::bind(&get_ants, subdev));
-
- subtree->create<std::string>("connection")
- .publish(boost::bind(&get_conn, subdev));
-
- subtree->create<bool>("enabled")
- .coerce(boost::bind(&get_set_enb, subdev, _1));
-
- subtree->create<bool>("use_lo_offset")
- .publish(boost::bind(&get_use_lo_off, subdev));
-
- subtree->create<double>("bandwidth/value")
- .publish(boost::bind(&get_bw, subdev))
- .subscribe(boost::bind(&set_bw, subdev, _1));
}
diff --git a/host/lib/usrp/e100/e100_impl.cpp b/host/lib/usrp/e100/e100_impl.cpp
index 2e3a635a6..c0a8f46f3 100644
--- a/host/lib/usrp/e100/e100_impl.cpp
+++ b/host/lib/usrp/e100/e100_impl.cpp
@@ -370,22 +370,9 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){
_dboard_iface = make_e100_dboard_iface(_fpga_ctrl, _fpga_i2c_ctrl, _fpga_spi_ctrl, _clock_ctrl, _codec_ctrl);
_tree->create<dboard_iface::sptr>(mb_path / "dboards/A/iface").set(_dboard_iface);
_dboard_manager = dboard_manager::make(
- rx_db_eeprom.id,
- ((gdb_eeprom.id == dboard_id_t::none())? tx_db_eeprom : gdb_eeprom).id,
- _dboard_iface
+ rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
+ _dboard_iface, _tree->subtree(mb_path / "dboards/A")
);
- BOOST_FOREACH(const std::string &name, _dboard_manager->get_rx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/rx_frontends" / name),
- _dboard_manager->get_rx_subdev(name)
- );
- }
- BOOST_FOREACH(const std::string &name, _dboard_manager->get_tx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/tx_frontends" / name),
- _dboard_manager->get_tx_subdev(name)
- );
- }
//initialize io handling
this->io_init();
@@ -398,8 +385,8 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){
_tree->access<double>(mb_path / "tick_rate") //now subscribe the clock rate setter
.subscribe(boost::bind(&e100_clock_ctrl::set_fpga_clock_rate, _clock_ctrl, _1));
- _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(subdev_spec_t("A:"+_dboard_manager->get_rx_subdev_names()[0]));
- _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(subdev_spec_t("A:"+_dboard_manager->get_tx_subdev_names()[0]));
+ _tree->access<subdev_spec_t>(mb_path / "rx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/rx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(mb_path / "tx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(mb_path / "dboards/A/tx_frontends").at(0)));
_tree->access<std::string>(mb_path / "clock_source/value").set("internal");
_tree->access<std::string>(mb_path / "time_source/value").set("none");
diff --git a/host/lib/usrp/usrp1/usrp1_impl.cpp b/host/lib/usrp/usrp1/usrp1_impl.cpp
index 6634b43da..4be5a3a2b 100644
--- a/host/lib/usrp/usrp1/usrp1_impl.cpp
+++ b/host/lib/usrp/usrp1/usrp1_impl.cpp
@@ -363,29 +363,16 @@ usrp1_impl::usrp1_impl(const device_addr_t &device_addr){
);
_tree->create<dboard_iface::sptr>(mb_path / "dboards" / db/ "iface").set(_dbc[db].dboard_iface);
_dbc[db].dboard_manager = dboard_manager::make(
- rx_db_eeprom.id,
- ((gdb_eeprom.id == dboard_id_t::none())? tx_db_eeprom : gdb_eeprom).id,
- _dbc[db].dboard_iface
+ rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
+ _dbc[db].dboard_iface, _tree->subtree(mb_path / "dboards" / db)
);
- BOOST_FOREACH(const std::string &name, _dbc[db].dboard_manager->get_rx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards" / db/ "rx_frontends" / name),
- _dbc[db].dboard_manager->get_rx_subdev(name)
- );
- }
- BOOST_FOREACH(const std::string &name, _dbc[db].dboard_manager->get_tx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards" / db/ "tx_frontends" / name),
- _dbc[db].dboard_manager->get_tx_subdev(name)
- );
- }
//init the subdev specs if we have a dboard (wont leave this loop empty)
if (rx_db_eeprom.id != dboard_id_t::none() or _rx_subdev_spec.empty()){
- _rx_subdev_spec = subdev_spec_t(db + ":" + _dbc[db].dboard_manager->get_rx_subdev_names()[0]);
+ _rx_subdev_spec = subdev_spec_t(db + ":" + _tree->list(mb_path / "dboards" / db / "rx_frontends").at(0));
}
if (tx_db_eeprom.id != dboard_id_t::none() or _tx_subdev_spec.empty()){
- _tx_subdev_spec = subdev_spec_t(db + ":" + _dbc[db].dboard_manager->get_tx_subdev_names()[0]);
+ _tx_subdev_spec = subdev_spec_t(db + ":" + _tree->list(mb_path / "dboards" / db / "tx_frontends").at(0));
}
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index ac3ee2e69..bb3bfc7e4 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -597,22 +597,9 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
_mbc[mb].dboard_iface = make_usrp2_dboard_iface(_mbc[mb].iface, _mbc[mb].clock);
_tree->create<dboard_iface::sptr>(mb_path / "dboards/A/iface").set(_mbc[mb].dboard_iface);
_mbc[mb].dboard_manager = dboard_manager::make(
- rx_db_eeprom.id,
- ((gdb_eeprom.id == dboard_id_t::none())? tx_db_eeprom : gdb_eeprom).id,
- _mbc[mb].dboard_iface
+ rx_db_eeprom.id, tx_db_eeprom.id, gdb_eeprom.id,
+ _mbc[mb].dboard_iface, _tree->subtree(mb_path / "dboards/A")
);
- BOOST_FOREACH(const std::string &name, _mbc[mb].dboard_manager->get_rx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/rx_frontends" / name),
- _mbc[mb].dboard_manager->get_rx_subdev(name)
- );
- }
- BOOST_FOREACH(const std::string &name, _mbc[mb].dboard_manager->get_tx_subdev_names()){
- dboard_manager::populate_prop_tree_from_subdev(
- _tree->subtree(mb_path / "dboards/A/tx_frontends" / name),
- _mbc[mb].dboard_manager->get_tx_subdev(name)
- );
- }
}
//initialize io handling
@@ -623,8 +610,8 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
BOOST_FOREACH(const std::string &mb, _mbc.keys()){
fs_path root = "/mboards/" + mb;
- _tree->access<subdev_spec_t>(root / "rx_subdev_spec").set(subdev_spec_t("A:"+_mbc[mb].dboard_manager->get_rx_subdev_names()[0]));
- _tree->access<subdev_spec_t>(root / "tx_subdev_spec").set(subdev_spec_t("A:"+_mbc[mb].dboard_manager->get_tx_subdev_names()[0]));
+ _tree->access<subdev_spec_t>(root / "rx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(root / "dboards/A/rx_frontends").at(0)));
+ _tree->access<subdev_spec_t>(root / "tx_subdev_spec").set(subdev_spec_t("A:" + _tree->list(root / "dboards/A/tx_frontends").at(0)));
_tree->access<std::string>(root / "clock_source/value").set("internal");
_tree->access<std::string>(root / "time_source/value").set("none");