17 #include <unordered_map>
22 #include "scheduler.hpp"
23 #include "timer_manager.hpp"
24 #include <rclcpp/executors/executor_entities_collection.hpp>
30 namespace cbg_executor
32 template<
class EntityType_T>
36 const std::shared_ptr<EntityType_T> & shr_ptr,
37 const std::function<
void(
const std::shared_ptr<EntityType_T> & ptr)> & destruction_callback)
40 destruction_callback(destruction_callback)
46 std::shared_ptr<EntityType_T> shr_ptr = executable.lock();
48 destruction_callback(shr_ptr);
52 std::weak_ptr<EntityType_T> executable;
58 std::function<void(
const std::shared_ptr<EntityType_T> & ptr)> destruction_callback;
64 : guard_condition(std::move(gc)), handle_guard_condition_fun(std::move(fun))
68 rclcpp::GuardCondition::SharedPtr guard_condition;
71 std::function<void(
void)> handle_guard_condition_fun;
74 template<
class EntityType_T>
79 std::unordered_map<const EntityType_T *, std::unique_ptr<CacheType>> entities;
83 const std::vector<std::shared_ptr<EntityType_T>> & entityList,
84 const std::function<
void(
const std::shared_ptr<EntityType_T> &)> & on_add,
85 const std::function<
void(
const std::shared_ptr<EntityType_T> &)> & on_remove)
87 std::unordered_map<const EntityType_T *, std::unique_ptr<CacheType>> nextEntities;
88 for(
const std::shared_ptr<EntityType_T> & shr_ptr : entityList) {
89 auto it = entities.find(shr_ptr.get());
90 if(it != entities.end()) {
91 nextEntities.insert(std::move(entities.extract(it)));
94 nextEntities.emplace(std::make_pair(shr_ptr.get(),
95 std::make_unique<CacheType>(shr_ptr, on_remove)));
101 entities.swap(nextEntities);
117 const rclcpp::CallbackGroup::SharedPtr & callback_group)
118 : callback_group_weak_ptr(callback_group),
119 scheduler_cbg_handle(*scheduler.add_callback_group(callback_group)),
120 timer_manager(timer_manager)
122 auto cbg_gc = callback_group->get_notify_guard_condition();
129 cbg_gc, [&scheduler]() {
142 std::vector<GuardConditionWithFunction> guard_conditions;
144 rclcpp::CallbackGroup::WeakPtr callback_group_weak_ptr;
151 for (
const auto & gc_ref : guard_conditions) {
152 gc_ref.guard_condition->set_on_trigger_callback(
nullptr);
155 auto cbg_shr_ptr = callback_group_weak_ptr.lock();
160 const auto clear_sub_cb = [](
const rclcpp::SubscriptionBase::SharedPtr & s) {
161 s->clear_on_new_message_callback();
163 const auto clear_timer_cb = [
this](
const rclcpp::TimerBase::SharedPtr & s) {
164 timer_manager.remove_timer(s);
166 const auto clear_client_cb = [](
const rclcpp::ClientBase::SharedPtr & s) {
167 s->clear_on_new_response_callback();
169 const auto clear_service_cb = [](
const rclcpp::ServiceBase::SharedPtr & s) {
170 s->clear_on_new_request_callback();
172 const auto clear_waitable_cb = [](
const rclcpp::Waitable::SharedPtr & s) {
173 s->clear_on_ready_callback();
177 cbg_shr_ptr->collect_all_ptrs(clear_sub_cb, clear_service_cb, clear_client_cb, clear_timer_cb,
180 if(cbg_shr_ptr->get_notify_guard_condition()) {
181 cbg_shr_ptr->get_notify_guard_condition()->set_on_trigger_callback(
nullptr);
187 timers_cache.clear();
188 subscribers_cache.clear();
189 clients_cache.clear();
190 services_cache.clear();
191 waitables_cache.clear();
195 bool regenerate_events()
197 rclcpp::CallbackGroup::SharedPtr callback_group = callback_group_weak_ptr.lock();
199 if(!callback_group) {
204 std::vector<rclcpp::TimerBase::SharedPtr> timers;
205 std::vector<rclcpp::SubscriptionBase::SharedPtr> subscribers;
206 std::vector<rclcpp::ClientBase::SharedPtr> clients;
207 std::vector<rclcpp::ServiceBase::SharedPtr> services;
208 std::vector<rclcpp::Waitable::SharedPtr> waitables;
211 const size_t max_size = callback_group->size();
212 timers.reserve(max_size);
213 subscribers.reserve(max_size);
214 clients.reserve(max_size);
215 services.reserve(max_size);
216 waitables.reserve(max_size);
218 const auto add_sub = [&subscribers](
const rclcpp::SubscriptionBase::SharedPtr & s) {
219 subscribers.push_back(s);
221 const auto add_timer = [&timers](
const rclcpp::TimerBase::SharedPtr & s) {
224 const auto add_client = [&clients](
const rclcpp::ClientBase::SharedPtr & s) {
225 clients.push_back(s);
227 const auto add_service = [&services](
const rclcpp::ServiceBase::SharedPtr & s) {
228 services.push_back(s);
230 const auto add_waitable = [&waitables](
const rclcpp::Waitable::SharedPtr & s) {
231 waitables.push_back(s);
235 callback_group->collect_all_ptrs(add_sub, add_service, add_client, add_timer, add_waitable);
237 timers_cache.update(timers,
238 [
this](
const rclcpp::TimerBase::SharedPtr & s) {
239 timer_manager.add_timer(s, scheduler_cbg_handle.get_ready_callback_for_entity(s));
241 [
this](
const rclcpp::TimerBase::SharedPtr & s) {
242 timer_manager.remove_timer(s);
245 subscribers_cache.update(subscribers,
246 [
this](
const rclcpp::SubscriptionBase::SharedPtr & s) {
247 s->set_on_new_message_callback(
248 scheduler_cbg_handle.get_ready_callback_for_entity(s));
250 [] (
const rclcpp::SubscriptionBase::SharedPtr & shr_ptr) {
251 shr_ptr->clear_on_new_message_callback();
254 clients_cache.update(clients,
255 [
this](
const rclcpp::ClientBase::SharedPtr & s) {
256 s->set_on_new_response_callback(
257 scheduler_cbg_handle.get_ready_callback_for_entity(s));
259 [] (
const rclcpp::ClientBase::SharedPtr & shr_ptr) {
260 shr_ptr->clear_on_new_response_callback();
262 services_cache.update(services,
263 [
this](
const rclcpp::ServiceBase::SharedPtr & s) {
264 s->set_on_new_request_callback(
265 scheduler_cbg_handle.get_ready_callback_for_entity(s));
267 [] (
const rclcpp::ServiceBase::SharedPtr & shr_ptr) {
268 shr_ptr->clear_on_new_request_callback();
270 waitables_cache.update(waitables,
271 [
this](
const rclcpp::Waitable::SharedPtr & s) {
272 s->set_on_ready_callback(
273 scheduler_cbg_handle.get_ready_callback_for_entity(s));
280 [] (
const rclcpp::Waitable::SharedPtr & s) {
281 s->clear_on_ready_callback();
295 rclcpp::GuardCondition::SharedPtr ptr,
296 std::function<
void(
void)> fun)
298 auto & new_entry = guard_conditions.emplace_back(std::move(ptr), std::move(fun));
300 if (new_entry.handle_guard_condition_fun) {
301 new_entry.guard_condition->set_on_trigger_callback(
303 new_entry.handle_guard_condition_fun)));
Versions of rosidl_typesupport_cpp::get_message_type_support_handle that handle adapted types.
void add_guard_condition_event(rclcpp::GuardCondition::SharedPtr ptr, std::function< void(void)> fun)