aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp')
-rw-r--r--host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp b/host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp
new file mode 100644
index 000000000..1f67d05a1
--- /dev/null
+++ b/host/lib/include/uhdlib/rfnoc/async_msg_handler.hpp
@@ -0,0 +1,86 @@
+//
+// Copyright 2016 Ettus Research LLC
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#ifndef INCLUDED_LIBUHD_RFNOC_AYNC_MSG_HANDLER_HPP
+#define INCLUDED_LIBUHD_RFNOC_AYNC_MSG_HANDLER_HPP
+
+#include <uhd/rfnoc/graph.hpp>
+#include <uhd/transport/zero_copy.hpp>
+#include <uhd/types/sid.hpp>
+#include <uhd/types/endianness.hpp>
+#include <uhdlib/rfnoc/async_msg.hpp>
+#include <boost/noncopyable.hpp>
+#include <functional>
+
+namespace uhd { namespace rfnoc {
+
+/*! Async message handler for a uhd::rfnoc::graph
+ *
+ */
+class async_msg_handler : boost::noncopyable
+{
+public:
+ typedef boost::shared_ptr<async_msg_handler> sptr;
+ typedef std::function<void(const async_msg_t&)> async_handler_type;
+
+ /*!
+ * \param recv A transport on which async messages are received
+ * \param send A transport on which to send response messages
+ * \param sid The source part of this is taken as the local address of the
+ * transports. The remote part is ignored.
+ */
+ static sptr make(
+ uhd::transport::zero_copy_if::sptr recv,
+ uhd::transport::zero_copy_if::sptr send,
+ uhd::sid_t sid,
+ uhd::endianness_t endianness
+ );
+
+ /*! Register an event handler.
+ *
+ * When any message is received with the given event code,
+ * \p handler is called with the async message data as an argument.
+ *
+ * Note that \p handler is called if a message includes a certain event
+ * code, but it does not have to be exclusive. Example: If there are two
+ * event handlers registered, one for EVENT_CODE_OVERRUN and one for
+ * EVENT_CODE_BAD_PACKET, and a message includes both those event codes,
+ * then both event handlers are called.
+ *
+ * Multiple handlers per event code may be registered. The order they are
+ * called in is non-deterministic.
+ *
+ * \returns The number of event handlers registered for this event code.
+ * Should never return anything less than 1.
+ */
+ virtual int register_event_handler(
+ const async_msg_t::event_code_t event_code,
+ async_handler_type handler
+ ) = 0;
+
+ /*! Post async messages into this message handler.
+ *
+ * This is the entry point for all async messages. When a message
+ * is posted here, the following actions take place:
+ * - If applicable, an event handler is called with \p metadata as the
+ * argument
+ * - Some messages print error codes (e.g. O, U, L, S)
+ */
+ virtual void post_async_msg(
+ const async_msg_t &metadata
+ ) = 0;
+
+ /*! Return the 16-bit address of this async message
+ */
+ virtual uint32_t get_local_addr() const = 0;
+};
+
+
+}}; /* namespace uhd::rfnoc */
+
+#endif /* INCLUDED_LIBUHD_RFNOC_AYNC_MSG_HANDLER_HPP */
+// vim: sw=4 et: