From b9ce4f14193619b0c1a489f27f62fea7ba78e890 Mon Sep 17 00:00:00 2001 From: Meixner <andre.meixner@kit.edu> Date: Mon, 12 Aug 2024 13:40:16 +0200 Subject: [PATCH] Added BusyWaiting and Recursive Skill example --- .../SkillProviderExample/BusyWaiting.cpp | 32 +++++++++++++ .../skills/SkillProviderExample/BusyWaiting.h | 42 ++++++++++++++++ .../SkillProviderExample/CMakeLists.txt | 5 ++ .../SkillProviderExample/RandomChaining.cpp | 2 +- .../skills/SkillProviderExample/Recursive.cpp | 48 +++++++++++++++++++ .../skills/SkillProviderExample/Recursive.h | 42 ++++++++++++++++ .../SkillProviderExample.cpp | 6 +++ .../SkillProviderExample.h | 2 + .../aron/RecursiveSkillParams.xml | 11 +++++ 9 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.cpp create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.h create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/Recursive.cpp create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/Recursive.h create mode 100644 source/RobotAPI/components/skills/SkillProviderExample/aron/RecursiveSkillParams.xml diff --git a/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.cpp b/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.cpp new file mode 100644 index 000000000..cf93b5f6e --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.cpp @@ -0,0 +1,32 @@ +#include "BusyWaiting.h" + +#include <chrono> +#include <thread> + +namespace armarx::skills::provider +{ + + BusyWaiting::BusyWaiting() : SimpleSkill(GetSkillDescription()) + { + } + + SkillDescription + BusyWaiting::GetSkillDescription() + { + return SkillDescription{.skillId = SkillID{.skillName = "BusyWaiting"}, + .description = "This skill takes two seconds", + .timeout = armarx::core::time::Duration::MilliSeconds(10000)}; + } + + Skill::MainResult + BusyWaiting::main(const MainInput& in) + { + for (unsigned int i = 0; i < 10; i++) + { + throwIfSkillShouldTerminate(); + std::this_thread::sleep_for(std::chrono::milliseconds(200)); + } + + return {TerminatedSkillStatus::Succeeded, nullptr}; + } +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.h b/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.h new file mode 100644 index 000000000..5a8094e5b --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/BusyWaiting.h @@ -0,0 +1,42 @@ + +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Andre Meixner ( andre dot meixner at kit dot edu ) + * @date 2024 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + + +// RobotAPI +#include <RobotAPI/libraries/skills/provider/SimpleSkill.h> + +namespace armarx::skills::provider +{ + + class BusyWaiting : public SimpleSkill + { + public: + BusyWaiting(); + + static SkillDescription GetSkillDescription(); + + private: + Skill::MainResult main(const MainInput&) final; + }; +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt index 97da6c47a..fbebe63f4 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt +++ b/source/RobotAPI/components/skills/SkillProviderExample/CMakeLists.txt @@ -21,6 +21,8 @@ set(SOURCES Segfault.cpp RandomChaining.cpp InstantKill.cpp + BusyWaiting.cpp + Recursive.cpp ) set(HEADERS @@ -33,6 +35,8 @@ set(HEADERS Segfault.h RandomChaining.h InstantKill.h + BusyWaiting.h + Recursive.h ) armarx_add_component("${SOURCES}" "${HEADERS}") @@ -42,6 +46,7 @@ armarx_enable_aron_file_generation_for_target( ${ARMARX_COMPONENT_NAME} ARON_FILES aron/HelloWorldAcceptedType.xml + aron/RecursiveSkillParams.xml ) #generate the application diff --git a/source/RobotAPI/components/skills/SkillProviderExample/RandomChaining.cpp b/source/RobotAPI/components/skills/SkillProviderExample/RandomChaining.cpp index b48462eef..28d1f23ed 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/RandomChaining.cpp +++ b/source/RobotAPI/components/skills/SkillProviderExample/RandomChaining.cpp @@ -33,7 +33,7 @@ namespace armarx::skills::provider Skill::MainResult RandomChainingSkill::main(const MainInput& in) { - std::vector<std::string> subskillNames = {"Timeout", "ChainingSkill", "Foo", "HelloWorld", "IncompleteSkill", "ShowMeCallbacks"}; + std::vector<std::string> subskillNames = {"Timeout", "ChainingSkill", "Foo", "HelloWorld", "IncompleteSkill", "ShowMeCallbacks", "BusyWaiting", "Recursive"}; ARMARX_CHECK(subskillNames.size() > 0); diff --git a/source/RobotAPI/components/skills/SkillProviderExample/Recursive.cpp b/source/RobotAPI/components/skills/SkillProviderExample/Recursive.cpp new file mode 100644 index 000000000..f2266cc40 --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/Recursive.cpp @@ -0,0 +1,48 @@ +#include "Recursive.h" +#include "RobotAPI/libraries/skills/core/SkillDescription.h" + +namespace armarx::skills::provider +{ + + Recursive::Recursive() : SimpleSpecializedSkill<skills::Example::RecursiveSkillParams>(GetSkillDescription()) + { + } + + SkillDescription + Recursive::GetSkillDescription() + { + armarx::skills::Example::RecursiveSkillParams root_profile_params; + root_profile_params.n = 10; + + return SkillDescription{.skillId = skills::SkillID{.skillName = "Recursive"}, + .description = "This skill calls itself recursively {n} times", + .rootProfileDefaults = root_profile_params.toAron(), + .timeout = armarx::core::time::Duration::MilliSeconds(10000), + .parametersType = + armarx::skills::Example::RecursiveSkillParams::ToAronType(), + .resultType = armarx::skills::Example::RecursiveSkillParams::ToAronType()}; + } + + Skill::MainResult + Recursive::main(const SpecializedMainInput& in) + { + const int n = in.parameters.n; + + if (n > 0) + { + SkillProxy prx(manager, + skills::SkillID{.providerId = *getSkillId().providerId, .skillName = "Recursive"}); + + armarx::skills::Example::RecursiveSkillParams params; + params.n = n - 1; + + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + callSubskill(prx, params.toAron()); + } + + throwIfSkillShouldTerminate(); + + return {TerminatedSkillStatus::Succeeded, nullptr}; + } +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/Recursive.h b/source/RobotAPI/components/skills/SkillProviderExample/Recursive.h new file mode 100644 index 000000000..a6c03497a --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/Recursive.h @@ -0,0 +1,42 @@ + +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @author Andre Meixner ( andre dot meixner at kit dot edu ) + * @date 2024 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +// RobotAPI +#include <RobotAPI/libraries/skills/provider/SimpleSpecializedSkill.h> + +#include <RobotAPI/components/skills/SkillProviderExample/aron/RecursiveSkillParams.aron.generated.h> + +namespace armarx::skills::provider +{ + class Recursive : public SimpleSpecializedSkill<skills::Example::RecursiveSkillParams> + { + public: + Recursive(); + + static SkillDescription GetSkillDescription(); + + private: + Skill::MainResult main(const SpecializedMainInput&) final; + }; +} // namespace armarx::skills::provider diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp index 0ee70319b..3d324e7dd 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp +++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.cpp @@ -69,6 +69,12 @@ namespace armarx::skills::provider // insta kill ARMARX_INFO << "Adding skill InstaKill"; addSkillFactory<InstantKillSkill>(); + + ARMARX_INFO << "Adding skill BusyWaiting"; + addSkillFactory<BusyWaiting>(); + + ARMARX_INFO << "Adding skill Recursive"; + addSkillFactory<Recursive>(); } void diff --git a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h index 43357844d..63168c11d 100644 --- a/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h +++ b/source/RobotAPI/components/skills/SkillProviderExample/SkillProviderExample.h @@ -37,6 +37,8 @@ #include "Timeout.h" #include "RandomChaining.h" #include "InstantKill.h" +#include "BusyWaiting.h" +#include "Recursive.h" namespace armarx::skills::provider { diff --git a/source/RobotAPI/components/skills/SkillProviderExample/aron/RecursiveSkillParams.xml b/source/RobotAPI/components/skills/SkillProviderExample/aron/RecursiveSkillParams.xml new file mode 100644 index 000000000..47d69a1b7 --- /dev/null +++ b/source/RobotAPI/components/skills/SkillProviderExample/aron/RecursiveSkillParams.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + <GenerateTypes> + <Object name='armarx::skills::Example::RecursiveSkillParams'> + <ObjectChild key='n'> + <int32 /> + </ObjectChild> + </Object> + </GenerateTypes> + +</AronTypeDefinition> \ No newline at end of file -- GitLab