#include <cstdlib> #include "RandomChaining.h" #include <thread> #include <chrono> namespace armarx::skills::provider { namespace util { int randomgen(int max, int min) //Pass in range { srand(time(NULL)); //Changed from rand(). srand() seeds rand for you. int random = rand() % max + min; return random; } } RandomChainingSkill::RandomChainingSkill() : SimpleSkill(GetSkillDescription()) { } SkillDescription RandomChainingSkill::GetSkillDescription() { return SkillDescription{.skillId = armarx::skills::SkillID{.skillName = "RandomChainingSkill"}, .description = "This skill calls 100 random subskills from the skillProviderExample excluding the segfault skill.", .timeout = armarx::core::time::Duration::MilliSeconds(50000)}; } Skill::MainResult RandomChainingSkill::main(const MainInput& in) { std::vector<std::string> subskillNames = {"Timeout", "ChainingSkill", "Foo", "HelloWorld", "IncompleteSkill", "ShowMeCallbacks"}; ARMARX_CHECK(subskillNames.size() > 0); for (unsigned int i = 0; i < 100; ++i) { this->throwIfSkillShouldTerminate(); auto index = util::randomgen(subskillNames.size() -1, 0); auto subskillName = subskillNames[index]; SkillProxy prx( manager, skills::SkillID{.providerId = *getSkillId().providerId, .skillName = subskillName}); if (util::randomgen(10, 0) < 2) { callSubskill(prx); } else { callSubskillAsync(prx); auto sleep_milliseconds = util::randomgen(1000, 0); ARMARX_INFO << "SLEEP FOR " << sleep_milliseconds << "ms"; std::this_thread::sleep_for(std::chrono::milliseconds(sleep_milliseconds)); } } return {TerminatedSkillStatus::Succeeded, nullptr}; } } // namespace armarx::skills::provider