From 157f46b9d331a9b6dbd969a3c08f24faa6bdb157 Mon Sep 17 00:00:00 2001 From: Julian Tusch <urhrf@student.kit.edu> Date: Thu, 18 Apr 2024 19:44:47 +0200 Subject: [PATCH] work in progress - this will crash still --- .../skills/SkillManagerInterface.ice | 13 ++-- .../libraries/skills/manager/CMakeLists.txt | 2 + .../skills/manager/FluxioExecutor.cpp | 51 ++++++++++++++ .../libraries/skills/manager/FluxioExecutor.h | 32 +++++++++ .../manager/SkillManagerComponentPlugin.cpp | 67 +++++++++++++++++++ .../manager/SkillManagerComponentPlugin.h | 6 ++ .../SkillManagerComponentPluginUser.cpp | 11 +++ .../manager/SkillManagerComponentPluginUser.h | 3 + 8 files changed, 180 insertions(+), 5 deletions(-) create mode 100644 source/RobotAPI/libraries/skills/manager/FluxioExecutor.cpp create mode 100644 source/RobotAPI/libraries/skills/manager/FluxioExecutor.h diff --git a/source/RobotAPI/interface/skills/SkillManagerInterface.ice b/source/RobotAPI/interface/skills/SkillManagerInterface.ice index 03259f997..d4c1cf655 100644 --- a/source/RobotAPI/interface/skills/SkillManagerInterface.ice +++ b/source/RobotAPI/interface/skills/SkillManagerInterface.ice @@ -223,10 +223,13 @@ module armarx //** Fluxio related methods **// //****************************// + optional(3) string + executeFluxioSkill(string skillId); // executes a fluxio skill + dto::FluxioSkillList getSkillList(); // returns skills of all providers - optional(3) dto::FluxioSkill + optional(4) dto::FluxioSkill getSkill(string id); // returns a single skill bool @@ -249,7 +252,7 @@ module armarx dto::FluxioProfileList getProfileList(); // returns all profiles - optional(4) dto::FluxioProfile + optional(5) dto::FluxioProfile getProfile(string id); // returns a single profile dto::FluxioProfile @@ -261,13 +264,13 @@ module armarx dto::FluxioProviderList getProviderList(); // returns all providers - optional(5) dto::FluxioProvider + optional(6) dto::FluxioProvider getProvider(string id); // returns a single provider - optional(6) dto::FluxioSkillList + optional(7) dto::FluxioSkillList getSkillsOfProvider(string id); // returns all skills of a provider - optional(7) dto::FluxioSkill + optional(8) dto::FluxioSkill addSkillToProvider(string userId, string providerId, dto::FluxioSkill skill); // adds a new skill to a provider }; } diff --git a/source/RobotAPI/libraries/skills/manager/CMakeLists.txt b/source/RobotAPI/libraries/skills/manager/CMakeLists.txt index 7348013e3..5556a5c42 100644 --- a/source/RobotAPI/libraries/skills/manager/CMakeLists.txt +++ b/source/RobotAPI/libraries/skills/manager/CMakeLists.txt @@ -18,9 +18,11 @@ armarx_add_library( SOURCES SkillManagerComponentPlugin.cpp SkillManagerComponentPluginUser.cpp + FluxioExecutor.cpp HEADERS SkillManagerComponentPlugin.h SkillManagerComponentPluginUser.h + FluxioExecutor.h ) add_library(RobotAPI::skills::manager ALIAS RobotAPISkillsManager) diff --git a/source/RobotAPI/libraries/skills/manager/FluxioExecutor.cpp b/source/RobotAPI/libraries/skills/manager/FluxioExecutor.cpp new file mode 100644 index 000000000..b1767bbc0 --- /dev/null +++ b/source/RobotAPI/libraries/skills/manager/FluxioExecutor.cpp @@ -0,0 +1,51 @@ +#include "FluxioExecutor.h" + +#include "RobotAPI/libraries/skills/core/ProviderID.h" +#include "RobotAPI/libraries/skills/core/SkillDescription.h" +#include "RobotAPI/libraries/skills/core/SkillExecutionID.h" +#include "RobotAPI/libraries/skills/core/SkillExecutionRequest.h" +#include "RobotAPI/libraries/skills/core/SkillID.h" + +namespace armarx::plugins +{ + void + FluxioNativeExecutor::setPlugin(armarx::plugins::SkillManagerComponentPlugin* plugin) + { + this->plugin = plugin; + } + + void + FluxioNativeExecutor::run(std::string& executorName, armarx::aron::data::DictPtr& parameters) + { + skills::SkillID skillId = skills::SkillID{.providerId = + skills::ProviderID{.providerName = this->skill->skillProviderPtr->id}, + .skillName = this->skill->id}; + + const auto& skillDescr = this->plugin->getSkillDescription(skillId); + if (!skillDescr.has_value()) + { + // error + return; + } + + skills::SkillExecutionRequest req; + req.skillId = skillId; + req.parameters = skillDescr->rootProfileDefaults; + req.executorName = executorName; + + // FIXME: this may not work + *executionId = this->plugin->executeSkillAsync(req); + } + + std::optional<skills::SkillStatusUpdate> + FluxioNativeExecutor::getStatusUpdate() + { + if (this->executionId == nullptr || this->plugin == nullptr) + { + // error + return std::nullopt; + } + + return this->plugin->getSkillExecutionStatus(*this->executionId); + } +} // namespace armarx::plugins diff --git a/source/RobotAPI/libraries/skills/manager/FluxioExecutor.h b/source/RobotAPI/libraries/skills/manager/FluxioExecutor.h new file mode 100644 index 000000000..9e606daa8 --- /dev/null +++ b/source/RobotAPI/libraries/skills/manager/FluxioExecutor.h @@ -0,0 +1,32 @@ +#pragma once + +#include <string> + +#include "RobotAPI/libraries/skills/core/FluxioSkill.h" +#include "RobotAPI/libraries/skills/core/SkillExecutionID.h" +#include "RobotAPI/libraries/skills/core/SkillStatusUpdate.h" +#include "SkillManagerComponentPlugin.h" + +namespace armarx::plugins +{ + class SkillManagerComponentPlugin; // forward declaration + + class FluxioNativeExecutor + { + public: + std::string id; + std::string* executorName = nullptr; + skills::FluxioSkill* skill; + skills::SkillExecutionID* executionId = nullptr; + void run(std::string& executorName, + armarx::aron::data::DictPtr& parameters); + std::optional<skills::SkillStatusUpdate> getStatusUpdate(); + + void setPlugin(armarx::plugins::SkillManagerComponentPlugin* plugin); + + // TODO: abort etc. + + private: + armarx::plugins::SkillManagerComponentPlugin* plugin = nullptr; + }; +} // namespace armarx::skills diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp index e0f7a170d..24c04ab50 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp @@ -13,6 +13,7 @@ #include <ArmarXCore/core/time/Duration.h> #include <ArmarXCore/core/time/ice_conversions.h> +#include "RobotAPI/libraries/skills/core/FluxioParameter.h" #include "RobotAPI/libraries/skills/core/FluxioProfile.h" #include "RobotAPI/libraries/skills/core/FluxioProvider.h" #include "RobotAPI/libraries/skills/core/FluxioSkill.h" @@ -548,6 +549,8 @@ namespace armarx::plugins // convert to manager view auto statusUpdate = skills::SkillStatusUpdate::FromIce( provider_statusUpdate_ice.value(), providerId); + + ARMARX_WARNING << "Status update: " << statusUpdate.result; return statusUpdate; } catch (...) @@ -616,6 +619,31 @@ namespace armarx::plugins //** Fluxio related methods **// //****************************// + std::optional<std::string> + SkillManagerComponentPlugin::executeFluxioSkill(std::string skillId) + { + const auto& skill = getSkill(skillId); + if (!skill.has_value() || !skill.value().native) + { + ARMARX_WARNING << "Skill with id '" << skillId << "' not found or is not native."; + return std::nullopt; + } + + std::string executionId = IceUtil::generateUUID(); + FluxioNativeExecutor executor; + executor.setPlugin(this); + executor.skill = &fluxioDC.skills[skillId]; + executor.id = executionId; + + std::string executorName = "Fluxio"; + armarx::aron::data::DictPtr parameters = {}; + + fluxioDC.fluxioExecutors[executionId] = executor; + fluxioDC.fluxioExecutors[executionId].run(executorName, parameters); + + return executionId; + } + /** * @brief converts parametersType or resultType from skilldescription to fluxio parameters * @param ret the map to insert the fluxio parameters into @@ -685,6 +713,45 @@ namespace armarx::plugins } s.parameters = {}; + + // add default control flow parameters + skills::FluxioParameter start; + start.id = IceUtil::generateUUID(); + start.name = "Start"; + start.description = "Start the skill"; + start.type = "Event"; + start.required = true; + start.isInput = true; + + skills::FluxioParameter success; + success.id = IceUtil::generateUUID(); + success.name = "Success"; + success.description = "Skill has been executed successfully"; + success.type = "Event"; + success.required = false; + success.isInput = false; + + skills::FluxioParameter failure; + failure.id = IceUtil::generateUUID(); + failure.name = "Failure"; + failure.description = "Skill has failed"; + failure.type = "Event"; + failure.required = false; + failure.isInput = false; + + skills::FluxioParameter aborted; + aborted.id = IceUtil::generateUUID(); + aborted.name = "Aborted"; + aborted.description = "Skill has been aborted"; + aborted.type = "Event"; + aborted.required = false; + aborted.isInput = false; + + s.parameters[start.id] = start; + s.parameters[success.id] = success; + s.parameters[failure.id] = failure; + s.parameters[aborted.id] = aborted; + if (skillDescription.parametersType != nullptr) { // input parameters diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h index 02a5f98e2..25dae02be 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h @@ -20,6 +20,7 @@ #include <RobotAPI/libraries/skills/core/SkillExecutionRequest.h> #include <RobotAPI/libraries/skills/core/SkillStatusUpdate.h> +#include "FluxioExecutor.h" #include "SkillManagerComponentPluginUser.h" namespace armarx @@ -29,6 +30,8 @@ namespace armarx namespace armarx::plugins { + class FluxioNativeExecutor; // forward declaration + class SkillManagerComponentPlugin : public ComponentPlugin { public: @@ -70,6 +73,8 @@ namespace armarx::plugins //** Fluxio related methods **// //****************************// + std::optional<std::string> executeFluxioSkill(std::string skillId); + std::vector<skills::FluxioSkill> getSkillList(); std::optional<skills::FluxioSkill> getSkill(const std::string& id); @@ -110,6 +115,7 @@ namespace armarx::plugins std::map<std::string, skills::FluxioProvider> providers = {}; std::map<std::string, std::tuple<std::string, armarx::DateTime>> skillMutexMap = {}; const std::int64_t mutexTimeout = 30; // minutes + std::map<std::string, FluxioNativeExecutor> fluxioExecutors = {}; }; FluxioDataCollector fluxioDC = {}; diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp index 9c8973c88..8ecf87166 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.cpp @@ -156,6 +156,17 @@ namespace armarx //** Fluxio related methods **// //****************************// + IceUtil::Optional<std::string> SkillManagerComponentPluginUser::executeFluxioSkill(const std::string& skillId, const Ice::Current& current) + { + auto res = this->plugin->executeFluxioSkill(skillId); + if( res.has_value() ) + { + return *res; + } + + return {}; + } + skills::manager::dto::FluxioSkillList SkillManagerComponentPluginUser::getSkillList(const Ice::Current& current) { diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h index 68a803c7d..91ebe55c7 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPluginUser.h @@ -68,6 +68,9 @@ namespace armarx //** Fluxio related methods **// //****************************// + IceUtil::Optional<std::string> executeFluxioSkill(const std::string& skillId, + const Ice::Current& current) override; + skills::manager::dto::FluxioSkillList getSkillList(const Ice::Current& current) override; IceUtil::Optional<skills::manager::dto::FluxioSkill> -- GitLab