diff options
author | Martin Braun <martin.braun@ettus.com> | 2019-05-30 13:54:44 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2019-11-26 11:49:14 -0800 |
commit | ad4004f1f78d5b64dae50b6e456d0206e824978f (patch) | |
tree | df701340ac1d493ee5b7de72985ea1c5f3571ee2 | |
parent | b8a6c64d6012ab1ec0b3b843fccec2d990d440a3 (diff) | |
download | uhd-ad4004f1f78d5b64dae50b6e456d0206e824978f.tar.gz uhd-ad4004f1f78d5b64dae50b6e456d0206e824978f.tar.bz2 uhd-ad4004f1f78d5b64dae50b6e456d0206e824978f.zip |
rfnoc: node: Add default command time API
-rw-r--r-- | host/include/uhd/rfnoc/node.hpp | 42 | ||||
-rw-r--r-- | host/lib/rfnoc/node.cpp | 23 |
2 files changed, 65 insertions, 0 deletions
diff --git a/host/include/uhd/rfnoc/node.hpp b/host/include/uhd/rfnoc/node.hpp index 54c66c985..ffbfc3319 100644 --- a/host/include/uhd/rfnoc/node.hpp +++ b/host/include/uhd/rfnoc/node.hpp @@ -12,6 +12,7 @@ #include <uhd/rfnoc/property.hpp> #include <uhd/utils/log.hpp> #include <uhd/utils/scope_exit.hpp> +#include <uhd/types/time_spec.hpp> #include <unordered_map> #include <unordered_set> #include <boost/graph/adjacency_list.hpp> @@ -55,9 +56,15 @@ public: DROP }; + static const size_t ANY_PORT = size_t(~0); + /************************************************************************** + * Structors + *************************************************************************/ node_t(); + virtual ~node_t() {} + /****************************************** * Basic Operations ******************************************/ @@ -137,6 +144,36 @@ public: const prop_data_t& get_property( const std::string& id, const size_t instance = 0) /* mutable */; + /*! Standard API for setting the command time + * + * There are instances where commands need a time associated with them. + * For example, a block could have a 'freq' user property, which should be + * changed at a certain time. In that case, the block would have to be + * written to handle command times. + * + * The reason there is no 'time' parameter in set_property() or other API + * calls is because there is no uniform definition of what the time means; + * it can change from block to block. The transformation of \p time to a + * tick count, for example, is non-standard. + * + * The default implementation will simply stash away the time; it can be + * retrieved by calling get_command_time(); + */ + virtual void set_command_time(uhd::time_spec_t time, const size_t instance); + + /*! Return a previously set command time + * + * When no time was set, this will return uhd::time_spec_t::ASAP + */ + virtual uhd::time_spec_t get_command_time(const size_t instance) const; + + /*! Standard API for resetting the command time + * + * This will clear the time previously set by set_command_time(). It + * defaults to calling set_command_time(time_spec_t(0.0), instance) + */ + virtual void clear_command_time(const size_t instance); + protected: /****************************************** * Internal Registration Functions @@ -488,6 +525,11 @@ private: // The default callback will simply drop actions action_handler_t _post_action_cb = [](const res_source_info&, action_info::sptr) { /* nop */ }; + + /************************************************************************** + * Other attributes + *************************************************************************/ + std::vector<uhd::time_spec_t> _cmd_timespecs; }; // class node_t }} /* namespace uhd::rfnoc */ diff --git a/host/lib/rfnoc/node.cpp b/host/lib/rfnoc/node.cpp index d569cea4a..cc2d7b7a9 100644 --- a/host/lib/rfnoc/node.cpp +++ b/host/lib/rfnoc/node.cpp @@ -45,6 +45,29 @@ std::vector<std::string> node_t::get_property_ids() const return return_value; } +void node_t::set_command_time(uhd::time_spec_t time, const size_t instance) +{ + if (_cmd_timespecs.size() <= instance) { + _cmd_timespecs.resize(instance + 1, uhd::time_spec_t(0.0)); + } + + _cmd_timespecs[instance] = time; +} + +uhd::time_spec_t node_t::get_command_time(const size_t instance) const +{ + if (instance >= _cmd_timespecs.size()) { + return uhd::time_spec_t::ASAP; + } + + return _cmd_timespecs.at(instance); +} + +void node_t::clear_command_time(const size_t instance) +{ + set_command_time(uhd::time_spec_t(0.0), instance); +} + /*** Protected methods *******************************************************/ void node_t::register_property(property_base_t* prop, resolve_callback_t&& clean_callback) { |