32 using Deleter = std::function<void(
void)>;
40 : command_interface_(*command_interface),
41 interface_name_(command_interface->get_name()),
42 deleter_(std::forward<Deleter>(deleter))
52 auto logger = rclcpp::get_logger(interface_name_);
53 RCLCPP_WARN_EXPRESSION(
55 (get_value_statistics_.failed_counter > 0 || get_value_statistics_.timeout_counter > 0),
56 "LoanedCommandInterface %s has %u (%.4f %%) timeouts and %u (~ %.4f %%) missed calls out of "
58 interface_name_.c_str(), get_value_statistics_.timeout_counter,
59 (get_value_statistics_.timeout_counter * 100.0) / get_value_statistics_.total_counter,
60 get_value_statistics_.failed_counter,
61 (get_value_statistics_.failed_counter * 100.0) / get_value_statistics_.total_counter,
62 get_value_statistics_.total_counter);
63 RCLCPP_WARN_EXPRESSION(
65 (set_value_statistics_.failed_counter > 0 || set_value_statistics_.timeout_counter > 0),
66 "LoanedCommandInterface %s has %u (%.4f %%) timeouts and %u (~ %.4f %%) missed calls out of "
68 interface_name_.c_str(), set_value_statistics_.timeout_counter,
69 (set_value_statistics_.timeout_counter * 100.0) / set_value_statistics_.total_counter,
70 set_value_statistics_.failed_counter,
71 (set_value_statistics_.failed_counter * 100.0) / set_value_statistics_.total_counter,
72 set_value_statistics_.total_counter);
79 const std::string & get_name()
const {
return command_interface_.get_name(); }
81 const std::string & get_interface_name()
const {
return command_interface_.get_interface_name(); }
83 const std::string & get_prefix_name()
const {
return command_interface_.get_prefix_name(); }
100 template <
typename T>
101 [[nodiscard]]
bool set_value(
const T & value,
unsigned int max_tries = 10)
103 unsigned int nr_tries = 0;
104 ++set_value_statistics_.total_counter;
107 ++set_value_statistics_.failed_counter;
109 if (nr_tries == max_tries)
111 ++set_value_statistics_.timeout_counter;
114 std::this_thread::yield();
120 "Use std::optional<T> get_optional() instead to retrieve the value. This method will be "
121 "removed by the ROS 2 Lyrical Luth release.")]]
122 double get_value()
const
125 if (opt_value.has_value())
127 return opt_value.value();
131 return std::numeric_limits<double>::quiet_NaN();
149 template <
typename T =
double>
150 [[nodiscard]] std::optional<T>
get_optional(
unsigned int max_tries = 10)
const
152 unsigned int nr_tries = 0;
155 ++get_value_statistics_.total_counter;
156 const std::optional<T> data = command_interface_.
get_optional<T>();
157 if (data.has_value())
161 ++get_value_statistics_.failed_counter;
163 std::this_thread::yield();
164 }
while (nr_tries < max_tries);
166 ++get_value_statistics_.timeout_counter;
185 std::string interface_name_;
188 struct HandleRTStatistics
190 unsigned int total_counter = 0;
191 unsigned int failed_counter = 0;
192 unsigned int timeout_counter = 0;
194 mutable HandleRTStatistics get_value_statistics_;
195 HandleRTStatistics set_value_statistics_;