diff options
author | Josh Blum <josh@joshknows.com> | 2011-06-28 19:10:55 -0700 |
---|---|---|
committer | Josh Blum <josh@joshknows.com> | 2011-06-28 19:10:55 -0700 |
commit | ebd2ecc6ff2b82cb06701bbcda17d4caaa4ba8c1 (patch) | |
tree | 458881f9c6fda810b0dc51a5ee12b89c24624b82 | |
parent | cbbae2f5b4a429458892267254bdf6e25864f375 (diff) | |
download | uhd-ebd2ecc6ff2b82cb06701bbcda17d4caaa4ba8c1.tar.gz uhd-ebd2ecc6ff2b82cb06701bbcda17d4caaa4ba8c1.tar.bz2 uhd-ebd2ecc6ff2b82cb06701bbcda17d4caaa4ba8c1.zip |
uhd: work getting multi-usrp working
-rw-r--r-- | host/include/uhd/property_tree.ipp | 13 | ||||
-rw-r--r-- | host/lib/usrp/multi_usrp.cpp | 309 | ||||
-rw-r--r-- | host/lib/usrp2/io_impl.cpp | 19 | ||||
-rw-r--r-- | host/lib/usrp2/usrp2_impl.cpp | 4 | ||||
-rw-r--r-- | host/utils/uhd_usrp_probe.cpp | 5 |
5 files changed, 177 insertions, 173 deletions
diff --git a/host/include/uhd/property_tree.ipp b/host/include/uhd/property_tree.ipp index 6bd88929d..e4520df58 100644 --- a/host/include/uhd/property_tree.ipp +++ b/host/include/uhd/property_tree.ipp @@ -18,6 +18,7 @@ #ifndef INCLUDED_UHD_PROPERTY_TREE_IPP #define INCLUDED_UHD_PROPERTY_TREE_IPP +#include <uhd/exception.hpp> #include <boost/foreach.hpp> #include <vector> @@ -51,9 +52,10 @@ public: } property<T> &set(const T &value){ - _value = _master.empty()? value : _master(value); + T new_value(_master.empty()? value : _master(value)); + _value = new_value; //shadow it BOOST_FOREACH(typename property<T>::subscriber_type &subscriber, _subscribers){ - subscriber(this->get()); //let errors propagate + subscriber(new_value); //let errors propagate } return *this; } @@ -88,7 +90,12 @@ namespace uhd{ } template <typename T> property<T> &property_tree::access(const path_type &path){ - return *boost::any_cast<typename property<T>::sptr>(this->_access(path)); + try{ + return *boost::any_cast<typename property<T>::sptr>(this->_access(path)); + } + catch(const boost::bad_any_cast &){ + throw uhd::type_error("Cannot cast the property at: " + path.string()); + } } } //namespace uhd diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index 64f82e559..935419c18 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see <http://www.gnu.org/licenses/>. // +#include <uhd/property_tree.hpp> #include <uhd/usrp/multi_usrp.hpp> #include <uhd/usrp/tune_helper.hpp> #include <uhd/usrp/mboard_iface.hpp> @@ -40,15 +41,7 @@ const std::string multi_usrp::ALL_GAINS = ""; /*********************************************************************** * Helper methods **********************************************************************/ -static inline uhd::freq_range_t add_dsp_shift( - const uhd::freq_range_t &range, - wax::obj dsp -){ - double codec_rate = dsp[uhd::usrp::DSP_PROP_CODEC_RATE].as<double>(); - return uhd::freq_range_t(range.start() - codec_rate/2.0, range.stop() + codec_rate/2.0); -} - -static inline void do_samp_rate_warning_message( +static void do_samp_rate_warning_message( double target_rate, double actual_rate, const std::string &xx @@ -63,7 +56,7 @@ static inline void do_samp_rate_warning_message( } } -static inline void do_tune_freq_warning_message( +static void do_tune_freq_warning_message( double target_freq, double actual_freq, const std::string &xx @@ -78,6 +71,26 @@ static inline void do_tune_freq_warning_message( } } +static double get_gain_value(property_tree::sptr tree, const property_tree::path_type &path){ + return tree->access<double>(path / "value").get(); +} + +static void set_gain_value(property_tree::sptr tree, const property_tree::path_type &path, const double gain){ + tree->access<double>(path / "value").set(gain); +} + +static meta_range_t get_gain_range(property_tree::sptr tree, const property_tree::path_type &path){ + return tree->access<meta_range_t>(path / "range").get(); +} + +static gain_fcns_t make_gain_fcns_from_path(property_tree::sptr tree, const property_tree::path_type &path){ + gain_fcns_t gain_fcns; + gain_fcns.get_range = boost::bind(&get_gain_range, tree, path); + gain_fcns.get_value = boost::bind(&get_gain_value, tree, path); + gain_fcns.set_value = boost::bind(&set_gain_value, tree, path, _1); + return gain_fcns; +} + /*********************************************************************** * Multi USRP Implementation **********************************************************************/ @@ -85,6 +98,7 @@ class multi_usrp_impl : public multi_usrp{ public: multi_usrp_impl(const device_addr_t &addr){ _dev = device::make(addr); + _tree = (*_dev)[0].as<property_tree::sptr>(); } device::sptr get_device(void){ @@ -96,7 +110,7 @@ public: ******************************************************************/ void set_master_clock_rate(double rate, size_t mboard){ if (mboard != ALL_MBOARDS){ - _mboard(mboard)[MBOARD_PROP_CLOCK_RATE] = rate; + _tree->access<double>(mb_root(mboard) / "tick_rate").set(rate); return; } for (size_t m = 0; m < get_num_mboards(); m++){ @@ -105,75 +119,28 @@ public: } double get_master_clock_rate(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_CLOCK_RATE].as<double>(); + return _tree->access<double>(mb_root(mboard) / "tick_rate").get(); } std::string get_pp_string(void){ - std::string buff = str(boost::format( - "%s USRP:\n" - " Device: %s\n" - ) - % ((get_num_mboards() > 1)? "Multi" : "Single") - % (*_dev)[DEVICE_PROP_NAME].as<std::string>() - ); - for (size_t m = 0; m < get_num_mboards(); m++){ - buff += str(boost::format( - " Mboard %d: %s\n" - ) % m - % _mboard(m)[MBOARD_PROP_NAME].as<std::string>() - ); - } - - //----------- rx side of life ---------------------------------- - for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){ - for (; chan < (m + 1)*get_rx_subdev_spec(m).size(); chan++){ - buff += str(boost::format( - " RX Channel: %u\n" - " RX DSP: %s\n" - " RX Dboard: %s\n" - " RX Subdev: %s\n" - ) % chan - % _rx_dsp(chan)[DSP_PROP_NAME].as<std::string>() - % _rx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>() - % _rx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>() - ); - } - } - - //----------- tx side of life ---------------------------------- - for (size_t m = 0, chan = 0; m < get_num_mboards(); m++){ - for (; chan < (m + 1)*get_tx_subdev_spec(m).size(); chan++){ - buff += str(boost::format( - " TX Channel: %u\n" - " TX DSP: %s\n" - " TX Dboard: %s\n" - " TX Subdev: %s\n" - ) % chan - % _tx_dsp(chan)[DSP_PROP_NAME].as<std::string>() - % _tx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>() - % _tx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>() - ); - } - } - - return buff; + return "TODO"; } std::string get_mboard_name(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_NAME].as<std::string>(); + return _tree->access<std::string>(mb_root(mboard) / "name").get(); } time_spec_t get_time_now(size_t mboard = 0){ - return _mboard(mboard)[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); + return _tree->access<time_spec_t>(mb_root(mboard) / "time/now").get(); } time_spec_t get_time_last_pps(size_t mboard = 0){ - return _mboard(mboard)[MBOARD_PROP_TIME_PPS].as<time_spec_t>(); + return _tree->access<time_spec_t>(mb_root(mboard) / "time/pps").get(); } void set_time_now(const time_spec_t &time_spec, size_t mboard){ if (mboard != ALL_MBOARDS){ - _mboard(mboard)[MBOARD_PROP_TIME_NOW] = time_spec; + _tree->access<time_spec_t>(mb_root(mboard) / "time/now").set(time_spec); return; } for (size_t m = 0; m < get_num_mboards(); m++){ @@ -183,7 +150,7 @@ public: void set_time_next_pps(const time_spec_t &time_spec){ for (size_t m = 0; m < get_num_mboards(); m++){ - _mboard(m)[MBOARD_PROP_TIME_PPS] = time_spec; + _tree->access<time_spec_t>(mb_root(m) / "time/pps").set(time_spec); } } @@ -208,8 +175,8 @@ public: //verify that the time registers are read to be within a few RTT for (size_t m = 1; m < get_num_mboards(); m++){ - time_spec_t time_0 = _mboard(0)[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); - time_spec_t time_i = _mboard(m)[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); + time_spec_t time_0 = this->get_time_now(0); + time_spec_t time_i = this->get_time_now(m); if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)){ //10 ms: greater than RTT but not too big UHD_MSG(warning) << boost::format( "Detected time deviation between board %d and board 0.\n" @@ -222,8 +189,8 @@ public: bool get_time_synchronized(void){ for (size_t m = 1; m < get_num_mboards(); m++){ - time_spec_t time_0 = _mboard(0)[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); - time_spec_t time_i = _mboard(m)[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); + time_spec_t time_0 = this->get_time_now(0); + time_spec_t time_i = this->get_time_now(m); if (time_i < time_0 or (time_i - time_0) > time_spec_t(0.01)) return false; } return true; @@ -231,7 +198,7 @@ public: void issue_stream_cmd(const stream_cmd_t &stream_cmd, size_t chan){ if (chan != ALL_CHANS){ - _rx_dsp(chan)[DSP_PROP_STREAM_CMD] = stream_cmd; + _tree->access<stream_cmd_t>(rx_dsp_root(chan) / "stream_cmd").set(stream_cmd); return; } for (size_t c = 0; c < get_rx_num_channels(); c++){ @@ -241,7 +208,26 @@ public: void set_clock_config(const clock_config_t &clock_config, size_t mboard){ if (mboard != ALL_MBOARDS){ - _mboard(mboard)[MBOARD_PROP_CLOCK_CONFIG] = clock_config; + //set the reference source... + std::string ref_source; + switch(clock_config.ref_source){ + case clock_config_t::REF_INT: ref_source = "internal"; break; + case clock_config_t::PPS_SMA: ref_source = "sma"; break; + case clock_config_t::PPS_MIMO: ref_source = "mimo"; break; + default: ref_source = "unknown"; + } + if (ref_source == "sma" and clock_config.pps_polarity == clock_config_t::PPS_NEG) ref_source = "_sma_"; + _tree->access<std::string>(mb_root(mboard) / "ref_source" / "value").set(ref_source); + + //set the time source + std::string time_source; + switch(clock_config.pps_source){ + case clock_config_t::PPS_INT: time_source = "internal"; break; + case clock_config_t::PPS_SMA: time_source = "sma"; break; + case clock_config_t::PPS_MIMO: time_source = "mimo"; break; + default: time_source = "unknown"; + } + _tree->access<std::string>(mb_root(mboard) / "time_source" / "value").set(time_source); return; } for (size_t m = 0; m < get_num_mboards(); m++){ @@ -250,19 +236,19 @@ public: } size_t get_num_mboards(void){ - return (*_dev)[DEVICE_PROP_MBOARD_NAMES].as<prop_names_t>().size(); + return _tree->list("/mboards").size(); } sensor_value_t get_mboard_sensor(const std::string &name, size_t mboard){ - return _mboard(mboard)[named_prop_t(MBOARD_PROP_SENSOR, name)].as<sensor_value_t>(); + return _tree->access<sensor_value_t>(mb_root(mboard) / "sensors" / name).get(); } std::vector<std::string> get_mboard_sensor_names(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_SENSOR_NAMES].as<prop_names_t>(); + return _tree->list(mb_root(mboard) / "sensors"); } - - mboard_iface::sptr get_mboard_iface(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_IFACE].as<mboard_iface::sptr>(); + + mboard_iface::sptr get_mboard_iface(size_t){ + return mboard_iface::sptr(); //not implemented } /******************************************************************* @@ -270,7 +256,7 @@ public: ******************************************************************/ void set_rx_subdev_spec(const subdev_spec_t &spec, size_t mboard){ if (mboard != ALL_MBOARDS){ - _mboard(mboard)[MBOARD_PROP_RX_SUBDEV_SPEC] = spec; + _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").set(spec); return; } for (size_t m = 0; m < get_num_mboards(); m++){ @@ -279,7 +265,7 @@ public: } subdev_spec_t get_rx_subdev_spec(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_RX_SUBDEV_SPEC].as<subdev_spec_t>(); + return _tree->access<subdev_spec_t>(mb_root(mboard) / "rx_subdev_spec").get(); } size_t get_rx_num_channels(void){ @@ -291,12 +277,12 @@ public: } std::string get_rx_subdev_name(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>(); + return _tree->access<std::string>(rx_rf_fe_root(chan) / "name").get(); } void set_rx_rate(double rate, size_t chan){ if (chan != ALL_CHANS){ - _rx_dsp(chan)[DSP_PROP_HOST_RATE] = rate; + _tree->access<double>(rx_dsp_root(chan) / "rate" / "value").set(rate); do_samp_rate_warning_message(rate, get_rx_rate(chan), "RX"); return; } @@ -306,69 +292,73 @@ public: } double get_rx_rate(size_t chan){ - return _rx_dsp(chan)[DSP_PROP_HOST_RATE].as<double>(); + return _tree->access<double>(rx_dsp_root(chan) / "rate" / "value").get(); } tune_result_t set_rx_freq(const tune_request_t &tune_request, size_t chan){ - tune_result_t r = tune_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan), tune_request); - do_tune_freq_warning_message(tune_request.target_freq, get_rx_freq(chan), "RX"); - return r; + //TODO must invent for tree + //tune_result_t r = tune_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan), tune_request); + //do_tune_freq_warning_message(tune_request.target_freq, get_rx_freq(chan), "RX"); + //return r; } double get_rx_freq(size_t chan){ - return derive_freq_from_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan)); + //TODO must invent for tree + //return derive_freq_from_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(chan)); } freq_range_t get_rx_freq_range(size_t chan){ - return add_dsp_shift(_rx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _rx_dsp(chan)); + meta_range_t range = _tree->access<meta_range_t>(rx_rf_fe_root(chan) / "freq" / "range").get(); + const double tick_rate = get_master_clock_rate(0); //ASSUME + return meta_range_t(range.start() - tick_rate/2.0, range.stop() + tick_rate/2.0); } void set_rx_gain(double gain, const std::string &name, size_t chan){ - return _rx_gain_group(chan)->set_value(gain, name); + return rx_gain_group(chan)->set_value(gain, name); } double get_rx_gain(const std::string &name, size_t chan){ - return _rx_gain_group(chan)->get_value(name); + return rx_gain_group(chan)->get_value(name); } gain_range_t get_rx_gain_range(const std::string &name, size_t chan){ - return _rx_gain_group(chan)->get_range(name); + return rx_gain_group(chan)->get_range(name); } std::vector<std::string> get_rx_gain_names(size_t chan){ - return _rx_gain_group(chan)->get_names(); + return rx_gain_group(chan)->get_names(); } void set_rx_antenna(const std::string &ant, size_t chan){ - _rx_subdev(chan)[SUBDEV_PROP_ANTENNA] = ant; + _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").set(ant); } std::string get_rx_antenna(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_ANTENNA].as<std::string>(); + return _tree->access<std::string>(rx_rf_fe_root(chan) / "antenna" / "value").get(); } std::vector<std::string> get_rx_antennas(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_ANTENNA_NAMES].as<prop_names_t>(); + return _tree->access<std::vector<std::string> >(rx_rf_fe_root(chan) / "antenna" / "options").get(); } void set_rx_bandwidth(double bandwidth, size_t chan){ - _rx_subdev(chan)[SUBDEV_PROP_BANDWIDTH] = bandwidth; + _tree->access<double>(rx_rf_fe_root(chan) / "bandwidth" / "value").set(bandwidth); } double get_rx_bandwidth(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_BANDWIDTH].as<double>(); + return _tree->access<double>(rx_rf_fe_root(chan) / "bandwidth" / "value").get(); } dboard_iface::sptr get_rx_dboard_iface(size_t chan){ - return _rx_dboard(chan)[DBOARD_PROP_DBOARD_IFACE].as<dboard_iface::sptr>(); + return _tree->access<dboard_iface::sptr>(rx_rf_fe_root(chan).branch_path().branch_path() / "iface").get(); } sensor_value_t get_rx_sensor(const std::string &name, size_t chan){ - return _rx_subdev(chan)[named_prop_t(SUBDEV_PROP_SENSOR, name)].as<sensor_value_t>(); + return _tree->access<sensor_value_t>(rx_rf_fe_root(chan) / "sensors" / name).get(); } std::vector<std::string> get_rx_sensor_names(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_SENSOR_NAMES].as<prop_names_t>(); + return _tree->list(rx_rf_fe_root(chan) / "sensors"); } /******************************************************************* @@ -376,7 +366,7 @@ public: ******************************************************************/ void set_tx_subdev_spec(const subdev_spec_t &spec, size_t mboard){ if (mboard != ALL_MBOARDS){ - _mboard(mboard)[MBOARD_PROP_TX_SUBDEV_SPEC] = spec; + _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").set(spec); return; } for (size_t m = 0; m < get_num_mboards(); m++){ @@ -385,11 +375,11 @@ public: } subdev_spec_t get_tx_subdev_spec(size_t mboard){ - return _mboard(mboard)[MBOARD_PROP_TX_SUBDEV_SPEC].as<subdev_spec_t>(); + return _tree->access<subdev_spec_t>(mb_root(mboard) / "tx_subdev_spec").get(); } std::string get_tx_subdev_name(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>(); + return _tree->access<std::string>(tx_rf_fe_root(chan) / "name").get(); } size_t get_tx_num_channels(void){ @@ -402,7 +392,7 @@ public: void set_tx_rate(double rate, size_t chan){ if (chan != ALL_CHANS){ - _tx_dsp(chan)[DSP_PROP_HOST_RATE] = rate; + _tree->access<double>(tx_dsp_root(chan) / "rate" / "value").set(rate); do_samp_rate_warning_message(rate, get_tx_rate(chan), "TX"); return; } @@ -412,73 +402,78 @@ public: } double get_tx_rate(size_t chan){ - return _tx_dsp(chan)[DSP_PROP_HOST_RATE].as<double>(); + return _tree->access<double>(tx_dsp_root(chan) / "rate" / "value").get(); } tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t chan){ - tune_result_t r = tune_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan), tune_request); - do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "TX"); - return r; + //TODO must invent for tree + //tune_result_t r = tune_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan), tune_request); + //do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "TX"); + //return r; } double get_tx_freq(size_t chan){ - return derive_freq_from_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan)); + //TODO must invent for tree + //return derive_freq_from_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(chan)); } freq_range_t get_tx_freq_range(size_t chan){ - return add_dsp_shift(_tx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _tx_dsp(chan)); + meta_range_t range = _tree->access<meta_range_t>(tx_rf_fe_root(chan) / "freq" / "range").get(); + const double tick_rate = get_master_clock_rate(0); //ASSUME + return meta_range_t(range.start() - tick_rate/2.0, range.stop() + tick_rate/2.0); } void set_tx_gain(double gain, const std::string &name, size_t chan){ - return _tx_gain_group(chan)->set_value(gain, name); + return tx_gain_group(chan)->set_value(gain, name); } double get_tx_gain(const std::string &name, size_t chan){ - return _tx_gain_group(chan)->get_value(name); + return tx_gain_group(chan)->get_value(name); } gain_range_t get_tx_gain_range(const std::string &name, size_t chan){ - return _tx_gain_group(chan)->get_range(name); + return tx_gain_group(chan)->get_range(name); } std::vector<std::string> get_tx_gain_names(size_t chan){ - return _tx_gain_group(chan)->get_names(); + return tx_gain_group(chan)->get_names(); } void set_tx_antenna(const std::string &ant, size_t chan){ - _tx_subdev(chan)[SUBDEV_PROP_ANTENNA] = ant; + _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").set(ant); } std::string get_tx_antenna(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_ANTENNA].as<std::string>(); + return _tree->access<std::string>(tx_rf_fe_root(chan) / "antenna" / "value").get(); } std::vector<std::string> get_tx_antennas(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_ANTENNA_NAMES].as<prop_names_t>(); + return _tree->access<std::vector<std::string> >(tx_rf_fe_root(chan) / "antenna" / "options").get(); } void set_tx_bandwidth(double bandwidth, size_t chan){ - _tx_subdev(chan)[SUBDEV_PROP_BANDWIDTH] = bandwidth; + _tree->access<double>(tx_rf_fe_root(chan) / "bandwidth" / "value").set(bandwidth); } double get_tx_bandwidth(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_BANDWIDTH].as<double>(); + return _tree->access<double>(tx_rf_fe_root(chan) / "bandwidth" / "value").get(); } dboard_iface::sptr get_tx_dboard_iface(size_t chan){ - return _tx_dboard(chan)[DBOARD_PROP_DBOARD_IFACE].as<dboard_iface::sptr>(); + return _tree->access<dboard_iface::sptr>(tx_rf_fe_root(chan).branch_path().branch_path() / "iface").get(); } sensor_value_t get_tx_sensor(const std::string &name, size_t chan){ - return _tx_subdev(chan)[named_prop_t(SUBDEV_PROP_SENSOR, name)].as<sensor_value_t>(); + return _tree->access<sensor_value_t>(tx_rf_fe_root(chan) / "sensors" / name).get(); } std::vector<std::string> get_tx_sensor_names(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_SENSOR_NAMES].as<prop_names_t>(); + return _tree->list(tx_rf_fe_root(chan) / "sensors"); } private: device::sptr _dev; + property_tree::sptr _tree; struct mboard_chan_pair{ size_t mboard, chan; @@ -507,49 +502,59 @@ private: return mcp; } - wax::obj _mboard(size_t mboard){ - std::string mb_name = (*_dev)[DEVICE_PROP_MBOARD_NAMES].as<prop_names_t>().at(mboard); - return (*_dev)[named_prop_t(DEVICE_PROP_MBOARD, mb_name)]; + property_tree::path_type mb_root(const size_t mboard){ + const std::string name = _tree->list("/mboards").at(mboard); + return "/mboards/" + name; } - wax::obj _rx_dsp(size_t chan){ - mboard_chan_pair mcp = rx_chan_to_mcp(chan); - prop_names_t dsp_names = _mboard(mcp.mboard)[MBOARD_PROP_RX_DSP_NAMES].as<prop_names_t>(); - return _mboard(mcp.mboard)[named_prop_t(MBOARD_PROP_RX_DSP, dsp_names.at(mcp.chan))]; - } - wax::obj _tx_dsp(size_t chan){ - mboard_chan_pair mcp = tx_chan_to_mcp(chan); - prop_names_t dsp_names = _mboard(mcp.mboard)[MBOARD_PROP_TX_DSP_NAMES].as<prop_names_t>(); - return _mboard(mcp.mboard)[named_prop_t(MBOARD_PROP_TX_DSP, dsp_names.at(mcp.chan))]; - } - wax::obj _rx_dboard(size_t chan){ + + property_tree::path_type rx_dsp_root(const size_t chan){ mboard_chan_pair mcp = rx_chan_to_mcp(chan); - std::string db_name = get_rx_subdev_spec(mcp.mboard).at(mcp.chan).db_name; - return _mboard(mcp.mboard)[named_prop_t(MBOARD_PROP_RX_DBOARD, db_name)]; + const std::string name = _tree->list(mb_root(mcp.mboard) / "rx_dsps").at(mcp.chan); + return mb_root(mcp.mboard) / "rx_dsps" / name; } - wax::obj _tx_dboard(size_t chan){ + + property_tree::path_type tx_dsp_root(const size_t chan){ mboard_chan_pair mcp = tx_chan_to_mcp(chan); - std::string db_name = get_tx_subdev_spec(mcp.mboard).at(mcp.chan).db_name; - return _mboard(mcp.mboard)[named_prop_t(MBOARD_PROP_TX_DBOARD, db_name)]; + const std::string name = _tree->list(mb_root(mcp.mboard) / "tx_dsps").at(mcp.chan); + return mb_root(mcp.mboard) / "tx_dsps" / name; } - wax::obj _rx_subdev(size_t chan){ + + property_tree::path_type rx_rf_fe_root(const size_t chan){ mboard_chan_pair mcp = rx_chan_to_mcp(chan); - std::string sd_name = get_rx_subdev_spec(mcp.mboard).at(mcp.chan).sd_name; - return _rx_dboard(chan)[named_prop_t(DBOARD_PROP_SUBDEV, sd_name)]; + const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan); + return mb_root(mcp.mboard) / "dboards" / spec.db_name / "rx_frontends" / spec.sd_name; } - wax::obj _tx_subdev(size_t chan){ + + property_tree::path_type tx_rf_fe_root(const size_t chan){ mboard_chan_pair mcp = tx_chan_to_mcp(chan); - std::string sd_name = get_tx_subdev_spec(mcp.mboard).at(mcp.chan).sd_name; - return _tx_dboard(chan)[named_prop_t(DBOARD_PROP_SUBDEV, sd_name)]; + const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan); + return mb_root(mcp.mboard) / "dboards" / spec.db_name / "tx_frontends" / spec.sd_name; } - gain_group::sptr _rx_gain_group(size_t chan){ + + gain_group::sptr rx_gain_group(size_t chan){ mboard_chan_pair mcp = rx_chan_to_mcp(chan); - std::string sd_name = get_rx_subdev_spec(mcp.mboard).at(mcp.chan).sd_name; - return _rx_dboard(chan)[named_prop_t(DBOARD_PROP_GAIN_GROUP, sd_name)].as<gain_group::sptr>(); + const subdev_spec_pair_t spec = get_rx_subdev_spec(mcp.mboard).at(mcp.chan); + gain_group::sptr gg = gain_group::make(); + BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains")){ + gg->register_fcns("ADC-"+name, make_gain_fcns_from_path(_tree, mb_root(mcp.mboard) / "rx_codecs" / spec.db_name / "gains" / name), 0 /* low prio */); + } + BOOST_FOREACH(const std::string &name, _tree->list(rx_rf_fe_root(chan) / "gains")){ + gg->register_fcns(name, make_gain_fcns_from_path(_tree, rx_rf_fe_root(chan) / "gains" / name), 1 /* high prio */); + } + return gg; } - gain_group::sptr _tx_gain_group(size_t chan){ + + gain_group::sptr tx_gain_group(size_t chan){ mboard_chan_pair mcp = tx_chan_to_mcp(chan); - std::string sd_name = get_tx_subdev_spec(mcp.mboard).at(mcp.chan).sd_name; - return _tx_dboard(chan)[named_prop_t(DBOARD_PROP_GAIN_GROUP, sd_name)].as<gain_group::sptr>(); + const subdev_spec_pair_t spec = get_tx_subdev_spec(mcp.mboard).at(mcp.chan); + gain_group::sptr gg = gain_group::make(); + BOOST_FOREACH(const std::string &name, _tree->list(mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains")){ + gg->register_fcns("ADC-"+name, make_gain_fcns_from_path(_tree, mb_root(mcp.mboard) / "tx_codecs" / spec.db_name / "gains" / name), 1 /* high prio */); + } + BOOST_FOREACH(const std::string &name, _tree->list(tx_rf_fe_root(chan) / "gains")){ + gg->register_fcns(name, make_gain_fcns_from_path(_tree, tx_rf_fe_root(chan) / "gains" / name), 0 /* low prio */); + } + return gg; } }; diff --git a/host/lib/usrp2/io_impl.cpp b/host/lib/usrp2/io_impl.cpp index fde02577c..a8ca0cd3a 100644 --- a/host/lib/usrp2/io_impl.cpp +++ b/host/lib/usrp2/io_impl.cpp @@ -302,18 +302,12 @@ void usrp2_impl::update_tx_samp_rate(const double rate){ _io_impl->send_handler.set_samp_rate(rate); } -void usrp2_impl::update_rx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec_){ +void usrp2_impl::update_rx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec){ boost::mutex::scoped_lock recv_lock = _io_impl->recv_handler.get_scoped_lock(); property_tree::path_type root = "/mboards/" + which_mb + "/dboards"; //sanity checking - subdev_spec_t spec(spec_); - if (spec.size() == 0){ - //determine the first subdev spec that exists - const std::string db_name = _tree->list(root).at(0); - const std::string sd_name = _tree->list(root / db_name / "rx_frontends").at(0); - spec.push_back(subdev_spec_pair_t(db_name, sd_name)); - } + if (spec.size() == 0) throw uhd::value_error("rx subdev spec cant be empty"); if (spec.size() > _mbc[which_mb].rx_dsps.size()) throw uhd::value_error("rx subdev spec too long"); //setup mux for this spec @@ -341,18 +335,11 @@ void usrp2_impl::update_rx_subdev_spec(const std::string &which_mb, const subdev } } -void usrp2_impl::update_tx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec_){ +void usrp2_impl::update_tx_subdev_spec(const std::string &which_mb, const subdev_spec_t &spec){ boost::mutex::scoped_lock send_lock = _io_impl->send_handler.get_scoped_lock(); property_tree::path_type root = "/mboards/" + which_mb + "/dboards"; //sanity checking - subdev_spec_t spec(spec_); - if (spec.size() == 0){ - //determine the first subdev spec that exists - const std::string db_name = _tree->list(root).at(0); - const std::string sd_name = _tree->list(root / db_name / "tx_frontends").at(0); - spec.push_back(subdev_spec_pair_t(db_name, sd_name)); - } if (spec.size() != 1) throw uhd::value_error("tx subdev spec has to be size 1"); //set the mux for this spec diff --git a/host/lib/usrp2/usrp2_impl.cpp b/host/lib/usrp2/usrp2_impl.cpp index 829becd19..50d1eb2e2 100644 --- a/host/lib/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp2/usrp2_impl.cpp @@ -544,8 +544,8 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ BOOST_FOREACH(const std::string &mb, _mbc.keys()){ property_tree::path_type root = "/mboards/" + mb; _tree->access<double>(root / "tick_rate").update(); - _tree->access<subdev_spec_t>(root / "rx_subdev_spec").set(subdev_spec_t()); - _tree->access<subdev_spec_t>(root / "tx_subdev_spec").set(subdev_spec_t()); + _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<std::string>(root / "ref_source/value").set("internal"); _tree->access<std::string>(root / "time_source/value").set("none"); diff --git a/host/utils/uhd_usrp_probe.cpp b/host/utils/uhd_usrp_probe.cpp index 0605aa621..e90f82ee8 100644 --- a/host/utils/uhd_usrp_probe.cpp +++ b/host/utils/uhd_usrp_probe.cpp @@ -74,6 +74,7 @@ static std::string get_subdev_pp_string(const std::string &type, property_tree:: ss << boost::format("Name: %s") % (tree->access<std::string>(path / "name").get()) << std::endl; ss << boost::format("Antennas: %s") % prop_names_to_pp_string(tree->access<std::vector<std::string> >(path / "antenna/options").get()) << std::endl; + ss << boost::format("Sensors: %s") % prop_names_to_pp_string(tree->list(path / "sensors")) << std::endl; meta_range_t freq_range = tree->access<meta_range_t>(path / "freq/range").get(); ss << boost::format("Freq range: %.3f to %.3f Mhz") % (freq_range.start()/1e6) % (freq_range.stop()/1e6) << std::endl; @@ -134,6 +135,10 @@ static std::string get_mboard_pp_string(property_tree::sptr tree, const property BOOST_FOREACH(const std::string &key, mb_eeprom.keys()){ if (not mb_eeprom[key].empty()) ss << boost::format("%s: %s") % key % mb_eeprom[key] << std::endl; } + ss << std::endl; + ss << "Time sources: " << prop_names_to_pp_string(tree->access<std::vector<std::string> >(path / "time_source" / "options").get()) << std::endl; + ss << "Ref sources: " << prop_names_to_pp_string(tree->access<std::vector<std::string> >(path / "ref_source" / "options").get()) << std::endl; + ss << "Sensors: " << prop_names_to_pp_string(tree->list(path / "sensors")) << std::endl; BOOST_FOREACH(const std::string &name, tree->list(path / "rx_dsps")){ ss << make_border(get_dsp_pp_string("RX", tree, path / "rx_dsps" / name)); } |