diff options
-rw-r--r-- | host/include/uhd/property_tree.hpp | 37 | ||||
-rw-r--r-- | host/include/uhd/property_tree.ipp | 8 | ||||
-rw-r--r-- | host/lib/usrp/dboard_manager.cpp | 10 | ||||
-rw-r--r-- | host/lib/usrp2/usrp2_impl.cpp | 8 | ||||
-rw-r--r-- | host/tests/property_test.cpp | 2 |
5 files changed, 41 insertions, 24 deletions
diff --git a/host/include/uhd/property_tree.hpp b/host/include/uhd/property_tree.hpp index 63cd76a56..b20f3b779 100644 --- a/host/include/uhd/property_tree.hpp +++ b/host/include/uhd/property_tree.hpp @@ -35,15 +35,17 @@ template <typename T> class UHD_API property : boost::noncopyable{ public: typedef boost::function<void(const T &)> subscriber_type; typedef boost::function<T(void)> publisher_type; - typedef boost::function<T(const T &)> master_type; + typedef boost::function<T(const T &)> coercer_type; /*! - * Register a master subscriber into the property. - * A master is a special subscriber that coerces the value. - * Only one master may be registered per property. - * Registering a master replaces the previous master. + * Register a coercer into the property. + * A coercer is a special subscribes that coerces the value. + * Only one coercer may be registered per property. + * Registering a coercer replaces the previous coercer. + * \param coercer the coercer callback function + * \return a reference to this property for chaining */ - virtual property<T> &subscribe_master(const master_type &master) = 0; + virtual property<T> &coerce(const coercer_type &coercer) = 0; /*! * Register a publisher into the property. @@ -51,6 +53,8 @@ public: * Publishers are useful for creating read-only properties. * Only one publisher may be registered per property. * Registering a publisher replaces the previous publisher. + * \param publisher the publisher callback function + * \return a reference to this property for chaining */ virtual property<T> &publish(const publisher_type &publisher) = 0; @@ -58,19 +62,32 @@ public: * Register a subscriber into the property. * All subscribers are called when the value changes. * Once a subscriber is registered, it cannot be unregistered. + * \param subscriber the subscriber callback function + * \return a reference to this property for chaining */ virtual property<T> &subscribe(const subscriber_type &subscriber) = 0; - //! Update calls all subscribers w/ the current value + /*! + * Update calls all subscribers w/ the current value. + * \return a reference to this property for chaining + */ virtual property<T> &update(void) = 0; /*! * Set the new value and call all subscribers. - * The master is called first to coerce the value. + * The coercer (when provided) is called initially, + * and the coerced value is used to set the subscribers. + * \param value the new value to set on this property + * \return a reference to this property for chaining */ virtual property<T> &set(const T &value) = 0; - //! Get the current value of this property + /*! + * Get the current value of this property. + * The publisher (when provided) yields the value, + * otherwise an internal shadow is used for the value. + * \return the current value in the property + */ virtual T get(void) const = 0; }; @@ -100,7 +117,7 @@ public: //! Get access to a property in the tree template <typename T> property<T> &access(const path_type &path); -protected: +private: //! Internal create property with wild-card type virtual void _create(const path_type &path, const boost::shared_ptr<void> &prop) = 0; diff --git a/host/include/uhd/property_tree.ipp b/host/include/uhd/property_tree.ipp index 3dba6fb28..5fbb2dda5 100644 --- a/host/include/uhd/property_tree.ipp +++ b/host/include/uhd/property_tree.ipp @@ -29,8 +29,8 @@ namespace uhd{ namespace /*anon*/{ template <typename T> class UHD_API property_impl : public property<T>{ public: - property<T> &subscribe_master(const typename property<T>::master_type &master){ - _master = master; + property<T> &coerce(const typename property<T>::coercer_type &coercer){ + _coercer = coercer; return *this; } @@ -50,7 +50,7 @@ public: } property<T> &set(const T &value){ - _value = boost::shared_ptr<T>(new T(_master.empty()? value : _master(value))); + _value = boost::shared_ptr<T>(new T(_coercer.empty()? value : _coercer(value))); BOOST_FOREACH(typename property<T>::subscriber_type &subscriber, _subscribers){ subscriber(*_value); //let errors propagate } @@ -64,7 +64,7 @@ public: private: std::vector<typename property<T>::subscriber_type> _subscribers; typename property<T>::publisher_type _publisher; - typename property<T>::master_type _master; + typename property<T>::coercer_type _coercer; boost::shared_ptr<T> _value; }; diff --git a/host/lib/usrp/dboard_manager.cpp b/host/lib/usrp/dboard_manager.cpp index b1c10e1c1..d5e7d5b8a 100644 --- a/host/lib/usrp/dboard_manager.cpp +++ b/host/lib/usrp/dboard_manager.cpp @@ -483,19 +483,19 @@ void dboard_manager::populate_prop_tree_from_subdev( tree->create<int>(root / "gains"); //phony property so this dir exists BOOST_FOREACH(const std::string &name, gain_names){ tree->create<double>(root / "gains" / name / "value") - .subscribe_master(boost::bind(&get_set_gain, subdev, name, _1)); + .coerce(boost::bind(&get_set_gain, subdev, name, _1)); tree->create<meta_range_t>(root / "gains" / name / "range") .publish(boost::bind(&get_gain_range, subdev, name)); } tree->create<double>(root / "freq/value") - .subscribe_master(boost::bind(&get_set_freq, subdev, _1)); + .coerce(boost::bind(&get_set_freq, subdev, _1)); tree->create<meta_range_t>(root / "freq/range") .publish(boost::bind(&get_freq_range, subdev)); tree->create<std::string>(root / "antenna/value") - .subscribe_master(boost::bind(&get_set_ant, subdev, _1)); + .coerce(boost::bind(&get_set_ant, subdev, _1)); tree->create<std::vector<std::string> >(root / "antenna/options") .publish(boost::bind(&get_ants, subdev)); @@ -504,11 +504,11 @@ void dboard_manager::populate_prop_tree_from_subdev( .publish(boost::bind(&get_conn, subdev)); tree->create<bool>(root / "enabled") - .subscribe_master(boost::bind(&get_set_enb, subdev, _1)); + .coerce(boost::bind(&get_set_enb, subdev, _1)); tree->create<bool>(root / "use_lo_offset") .publish(boost::bind(&get_use_lo_off, subdev)); tree->create<double>(root / "bandwidth/value") - .subscribe_master(boost::bind(&get_set_bw, subdev, _1)); + .coerce(boost::bind(&get_set_bw, subdev, _1)); } diff --git a/host/lib/usrp2/usrp2_impl.cpp b/host/lib/usrp2/usrp2_impl.cpp index e65461103..4c0eed7cc 100644 --- a/host/lib/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp2/usrp2_impl.cpp @@ -433,10 +433,10 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ _mbc[mb].dsp_xports[dspno]->get_recv_buff(0.01).get(); //recv with timeout for expected property_tree::path_type rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno); _tree->create<double>(rx_dsp_path / "rate/value") - .subscribe_master(boost::bind(&rx_dsp_core_200::set_host_rate, _mbc[mb].rx_dsps[dspno], _1)) + .coerce(boost::bind(&rx_dsp_core_200::set_host_rate, _mbc[mb].rx_dsps[dspno], _1)) .subscribe(boost::bind(&usrp2_impl::update_rx_samp_rate, this, _1)); _tree->create<double>(rx_dsp_path / "freq/value") - .subscribe_master(boost::bind(&rx_dsp_core_200::set_freq, _mbc[mb].rx_dsps[dspno], _1)); + .coerce(boost::bind(&rx_dsp_core_200::set_freq, _mbc[mb].rx_dsps[dspno], _1)); _tree->create<meta_range_t>(rx_dsp_path / "freq/range") .publish(boost::bind(&rx_dsp_core_200::get_freq_range, _mbc[mb].rx_dsps[dspno])); _tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd") @@ -452,10 +452,10 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ _tree->access<double>(mb_path / "tick_rate") .subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _mbc[mb].tx_dsp, _1)); _tree->create<double>(mb_path / "tx_dsps/0/rate/value") - .subscribe_master(boost::bind(&tx_dsp_core_200::set_host_rate, _mbc[mb].tx_dsp, _1)) + .coerce(boost::bind(&tx_dsp_core_200::set_host_rate, _mbc[mb].tx_dsp, _1)) .subscribe(boost::bind(&usrp2_impl::update_tx_samp_rate, this, _1)); _tree->create<double>(mb_path / "tx_dsps/0/freq/value") - .subscribe_master(boost::bind(&usrp2_impl::set_tx_dsp_freq, this, mb, _1)); + .coerce(boost::bind(&usrp2_impl::set_tx_dsp_freq, this, mb, _1)); _tree->create<meta_range_t>(mb_path / "tx_dsps/0/freq/range") .publish(boost::bind(&usrp2_impl::get_tx_dsp_freq_range, this, mb)); diff --git a/host/tests/property_test.cpp b/host/tests/property_test.cpp index cd9691dca..20f6b6924 100644 --- a/host/tests/property_test.cpp +++ b/host/tests/property_test.cpp @@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE(test_prop_with_coercion){ prop.subscribe(boost::bind(&setter_type::doit, &setter, _1)); coercer_type coercer; - prop.subscribe_master(boost::bind(&coercer_type::doit, &coercer, _1)); + prop.coerce(boost::bind(&coercer_type::doit, &coercer, _1)); prop.set(42); BOOST_CHECK_EQUAL(prop.get(), 40); |