ros2_canopen  master
C++ ROS CANopen Library
node_canopen_base_driver.hpp
Go to the documentation of this file.
1 #ifndef NODE_CANOPEN_BASE_DRIVER
2 #define NODE_CANOPEN_BASE_DRIVER
3 
6 #include "std_msgs/msg/string.hpp"
7 #include "std_srvs/srv/trigger.hpp"
8 
9 #include "canopen_interfaces/msg/co_data.hpp"
10 #include "canopen_interfaces/srv/co_read.hpp"
11 #include "canopen_interfaces/srv/co_write.hpp"
12 
13 namespace ros2_canopen
14 {
15 namespace node_interfaces
16 {
17 template <class NODETYPE>
18 class NodeCanopenBaseDriver : public NodeCanopenDriver<NODETYPE>
19 {
20  static_assert(
21  std::is_base_of<rclcpp::Node, NODETYPE>::value ||
22  std::is_base_of<rclcpp_lifecycle::LifecycleNode, NODETYPE>::value,
23  "NODETYPE must derive from rclcpp::Node or rclcpp_lifecycle::LifecycleNode");
24 
25 protected:
29  std::mutex driver_mutex_;
30  std::shared_ptr<ros2_canopen::LelyDriverBridge> lely_driver_;
31  uint32_t period_ms_;
32  bool polling_;
33 
34  // nmt state callback
35  std::function<void(canopen::NmtState, uint8_t)> nmt_state_cb_;
36  // rpdo callback
37  std::function<void(COData, uint8_t)> rpdo_cb_;
38  // emcy callback
39  std::function<void(COEmcy, uint8_t)> emcy_cb_;
40 
41  std::shared_ptr<ros2_canopen::SafeQueue<ros2_canopen::COEmcy>> emcy_queue_;
42  std::shared_ptr<ros2_canopen::SafeQueue<ros2_canopen::COData>> rpdo_queue_;
43  rclcpp::TimerBase::SharedPtr poll_timer_;
44  virtual void poll_timer_callback();
45  void nmt_listener();
46  virtual void on_nmt(canopen::NmtState nmt_state);
47  void rdpo_listener();
48  virtual void on_rpdo(COData data);
49  void emcy_listener();
50  virtual void on_emcy(COEmcy emcy);
51 
52 public:
53  NodeCanopenBaseDriver(NODETYPE * node);
54 
56  {
57  if (nmt_state_publisher_thread_.joinable())
58  {
60  }
61  if (rpdo_publisher_thread_.joinable())
62  {
64  }
65  }
66 
67  virtual void init(bool called_from_base);
68 
69  virtual void configure(bool called_from_base);
70 
71  virtual void activate(bool called_from_base);
72 
73  virtual void deactivate(bool called_from_base);
74 
75  virtual void cleanup(bool called_from_base);
76 
77  virtual void shutdown(bool called_from_base);
78 
79  virtual void add_to_master();
80 
81  virtual void remove_from_master();
82 
88  void register_nmt_state_cb(std::function<void(canopen::NmtState, uint8_t)> nmt_state_cb)
89  {
90  nmt_state_cb_ = std::move(nmt_state_cb);
91  }
92 
98  void register_rpdo_cb(std::function<void(COData, uint8_t)> rpdo_cb)
99  {
100  rpdo_cb_ = std::move(rpdo_cb);
101  }
102 
108  void register_emcy_cb(std::function<void(COEmcy, uint8_t)> emcy_cb)
109  {
110  emcy_cb_ = std::move(emcy_cb);
111  }
112 };
115 } // namespace node_interfaces
116 } // namespace ros2_canopen
117 
118 #endif
Definition: node_canopen_base_driver.hpp:19
uint32_t period_ms_
Definition: node_canopen_base_driver.hpp:31
virtual ~NodeCanopenBaseDriver()
Definition: node_canopen_base_driver.hpp:55
rclcpp::TimerBase::SharedPtr poll_timer_
Definition: node_canopen_base_driver.hpp:43
void register_emcy_cb(std::function< void(COEmcy, uint8_t)> emcy_cb)
Register a callback for EMCY.
Definition: node_canopen_base_driver.hpp:108
void rdpo_listener()
Definition: node_canopen_base_driver_impl.hpp:216
virtual void add_to_master()
Add the driver to master.
Definition: node_canopen_base_driver_impl.hpp:111
void nmt_listener()
Definition: node_canopen_base_driver_impl.hpp:172
virtual void configure(bool called_from_base)
Configure the driver.
std::thread nmt_state_publisher_thread_
Definition: node_canopen_base_driver.hpp:23
virtual void on_rpdo(COData data)
Definition: node_canopen_base_driver_impl.hpp:206
void register_nmt_state_cb(std::function< void(canopen::NmtState, uint8_t)> nmt_state_cb)
Register a callback for NMT state change.
Definition: node_canopen_base_driver.hpp:88
virtual void poll_timer_callback()
Definition: node_canopen_base_driver_impl.hpp:243
std::shared_ptr< ros2_canopen::SafeQueue< ros2_canopen::COEmcy > > emcy_queue_
Definition: node_canopen_base_driver.hpp:41
void register_rpdo_cb(std::function< void(COData, uint8_t)> rpdo_cb)
Register a callback for RPDO.
Definition: node_canopen_base_driver.hpp:98
NodeCanopenBaseDriver(NODETYPE *node)
Definition: node_canopen_base_driver_impl.hpp:9
std::function< void(COData, uint8_t)> rpdo_cb_
Definition: node_canopen_base_driver.hpp:37
std::thread emcy_publisher_thread_
Definition: node_canopen_base_driver.hpp:28
std::mutex driver_mutex_
Definition: node_canopen_base_driver.hpp:29
virtual void remove_from_master()
Remove the driver from master.
Definition: node_canopen_base_driver_impl.hpp:153
void emcy_listener()
Definition: node_canopen_base_driver_impl.hpp:290
std::thread rpdo_publisher_thread_
Definition: node_canopen_base_driver.hpp:27
std::shared_ptr< ros2_canopen::SafeQueue< ros2_canopen::COData > > rpdo_queue_
Definition: node_canopen_base_driver.hpp:42
std::function< void(canopen::NmtState, uint8_t)> nmt_state_cb_
Definition: node_canopen_base_driver.hpp:35
bool polling_
Definition: node_canopen_base_driver.hpp:32
std::function< void(COEmcy, uint8_t)> emcy_cb_
Definition: node_canopen_base_driver.hpp:39
std::shared_ptr< ros2_canopen::LelyDriverBridge > lely_driver_
Definition: node_canopen_base_driver.hpp:30
virtual void on_nmt(canopen::NmtState nmt_state)
Definition: node_canopen_base_driver_impl.hpp:201
virtual void on_emcy(COEmcy emcy)
Definition: node_canopen_base_driver_impl.hpp:211
Node Canopen Driver.
Definition: node_canopen_driver.hpp:46
void shutdown()
Shutdown the driver.
Definition: node_canopen_driver.hpp:323
void deactivate()
Deactivate the driver.
Definition: node_canopen_driver.hpp:251
void cleanup()
Cleanup the driver.
Definition: node_canopen_driver.hpp:291
void activate()
Activate the driver.
Definition: node_canopen_driver.hpp:209
void init()
Initialise the driver.
Definition: node_canopen_driver.hpp:113
NodeCanopenBaseDriver< rclcpp_lifecycle::LifecycleNode > NCBDLifecycleNode
Definition: node_canopen_base_driver.hpp:114
NodeCanopenBaseDriver< rclcpp::Node > NCBDNode
Definition: node_canopen_base_driver.hpp:113
Definition: configuration_manager.hpp:28
Definition: exchange.hpp:26
Definition: exchange.hpp:34