ros2_canopen  master
C++ ROS CANopen Library
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 
35 using namespace std::chrono_literals;
36 /*
37 
38 */
39 namespace ros2_canopen
40 {
65 class LifecycleManager : public rclcpp_lifecycle::LifecycleNode
66 {
67 public:
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 
82 protected:
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 
162 protected:
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