diff --git a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp index f5d4b5f47f2174b165604d55ad862826ad2a7497..57056f83a9901b5423e7ef5e6a946d94b5b7c4a7 100644 --- a/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp +++ b/source/RobotAPI/components/armem/client/SkillProviderExample/SkillProviderExample.cpp @@ -28,22 +28,36 @@ namespace armarx::skills::example std::string SkillProviderExample::getDefaultName() const { - return "SkillProviderExample"; + // If you want to use the memory, it must contain the core segment name + // common means that all robots can execute this skill + // the later packages (armar6, armar3) may add other skill providers with robot specific skills + return "CommonSkill/SkillProviderExample"; } void SkillProviderExample::onInitComponent() - {} - - void SkillProviderExample::onConnectComponent() { // Add example skill { skills::SkillDescription helloWorldDesc; helloWorldDesc.acceptedType = nullptr; helloWorldDesc.documentation = "This skill logs a message on ARMARX_IMPORTANT"; - helloWorldDesc.name = "common/HelloWorld"; + helloWorldDesc.name = "HelloWorld"; addSkill(HelloWorldSkill(), helloWorldDesc); } + + // Add another example skill + { + skills::SkillDescription fooDesc; + fooDesc.acceptedType = nullptr; + fooDesc.documentation = "This skill does nothing."; + fooDesc.name = "Foo"; + addSkill([](const aron::data::DictPtr&){ return true; }, fooDesc); + } + } + + void SkillProviderExample::onConnectComponent() + { + } void SkillProviderExample::onDisconnectComponent() diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp index f5dc4c7a97aaccf9a2d9da50a67b8c4698de2570..f5396f815a31f12e54836cfe0b1cb1a0b51749ce 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.cpp @@ -38,7 +38,7 @@ #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> #include <RobotAPI/libraries/armem/server/wm/memory_definitions.h> #include <RobotAPI/libraries/armem_skills/aron_conversions.h> - +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> namespace armarx { @@ -49,7 +49,8 @@ namespace armarx StatechartListenerComponentPluginUser(), SkillObserverComponentPluginUser(), statechartListenerProviderSegment(iceAdapter()), - executableSkillsCoreSegment(iceAdapter()) + executableSkillCoreSegment(iceAdapter()), + skillExecutionRequestCoreSegment(iceAdapter()) { } @@ -60,7 +61,6 @@ namespace armarx const std::string prefix = "mem."; statechartListenerProviderSegment.defineProperties(defs, prefix + "statechartlistener."); - executableSkillsCoreSegment.defineProperties(defs, prefix + "skill."); setMemoryName("Skill"); return defs; @@ -76,7 +76,6 @@ namespace armarx void SkillsMemory::onInitComponent() { statechartListenerProviderSegment.init(); - executableSkillsCoreSegment.init(); } @@ -114,38 +113,23 @@ namespace armarx return result; } - void SkillsMemory::addProvider(const std::string& name, const skills::SkillProviderInterfacePrx& provider, const Ice::Current ¤t) + void SkillsMemory::addProvider(const std::string& skillProviderName, const skills::SkillProviderInterfacePrx& provider, const Ice::Current ¤t) { - const auto [skillName, providerName] = skills::segment::ExecutableSkillLibraryCoreSegment::GetSkillProviderNames(name); + SkillObserverComponentPluginUser::addProvider(skillProviderName, provider, current); - SkillObserverComponentPluginUser::addProvider(name, provider, current); - executableSkillsCoreSegment.addSkillProvider(providerName, skillName, provider); + executableSkillCoreSegment.addSkillProvider(skillProviderName, provider); } - void SkillsMemory::removeProvider(const std::string& name, const Ice::Current ¤t) + void SkillsMemory::removeProvider(const std::string& skillProviderName, const Ice::Current ¤t) { - std::vector<std::string> names = simox::alg::split(name, "/"); - ARMARX_CHECK_EXPRESSION(name.size() > 1); - - SkillObserverComponentPluginUser::removeProvider(name, current); - - const std::string providerName = names[0]; - names.erase(names.begin()); - const std::string skillName = simox::alg::join(names, ""); + executableSkillCoreSegment.removeSkillProvider(skillProviderName); - executableSkillsCoreSegment.removeSkillProvider(providerName, skillName); + SkillObserverComponentPluginUser::removeProvider(skillProviderName, current); } - void SkillsMemory::executeSkill(const std::string& name, const skills::SkillParametrization& params, const Ice::Current ¤t) + void SkillsMemory::executeSkill(const std::string& skillProviderName, const skills::SkillParametrization& params, const Ice::Current ¤t) { - std::vector<std::string> names = simox::alg::split(name, "/"); - ARMARX_CHECK_EXPRESSION(name.size() > 1); - - const std::string providerName = names[0]; - names.erase(names.begin()); - const std::string skillName = simox::alg::join(names, ""); - - executableSkillsCoreSegment.directlyExecuteSkill(providerName, skillName); + executableSkillCoreSegment.directlyExecuteSkill(skillProviderName, params); } void SkillsMemory::reportStatechartTransitionWithParameters(const ProfilerStatechartTransitionWithParameters& x, const Ice::Current&) diff --git a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h index 059619eff043f2a9bfce6f45e6b384295cc814cb..cc1f95b9b19bf3a4d2ffc2ea877c47849bb634cf 100644 --- a/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h +++ b/source/RobotAPI/components/armem/server/SkillsMemory/SkillsMemory.h @@ -40,7 +40,7 @@ #include <RobotAPI/libraries/armem_skills/aron/Statechart.aron.generated.h> #include <RobotAPI/libraries/armem_skills/server/segment/StatechartListenerSegment.h> #include <RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h> - +#include <RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h> namespace armarx { @@ -114,8 +114,8 @@ namespace armarx Properties p; skills::segment::StatechartListenerProviderSegment statechartListenerProviderSegment; - skills::segment::ExecutableSkillLibraryCoreSegment executableSkillsCoreSegment; - + skills::segment::ExecutableSkillLibraryCoreSegment executableSkillCoreSegment; + skills::segment::SkillExecutionRequestCoreSegment skillExecutionRequestCoreSegment; struct RemoteGuiTab : RemoteGui::Client::Tab { diff --git a/source/RobotAPI/interface/skills/SkillProviderInterface.ice b/source/RobotAPI/interface/skills/SkillProviderInterface.ice index a01ea8f9e75a64b86504ecfa0f46f7df4a1d61ff..8e710ed8259c8be71bd1f7236f1566c707b728c4 100644 --- a/source/RobotAPI/interface/skills/SkillProviderInterface.ice +++ b/source/RobotAPI/interface/skills/SkillProviderInterface.ice @@ -24,16 +24,17 @@ #include <RobotAPI/interface/aron.ice> -//Forward declaration module armarx { module skills { sequence<string> StringList; + // Description of a skill. Needs to be sent to a skill observer or memory struct SkillDescription { string name; + string robot; string documentation; aron::type::dto::AronObject acceptedType; }; @@ -56,7 +57,8 @@ module armarx struct SkillStatus { Execution::Status status; - aron::data::dto::Dict params; + aron::data::dto::Dict usedParams; + aron::data::dto::Dict returnValue; string message; string error; }; diff --git a/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp b/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp index 32f0f8f5683241d789d6688e11d16dd65818fdcb..b0afa282677c45325993feee0fcba60245236611 100644 --- a/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/segment/SpecializedCoreSegment.cpp @@ -51,16 +51,16 @@ namespace armarx::armem::server::segment if (iceMemory.workingMemory->hasCoreSegment(properties.segmentName)) { - ARMARX_WARNING << "Core segment with name '" << properties.segmentName << "' already exists."; segmentPtr = &iceMemory.workingMemory->getCoreSegment(properties.segmentName); } else { ARMARX_INFO << "Adding core segment '" << properties.segmentName << "'"; segmentPtr = &iceMemory.workingMemory->addCoreSegment(properties.segmentName); + + segmentPtr->aronType() = aronType; + segmentPtr->setMaxHistorySize(properties.maxHistorySize); } - segmentPtr->aronType() = aronType; - segmentPtr->setMaxHistorySize(properties.maxHistorySize); } void SpecializedCoreSegment::setDefaultCoreSegmentName(const std::string& coreSegmentName) diff --git a/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp b/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp index 6bbdc36de8abe3ef2537fb90abcb5b16b431b3a5..747b2bec833e5f1b13366e2954b5af4f12f64b4b 100644 --- a/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem/server/segment/SpecializedProviderSegment.cpp @@ -56,16 +56,16 @@ namespace armarx::armem::server::segment if (coreSegment.segmentPtr->hasProviderSegment(properties.segmentName)) { - ARMARX_WARNING << "Provider segment with name '" << properties.segmentName << "' already exists."; segmentPtr = &coreSegment.segmentPtr->getProviderSegment(properties.segmentName); } else { ARMARX_INFO << "Adding provider segment '" << properties.segmentName << "'"; segmentPtr = &coreSegment.segmentPtr->addProviderSegment(properties.segmentName); + + segmentPtr->aronType() = aronType; + segmentPtr->setMaxHistorySize(properties.maxHistorySize); } - segmentPtr->aronType() = aronType; - segmentPtr->setMaxHistorySize(properties.maxHistorySize); } void SpecializedProviderSegment::setDefaultProviderSegmentName(const std::string& providerSegmentName) diff --git a/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h b/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h index f1ca29d3e066461b890ee9f321c97282d4ada7ef..f739c0dd3dd7a6b1a2196013f1500e2c4bbd52b5 100644 --- a/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h +++ b/source/RobotAPI/libraries/armem/server/segment/detail/SpecializedSegment.h @@ -37,7 +37,6 @@ namespace armarx::armem::server::segment virtual void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "") = 0; virtual void init() = 0; - public: SegmentType* segmentPtr; diff --git a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt index 5f3e01c944d704418d64a4eb1ee607f026ebaeab..bec7daa0d7d986ceb7f77ac7587347d6b9f27d0f 100644 --- a/source/RobotAPI/libraries/armem_skills/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_skills/CMakeLists.txt @@ -11,6 +11,7 @@ armarx_add_library( RobotAPI::Core RobotAPI::armem_server + aronjsonconverter SOURCES ./aron_conversions.cpp @@ -18,6 +19,7 @@ armarx_add_library( ./server/SkillObserverComponentPlugin.cpp ./server/segment/StatechartListenerSegment.cpp ./server/segment/ExecutableSkillLibrarySegment.cpp + ./server/segment/SkillExecutionRequestSegment.cpp ./client/SkillProviderComponentPlugin.cpp HEADERS @@ -27,6 +29,7 @@ armarx_add_library( ./server/SkillObserverComponentPlugin.h ./server/segment/StatechartListenerSegment.h ./server/segment/ExecutableSkillLibrarySegment.h + ./server/segment/SkillExecutionRequestSegment.h ./client/SkillProviderComponentPlugin.h ) @@ -36,6 +39,7 @@ armarx_enable_aron_file_generation_for_target( "${LIB_NAME}" ARON_FILES aron/Statechart.xml + aron/Skill.xml ) diff --git a/source/RobotAPI/libraries/armem_skills/aron/Skill.xml b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml new file mode 100644 index 0000000000000000000000000000000000000000..398a5b6821f99ed7dc086dbd3564861937b8a07f --- /dev/null +++ b/source/RobotAPI/libraries/armem_skills/aron/Skill.xml @@ -0,0 +1,37 @@ +<!-- +A data description of an executable skill in aron. +The memory should look like the following: + - Skills + - ExecutableSKill // CoreSeg + - MySkillProvider // ProvSeg + - MyFancySkill // Entity + - StatechartSkillProvider + - ... +--> +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <GenerateTypes> + <Object name='armarx::skills::arondto::SkillDescription'> + <ObjectChild key='name'> + <String /> + </ObjectChild> + + <ObjectChild key='robot'> + <String /> + </ObjectChild> + + <ObjectChild key='documentation'> + <String /> + </ObjectChild> + + <ObjectChild key='ice_info'> + <String /> + </ObjectChild> + + <ObjectChild key='accepted_type_json'> + <String /> + </ObjectChild> + + </Object> + </GenerateTypes> +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp index 9e10c893134d2f149fc2b53fd7ffea64df9f923d..ca01298108e1640b969b45f24d9a2f84302debfb 100644 --- a/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp +++ b/source/RobotAPI/libraries/armem_skills/client/SkillProviderComponentPlugin.cpp @@ -48,6 +48,7 @@ namespace armarx return; } + ARMARX_DEBUG << "Adding skill " << skillName << " to list"; SkillImplementationWrapper skill(fun, desc); skillImplementations.insert({skillName, skill}); } @@ -90,7 +91,7 @@ namespace armarx auto& impl = skillImplementations.at(skillName); impl.task->join(); - impl.status.params = params.params; + impl.status.usedParams = params.params; impl.task->start(); } @@ -137,7 +138,7 @@ namespace armarx std::lock_guard l(skillStatusMutex); status.status = skills::Execution::Running; } - auto params = std::make_shared<aron::data::Dict>(status.params); + auto params = std::make_shared<aron::data::Dict>(status.usedParams); auto result = skill.execute(params); { std::lock_guard l(skillStatusMutex); diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp index a2103b02b6914a834c0aa6d90e564dc86af8aa8f..10914c7da2cd777b72229f405b72b47c8e2d8233 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.cpp @@ -3,49 +3,67 @@ #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> #include <SimoxUtility/algorithm/string.h> +#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> + +#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h> + + namespace armarx::skills::segment { - std::pair<std::string, std::string> ExecutableSkillLibraryCoreSegment::GetSkillProviderNames(const std::string& name) - { - std::vector<std::string> names = simox::alg::split(name, "/"); - ARMARX_CHECK_EXPRESSION(name.size() > 1); + std::string ExecutableSkillCoreSegmentName = "ExecutableSkill"; - const std::string providerName = names[0]; - names.erase(names.begin()); - const std::string skillName = simox::alg::join(names, ""); - return {providerName, skillName}; - } - - ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& name, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, name, "ExecutableSkill"), + ExecutableSkillLibraryProviderSegment::ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory): + Base(iceMemory, provName, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()), skillProvider(prx) { - ARMARX_IMPORTANT << "CREATED A SKILL"; - // add skills - auto skills = skillProvider->getSkills(); - for (const auto& [key, desc] : skills) - { - (void) key; - (void) desc; - } } void ExecutableSkillLibraryProviderSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix) { + // No properties! (meaning no name and no max size) } void ExecutableSkillLibraryProviderSegment::init() { Base::init(); + + // add skills + auto skills = skillProvider->getSkills(); + + ARMARX_INFO << "During init the providerSegment '" << getProviderSegment().id().providerSegmentName << "' has " << skills.size() << " skills."; + for (const auto& [key, desc] : skills) + { + skills::arondto::SkillDescription skillDescription; + skillDescription.name = desc.name; + skillDescription.documentation = desc.documentation; + skillDescription.ice_info = "TODO"; + skillDescription.robot = desc.robot; + if (desc.acceptedType) + { + aron::type::VariantPtr t = aron::type::Variant::FromAronDTO(*desc.acceptedType); + skillDescription.accepted_type_json = aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(t).dump(2); + } + + armem::Commit commit; + auto& entityUpdate = commit.add(); + entityUpdate.confidence = 1.0; + entityUpdate.timeCreated = armem::Time::now(); + entityUpdate.instancesData = {skillDescription.toAron()}; + entityUpdate.entityID = getProviderSegment().id().withEntityName(key); + + // Commit data to memory and notify + iceMemory.commit(commit); + } } ExecutableSkillLibraryCoreSegment::ExecutableSkillLibraryCoreSegment(armem::server::MemoryToIceAdapter& iceMemory): - Base(iceMemory, "ExecutableSkill") + Base(iceMemory, ExecutableSkillCoreSegmentName, skills::arondto::SkillDescription::toAronType()) { } void ExecutableSkillLibraryCoreSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix) { + // No properties! (meaning no name and no max size) } void ExecutableSkillLibraryCoreSegment::init() @@ -53,19 +71,31 @@ namespace armarx::skills::segment Base::init(); } - void ExecutableSkillLibraryCoreSegment::addSkillProvider(const std::string& providerSegmentName, const std::string& skillName, const SkillProviderInterfacePrx& provider) + void ExecutableSkillLibraryCoreSegment::addSkillProvider(const std::string& providerSegmentName, const SkillProviderInterfacePrx& provider) + { + auto it = providerSegments.emplace(providerSegmentName, ExecutableSkillLibraryProviderSegment{providerSegmentName, provider, iceMemory}); + if (it.second) + { + it.first->second.init(); + } + else + { + ARMARX_WARNING << "Could not insert a skillProvider '"<<providerSegmentName<<"' to the segment '" << getCoreSegment().id().str() << "'. This may leave the skillObserver and the memory unsynchronized."; + } + } + + void ExecutableSkillLibraryCoreSegment::removeSkillProvider(const std::string& providerName) { - ARMARX_IMPORTANT << "ADDING A SKILL SEGMENT"; - providerSegments.emplace(providerSegmentName, ExecutableSkillLibraryProviderSegment{skillName, provider, iceMemory}); + providerSegments.erase(providerName); } - void ExecutableSkillLibraryCoreSegment::removeSkillProvider(const std::string& providerName, const std::string& skillName) + void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params) { } - void ExecutableSkillLibraryCoreSegment::directlyExecuteSkill(const std::string& providerName, const std::string& skillName) + size_t ExecutableSkillLibraryCoreSegment::size() const { - + return providerSegments.size(); } } diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h index b5285da0667ca1826abb05f0ad458e1e1fdcf610..7e4a5dcb1b45a3042c16fd2acabfc5a1781d8bd1 100644 --- a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h +++ b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillLibrarySegment.h @@ -18,7 +18,7 @@ namespace armarx::skills::segment using Base = armem::server::segment::SpecializedProviderSegment; public: - ExecutableSkillLibraryProviderSegment(const std::string& name, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory); + ExecutableSkillLibraryProviderSegment(const std::string& provName, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory); void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); void init(); @@ -38,11 +38,11 @@ namespace armarx::skills::segment void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); void init(); - void addSkillProvider(const std::string& providerSegmentName, const std::string& skillName, const SkillProviderInterfacePrx& provider); - void removeSkillProvider(const std::string& providerName, const std::string& skillName); - void directlyExecuteSkill(const std::string& providerName, const std::string& skillName); + void addSkillProvider(const std::string& providerName, const SkillProviderInterfacePrx& provider); + void removeSkillProvider(const std::string& providerName); + void directlyExecuteSkill(const std::string& providerName, const skills::SkillParametrization& params); - static std::pair<std::string, std::string> GetSkillProviderNames(const std::string& n); + size_t size() const; private: std::map<std::string, ExecutableSkillLibraryProviderSegment> providerSegments; diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.cpp deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/ExecutableSkillSegment.h deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f4b65623003f78ef124a23db021efce101974de7 --- /dev/null +++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.cpp @@ -0,0 +1,44 @@ +#include "SkillExecutionRequestSegment.h" + +#include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h> +#include <SimoxUtility/algorithm/string.h> + +#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> + +#include <RobotAPI/libraries/armem_skills/aron/Skill.aron.generated.h> + + +namespace armarx::skills::segment +{ + std::string StringExecutionRequestCoreSegmentName = "SkillExecutionRequest"; + + SkillExecutionRequestProviderSegment::SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx& prx, armem::server::MemoryToIceAdapter& iceMemory): + Base(iceMemory, provName, StringExecutionRequestCoreSegmentName) + { + } + + void SkillExecutionRequestProviderSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix) + { + // No properties! (meaning no name and no max size) + } + + void SkillExecutionRequestProviderSegment::init() + { + Base::init(); + } + + SkillExecutionRequestCoreSegment::SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory): + Base(iceMemory, StringExecutionRequestCoreSegmentName) + { + } + + void SkillExecutionRequestCoreSegment::defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix) + { + // No properties! (meaning no name and no max size) + } + + void SkillExecutionRequestCoreSegment::init() + { + Base::init(); + } +} diff --git a/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h new file mode 100644 index 0000000000000000000000000000000000000000..9f9b38486e9bc1049065763b9d89f89ec17083e2 --- /dev/null +++ b/source/RobotAPI/libraries/armem_skills/server/segment/SkillExecutionRequestSegment.h @@ -0,0 +1,41 @@ +#pragma once + +// Base Class +#include <RobotAPI/libraries/armem/server/segment/SpecializedSegment.h> + +// ArmarX +#include <ArmarXCore/interface/core/Profiler.h> +#include <ArmarXCore/observers/ObserverObjectFactories.h> +#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h> + +#include <RobotAPI/interface/skills/SkillProviderInterface.h> + +namespace armarx::skills::segment +{ + class SkillExecutionRequestProviderSegment : + public armem::server::segment::SpecializedProviderSegment + { + using Base = armem::server::segment::SpecializedProviderSegment; + + public: + SkillExecutionRequestProviderSegment(const std::string& provName, const SkillProviderInterfacePrx&, armem::server::MemoryToIceAdapter& iceMemory); + + void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); + void init(); + }; + + class SkillExecutionRequestCoreSegment : + public armem::server::segment::SpecializedCoreSegment + { + using Base = armem::server::segment::SpecializedCoreSegment; + + public: + SkillExecutionRequestCoreSegment(armem::server::MemoryToIceAdapter& iceMemory); + + void defineProperties(PropertyDefinitionsPtr defs, const std::string &prefix); + void init(); + + private: + std::map<std::string, SkillExecutionRequestProviderSegment> providerSegments; + }; +}