Skip to content

Commit b2d0e62

Browse files
committed
add parsing of handle type for initialization of variant and adjust most tests
1 parent 6a3ac65 commit b2d0e62

File tree

11 files changed

+999
-1329
lines changed

11 files changed

+999
-1329
lines changed

hardware_interface/include/hardware_interface/actuator_interface.hpp

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -159,27 +159,31 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
159159
// create error signal interface
160160
InterfaceInfo error_interface_info;
161161
error_interface_info.name = hardware_interface::ERROR_SIGNAL_INTERFACE_NAME;
162-
error_interface_info.data_type = "array<uint8_t>[32]";
162+
error_interface_info.data_type = "vector<uint8_t>";
163+
error_interface_info.size = 32;
163164
InterfaceDescription error_interface_descr(info_.name, error_interface_info);
164165
error_signal_ = std::make_shared<StateInterface>(error_interface_descr);
165166
// create error signal report message interface
166167
InterfaceInfo error_msg_interface_info;
167168
error_msg_interface_info.name = hardware_interface::ERROR_SIGNAL_MESSAGE_INTERFACE_NAME;
168-
error_msg_interface_info.data_type = "array<string>[32]";
169+
error_msg_interface_info.data_type = "vector<string>";
170+
error_msg_interface_info.size = 32;
169171
InterfaceDescription error_msg_interface_descr(info_.name, error_msg_interface_info);
170172
error_signal_message_ = std::make_shared<StateInterface>(error_msg_interface_descr);
171173

172174
// WARNING
173175
// create warning signal interface
174176
InterfaceInfo warning_interface_info;
175177
warning_interface_info.name = hardware_interface::WARNING_SIGNAL_INTERFACE_NAME;
176-
warning_interface_info.data_type = "array<int8_t>[32]";
178+
warning_interface_info.data_type = "vector<int8_t>";
179+
warning_interface_info.size = 32;
177180
InterfaceDescription warning_interface_descr(info_.name, warning_interface_info);
178181
warning_signal_ = std::make_shared<StateInterface>(warning_interface_descr);
179182
// create warning signal report message interface
180183
InterfaceInfo warning_msg_interface_info;
181184
warning_msg_interface_info.name = hardware_interface::WARNING_SIGNAL_MESSAGE_INTERFACE_NAME;
182-
warning_msg_interface_info.data_type = "array<string>[32]";
185+
warning_msg_interface_info.data_type = "vector<string>";
186+
warning_msg_interface_info.size = 32;
183187
InterfaceDescription warning_msg_interface_descr(info_.name, warning_msg_interface_info);
184188
warning_signal_message_ = std::make_shared<StateInterface>(warning_msg_interface_descr);
185189
}
@@ -451,49 +455,41 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
451455

452456
bool get_emergency_stop() const { return emergency_stop_->get_value<bool>(); }
453457

454-
void set_error_code(std::array<uint8_t, hardware_interface::error_signal_count> error_codes)
455-
{
456-
error_signal_->set_value(error_codes);
457-
}
458+
void set_error_code(std::vector<uint8_t> error_codes) { error_signal_->set_value(error_codes); }
458459

459-
std::array<uint8_t, hardware_interface::error_signal_count> get_error_code() const
460+
std::vector<uint8_t> get_error_code() const
460461
{
461-
return error_signal_->get_value<std::array<uint8_t, hardware_interface::error_signal_count>>();
462+
return error_signal_->get_value<std::vector<uint8_t>>();
462463
}
463464

464-
void set_error_message(
465-
std::array<std::string, hardware_interface::error_signal_count> error_messages)
465+
void set_error_message(std::vector<std::string> error_messages)
466466
{
467467
error_signal_message_->set_value(error_messages);
468468
}
469469

470-
std::array<std::string, hardware_interface::error_signal_count> get_error_message() const
470+
std::vector<std::string> get_error_message() const
471471
{
472-
return error_signal_message_
473-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
472+
return error_signal_message_->get_value<std::vector<std::string>>();
474473
}
475474

476-
void set_warning_code(std::array<int8_t, hardware_interface::warning_signal_count> warning_codes)
475+
void set_warning_code(std::vector<int8_t> warning_codes)
477476
{
478477
warning_signal_->set_value(warning_codes);
479478
}
480479

