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"
47 return null_subscription;
54 const rosidl_message_type_support_t * type_support,
55 const char * topic_name,
71 RCUTILS_LOG_DEBUG_NAMED(
72 ROS_PACKAGE_NAME,
"Initializing subscription for topic name '%s'", topic_name);
73 if (subscription->
impl) {
74 RCL_SET_ERROR_MSG(
"subscription already initialized, or memory was uninitialized");
79 char * remapped_topic_name = NULL;
86 &remapped_topic_name);
95 RCUTILS_LOG_DEBUG_NAMED(
96 ROS_PACKAGE_NAME,
"Expanded and remapped topic name '%s'", remapped_topic_name);
101 RCL_CHECK_FOR_NULL_WITH_MSG(
105 subscription->
impl->options = *options;
106 subscription->
impl->in_use_by_waitset =
false;
110 subscription->
impl->rmw_handle = rmw_create_subscription(
116 if (!subscription->
impl->rmw_handle) {
117 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
121 rmw_ret_t rmw_ret = rmw_subscription_get_actual_qos(
122 subscription->
impl->rmw_handle,
123 &subscription->
impl->actual_qos);
124 if (RMW_RET_OK != rmw_ret) {
125 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
128 subscription->
impl->actual_qos.avoid_ros_namespace_conventions =
129 options->
qos.avoid_ros_namespace_conventions;
131 if (
RCL_RET_OK != rcl_node_type_cache_register_type(
132 node, type_support->get_type_hash_func(type_support),
133 type_support->get_type_description_func(type_support),
134 type_support->get_type_description_sources_func(type_support)))
136 rcutils_reset_error();
137 RCL_SET_ERROR_MSG(
"Failed to register type for subscription");
140 subscription->
impl->type_hash = *type_support->get_type_hash_func(type_support);
142 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription initialized");
144 TRACETOOLS_TRACEPOINT(
146 (
const void *)subscription,
148 (
const void *)subscription->
impl->rmw_handle,
154 if (subscription->
impl) {
155 if (subscription->
impl->rmw_handle) {
156 rmw_ret_t rmw_fail_ret = rmw_destroy_subscription(
158 if (RMW_RET_OK != rmw_fail_ret) {
159 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
160 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
166 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
167 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
170 allocator->deallocate(subscription->
impl, allocator->state);
171 subscription->
impl = NULL;
176 allocator->deallocate(remapped_topic_name, allocator->state);
188 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Finalizing subscription");
194 if (subscription->
impl) {
201 rmw_destroy_subscription(rmw_node, subscription->
impl->rmw_handle);
202 if (ret != RMW_RET_OK) {
203 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
208 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
209 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
214 ROSIDL_TYPE_HASH_VERSION_UNSET != subscription->
impl->type_hash.version &&
215 RCL_RET_OK != rcl_node_type_cache_unregister_type(node, &subscription->
impl->type_hash))
217 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
218 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
222 allocator.deallocate(subscription->
impl, allocator.state);
223 subscription->
impl = NULL;
225 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription finalized");
235 default_options.
qos = rmw_qos_profile_default;
244 const char * env_val = NULL;
245 const char * env_error_str = rcutils_get_env(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR, &env_val);
246 if (NULL != env_error_str) {
247 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to get disable_loaned_message: ");
248 RCUTILS_SAFE_FWRITE_TO_STDERR_WITH_FORMAT_STRING(
249 "Error getting env var: '" RCUTILS_STRINGIFY(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR)
"': %s\n",
255 return default_options;
267 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
269 if (RCUTILS_RET_OK != ret) {
270 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to fini content filter options.\n");
271 return rcl_convert_rmw_ret_to_rcl_ret(ret);
273 allocator->deallocate(
279 allocator->deallocate(
289 const char * acceptable_buffer_backends,
298 allocator->deallocate(
303 if (NULL == acceptable_buffer_backends ||
'\0' == acceptable_buffer_backends[0]) {
307 char * dup = rcutils_strdup(acceptable_buffer_backends, *allocator);
309 RCL_SET_ERROR_MSG(
"failed to allocate acceptable_buffer_backends string");
319 const char * filter_expression,
320 size_t expression_parameters_argc,
321 const char * expression_parameter_argv[],
325 if (expression_parameters_argc > 100) {
326 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
335 rmw_subscription_content_filter_options_t * original_content_filter_options =
337 rmw_subscription_content_filter_options_t content_filter_options_backup =
338 rmw_get_zero_initialized_content_filter_options();
340 if (original_content_filter_options) {
342 rmw_ret = rmw_subscription_content_filter_options_copy(
343 original_content_filter_options,
345 &content_filter_options_backup
347 if (rmw_ret != RMW_RET_OK) {
348 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
353 sizeof(rmw_subscription_content_filter_options_t), allocator->state);
355 RCL_SET_ERROR_MSG(
"failed to allocate memory");
359 rmw_get_zero_initialized_content_filter_options();
362 rmw_ret = rmw_subscription_content_filter_options_set(
364 expression_parameters_argc,
365 expression_parameter_argv,
370 if (rmw_ret != RMW_RET_OK) {
371 ret = rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
375 rmw_ret = rmw_subscription_content_filter_options_fini(
376 &content_filter_options_backup,
379 if (rmw_ret != RMW_RET_OK) {
380 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
387 if (original_content_filter_options == NULL) {
389 rmw_ret = rmw_subscription_content_filter_options_fini(
394 if (rmw_ret != RMW_RET_OK) {
395 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
398 allocator->deallocate(
403 rmw_ret = rmw_subscription_content_filter_options_copy(
404 &content_filter_options_backup,
408 if (rmw_ret != RMW_RET_OK) {
409 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
412 rmw_ret = rmw_subscription_content_filter_options_fini(
413 &content_filter_options_backup,
416 if (rmw_ret != RMW_RET_OK) {
417 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
428 .rmw_subscription_content_filter_options =
429 rmw_get_zero_initialized_content_filter_options()
436 const char * filter_expression,
437 size_t expression_parameters_argc,
438 const char * expression_parameter_argv[],
447 if (expression_parameters_argc > 100) {
448 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
452 rmw_ret_t rmw_ret = rmw_subscription_content_filter_options_init(
454 expression_parameters_argc,
455 expression_parameter_argv,
457 &options->rmw_subscription_content_filter_options
460 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
466 const char * filter_expression,
467 size_t expression_parameters_argc,
468 const char * expression_parameter_argv[],
474 if (expression_parameters_argc > 100) {
475 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
482 rmw_ret_t ret = rmw_subscription_content_filter_options_set(
484 expression_parameters_argc,
485 expression_parameter_argv,
487 &options->rmw_subscription_content_filter_options
489 return rcl_convert_rmw_ret_to_rcl_ret(ret);
504 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
505 &options->rmw_subscription_content_filter_options,
509 return rcl_convert_rmw_ret_to_rcl_ret(ret);
518 return subscription->
impl->rmw_handle->is_cft_enabled;
535 rmw_ret_t ret = rmw_subscription_set_content_filter(
536 subscription->
impl->rmw_handle,
537 &options->rmw_subscription_content_filter_options);
539 if (ret != RMW_RET_OK) {
540 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
541 return rcl_convert_rmw_ret_to_rcl_ret(ret);
545 const rmw_subscription_content_filter_options_t * content_filter_options =
546 &options->rmw_subscription_content_filter_options;
548 content_filter_options->filter_expression,
549 content_filter_options->expression_parameters.size,
550 (
const char **)content_filter_options->expression_parameters.data,
551 &subscription->
impl->options
571 rmw_ret_t rmw_ret = rmw_subscription_get_content_filter(
572 subscription->
impl->rmw_handle,
574 &options->rmw_subscription_content_filter_options);
576 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
583 rmw_message_info_t * message_info,
584 rmw_subscription_allocation_t * allocation
587 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking message");
594 rmw_message_info_t dummy_message_info;
595 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
596 *message_info_local = rmw_get_zero_initialized_message_info();
599 rmw_ret_t ret = rmw_take_with_info(
600 subscription->
impl->rmw_handle, ros_message, &taken, message_info_local, allocation);
601 if (ret != RMW_RET_OK) {
602 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
603 return rcl_convert_rmw_ret_to_rcl_ret(ret);
605 RCUTILS_LOG_DEBUG_NAMED(
606 ROS_PACKAGE_NAME,
"Subscription take succeeded: %s", taken ?
"true" :
"false");
607 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)ros_message);
618 rmw_message_sequence_t * message_sequence,
619 rmw_message_info_sequence_t * message_info_sequence,
620 rmw_subscription_allocation_t * allocation
623 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking %zu messages", count);
630 if (message_sequence->capacity < count) {
631 RCL_SET_ERROR_MSG(
"Insufficient message sequence capacity for requested count");
635 if (message_info_sequence->capacity < count) {
636 RCL_SET_ERROR_MSG(
"Insufficient message info sequence capacity for requested count");
641 message_sequence->size = 0u;
642 message_info_sequence->size = 0u;
645 rmw_ret_t ret = rmw_take_sequence(
646 subscription->
impl->rmw_handle, count, message_sequence, message_info_sequence, &taken,
648 if (ret != RMW_RET_OK) {
649 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
650 return rcl_convert_rmw_ret_to_rcl_ret(ret);
652 RCUTILS_LOG_DEBUG_NAMED(
653 ROS_PACKAGE_NAME,
"Subscription took %zu messages", taken);
664 rmw_message_info_t * message_info,
665 rmw_subscription_allocation_t * allocation
668 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking serialized message");
674 rmw_message_info_t dummy_message_info;
675 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
676 *message_info_local = rmw_get_zero_initialized_message_info();
679 rmw_ret_t ret = rmw_take_serialized_message_with_info(
680 subscription->
impl->rmw_handle, serialized_message, &taken, message_info_local, allocation);
681 if (ret != RMW_RET_OK) {
682 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
683 return rcl_convert_rmw_ret_to_rcl_ret(ret);
685 RCUTILS_LOG_DEBUG_NAMED(
686 ROS_PACKAGE_NAME,
"Subscription serialized take succeeded: %s", taken ?
"true" :
"false");
687 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)serialized_message);
697 rosidl_dynamic_typesupport_dynamic_data_t * dynamic_message,
698 rmw_message_info_t * message_info,
699 rmw_subscription_allocation_t * allocation)
701 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking dynamic message");
707 rmw_message_info_t dummy_message_info;
708 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
709 *message_info_local = rmw_get_zero_initialized_message_info();
712 rmw_ret_t ret = rmw_take_dynamic_message_with_info(
713 subscription->
impl->rmw_handle, dynamic_message, &taken, message_info_local, allocation);
714 if (ret != RMW_RET_OK) {
715 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
716 return rcl_convert_rmw_ret_to_rcl_ret(ret);
718 RCUTILS_LOG_DEBUG_NAMED(
719 ROS_PACKAGE_NAME,
"Subscription dynamic take succeeded: %s", taken ?
"true" :
"false");
729 void ** loaned_message,
730 rmw_message_info_t * message_info,
731 rmw_subscription_allocation_t * allocation)
733 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking loaned message");
738 if (*loaned_message) {
739 RCL_SET_ERROR_MSG(
"loaned message is already initialized");
743 rmw_message_info_t dummy_message_info;
744 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
745 *message_info_local = rmw_get_zero_initialized_message_info();
748 rmw_ret_t ret = rmw_take_loaned_message_with_info(
749 subscription->
impl->rmw_handle, loaned_message, &taken, message_info_local, allocation);
750 if (ret != RMW_RET_OK) {
751 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
752 return rcl_convert_rmw_ret_to_rcl_ret(ret);
754 RCUTILS_LOG_DEBUG_NAMED(
755 ROS_PACKAGE_NAME,
"Subscription loaned take succeeded: %s", taken ?
"true" :
"false");
756 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)(*loaned_message));
766 void * loaned_message)
768 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription releasing loaned message");
773 return rcl_convert_rmw_ret_to_rcl_ret(
774 rmw_return_loaned_message_from_subscription(
775 subscription->
impl->rmw_handle, loaned_message));
784 return subscription->
impl->rmw_handle->topic_name;
793 return &subscription->
impl->options;
802 return subscription->
impl->rmw_handle;
808 RCL_CHECK_FOR_NULL_WITH_MSG(subscription,
"subscription pointer is invalid",
return false);
809 RCL_CHECK_FOR_NULL_WITH_MSG(
810 subscription->
impl,
"subscription's implementation is invalid",
return false);
811 RCL_CHECK_FOR_NULL_WITH_MSG(
812 subscription->
impl->rmw_handle,
"subscription's rmw handle is invalid",
return false);
819 size_t * publisher_count)
828 rmw_ret_t ret = rmw_subscription_count_matched_publishers(
829 subscription->
impl->rmw_handle, publisher_count);
831 if (ret != RMW_RET_OK) {
832 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
833 return rcl_convert_rmw_ret_to_rcl_ret(ret);
838 const rmw_qos_profile_t *
844 return &subscription->
impl->actual_qos;
858 return subscription->
impl->rmw_handle->can_loan_messages;
864 rcl_event_callback_t callback,
865 const void * user_data)
872 return rmw_subscription_set_on_new_message_callback(
873 subscription->
impl->rmw_handle,
884 return subscription->
impl->rmw_handle->is_cft_supported;
#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_subscription_options_set_acceptable_buffer_backends(const char *acceptable_buffer_backends, rcl_subscription_options_t *options)
Set the acceptable buffer backends for the given subscription options.
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 bool rcl_subscription_is_cft_supported(const rcl_subscription_t *subscription)
Check if subscription instance supports content filtering.
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.