From 604085fab08abd4a90b1ee95651f5c53246489fc Mon Sep 17 00:00:00 2001
From: Patrick Hegemann <patrick.hegemann@kit.edu>
Date: Tue, 18 May 2021 11:24:56 +0200
Subject: [PATCH] Create SkillsMemory Library and aron conversions

---
 .../armem/server/SkillsMemory/CMakeLists.txt  | 18 +++---
 .../server/SkillsMemory/SkillsMemory.cpp      | 36 ++++--------
 .../armem/server/SkillsMemory/SkillsMemory.h  | 20 ++-----
 source/RobotAPI/libraries/CMakeLists.txt      |  2 +
 .../libraries/armem_skills/CMakeLists.txt     | 31 ++++++++++
 .../armem_skills}/StatechartListener.cpp      |  0
 .../armem_skills}/StatechartListener.h        |  0
 .../armem_skills/aron/Statechart.xml          | 57 ++++++++++++++++++
 .../armem_skills/aron_conversions.cpp         | 58 +++++++++++++++++++
 .../libraries/armem_skills/aron_conversions.h | 36 ++++++++++++
 10 files changed, 207 insertions(+), 51 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem_skills/CMakeLists.txt
 rename source/RobotAPI/{components/armem/server/SkillsMemory => libraries/armem_skills}/StatechartListener.cpp (100%)
 rename source/RobotAPI/{components/armem/server/SkillsMemory => libraries/armem_skills}/StatechartListener.h (100%)
 create mode 100644 source/RobotAPI/libraries/armem_skills/aron/Statechart.xml
 create mode 100644 source/RobotAPI/libraries/armem_skills/aron_conversions.cpp
 create mode 100644 source/RobotAPI/libraries/armem_skills/aron_conversions.h

diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt
index a0f46e62c..be666686a 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt
@@ -4,7 +4,7 @@ armarx_component_set_name("SkillsMemory")
 set(COMPONENT_LIBS
     ArmarXCore ArmarXCoreInterfaces ArmarXCoreObservers # for DebugObserverInterface
     ArmarXGuiComponentPlugins
-    RobotAPICore RobotAPIInterfaces armem
+    RobotAPICore RobotAPIInterfaces armem armem_skills
     # RobotAPIComponentPlugins  # for ArViz and other plugins
 
     ${IVT_LIBRARIES}
@@ -12,21 +12,21 @@ set(COMPONENT_LIBS
 
 set(SOURCES
     SkillsMemory.cpp
-    StatechartListener.cpp
+    ../../../../libraries/armem_skills/StatechartListener.cpp
 )
 set(HEADERS
     SkillsMemory.h
-    StatechartListener.h
+    ../../../../libraries/armem_skills/StatechartListener.h
 )
 
 armarx_add_component("${SOURCES}" "${HEADERS}")
 
-armarx_enable_aron_file_generation_for_target(
-    TARGET_NAME
-        ${ARMARX_COMPONENT_NAME}
-    ARON_FILES
-        aron/StatechartData.xml
-)
+#armarx_enable_aron_file_generation_for_target(
+#    TARGET_NAME
+#        ${ARMARX_COMPONENT_NAME}
+#    ARON_FILES
+#        aron/StatechartData.xml
+#)
 
 #generate the application
 armarx_generate_and_add_component_executable()
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
index 15f2a5e83..c912f55a1 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp
@@ -26,15 +26,19 @@
 #include <ArmarXCore/core/ArmarXObjectScheduler.h>
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 #include <ArmarXCore/core/time/TimeUtil.h>
+#include <ArmarXCore/core/logging/Logging.h>
 
 #include <RobotAPI/libraries/armem/core/error.h>
+#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
 #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h>
 
+#include <RobotAPI/libraries/armem_skills/aron_conversions.h>
+
+
 namespace armarx
 {
     SkillsMemory::SkillsMemory()
-    {
-    }
+        = default;
 
     armarx::PropertyDefinitionsPtr SkillsMemory::createPropertyDefinitions()
     {
@@ -64,8 +68,8 @@ namespace armarx
         workingMemory.name() = p.memoryName;
 
         {
-            armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(statechartCoreSegmentName, armarx::statechart::aron::Transition::toInitialAronType());
-            c.addProviderSegment("Transitions", armarx::statechart::aron::Transition::toInitialAronType());
+            armarx::armem::wm::CoreSegment& c = workingMemory.addCoreSegment(statechartCoreSegmentName, armarx::armem::arondto::Statechart::Transition::toInitialAronType());
+            c.addProviderSegment("Transitions", armarx::armem::arondto::Statechart::Transition::toInitialAronType());
         }
     }
 
@@ -158,19 +162,9 @@ namespace armarx
                               .withProviderSegmentName(statechartTransitionsProviderSegmentName)
                               .withEntityName(entityName);
 
-            ARMARX_INFO << "update.entityId = " << update.entityID;
             update.timeCreated = transitionTime;
-
-            armarx::statechart::aron::Transition data;
-            data.processId = t.processId;
-            data.sourceStateIdentifier = t.sourceStateIdentifier;
-            data.targetStateIdentifier = t.targetStateIdentifier;
-            data.eventName = t.eventName;
-            data.targetStateType = toAronStateEnum[t.targetStateType];
-            data.inputParameters = *toAronParameterMap(t.inputParameters);
-            data.localParameters = *toAronParameterMap(t.localParameters);
-            data.outputParameters = *toAronParameterMap(t.outputParameters);
-
+            armem::arondto::Statechart::Transition data;
+            armem::toAron(data, t);
             update.instancesData.push_back(data.toAron());
 
             try
@@ -184,16 +178,6 @@ namespace armarx
         }
     }
 
-    std::shared_ptr<armarx::statechart::aron::ParameterMap> SkillsMemory::toAronParameterMap(const armarx::StateParameterMap& map)
-    {
-        std::shared_ptr<armarx::statechart::aron::ParameterMap> aronMap(new armarx::statechart::aron::ParameterMap);
-        for (auto const& [key, val] : map)
-        {
-            aronMap->parameters[key] = val->value->toString();
-        }
-        return aronMap;
-    }
-
     std::string SkillsMemory::getStatechartName(std::string stateName)
     {
         const std::string delimiter = "->";
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
index 218402973..266806187 100644
--- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
+++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h
@@ -24,15 +24,14 @@
 
 
 #include <ArmarXCore/core/Component.h>
-
 #include <ArmarXCore/interface/observers/ObserverInterface.h>
+
 #include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h>
-#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 
+#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>
 #include <RobotAPI/libraries/armem/server/ComponentPlugin.h>
-
-#include <RobotAPI/components/armem/server/SkillsMemory/StatechartListener.h>
-#include <RobotAPI/components/armem/server/SkillsMemory/aron/StatechartData.aron.generated.h>
+#include <RobotAPI/libraries/armem_skills/aron/Statechart.aron.generated.h>
+#include <RobotAPI/libraries/armem_skills/StatechartListener.h>
 
 
 namespace armarx
@@ -108,17 +107,6 @@ namespace armarx
         IceInternal::Handle<armarx::StatechartListener> statechartListener;
         void reportTransitions(const std::vector<StatechartListener::Transition>& transitions);
 
-        // Converts an armarx::eStateType to the corresponding aron enum value
-        std::map<armarx::eStateType, armarx::statechart::aron::StateType> toAronStateEnum =
-        {
-            {eNormalState, armarx::statechart::aron::StateType::NORMAL},
-            {eFinalState, armarx::statechart::aron::StateType::FINAL},
-            {eRemoteState, armarx::statechart::aron::StateType::REMOTE},
-            {eDynamicRemoteState, armarx::statechart::aron::StateType::DYNAMIC_REMOTE},
-            {eUndefined, armarx::statechart::aron::StateType::UNDEFINED},
-        };
-        // Converts an armarx::StateParameterMap to aron
-        static std::shared_ptr<armarx::statechart::aron::ParameterMap> toAronParameterMap(const armarx::StateParameterMap&);
         // Gets the statechart name from a state name (takes first two levels of the hierarchy)
         static std::string getStatechartName(std::string stateName);
     };
diff --git a/source/RobotAPI/libraries/CMakeLists.txt b/source/RobotAPI/libraries/CMakeLists.txt
index 1778ba42d..46c83e410 100644
--- a/source/RobotAPI/libraries/CMakeLists.txt
+++ b/source/RobotAPI/libraries/CMakeLists.txt
@@ -28,3 +28,5 @@ add_subdirectory(NJointControllerGuiPluginUtility)
 add_subdirectory(RobotAPINJointControllerWidgets)
 add_subdirectory(RobotUnitDataStreamingReceiver)
 add_subdirectory(GraspingUtility)
+
+add_subdirectory(armem_skills)
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
new file mode 100644
index 000000000..0e18610cd
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt
@@ -0,0 +1,31 @@
+set(LIB_NAME       armem_skills)
+
+armarx_component_set_name("${LIB_NAME}")
+armarx_set_target("Library: ${LIB_NAME}")
+
+armarx_add_library(
+    LIBS     
+        ArmarXCoreInterfaces
+        ArmarXCore
+        ArmarXCoreObservers
+
+        RobotAPI::Core
+        RobotAPI::libraries::armem
+    SOURCES  
+        ./aron_conversions.cpp
+        ./StatechartListener.cpp
+    HEADERS  
+        ./aron_conversions.h
+        ./StatechartListener.h
+)
+
+
+armarx_enable_aron_file_generation_for_target(
+    TARGET_NAME
+    "${LIB_NAME}"
+    ARON_FILES
+    aron/Statechart.xml
+)
+
+
+add_library(RobotAPI::armem_skills ALIAS armem_skills)
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/StatechartListener.cpp b/source/RobotAPI/libraries/armem_skills/StatechartListener.cpp
similarity index 100%
rename from source/RobotAPI/components/armem/server/SkillsMemory/StatechartListener.cpp
rename to source/RobotAPI/libraries/armem_skills/StatechartListener.cpp
diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/StatechartListener.h b/source/RobotAPI/libraries/armem_skills/StatechartListener.h
similarity index 100%
rename from source/RobotAPI/components/armem/server/SkillsMemory/StatechartListener.h
rename to source/RobotAPI/libraries/armem_skills/StatechartListener.h
diff --git a/source/RobotAPI/libraries/armem_skills/aron/Statechart.xml b/source/RobotAPI/libraries/armem_skills/aron/Statechart.xml
new file mode 100644
index 000000000..c4b132e1a
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/aron/Statechart.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<AronTypeDefinition>
+    <CodeIncludes>
+    </CodeIncludes>
+
+    <GenerateTypes>
+        <IntEnum name="armarx::armem::arondto::Statechart::StateType">
+            <EnumValue key="NORMAL" value="0" />
+            <EnumValue key="FINAL" value="1" />
+            <EnumValue key="REMOTE" value="2" />
+            <EnumValue key="DYNAMIC_REMOTE" value="3" />
+            <EnumValue key="UNDEFINED" value="4" />
+        </IntEnum>
+
+        <Object name='armarx::armem::arondto::Statechart::ParameterMap'>
+            <ObjectChild key='parameters'>
+                <dict>
+                    <String />
+                </dict>
+            </ObjectChild>
+        </Object>
+
+        <Object name='armarx::armem::arondto::Statechart::Transition'>
+            <ObjectChild key='processId'>
+                <int />
+            </ObjectChild>
+
+            <ObjectChild key="sourceStateIdentifier">
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key="targetStateIdentifier">
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key="eventName">
+                <String />
+            </ObjectChild>
+
+            <ObjectChild key="targetStateType">
+                <armarx::armem::arondto::Statechart::StateType />
+            </ObjectChild>
+
+            <ObjectChild key="inputParameters">
+                <armarx::armem::arondto::Statechart::ParameterMap />
+            </ObjectChild>
+
+            <ObjectChild key="localParameters">
+                <armarx::armem::arondto::Statechart::ParameterMap />
+            </ObjectChild>
+
+            <ObjectChild key="outputParameters">
+                <armarx::armem::arondto::Statechart::ParameterMap />
+            </ObjectChild>
+        </Object>
+    </GenerateTypes>
+</AronTypeDefinition>
diff --git a/source/RobotAPI/libraries/armem_skills/aron_conversions.cpp b/source/RobotAPI/libraries/armem_skills/aron_conversions.cpp
new file mode 100644
index 000000000..ca1292031
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/aron_conversions.cpp
@@ -0,0 +1,58 @@
+#include "aron_conversions.h"
+
+namespace armarx::armem
+{
+
+    void fromAron(const arondto::Statechart::StateType& dto, eStateType& bo)
+    {
+        bo = fromAronStateTypeMap[dto];
+    }
+
+    void toAron(arondto::Statechart::StateType& dto, const eStateType& bo)
+    {
+        dto.value = toAronStateTypeMap[bo].value;
+    }
+
+    void fromAron(const arondto::Statechart::ParameterMap& dto, StateParameterMap& bo)
+    {
+        // todo: implement
+        //        for (auto const& [key, val] : dto.parameters)
+        //        {
+        // fromAron(val, ...)
+        //            bo.insert(key, val);
+        //        }
+    }
+
+    void toAron(arondto::Statechart::ParameterMap& dto, const StateParameterMap& bo)
+    {
+        for (auto const& [key, val] : bo)
+        {
+            dto.parameters[key] = val->value->toString();
+        }
+    }
+
+    void fromAron(const arondto::Statechart::Transition& dto, ProfilerStatechartTransitionWithParameters& bo)
+    {
+        bo.processId = dto.processId;
+        bo.sourceStateIdentifier = dto.sourceStateIdentifier;
+        bo.targetStateIdentifier = dto.targetStateIdentifier;
+        bo.eventName = dto.eventName;
+        fromAron(dto.targetStateType, bo.targetStateType);
+        fromAron(dto.inputParameters, bo.inputParameters);
+        fromAron(dto.localParameters, bo.localParameters);
+        fromAron(dto.outputParameters, bo.outputParameters);
+    }
+
+    void toAron(arondto::Statechart::Transition& dto, const ProfilerStatechartTransitionWithParameters& bo)
+    {
+        dto.processId = bo.processId;
+        dto.sourceStateIdentifier = bo.sourceStateIdentifier;
+        dto.targetStateIdentifier = bo.targetStateIdentifier;
+        dto.eventName = bo.eventName;
+        dto.targetStateType.initialize();
+        toAron(dto.targetStateType, bo.targetStateType);
+        toAron(dto.inputParameters, bo.inputParameters);
+        toAron(dto.localParameters, bo.localParameters);
+        toAron(dto.outputParameters, bo.outputParameters);
+    }
+}
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/armem_skills/aron_conversions.h b/source/RobotAPI/libraries/armem_skills/aron_conversions.h
new file mode 100644
index 000000000..4315d9745
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_skills/aron_conversions.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <ArmarXCore/interface/core/Profiler.h>
+#include <ArmarXCore/observers/ObserverObjectFactories.h>
+
+#include <RobotAPI/libraries/armem_skills/aron/Statechart.aron.generated.h>
+
+namespace armarx::armem
+{
+    std::map<armarx::eStateType, armarx::armem::arondto::Statechart::StateType> toAronStateTypeMap =
+    {
+        {eNormalState, armarx::armem::arondto::Statechart::StateType::NORMAL},
+        {eFinalState, armarx::armem::arondto::Statechart::StateType::FINAL},
+        {eRemoteState, armarx::armem::arondto::Statechart::StateType::REMOTE},
+        {eDynamicRemoteState, armarx::armem::arondto::Statechart::StateType::DYNAMIC_REMOTE},
+        {eUndefined, armarx::armem::arondto::Statechart::StateType::UNDEFINED},
+    };
+
+    std::map<armarx::armem::arondto::Statechart::StateType, armarx::eStateType> fromAronStateTypeMap =
+    {
+        {armarx::armem::arondto::Statechart::StateType::NORMAL, eNormalState},
+        {armarx::armem::arondto::Statechart::StateType::FINAL, eFinalState},
+        {armarx::armem::arondto::Statechart::StateType::REMOTE, eRemoteState},
+        {armarx::armem::arondto::Statechart::StateType::DYNAMIC_REMOTE, eDynamicRemoteState},
+        {armarx::armem::arondto::Statechart::StateType::UNDEFINED, eUndefined},
+    };
+
+    void fromAron(const armarx::armem::arondto::Statechart::StateType& dto, armarx::eStateType& bo);
+    void toAron(armarx::armem::arondto::Statechart::StateType& dto, const armarx::eStateType& bo);
+
+    void fromAron(const armarx::armem::arondto::Statechart::ParameterMap& dto, armarx::StateParameterMap& bo);
+    void toAron(armarx::armem::arondto::Statechart::ParameterMap& dto, const armarx::StateParameterMap& bo);
+
+    void fromAron(const armarx::armem::arondto::Statechart::Transition& dto, armarx::ProfilerStatechartTransitionWithParameters& bo);
+    void toAron(armarx::armem::arondto::Statechart::Transition& dto, const armarx::ProfilerStatechartTransitionWithParameters& bo);
+}
-- 
GitLab