481-
std::array<int8_t, hardware_interface::warning_signal_count> get_warning_code() const
480+
std::vector<int8_t> get_warning_code() const
482481
{
483-
return warning_signal_
484-
->get_value<std::array<int8_t, hardware_interface::warning_signal_count>>();
482+
return warning_signal_->get_value<std::vector<int8_t>>();
485483
}
486484

487-
void set_warning_message(
488-
std::array<std::string, hardware_interface::warning_signal_count> error_message)
485+
void set_warning_message(std::vector<std::string> error_message)
489486
{
490487
warning_signal_message_->set_value(error_message);
491488
}
492489

493-
std::array<std::string, hardware_interface::error_signal_count> get_warning_message() const
490+
std::vector<std::string> get_warning_message() const
494491
{
495-
return warning_signal_message_
496-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
492+
return warning_signal_message_->get_value<std::vector<std::string>>();
497493
}
498494

499495
protected:

hardware_interface/include/hardware_interface/handle.hpp

Lines changed: 82 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,20 @@
1515
#ifndef HARDWARE_INTERFACE__HANDLE_HPP_
1616
#define HARDWARE_INTERFACE__HANDLE_HPP_
1717

18-
#include <array>
1918
#include <limits>
2019
#include <memory>
2120
#include <string>
2221
#include <type_traits>
2322
#include <utility>
2423
#include <variant>
24+
#include <vector>
2525

2626
#include "hardware_interface/hardware_info.hpp"
2727
#include "hardware_interface/macros.hpp"
28-
#include "hardware_interface/types/hardware_interface_error_signals.hpp"
29-
#include "hardware_interface/types/hardware_interface_warning_signals.hpp"
30-
#include "hardware_interface/visibility_control.h"
31-
namespace hardware_interface
32-
{
28+
#include "hardware_interface/types/handle_datatype.hpp"
3329

34-
using HANDLE_DATATYPE = std::variant<
35-
bool, double, hardware_interface::WARNING_SIGNALS, hardware_interface::ERROR_SIGNALS,
36-
hardware_interface::WARNING_MESSAGES>;
37-
38-
// Define a type trait for allowed types
39-
template <typename T>
40-
struct HANDLE_DATATYPE_TYPES : std::disjunction<
41-
std::is_same<T, bool>, std::is_same<T, double>,
42-
std::is_same<T, hardware_interface::WARNING_SIGNALS>,
43-
std::is_same<T, hardware_interface::ERROR_SIGNALS>,
44-
std::is_same<T, hardware_interface::WARNING_MESSAGES>>
30+
namespace hardware_interface
4531
{
46-
};
4732

4833
/// A handle used to get and set a value on a given interface.
4934
class Handle
@@ -56,30 +41,32 @@ class Handle
5641
double * value_ptr = nullptr)
5742
: prefix_name_(prefix_name), interface_name_(interface_name), value_ptr_(value_ptr)
5843
{
44+
// default to double
45+
value_ = std::numeric_limits<double>::quiet_NaN();
5946
}
6047

6148
explicit Handle(const InterfaceDescription & interface_description)
6249
: prefix_name_(interface_description.prefix_name),
6350
interface_name_(interface_description.interface_info.name)
6451
{
65-
// TODO(Manuel): implement this.
66-
// As soon as multiple datatypes are used in HANDLE_DATATYPE
67-
// we need to initialize according the type passed in interface description
68-
// value_ = std::numeric_limits<double>::quiet_NaN();
52+
init_handle_value(interface_description.interface_info);
6953
}
7054

7155
[[deprecated("Use InterfaceDescription for initializing the Interface")]]
7256

7357
explicit Handle(const std::string & interface_name)
7458
: interface_name_(interface_name), value_ptr_(nullptr)
7559
{
60+
// default to double
61+
value_ = std::numeric_limits<double>::quiet_NaN();
7662
}
7763

7864
[[deprecated("Use InterfaceDescription for initializing the Interface")]]
7965

8066
explicit Handle(const char * interface_name)
8167
: interface_name_(interface_name), value_ptr_(nullptr)
82-
{
68+
{ // default to double
69+
value_ = std::numeric_limits<double>::quiet_NaN();
8370
}
8471

8572
Handle(const Handle & other) = default;
@@ -121,6 +108,78 @@ class Handle
121108
}
122109

