diff options
| -rw-r--r-- | host/include/uhd/usrp/dboard_base.hpp | 62 | ||||
| -rw-r--r-- | host/include/uhd/usrp/dboard_manager.hpp | 24 | ||||
| -rw-r--r-- | host/lib/usrp/b100/b100_impl.cpp | 21 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/CMakeLists.txt | 22 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_base.cpp | 41 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_ctor_args.hpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 273 | ||||
| -rw-r--r-- | host/lib/usrp/e100/e100_impl.cpp | 21 | ||||
| -rw-r--r-- | host/lib/usrp/usrp1/usrp1_impl.cpp | 21 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 21 | 
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"); | 
