diff options
23 files changed, 275 insertions, 218 deletions
| diff --git a/host/include/uhd/usrp/dboard_iface.hpp b/host/include/uhd/usrp/dboard_iface.hpp index fc7ea3052..e776ecc42 100644 --- a/host/include/uhd/usrp/dboard_iface.hpp +++ b/host/include/uhd/usrp/dboard_iface.hpp @@ -65,11 +65,34 @@ public:          AUX_ADC_B = 'b'      }; +    //! Special properties that differentiate this daughterboard slot +    struct special_props_t{ +        /*! +         * Soft clock divider: +         * When a motherboard cannot provided a divided dboard clock, +         * it may provided a "soft" divided clock over an FPGA GPIO. +         * The implementation must know the type of clock provided. +         */ +        bool soft_clock_divider; + +        /*! +         * Mangle i2c addresses: +         * When i2c is shared across multiple daugterboard slots, +         * the i2c addresses will be mangled on the secondary slot +         * to avoid conflicts between slots in the i2c address space. +         * The mangling is daguhterboard specific so the implementation +         * needs to know whether it should use mangled addresses or not. +         */ +        bool mangle_i2c_addrs; +    }; +      /*! -     * Get the motherboard name of the form: usrp1, usrp2... -     * \return string representing the motherboard name +     * Get special properties information for this dboard slot. +     * This call helps the dboard code to handle implementation +     * differences between different motherboards and dboard slots. +     * \return the special properties struct       */ -    virtual std::string get_mboard_name(void) = 0; +    virtual special_props_t get_special_props(void) = 0;      /*!       * Write to an aux dac. diff --git a/host/include/uhd/usrp/dboard_manager.hpp b/host/include/uhd/usrp/dboard_manager.hpp index e5831d4cf..c68f069f0 100644 --- a/host/include/uhd/usrp/dboard_manager.hpp +++ b/host/include/uhd/usrp/dboard_manager.hpp @@ -51,7 +51,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, "") +        const prop_names_t &subdev_names = prop_names_t(1, "0")      );      /*! diff --git a/host/include/uhd/utils/algorithm.hpp b/host/include/uhd/utils/algorithm.hpp index 1b5eacfa9..53c571e4e 100644 --- a/host/include/uhd/utils/algorithm.hpp +++ b/host/include/uhd/utils/algorithm.hpp @@ -22,6 +22,9 @@  #include <boost/range/begin.hpp>  #include <boost/range/end.hpp>  #include <boost/range/size.hpp> +#include <boost/algorithm/string.hpp> +#include <vector> +#include <string>  /*! \file algorithm.hpp   * Useful templated functions and classes that I like to pretend are part of stl. @@ -30,6 +33,24 @@  namespace std{      /*! +     * Split a string at the separation characters. +     * \param string the string to split +     * \param sep the separator characters +     * \return a range of strings +     */ +    inline std::vector<std::string> split_string( +        const std::string &string, const std::string &sep = "\t " +    ){ +        std::vector<std::string> strings; +        if (not string.empty()) boost::split( +            // do not split an empty string: +            // let me tell you about the time when boost::split segfaulted... +            strings, string, boost::is_any_of(sep) +        ); +        return strings; +    } + +    /*!       * A wrapper around std::copy that takes ranges instead of iterators.       *       * Copy the elements of the source range into the destination range. diff --git a/host/include/uhd/utils/props.hpp b/host/include/uhd/utils/props.hpp index f376d2612..fbca03019 100644 --- a/host/include/uhd/utils/props.hpp +++ b/host/include/uhd/utils/props.hpp @@ -21,7 +21,6 @@  #include <uhd/config.hpp>  #include <uhd/wax.hpp>  #include <uhd/utils/exception.hpp> -#include <boost/tuple/tuple.hpp>  #include <stdexcept>  #include <vector>  #include <string> @@ -36,8 +35,25 @@ namespace uhd{       * Allows properties to be sub-sectioned by name.       */      struct UHD_API named_prop_t{ -        wax::obj key; -        std::string name; +        const wax::obj key; +        const std::string name; + +        //! Convert the key to the specified type +        template<typename T> inline T as(void){ +            return key.as<T>(); +        } + +        /*! +         * Utility function to convert generic key into a named prop. +         * If the key was already a named prop, the prop will be split. +         * Otherwise, the key will be the key, and the name will be used. +         * \param key a reference to the prop object +         * \param name a reference to the name object +         * \return a named property struct with key and name +         */ +        static named_prop_t extract( +            const wax::obj &key, const std::string &name = "" +        );          /*!           * Create a new named prop from key and name. @@ -48,17 +64,6 @@ namespace uhd{      };      /*! -     * Utility function to separate a named property into its components. -     * \param key a reference to the prop object -     * \param name a reference to the name object -     * \return a tuple that can be used with boost::tie -     */ -    UHD_API boost::tuple<wax::obj, std::string> extract_named_prop( -        const wax::obj &key, -        const std::string &name = "" -    ); - -    /*!       * Throw when getting a not-implemented or write-only property.       * Throw-site information will be included with this error.       */ diff --git a/host/lib/types.cpp b/host/lib/types.cpp index 5c0fb1f42..f957cd83f 100644 --- a/host/lib/types.cpp +++ b/host/lib/types.cpp @@ -27,7 +27,6 @@  #include <uhd/types/otw_type.hpp>  #include <uhd/types/io_type.hpp>  #include <uhd/types/serial.hpp> -#include <boost/algorithm/string.hpp>  #include <boost/math/special_functions/round.hpp>  #include <boost/foreach.hpp>  #include <boost/format.hpp> @@ -181,15 +180,10 @@ static std::string trim(const std::string &in){  }  device_addr_t::device_addr_t(const std::string &args){ -    //split the args at the semi-colons -    std::vector<std::string> pairs; -    boost::split(pairs, args, boost::is_any_of(arg_delim)); -    BOOST_FOREACH(const std::string &pair, pairs){ +    BOOST_FOREACH(const std::string &pair, std::split_string(args, arg_delim)){          if (trim(pair) == "") continue; -        //split the key value pairs at the equals -        std::vector<std::string> key_val; -        boost::split(key_val, pair, boost::is_any_of(pair_delim)); +        std::vector<std::string> key_val = std::split_string(pair, pair_delim);          if (key_val.size() != 2) throw std::runtime_error("invalid args string: "+args);          (*this)[trim(key_val.front())] = trim(key_val.back());      } @@ -238,13 +232,12 @@ mac_addr_t mac_addr_t::from_string(const std::string &mac_addr_str){              throw std::runtime_error("expected exactly 5 or 17 characters");          //split the mac addr hex string at the colons -        std::vector<std::string> hex_strs; -        boost::split(hex_strs, mac_addr_str, boost::is_any_of(":")); -        for (size_t i = 0; i < hex_strs.size(); i++){ +        size_t i = 0; +        BOOST_FOREACH(const std::string &hex_str, std::split_string(mac_addr_str, ":")){              int hex_num; -            std::istringstream iss(hex_strs[i]); +            std::istringstream iss(hex_str);              iss >> std::hex >> hex_num; -            bytes[i] = boost::uint8_t(hex_num); +            bytes[i++] = boost::uint8_t(hex_num);          }      } diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp index 9180828d8..f8236d598 100644 --- a/host/lib/usrp/dboard/db_basic_and_lf.cpp +++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp @@ -95,8 +95,7 @@ basic_rx::~basic_rx(void){  }  void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -161,8 +160,7 @@ void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){  }  void basic_rx::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -194,8 +192,7 @@ basic_tx::~basic_tx(void){  }  void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -252,8 +249,7 @@ void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){  }  void basic_tx::tx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ diff --git a/host/lib/usrp/dboard/db_dbsrx.cpp b/host/lib/usrp/dboard/db_dbsrx.cpp index 03e6b6255..06cf91d3b 100644 --- a/host/lib/usrp/dboard/db_dbsrx.cpp +++ b/host/lib/usrp/dboard/db_dbsrx.cpp @@ -61,7 +61,7 @@ static const uhd::dict<std::string, gain_range_t> dbsrx_gain_ranges = map_list_o   **********************************************************************/  class dbsrx : public rx_dboard_base{  public: -    dbsrx(ctor_args_t args, boost::uint8_t max2118_addr); +    dbsrx(ctor_args_t args);      ~dbsrx(void);      void rx_get(const wax::obj &key, wax::obj &val); @@ -73,7 +73,9 @@ private:      uhd::dict<std::string, float> _gains;      max2118_write_regs_t _max2118_write_regs;      max2118_read_regs_t _max2118_read_regs; -    boost::uint8_t _max2118_addr; //0x67 or 0x65 depending on which side +    boost::uint8_t _max2118_addr(void){ +        return (this->get_iface()->get_special_props().mangle_i2c_addrs)? 0x65 : 0x67; +    };      void set_lo_freq(double target_freq);      void set_gain(float gain, const std::string &name); @@ -102,7 +104,7 @@ private:              //send the data              this->get_iface()->write_i2c( -                _max2118_addr, regs_vector +                _max2118_addr(), regs_vector              );          }      } @@ -120,7 +122,7 @@ private:              //read from i2c              regs_vector = this->get_iface()->read_i2c( -                _max2118_addr, num_bytes +                _max2118_addr(), num_bytes              );              for(boost::uint8_t i=0; i < num_bytes; i++){ @@ -156,10 +158,8 @@ private:  /***********************************************************************   * Register the DBSRX dboard   **********************************************************************/ -// FIXME 0x67 is the default i2c address on USRP2 -//       need to handle which side for USRP1 with different address  static dboard_base::sptr make_dbsrx(dboard_base::ctor_args_t args){ -    return dboard_base::sptr(new dbsrx(args, 0x67)); +    return dboard_base::sptr(new dbsrx(args));  }  //dbid for USRP2 version @@ -177,27 +177,27 @@ UHD_STATIC_BLOCK(reg_dbsrx_on_usrp1_dboard){  /***********************************************************************   * Structors   **********************************************************************/ -dbsrx::dbsrx(ctor_args_t args, boost::uint8_t max2118_addr) : rx_dboard_base(args){ +dbsrx::dbsrx(ctor_args_t args) : rx_dboard_base(args){      //warn user about incorrect DBID on USRP1, requires R193 populated -    if (this->get_iface()->get_mboard_name() == "usrp1" and this->get_rx_id() == 0x000D) +    if (this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x000D)          uhd::print_warning(              str(boost::format(                  "DBSRX: incorrect dbid\n" -                "%s expects dbid 0x0002 and R193\n" +                "Expected dbid 0x0002 and R193\n"                  "found dbid == %d\n"                  "Please see the daughterboard app notes"  -                ) % (this->get_iface()->get_mboard_name()) % (this->get_rx_id().to_pp_string())) +                ) % this->get_rx_id().to_pp_string())          );      //warn user about incorrect DBID on non-USRP1, requires R194 populated -    if (this->get_iface()->get_mboard_name() != "usrp1" and this->get_rx_id() == 0x0002) +    if (not this->get_iface()->get_special_props().soft_clock_divider and this->get_rx_id() == 0x0002)          uhd::print_warning(              str(boost::format(                  "DBSRX: incorrect dbid\n" -                "%s expects dbid 0x000D and R194\n" +                "Expected dbid 0x000D and R194\n"                  "found dbid == %d\n"                  "Please see the daughterboard app notes"  -                ) % (this->get_iface()->get_mboard_name()) % (this->get_rx_id().to_pp_string())) +                ) % this->get_rx_id().to_pp_string())          );      //enable only the clocks we need @@ -207,9 +207,6 @@ dbsrx::dbsrx(ctor_args_t args, boost::uint8_t max2118_addr) : rx_dboard_base(arg      this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, 0x0); // All unused in atr      this->get_iface()->set_gpio_ddr(dboard_iface::UNIT_RX, 0x0); // All Inputs -    //set the i2c address for the max2118 -    _max2118_addr = max2118_addr; -      //send initial register settings      this->send_reg(0x0, 0x5); @@ -503,8 +500,7 @@ void dbsrx::set_bandwidth(float bandwidth){   * RX Get and Set   **********************************************************************/  void dbsrx::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -517,13 +513,13 @@ void dbsrx::rx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_gains.keys(), name, "dbsrx gain name"); -        val = _gains[name]; +        assert_has(_gains.keys(), key.name, "dbsrx gain name"); +        val = _gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(dbsrx_gain_ranges.keys(), name, "dbsrx gain name"); -        val = dbsrx_gain_ranges[name]; +        assert_has(dbsrx_gain_ranges.keys(), key.name, "dbsrx gain name"); +        val = dbsrx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -546,19 +542,6 @@ void dbsrx::rx_get(const wax::obj &key_, wax::obj &val){          val = dbsrx_antennas;          return; -/* -    case SUBDEV_PROP_QUADRATURE: -        val = true; -        return; - -    case SUBDEV_PROP_IQ_SWAPPED: -        val = false; -        return; - -    case SUBDEV_PROP_SPECTRUM_INVERTED: -        val = false; -        return; -*/      case SUBDEV_PROP_CONNECTION:          val = SUBDEV_CONN_COMPLEX_IQ;          return; @@ -586,8 +569,7 @@ void dbsrx::rx_get(const wax::obj &key_, wax::obj &val){  }  void dbsrx::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -597,7 +579,7 @@ void dbsrx::rx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_gain(val.as<float>(), name); +        this->set_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_BANDWIDTH: diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp index b6b44199a..c3ab96e59 100644 --- a/host/lib/usrp/dboard/db_rfx.cpp +++ b/host/lib/usrp/dboard/db_rfx.cpp @@ -398,8 +398,7 @@ double rfx_xcvr::set_lo_freq(   * RX Get and Set   **********************************************************************/  void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -412,13 +411,13 @@ void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_rx_gains.keys(), name, "rfx rx gain name"); -        val = _rx_gains[name]; +        assert_has(_rx_gains.keys(), key.name, "rfx rx gain name"); +        val = _rx_gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(_rx_gain_ranges.keys(), name, "rfx rx gain name"); -        val = _rx_gain_ranges[name]; +        assert_has(_rx_gain_ranges.keys(), key.name, "rfx rx gain name"); +        val = _rx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -458,8 +457,7 @@ void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){  }  void rfx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -469,7 +467,7 @@ void rfx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_rx_gain(val.as<float>(), name); +        this->set_rx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: @@ -484,8 +482,7 @@ void rfx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){   * TX Get and Set   **********************************************************************/  void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -499,7 +496,7 @@ void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){      case SUBDEV_PROP_GAIN:      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(rfx_tx_gain_ranges.keys(), name, "rfx tx gain name"); +        assert_has(rfx_tx_gain_ranges.keys(), key.name, "rfx tx gain name");          //no controllable tx gains, will not get here          return; @@ -540,8 +537,7 @@ void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){  }  void rfx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -551,7 +547,7 @@ void rfx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_tx_gain(val.as<float>(), name); +        this->set_tx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: diff --git a/host/lib/usrp/dboard/db_unknown.cpp b/host/lib/usrp/dboard/db_unknown.cpp index 9dd9b550b..f6f4f4a61 100644 --- a/host/lib/usrp/dboard/db_unknown.cpp +++ b/host/lib/usrp/dboard/db_unknown.cpp @@ -78,8 +78,7 @@ unknown_rx::~unknown_rx(void){  }  void unknown_rx::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -136,8 +135,7 @@ void unknown_rx::rx_get(const wax::obj &key_, wax::obj &val){  }  void unknown_rx::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -169,8 +167,7 @@ unknown_tx::~unknown_tx(void){  }  void unknown_tx::tx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -227,8 +224,7 @@ void unknown_tx::tx_get(const wax::obj &key_, wax::obj &val){  }  void unknown_tx::tx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ diff --git a/host/lib/usrp/dboard/db_wbx.cpp b/host/lib/usrp/dboard/db_wbx.cpp index 3038ce30b..ccd897674 100644 --- a/host/lib/usrp/dboard/db_wbx.cpp +++ b/host/lib/usrp/dboard/db_wbx.cpp @@ -467,8 +467,7 @@ double wbx_xcvr::set_lo_freq(   * RX Get and Set   **********************************************************************/  void wbx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -481,13 +480,13 @@ void wbx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_rx_gains.keys(), name, "wbx rx gain name"); -        val = _rx_gains[name]; +        assert_has(_rx_gains.keys(), key.name, "wbx rx gain name"); +        val = _rx_gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(wbx_rx_gain_ranges.keys(), name, "wbx rx gain name"); -        val = wbx_rx_gain_ranges[name]; +        assert_has(wbx_rx_gain_ranges.keys(), key.name, "wbx rx gain name"); +        val = wbx_rx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -527,8 +526,7 @@ void wbx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){  }  void wbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -538,7 +536,7 @@ void wbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_rx_gain(val.as<float>(), name); +        this->set_rx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: @@ -553,8 +551,7 @@ void wbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){   * TX Get and Set   **********************************************************************/  void wbx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -567,13 +564,13 @@ void wbx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_tx_gains.keys(), name, "wbx tx gain name"); -        val = _tx_gains[name]; +        assert_has(_tx_gains.keys(), key.name, "wbx tx gain name"); +        val = _tx_gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(wbx_tx_gain_ranges.keys(), name, "wbx tx gain name"); -        val = wbx_tx_gain_ranges[name]; +        assert_has(wbx_tx_gain_ranges.keys(), key.name, "wbx tx gain name"); +        val = wbx_tx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -613,8 +610,7 @@ void wbx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){  }  void wbx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -624,7 +620,7 @@ void wbx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_tx_gain(val.as<float>(), name); +        this->set_tx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp index 2c94bcd2d..798ff74a3 100644 --- a/host/lib/usrp/dboard/db_xcvr2450.cpp +++ b/host/lib/usrp/dboard/db_xcvr2450.cpp @@ -438,8 +438,7 @@ void xcvr2450::set_rx_gain(float gain, const std::string &name){   * RX Get and Set   **********************************************************************/  void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -452,13 +451,13 @@ void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_rx_gains.keys(), name, "xcvr rx gain name"); -        val = _rx_gains[name]; +        assert_has(_rx_gains.keys(), key.name, "xcvr rx gain name"); +        val = _rx_gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(xcvr_rx_gain_ranges.keys(), name, "xcvr rx gain name"); -        val = xcvr_rx_gain_ranges[name]; +        assert_has(xcvr_rx_gain_ranges.keys(), key.name, "xcvr rx gain name"); +        val = xcvr_rx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -502,8 +501,7 @@ void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){  }  void xcvr2450::rx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -513,7 +511,7 @@ void xcvr2450::rx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_rx_gain(val.as<float>(), name); +        this->set_rx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: @@ -528,8 +526,7 @@ void xcvr2450::rx_set(const wax::obj &key_, const wax::obj &val){   * TX Get and Set   **********************************************************************/  void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -542,13 +539,13 @@ void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        assert_has(_tx_gains.keys(), name, "xcvr tx gain name"); -        val = _tx_gains[name]; +        assert_has(_tx_gains.keys(), key.name, "xcvr tx gain name"); +        val = _tx_gains[key.name];          return;      case SUBDEV_PROP_GAIN_RANGE: -        assert_has(xcvr_tx_gain_ranges.keys(), name, "xcvr tx gain name"); -        val = xcvr_tx_gain_ranges[name]; +        assert_has(xcvr_tx_gain_ranges.keys(), key.name, "xcvr tx gain name"); +        val = xcvr_tx_gain_ranges[key.name];          return;      case SUBDEV_PROP_GAIN_NAMES: @@ -588,8 +585,7 @@ void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){  }  void xcvr2450::tx_set(const wax::obj &key_, const wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<subdev_prop_t>()){ @@ -599,7 +595,7 @@ void xcvr2450::tx_set(const wax::obj &key_, const wax::obj &val){          return;      case SUBDEV_PROP_GAIN: -        this->set_tx_gain(val.as<float>(), name); +        this->set_tx_gain(val.as<float>(), key.name);          return;      case SUBDEV_PROP_ANTENNA: diff --git a/host/lib/usrp/misc_utils.cpp b/host/lib/usrp/misc_utils.cpp index 0aa03a6cc..930314fc2 100644 --- a/host/lib/usrp/misc_utils.cpp +++ b/host/lib/usrp/misc_utils.cpp @@ -16,8 +16,12 @@  //  #include "misc_utils.hpp" +#include <uhd/utils/assert.hpp>  #include <uhd/utils/gain_group.hpp> +#include <uhd/usrp/dboard_id.hpp>  #include <uhd/usrp/subdev_props.hpp> +#include <uhd/usrp/mboard_props.hpp> +#include <uhd/usrp/dboard_props.hpp>  #include <uhd/usrp/codec_props.hpp>  #include <boost/bind.hpp>  #include <boost/foreach.hpp> @@ -112,3 +116,69 @@ gain_group::sptr usrp::make_gain_group(wax::obj subdev, wax::obj codec){      }      return gg;  } + +/*********************************************************************** + * verify subdev specs + **********************************************************************/ +static void verify_xx_subdev_spec( +    mboard_prop_t dboard_names_prop, +    mboard_prop_t dboard_prop, +    subdev_spec_t &subdev_spec, +    wax::obj mboard, +    std::string xx_type +){ +    prop_names_t dboard_names = mboard[dboard_names_prop].as<prop_names_t>(); +    UHD_ASSERT_THROW(dboard_names.size() > 0); //well i hope there is a dboard + +    //the subdevice specification is empty: handle automatic +    if (subdev_spec.empty()){ +        BOOST_FOREACH(const std::string &db_name, dboard_names){ +            wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; + +            //if the dboard slot is populated, take the first subdevice +            if (dboard[DBOARD_PROP_DBOARD_ID].as<dboard_id_t>() != dboard_id_t::none()){ +                std::string sd_name = dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>().front(); +                subdev_spec.push_back(subdev_spec_pair_t(db_name, sd_name)); +                break; +            } +        } + +        //didnt find any populated dboards: add the first subdevice +        if (subdev_spec.empty()){ +            std::string db_name = dboard_names.front(); +            wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; +            std::string sd_name = dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>().front(); +            subdev_spec.push_back(subdev_spec_pair_t(db_name, sd_name)); +        } +    } + +    //sanity check that the dboard/subdevice names exist for this mboard +    BOOST_FOREACH(const subdev_spec_pair_t &pair, subdev_spec){ +        //empty db name means select dboard automatically +        if (pair.db_name.empty()){ +            if (dboard_names.size() != 1) throw std::runtime_error( +                "A daughterboard name must be provided for multi-slot boards: " + subdev_spec.to_string() +            ); +            pair.db_name == dboard_names.front(); +        } +        uhd::assert_has(dboard_names, pair.db_name, xx_type + " dboard name"); +        wax::obj dboard = mboard[named_prop_t(dboard_prop, pair.db_name)]; +        uhd::assert_has(dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>(), pair.sd_name, xx_type + " subdev name"); +    } +} + +void usrp::verify_rx_subdev_spec(subdev_spec_t &subdev_spec, wax::obj mboard){ +    return verify_xx_subdev_spec( +        MBOARD_PROP_RX_DBOARD_NAMES, +        MBOARD_PROP_RX_DBOARD, +        subdev_spec, mboard, "rx" +    ); +} + +void usrp::verify_tx_subdev_spec(subdev_spec_t &subdev_spec, wax::obj mboard){ +    return verify_xx_subdev_spec( +        MBOARD_PROP_TX_DBOARD_NAMES, +        MBOARD_PROP_TX_DBOARD, +        subdev_spec, mboard, "tx" +    ); +} diff --git a/host/lib/usrp/misc_utils.hpp b/host/lib/usrp/misc_utils.hpp index 7fe3c899d..e5d3bd849 100644 --- a/host/lib/usrp/misc_utils.hpp +++ b/host/lib/usrp/misc_utils.hpp @@ -20,6 +20,7 @@  #include <uhd/config.hpp>  #include <uhd/wax.hpp> +#include <uhd/usrp/subdev_spec.hpp>  #include <uhd/utils/gain_group.hpp>  namespace uhd{ namespace usrp{ @@ -29,6 +30,24 @@ namespace uhd{ namespace usrp{       */      gain_group::sptr make_gain_group(wax::obj subdev, wax::obj codec); +    /*! +     * Verify the rx subdevice specification. +     * If the subdev spec if empty, automatically fill it. +     * \param subdev_spec the subdev spec to verify/fill +     * \param mboard the motherboard properties object +     * \throw exception when the subdev spec is invalid +     */ +    void verify_rx_subdev_spec(subdev_spec_t &subdev_spec, wax::obj mboard); + +    /*! +     * Verify the tx subdevice specification. +     * If the subdev spec if empty, automatically fill it. +     * \param subdev_spec the subdev spec to verify/fill +     * \param mboard the motherboard properties object +     * \throw exception when the subdev spec is invalid +     */ +    void verify_tx_subdev_spec(subdev_spec_t &subdev_spec, wax::obj mboard); +  }} //namespace  #endif /* INCLUDED_LIBUHD_USRP_MISC_UTILS_HPP */ diff --git a/host/lib/usrp/subdev_spec.cpp b/host/lib/usrp/subdev_spec.cpp index 0f00e2f74..7a3e72867 100644 --- a/host/lib/usrp/subdev_spec.cpp +++ b/host/lib/usrp/subdev_spec.cpp @@ -16,7 +16,7 @@  //  #include <uhd/usrp/subdev_spec.hpp> -#include <boost/algorithm/string.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/format.hpp>  #include <boost/foreach.hpp>  #include <stdexcept> @@ -35,12 +35,9 @@ subdev_spec_pair_t::subdev_spec_pair_t(  }  subdev_spec_t::subdev_spec_t(const std::string &markup){ -    std::vector<std::string> pairs; -    boost::split(pairs, markup, boost::is_any_of("\t ")); -    BOOST_FOREACH(const std::string &pair, pairs){ +    BOOST_FOREACH(const std::string &pair, std::split_string(markup)){          if (pair == "") continue; -        std::vector<std::string> db_sd; -        boost::split(db_sd, pair, boost::is_any_of(":")); +        std::vector<std::string> db_sd = std::split_string(pair, ":");          switch(db_sd.size()){          case 1: this->push_back(subdev_spec_pair_t("", db_sd.front())); break;          case 2: this->push_back(subdev_spec_pair_t(db_sd.front(), db_sd.back())); break; @@ -56,13 +53,9 @@ std::string subdev_spec_t::to_pp_string(void) const{      size_t count = 0;      ss << "Subdevice Specification:" << std::endl;      BOOST_FOREACH(const subdev_spec_pair_t &pair, *this){ -        std::string db_name = pair.db_name; -        if (db_name == "") db_name = "0"; -        std::string sd_name = pair.sd_name; -        if (sd_name == "") sd_name = "0";          ss << boost::format(              "    Channel %d: Daughterboard %s, Subdevice %s" -        ) % (count++) % db_name % sd_name << std::endl; +        ) % (count++) % pair.db_name % pair.sd_name << std::endl;      }      return ss.str();  } diff --git a/host/lib/usrp/usrp2/codec_impl.cpp b/host/lib/usrp/usrp2/codec_impl.cpp index b9d51abf5..fc917b102 100644 --- a/host/lib/usrp/usrp2/codec_impl.cpp +++ b/host/lib/usrp/usrp2/codec_impl.cpp @@ -40,9 +40,7 @@ void usrp2_mboard_impl::codec_init(void){  /***********************************************************************   * RX Codec Properties   **********************************************************************/ -void usrp2_mboard_impl::rx_codec_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +void usrp2_mboard_impl::rx_codec_get(const wax::obj &key, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<codec_prop_t>()){ @@ -69,9 +67,7 @@ void usrp2_mboard_impl::rx_codec_set(const wax::obj &, const wax::obj &){  /***********************************************************************   * TX Codec Properties   **********************************************************************/ -void usrp2_mboard_impl::tx_codec_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +void usrp2_mboard_impl::tx_codec_get(const wax::obj &key, wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<codec_prop_t>()){ diff --git a/host/lib/usrp/usrp2/dboard_iface.cpp b/host/lib/usrp/usrp2/dboard_iface.cpp index 1b9a4bb97..8bded1ea3 100644 --- a/host/lib/usrp/usrp2/dboard_iface.cpp +++ b/host/lib/usrp/usrp2/dboard_iface.cpp @@ -37,7 +37,12 @@ public:      usrp2_dboard_iface(usrp2_iface::sptr iface, usrp2_clock_ctrl::sptr clock_ctrl);      ~usrp2_dboard_iface(void); -    std::string get_mboard_name(void){return "usrp2";} +    special_props_t get_special_props(void){ +        special_props_t props; +        props.soft_clock_divider = false; +        props.mangle_i2c_addrs = false; +        return props; +    }      void write_aux_dac(unit_t, aux_dac_t, float);      float read_aux_adc(unit_t, aux_adc_t); diff --git a/host/lib/usrp/usrp2/dboard_impl.cpp b/host/lib/usrp/usrp2/dboard_impl.cpp index 075f22388..bafeb3f15 100644 --- a/host/lib/usrp/usrp2/dboard_impl.cpp +++ b/host/lib/usrp/usrp2/dboard_impl.cpp @@ -59,8 +59,7 @@ void usrp2_mboard_impl::dboard_init(void){   * RX DBoard Properties   **********************************************************************/  void usrp2_mboard_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<dboard_prop_t>()){ @@ -69,7 +68,7 @@ void usrp2_mboard_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val){          return;      case DBOARD_PROP_SUBDEV: -        val = _dboard_manager->get_rx_subdev(name); +        val = _dboard_manager->get_rx_subdev(key.name);          return;      case DBOARD_PROP_SUBDEV_NAMES: @@ -90,7 +89,7 @@ void usrp2_mboard_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val){      case DBOARD_PROP_GAIN_GROUP:          val = make_gain_group( -            _dboard_manager->get_rx_subdev(name), _rx_codec_proxy->get_link() +            _dboard_manager->get_rx_subdev(key.name), _rx_codec_proxy->get_link()          );          return; @@ -114,8 +113,7 @@ void usrp2_mboard_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val){   * TX DBoard Properties   **********************************************************************/  void usrp2_mboard_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<dboard_prop_t>()){ @@ -124,7 +122,7 @@ void usrp2_mboard_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val){          return;      case DBOARD_PROP_SUBDEV: -        val = _dboard_manager->get_tx_subdev(name); +        val = _dboard_manager->get_tx_subdev(key.name);          return;      case DBOARD_PROP_SUBDEV_NAMES: @@ -145,7 +143,7 @@ void usrp2_mboard_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val){      case DBOARD_PROP_GAIN_GROUP:          val = make_gain_group( -            _dboard_manager->get_tx_subdev(name), _tx_codec_proxy->get_link() +            _dboard_manager->get_tx_subdev(key.name), _tx_codec_proxy->get_link()          );          return; diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 610aade14..d354a943b 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -17,6 +17,7 @@  #include "usrp2_impl.hpp"  #include "usrp2_regs.hpp" +#include "../misc_utils.hpp"  #include "../dsp_utils.hpp"  #include <uhd/usrp/mboard_props.hpp>  #include <uhd/utils/assert.hpp> @@ -185,12 +186,13 @@ void usrp2_mboard_impl::issue_ddc_stream_cmd(const stream_cmd_t &stream_cmd){  /***********************************************************************   * MBoard Get Properties   **********************************************************************/ +static const std::string dboard_name = "0"; +  void usrp2_mboard_impl::get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the other props -    if (key.type() == typeid(std::string)){ +    if (key_.type() == typeid(std::string)){          if (key.as<std::string>() == "mac-addr"){              byte_vector_t bytes = _iface->read_eeprom(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_MAC_ADDR, 6);              val = mac_addr_t::from_bytes(bytes).to_string(); @@ -221,25 +223,25 @@ void usrp2_mboard_impl::get(const wax::obj &key_, wax::obj &val){          return;      case MBOARD_PROP_RX_DBOARD: -        UHD_ASSERT_THROW(name == ""); +        UHD_ASSERT_THROW(key.name == dboard_name);          val = _rx_dboard_proxy->get_link();          return;      case MBOARD_PROP_RX_DBOARD_NAMES: -        val = prop_names_t(1, ""); +        val = prop_names_t(1, dboard_name);          return;      case MBOARD_PROP_TX_DBOARD: -        UHD_ASSERT_THROW(name == ""); +        UHD_ASSERT_THROW(key.name == dboard_name);          val = _tx_dboard_proxy->get_link();          return;      case MBOARD_PROP_TX_DBOARD_NAMES: -        val = prop_names_t(1, ""); +        val = prop_names_t(1, dboard_name);          return;      case MBOARD_PROP_RX_DSP: -        UHD_ASSERT_THROW(name == ""); +        UHD_ASSERT_THROW(key.name == "");          val = _rx_dsp_proxy->get_link();          return; @@ -248,7 +250,7 @@ void usrp2_mboard_impl::get(const wax::obj &key_, wax::obj &val){          return;      case MBOARD_PROP_TX_DSP: -        UHD_ASSERT_THROW(name == ""); +        UHD_ASSERT_THROW(key.name == "");          val = _tx_dsp_proxy->get_link();          return; @@ -324,14 +326,9 @@ void usrp2_mboard_impl::set(const wax::obj &key, const wax::obj &val){      case MBOARD_PROP_RX_SUBDEV_SPEC:          _rx_subdev_spec = val.as<subdev_spec_t>(); -        //handle automatic -        if (_rx_subdev_spec.empty()) _rx_subdev_spec.push_back( -            subdev_spec_pair_t("", _dboard_manager->get_rx_subdev_names().front()) -        ); +        verify_rx_subdev_spec(_rx_subdev_spec, this->get_link());          //sanity check          UHD_ASSERT_THROW(_rx_subdev_spec.size() == 1); -        uhd::assert_has((*this)[MBOARD_PROP_RX_DBOARD_NAMES].as<prop_names_t>(), _rx_subdev_spec.front().db_name, "rx dboard names"); -        uhd::assert_has(_dboard_manager->get_rx_subdev_names(), _rx_subdev_spec.front().sd_name, "rx subdev names");          //set the mux          _iface->poke32(U2_REG_DSP_RX_MUX, dsp_type1::calc_rx_mux_word(              _dboard_manager->get_rx_subdev(_rx_subdev_spec.front().sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>() @@ -340,14 +337,9 @@ void usrp2_mboard_impl::set(const wax::obj &key, const wax::obj &val){      case MBOARD_PROP_TX_SUBDEV_SPEC:          _tx_subdev_spec = val.as<subdev_spec_t>(); -        //handle automatic -        if (_tx_subdev_spec.empty()) _tx_subdev_spec.push_back( -            subdev_spec_pair_t("", _dboard_manager->get_tx_subdev_names().front()) -        ); +        verify_tx_subdev_spec(_tx_subdev_spec, this->get_link());          //sanity check          UHD_ASSERT_THROW(_tx_subdev_spec.size() == 1); -        uhd::assert_has((*this)[MBOARD_PROP_TX_DBOARD_NAMES].as<prop_names_t>(), _tx_subdev_spec.front().db_name, "tx dboard names"); -        uhd::assert_has(_dboard_manager->get_tx_subdev_names(), _tx_subdev_spec.front().sd_name, "tx subdev names");          //set the mux          _iface->poke32(U2_REG_DSP_TX_MUX, dsp_type1::calc_tx_mux_word(              _dboard_manager->get_tx_subdev(_tx_subdev_spec.front().sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>() diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 21f411afe..568c87a22 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -21,7 +21,7 @@  #include <uhd/usrp/device_props.hpp>  #include <uhd/utils/assert.hpp>  #include <uhd/utils/static.hpp> -#include <boost/algorithm/string.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/assign/list_of.hpp>  #include <boost/format.hpp>  #include <boost/foreach.hpp> @@ -41,12 +41,6 @@ static const size_t DISCOVERY_TIMEOUT_MS = 100;  /***********************************************************************   * Helper Functions   **********************************************************************/ -std::vector<std::string> split_addrs(const std::string &addrs_str){ -    std::vector<std::string> addrs; -    boost::split(addrs, addrs_str, boost::is_any_of("\t ")); -    return addrs; -} -  template <class T> std::string num2str(T num){      return boost::lexical_cast<std::string>(num);  } @@ -80,7 +74,7 @@ static uhd::device_addrs_t usrp2_find(const device_addr_t &hint){      }      //if there are multiple addresses, just return good, dont test -    std::vector<std::string> addrs = split_addrs(hint["addr"]); +    std::vector<std::string> addrs = std::split_string(hint["addr"]);      if (addrs.size() > 1){          device_addr_t new_addr;          new_addr["type"] = "usrp2"; @@ -155,7 +149,7 @@ static device::sptr usrp2_make(const device_addr_t &device_addr){      std::vector<udp_simple::sptr> ctrl_transports;      std::vector<udp_zero_copy::sptr> data_transports; -    BOOST_FOREACH(const std::string &addr, split_addrs(device_addr["addr"])){ +    BOOST_FOREACH(const std::string &addr, std::split_string(device_addr["addr"])){          ctrl_transports.push_back(udp_simple::make_connected(              addr, num2str(USRP2_UDP_CTRL_PORT)          )); @@ -207,8 +201,7 @@ usrp2_impl::~usrp2_impl(void){   * Device Properties   **********************************************************************/  void usrp2_impl::get(const wax::obj &key_, wax::obj &val){ -    wax::obj key; std::string name; -    boost::tie(key, name) = extract_named_prop(key_); +    named_prop_t key = named_prop_t::extract(key_);      //handle the get request conditioned on the key      switch(key.as<device_prop_t>()){ @@ -218,7 +211,7 @@ void usrp2_impl::get(const wax::obj &key_, wax::obj &val){          return;      case DEVICE_PROP_MBOARD: -        val = _mboard_dict[name]->get_link(); +        val = _mboard_dict[key.name]->get_link();          return;      case DEVICE_PROP_MBOARD_NAMES: diff --git a/host/lib/utils/paths.cpp b/host/lib/utils/paths.cpp index 4029bd989..9ac20d855 100644 --- a/host/lib/utils/paths.cpp +++ b/host/lib/utils/paths.cpp @@ -17,7 +17,7 @@  #include "constants.hpp"  #include <uhd/config.hpp> -#include <boost/algorithm/string.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/program_options.hpp>  #include <boost/filesystem.hpp>  #include <boost/foreach.hpp> @@ -58,15 +58,9 @@ static std::vector<fs::path> get_env_paths(const std::string &var_name){      po::store(po::parse_environment(desc, boost::bind(&name_mapper, var_name, _1)), vm);      po::notify(vm); -    //split the path at the path separators -    std::vector<std::string> path_strings; -    if (not var_value.empty()) boost::split(//dont split empty strings -        path_strings, var_value, boost::is_any_of(env_path_sep) -    ); -      //convert to filesystem path, filter blank paths      std::vector<fs::path> paths; -    BOOST_FOREACH(std::string &path_string, path_strings){ +    BOOST_FOREACH(const std::string &path_string, std::split_string(var_value, env_path_sep)){          if (path_string.empty()) continue;          paths.push_back(fs::system_complete(path_string));      } diff --git a/host/lib/utils/props.cpp b/host/lib/utils/props.cpp index fac5fe24f..fc9f8e63f 100644 --- a/host/lib/utils/props.cpp +++ b/host/lib/utils/props.cpp @@ -29,15 +29,12 @@ named_prop_t::named_prop_t(      /* NOP */  } -typedef boost::tuple<wax::obj, std::string> named_prop_tuple; - -named_prop_tuple uhd::extract_named_prop( +named_prop_t named_prop_t::extract(      const wax::obj &key,      const std::string &name  ){      if (key.type() == typeid(named_prop_t)){ -        named_prop_t np = key.as<named_prop_t>(); -        return named_prop_tuple(np.key, np.name); +        return key.as<named_prop_t>();      } -    return named_prop_tuple(key, name); +    return named_prop_t(key, name);  } diff --git a/host/lib/utils/warning.cpp b/host/lib/utils/warning.cpp index ae4d4c7aa..8a7d35a23 100644 --- a/host/lib/utils/warning.cpp +++ b/host/lib/utils/warning.cpp @@ -16,7 +16,7 @@  //  #include <uhd/utils/warning.hpp> -#include <boost/algorithm/string.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/foreach.hpp>  #include <iostream>  #include <vector> @@ -24,13 +24,9 @@  using namespace uhd;  void uhd::print_warning(const std::string &msg){ -    //extract the message lines -    std::vector<std::string> lines; -    boost::split(lines, msg, boost::is_any_of("\n")); -      //print the warning message      std::cerr << std::endl << "Warning:" << std::endl; -    BOOST_FOREACH(const std::string &line, lines){ +    BOOST_FOREACH(const std::string &line, std::split_string(msg, "\n")){          std::cerr << "    " << line << std::endl;      }  } diff --git a/host/utils/uhd_usrp_probe.cpp b/host/utils/uhd_usrp_probe.cpp index 097317516..8947034d7 100644 --- a/host/utils/uhd_usrp_probe.cpp +++ b/host/utils/uhd_usrp_probe.cpp @@ -18,6 +18,7 @@  #include <uhd/utils/safe_main.hpp>  #include <uhd/device.hpp>  #include <uhd/types/ranges.hpp> +#include <uhd/utils/algorithm.hpp>  #include <uhd/usrp/device_props.hpp>  #include <uhd/usrp/mboard_props.hpp>  #include <uhd/usrp/dboard_props.hpp> @@ -26,7 +27,6 @@  #include <uhd/usrp/subdev_props.hpp>  #include <uhd/usrp/dboard_id.hpp>  #include <boost/program_options.hpp> -#include <boost/algorithm/string.hpp>  #include <boost/format.hpp>  #include <boost/foreach.hpp>  #include <iostream> @@ -43,7 +43,7 @@ static std::string make_border(const std::string &text){      std::stringstream ss;      ss << boost::format("  _____________________________________________________") << std::endl;      ss << boost::format(" /") << std::endl; -    std::vector<std::string> lines; boost::split(lines, text, boost::is_any_of("\n")); +    std::vector<std::string> lines = std::split_string(text, "\n");      while (lines.back() == "") lines.pop_back(); //strip trailing newlines      if (lines.size()) lines[0] = "    " + lines[0]; //indent the title line      BOOST_FOREACH(const std::string &line, lines){ | 
