ros2_canopen master
C++ ROS CANopen Library
Loading...
Searching...
No Matches
lifecycle_manager.hpp
Go to the documentation of this file.
1// Copyright 2022 Harshavadan Deshpande
2// Christoph Hellmann Santos
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15#ifndef LIFECYCLE_DEVICE_MANAGER_NODE_HPP
16#define LIFECYCLE_DEVICE_MANAGER_NODE_HPP
17
18#include <chrono>
19#include <memory>
20#include <string>
21#include <thread>
22
23#include "lifecycle_msgs/msg/state.hpp"
24#include "lifecycle_msgs/msg/transition.hpp"
25#include "lifecycle_msgs/srv/change_state.hpp"
26#include "lifecycle_msgs/srv/get_state.hpp"
27//#include "std_srvs/srv/trigger.hpp"
28
29#include "rclcpp/rclcpp.hpp"
30#include "rclcpp_lifecycle/lifecycle_node.hpp"
31
33#include "canopen_interfaces/srv/co_node.hpp"
34
35using namespace std::chrono_literals;
36/*
37
38*/
39namespace ros2_canopen
40{
65class LifecycleManager : public rclcpp_lifecycle::LifecycleNode
66{
67public:
73 LifecycleManager(const rclcpp::NodeOptions & node_options)
74 : rclcpp_lifecycle::LifecycleNode("lifecycle_manager", node_options)
75 {
76 this->declare_parameter("container_name", "");
77 cbg_clients = this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
78 }
79
80 void init(std::shared_ptr<ros2_canopen::ConfigurationManager> config);
81
82protected:
83 rclcpp::CallbackGroup::SharedPtr cbg_clients;
84 std::shared_ptr<ros2_canopen::ConfigurationManager> config_;
85
95 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_configure(
96 const rclcpp_lifecycle::State & state);
97
107 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_activate(
108 const rclcpp_lifecycle::State & state);
109
119 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_deactivate(
120 const rclcpp_lifecycle::State & state);
121
130 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_cleanup(
131 const rclcpp_lifecycle::State & state);
132
141 rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_shutdown(
142 const rclcpp_lifecycle::State & state);
143
144 std::map<uint8_t, rclcpp::Client<lifecycle_msgs::srv::GetState>::SharedPtr>
146 std::map<uint8_t, rclcpp::Client<lifecycle_msgs::srv::ChangeState>::SharedPtr>
148 std::map<std::string, uint8_t> device_names_to_ids; // stores device_name and node_id
149
154 rclcpp::Client<canopen_interfaces::srv::CONode>::SharedPtr
156 rclcpp::Client<canopen_interfaces::srv::CONode>::SharedPtr
158
159 uint8_t master_id_;
160 std::string container_name_;
161
162protected:
163 template <typename FutureT, typename WaitTimeT>
164 std::future_status wait_for_result(FutureT & future, WaitTimeT time_to_wait)
165 {
166 auto end = std::chrono::steady_clock::now() + time_to_wait;
167 std::chrono::milliseconds wait_period(100);
168 std::future_status status = std::future_status::timeout;
169 do
170 {
171 auto now = std::chrono::steady_clock::now();
172 auto time_left = end - now;
173 if (time_left <= std::chrono::seconds(0))
174 {
175 break;
176 }
177 status = future.wait_for((time_left < wait_period) ? time_left : wait_period);
178 } while (rclcpp::ok() && status != std::future_status::ready);
179 return status;
180 }
181
189 virtual unsigned int get_state(uint8_t node_id, std::chrono::seconds time_out);
190
200 virtual bool change_state(uint8_t node_id, uint8_t transition, std::chrono::seconds time_out);
201
211 virtual bool bring_up_all();
212
222 virtual bool bring_down_all();
223
234 virtual bool bring_up_master();
235
246 virtual bool bring_down_master();
247
260 virtual bool bring_up_driver(std::string device_name);
261
274 virtual bool bring_down_driver(std::string device_name);
275
285 virtual bool load_from_config();
286};
287} // namespace ros2_canopen
288
289#endif
Lifecycle Device Manager Node.
Definition lifecycle_manager.hpp:66
virtual bool bring_down_driver(std::string device_name)
Brings down the driver with specified node_id.
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state)
Callback for the Deactivate Transition.
std::future_status wait_for_result(FutureT &future, WaitTimeT time_to_wait)
Definition lifecycle_manager.hpp:164
virtual bool bring_down_all()
Brings down master and all drivers.
std::map< std::string, uint8_t > device_names_to_ids
Definition lifecycle_manager.hpp:148
virtual bool bring_down_master()
Bring down master.
std::map< uint8_t, rclcpp::Client< lifecycle_msgs::srv::GetState >::SharedPtr > drivers_get_state_clients
stores node_id and get_state client
Definition lifecycle_manager.hpp:145
virtual bool bring_up_master()
Brings up master.
uint8_t master_id_
Stores master id.
Definition lifecycle_manager.hpp:159
rclcpp::CallbackGroup::SharedPtr cbg_clients
Definition lifecycle_manager.hpp:83
LifecycleManager(const rclcpp::NodeOptions &node_options)
Construct a new Lifecycle Device Manager Node object.
Definition lifecycle_manager.hpp:73
virtual unsigned int get_state(uint8_t node_id, std::chrono::seconds time_out)
Get the lifecycle state of a driver node.
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_activate(const rclcpp_lifecycle::State &state)
Callback for the Activate Transition.
virtual bool load_from_config()
Load information from configuration.
std::string container_name_
Stores name of the associated device_container.
Definition lifecycle_manager.hpp:160
std::shared_ptr< ros2_canopen::ConfigurationManager > config_
Definition lifecycle_manager.hpp:84
rclcpp::Client< canopen_interfaces::srv::CONode >::SharedPtr add_driver_client_
Service client object for adding a driver.
Definition lifecycle_manager.hpp:155
virtual bool bring_up_all()
Brings up master and all drivers.
void init(std::shared_ptr< ros2_canopen::ConfigurationManager > config)
virtual bool bring_up_driver(std::string device_name)
Brings up the drivers with specified node_id.
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state)
Callback for the Cleanup Transition.
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state)
Callback for the Shutdown Transition.
rclcpp::Client< canopen_interfaces::srv::CONode >::SharedPtr remove_driver_client_
Service client object for removing a driver.
Definition lifecycle_manager.hpp:157
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn on_configure(const rclcpp_lifecycle::State &state)
Callback for the Configure Transition.
virtual bool change_state(uint8_t node_id, uint8_t transition, std::chrono::seconds time_out)
Change the lifecycle state of a driver node.
std::map< uint8_t, rclcpp::Client< lifecycle_msgs::srv::ChangeState >::SharedPtr > drivers_change_state_clients
stores node_id and change_state client
Definition lifecycle_manager.hpp:147
Definition configuration_manager.hpp:28