123110
protected:
111+
// used for the
112+
bool correct_vector_size(const size_t & expected, const size_t & actual)
113+
{
114+
return expected == actual;
115+
}
116+
117+
void init_handle_value(const InterfaceInfo & interface_info)
118+
{
119+
if (interface_info.data_type == "bool")
120+
{
121+
value_ = interface_info.initial_value.empty() ? false
122+
: (interface_info.initial_value == "true" ||
123+
interface_info.initial_value == "True");
124+
}
125+
else if (interface_info.data_type == "vector<int8_t>")
126+
{
127+
if (
128+
interface_info.size != 0 && hardware_interface::warning_signal_count != interface_info.size)
129+
{
130+
throw std::runtime_error(
131+
"The size:{" + std::to_string(interface_info.size) + "} for data_type{" +
132+
interface_info.data_type + "} for the InterfaceInfo with name:{" + interface_info.name +
133+
"} does not equal the expected size:{" +
134+
std::to_string(hardware_interface::warning_signal_count) + "}.");
135+
}
136+
value_ = std::vector<int8_t>(hardware_interface::warning_signal_count, 0);
137+
}
138+
else if (interface_info.data_type == "vector<uint8_t>")
139+
{
140+
if (interface_info.size != 0 && hardware_interface::error_signal_count != interface_info.size)
141+
{
142+
throw std::runtime_error(
143+
"The size:{" + std::to_string(interface_info.size) + "} for data_type{" +
144+
interface_info.data_type + "} for the InterfaceInfo with name:{" + interface_info.name +
145+
"} does not equal the expected size:{" +
146+
std::to_string(hardware_interface::error_signal_count) + "}.");
147+
}
148+
149+
value_ = std::vector<uint8_t>(hardware_interface::error_signal_count, 0);
150+
}
151+
else if (interface_info.data_type == "vector<string>")
152+
{
153+
if (
154+
interface_info.size != 0 && hardware_interface::warning_signal_count != interface_info.size)
155+
{
156+
throw std::runtime_error(
157+
"The size:{" + std::to_string(interface_info.size) + "} for data_type{" +
158+
interface_info.data_type + "} for the InterfaceInfo with name:{" + interface_info.name +
159+
"} does not equal the expected size:{" +
160+
std::to_string(hardware_interface::warning_signal_count) + "}.");
161+
}
162+
163+
value_ = std::vector<std::string>(hardware_interface::warning_signal_count, "");
164+
}
165+
// Default for empty is double
166+
else if (interface_info.data_type.empty() || interface_info.data_type == "double")
167+
{
168+
value_ = interface_info.initial_value.empty() ? std::numeric_limits<double>::quiet_NaN()
169+
: std::stod(interface_info.initial_value);
170+
}
171+
// If not empty and it belongs to none of the above types, we still want to throw as there might
172+
// be a typo in the data_type like "bol" or user wants some unsupported type
173+
else
174+
{
175+
throw std::runtime_error(
176+
"The data_type:{" + interface_info.data_type + "} for the InterfaceInfo with name:{" +
177+
interface_info.name +
178+
"} is not supported for Handles. Supported data_types are: bool, double, vector<int8_t>, "
179+
"vector<uint8_t> and vector<string>.");
180+
}
181+
}
182+
124183
std::string prefix_name_;
125184
std::string interface_name_;
126185
HANDLE_DATATYPE value_;

