From 35a0bce9f01e354c527806b4c8f6f2ef493db2f6 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 29 Jun 2011 12:20:19 -0700 Subject: uhd: make sure things are initialized --- host/include/uhd/property_tree.ipp | 4 ++++ host/include/uhd/utils/msg.hpp | 3 +++ host/lib/usrp/dboard_manager.cpp | 32 ++++++++++++++++++++++++-------- host/lib/usrp/multi_usrp.cpp | 2 +- host/lib/usrp2/usrp2_impl.cpp | 13 +++++++++++-- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/host/include/uhd/property_tree.ipp b/host/include/uhd/property_tree.ipp index 5fbb2dda5..58ee2339c 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 #include #include @@ -58,6 +59,9 @@ public: } T get(void) const{ + if (_publisher.empty() and _value.get() == NULL) throw uhd::runtime_error( + "Called get() on property with an uninitialized value" + ); return _publisher.empty()? *_value : _publisher(); } diff --git a/host/include/uhd/utils/msg.hpp b/host/include/uhd/utils/msg.hpp index 71d2cb35e..b0f00e13d 100644 --- a/host/include/uhd/utils/msg.hpp +++ b/host/include/uhd/utils/msg.hpp @@ -30,6 +30,9 @@ #define UHD_MSG(type) \ uhd::msg::_msg(uhd::msg::type)() +//! Helpful debug tool to print site info +#define UHD_HERE() \ + UHD_MSG(status) << __FILE__ << ":" << __LINE__ << std::endl namespace uhd{ namespace msg{ diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index d5e7d5b8a..5fa10f215 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -415,8 +415,11 @@ static sensor_value_t get_sensor(wax::obj subdev, const std::string &name){ return subdev[named_prop_t(SUBDEV_PROP_SENSOR, name)].as(); } -static double get_set_gain(wax::obj subdev, const std::string &name, const double gain){ +static void set_gain(wax::obj subdev, const std::string &name, const double gain){ subdev[named_prop_t(SUBDEV_PROP_GAIN, name)] = gain; +} + +static double get_gain(wax::obj subdev, const std::string &name){ return subdev[named_prop_t(SUBDEV_PROP_GAIN, name)].as(); } @@ -424,8 +427,11 @@ static meta_range_t get_gain_range(wax::obj subdev, const std::string &name){ return subdev[named_prop_t(SUBDEV_PROP_GAIN_RANGE, name)].as(); } -static double get_set_freq(wax::obj subdev, const double freq){ +static void set_freq(wax::obj subdev, const double freq){ subdev[SUBDEV_PROP_FREQ] = freq; +} + +static double get_freq(wax::obj subdev){ return subdev[SUBDEV_PROP_FREQ].as(); } @@ -433,8 +439,11 @@ static meta_range_t get_freq_range(wax::obj subdev){ return subdev[SUBDEV_PROP_FREQ_RANGE].as(); } -static std::string get_set_ant(wax::obj subdev, const std::string &ant){ +static void set_ant(wax::obj subdev, const std::string &ant){ subdev[SUBDEV_PROP_ANTENNA] = ant; +} + +static std::string get_ant(wax::obj subdev){ return subdev[SUBDEV_PROP_ANTENNA].as(); } @@ -461,8 +470,11 @@ static bool get_set_enb(wax::obj subdev, const bool enb){ return subdev[SUBDEV_PROP_ENABLED].as(); } -static double get_set_bw(wax::obj subdev, const double freq){ +static void set_bw(wax::obj subdev, const double freq){ subdev[SUBDEV_PROP_BANDWIDTH] = freq; +} + +static double get_bw(wax::obj subdev){ return subdev[SUBDEV_PROP_BANDWIDTH].as(); } @@ -483,19 +495,22 @@ void dboard_manager::populate_prop_tree_from_subdev( tree->create(root / "gains"); //phony property so this dir exists BOOST_FOREACH(const std::string &name, gain_names){ tree->create(root / "gains" / name / "value") - .coerce(boost::bind(&get_set_gain, subdev, name, _1)); + .publish(boost::bind(&get_gain, subdev, name)) + .subscribe(boost::bind(&set_gain, subdev, name, _1)); tree->create(root / "gains" / name / "range") .publish(boost::bind(&get_gain_range, subdev, name)); } tree->create(root / "freq/value") - .coerce(boost::bind(&get_set_freq, subdev, _1)); + .publish(boost::bind(&get_freq, subdev)) + .subscribe(boost::bind(&set_freq, subdev, _1)); tree->create(root / "freq/range") .publish(boost::bind(&get_freq_range, subdev)); tree->create(root / "antenna/value") - .coerce(boost::bind(&get_set_ant, subdev, _1)); + .publish(boost::bind(&get_ant, subdev)) + .subscribe(boost::bind(&set_ant, subdev, _1)); tree->create >(root / "antenna/options") .publish(boost::bind(&get_ants, subdev)); @@ -510,5 +525,6 @@ void dboard_manager::populate_prop_tree_from_subdev( .publish(boost::bind(&get_use_lo_off, subdev)); tree->create(root / "bandwidth/value") - .coerce(boost::bind(&get_set_bw, subdev, _1)); + .publish(boost::bind(&get_bw, subdev)) + .subscribe(boost::bind(&set_bw, subdev, _1)); } diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index c3926b6c4..e60a706ad 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -544,7 +544,7 @@ public: tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t chan){ tune_result_t r = tune_xx_subdev_and_dsp(TX_SIGN, _tree, tx_dsp_root(chan), tx_rf_fe_root(chan), tune_request); - do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "RX"); + do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "TX"); return r; } diff --git a/host/lib/usrp2/usrp2_impl.cpp b/host/lib/usrp2/usrp2_impl.cpp index 4c0eed7cc..e00924ebd 100644 --- a/host/lib/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp2/usrp2_impl.cpp @@ -361,10 +361,10 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ _tree->create(rx_codec_path / "name").set("ads62p44"); _tree->create(rx_codec_path / "gains/digital/range").set(meta_range_t(0, 6.0, 0.5)); _tree->create(rx_codec_path / "gains/digital/value") - .subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_gain, _mbc[mb].codec, _1)); + .subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_gain, _mbc[mb].codec, _1)).set(0); _tree->create(rx_codec_path / "gains/fine/range").set(meta_range_t(0, 0.5, 0.05)); _tree->create(rx_codec_path / "gains/fine/value") - .subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_fine_gain, _mbc[mb].codec, _1)); + .subscribe(boost::bind(&usrp2_codec_ctrl::set_rx_digital_fine_gain, _mbc[mb].codec, _1)).set(0); }break; case usrp2_iface::USRP2_REV3: @@ -548,6 +548,15 @@ 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(root / "tick_rate").update(); + + //and now that the tick rate is set, init the host rates to something + BOOST_FOREACH(const std::string &name, _tree->list(root / "rx_dsps")){ + _tree->access(root / "rx_dsps" / name / "rate" / "value").set(1e6); + } + BOOST_FOREACH(const std::string &name, _tree->list(root / "tx_dsps")){ + _tree->access(root / "tx_dsps" / name / "rate" / "value").set(1e6); + } + _tree->access(root / "rx_subdev_spec").set(subdev_spec_t("A:"+_mbc[mb].dboard_manager->get_rx_subdev_names()[0])); _tree->access(root / "tx_subdev_spec").set(subdev_spec_t("A:"+_mbc[mb].dboard_manager->get_tx_subdev_names()[0])); _tree->access(root / "ref_source/value").set("internal"); -- cgit v1.2.3