From e64dcb0706195dce7e65733f41a62350958ed7b6 Mon Sep 17 00:00:00 2001 From: Mauro Date: Fri, 2 Oct 2020 13:50:11 +0100 Subject: [PATCH 1/7] Add RMW listener APIs Add set_guard_condition_callback api Move apis - Add constness Use or discard previous events: Guard conditions Rename to set_events_executor_callback Rename Event_callback -> ExecutorEventCallback update name Add events support void return on set_events_executor_callback Revert "void return on set_events_executor_callback" Rename ExecutorEventCallback -> EventsExecutorCallback Rename set_events_executor_callback->set_listener_callback Use data types when setting callbacks Move rcutils/executor_event_types.h to rmw/ rename event types Rename executor_context->callback_context Rename callback_context->user_data Reorder APIs arguments rename rmw_listener_cb_t->rmw_listener_callback_t use void * to pass executor ptr Rework executor callback data Use RMW renamed file Signed-off-by: Alberto Soragna --- rcl/include/rcl/client.h | 10 ++++++++++ rcl/include/rcl/event.h | 9 +++++++++ rcl/include/rcl/guard_condition.h | 11 +++++++++++ rcl/include/rcl/service.h | 10 ++++++++++ rcl/include/rcl/subscription.h | 9 +++++++++ rcl/src/rcl/client.c | 13 +++++++++++++ rcl/src/rcl/event.c | 14 ++++++++++++++ rcl/src/rcl/guard_condition.c | 14 ++++++++++++++ rcl/src/rcl/service.c | 13 +++++++++++++ rcl/src/rcl/subscription.c | 12 ++++++++++++ 10 files changed, 115 insertions(+) diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index e4285a031..8be40abe7 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -28,6 +28,8 @@ extern "C" #include "rcl/node.h" #include "rcl/visibility_control.h" +#include "rmw/listener_callback_type.h" + /// Internal rcl client implementation struct. struct rcl_client_impl_t; @@ -409,6 +411,14 @@ RCL_PUBLIC bool rcl_client_is_valid(const rcl_client_t * client); +RCL_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_client_set_listener_callback( + const rcl_client_t * client, + rmw_listener_callback_t listener_callback, + const void * user_data); + #ifdef __cplusplus } #endif diff --git a/rcl/include/rcl/event.h b/rcl/include/rcl/event.h index a366dd45b..0c593d92f 100644 --- a/rcl/include/rcl/event.h +++ b/rcl/include/rcl/event.h @@ -199,6 +199,15 @@ RCL_PUBLIC bool rcl_event_is_valid(const rcl_event_t * event); +RCL_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_event_set_listener_callback( + const rcl_event_t * event, + rmw_listener_callback_t listener_callback, + const void * user_data, + bool use_previous_events); + #ifdef __cplusplus } #endif diff --git a/rcl/include/rcl/guard_condition.h b/rcl/include/rcl/guard_condition.h index a6727d3a2..092c0ca70 100644 --- a/rcl/include/rcl/guard_condition.h +++ b/rcl/include/rcl/guard_condition.h @@ -28,6 +28,8 @@ extern "C" #include "rcl/types.h" #include "rcl/visibility_control.h" +#include "rmw/listener_callback_type.h" + /// Internal rcl guard condition implementation struct. struct rcl_guard_condition_impl_t; @@ -262,6 +264,15 @@ RCL_WARN_UNUSED rmw_guard_condition_t * rcl_guard_condition_get_rmw_handle(const rcl_guard_condition_t * guard_condition); +RCL_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_guard_condition_set_listener_callback( + const rcl_guard_condition_t * guard_condition, + rmw_listener_callback_t listener_callback, + const void * user_data, + bool use_previous_events); + #ifdef __cplusplus } #endif diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 87e182ad5..8186612ab 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -28,6 +28,8 @@ extern "C" #include "rcl/node.h" #include "rcl/visibility_control.h" +#include "rmw/listener_callback_type.h" + /// Internal rcl implementation struct. struct rcl_service_impl_t; @@ -440,6 +442,14 @@ RCL_PUBLIC bool rcl_service_is_valid(const rcl_service_t * service); +RCL_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_service_set_listener_callback( + const rcl_service_t * service, + rmw_listener_callback_t listener_callback, + const void * user_data); + #ifdef __cplusplus } #endif diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index 452cb694b..79918b151 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -28,6 +28,7 @@ extern "C" #include "rcl/node.h" #include "rcl/visibility_control.h" +#include "rmw/listener_callback_type.h" #include "rmw/message_sequence.h" /// Internal rcl implementation struct. @@ -611,6 +612,14 @@ RCL_PUBLIC bool rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); +RCL_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_subscription_set_listener_callback( + const rcl_subscription_t * subscription, + rmw_listener_callback_t listener_callback, + const void * user_data); + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/client.c b/rcl/src/rcl/client.c index 53dc77ca1..1c35e9456 100644 --- a/rcl/src/rcl/client.c +++ b/rcl/src/rcl/client.c @@ -280,6 +280,19 @@ rcl_client_is_valid(const rcl_client_t * client) client->impl->rmw_handle, "client's rmw handle is invalid", return false); return true; } + +rcl_ret_t +rcl_client_set_listener_callback( + const rcl_client_t * client, + rmw_listener_callback_t listener_callback, + const void * user_data) +{ + return rmw_client_set_listener_callback( + client->impl->rmw_handle, + listener_callback, + user_data); +} + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/event.c b/rcl/src/rcl/event.c index c79c60ce6..b4cf09b69 100644 --- a/rcl/src/rcl/event.c +++ b/rcl/src/rcl/event.c @@ -218,6 +218,20 @@ rcl_event_is_valid(const rcl_event_t * event) return true; } +rcl_ret_t +rcl_event_set_listener_callback( + const rcl_event_t * event, + rmw_listener_callback_t listener_callback, + const void * user_data, + bool use_previous_events) +{ + return rmw_event_set_listener_callback( + &event->impl->rmw_handle, + listener_callback, + user_data, + use_previous_events); +} + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/guard_condition.c b/rcl/src/rcl/guard_condition.c index d7e17afda..cac4bfc42 100644 --- a/rcl/src/rcl/guard_condition.c +++ b/rcl/src/rcl/guard_condition.c @@ -186,6 +186,20 @@ rcl_guard_condition_get_rmw_handle(const rcl_guard_condition_t * guard_condition return guard_condition->impl->rmw_handle; } +rcl_ret_t +rcl_guard_condition_set_listener_callback( + const rcl_guard_condition_t * guard_condition, + rmw_listener_callback_t listener_callback, + const void * user_data, + bool use_previous_events) +{ + return rmw_guard_condition_set_listener_callback( + guard_condition->impl->rmw_handle, + listener_callback, + user_data, + use_previous_events); +} + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/service.c b/rcl/src/rcl/service.c index 251ab66b1..dd39176a8 100644 --- a/rcl/src/rcl/service.c +++ b/rcl/src/rcl/service.c @@ -301,6 +301,19 @@ rcl_service_is_valid(const rcl_service_t * service) return true; } +rcl_ret_t +rcl_service_set_listener_callback( + const rcl_service_t * service, + rmw_listener_callback_t listener_callback, + const void * user_data) +{ + return rmw_service_set_listener_callback( + service->impl->rmw_handle, + listener_callback, + user_data); +} + + #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/subscription.c b/rcl/src/rcl/subscription.c index 611994356..57fc2dc46 100644 --- a/rcl/src/rcl/subscription.c +++ b/rcl/src/rcl/subscription.c @@ -437,6 +437,18 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription) return subscription->impl->rmw_handle->can_loan_messages; } +rcl_ret_t +rcl_subscription_set_listener_callback( + const rcl_subscription_t * subscription, + rmw_listener_callback_t listener_callback, + const void * user_data) +{ + return rmw_subscription_set_listener_callback( + subscription->impl->rmw_handle, + listener_callback, + user_data); +} + #ifdef __cplusplus } #endif From 81875571cc092d08a4aef2363370cd0896d4010d Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Wed, 24 Mar 2021 16:53:34 -0300 Subject: [PATCH 2/7] Remove use_previous_event Signed-off-by: Mauro Passerino --- rcl/include/rcl/event.h | 3 +-- rcl/include/rcl/guard_condition.h | 3 +-- rcl/src/rcl/event.c | 6 ++---- rcl/src/rcl/guard_condition.c | 6 ++---- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/rcl/include/rcl/event.h b/rcl/include/rcl/event.h index 0c593d92f..316641218 100644 --- a/rcl/include/rcl/event.h +++ b/rcl/include/rcl/event.h @@ -205,8 +205,7 @@ rcl_ret_t rcl_event_set_listener_callback( const rcl_event_t * event, rmw_listener_callback_t listener_callback, - const void * user_data, - bool use_previous_events); + const void * user_data); #ifdef __cplusplus } diff --git a/rcl/include/rcl/guard_condition.h b/rcl/include/rcl/guard_condition.h index 092c0ca70..dc8b93801 100644 --- a/rcl/include/rcl/guard_condition.h +++ b/rcl/include/rcl/guard_condition.h @@ -270,8 +270,7 @@ rcl_ret_t rcl_guard_condition_set_listener_callback( const rcl_guard_condition_t * guard_condition, rmw_listener_callback_t listener_callback, - const void * user_data, - bool use_previous_events); + const void * user_data); #ifdef __cplusplus } diff --git a/rcl/src/rcl/event.c b/rcl/src/rcl/event.c index b4cf09b69..ac0854487 100644 --- a/rcl/src/rcl/event.c +++ b/rcl/src/rcl/event.c @@ -222,14 +222,12 @@ rcl_ret_t rcl_event_set_listener_callback( const rcl_event_t * event, rmw_listener_callback_t listener_callback, - const void * user_data, - bool use_previous_events) + const void * user_data) { return rmw_event_set_listener_callback( &event->impl->rmw_handle, listener_callback, - user_data, - use_previous_events); + user_data); } #ifdef __cplusplus diff --git a/rcl/src/rcl/guard_condition.c b/rcl/src/rcl/guard_condition.c index cac4bfc42..80020db71 100644 --- a/rcl/src/rcl/guard_condition.c +++ b/rcl/src/rcl/guard_condition.c @@ -190,14 +190,12 @@ rcl_ret_t rcl_guard_condition_set_listener_callback( const rcl_guard_condition_t * guard_condition, rmw_listener_callback_t listener_callback, - const void * user_data, - bool use_previous_events) + const void * user_data) { return rmw_guard_condition_set_listener_callback( guard_condition->impl->rmw_handle, listener_callback, - user_data, - use_previous_events); + user_data); } #ifdef __cplusplus From cc29b68482bd8c3bfa1ddadd245f5497974b754e Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Wed, 31 Mar 2021 17:53:50 -0300 Subject: [PATCH 3/7] Remove guard condition listener Signed-off-by: Mauro Passerino --- rcl/include/rcl/guard_condition.h | 10 ---------- rcl/src/rcl/guard_condition.c | 12 ------------ 2 files changed, 22 deletions(-) diff --git a/rcl/include/rcl/guard_condition.h b/rcl/include/rcl/guard_condition.h index dc8b93801..a6727d3a2 100644 --- a/rcl/include/rcl/guard_condition.h +++ b/rcl/include/rcl/guard_condition.h @@ -28,8 +28,6 @@ extern "C" #include "rcl/types.h" #include "rcl/visibility_control.h" -#include "rmw/listener_callback_type.h" - /// Internal rcl guard condition implementation struct. struct rcl_guard_condition_impl_t; @@ -264,14 +262,6 @@ RCL_WARN_UNUSED rmw_guard_condition_t * rcl_guard_condition_get_rmw_handle(const rcl_guard_condition_t * guard_condition); -RCL_PUBLIC -RCL_WARN_UNUSED -rcl_ret_t -rcl_guard_condition_set_listener_callback( - const rcl_guard_condition_t * guard_condition, - rmw_listener_callback_t listener_callback, - const void * user_data); - #ifdef __cplusplus } #endif diff --git a/rcl/src/rcl/guard_condition.c b/rcl/src/rcl/guard_condition.c index 80020db71..d7e17afda 100644 --- a/rcl/src/rcl/guard_condition.c +++ b/rcl/src/rcl/guard_condition.c @@ -186,18 +186,6 @@ rcl_guard_condition_get_rmw_handle(const rcl_guard_condition_t * guard_condition return guard_condition->impl->rmw_handle; } -rcl_ret_t -rcl_guard_condition_set_listener_callback( - const rcl_guard_condition_t * guard_condition, - rmw_listener_callback_t listener_callback, - const void * user_data) -{ - return rmw_guard_condition_set_listener_callback( - guard_condition->impl->rmw_handle, - listener_callback, - user_data); -} - #ifdef __cplusplus } #endif From 7a366e11675c3a94bb7b71889fcb27705b4abe04 Mon Sep 17 00:00:00 2001 From: William Woodall Date: Thu, 1 Apr 2021 20:58:51 -0700 Subject: [PATCH 4/7] refactor to remove listener term and document Signed-off-by: William Woodall --- rcl/include/rcl/client.h | 30 ++++++++++++++++++++++++++---- rcl/include/rcl/event.h | 28 ++++++++++++++++++++++++++-- rcl/include/rcl/event_callback.h | 31 +++++++++++++++++++++++++++++++ rcl/include/rcl/service.h | 30 ++++++++++++++++++++++++++---- rcl/include/rcl/subscription.h | 30 +++++++++++++++++++++++++++--- rcl/src/rcl/client.c | 13 +++++++++---- rcl/src/rcl/event.c | 13 +++++++++---- rcl/src/rcl/service.c | 13 +++++++++---- rcl/src/rcl/subscription.c | 13 +++++++++---- 9 files changed, 172 insertions(+), 29 deletions(-) create mode 100644 rcl/include/rcl/event_callback.h diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index 8be40abe7..a3a5ee724 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -24,12 +24,11 @@ extern "C" #include "rosidl_runtime_c/service_type_support_struct.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/node.h" #include "rcl/visibility_control.h" -#include "rmw/listener_callback_type.h" - /// Internal rcl client implementation struct. struct rcl_client_impl_t; @@ -411,12 +410,35 @@ RCL_PUBLIC bool rcl_client_is_valid(const rcl_client_t * client); +/// Set the on new response callback function for the client. +/** + * This API sets the callback function to be called whenever the + * client is notified about a new response. + * + * \sa rmw_client_set_on_new_response_callback for details about this function. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | No + * Thread-Safe | Yes + * Uses Atomics | Maybe [1] + * Lock-Free | Maybe [1] + * [1] rmw implementation defined + * + * \param[in] client The client on which to set the callback + * \param[in] callback The callback to be called when new responses arrive + * \param[in] user_data Given to the callback when called later, may be NULL + * \return `RCL_RET_OK` if callback was set to the listener, or + * \return `RCL_RET_INVALID_ARGUMENT` if `client` or `callback` is NULL, or + * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation + */ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t -rcl_client_set_listener_callback( +rcl_client_set_on_new_response_callback( const rcl_client_t * client, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data); #ifdef __cplusplus diff --git a/rcl/include/rcl/event.h b/rcl/include/rcl/event.h index 316641218..0d894f61e 100644 --- a/rcl/include/rcl/event.h +++ b/rcl/include/rcl/event.h @@ -23,6 +23,7 @@ extern "C" #endif #include "rcl/client.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/publisher.h" #include "rcl/service.h" @@ -199,12 +200,35 @@ RCL_PUBLIC bool rcl_event_is_valid(const rcl_event_t * event); +/// Set the callback function for the event. +/** + * This API sets the callback function to be called whenever the + * event is notified about a new instance of the event. + * + * \sa rmw_event_set_callback for more details about this function. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | No + * Thread-Safe | Yes + * Uses Atomics | Maybe [1] + * Lock-Free | Maybe [1] + * [1] rmw implementation defined + * + * \param[in] event The event on which to set the callback + * \param[in] callback The callback to be called when new events occur + * \param[in] user_data Given to the callback when called later, may be NULL + * \return `RCL_RET_OK` if callback was set to the listener, or + * \return `RCL_RET_INVALID_ARGUMENT` if `event` or `callback` is NULL, or + * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation + */ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t -rcl_event_set_listener_callback( +rcl_event_set_callback( const rcl_event_t * event, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data); #ifdef __cplusplus diff --git a/rcl/include/rcl/event_callback.h b/rcl/include/rcl/event_callback.h new file mode 100644 index 000000000..9124907ab --- /dev/null +++ b/rcl/include/rcl/event_callback.h @@ -0,0 +1,31 @@ +// Copyright 2021 Open Source Robotics Foundation, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef RCL__EVENT_CALLBACK_H_ +#define RCL__EVENT_CALLBACK_H_ + +#include "rmw/event_callback_type.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef rmw_event_callback_t rcl_event_callback_t; + +#ifdef __cplusplus +} +#endif + +#endif // RCL__EVENT_CALLBACK_H_ diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 8186612ab..43ad2f3a9 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -24,12 +24,11 @@ extern "C" #include "rosidl_runtime_c/service_type_support_struct.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/node.h" #include "rcl/visibility_control.h" -#include "rmw/listener_callback_type.h" - /// Internal rcl implementation struct. struct rcl_service_impl_t; @@ -442,12 +441,35 @@ RCL_PUBLIC bool rcl_service_is_valid(const rcl_service_t * service); +/// Set the on new request callback function for the service. +/** + * This API sets the callback function to be called whenever the + * service is notified about a new request. + * + * \sa rmw_service_set_on_new_request_callback for details about this function. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | No + * Thread-Safe | Yes + * Uses Atomics | Maybe [1] + * Lock-Free | Maybe [1] + * [1] rmw implementation defined + * + * \param[in] service The service on which to set the callback + * \param[in] callback The callback to be called when new requests arrive + * \param[in] user_data Given to the callback when called later, may be NULL + * \return `RCL_RET_OK` if callback was set to the listener, or + * \return `RCL_RET_INVALID_ARGUMENT` if `service` or `callback` is NULL, or + * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation + */ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t -rcl_service_set_listener_callback( +rcl_service_set_on_new_request_callback( const rcl_service_t * service, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data); #ifdef __cplusplus diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index 79918b151..77a2f52fd 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -24,11 +24,11 @@ extern "C" #include "rosidl_runtime_c/message_type_support_struct.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/node.h" #include "rcl/visibility_control.h" -#include "rmw/listener_callback_type.h" #include "rmw/message_sequence.h" /// Internal rcl implementation struct. @@ -612,12 +612,36 @@ RCL_PUBLIC bool rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); +/// Set the on new message callback function for the subscription. +/** + * This API sets the callback function to be called whenever the + * subscription is notified about a new message. + * + * \sa rmw_subscription_set_on_new_message_callback for details about this + * function. + * + *
+ * Attribute | Adherence + * ------------------ | ------------- + * Allocates Memory | No + * Thread-Safe | Yes + * Uses Atomics | Maybe [1] + * Lock-Free | Maybe [1] + * [1] rmw implementation defined + * + * \param[in] subscription The subscription on which to set the callback + * \param[in] callback The callback to be called when new messages arrive + * \param[in] user_data Given to the callback when called later, may be NULL + * \return `RCL_RET_OK` if successful, or + * \return `RCL_RET_INVALID_ARGUMENT` if `subscription` or `callback` is NULL, or + * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation + */ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t -rcl_subscription_set_listener_callback( +rcl_subscription_set_on_new_message_callback( const rcl_subscription_t * subscription, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data); #ifdef __cplusplus diff --git a/rcl/src/rcl/client.c b/rcl/src/rcl/client.c index 1c35e9456..24f0d0c00 100644 --- a/rcl/src/rcl/client.c +++ b/rcl/src/rcl/client.c @@ -282,14 +282,19 @@ rcl_client_is_valid(const rcl_client_t * client) } rcl_ret_t -rcl_client_set_listener_callback( +rcl_client_set_on_new_response_callback( const rcl_client_t * client, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data) { - return rmw_client_set_listener_callback( + if (!rcl_client_is_valid(client)) { + // error state already set + return RCL_RET_INVALID_ARGUMENT; + } + RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_client_set_on_new_response_callback( client->impl->rmw_handle, - listener_callback, + callback, user_data); } diff --git a/rcl/src/rcl/event.c b/rcl/src/rcl/event.c index ac0854487..dccee5254 100644 --- a/rcl/src/rcl/event.c +++ b/rcl/src/rcl/event.c @@ -219,14 +219,19 @@ rcl_event_is_valid(const rcl_event_t * event) } rcl_ret_t -rcl_event_set_listener_callback( +rcl_event_set_callback( const rcl_event_t * event, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data) { - return rmw_event_set_listener_callback( + if (!rcl_event_is_valid(event)) { + // error state already set + return RCL_RET_INVALID_ARGUMENT; + } + RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_event_set_callback( &event->impl->rmw_handle, - listener_callback, + callback, user_data); } diff --git a/rcl/src/rcl/service.c b/rcl/src/rcl/service.c index dd39176a8..fbdd81579 100644 --- a/rcl/src/rcl/service.c +++ b/rcl/src/rcl/service.c @@ -302,14 +302,19 @@ rcl_service_is_valid(const rcl_service_t * service) } rcl_ret_t -rcl_service_set_listener_callback( +rcl_service_set_on_new_request_callback( const rcl_service_t * service, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data) { - return rmw_service_set_listener_callback( + if (!rcl_service_is_valid(service)) { + // error state already set + return RCL_RET_INVALID_ARGUMENT; + } + RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_service_set_on_new_request_callback( service->impl->rmw_handle, - listener_callback, + callback, user_data); } diff --git a/rcl/src/rcl/subscription.c b/rcl/src/rcl/subscription.c index 57fc2dc46..46986aa95 100644 --- a/rcl/src/rcl/subscription.c +++ b/rcl/src/rcl/subscription.c @@ -438,14 +438,19 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription) } rcl_ret_t -rcl_subscription_set_listener_callback( +rcl_subscription_set_on_new_message_callback( const rcl_subscription_t * subscription, - rmw_listener_callback_t listener_callback, + rcl_event_callback_t callback, const void * user_data) { - return rmw_subscription_set_listener_callback( + if (!rcl_subscription_is_valid(subscription)) { + // error state already set + return RCL_RET_INVALID_ARGUMENT; + } + RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_subscription_set_on_new_message_callback( subscription->impl->rmw_handle, - listener_callback, + callback, user_data); } From 08a1c69a329febea14665b7dbf9a552fd7a248c8 Mon Sep 17 00:00:00 2001 From: Alberto Soragna Date: Mon, 19 Apr 2021 13:00:20 +0000 Subject: [PATCH 5/7] allow rmw event callback to be NULL to unset them Signed-off-by: Alberto Soragna --- rcl/include/rcl/client.h | 4 ++-- rcl/include/rcl/event.h | 4 ++-- rcl/include/rcl/service.h | 4 ++-- rcl/include/rcl/subscription.h | 4 ++-- rcl/src/rcl/client.c | 2 +- rcl/src/rcl/event.c | 2 +- rcl/src/rcl/service.c | 2 +- rcl/src/rcl/subscription.c | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rcl/include/rcl/client.h b/rcl/include/rcl/client.h index a3a5ee724..978c479c9 100644 --- a/rcl/include/rcl/client.h +++ b/rcl/include/rcl/client.h @@ -427,10 +427,10 @@ rcl_client_is_valid(const rcl_client_t * client); * [1] rmw implementation defined * * \param[in] client The client on which to set the callback - * \param[in] callback The callback to be called when new responses arrive + * \param[in] callback The callback to be called when new responses arrive, may be NULL * \param[in] user_data Given to the callback when called later, may be NULL * \return `RCL_RET_OK` if callback was set to the listener, or - * \return `RCL_RET_INVALID_ARGUMENT` if `client` or `callback` is NULL, or + * \return `RCL_RET_INVALID_ARGUMENT` if `client` is NULL, or * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation */ RCL_PUBLIC diff --git a/rcl/include/rcl/event.h b/rcl/include/rcl/event.h index 0d894f61e..9a72f29b8 100644 --- a/rcl/include/rcl/event.h +++ b/rcl/include/rcl/event.h @@ -217,10 +217,10 @@ rcl_event_is_valid(const rcl_event_t * event); * [1] rmw implementation defined * * \param[in] event The event on which to set the callback - * \param[in] callback The callback to be called when new events occur + * \param[in] callback The callback to be called when new events occur, may be NULL * \param[in] user_data Given to the callback when called later, may be NULL * \return `RCL_RET_OK` if callback was set to the listener, or - * \return `RCL_RET_INVALID_ARGUMENT` if `event` or `callback` is NULL, or + * \return `RCL_RET_INVALID_ARGUMENT` if `event` is NULL, or * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation */ RCL_PUBLIC diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 43ad2f3a9..e14f62d26 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -458,10 +458,10 @@ rcl_service_is_valid(const rcl_service_t * service); * [1] rmw implementation defined * * \param[in] service The service on which to set the callback - * \param[in] callback The callback to be called when new requests arrive + * \param[in] callback The callback to be called when new requests arrive, may be NULL * \param[in] user_data Given to the callback when called later, may be NULL * \return `RCL_RET_OK` if callback was set to the listener, or - * \return `RCL_RET_INVALID_ARGUMENT` if `service` or `callback` is NULL, or + * \return `RCL_RET_INVALID_ARGUMENT` if `service` is NULL, or * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation */ RCL_PUBLIC diff --git a/rcl/include/rcl/subscription.h b/rcl/include/rcl/subscription.h index 77a2f52fd..cdae37626 100644 --- a/rcl/include/rcl/subscription.h +++ b/rcl/include/rcl/subscription.h @@ -630,10 +630,10 @@ rcl_subscription_can_loan_messages(const rcl_subscription_t * subscription); * [1] rmw implementation defined * * \param[in] subscription The subscription on which to set the callback - * \param[in] callback The callback to be called when new messages arrive + * \param[in] callback The callback to be called when new messages arrive, may be NULL * \param[in] user_data Given to the callback when called later, may be NULL * \return `RCL_RET_OK` if successful, or - * \return `RCL_RET_INVALID_ARGUMENT` if `subscription` or `callback` is NULL, or + * \return `RCL_RET_INVALID_ARGUMENT` if `subscription` is NULL, or * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation */ RCL_PUBLIC diff --git a/rcl/src/rcl/client.c b/rcl/src/rcl/client.c index 24f0d0c00..7cf54b35d 100644 --- a/rcl/src/rcl/client.c +++ b/rcl/src/rcl/client.c @@ -291,7 +291,7 @@ rcl_client_set_on_new_response_callback( // error state already set return RCL_RET_INVALID_ARGUMENT; } - RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_client_set_on_new_response_callback( client->impl->rmw_handle, callback, diff --git a/rcl/src/rcl/event.c b/rcl/src/rcl/event.c index dccee5254..6196442d1 100644 --- a/rcl/src/rcl/event.c +++ b/rcl/src/rcl/event.c @@ -228,7 +228,7 @@ rcl_event_set_callback( // error state already set return RCL_RET_INVALID_ARGUMENT; } - RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_event_set_callback( &event->impl->rmw_handle, callback, diff --git a/rcl/src/rcl/service.c b/rcl/src/rcl/service.c index fbdd81579..926a4437c 100644 --- a/rcl/src/rcl/service.c +++ b/rcl/src/rcl/service.c @@ -311,7 +311,7 @@ rcl_service_set_on_new_request_callback( // error state already set return RCL_RET_INVALID_ARGUMENT; } - RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_service_set_on_new_request_callback( service->impl->rmw_handle, callback, diff --git a/rcl/src/rcl/subscription.c b/rcl/src/rcl/subscription.c index 46986aa95..8972c2ea1 100644 --- a/rcl/src/rcl/subscription.c +++ b/rcl/src/rcl/subscription.c @@ -447,7 +447,7 @@ rcl_subscription_set_on_new_message_callback( // error state already set return RCL_RET_INVALID_ARGUMENT; } - RCL_CHECK_FOR_NULL_WITH_MSG(callback, "callback is invalid", return RCL_RET_INVALID_ARGUMENT); + return rmw_subscription_set_on_new_message_callback( subscription->impl->rmw_handle, callback, From 9a92d039977ec11e9e986baa38723013ca55898d Mon Sep 17 00:00:00 2001 From: Mauro Passerino Date: Mon, 5 Jul 2021 16:41:26 +0100 Subject: [PATCH 6/7] Add APIs to support actions on EventsExecutor Signed-off-by: Mauro Passerino --- rcl_action/include/rcl_action/action_client.h | 41 ++++++++++ rcl_action/include/rcl_action/action_server.h | 25 ++++++ rcl_action/src/rcl_action/action_client.c | 80 +++++++++++++++++++ rcl_action/src/rcl_action/action_server.c | 54 +++++++++++++ 4 files changed, 200 insertions(+) diff --git a/rcl_action/include/rcl_action/action_client.h b/rcl_action/include/rcl_action/action_client.h index 430d05e66..c1712c13b 100644 --- a/rcl_action/include/rcl_action/action_client.h +++ b/rcl_action/include/rcl_action/action_client.h @@ -22,6 +22,7 @@ extern "C" #include "rcl_action/types.h" #include "rcl_action/visibility_control.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/node.h" @@ -741,6 +742,46 @@ bool rcl_action_client_is_valid( const rcl_action_client_t * action_client); +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_client_set_goal_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_client_set_cancel_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_client_set_result_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_client_set_feedback_subscription_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_client_set_status_subscription_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data); + #ifdef __cplusplus } #endif diff --git a/rcl_action/include/rcl_action/action_server.h b/rcl_action/include/rcl_action/action_server.h index 79abff41f..d7e50dd8e 100644 --- a/rcl_action/include/rcl_action/action_server.h +++ b/rcl_action/include/rcl_action/action_server.h @@ -23,6 +23,7 @@ extern "C" #include "rcl_action/goal_handle.h" #include "rcl_action/types.h" #include "rcl_action/visibility_control.h" +#include "rcl/event_callback.h" #include "rcl/macros.h" #include "rcl/node.h" #include "rcl/time.h" @@ -930,6 +931,30 @@ RCL_WARN_UNUSED bool rcl_action_server_is_valid_except_context(const rcl_action_server_t * action_server); +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_goal_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_cancel_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data); + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_result_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data); + #ifdef __cplusplus } #endif diff --git a/rcl_action/src/rcl_action/action_client.c b/rcl_action/src/rcl_action/action_client.c index a03a61ec3..d999f1e01 100644 --- a/rcl_action/src/rcl_action/action_client.c +++ b/rcl_action/src/rcl_action/action_client.c @@ -649,6 +649,86 @@ rcl_action_client_wait_set_get_entities_ready( return RCL_RET_OK; } +rcl_ret_t +rcl_action_client_set_goal_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_client_is_valid(action_client)) { + return RCL_RET_ACTION_CLIENT_INVALID; + } + + return rcl_client_set_on_new_response_callback( + &action_client->impl->goal_client, + callback, + user_data); +} + +rcl_ret_t +rcl_action_client_set_cancel_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_client_is_valid(action_client)) { + return RCL_RET_ACTION_CLIENT_INVALID; + } + + return rcl_client_set_on_new_response_callback( + &action_client->impl->cancel_client, + callback, + user_data); +} + +rcl_ret_t +rcl_action_client_set_result_client_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_client_is_valid(action_client)) { + return RCL_RET_ACTION_CLIENT_INVALID; + } + + return rcl_client_set_on_new_response_callback( + &action_client->impl->result_client, + callback, + user_data); +} + +rcl_ret_t +rcl_action_client_set_feedback_subscription_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_client_is_valid(action_client)) { + return RCL_RET_ACTION_CLIENT_INVALID; + } + + return rcl_subscription_set_on_new_message_callback( + &action_client->impl->feedback_subscription, + callback, + user_data); +} + +rcl_ret_t +rcl_action_client_set_status_subscription_callback( + const rcl_action_client_t * action_client, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_client_is_valid(action_client)) { + return RCL_RET_ACTION_CLIENT_INVALID; + } + + return rcl_subscription_set_on_new_message_callback( + &action_client->impl->status_subscription, + callback, + user_data); +} + #ifdef __cplusplus } #endif diff --git a/rcl_action/src/rcl_action/action_server.c b/rcl_action/src/rcl_action/action_server.c index cbed688eb..278233517 100644 --- a/rcl_action/src/rcl_action/action_server.c +++ b/rcl_action/src/rcl_action/action_server.c @@ -1054,6 +1054,60 @@ rcl_action_server_wait_set_get_entities_ready( return RCL_RET_OK; } +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_goal_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_server_is_valid_except_context(action_server)) { + return RCL_RET_ACTION_SERVER_INVALID; + } + + return rcl_service_set_on_new_request_callback( + &action_server->impl->goal_service, + callback, + user_data); +} + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_result_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_server_is_valid_except_context(action_server)) { + return RCL_RET_ACTION_SERVER_INVALID; + } + + return rcl_service_set_on_new_request_callback( + &action_server->impl->result_service, + callback, + user_data); +} + +RCL_ACTION_PUBLIC +RCL_WARN_UNUSED +rcl_ret_t +rcl_action_server_set_cancel_service_callback( + const rcl_action_server_t * action_server, + rcl_event_callback_t callback, + const void * user_data) +{ + if (!rcl_action_server_is_valid_except_context(action_server)) { + return RCL_RET_ACTION_SERVER_INVALID; + } + + return rcl_service_set_on_new_request_callback( + &action_server->impl->cancel_service, + callback, + user_data); +} + #ifdef __cplusplus } #endif From 78f3829261fb92b1f20e424c7b7304056673cf2f Mon Sep 17 00:00:00 2001 From: William Woodall Date: Tue, 22 Feb 2022 21:29:22 -0800 Subject: [PATCH 7/7] fix messed up merge Signed-off-by: William Woodall --- rcl/include/rcl/service.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/rcl/include/rcl/service.h b/rcl/include/rcl/service.h index 664bed125..2461bd551 100644 --- a/rcl/include/rcl/service.h +++ b/rcl/include/rcl/service.h @@ -441,7 +441,6 @@ RCL_PUBLIC bool rcl_service_is_valid(const rcl_service_t * service); -<<<<<<< HEAD /// Get the actual qos settings of the service's request subscription. /** * Used to get the actual qos settings of the service's request subscription. @@ -494,12 +493,12 @@ RCL_WARN_UNUSED const rmw_qos_profile_t * rcl_service_response_publisher_get_actual_qos(const rcl_service_t * service); -/// Set the callback function for the event. +/// Set the on new request callback function for the service. /** * This API sets the callback function to be called whenever the - * event is notified about a new instance of the event. + * service is notified about a new request. * - * \sa rmw_event_set_callback for more details about this function. + * \sa rmw_service_set_on_new_request_callback for details about this function. * *
* Attribute | Adherence @@ -510,18 +509,18 @@ rcl_service_response_publisher_get_actual_qos(const rcl_service_t * service); * Lock-Free | Maybe [1] * [1] rmw implementation defined * - * \param[in] event The event on which to set the callback - * \param[in] callback The callback to be called when new events occur, may be NULL + * \param[in] service The service on which to set the callback + * \param[in] callback The callback to be called when new requests arrive, may be NULL * \param[in] user_data Given to the callback when called later, may be NULL * \return `RCL_RET_OK` if callback was set to the listener, or - * \return `RCL_RET_INVALID_ARGUMENT` if `event` is NULL, or + * \return `RCL_RET_INVALID_ARGUMENT` if `service` is NULL, or * \return `RCL_RET_UNSUPPORTED` if the API is not implemented in the dds implementation */ RCL_PUBLIC RCL_WARN_UNUSED rcl_ret_t -rcl_event_set_callback( - const rcl_event_t * event, +rcl_service_set_on_new_request_callback( + const rcl_service_t * service, rcl_event_callback_t callback, const void * user_data);