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