From e6739884151c302838cfbe908fc9963ef4836f8f Mon Sep 17 00:00:00 2001 From: William Woodall Date: Tue, 8 Oct 2019 15:40:33 -0700 Subject: [PATCH] add mechanism to pass rmw impl specific payloads during pub/sub creation (#513) * add optional rmw payload to rcl options for pub and sub Signed-off-by: William Woodall * move ignore_local_publications into rmw options structure for subs Signed-off-by: William Woodall --- rcl/include/rcl/publisher.h | 2 ++ rcl/include/rcl/subscription.h | 4 ++-- rcl/src/rcl/publisher.c | 4 +++- rcl/src/rcl/subscription.c | 9 ++++----- rcl_action/src/rcl_action/action_client.c | 9 ++++----- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/rcl/include/rcl/publisher.h b/rcl/include/rcl/publisher.h index 5f4834e..9f657c5 100644 --- a/rcl/include/rcl/publisher.h +++ b/rcl/include/rcl/publisher.h @@ -43,6 +43,8 @@ typedef struct rcl_publisher_options_t /// Custom allocator for the publisher, used for incidental allocations. /** For default behavior (malloc/free), use: rcl_get_default_allocator() */ rcl_allocator_t allocator; + /// rmw specific publisher options, e.g. the rmw implementation specific payload. + rmw_publisher_options_t rmw_publisher_options; } rcl_publisher_options_t; /// Return a rcl_publisher_t struct with members set to `NULL`. diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index bb45ce8..7de6ed8 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -40,11 +40,11 @@ typedef struct rcl_subscription_options_t { /// Middleware quality of service settings for the subscription. rmw_qos_profile_t qos; - /// If true, messages published from within the same node are ignored. - bool ignore_local_publications; /// Custom allocator for the subscription, used for incidental allocations. /** For default behavior (malloc/free), see: rcl_get_default_allocator() */ rcl_allocator_t allocator; + /// rmw specific subscription options, e.g. the rmw implementation specific payload. + rmw_subscription_options_t rmw_subscription_options; } rcl_subscription_options_t; /// Return a rcl_subscription_t struct with members set to `NULL`. diff --git a/rcl/src/rcl/publisher.c b/rcl/src/rcl/publisher.c index bde1573..8cb7ce8 100644 --- a/rcl/src/rcl/publisher.c +++ b/rcl/src/rcl/publisher.c @@ -166,7 +166,8 @@ rcl_publisher_init( rcl_node_get_rmw_handle(node), type_support, remapped_topic_name, - &(options->qos)); + &(options->qos), + &(options->rmw_publisher_options)); RCL_CHECK_FOR_NULL_WITH_MSG(publisher->impl->rmw_handle, rmw_get_error_string().str, goto fail); // get actual qos, and store it @@ -240,6 +241,7 @@ rcl_publisher_get_default_options() // Must set the allocator and qos after because they are not a compile time constant. default_options.qos = rmw_qos_profile_default; default_options.allocator = rcl_get_default_allocator(); + default_options.rmw_publisher_options = rmw_get_default_publisher_options(); return default_options; } diff --git a/rcl/src/rcl/subscription.c b/rcl/src/rcl/subscription.c index b881502..45aee83 100644 --- a/rcl/src/rcl/subscription.c +++ b/rcl/src/rcl/subscription.c @@ -162,7 +162,7 @@ rcl_subscription_init( type_support, remapped_topic_name, &(options->qos), - options->ignore_local_publications); + &(options->rmw_subscription_options)); if (!subscription->impl->rmw_handle) { RCL_SET_ERROR_MSG(rmw_get_error_string().str); goto fail; @@ -230,12 +230,11 @@ rcl_subscription_options_t rcl_subscription_get_default_options() { // !!! MAKE SURE THAT CHANGES TO THESE DEFAULTS ARE REFLECTED IN THE HEADER DOC STRING - static rcl_subscription_options_t default_options = { - .ignore_local_publications = false, - }; - // Must set the allocator and qos after because they are not a compile time constant. + static rcl_subscription_options_t default_options; + // Must set these after declaration because they are not a compile time constants. default_options.qos = rmw_qos_profile_default; default_options.allocator = rcl_get_default_allocator(); + default_options.rmw_subscription_options = rmw_get_default_subscription_options(); return default_options; } diff --git a/rcl_action/src/rcl_action/action_client.c b/rcl_action/src/rcl_action/action_client.c index c02726e..d1e437e 100644 --- a/rcl_action/src/rcl_action/action_client.c +++ b/rcl_action/src/rcl_action/action_client.c @@ -110,11 +110,10 @@ rcl_action_get_zero_initialized_client(void) } \ goto fail; \ } \ - rcl_subscription_options_t Type ## _topic_subscription_options = { \ - .qos = options->Type ## _topic_qos, \ - .ignore_local_publications = false, \ - .allocator = allocator \ - }; \ + rcl_subscription_options_t Type ## _topic_subscription_options = \ + rcl_subscription_get_default_options(); \ + Type ## _topic_subscription_options.qos = options->Type ## _topic_qos; \ + Type ## _topic_subscription_options.allocator = allocator; \ action_client->impl->Type ## _subscription = rcl_get_zero_initialized_subscription(); \ ret = rcl_subscription_init( \ &action_client->impl->Type ## _subscription, \