diff options
| -rw-r--r-- | host/include/uhd/usrp/subdev_props.hpp | 1 | ||||
| -rw-r--r-- | host/include/uhd/usrp/subdev_spec.hpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_basic_and_lf.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_dbsrx.cpp | 7 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_rfx.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_unknown.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_wbx.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/db_xcvr2450.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 12 | ||||
| -rw-r--r-- | host/lib/usrp/misc_utils.cpp | 17 | ||||
| -rw-r--r-- | host/lib/usrp/subdev_spec.cpp | 4 | 
11 files changed, 115 insertions, 2 deletions
| diff --git a/host/include/uhd/usrp/subdev_props.hpp b/host/include/uhd/usrp/subdev_props.hpp index cd07cb7a8..8f096ffe4 100644 --- a/host/include/uhd/usrp/subdev_props.hpp +++ b/host/include/uhd/usrp/subdev_props.hpp @@ -53,6 +53,7 @@ namespace uhd{ namespace usrp{          SUBDEV_PROP_ANTENNA_NAMES     = 'A', //ro, prop_names_t          SUBDEV_PROP_LO_LOCKED         = 'L', //ro, bool          SUBDEV_PROP_CONNECTION        = 'c', //ro, subdev_conn_t +        SUBDEV_PROP_ENABLED           = 'e', //rw, bool          SUBDEV_PROP_USE_LO_OFFSET     = 'l', //ro, bool          SUBDEV_PROP_RSSI              = 'R', //ro, float          SUBDEV_PROP_BANDWIDTH         = 'B'  //rw, double diff --git a/host/include/uhd/usrp/subdev_spec.hpp b/host/include/uhd/usrp/subdev_spec.hpp index 2f32509b9..5de3bb3b8 100644 --- a/host/include/uhd/usrp/subdev_spec.hpp +++ b/host/include/uhd/usrp/subdev_spec.hpp @@ -19,6 +19,7 @@  #define INCLUDED_UHD_USRP_SUBDEV_SPEC_HPP  #include <uhd/config.hpp> +#include <boost/operators.hpp>  #include <vector>  #include <string> @@ -27,7 +28,7 @@ namespace uhd{ namespace usrp{      /*!       * A subdevice specification (daughterboard, subdevice) name pairing.       */ -    struct UHD_API subdev_spec_pair_t{ +    struct UHD_API subdev_spec_pair_t : boost::equality_comparable<subdev_spec_pair_t>{          //! The daughterboard name          std::string db_name; @@ -45,6 +46,9 @@ namespace uhd{ namespace usrp{          );      }; +    //! overloaded comparison operator for subdev_spec_pair_t +    UHD_API bool operator==(const subdev_spec_pair_t &, const subdev_spec_pair_t &); +      /*!       * A list of (daughterboard name, subdevice name) pairs:       * diff --git a/host/lib/usrp/dboard/db_basic_and_lf.cpp b/host/lib/usrp/dboard/db_basic_and_lf.cpp index 4b0d8bf27..41f6f8002 100644 --- a/host/lib/usrp/dboard/db_basic_and_lf.cpp +++ b/host/lib/usrp/dboard/db_basic_and_lf.cpp @@ -149,6 +149,10 @@ void basic_rx::rx_get(const wax::obj &key_, wax::obj &val){          val = sd_name_to_conn[get_subdev_name()];          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -178,6 +182,9 @@ void basic_rx::rx_set(const wax::obj &key_, const wax::obj &val){      case SUBDEV_PROP_FREQ:          return; // it wont do you much good, but you can set it +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } @@ -241,6 +248,10 @@ void basic_tx::tx_get(const wax::obj &key_, wax::obj &val){          val = sd_name_to_conn[get_subdev_name()];          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -270,6 +281,9 @@ void basic_tx::tx_set(const wax::obj &key_, const wax::obj &val){      case SUBDEV_PROP_FREQ:          return; // it wont do you much good, but you can set it +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } diff --git a/host/lib/usrp/dboard/db_dbsrx.cpp b/host/lib/usrp/dboard/db_dbsrx.cpp index 81434f054..23cafea53 100644 --- a/host/lib/usrp/dboard/db_dbsrx.cpp +++ b/host/lib/usrp/dboard/db_dbsrx.cpp @@ -551,6 +551,10 @@ void dbsrx::rx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -587,6 +591,9 @@ void dbsrx::rx_set(const wax::obj &key_, const wax::obj &val){          this->set_gain(val.as<float>(), key.name);          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      case SUBDEV_PROP_BANDWIDTH:          this->set_bandwidth(val.as<float>());          return; diff --git a/host/lib/usrp/dboard/db_rfx.cpp b/host/lib/usrp/dboard/db_rfx.cpp index c3ab96e59..cfc34381e 100644 --- a/host/lib/usrp/dboard/db_rfx.cpp +++ b/host/lib/usrp/dboard/db_rfx.cpp @@ -444,6 +444,10 @@ void rfx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_QI;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -474,6 +478,9 @@ void rfx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){          this->set_rx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } @@ -524,6 +531,10 @@ void rfx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = true;          return; @@ -554,6 +565,9 @@ void rfx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){          this->set_tx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } diff --git a/host/lib/usrp/dboard/db_unknown.cpp b/host/lib/usrp/dboard/db_unknown.cpp index f6f4f4a61..ec7ab440b 100644 --- a/host/lib/usrp/dboard/db_unknown.cpp +++ b/host/lib/usrp/dboard/db_unknown.cpp @@ -122,6 +122,10 @@ void unknown_rx::rx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -151,6 +155,9 @@ void unknown_rx::rx_set(const wax::obj &key_, const wax::obj &val){      case SUBDEV_PROP_FREQ:          return; // it wont do you much good, but you can set it +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } @@ -211,6 +218,10 @@ void unknown_tx::tx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -240,6 +251,9 @@ void unknown_tx::tx_set(const wax::obj &key_, const wax::obj &val){      case SUBDEV_PROP_FREQ:          return; // it wont do you much good, but you can set it +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } diff --git a/host/lib/usrp/dboard/db_wbx.cpp b/host/lib/usrp/dboard/db_wbx.cpp index e473ce41e..907268aac 100644 --- a/host/lib/usrp/dboard/db_wbx.cpp +++ b/host/lib/usrp/dboard/db_wbx.cpp @@ -513,6 +513,10 @@ void wbx_xcvr::rx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -543,6 +547,9 @@ void wbx_xcvr::rx_set(const wax::obj &key_, const wax::obj &val){          this->set_rx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } @@ -597,6 +604,10 @@ void wbx_xcvr::tx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -627,6 +638,9 @@ void wbx_xcvr::tx_set(const wax::obj &key_, const wax::obj &val){          this->set_tx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } diff --git a/host/lib/usrp/dboard/db_xcvr2450.cpp b/host/lib/usrp/dboard/db_xcvr2450.cpp index 798ff74a3..0ee133f3d 100644 --- a/host/lib/usrp/dboard/db_xcvr2450.cpp +++ b/host/lib/usrp/dboard/db_xcvr2450.cpp @@ -484,6 +484,10 @@ void xcvr2450::rx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_IQ;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -518,6 +522,9 @@ void xcvr2450::rx_set(const wax::obj &key_, const wax::obj &val){          this->set_rx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } @@ -572,6 +579,10 @@ void xcvr2450::tx_get(const wax::obj &key_, wax::obj &val){          val = SUBDEV_CONN_COMPLEX_QI;          return; +    case SUBDEV_PROP_ENABLED: +        val = true; //always enabled +        return; +      case SUBDEV_PROP_USE_LO_OFFSET:          val = false;          return; @@ -602,6 +613,9 @@ void xcvr2450::tx_set(const wax::obj &key_, const wax::obj &val){          this->set_tx_ant(val.as<std::string>());          return; +    case SUBDEV_PROP_ENABLED: +        return; //always enabled +      default: UHD_THROW_PROP_SET_ERROR();      }  } diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index 181f843a0..78daa1b4d 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -86,7 +86,7 @@ std::string dboard_id_t::to_pp_string(void) const{  }  /*********************************************************************** - * internal helper classe + * internal helper classes   **********************************************************************/  /*!   * A special wax proxy object that forwards calls to a subdev. @@ -330,4 +330,14 @@ 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; +    }  } diff --git a/host/lib/usrp/misc_utils.cpp b/host/lib/usrp/misc_utils.cpp index 5cfcdc8d3..05308baba 100644 --- a/host/lib/usrp/misc_utils.cpp +++ b/host/lib/usrp/misc_utils.cpp @@ -17,6 +17,7 @@  #include <uhd/usrp/misc_utils.hpp>  #include <uhd/utils/assert.hpp> +#include <uhd/utils/algorithm.hpp>  #include <uhd/utils/gain_group.hpp>  #include <uhd/usrp/dboard_id.hpp>  #include <uhd/usrp/subdev_props.hpp> @@ -186,6 +187,22 @@ static void verify_xx_subdev_spec(              "Validate %s subdev spec failed: %s\n    %s"          ) % xx_type % subdev_spec.to_string() % e.what()));      } + +    //now use the subdev spec to enable the subdevices in use and vice-versa +    BOOST_FOREACH(const std::string &db_name, mboard[dboard_names_prop].as<prop_names_t>()){ +        wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; +        BOOST_FOREACH(const std::string &sd_name, dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>()){ +            try{ +                bool enable = std::has(subdev_spec, subdev_spec_pair_t(db_name, sd_name)); +                dboard[named_prop_t(DBOARD_PROP_SUBDEV, sd_name)][SUBDEV_PROP_ENABLED] = enable; +            } +            catch(const std::exception &e){ +                throw std::runtime_error(str(boost::format( +                    "Cannot set enabled property on subdevice %s:%s\n    %s" +                ) % db_name % sd_name % e.what())); +            } +        } +    }  }  void usrp::verify_rx_subdev_spec(subdev_spec_t &subdev_spec, wax::obj mboard){ diff --git a/host/lib/usrp/subdev_spec.cpp b/host/lib/usrp/subdev_spec.cpp index 7a3e72867..95d2cbb12 100644 --- a/host/lib/usrp/subdev_spec.cpp +++ b/host/lib/usrp/subdev_spec.cpp @@ -34,6 +34,10 @@ subdev_spec_pair_t::subdev_spec_pair_t(      /* NOP */  } +bool usrp::operator==(const subdev_spec_pair_t &lhs, const subdev_spec_pair_t &rhs){ +    return (lhs.db_name == rhs.db_name) and (lhs.sd_name == rhs.sd_name); +} +  subdev_spec_t::subdev_spec_t(const std::string &markup){      BOOST_FOREACH(const std::string &pair, std::split_string(markup)){          if (pair == "") continue; | 
