From b37cb8c2c0fc2e8c7986cd770267e3052165b388 Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Tue, 21 Nov 2023 16:04:31 +0100 Subject: [PATCH] Refactor callSubskill() overloads with @peller --- .../RobotAPI/libraries/skills/core/Skill.cpp | 42 +++++---- source/RobotAPI/libraries/skills/core/Skill.h | 93 ++++++++++++++----- 2 files changed, 96 insertions(+), 39 deletions(-) diff --git a/source/RobotAPI/libraries/skills/core/Skill.cpp b/source/RobotAPI/libraries/skills/core/Skill.cpp index 22e1fc21e..a01eb4908 100644 --- a/source/RobotAPI/libraries/skills/core/Skill.cpp +++ b/source/RobotAPI/libraries/skills/core/Skill.cpp @@ -19,10 +19,22 @@ namespace armarx } std::optional<TerminatedSkillStatusUpdate> - Skill::callSubskill(const SkillProxy& prx, const aron::data::DictPtr& params) + Skill::callSubskill(const SkillProxy& proxy) { - auto eid = callSubskillAsync(prx, params); - auto ret = prx.join(eid); + return callSubskill(proxy, proxy.getRootProfileParameters()); + } + + std::optional<TerminatedSkillStatusUpdate> + Skill::callSubskill(const SkillProxy& proxy, const aron::data::DictPtr& parameters) + { + auto executionId = callSubskillAsync(proxy, parameters); + auto ret = proxy.join(executionId); + + // While the sub skill was running, our skill might also have been aborted. + // In this case, the correct behavour would be aborting ourselves. + // The caller of callSubskill() can catch the thrown error::SkillAbortedException + // if necessary. + throwIfSkillShouldTerminate(); return ret; } @@ -38,17 +50,20 @@ namespace armarx } std::optional<TerminatedSkillStatusUpdate> - Skill::callSubskillWithParameters(const SkillID& skillId, - const aron::data::DictPtr& parameters) + Skill::callSubskill(const SkillID& skillId) { - SkillProxy proxy(manager, skillId); - return callSubskill(proxy, parameters); + return callSubskill(SkillProxy(manager, skillId)); } std::optional<TerminatedSkillStatusUpdate> - Skill::callSubskillBasedOnDefaultParameters( - const SkillID& skillId, - std::function<void(aron::data::DictPtr&)> parametersFunction) + Skill::callSubskill(const SkillID& skillId, const aron::data::DictPtr& parameters) + { + return callSubskill(SkillProxy(manager, skillId), parameters); + } + + std::optional<TerminatedSkillStatusUpdate> + Skill::callSubskill(const SkillID& skillId, + std::function<void(aron::data::DictPtr&)> parametersFunction) { SkillProxy proxy(manager, skillId); @@ -63,13 +78,6 @@ namespace armarx return callSubskill(proxy, parameters); } - std::optional<TerminatedSkillStatusUpdate> - Skill::callSubskillWithDefaultParameters(const SkillID& skillId) - { - auto parametersFn = [](aron::data::DictPtr&) {}; - return callSubskillBasedOnDefaultParameters(skillId, parametersFn); - } - void Skill::updateParameters(const aron::data::DictPtr& d) { diff --git a/source/RobotAPI/libraries/skills/core/Skill.h b/source/RobotAPI/libraries/skills/core/Skill.h index 8e42844ee..9fffd35a6 100644 --- a/source/RobotAPI/libraries/skills/core/Skill.h +++ b/source/RobotAPI/libraries/skills/core/Skill.h @@ -23,6 +23,9 @@ namespace armarx { namespace skills { + /** + * @brief Base class for skills. + */ class Skill : public armarx::Logging { public: @@ -181,36 +184,82 @@ namespace armarx void installConditionWithCallback(std::function<bool()>&& f, std::function<void()>&& cb); - /// call a subskill and block until the subskill terminates. - /// If you call a subskill this way it will be stopped if the current skill stops. + // Calling subskills + + /** + * @brief Call a subskill with default parameters and block until the subskill terminates. + * + * If you call a subskill this way it will be stopped if the current skill stops. + * + * @param proxy Skill proxy. + * @return Terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. + */ std::optional<TerminatedSkillStatusUpdate> - callSubskill(const skills::SkillProxy& prx, const aron::data::DictPtr& = nullptr); + callSubskill(const skills::SkillProxy& proxy); + + /** + * @brief Call a subskill with given parameters and block until the subskill terminates. + * @param proxy Skill proxy. + * @param parameters Parameters passed to the skill. + * @return Terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. + */ + std::optional<TerminatedSkillStatusUpdate> + callSubskill(const skills::SkillProxy& proxy, const aron::data::DictPtr& parameters); + + /// Similar to callSubskill but non-blocking + skills::SkillExecutionID callSubskillAsync(const skills::SkillProxy& proxy); /// Similar to callSubskill but non-blocking - skills::SkillExecutionID callSubskillAsync(const skills::SkillProxy& prx, - const aron::data::DictPtr& = nullptr); + skills::SkillExecutionID callSubskillAsync(const skills::SkillProxy& proxy, + const aron::data::DictPtr& parameters); + + /** + * @brief Call a subskill with the given ID and its default parameters. + * @param skillId The subskill's ID. + * @return The terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. + */ + std::optional<TerminatedSkillStatusUpdate> callSubskill(const SkillID& skillId); /** * @brief Call a subskill with the given ID and parameters. * @param skillId The subskill's ID. * @param parameters The parameters. * @return The terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. */ std::optional<TerminatedSkillStatusUpdate> - callSubskillWithParameters(const SkillID& skillId, - const aron::data::DictPtr& parameters); + callSubskill(const SkillID& skillId, const aron::data::DictPtr& parameters); /** * @brief Call a subskill with the given ID and parameters. * @param skillId The subskill's ID. * @param parameters The parameters. * @return The terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. */ template <class ParameterT> std::optional<TerminatedSkillStatusUpdate> - callSubskillWithParameters(const SkillID& skillId, const ParameterT& parameters) + callSubskill(const SkillID& skillId, const ParameterT& parameters) { - return callSubskillWithParameters(skillId, parameters.toAron()); + return callSubskill(skillId, parameters.toAron()); } /** @@ -222,18 +271,14 @@ namespace armarx * @param skillId The subskill's ID. * @param parametersFunction Function which edits the parameters. * @return The terminated skill status update. - */ - std::optional<TerminatedSkillStatusUpdate> callSubskillBasedOnDefaultParameters( - const SkillID& skillId, - std::function<void(aron::data::DictPtr& parameters)> parametersFunction); - - /** - * @brief Call a subskill with its default parameters. - * @param skillId The subskill's ID. - * @return The terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. */ std::optional<TerminatedSkillStatusUpdate> - callSubskillWithDefaultParameters(const SkillID& skillId); + callSubskill(const SkillID& skillId, + std::function<void(aron::data::DictPtr& parameters)> parametersFunction); /** * @brief Call a subskill with parameters based on the default parameters. @@ -246,12 +291,15 @@ namespace armarx * @param skillId The subskill's ID. * @param parametersFunction Function which edits the parameters. * @return The terminated skill status update. + * @throw armarx::skills::error::SkillAbortedException + * If the calling skill has been aborted. + * @throw armarx::skills::error::SkillFailedException + * If the calling skill's timeout was reached. */ template <class ParameterT> std::optional<TerminatedSkillStatusUpdate> - callSubskillBasedOnDefaultParameters( - const SkillID& skillId, - std::function<void(ParameterT& parameters)> parametersFunction) + callSubskill(const SkillID& skillId, + std::function<void(ParameterT& parameters)> parametersFunction) { SkillProxy proxy(manager, skillId); @@ -266,6 +314,7 @@ namespace armarx return callSubskill(proxy, parameters.toAron()); } + public: // running params armarx::core::time::DateTime started = armarx::core::time::DateTime::Now(); -- GitLab