diff --git a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt index fe8af64e0f5234e7486ba220589e8fcc880d2edb..b95ebf9bc2058093f917b7f5bfd2dd976df7ae29 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt +++ b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt @@ -20,6 +20,7 @@ set(SOURCES Timeout.cpp Segfault.cpp RandomExitStatus.cpp + Sleep.cpp ) set(HEADERS @@ -31,6 +32,7 @@ set(HEADERS Timeout.h Segfault.h RandomExitStatus.h + Sleep.h ) armarx_add_component("${SOURCES}" "${HEADERS}") @@ -40,6 +42,7 @@ armarx_enable_aron_file_generation_for_target( ${ARMARX_COMPONENT_NAME} ARON_FILES aron/HelloWorldAcceptedType.xml + aron/SleepAcceptedType.xml ) #generate the application diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp index 6eb6479239c09ee1d79f27e24c3370dd935c3be6..142465a88c63cde5e95294280177b0f0378082d0 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp +++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp @@ -65,6 +65,10 @@ namespace armarx::skills::provider // random exit status ARMARX_INFO << "Adding skill RandomExitStatus"; addSkillFactory<RandomExitStatus>(); + + // random exit status + ARMARX_INFO << "Adding skill Sleep"; + addSkillFactory<Sleep>(); } void diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h index 3bcce3e2ca728794223e755e9aa7accce01b799f..e65cc44ba62144d2797e834e9b96b82d36f332db 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h +++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h @@ -33,9 +33,10 @@ #include "Chaining.h" #include "HelloWorld.h" #include "Incomplete.h" +#include "RandomExitStatus.h" #include "Segfault.h" +#include "Sleep.h" #include "Timeout.h" -#include "RandomExitStatus.h" namespace armarx::skills::provider { diff --git a/source/RobotAPI/components/skills/SkillProviderExample/Sleep.cpp b/source/RobotAPI/components/skills/SkillProviderExample/Sleep.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1cd8bf8b75922139be7148bbbed58db063107ad2 --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/Sleep.cpp @@ -0,0 +1,68 @@ +#include "Sleep.h" + +#include <chrono> +#include <thread> + +#include <ArmarXCore/core/time/DateTime.h> + +namespace armarx::skills::provider +{ + Sleep::Sleep() : + SimpleSpecializedSkill<skills::Example::SleepAcceptedType>(GetSkillDescription()) + { + } + + SkillDescription + Sleep::GetSkillDescription() + { + armarx::skills::Example::SleepAcceptedType root_profile_params; + root_profile_params.Timeout_ms = 5000; + + return SkillDescription{ + .skillId = skills::SkillID{.skillName = "Sleep"}, + .description = + "This skill exits after the provided time (or five minutes, whichever is lower).", + .rootProfileDefaults = root_profile_params.toAron(), + .timeout = armarx::core::time::Duration::Minutes(5), + .parametersType = + armarx::skills::Example::SleepAcceptedType::SleepAcceptedType::ToAronType()}; + } + + void + Sleep::onStopRequested() + { + aborted = true; + } + + Skill::MainResult + Sleep::main(const SpecializedMainInput& in) + { + timeout = armarx::Duration::MilliSeconds(in.parameters.Timeout_ms); + auto start = armarx::DateTime::Now(); + for (;;) // forever + { + if (aborted) + { + ARMARX_INFO << "Skill has been woken up by abort."; + return Skill::MakeAbortedResult(); + } + + // check if the time is over + auto now = armarx::DateTime::Now(); + auto diff = now - start; + if (diff >= timeout) + { + ARMARX_INFO << "Skill has woken up by timeout."; + return Skill::MakeSucceededResult(); + } + else + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + } + + return {TerminatedSkillStatus::Succeeded, in.parameters.toAron()}; + } + + +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/Sleep.h b/source/RobotAPI/components/skills/SkillProviderExample/Sleep.h new file mode 100644 index 0000000000000000000000000000000000000000..7c5ea22434e7ed2f85085d574b6a1c708e1e99ae --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/Sleep.h @@ -0,0 +1,24 @@ +#pragma once + +// RobotAPI +#include <RobotAPI/components/skills/SkillProviderExample/aron/SleepAcceptedType.aron.generated.h> +#include <RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h> + +namespace armarx::skills::provider +{ + // Skills: + class Sleep : public SimpleSpecializedSkill<armarx::skills::Example::SleepAcceptedType> + { + public: + Sleep(); + + static SkillDescription GetSkillDescription(); + + void onStopRequested() override; + + private: + std::atomic_bool aborted = false; + armarx::Duration timeout; + Skill::MainResult main(const SpecializedMainInput& in) final; + }; +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/aron/SleepAcceptedType.xml b/source/RobotAPI/components/skills/SkillProviderExample/aron/SleepAcceptedType.xml new file mode 100644 index 0000000000000000000000000000000000000000..65b0acb70e3cb910bf5fcd468c1f0a38f0a5f7dc --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/aron/SleepAcceptedType.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <GenerateTypes> + <Object name='armarx::skills::Example::SleepAcceptedType'> + <ObjectChild key='Timeout_ms'> + <int32 /> + </ObjectChild> + </Object> + </GenerateTypes> + +</AronTypeDefinition>