24 #include "rcl/error_handling.h"
26 #include "rcl/node_type_cache.h"
27 #include "rcutils/env.h"
28 #include "rcutils/logging_macros.h"
29 #include "rcutils/strdup.h"
30 #include "rcutils/types/string_array.h"
31 #include "rmw/error_handling.h"
32 #include "rmw/dynamic_message_type_support.h"
33 #include "rmw/subscription_content_filter_options.h"
34 #include "rmw/validate_full_topic_name.h"
35 #include "rosidl_dynamic_typesupport/identifier.h"
36 #include "tracetools/tracetools.h"
39 #include "./subscription_impl.h"
46 return null_subscription;
53 const rosidl_message_type_support_t * type_support,
54 const char * topic_name,
70 RCUTILS_LOG_DEBUG_NAMED(
71 ROS_PACKAGE_NAME,
"Initializing subscription for topic name '%s'", topic_name);
72 if (subscription->
impl) {
73 RCL_SET_ERROR_MSG(
"subscription already initialized, or memory was uninitialized");
78 char * remapped_topic_name = NULL;
85 &remapped_topic_name);
94 RCUTILS_LOG_DEBUG_NAMED(
95 ROS_PACKAGE_NAME,
"Expanded and remapped topic name '%s'", remapped_topic_name);
100 RCL_CHECK_FOR_NULL_WITH_MSG(
105 subscription->
impl->rmw_handle = rmw_create_subscription(
111 if (!subscription->
impl->rmw_handle) {
112 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
116 rmw_ret_t rmw_ret = rmw_subscription_get_actual_qos(
117 subscription->
impl->rmw_handle,
118 &subscription->
impl->actual_qos);
119 if (RMW_RET_OK != rmw_ret) {
120 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
123 subscription->
impl->actual_qos.avoid_ros_namespace_conventions =
124 options->
qos.avoid_ros_namespace_conventions;
126 subscription->
impl->options = *options;
128 if (
RCL_RET_OK != rcl_node_type_cache_register_type(
129 node, type_support->get_type_hash_func(type_support),
130 type_support->get_type_description_func(type_support),
131 type_support->get_type_description_sources_func(type_support)))
133 rcutils_reset_error();
134 RCL_SET_ERROR_MSG(
"Failed to register type for subscription");
137 subscription->
impl->type_hash = *type_support->get_type_hash_func(type_support);
139 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription initialized");
141 TRACETOOLS_TRACEPOINT(
143 (
const void *)subscription,
145 (
const void *)subscription->
impl->rmw_handle,
151 if (subscription->
impl) {
152 if (subscription->
impl->rmw_handle) {
153 rmw_ret_t rmw_fail_ret = rmw_destroy_subscription(
155 if (RMW_RET_OK != rmw_fail_ret) {
156 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
157 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
163 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
164 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
167 allocator->deallocate(subscription->
impl, allocator->state);
168 subscription->
impl = NULL;
173 allocator->deallocate(remapped_topic_name, allocator->state);
185 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Finalizing subscription");
191 if (subscription->
impl) {
198 rmw_destroy_subscription(rmw_node, subscription->
impl->rmw_handle);
199 if (ret != RMW_RET_OK) {
200 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
205 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
206 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
211 ROSIDL_TYPE_HASH_VERSION_UNSET != subscription->
impl->type_hash.version &&
212 RCL_RET_OK != rcl_node_type_cache_unregister_type(node, &subscription->
impl->type_hash))
214 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
215 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
219 allocator.deallocate(subscription->
impl, allocator.state);
220 subscription->
impl = NULL;
222 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription finalized");
232 default_options.
qos = rmw_qos_profile_default;
241 const char * env_val = NULL;
242 const char * env_error_str = rcutils_get_env(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR, &env_val);
243 if (NULL != env_error_str) {
244 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to get disable_loaned_message: ");
245 RCUTILS_SAFE_FWRITE_TO_STDERR_WITH_FORMAT_STRING(
246 "Error getting env var: '" RCUTILS_STRINGIFY(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR)
"': %s\n",
252 return default_options;
264 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
266 if (RCUTILS_RET_OK != ret) {
267 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to fini content filter options.\n");
268 return rcl_convert_rmw_ret_to_rcl_ret(ret);
270 allocator->deallocate(
279 const char * filter_expression,
280 size_t expression_parameters_argc,
281 const char * expression_parameter_argv[],
285 if (expression_parameters_argc > 100) {
286 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
295 rmw_subscription_content_filter_options_t * original_content_filter_options =
297 rmw_subscription_content_filter_options_t content_filter_options_backup =
298 rmw_get_zero_initialized_content_filter_options();
300 if (original_content_filter_options) {
302 rmw_ret = rmw_subscription_content_filter_options_copy(
303 original_content_filter_options,
305 &content_filter_options_backup
307 if (rmw_ret != RMW_RET_OK) {
308 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
313 sizeof(rmw_subscription_content_filter_options_t), allocator->state);
315 RCL_SET_ERROR_MSG(
"failed to allocate memory");
319 rmw_get_zero_initialized_content_filter_options();
322 rmw_ret = rmw_subscription_content_filter_options_set(
324 expression_parameters_argc,
325 expression_parameter_argv,
330 if (rmw_ret != RMW_RET_OK) {
331 ret = rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
335 rmw_ret = rmw_subscription_content_filter_options_fini(
336 &content_filter_options_backup,
339 if (rmw_ret != RMW_RET_OK) {
340 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
347 if (original_content_filter_options == NULL) {
349 rmw_ret = rmw_subscription_content_filter_options_fini(
354 if (rmw_ret != RMW_RET_OK) {
355 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
358 allocator->deallocate(
363 rmw_ret = rmw_subscription_content_filter_options_copy(
364 &content_filter_options_backup,
368 if (rmw_ret != RMW_RET_OK) {
369 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
372 rmw_ret = rmw_subscription_content_filter_options_fini(
373 &content_filter_options_backup,
376 if (rmw_ret != RMW_RET_OK) {
377 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
388 .rmw_subscription_content_filter_options =
389 rmw_get_zero_initialized_content_filter_options()
396 const char * filter_expression,
397 size_t expression_parameters_argc,
398 const char * expression_parameter_argv[],
407 if (expression_parameters_argc > 100) {
408 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
412 rmw_ret_t rmw_ret = rmw_subscription_content_filter_options_init(
414 expression_parameters_argc,
415 expression_parameter_argv,
417 &options->rmw_subscription_content_filter_options
420 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
426 const char * filter_expression,
427 size_t expression_parameters_argc,
428 const char * expression_parameter_argv[],
434 if (expression_parameters_argc > 100) {
435 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
442 rmw_ret_t ret = rmw_subscription_content_filter_options_set(
444 expression_parameters_argc,
445 expression_parameter_argv,
447 &options->rmw_subscription_content_filter_options
449 return rcl_convert_rmw_ret_to_rcl_ret(ret);
464 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
465 &options->rmw_subscription_content_filter_options,
469 return rcl_convert_rmw_ret_to_rcl_ret(ret);
478 return subscription->
impl->rmw_handle->is_cft_enabled;
495 rmw_ret_t ret = rmw_subscription_set_content_filter(
496 subscription->
impl->rmw_handle,
497 &options->rmw_subscription_content_filter_options);
499 if (ret != RMW_RET_OK) {
500 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
501 return rcl_convert_rmw_ret_to_rcl_ret(ret);
505 const rmw_subscription_content_filter_options_t * content_filter_options =
506 &options->rmw_subscription_content_filter_options;
508 content_filter_options->filter_expression,
509 content_filter_options->expression_parameters.size,
510 (
const char **)content_filter_options->expression_parameters.data,
511 &subscription->
impl->options
531 rmw_ret_t rmw_ret = rmw_subscription_get_content_filter(
532 subscription->
impl->rmw_handle,
534 &options->rmw_subscription_content_filter_options);
536 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
543 rmw_message_info_t * message_info,
544 rmw_subscription_allocation_t * allocation
547 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking message");
554 rmw_message_info_t dummy_message_info;
555 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
556 *message_info_local = rmw_get_zero_initialized_message_info();
559 rmw_ret_t ret = rmw_take_with_info(
560 subscription->
impl->rmw_handle, ros_message, &taken, message_info_local, allocation);
561 if (ret != RMW_RET_OK) {
562 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
563 return rcl_convert_rmw_ret_to_rcl_ret(ret);
565 RCUTILS_LOG_DEBUG_NAMED(
566 ROS_PACKAGE_NAME,
"Subscription take succeeded: %s", taken ?
"true" :
"false");
567 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)ros_message);
578 rmw_message_sequence_t * message_sequence,
579 rmw_message_info_sequence_t * message_info_sequence,
580 rmw_subscription_allocation_t * allocation
583 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking %zu messages", count);
590 if (message_sequence->capacity < count) {
591 RCL_SET_ERROR_MSG(
"Insufficient message sequence capacity for requested count");
595 if (message_info_sequence->capacity < count) {
596 RCL_SET_ERROR_MSG(
"Insufficient message info sequence capacity for requested count");
601 message_sequence->size = 0u;
602 message_info_sequence->size = 0u;
605 rmw_ret_t ret = rmw_take_sequence(
606 subscription->
impl->rmw_handle, count, message_sequence, message_info_sequence, &taken,
608 if (ret != RMW_RET_OK) {
609 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
610 return rcl_convert_rmw_ret_to_rcl_ret(ret);
612 RCUTILS_LOG_DEBUG_NAMED(
613 ROS_PACKAGE_NAME,
"Subscription took %zu messages", taken);
624 rmw_message_info_t * message_info,
625 rmw_subscription_allocation_t * allocation
628 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking serialized message");
634 rmw_message_info_t dummy_message_info;
635 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
636 *message_info_local = rmw_get_zero_initialized_message_info();
639 rmw_ret_t ret = rmw_take_serialized_message_with_info(
640 subscription->
impl->rmw_handle, serialized_message, &taken, message_info_local, allocation);
641 if (ret != RMW_RET_OK) {
642 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
643 return rcl_convert_rmw_ret_to_rcl_ret(ret);
645 RCUTILS_LOG_DEBUG_NAMED(
646 ROS_PACKAGE_NAME,
"Subscription serialized take succeeded: %s", taken ?
"true" :
"false");
647 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)serialized_message);
657 rosidl_dynamic_typesupport_dynamic_data_t * dynamic_message,
658 rmw_message_info_t * message_info,
659 rmw_subscription_allocation_t * allocation)
661 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking dynamic message");
667 rmw_message_info_t dummy_message_info;
668 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
669 *message_info_local = rmw_get_zero_initialized_message_info();
672 rmw_ret_t ret = rmw_take_dynamic_message_with_info(
673 subscription->
impl->rmw_handle, dynamic_message, &taken, message_info_local, allocation);
674 if (ret != RMW_RET_OK) {
675 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
676 return rcl_convert_rmw_ret_to_rcl_ret(ret);
678 RCUTILS_LOG_DEBUG_NAMED(
679 ROS_PACKAGE_NAME,
"Subscription dynamic take succeeded: %s", taken ?
"true" :
"false");
689 void ** loaned_message,
690 rmw_message_info_t * message_info,
691 rmw_subscription_allocation_t * allocation)
693 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking loaned message");
698 if (*loaned_message) {
699 RCL_SET_ERROR_MSG(
"loaned message is already initialized");
703 rmw_message_info_t dummy_message_info;
704 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
705 *message_info_local = rmw_get_zero_initialized_message_info();
708 rmw_ret_t ret = rmw_take_loaned_message_with_info(
709 subscription->
impl->rmw_handle, loaned_message, &taken, message_info_local, allocation);
710 if (ret != RMW_RET_OK) {
711 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
712 return rcl_convert_rmw_ret_to_rcl_ret(ret);
714 RCUTILS_LOG_DEBUG_NAMED(
715 ROS_PACKAGE_NAME,
"Subscription loaned take succeeded: %s", taken ?
"true" :
"false");
725 void * loaned_message)
727 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription releasing loaned message");
732 return rcl_convert_rmw_ret_to_rcl_ret(
733 rmw_return_loaned_message_from_subscription(
734 subscription->
impl->rmw_handle, loaned_message));
743 return subscription->
impl->rmw_handle->topic_name;
752 return &subscription->
impl->options;
761 return subscription->
impl->rmw_handle;
767 RCL_CHECK_FOR_NULL_WITH_MSG(subscription,
"subscription pointer is invalid",
return false);
768 RCL_CHECK_FOR_NULL_WITH_MSG(
769 subscription->
impl,
"subscription's implementation is invalid",
return false);
770 RCL_CHECK_FOR_NULL_WITH_MSG(
771 subscription->
impl->rmw_handle,
"subscription's rmw handle is invalid",
return false);
778 size_t * publisher_count)
787 rmw_ret_t ret = rmw_subscription_count_matched_publishers(
788 subscription->
impl->rmw_handle, publisher_count);
790 if (ret != RMW_RET_OK) {
791 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
792 return rcl_convert_rmw_ret_to_rcl_ret(ret);
797 const rmw_qos_profile_t *
803 return &subscription->
impl->actual_qos;
817 return subscription->
impl->rmw_handle->can_loan_messages;
823 rcl_event_callback_t callback,
824 const void * user_data)
831 return rmw_subscription_set_on_new_message_callback(
832 subscription->
impl->rmw_handle,
#define rcl_get_default_allocator
Return a properly initialized rcl_allocator_t with default values.
#define RCL_CHECK_ALLOCATOR_WITH_MSG(allocator, msg, fail_statement)
Check that the given allocator is initialized, or fail with a message.
rcutils_allocator_t rcl_allocator_t
Encapsulation of an allocator.
RCL_PUBLIC bool rcl_node_is_valid(const rcl_node_t *node)
Return true if the node is valid, else false.
RCL_PUBLIC RCL_WARN_UNUSED rmw_node_t * rcl_node_get_rmw_handle(const rcl_node_t *node)
Return the rmw node handle.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_node_resolve_name(const rcl_node_t *node, const char *input_name, rcl_allocator_t allocator, bool is_service, bool only_expand, char **output_name)
Expand a given name into a fully-qualified topic name and apply remapping rules.
RCL_PUBLIC bool rcl_node_is_valid_except_context(const rcl_node_t *node)
Return true if node is valid, except for the context being valid.
Structure which encapsulates a ROS Node.
Options available for a rcl subscription.
rcl_allocator_t allocator
Custom allocator for the subscription, used for incidental allocations.
rmw_qos_profile_t qos
Middleware quality of service settings for the subscription.
rmw_subscription_options_t rmw_subscription_options
rmw specific subscription options, e.g. the rmw implementation specific payload.
bool disable_loaned_message
Disable flag to LoanedMessage, initialized via environmental variable.
Structure which encapsulates a ROS Subscription.
rcl_subscription_impl_t * impl
Pointer to the subscription implementation.
RCL_PUBLIC RCL_WARN_UNUSED rcl_subscription_options_t rcl_subscription_get_default_options(void)
Return the default subscription options in a rcl_subscription_options_t.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_content_filter_options_fini(const rcl_subscription_t *subscription, rcl_subscription_content_filter_options_t *options)
Reclaim rcl_subscription_content_filter_options_t structure.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_options_fini(rcl_subscription_options_t *option)
Reclaim resources held inside rcl_subscription_options_t structure.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_init(rcl_subscription_t *subscription, const rcl_node_t *node, const rosidl_message_type_support_t *type_support, const char *topic_name, const rcl_subscription_options_t *options)
Initialize a ROS subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take_sequence(const rcl_subscription_t *subscription, size_t count, rmw_message_sequence_t *message_sequence, rmw_message_info_sequence_t *message_info_sequence, rmw_subscription_allocation_t *allocation)
Take a sequence of messages from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED const char * rcl_subscription_get_topic_name(const rcl_subscription_t *subscription)
Get the topic name for the subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_set_on_new_message_callback(const rcl_subscription_t *subscription, rcl_event_callback_t callback, const void *user_data)
Set the on new message callback function for the subscription.
RCL_PUBLIC bool rcl_subscription_can_loan_messages(const rcl_subscription_t *subscription)
Check if subscription instance can loan messages.
RCL_PUBLIC RCL_WARN_UNUSED rmw_subscription_t * rcl_subscription_get_rmw_handle(const rcl_subscription_t *subscription)
Return the rmw subscription handle.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_fini(rcl_subscription_t *subscription, rcl_node_t *node)
Finalize a rcl_subscription_t.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take(const rcl_subscription_t *subscription, void *ros_message, rmw_message_info_t *message_info, rmw_subscription_allocation_t *allocation)
Take a ROS message from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED rmw_ret_t rcl_subscription_get_publisher_count(const rcl_subscription_t *subscription, size_t *publisher_count)
Get the number of publishers matched to a subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_options_set_content_filter_options(const char *filter_expression, size_t expression_parameters_argc, const char *expression_parameter_argv[], rcl_subscription_options_t *options)
Set the content filter options for the given subscription options.
RCL_PUBLIC bool rcl_subscription_is_valid(const rcl_subscription_t *subscription)
Check that the subscription is valid.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take_serialized_message(const rcl_subscription_t *subscription, rcl_serialized_message_t *serialized_message, rmw_message_info_t *message_info, rmw_subscription_allocation_t *allocation)
Take a serialized raw message from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take_loaned_message(const rcl_subscription_t *subscription, void **loaned_message, rmw_message_info_t *message_info, rmw_subscription_allocation_t *allocation)
Take a loaned message from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_content_filter_options_set(const rcl_subscription_t *subscription, const char *filter_expression, size_t expression_parameters_argc, const char *expression_parameter_argv[], rcl_subscription_content_filter_options_t *options)
Set the content filter options for the given subscription options.
RCL_PUBLIC RCL_WARN_UNUSED rcl_subscription_content_filter_options_t rcl_get_zero_initialized_subscription_content_filter_options(void)
Return the zero initialized subscription content filter options.
RCL_PUBLIC RCL_WARN_UNUSED bool rcl_subscription_is_cft_enabled(const rcl_subscription_t *subscription)
Check if the content filtered topic feature is enabled in the subscription.
RCL_PUBLIC RCL_WARN_UNUSED const rmw_qos_profile_t * rcl_subscription_get_actual_qos(const rcl_subscription_t *subscription)
Get the actual qos settings of the subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_subscription_t rcl_get_zero_initialized_subscription(void)
Return a rcl_subscription_t struct with members set to NULL.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_get_content_filter(const rcl_subscription_t *subscription, rcl_subscription_content_filter_options_t *options)
Retrieve the filter expression of the subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_set_content_filter(const rcl_subscription_t *subscription, const rcl_subscription_content_filter_options_t *options)
Set the filter expression and expression parameters for the subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_subscription_content_filter_options_init(const rcl_subscription_t *subscription, const char *filter_expression, size_t expression_parameters_argc, const char *expression_parameter_argv[], rcl_subscription_content_filter_options_t *options)
Initialize the content filter options for the given subscription options.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_return_loaned_message_from_subscription(const rcl_subscription_t *subscription, void *loaned_message)
Return a loaned message from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t rcl_take_dynamic_message(const rcl_subscription_t *subscription, rosidl_dynamic_typesupport_dynamic_data_t *dynamic_message, rmw_message_info_t *message_info, rmw_subscription_allocation_t *allocation)
Take a dynamic type message from a topic using a rcl subscription.
RCL_PUBLIC RCL_WARN_UNUSED const rcl_subscription_options_t * rcl_subscription_get_options(const rcl_subscription_t *subscription)
Return the rcl subscription options.
#define RCL_RET_UNKNOWN_SUBSTITUTION
Topic name substitution is unknown.
#define RCL_RET_ALREADY_INIT
rcl_init() already called return code.
#define RCL_RET_SUBSCRIPTION_TAKE_FAILED
Failed to take a message from the subscription return code.
#define RCL_RET_OK
Success return code.
#define RCL_RET_BAD_ALLOC
Failed to allocate memory return code.
#define RCL_RET_INVALID_ARGUMENT
Invalid argument return code.
#define RCL_RET_ERROR
Unspecified error return code.
rmw_serialized_message_t rcl_serialized_message_t
typedef for rmw_serialized_message_t;
#define RCL_RET_NODE_INVALID
Invalid rcl_node_t given return code.
#define RCL_RET_TOPIC_NAME_INVALID
Topic name does not pass validation.
#define RCL_RET_SUBSCRIPTION_INVALID
Invalid rcl_subscription_t given return code.
rmw_ret_t rcl_ret_t
The type that holds an rcl return code.