26 #include "rcl/error_handling.h"
28 #include "rcl/node_type_cache.h"
31 #include "rcutils/env.h"
32 #include "rcutils/error_handling.h"
33 #include "rcutils/logging_macros.h"
34 #include "rcutils/macros.h"
35 #include "rcutils/strdup.h"
36 #include "rcutils/types/rcutils_ret.h"
37 #include "rmw/dynamic_message_type_support.h"
38 #include "rmw/error_handling.h"
39 #include "rmw/message_sequence.h"
40 #include "rmw/qos_profiles.h"
41 #include "rmw/ret_types.h"
43 #include "rmw/subscription_content_filter_options.h"
44 #include "rmw/types.h"
45 #include "rosidl_dynamic_typesupport/identifier.h"
46 #include "tracetools/tracetools.h"
49 #include "./subscription_impl.h"
57 return null_subscription;
64 const rosidl_message_type_support_t * type_support,
65 const char * topic_name,
81 RCUTILS_LOG_DEBUG_NAMED(
82 ROS_PACKAGE_NAME,
"Initializing subscription for topic name '%s'", topic_name);
83 if (subscription->
impl) {
84 RCL_SET_ERROR_MSG(
"subscription already initialized, or memory was uninitialized");
89 char * remapped_topic_name = NULL;
96 &remapped_topic_name);
105 RCUTILS_LOG_DEBUG_NAMED(
106 ROS_PACKAGE_NAME,
"Expanded and remapped topic name '%s'", remapped_topic_name);
111 RCL_CHECK_FOR_NULL_WITH_MSG(
115 subscription->
impl->options = *options;
116 subscription->
impl->in_use_by_waitset =
false;
120 subscription->
impl->rmw_handle = rmw_create_subscription(
126 if (!subscription->
impl->rmw_handle) {
127 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
131 rmw_ret_t rmw_ret = rmw_subscription_get_actual_qos(
132 subscription->
impl->rmw_handle,
133 &subscription->
impl->actual_qos);
134 if (RMW_RET_OK != rmw_ret) {
135 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
138 subscription->
impl->actual_qos.avoid_ros_namespace_conventions =
139 options->
qos.avoid_ros_namespace_conventions;
141 if (
RCL_RET_OK != rcl_node_type_cache_register_type(
142 node, type_support->get_type_hash_func(type_support),
143 type_support->get_type_description_func(type_support),
144 type_support->get_type_description_sources_func(type_support)))
146 rcutils_reset_error();
147 RCL_SET_ERROR_MSG(
"Failed to register type for subscription");
150 subscription->
impl->type_hash = *type_support->get_type_hash_func(type_support);
152 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription initialized");
154 TRACETOOLS_TRACEPOINT(
156 (
const void *)subscription,
158 (
const void *)subscription->
impl->rmw_handle,
164 if (subscription->
impl) {
165 if (subscription->
impl->rmw_handle) {
166 rmw_ret_t rmw_fail_ret = rmw_destroy_subscription(
168 if (RMW_RET_OK != rmw_fail_ret) {
169 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
170 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
176 RCUTILS_SAFE_FWRITE_TO_STDERR(rmw_get_error_string().str);
177 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
180 allocator->deallocate(subscription->
impl, allocator->state);
181 subscription->
impl = NULL;
186 allocator->deallocate(remapped_topic_name, allocator->state);
198 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Finalizing subscription");
204 if (subscription->
impl) {
211 rmw_destroy_subscription(rmw_node, subscription->
impl->rmw_handle);
212 if (ret != RMW_RET_OK) {
213 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
218 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
219 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
224 ROSIDL_TYPE_HASH_VERSION_UNSET != subscription->
impl->type_hash.version &&
225 RCL_RET_OK != rcl_node_type_cache_unregister_type(node, &subscription->
impl->type_hash))
227 RCUTILS_SAFE_FWRITE_TO_STDERR(rcl_get_error_string().str);
228 RCUTILS_SAFE_FWRITE_TO_STDERR(
"\n");
232 allocator.deallocate(subscription->
impl, allocator.state);
233 subscription->
impl = NULL;
235 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription finalized");
245 default_options.
qos = rmw_qos_profile_default;
254 const char * env_val = NULL;
255 const char * env_error_str = rcutils_get_env(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR, &env_val);
256 if (NULL != env_error_str) {
257 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to get disable_loaned_message: ");
258 RCUTILS_SAFE_FWRITE_TO_STDERR_WITH_FORMAT_STRING(
259 "Error getting env var: '" RCUTILS_STRINGIFY(RCL_DISABLE_LOANED_MESSAGES_ENV_VAR)
"': %s\n",
265 return default_options;
277 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
279 if (RCUTILS_RET_OK != ret) {
280 RCUTILS_SAFE_FWRITE_TO_STDERR(
"Failed to fini content filter options.\n");
281 return rcl_convert_rmw_ret_to_rcl_ret(ret);
283 allocator->deallocate(
289 allocator->deallocate(
299 const char * acceptable_buffer_backends,
308 allocator->deallocate(
313 if (NULL == acceptable_buffer_backends ||
'\0' == acceptable_buffer_backends[0]) {
317 char * dup = rcutils_strdup(acceptable_buffer_backends, *allocator);
319 RCL_SET_ERROR_MSG(
"failed to allocate acceptable_buffer_backends string");
329 const char * filter_expression,
330 size_t expression_parameters_argc,
331 const char * expression_parameter_argv[],
335 if (expression_parameters_argc > 100) {
336 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
345 rmw_subscription_content_filter_options_t * original_content_filter_options =
347 rmw_subscription_content_filter_options_t content_filter_options_backup =
348 rmw_get_zero_initialized_content_filter_options();
350 if (original_content_filter_options) {
352 rmw_ret = rmw_subscription_content_filter_options_copy(
353 original_content_filter_options,
355 &content_filter_options_backup
357 if (rmw_ret != RMW_RET_OK) {
358 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
363 sizeof(rmw_subscription_content_filter_options_t), allocator->state);
365 RCL_SET_ERROR_MSG(
"failed to allocate memory");
369 rmw_get_zero_initialized_content_filter_options();
372 rmw_ret = rmw_subscription_content_filter_options_set(
374 expression_parameters_argc,
375 expression_parameter_argv,
380 if (rmw_ret != RMW_RET_OK) {
381 ret = rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
385 rmw_ret = rmw_subscription_content_filter_options_fini(
386 &content_filter_options_backup,
389 if (rmw_ret != RMW_RET_OK) {
390 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
397 if (original_content_filter_options == NULL) {
399 rmw_ret = rmw_subscription_content_filter_options_fini(
404 if (rmw_ret != RMW_RET_OK) {
405 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
408 allocator->deallocate(
413 rmw_ret = rmw_subscription_content_filter_options_copy(
414 &content_filter_options_backup,
418 if (rmw_ret != RMW_RET_OK) {
419 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
422 rmw_ret = rmw_subscription_content_filter_options_fini(
423 &content_filter_options_backup,
426 if (rmw_ret != RMW_RET_OK) {
427 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
438 .rmw_subscription_content_filter_options =
439 rmw_get_zero_initialized_content_filter_options()
446 const char * filter_expression,
447 size_t expression_parameters_argc,
448 const char * expression_parameter_argv[],
457 if (expression_parameters_argc > 100) {
458 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
462 rmw_ret_t rmw_ret = rmw_subscription_content_filter_options_init(
464 expression_parameters_argc,
465 expression_parameter_argv,
467 &options->rmw_subscription_content_filter_options
470 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
476 const char * filter_expression,
477 size_t expression_parameters_argc,
478 const char * expression_parameter_argv[],
484 if (expression_parameters_argc > 100) {
485 RCL_SET_ERROR_MSG(
"The maximum of expression parameters argument number is 100");
492 rmw_ret_t ret = rmw_subscription_content_filter_options_set(
494 expression_parameters_argc,
495 expression_parameter_argv,
497 &options->rmw_subscription_content_filter_options
499 return rcl_convert_rmw_ret_to_rcl_ret(ret);
514 rmw_ret_t ret = rmw_subscription_content_filter_options_fini(
515 &options->rmw_subscription_content_filter_options,
519 return rcl_convert_rmw_ret_to_rcl_ret(ret);
528 return subscription->
impl->rmw_handle->is_cft_enabled;
545 rmw_ret_t ret = rmw_subscription_set_content_filter(
546 subscription->
impl->rmw_handle,
547 &options->rmw_subscription_content_filter_options);
549 if (ret != RMW_RET_OK) {
550 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
551 return rcl_convert_rmw_ret_to_rcl_ret(ret);
555 const rmw_subscription_content_filter_options_t * content_filter_options =
556 &options->rmw_subscription_content_filter_options;
558 content_filter_options->filter_expression,
559 content_filter_options->expression_parameters.size,
560 (
const char **)content_filter_options->expression_parameters.data,
561 &subscription->
impl->options
581 rmw_ret_t rmw_ret = rmw_subscription_get_content_filter(
582 subscription->
impl->rmw_handle,
584 &options->rmw_subscription_content_filter_options);
586 return rcl_convert_rmw_ret_to_rcl_ret(rmw_ret);
593 rmw_message_info_t * message_info,
594 rmw_subscription_allocation_t * allocation
597 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking message");
604 rmw_message_info_t dummy_message_info;
605 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
606 *message_info_local = rmw_get_zero_initialized_message_info();
609 rmw_ret_t ret = rmw_take_with_info(
610 subscription->
impl->rmw_handle, ros_message, &taken, message_info_local, allocation);
611 if (ret != RMW_RET_OK) {
612 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
613 return rcl_convert_rmw_ret_to_rcl_ret(ret);
615 RCUTILS_LOG_DEBUG_NAMED(
616 ROS_PACKAGE_NAME,
"Subscription take succeeded: %s", taken ?
"true" :
"false");
617 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)ros_message);
628 rmw_message_sequence_t * message_sequence,
629 rmw_message_info_sequence_t * message_info_sequence,
630 rmw_subscription_allocation_t * allocation
633 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking %zu messages", count);
640 if (message_sequence->capacity < count) {
641 RCL_SET_ERROR_MSG(
"Insufficient message sequence capacity for requested count");
645 if (message_info_sequence->capacity < count) {
646 RCL_SET_ERROR_MSG(
"Insufficient message info sequence capacity for requested count");
651 message_sequence->size = 0u;
652 message_info_sequence->size = 0u;
655 rmw_ret_t ret = rmw_take_sequence(
656 subscription->
impl->rmw_handle, count, message_sequence, message_info_sequence, &taken,
658 if (ret != RMW_RET_OK) {
659 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
660 return rcl_convert_rmw_ret_to_rcl_ret(ret);
662 RCUTILS_LOG_DEBUG_NAMED(
663 ROS_PACKAGE_NAME,
"Subscription took %zu messages", taken);
674 rmw_message_info_t * message_info,
675 rmw_subscription_allocation_t * allocation
678 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking serialized message");
684 rmw_message_info_t dummy_message_info;
685 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
686 *message_info_local = rmw_get_zero_initialized_message_info();
689 rmw_ret_t ret = rmw_take_serialized_message_with_info(
690 subscription->
impl->rmw_handle, serialized_message, &taken, message_info_local, allocation);
691 if (ret != RMW_RET_OK) {
692 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
693 return rcl_convert_rmw_ret_to_rcl_ret(ret);
695 RCUTILS_LOG_DEBUG_NAMED(
696 ROS_PACKAGE_NAME,
"Subscription serialized take succeeded: %s", taken ?
"true" :
"false");
697 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)serialized_message);
707 rosidl_dynamic_typesupport_dynamic_data_t * dynamic_message,
708 rmw_message_info_t * message_info,
709 rmw_subscription_allocation_t * allocation)
711 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking dynamic message");
717 rmw_message_info_t dummy_message_info;
718 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
719 *message_info_local = rmw_get_zero_initialized_message_info();
722 rmw_ret_t ret = rmw_take_dynamic_message_with_info(
723 subscription->
impl->rmw_handle, dynamic_message, &taken, message_info_local, allocation);
724 if (ret != RMW_RET_OK) {
725 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
726 return rcl_convert_rmw_ret_to_rcl_ret(ret);
728 RCUTILS_LOG_DEBUG_NAMED(
729 ROS_PACKAGE_NAME,
"Subscription dynamic take succeeded: %s", taken ?
"true" :
"false");
739 void ** loaned_message,
740 rmw_message_info_t * message_info,
741 rmw_subscription_allocation_t * allocation)
743 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription taking loaned message");
748 if (*loaned_message) {
749 RCL_SET_ERROR_MSG(
"loaned message is already initialized");
753 rmw_message_info_t dummy_message_info;
754 rmw_message_info_t * message_info_local = message_info ? message_info : &dummy_message_info;
755 *message_info_local = rmw_get_zero_initialized_message_info();
758 rmw_ret_t ret = rmw_take_loaned_message_with_info(
759 subscription->
impl->rmw_handle, loaned_message, &taken, message_info_local, allocation);
760 if (ret != RMW_RET_OK) {
761 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
762 return rcl_convert_rmw_ret_to_rcl_ret(ret);
764 RCUTILS_LOG_DEBUG_NAMED(
765 ROS_PACKAGE_NAME,
"Subscription loaned take succeeded: %s", taken ?
"true" :
"false");
766 TRACETOOLS_TRACEPOINT(
rcl_take, (
const void *)(*loaned_message));
776 void * loaned_message)
778 RCUTILS_LOG_DEBUG_NAMED(ROS_PACKAGE_NAME,
"Subscription releasing loaned message");
783 return rcl_convert_rmw_ret_to_rcl_ret(
784 rmw_return_loaned_message_from_subscription(
785 subscription->
impl->rmw_handle, loaned_message));
794 return subscription->
impl->rmw_handle->topic_name;
803 return &subscription->
impl->options;
812 return subscription->
impl->rmw_handle;
818 RCL_CHECK_FOR_NULL_WITH_MSG(subscription,
"subscription pointer is invalid",
return false);
819 RCL_CHECK_FOR_NULL_WITH_MSG(
820 subscription->
impl,
"subscription's implementation is invalid",
return false);
821 RCL_CHECK_FOR_NULL_WITH_MSG(
822 subscription->
impl->rmw_handle,
"subscription's rmw handle is invalid",
return false);
829 size_t * publisher_count)
838 rmw_ret_t ret = rmw_subscription_count_matched_publishers(
839 subscription->
impl->rmw_handle, publisher_count);
841 if (ret != RMW_RET_OK) {
842 RCL_SET_ERROR_MSG(rmw_get_error_string().str);
843 return rcl_convert_rmw_ret_to_rcl_ret(ret);
848 const rmw_qos_profile_t *
854 return &subscription->
impl->actual_qos;
868 return subscription->
impl->rmw_handle->can_loan_messages;
874 rcl_event_callback_t callback,
875 const void * user_data)
882 return rmw_subscription_set_on_new_message_callback(
883 subscription->
impl->rmw_handle,
894 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.