11 Logging::setTag(
"armarx::skills::" + description.skillName);
15 void Skill::installConditionWithCallback(std::function<
bool()>&& f, std::function<
void()>&& cb)
17 std::lock_guard l(callbacksMutex);
18 callbacks.push_back({f, cb});
21 bool Skill::isSkillAvailable(
const InitInput &in)
const
32 void Skill::resetSkill()
45 timeoutReached =
false;
50 void Skill::waitForDependenciesOfSkill()
53 this->waitForDependencies();
64 installConditionWithCallback(
66 [&](){ notifyTimeoutReached(); }
69 conditionCheckingThread = std::thread([&]()
75 std::scoped_lock l(callbacksMutex);
76 for (
auto& p : callbacks)
87 if (not sleepDuration.isPositive())
89 ARMARX_WARNING <<
deactivateSpam() <<
"PeriodicSkill: execution took too long (" << -sleepDuration <<
" vs " << conditionCheckingThreadFrequency.toCycleDuration() <<
")";
97 return this->init(in);
107 return this->
main(in);
115 if (conditionCheckingThread.joinable())
117 conditionCheckingThread.join();
123 auto ret = this->exit(in);
128 void Skill::notifyTimeoutReached()
130 timeoutReached =
true;
137 .
status = TerminatedSkillStatus::Aborted,
142 void Skill::notifySkillToStopASAP()
148 bool Skill::checkWhetherSkillShouldStopASAP()
const
150 return stopped || timeoutReached;
154 void Skill::onTimeoutReached()
157 void Skill::onStopRequested()
168 void Skill::waitForDependencies()
174 Skill::InitResult Skill::init(
const InitInput&)
177 return {.status = TerminatedSkillStatus::Succeeded};
181 Skill::ExitResult Skill::exit(
const ExitInput&)
184 return {.status = TerminatedSkillStatus::Succeeded};
190 ARMARX_IMPORTANT <<
"Dummy executing skill '" << description.skillName <<
"'. Please overwrite this method.";
191 return {.status = TerminatedSkillStatus::Succeeded, .data =
nullptr};
198 auto ret = this->mainOfSkill(in);