diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/SkillsMemory/CMakeLists.txt index a0f46e62c463c2eaf0f2d17205d8363e6339166a..be666686ae881507cdd822a50d83f473e5c98282 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 15f2a5e83f48171e4c5d3f8bc364dc196f031ca2..c912f55a1cf0f335215408681f6281cd24463746 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 218402973e99cad9ce045c3e9cc416ec376b998d..266806187ce6572c6ef26d8660bfa4f2d25ac780 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 1778ba42d2c67c1d6967485ee5fbcaa05241488a..46c83e4101e0566024aef99c2ff26117b042040f 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 0000000000000000000000000000000000000000..0e18610cdfae639aef0812de241298ba94ac0d7a --- /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 0000000000000000000000000000000000000000..c4b132e1a9867369e47ac3b6aad0c019c0f1f062 --- /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 0000000000000000000000000000000000000000..ca1292031c4f9b1a6996142ad82963dd7a24a167 --- /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 0000000000000000000000000000000000000000..4315d97452745f97b63c82d0d334440ea6803247 --- /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); +}