15 #ifndef RCLCPP__PUBLISHER_BASE_HPP_
16 #define RCLCPP__PUBLISHER_BASE_HPP_
18 #include <rmw/error_handling.h>
27 #include <unordered_map>
33 #include "rclcpp/macros.hpp"
34 #include "rclcpp/network_flow_endpoint.hpp"
35 #include "rclcpp/qos.hpp"
36 #include "rclcpp/qos_event.hpp"
37 #include "rclcpp/type_support_decl.hpp"
38 #include "rclcpp/visibility_control.hpp"
39 #include "rcpputils/time.hpp"
45 namespace node_interfaces
47 class NodeBaseInterface;
48 class NodeTopicsInterface;
51 namespace experimental
57 class IntraProcessManager;
60 class PublisherBase :
public std::enable_shared_from_this<PublisherBase>
62 friend ::rclcpp::node_interfaces::NodeTopicsInterface;
79 const std::string & topic,
80 const rosidl_message_type_support_t & type_support,
107 std::shared_ptr<rcl_publisher_t>
113 std::shared_ptr<const rcl_publisher_t>
120 std::unordered_map<rcl_publisher_event_type_t, std::shared_ptr<rclcpp::QOSEventHandlerBase>> &
192 using IntraProcessManagerSharedPtr =
193 std::shared_ptr<rclcpp::experimental::IntraProcessManager>;
199 uint64_t intra_process_publisher_id,
200 IntraProcessManagerSharedPtr ipm);
208 std::vector<rclcpp::NetworkFlowEndpoint>
233 template<
typename DurationRepT =
int64_t,
typename DurationT = std::milli>
236 std::chrono::duration<DurationRepT, DurationT> timeout =
237 std::chrono::duration<DurationRepT, DurationT>(-1))
const
247 rclcpp::exceptions::throw_from_rcl_error(ret);
279 std::function<
void(
size_t)> callback,
282 if (event_handlers_.count(event_type) == 0) {
285 "Calling set_on_new_qos_event_callback for non registered publisher event_type");
290 throw std::invalid_argument(
291 "The callback passed to set_on_new_qos_event_callback "
298 std::function<void(
size_t,
int)> new_callback = std::bind(callback, std::placeholders::_1);
299 event_handlers_[event_type]->set_on_ready_callback(new_callback);
306 if (event_handlers_.count(event_type) == 0) {
309 "Calling clear_on_new_qos_event_callback for non registered event_type");
313 event_handlers_[event_type]->clear_on_ready_callback();
317 template<
typename EventCallbackT>
320 const EventCallbackT & callback,
324 std::shared_ptr<rcl_publisher_t>>>(
329 event_handlers_.insert(std::make_pair(event_type, handler));
333 void default_incompatible_qos_callback(QOSOfferedIncompatibleQoSInfo & info)
const;
335 std::shared_ptr<rcl_node_t> rcl_node_handle_;
337 std::shared_ptr<rcl_publisher_t> publisher_handle_;
340 std::shared_ptr<rclcpp::QOSEventHandlerBase>> event_handlers_;
342 using IntraProcessManagerWeakPtr =
343 std::weak_ptr<rclcpp::experimental::IntraProcessManager>;
344 bool intra_process_is_enabled_;
345 IntraProcessManagerWeakPtr weak_ipm_;
346 uint64_t intra_process_publisher_id_;
350 const rosidl_message_type_support_t type_support_;
RCLCPP_PUBLIC const rmw_gid_t & get_gid() const
Get the global identifier for this publisher (used in rmw and by DDS).
RCLCPP_PUBLIC PublisherBase(rclcpp::node_interfaces::NodeBaseInterface *node_base, const std::string &topic, const rosidl_message_type_support_t &type_support, const rcl_publisher_options_t &publisher_options)
Default constructor.
RCLCPP_PUBLIC std::shared_ptr< rcl_publisher_t > get_publisher_handle()
Get the rcl publisher handle.
RCLCPP_PUBLIC size_t get_intra_process_subscription_count() const
Get intraprocess subscription count.
RCLCPP_PUBLIC rclcpp::QoS get_actual_qos() const
Get the actual QoS settings, after the defaults have been determined.
RCLCPP_PUBLIC const char * get_topic_name() const
Get the topic that this publisher publishes on.
RCLCPP_PUBLIC bool operator==(const rmw_gid_t &gid) const
Compare this publisher to a gid.
RCLCPP_PUBLIC void setup_intra_process(uint64_t intra_process_publisher_id, IntraProcessManagerSharedPtr ipm)
Implementation utility function used to setup intra process publishing after creation.
RCLCPP_PUBLIC size_t get_queue_size() const
Get the queue size for this publisher.
void clear_on_new_qos_event_callback(rcl_publisher_event_type_t event_type)
Unset the callback registered for new qos events, if any.
RCLCPP_PUBLIC bool can_loan_messages() const
Check if publisher instance can loan messages.
RCLCPP_PUBLIC size_t get_subscription_count() const
Get subscription count.
RCLCPP_PUBLIC std::vector< rclcpp::NetworkFlowEndpoint > get_network_flow_endpoints() const
Get network flow endpoints.
bool wait_for_all_acked(std::chrono::duration< DurationRepT, DurationT > timeout=std::chrono::duration< DurationRepT, DurationT >(-1)) const
Wait until all published messages are acknowledged or until the specified timeout elapses.
RCLCPP_PUBLIC RCUTILS_WARN_UNUSED bool assert_liveliness() const
Manually assert that this Publisher is alive (for RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC).
void set_on_new_qos_event_callback(std::function< void(size_t)> callback, rcl_publisher_event_type_t event_type)
Set a callback to be called when each new qos event instance occurs.
RCLCPP_PUBLIC const std::unordered_map< rcl_publisher_event_type_t, std::shared_ptr< rclcpp::QOSEventHandlerBase > > & get_event_handlers() const
Get all the QoS event handlers associated with this publisher.
Encapsulation of Quality of Service settings.
Pure virtual interface class for the NodeBase part of the Node API.
enum rcl_publisher_event_type_e rcl_publisher_event_type_t
Enumeration of all of the publisher events that may fire.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_publisher_event_init(rcl_event_t *event, const rcl_publisher_t *publisher, const rcl_publisher_event_type_t event_type)
Initialize an rcl_event_t with a publisher.
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
RCLCPP_PUBLIC Logger get_logger(const std::string &name)
Return a named logger.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_publisher_wait_for_all_acked(const rcl_publisher_t *publisher, rcl_duration_value_t timeout)
Wait until all published message data is acknowledged or until the specified timeout elapses.
Options available for a rcl publisher.
rcutils_duration_value_t rcl_duration_value_t
A duration of time, measured in nanoseconds.
#define RCL_RET_OK
Success return code.
#define RCL_RET_TIMEOUT
Timeout occurred return code.
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.