Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 24 additions & 9 deletions hardware_interface/include/hardware_interface/handle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
#include <shared_mutex>
#include <string>
#include <utility>
#include <variant>

#include "hardware_interface/hardware_info.hpp"
#include "hardware_interface/introspection.hpp"
Expand Down Expand Up @@ -60,8 +59,6 @@ std::string get_type_name()
namespace hardware_interface
{

using HANDLE_DATATYPE = std::variant<std::monostate, double, bool>;

/// A handle used to get and set a value on a given interface.
class Handle
{
Expand Down Expand Up @@ -357,17 +354,26 @@ class StateInterface : public Handle

void registerIntrospection() const
{
if (value_ptr_ || std::holds_alternative<double>(value_))
if (value_ptr_ || data_type_.is_castable_to_double())
{
std::function<double()> f = [this]()
{ return value_ptr_ ? *value_ptr_ : std::get<double>(value_); };
{
if (value_ptr_)
{
return *value_ptr_;
}
else
{
return data_type_.cast_to_double(value_);
}
};
DEFAULT_REGISTER_ROS2_CONTROL_INTROSPECTION("state_interface." + get_name(), f);
}
}

void unregisterIntrospection() const
{
if (value_ptr_ || std::holds_alternative<double>(value_))
if (value_ptr_ || data_type_.is_castable_to_double())
{
DEFAULT_UNREGISTER_ROS2_CONTROL_INTROSPECTION("state_interface." + get_name());
}
Expand Down Expand Up @@ -431,10 +437,19 @@ class CommandInterface : public Handle

void registerIntrospection() const
{
if (value_ptr_ || std::holds_alternative<double>(value_))
if (value_ptr_ || data_type_.is_castable_to_double())
{
std::function<double()> f = [this]()
{ return value_ptr_ ? *value_ptr_ : std::get<double>(value_); };
{
if (value_ptr_)
{
return *value_ptr_;
}
else
{
return data_type_.cast_to_double(value_);
}
};
DEFAULT_REGISTER_ROS2_CONTROL_INTROSPECTION("command_interface." + get_name(), f);
DEFAULT_REGISTER_ROS2_CONTROL_INTROSPECTION(
"command_interface." + get_name() + ".is_limited", &is_command_limited_);
Expand All @@ -443,7 +458,7 @@ class CommandInterface : public Handle

void unregisterIntrospection() const
{
if (value_ptr_ || std::holds_alternative<double>(value_))
if (value_ptr_ || data_type_.is_castable_to_double())
{
DEFAULT_UNREGISTER_ROS2_CONTROL_INTROSPECTION("command_interface." + get_name());
DEFAULT_UNREGISTER_ROS2_CONTROL_INTROSPECTION(
Expand Down
26 changes: 26 additions & 0 deletions hardware_interface/include/hardware_interface/hardware_info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,11 @@
#ifndef HARDWARE_INTERFACE__HARDWARE_INFO_HPP_
#define HARDWARE_INTERFACE__HARDWARE_INFO_HPP_

#include <fmt/compile.h>

#include <string>
#include <unordered_map>
#include <variant>
#include <vector>

#include "joint_limits/joint_limits.hpp"
Expand Down Expand Up @@ -133,6 +136,8 @@ struct TransmissionInfo
/**
* Hardware handles supported types
*/

using HANDLE_DATATYPE = std::variant<std::monostate, double, bool>;
class HandleDataType
{
public:
Expand Down Expand Up @@ -202,6 +207,27 @@ class HandleDataType
}
}

/**
* @brief Cast the given value to double.
* @param value The value to be casted.
* @return The casted value.
* @throw std::runtime_error if the HandleDataType cannot be casted to double.
* @note Once we add support for more data types, this function should be updated
*/
double cast_to_double(const HANDLE_DATATYPE & value) const
{
switch (value_)
{
case DOUBLE:
return std::get<double>(value);
case BOOL:
return static_cast<double>(std::get<bool>(value));
default:
throw std::runtime_error(
fmt::format(FMT_COMPILE("Data type : '{}' cannot be casted to double."), to_string()));
}
}

HandleDataType from_string(const std::string & data_type) { return HandleDataType(data_type); }

private:
Expand Down
Loading