Skip to content

Commit f92a4c9

Browse files
committed
add parsing of handle type for initialization of variant and adjust most tests
1 parent 1187a90 commit f92a4c9

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
}
@@ -418,49 +422,41 @@ class ActuatorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNod
418422

419423
bool get_emergency_stop() const { return emergency_stop_->get_value<bool>(); }
420424

421-
void set_error_code(std::array<uint8_t, hardware_interface::error_signal_count> error_codes)
422-
{
423-
error_signal_->set_value(error_codes);
424-
}
425+
void set_error_code(std::vector<uint8_t> error_codes) { error_signal_->set_value(error_codes); }
425426

426-
std::array<uint8_t, hardware_interface::error_signal_count> get_error_code() const
427+
std::vector<uint8_t> get_error_code() const
427428
{
428-
return error_signal_->get_value<std::array<uint8_t, hardware_interface::error_signal_count>>();
429+
return error_signal_->get_value<std::vector<uint8_t>>();
429430
}
430431

431-
void set_error_message(
432-
std::array<std::string, hardware_interface::error_signal_count> error_messages)
432+
void set_error_message(std::vector<std::string> error_messages)
433433
{
434434
error_signal_message_->set_value(error_messages);
435435
}
436436

437-
std::array<std::string, hardware_interface::error_signal_count> get_error_message() const
437+
std::vector<std::string> get_error_message() const
438438
{
439-
return error_signal_message_
440-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
439+
return error_signal_message_->get_value<std::vector<std::string>>();
441440
}
442441

443-
void set_warning_code(std::array<int8_t, hardware_interface::warning_signal_count> warning_codes)
442+
void set_warning_code(std::vector<int8_t> warning_codes)
444443
{
445444
warning_signal_->set_value(warning_codes);
446445
}
447446

448-
std::array<int8_t, hardware_interface::warning_signal_count> get_warning_code() const
447+
std::vector<int8_t> get_warning_code() const
449448
{
450-
return warning_signal_
451-
->get_value<std::array<int8_t, hardware_interface::warning_signal_count>>();
449+
return warning_signal_->get_value<std::vector<int8_t>>();
452450
}
453451

454-
void set_warning_message(
455-
std::array<std::string, hardware_interface::warning_signal_count> error_message)
452+
void set_warning_message(std::vector<std::string> error_message)
456453
{
457454
warning_signal_message_->set_value(error_message);
458455
}
459456

460-
std::array<std::string, hardware_interface::error_signal_count> get_warning_message() const
457+
std::vector<std::string> get_warning_message() const
461458
{
462-
return warning_signal_message_
463-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
459+
return warning_signal_message_->get_value<std::vector<std::string>>();
464460
}
465461

466462
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
}
@@ -268,49 +272,41 @@ class SensorInterface : public rclcpp_lifecycle::node_interfaces::LifecycleNodeI
268272
return sensor_states_.at(interface_name)->get_value<double>();
269273
}
270274

271-
void set_error_code(std::array<uint8_t, hardware_interface::error_signal_count> error_codes)
272-
{
273-
error_signal_->set_value(error_codes);
274-
}
275+
void set_error_code(std::vector<uint8_t> error_codes) { error_signal_->set_value(error_codes); }
275276

276-
std::array<uint8_t, hardware_interface::error_signal_count> get_error_code() const
277+
std::vector<uint8_t> get_error_code() const
277278
{
278-
return error_signal_->get_value<std::array<uint8_t, hardware_interface::error_signal_count>>();
279+
return error_signal_->get_value<std::vector<uint8_t>>();
279280
}
280281

281-
void set_error_message(
282-
std::array<std::string, hardware_interface::error_signal_count> error_messages)
282+
void set_error_message(std::vector<std::string> error_messages)
283283
{
284284
error_signal_message_->set_value(error_messages);
285285
}
286286

287-
std::array<std::string, hardware_interface::error_signal_count> get_error_message() const
287+
std::vector<std::string> get_error_message() const
288288
{
289-
return error_signal_message_
290-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
289+
return error_signal_message_->get_value<std::vector<std::string>>();
291290
}
292291

293-
void set_warning_code(std::array<int8_t, hardware_interface::warning_signal_count> warning_codes)
292+
void set_warning_code(std::vector<int8_t> warning_codes)
294293
{
295294
warning_signal_->set_value(warning_codes);
296295
}
297296

298-
std::array<int8_t, hardware_interface::warning_signal_count> get_warning_code() const
297+
std::vector<int8_t> get_warning_code() const
299298
{
300-
return warning_signal_
301-
->get_value<std::array<int8_t, hardware_interface::warning_signal_count>>();
299+
return warning_signal_->get_value<std::vector<int8_t>>();
302300
}
303301

304-
void set_warning_message(
305-
std::array<std::string, hardware_interface::warning_signal_count> error_message)
302+
void set_warning_message(std::vector<std::string> error_message)
306303
{
307304
warning_signal_message_->set_value(error_message);
308305
}
309306

310-
std::array<std::string, hardware_interface::error_signal_count> get_warning_message() const
307+
std::vector<std::string> get_warning_message() const
311308
{
312-
return warning_signal_message_
313-
->get_value<std::array<std::string, hardware_interface::error_signal_count>>();
309+
return warning_signal_message_->get_value<std::vector<std::string>>();
314310
}
315311

316312
protected:

0 commit comments

Comments
 (0)