From e9fad42d72a053d96802f0079198c40dcaddf90e Mon Sep 17 00:00:00 2001 From: Raphael Grimm <raphael.grimm@kit.edu> Date: Tue, 13 Oct 2020 18:14:03 +0200 Subject: [PATCH] Fix RobotUnit introspection code --- .../RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp | 3 +-- .../units/RobotUnit/SensorValues/SensorValueBase.h | 8 ++++++++ .../units/RobotUnit/util/introspection/DataFieldsInfo.h | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp index 8bcf83387..0ed1a250a 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleLogging.cpp @@ -577,8 +577,7 @@ namespace armarx::RobotUnitModule //dimensions of sensor value (e.g. vel, tor, f_x, f_y, ...) for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields(); ++ idxField) { - std::string str; - val->getDataFieldAs(idxField, str); + const auto str = val->getDataFieldAs<std::string>(idxField); for (auto& [_, entry] : rtLoggingEntries) { if (entry->loggedSensorDeviceValues.at(idxDev).at(idxField)) diff --git a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h index 18d537b29..7afa43be2 100644 --- a/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h +++ b/source/RobotAPI/components/units/RobotUnit/SensorValues/SensorValueBase.h @@ -99,6 +99,14 @@ namespace armarx virtual void getDataFieldAs(std::size_t i, Ice::Float& out) const = 0; virtual void getDataFieldAs(std::size_t i, Ice::Double& out) const = 0; virtual void getDataFieldAs(std::size_t i, std::string& out) const = 0; + template<class T> + T getDataFieldAs(std::size_t i) const + { + ARMARX_TRACE; + T t; + this->getDataFieldAs(i, t); + return t; + } virtual const std::type_info& getDataFieldType(std::size_t i) const = 0; //management functions diff --git a/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h b/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h index 49e77ca8b..015f386b6 100644 --- a/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h +++ b/source/RobotAPI/components/units/RobotUnit/util/introspection/DataFieldsInfo.h @@ -325,7 +325,8 @@ namespace armarx::introspection static void GetDataFieldAs(std::size_t i, const std::array<T, N>& field, OT& out) { ARMARX_CHECK_LESS(i, GetNumberOfFields()); - sub_t::GetDataFieldAs(i % N, field.at(i / N), out); + const auto subN = sub_t::GetNumberOfFields(); + sub_t::GetDataFieldAs(i % subN, field.at(i / subN), out); } static const std::type_info& GetDataFieldType(std::size_t i) -- GitLab