hardware_interface/include/hardware_interface/hardware_info.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,17 @@ namespace hardware_interface
2727
*/
2828
struct InterfaceInfo
2929
{
30+
// Add default constructor, so that e.g. size is initialized to sensible value
31+
InterfaceInfo()
32+
{
33+
// cpp_lint complains about min and max include otherwise
34+
name = "";
35+
min = "";
36+
max = "";
37+
initial_value = "";
38+
data_type = "";
39+
size = 0;
40+
}
3041
/**
3142
* Name of the command interfaces that can be set, e.g. "position", "velocity", etc.
3243
* Used by joints and GPIOs.

hardware_interface/include/hardware_interface/sensor_interface.hpp

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -136,27 +136,31 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
136136
// create error signal interface
137137
InterfaceInfo error_interface_info;
138138
error_interface_info.name = hardware_interface::ERROR_SIGNAL_INTERFACE_NAME;
139-
error_interface_info.data_type = "array<uint8_t>[32]";
139+
error_interface_info.data_type = "vector<uint8_t>";
140+
error_interface_info.size = 32;
140141
InterfaceDescription error_interface_descr(info_.name, error_interface_info);
141142
error_signal_ = std::make_shared<StateInterface>(error_interface_descr);
142143
// create error signal report message interface
143144
InterfaceInfo error_msg_interface_info;
144145
error_msg_interface_info.name = hardware_interface::ERROR_SIGNAL_MESSAGE_INTERFACE_NAME;
145-
error_msg_interface_info.data_type = "array<string>[32]";
146+
error_msg_interface_info.data_type = "vector<string>";
147+
error_msg_interface_info.size = 32;
146148
InterfaceDescription error_msg_interface_descr(info_.name, error_msg_interface_info);
147149
error_signal_message_ = std::make_shared<StateInterface>(error_msg_interface_descr);
148150

149151
// WARNING
150152
// create warning signal interface
151153
InterfaceInfo warning_interface_info;
152154
warning_interface_info.name = hardware_interface::WARNING_SIGNAL_INTERFACE_NAME;
153-
warning_interface_info.data_type = "array<int8_t>[32]";
155+
warning_interface_info.data_type = "vector<int8_t>";
156+
warning_interface_info.size = 32;
154157
InterfaceDescription warning_interface_descr(info_.name, warning_interface_info);
155158
warning_signal_ = std::make_shared<StateInterface>(warning_interface_descr);
156159
// create warning signal report message interface
157160
InterfaceInfo warning_msg_interface_info;
158161
warning_msg_interface_info.name = hardware_interface::WARNING_SIGNAL_MESSAGE_INTERFACE_NAME;
159-
warning_msg_interface_info.data_type = "array<string>[32]";
162+
warning_msg_interface_info.data_type = "vector<string>";
163+
warning_msg_interface_info.size = 32;
160164
InterfaceDescription warning_msg_interface_descr(info_.name, warning_msg_interface_info);
161165
warning_signal_message_ = std::make_shared<StateInterface>(warning_msg_interface_descr);
162166
}
@@ -285,49 +289,41 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
285289
return sensor_states_.at(interface_name)->get_value<double>();
286290
}
287291

288-
void set_error_code(std::array<uint8_t, hardware_interface::error_signal_count> error_codes)
289-
{
290-
error_signal_->set_value(error_codes);
291-
}
292+
void set_error_code(std::vector<uint8_t> error_codes) { error_signal_->set_value(error_codes); }
292293

293-
std::array<uint8_t, hardware_interface::error_signal_count> get_error_code() const
294+
std::vector<uint8_t> get_error_code() const
294295
{
295-
return error_signal_->get_value<std::array<uint8_t, hardware_interface::error_signal_count>>();
296+
return error_signal_->get_value<std::vector<uint8_t>>();
296297
}
297298

298-
void set_error_message(
299-
std::array<std::string, hardware_interface::error_signal_count> error_messages)
299+
void set_error_message(std::vector<std::string> error_messages)
300300
{
301301
error_signal_message_->set_value(error_messages);
302302
}
303303

304-
std::array<std::string, hardware_interface::error_signal_count> get_error_message() const
304+
std::vector<std::string> get_error_message() const
305305
{
306-
return error_signal_message_
307-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
306+
return error_signal_message_->get_value<std::vector<std::string>>();
308307
}
309308

310-
void set_warning_code(std::array<int8_t, hardware_interface::warning_signal_count> warning_codes)
309+
void set_warning_code(std::vector<int8_t> warning_codes)
311310
{
312311
warning_signal_->set_value(warning_codes);
313312
}
314313

315-
std::array<int8_t, hardware_interface::warning_signal_count> get_warning_code() const
314+
std::vector<int8_t> get_warning_code() const
316315
{
317-
return warning_signal_
318-
->get_value<std::array<int8_t, hardware_interface::warning_signal_count>>();
316+
return warning_signal_->get_value<std::vector<int8_t>>();
319317
}
320318

321-
void set_warning_message(
322-
std::array<std::string, hardware_interface::warning_signal_count> error_message)
319+
void set_warning_message(std::vector<std::string> error_message)
323320
{
324321
warning_signal_message_->set_value(error_message);
325322
}
326323

327-
std::array<std::string, hardware_interface::error_signal_count> get_warning_message() const
324+
std::vector<std::string> get_warning_message() const
328325
{
329-
return warning_signal_message_
330-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
326+
return warning_signal_message_->get_value<std::vector<std::string>>();
331327
}
332328

333329
protected:

0 commit comments

Comments
 (0)