diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp index 197159cb79a4401ade9895b14936fc65a8bf3996..fa354d03d242c9e19b95a4a846309227503ae182 100644 --- a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp +++ b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp @@ -36,12 +36,6 @@ namespace armarx::skills { } - PeriodicSkill::StepResult - PeriodicSkill::stepOfSkill() - { - return this->step(); - } - Skill::MainResult PeriodicSkill::main() { @@ -51,7 +45,7 @@ namespace armarx::skills { this->throwIfSkillShouldTerminate(); - const auto res = stepOfSkill(); + const auto res = step(); switch (res.status) { case ActiveOrTerminatedSkillStatus::Running: @@ -68,14 +62,14 @@ namespace armarx::skills const auto sleepDuration = metronome.waitForNextTick(); if (not sleepDuration.isPositive()) { - ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" - << -sleepDuration << " too long. Expected " - << frequency.toCycleDuration() << ")"; + ARMARX_INFO << deactivateSpam() << __PRETTY_FUNCTION__ + << ": execution took too long (" << -sleepDuration + << " too long. Expected " << frequency.toCycleDuration() << ")"; } } // never happens - return MakeSucceededResult(); + throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!"); } PeriodicSkill::StepResult diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h index b11239dcf8074c8e53383137b0744bd720f802ff..aff91f19677f0ec362fbd7ca34ab2f3976661b96 100644 --- a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h +++ b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.h @@ -41,8 +41,6 @@ namespace armarx::skills PeriodicSkill(const SkillDescription& skillDescription, const armarx::Frequency& frequency); - StepResult stepOfSkill(); - protected: /// Do not use anymore Skill::MainResult main() final; diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h index 2c0669e54a13cce33b0fbc73595ce03028c287c6..914c6da0221973624309a57666064669e05de14a 100644 --- a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h @@ -50,12 +50,6 @@ namespace armarx::skills { } - StepResult - stepOfSkill() - { - return this->step(); - } - protected: /// Do not use anymore Skill::MainResult @@ -63,42 +57,33 @@ namespace armarx::skills { armarx::core::time::Metronome metronome(frequency); - while (not Skill::shouldSkillTerminate()) + while (true) { - const auto statusUpdate = stepOfSkill(); - switch (statusUpdate.status) + this->throwIfSkillShouldTerminate(); + + const auto res = step(); + switch (res.status) { case ActiveOrTerminatedSkillStatus::Running: - // nothing to do here + // nothing to do here. break switch break; case ActiveOrTerminatedSkillStatus::Aborted: - return {TerminatedSkillStatus::Aborted, statusUpdate.data}; + return Skill::MakeAbortedResult(); case ActiveOrTerminatedSkillStatus::Succeeded: - return {TerminatedSkillStatus::Succeeded, statusUpdate.data}; + return Skill::MakeSucceededResult(res.data); case ActiveOrTerminatedSkillStatus::Failed: - return {TerminatedSkillStatus::Failed, statusUpdate.data}; + return Skill::MakeFailedResult(); } const auto sleepDuration = metronome.waitForNextTick(); if (not sleepDuration.isPositive()) { - ARMARX_INFO << deactivateSpam() << "PeriodicSkill: execution took too long (" - << -sleepDuration << " too long. Expected " - << frequency.toCycleDuration() << ")"; + ARMARX_INFO << deactivateSpam() << __PRETTY_FUNCTION__ + << ": execution took too long (" << -sleepDuration + << " too long. Expected " << frequency.toCycleDuration() << ")"; } } - if (stopped) - { - return {TerminatedSkillStatus::Aborted, nullptr}; - } - - if (timeoutReached) - { - ARMARX_WARNING << "The skill " << getSkillId().toString() << " reached timeout!"; - return {TerminatedSkillStatus::Failed, nullptr}; - } - throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!"); } @@ -111,10 +96,6 @@ namespace armarx::skills return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr}; } - private: - using Skill::stopped; - using Skill::timeoutReached; - protected: const armarx::Frequency frequency; }; diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp index d5f8e6cbd628fc6f5f5022ad11f6908e6601368f..33a6475b3a9e2e01a30c40f4cee60e304a600b40 100644 --- a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp +++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp @@ -2,20 +2,53 @@ namespace armarx::skills { + SimplePeriodicSkill::SimplePeriodicSkill(const SkillDescription& skillDescription, + const armarx::Frequency& frequency) : + SimpleSkill(skillDescription), frequency(frequency) + { + } - PeriodicSkill::StepResult SimplePeriodicSkill::step() + Skill::MainResult + SimplePeriodicSkill::main(const MainInput& in) { - StepInput i; - i.executorName = this->executorName; - i.parameters = this->parameters; - i.callback = this->callback; - return this->step(i); + armarx::core::time::Metronome metronome(frequency); + + while (true) + { + this->throwIfSkillShouldTerminate(); + + const auto res = step(in); + switch (res.status) + { + case ActiveOrTerminatedSkillStatus::Running: + // nothing to do here. break switch + break; + case ActiveOrTerminatedSkillStatus::Aborted: + return MakeAbortedResult(); + case ActiveOrTerminatedSkillStatus::Succeeded: + return MakeSucceededResult(res.data); + case ActiveOrTerminatedSkillStatus::Failed: + return MakeFailedResult(); + } + + const auto sleepDuration = metronome.waitForNextTick(); + if (not sleepDuration.isPositive()) + { + ARMARX_INFO << deactivateSpam() << __PRETTY_FUNCTION__ + << ": execution took too long (" << -sleepDuration + << " too long. Expected " << frequency.toCycleDuration() << ")"; + } + } + + // never happens + throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!"); } - PeriodicSkill::StepResult SimplePeriodicSkill::step(const StepInput& in) + SimplePeriodicSkill::StepResult + SimplePeriodicSkill::step(const MainInput& in) { ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillId << "'. Please overwrite this method!"; return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr}; } -} +} // namespace armarx::skills diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h index 69a7ccc1868a53410886f32003849163a587c301..3ca70d213277e50fd5350458e62b8c8428050b52 100644 --- a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.h @@ -1,30 +1,33 @@ #pragma once -#include <RobotAPI/libraries/skills/provider/PeriodicSkill.h> +#include "PeriodicSkill.h" +#include "SimpleSkill.h" namespace armarx { namespace skills { - class SimplePeriodicSkill : public PeriodicSkill + class SimplePeriodicSkill : public SimpleSkill { public: - using Base = PeriodicSkill; + using Base = SimpleSkill; - struct StepInput - { - std::string executorName; - aron::data::DictPtr parameters; - CallbackT callback; - }; + using Base::Base; - using Base::Base; + using StepResult = PeriodicSkill::StepResult; + + SimplePeriodicSkill(const SkillDescription& skillDescription, + const armarx::Frequency& frequency); protected: - StepResult step() final; + /// Do not use anymore + Skill::MainResult main(const MainInput& in) final; - virtual StepResult step(const StepInput& in); + /// Override this method with your own step function + virtual StepResult step(const MainInput& in); + protected: + const armarx::Frequency frequency; }; } // namespace skills } // namespace armarx diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h index 221fdc2c779ea491cca88cff7e52b95f114d549a..ce3c968f587a7984fb606e8485297aa56ffff04a 100644 --- a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h @@ -1,51 +1,79 @@ #pragma once -#include <RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h> +#include "PeriodicSkill.h" +#include "SimpleSpecializedSkill.h" namespace armarx { namespace skills { template <class AronT> - class SimplePeriodicSpecializedSkill : public PeriodicSpecializedSkill<AronT> + class SimplePeriodicSpecializedSkill : public SimpleSpecializedSkill<AronT> { public: - using Base = PeriodicSpecializedSkill<AronT>; - using Skill::description; - using Skill::getSkillId; + using Base = SimpleSpecializedSkill<AronT>; + using ParamType = AronT; - using StepResult = PeriodicSkill::StepResult; + using Base::Base; - using Base::Base; + using StepResult = PeriodicSkill::StepResult; - struct SpecializedStepInput - { - std::string executorName; - AronT parameters; - Skill::CallbackT callback; - }; + SimplePeriodicSpecializedSkill(const SkillDescription& skillDescription, + const armarx::Frequency& frequency) : + Base(skillDescription), frequency(frequency) + { + } protected: - StepResult step() final - { - AronT p; - p.fromAron(this->parameters); - - SpecializedStepInput i; - i.executorName = this->executorName; - i.parameters = p; - i.callback = this->callback; - return this->step(i); - } - - virtual StepResult step(const SpecializedStepInput& in) - { - ARMARX_IMPORTANT << "Dummy executing once skill '" << description.skillId - << "'. Please overwrite this method!"; - return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr}; - } + /// Do not use anymore + Skill::MainResult + main(const typename Base::SpecializedMainInput& in) final + { + armarx::core::time::Metronome metronome(frequency); + while (true) + { + this->throwIfSkillShouldTerminate(); + + const auto res = step(in); + switch (res.status) + { + case ActiveOrTerminatedSkillStatus::Running: + // nothing to do here. break switch + break; + case ActiveOrTerminatedSkillStatus::Aborted: + return Skill::MakeAbortedResult(); + case ActiveOrTerminatedSkillStatus::Succeeded: + return Skill::MakeSucceededResult(res.data); + case ActiveOrTerminatedSkillStatus::Failed: + return Skill::MakeFailedResult(); + } + + const auto sleepDuration = metronome.waitForNextTick(); + if (not sleepDuration.isPositive()) + { + ARMARX_INFO << deactivateSpam() << __PRETTY_FUNCTION__ + << ": execution took too long (" << -sleepDuration + << " too long. Expected " << frequency.toCycleDuration() << ")"; + } + } + + // never happens + throw skills::error::SkillException(__PRETTY_FUNCTION__, "Should not happen!"); + } + + /// Override this method with your own step function + virtual StepResult + step(const typename Base::SpecializedMainInput& in) + { + ARMARX_IMPORTANT << "Dummy executing once skill '" << this->description.skillId + << "'. Please overwrite this method!"; + return {ActiveOrTerminatedSkillStatus::Succeeded, nullptr}; + } + + protected: + const armarx::Frequency frequency; }; } // namespace skills } // namespace armarx diff --git a/source/RobotAPI/libraries/skills/provider/SimpleSkill.h b/source/RobotAPI/libraries/skills/provider/SimpleSkill.h index a6cc87324f965176ff2fd7ea0dc5ff313e3439a7..45e4715d8bfaf4cc06c98199c67679396c071674 100644 --- a/source/RobotAPI/libraries/skills/provider/SimpleSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SimpleSkill.h @@ -9,7 +9,9 @@ namespace armarx class SimpleSkill : public Skill { public: - using Skill::Skill; + using Base = Skill; + + using Base::Base; struct InitInput { diff --git a/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h index 1572c16b70dc1744da2bff7c13280bdbe747ac82..b145311953fdd7e350a042e50b18219e365ec68e 100644 --- a/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h @@ -10,8 +10,10 @@ namespace armarx class SimpleSpecializedSkill : public Skill { public: + using Base = Skill; using ParamType = AronT; - using Skill::Skill; + + using Base::Base; struct SpecializedInitInput {