diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp index 88e72c19d6d60350a6d8ac7c7fc2fb14df193518..d60649b2fe5e301264c5f5cc7fcba1ab58be9b6d 100644 --- a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp +++ b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.cpp @@ -17,8 +17,17 @@ namespace armarx::skills { - FluxioCompositeExecutor::FluxioCompositeExecutor(std::string& id, skills::FluxioSkill* skill) : - FluxioExecutor(id, false), skill(skill) + FluxioCompositeExecutor::FluxioCompositeExecutor( + std::string& id, + skills::FluxioSkill* skill, + const std::function<void(const std::string& executionId)>&& abortFluxioSkillFunc, + const std::function<FluxioExecutor*(const std::string& skillId, + const std::string& executorName)>&& + executeFluxioSkillFunc) : + FluxioExecutor(id, false), + skill(skill), + abortFluxioSkill(abortFluxioSkillFunc), + executeFluxioSkill(executeFluxioSkillFunc) { } @@ -220,7 +229,7 @@ namespace armarx::skills } // start skill execution - auto* executorPtr = plugin->executeFluxioSkill(subSkillNode->skillPtr->id, executorName); + auto* executorPtr = executeFluxioSkill(subSkillNode->skillPtr->id, executorName); if (executorPtr == nullptr) { ARMARX_WARNING << "Failed to execute subskill " << subSkillNode->skillPtr->id; @@ -390,7 +399,7 @@ namespace armarx::skills // there is no execution for the merger yet, let´s start one subExecutionsMap[controlNode->nodeId] = - new FluxioMergerExecutor(IceUtil::generateUUID(), plugin, paramIds); + new FluxioMergerExecutor(IceUtil::generateUUID(), paramIds); mergerExecutorPtr = dynamic_cast<FluxioMergerExecutor*>(subExecutionsMap[controlNode->nodeId]); diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h index 2064a79d53c87d8ead2cdb2abbb1c80892359512..5fc27bb61cfd921c895d5c99fb4a11bee044c753 100644 --- a/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h +++ b/source/RobotAPI/libraries/skills/core/executor/FluxioCompositeExecutor.h @@ -19,7 +19,13 @@ namespace armarx::skills class FluxioCompositeExecutor : public FluxioExecutor { public: - FluxioCompositeExecutor(std::string& id, skills::FluxioSkill* skill); + FluxioCompositeExecutor( + std::string& id, + skills::FluxioSkill* skill, + const std::function<void(const std::string& executionId)>&& abortFluxioSkillFunc, + const std::function<FluxioExecutor*(const std::string& skillId, + const std::string& executorName)>&& + executeFluxioSkillFunc); void run(const std::string executorName, armarx::aron::data::DictPtr parameters) override; void abort() override; std::optional<std::vector<skills::FluxioSkillStatusUpdate>> getStatusUpdate() override; @@ -48,5 +54,9 @@ namespace armarx::skills void setStatus(skills::SkillStatus status) override; void pollSubStatuses(); std::map<std::string, FluxioExecutor*> subExecutionsMap; // key is node id + const std::function<void(const std::string& executionId)> abortFluxioSkill; + const std::function<FluxioExecutor*(const std::string& skillId, + const std::string& executorName)> + executeFluxioSkill; }; } // namespace armarx::skills diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp index a88e2df115a1ab49d7f13750d17f1d5e92f680e0..e3b2f03fbd531c571b4b5d36349b49b250b1ec15 100644 --- a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp +++ b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.cpp @@ -10,10 +10,21 @@ namespace armarx::skills { - FluxioNativeExecutor::FluxioNativeExecutor(std::string& id, - skills::SkillID& skillId, - std::string& fluxioUUID) : - FluxioExecutor(id, true), skillId(skillId), fluxioUUID(fluxioUUID) + FluxioNativeExecutor::FluxioNativeExecutor( + std::string& id, + skills::SkillID& skillId, + std::string& fluxioUUID, + const std::function<bool(const skills::SkillExecutionID&)>&& abortSkillFunc, + const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)>&& + executeSkillAsyncFunc, + const std::function<std::optional<skills::SkillStatusUpdate>( + const skills::SkillExecutionID&)>&& getSkillExecutionStatusFunc) : + FluxioExecutor(id, true), + skillId(skillId), + fluxioUUID(fluxioUUID), + abortSkill(abortSkillFunc), + executeSkillAsync(executeSkillAsyncFunc), + getSkillExecutionStatus(getSkillExecutionStatusFunc) { } @@ -26,7 +37,7 @@ namespace armarx::skills req.parameters = parameters; req.executorName = executorName; - auto eid = this->plugin->executeSkillAsync(req); + auto eid = executeSkillAsync(req); this->executionId = eid; } @@ -34,7 +45,7 @@ namespace armarx::skills void FluxioNativeExecutor::abort() { - if (!this->executionId.has_value() || this->plugin == nullptr) + if (!this->executionId.has_value()) { // error ARMARX_WARNING << "Execution ID or plugin is not set"; @@ -42,13 +53,13 @@ namespace armarx::skills } // TODO: check last execution status - this->plugin->abortSkill(this->executionId.value()); + abortSkill(this->executionId.value()); } std::optional<std::vector<skills::FluxioSkillStatusUpdate>> FluxioNativeExecutor::getStatusUpdate() { - if (!this->executionId.has_value() || this->plugin == nullptr) + if (!this->executionId.has_value()) { // error ARMARX_WARNING << "Execution ID or plugin is not set"; @@ -57,7 +68,7 @@ namespace armarx::skills auto executionId = this->executionId.value(); - auto status = this->plugin->getSkillExecutionStatus(executionId); + auto status = getSkillExecutionStatus(executionId); if (!status.has_value()) { diff --git a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h index fc312fb4b7924af1aea785f573757f737c72e398..3b8288cac2887a7fdb446a7152f4e32912dc4b3f 100644 --- a/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h +++ b/source/RobotAPI/libraries/skills/core/executor/FluxioNativeExecutor.h @@ -3,6 +3,10 @@ #include <optional> #include <string> +#include "RobotAPI/libraries/skills/core/SkillExecutionRequest.h" +#include "RobotAPI/libraries/skills/core/SkillID.h" +#include "RobotAPI/libraries/skills/core/SkillStatusUpdate.h" + #include "../FluxioSkillStatusUpdate.h" #include "../SkillExecutionID.h" #include "FluxioExecutor.h" @@ -12,7 +16,15 @@ namespace armarx::skills class FluxioNativeExecutor : public FluxioExecutor { public: - FluxioNativeExecutor(std::string& id, skills::SkillID& skillId, std::string& fluxioUUID); + FluxioNativeExecutor( + std::string& id, + skills::SkillID& skillId, + std::string& fluxioUUID, + const std::function<bool(const skills::SkillExecutionID&)>&& abortSkillFunc, + const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)>&& + executeSkillAsyncFunc, + const std::function<std::optional<skills::SkillStatusUpdate>( + const skills::SkillExecutionID&)>&& getSkillExecutionStatusFunc); void run(const std::string executorName, armarx::aron::data::DictPtr parameters) override; void abort() override; @@ -23,7 +35,11 @@ namespace armarx::skills skills::SkillID skillId; std::string fluxioUUID; void setStatus(skills::SkillStatus status) override; - - //std::function<void(skills::SkillID&)> foo; + const std::function<bool(const skills::SkillExecutionID&)> abortSkill; + const std::function<skills::SkillExecutionID(const skills::SkillExecutionRequest&)> + executeSkillAsync; + const std::function<std::optional<skills::SkillStatusUpdate>( + const skills::SkillExecutionID&)> + getSkillExecutionStatus; }; } // namespace armarx::skills diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp index 28abe0c8fd385a3da916e2ea1c7a0e2b6d8f337a..985558d8ed38b4e3c681a1605b1ab2a2383e07da 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp @@ -619,7 +619,7 @@ namespace armarx::plugins //****************************// skills::FluxioExecutor* - SkillManagerComponentPlugin::executeFluxioSkill(std::string skillId, + SkillManagerComponentPlugin::executeFluxioSkill(const std::string& skillId, const std::string& executorName) { const auto& skill = getSkill(skillId); @@ -636,8 +636,18 @@ namespace armarx::plugins // currently empty parameters armarx::aron::data::DictPtr emptyParameters = {}; + const auto& executeFluxioSkillFunc = + [this](const std::string& skillId, const std::string& executorName) + { return this->executeFluxioSkill(skillId, executorName); }; + + const auto& abortFluxioSkill = [this](const std::string& executionId) + { this->abortFluxioSkill(executionId); }; + fluxioDC.fluxioExecutors[executionId] = - new skills::FluxioCompositeExecutor(executionId, &fluxioDC.skills[skillId]); + new skills::FluxioCompositeExecutor(executionId, + &fluxioDC.skills[skillId], + std::move(abortFluxioSkill), + std::move(executeFluxioSkillFunc)); std::thread( [this, executionId, executorName, emptyParameters]() @@ -658,10 +668,26 @@ namespace armarx::plugins return nullptr; } + const auto& abortSkillFunc = [this](const skills::SkillExecutionID& executionId) + { return this->abortSkill(executionId); }; + + const auto& executeSkillAsyncFunc = [this](const skills::SkillExecutionRequest& req) + { return this->executeSkillAsync(req); }; + + const auto& getSkillExecutionStatusFunc = + [this](const skills::SkillExecutionID& executionId) + { return this->getSkillExecutionStatus(executionId); }; + + // FIXME: do not use new, instead use smart pointer std::string fluxioSkillUUID = skill->id; fluxioDC.fluxioExecutors[executionId] = - new skills::FluxioNativeExecutor(executionId, sID, fluxioSkillUUID); + new skills::FluxioNativeExecutor(executionId, + sID, + fluxioSkillUUID, + std::move(abortSkillFunc), + std::move(executeSkillAsyncFunc), + std::move(getSkillExecutionStatusFunc)); fluxioDC.fluxioExecutors[executionId]->run(executorName, skillDescr->rootProfileDefaults); } diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h index 6f8a782065779e8e4b36d5ba0091c846f6c44b9d..d99c2860106fd8cfc50d986c4e1d8d0834174a8e 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h @@ -75,7 +75,7 @@ namespace armarx::plugins //** Fluxio related methods **// //****************************// - skills::FluxioExecutor* executeFluxioSkill(std::string skillId, + skills::FluxioExecutor* executeFluxioSkill(const std::string& skillId, const std::string& executorName); void abortFluxioSkill(const std::string& executionId);