Skip to content

Commit 66a2398

Browse files
author
Alberto Soragna
committed
Add RMW listener APIs
1 parent 37ee1ff commit 66a2398

12 files changed

+128
-0
lines changed

rclcpp/include/rclcpp/client.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,12 @@ class ClientBase
150150
bool
151151
exchange_in_use_by_wait_set_state(bool in_use_state);
152152

153+
RCLCPP_PUBLIC
154+
void
155+
set_listener_callback(
156+
rmw_listener_callback_t callback,
157+
const void * user_data) const;
158+
153159
protected:
154160
RCLCPP_DISABLE_COPY(ClientBase)
155161

rclcpp/include/rclcpp/experimental/subscription_intra_process_base.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ class SubscriptionIntraProcessBase : public rclcpp::Waitable
7474
rmw_qos_profile_t
7575
get_actual_qos() const;
7676

77+
RCLCPP_PUBLIC
78+
void
79+
set_listener_callback(
80+
rmw_listener_callback_t callback,
81+
const void * user_data) const override;
82+
7783
protected:
7884
std::recursive_mutex reentrant_mutex_;
7985
rcl_guard_condition_t gc_;

rclcpp/include/rclcpp/qos_event.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ class QOSEventHandlerBase : public Waitable
102102
bool
103103
is_ready(rcl_wait_set_t * wait_set) override;
104104

105+
RCLCPP_PUBLIC
106+
void
107+
set_listener_callback(
108+
rmw_listener_callback_t callback,
109+
const void * user_data) const override;
110+
105111
protected:
106112
rcl_event_t event_handle_;
107113
size_t wait_set_event_index_;

rclcpp/include/rclcpp/service.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ class ServiceBase
121121
bool
122122
exchange_in_use_by_wait_set_state(bool in_use_state);
123123

124+
RCLCPP_PUBLIC
125+
void
126+
set_listener_callback(
127+
rmw_listener_callback_t callback,
128+
const void * user_data) const;
129+
124130
protected:
125131
RCLCPP_DISABLE_COPY(ServiceBase)
126132

rclcpp/include/rclcpp/subscription_base.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,12 @@ class SubscriptionBase : public std::enable_shared_from_this<SubscriptionBase>
263263
bool
264264
exchange_in_use_by_wait_set_state(void * pointer_to_subscription_part, bool in_use_state);
265265

266+
RCLCPP_PUBLIC
267+
void
268+
set_listener_callback(
269+
rmw_listener_callback_t callback,
270+
const void * user_data) const;
271+
266272
protected:
267273
template<typename EventCallbackT>
268274
void

rclcpp/include/rclcpp/waitable.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,13 @@ class Waitable
203203
bool
204204
exchange_in_use_by_wait_set_state(bool in_use_state);
205205

206+
RCLCPP_PUBLIC
207+
virtual
208+
void
209+
set_listener_callback(
210+
rmw_listener_callback_t callback,
211+
const void * user_data) const;
212+
206213
private:
207214
std::atomic<bool> in_use_by_wait_set_{false};
208215
}; // class Waitable

rclcpp/src/rclcpp/client.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,18 @@ ClientBase::exchange_in_use_by_wait_set_state(bool in_use_state)
198198
{
199199
return in_use_by_wait_set_.exchange(in_use_state);
200200
}
201+
202+
void
203+
ClientBase::set_listener_callback(
204+
rmw_listener_callback_t callback,
205+
const void * user_data) const
206+
{
207+
rcl_ret_t ret = rcl_client_set_listener_callback(
208+
client_handle_.get(),
209+
callback,
210+
user_data);
211+
212+
if (RCL_RET_OK != ret) {
213+
throw std::runtime_error("Couldn't set listener callback to client");
214+
}
215+
}

rclcpp/src/rclcpp/qos_event.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,20 @@ QOSEventHandlerBase::is_ready(rcl_wait_set_t * wait_set)
6868
return wait_set->events[wait_set_event_index_] == &event_handle_;
6969
}
7070

71+
void
72+
QOSEventHandlerBase::set_listener_callback(
73+
rmw_listener_callback_t callback,
74+
const void * user_data) const
75+
{
76+
rcl_ret_t ret = rcl_event_set_listener_callback(
77+
&event_handle_,
78+
callback,
79+
user_data,
80+
false /* Discard previous events */);
81+
82+
if (RCL_RET_OK != ret) {
83+
throw std::runtime_error("Couldn't set listener callback to QOSEventHandlerBase");
84+
}
85+
}
86+
7187
} // namespace rclcpp

rclcpp/src/rclcpp/service.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,18 @@ ServiceBase::exchange_in_use_by_wait_set_state(bool in_use_state)
8484
{
8585
return in_use_by_wait_set_.exchange(in_use_state);
8686
}
87+
88+
void
89+
ServiceBase::set_listener_callback(
90+
rmw_listener_callback_t callback,
91+
const void * user_data) const
92+
{
93+
rcl_ret_t ret = rcl_service_set_listener_callback(
94+
service_handle_.get(),
95+
callback,
96+
user_data);
97+
98+
if (RCL_RET_OK != ret) {
99+
throw std::runtime_error("Couldn't set listener callback to service");
100+
}
101+
}

rclcpp/src/rclcpp/subscription_base.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,3 +288,18 @@ SubscriptionBase::exchange_in_use_by_wait_set_state(
288288
}
289289
throw std::runtime_error("given pointer_to_subscription_part does not match any part");
290290
}
291+
292+
void
293+
SubscriptionBase::set_listener_callback(
294+
rmw_listener_callback_t callback,
295+
const void * user_data) const
296+
{
297+
rcl_ret_t ret = rcl_subscription_set_listener_callback(
298+
subscription_handle_.get(),
299+
callback,
300+
user_data);
301+
302+
if (RCL_RET_OK != ret) {
303+
throw std::runtime_error("Couldn't set listener callback to subscription");
304+
}
305+
}

rclcpp/src/rclcpp/subscription_intra_process_base.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,19 @@ SubscriptionIntraProcessBase::get_actual_qos() const
3636
{
3737
return qos_profile_;
3838
}
39+
40+
void
41+
SubscriptionIntraProcessBase::set_listener_callback(
42+
rmw_listener_callback_t callback,
43+
const void * user_data) const
44+
{
45+
rcl_ret_t ret = rcl_guard_condition_set_listener_callback(
46+
&gc_,
47+
callback,
48+
user_data,
49+
true /*Use previous events*/);
50+
51+
if (RCL_RET_OK != ret) {
52+
throw std::runtime_error("Couldn't set guard condition listener callback");
53+
}
54+
}

rclcpp/src/rclcpp/waitable.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#include <stdexcept>
16+
1517
#include "rclcpp/waitable.hpp"
1618

1719
using rclcpp::Waitable;
@@ -57,3 +59,15 @@ Waitable::exchange_in_use_by_wait_set_state(bool in_use_state)
5759
{
5860
return in_use_by_wait_set_.exchange(in_use_state);
5961
}
62+
63+
void
64+
Waitable::set_listener_callback(
65+
rmw_listener_callback_t callback,
66+
const void * user_data) const
67+
{
68+
(void)callback;
69+
(void)user_data;
70+
71+
throw std::runtime_error(
72+
"Custom waitables should override set_listener_callback() if they want to use RMW listeners");
73+
}

0 commit comments

Comments
 (0)