2525#include " hardware_interface/component_parser.hpp"
2626#include " hardware_interface/handle.hpp"
2727#include " hardware_interface/hardware_info.hpp"
28+ #include " hardware_interface/types/hardware_interface_emergency_stop_signal.hpp"
29+ #include " hardware_interface/types/hardware_interface_error_signals.hpp"
2830#include " hardware_interface/types/hardware_interface_return_values.hpp"
31+ #include " hardware_interface/types/hardware_interface_warning_signals.hpp"
2932#include " hardware_interface/types/lifecycle_state_names.hpp"
3033#include " lifecycle_msgs/msg/state.hpp"
3134#include " rclcpp/duration.hpp"
@@ -103,6 +106,7 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
103106 info_ = hardware_info;
104107 import_state_interface_descriptions (info_);
105108 import_command_interface_descriptions (info_);
109+ create_report_interfaces ();
106110 return CallbackReturn::SUCCESS;
107111 };
108112
@@ -134,6 +138,52 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
134138 }
135139 }
136140
141+ /* *
142+ * Creates all interfaces used for reporting emergency stop, warning and error messages.
143+ * The available report interfaces are: EMERGENCY_STOP_SIGNAL, ERROR_SIGNAL, ERROR_SIGNAL_MESSAGE,
144+ * WARNING_SIGNAL and WARNING_SIGNAL_MESSAGE. Where the <report_type>_MESSAGE hold the message for
145+ * the corresponding report signal.
146+ * The interfaces are named like <hardware_name>/<report_interface_type>. E.g. if hardware is
147+ * called joint_1 -> interface for WARNING_SIGNAL is called: joint_1/WARNING_SIGNAL
148+ */
149+ void create_report_interfaces ()
150+ {
151+ // EMERGENCY STOP
152+ InterfaceInfo emergency_interface_info;
153+ emergency_interface_info.name = hardware_interface::EMERGENCY_STOP_SIGNAL;
154+ emergency_interface_info.data_type = " bool" ;
155+ InterfaceDescription emergency_interface_descr (info_.name , emergency_interface_info);
156+ emergency_stop_ = std::make_shared<StateInterface>(emergency_interface_descr);
157+
158+ // ERROR
159+ // create error signal interface
160+ InterfaceInfo error_interface_info;
161+ error_interface_info.name = hardware_interface::ERROR_SIGNAL_INTERFACE_NAME;
162+ error_interface_info.data_type = " std::array<uint8_t>" ;
163+ InterfaceDescription error_interface_descr (info_.name , error_interface_info);
164+ error_signal_ = std::make_shared<StateInterface>(error_interface_descr);
165+ // create error signal report message interface
166+ InterfaceInfo error_msg_interface_info;
167+ error_msg_interface_info.name = hardware_interface::ERROR_SIGNAL_MESSAGE_INTERFACE_NAME;
168+ error_msg_interface_info.data_type = " std::array<std::string>" ;
169+ InterfaceDescription error_msg_interface_descr (info_.name , error_msg_interface_info);
170+ error_signal_message_ = std::make_shared<StateInterface>(error_msg_interface_descr);
171+
172+ // WARNING
173+ // create warning signal interface
174+ InterfaceInfo warning_interface_info;
175+ warning_interface_info.name = hardware_interface::WARNING_SIGNAL_INTERFACE_NAME;
176+ warning_interface_info.data_type = " std::array<uint8_t>" ;
177+ InterfaceDescription warning_interface_descr (info_.name , warning_interface_info);
178+ warning_signal_ = std::make_shared<StateInterface>(warning_interface_descr);
179+ // create warning signal report message interface
180+ InterfaceInfo warning_msg_interface_info;
181+ warning_msg_interface_info.name = hardware_interface::WARNING_SIGNAL_MESSAGE_INTERFACE_NAME;
182+ warning_msg_interface_info.data_type = " std::array<std::string>" ;
183+ InterfaceDescription warning_msg_interface_descr (info_.name , warning_msg_interface_info);
184+ warning_signal_message_ = std::make_shared<StateInterface>(warning_msg_interface_descr);
185+ }
186+
137187 // / Exports all state interfaces for this hardware interface.
138188 /* *
139189 * Old way of exporting the StateInterfaces. If a empty vector is returned then
@@ -207,6 +257,14 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
207257 actuator_states_.insert (std::make_pair (name, state_interface));
208258 state_interfaces.push_back (state_interface);
209259 }
260+
261+ // export warning signal interfaces
262+ state_interfaces.push_back (emergency_stop_);
263+ state_interfaces.push_back (error_signal_);
264+ state_interfaces.push_back (error_signal_message_);
265+ state_interfaces.push_back (warning_signal_);
266+ state_interfaces.push_back (warning_signal_message_);
267+
210268 return state_interfaces;
211269 }
212270
@@ -386,6 +444,35 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
386444 return actuator_commands_.at (interface_name)->get_value ();
387445 }
388446
447+ void set_emergency_stop (const double & emergency_stop)
448+ {
449+ emergency_stop_->set_value (emergency_stop);
450+ }
451+
452+ double get_emergency_stop () const { return emergency_stop_->get_value (); }
453+
454+ void set_error_code (const double & error_code) { error_signal_->set_value (error_code); }
455+
456+ double get_error_code () const { return error_signal_->get_value (); }
457+
458+ void set_error_message (const double & error_message)
459+ {
460+ error_signal_message_->set_value (error_message);
461+ }
462+
463+ double get_error_message () const { return error_signal_message_->get_value (); }
464+
465+ void set_warning_code (const double & warning_codes) { warning_signal_->set_value (warning_codes); }
466+
467+ double get_warning_code () const { return warning_signal_->get_value (); }
468+
469+ void set_warning_message (const double & error_message)
470+ {
471+ warning_signal_message_->set_value (error_message);
472+ }
473+
474+ double get_warning_message () const { return warning_signal_message_->get_value (); }
475+
389476protected:
390477 HardwareInfo info_;
391478 std::unordered_map<std::string, InterfaceDescription> joint_state_interfaces_;
@@ -394,6 +481,13 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
394481 std::unordered_map<std::string, InterfaceDescription> unlisted_state_interfaces_;
395482 std::unordered_map<std::string, InterfaceDescription> unlisted_command_interfaces_;
396483
484+ private:
485+ std::shared_ptr<StateInterface> emergency_stop_;
486+ std::shared_ptr<StateInterface> error_signal_;
487+ std::shared_ptr<StateInterface> error_signal_message_;
488+ std::shared_ptr<StateInterface> warning_signal_;
489+ std::shared_ptr<StateInterface> warning_signal_message_;
490+
397491 rclcpp_lifecycle::State lifecycle_state_;
398492
399493private:
0 commit comments