14 Logging::setTag(
"armarx::skills::" + description.skillId.toString());
25 Skill::installConditionWithCallback(std::function<
bool()>&& f, std::function<
void()>&& cb)
27 std::scoped_lock l(conditionCallbacksMutex);
28 conditionCallbacks.push_back({f, cb});
31 std::optional<TerminatedSkillStatusUpdate>
37 std::optional<TerminatedSkillStatusUpdate>
40 auto executionId = callSubskillAsync(proxy, parameters);
41 auto ret = proxy.
join(executionId);
47 throwIfSkillShouldTerminate();
60 std::string executorHistory = this->executorName +
"->" + getSkillId().
toString();
62 throwIfSkillShouldTerminate();
65 std::unique_lock l(subskillsMutex);
66 throwIfSkillShouldTerminate(
71 this->subskills.push_back(eid);
75 std::optional<TerminatedSkillStatusUpdate>
76 Skill::callSubskill(
const SkillID& skillId)
78 return callSubskill(
SkillProxy(manager, skillId));
81 std::optional<TerminatedSkillStatusUpdate>
84 return callSubskill(
SkillProxy(manager, skillId), parameters);
87 std::optional<TerminatedSkillStatusUpdate>
88 Skill::callSubskill(
const SkillID& skillId,
99 parametersFunction(parameters);
101 return callSubskill(proxy, parameters);
107 std::scoped_lock l(this->parametersMutex);
108 if (this->parameters ==
nullptr)
111 this->parameters = d;
116 this->parameters->mergeAndReplaceCopy(d);
124 if (running or exiting or finished)
129 std::scoped_lock l(this->parametersMutex);
130 this->parameters = d;
134 Skill::getParameters()
const
136 return this->parameters;
143 this->initializing =
true;
144 this->constructing =
false;
145 this->preparing =
false;
146 this->running =
false;
147 this->exiting =
false;
148 this->finished =
false;
151 installConditionWithCallback(
156 [&]() { notifyTimeoutReached(); });
158 conditionCheckingThread = std::thread(
162 while (initializing or preparing or
166 std::scoped_lock l(conditionCallbacksMutex);
167 for (
auto& p : conditionCallbacks)
178 const auto sleepDuration = metronome.waitForNextTick();
179 if (not sleepDuration.isPositive())
182 <<
"ConditionCheckingThread: execution took too long ("
183 << -sleepDuration <<
" vs "
184 << conditionCheckingThreadFrequency.toCycleDuration()
189 return {.status = TerminatedSkillStatus::Succeeded};
195 this->preparing =
true;
196 this->initializing =
false;
197 this->constructing =
false;
198 this->running =
false;
199 this->exiting =
false;
202 if (shouldSkillTerminate())
204 return {.status = ActiveOrTerminatedSkillStatus::Aborted};
208 if (not description.parametersType)
210 return {.status = ActiveOrTerminatedSkillStatus::Succeeded};
212 if (this->parameters && this->parameters->fullfillsType(description.parametersType))
215 return {.status = ActiveOrTerminatedSkillStatus::Succeeded};
225 this->running =
true;
226 this->initializing =
false;
227 this->constructing =
false;
228 this->preparing =
false;
229 this->exiting =
false;
231 return {.status = TerminatedSkillStatus::Succeeded};
238 this->exiting =
true;
239 this->running =
false;
240 this->initializing =
false;
241 this->constructing =
false;
242 this->preparing =
false;
245 if (conditionCheckingThread.joinable())
247 conditionCheckingThread.join();
252 this->exiting =
false;
253 return {.status = TerminatedSkillStatus::Succeeded};
259 std::scoped_lock l(parametersMutex);
260 auto _res = this->_init();
261 auto res = this->init();
266 Skill::prepareSkill()
268 std::scoped_lock l(parametersMutex);
269 auto _res = this->_prepare();
270 auto res = this->prepare();
277 std::scoped_lock l(parametersMutex);
278 auto _res = this->_main();
279 auto res = this->
main();
287 std::scoped_lock l(parametersMutex);
288 auto res = this->exit();
289 auto _res = this->_exit();
294 Skill::throwIfSkillShouldTerminate(
const std::function<
void()>& do_before,
295 const std::string& abortedMessage)
297 if (shouldSkillTerminate())
300 throwIfSkillShouldTerminate(abortedMessage);
305 Skill::throwIfSkillShouldTerminate(
const std::string& abortedMessage)
310 std::string(
"The skill '" + getSkillId().
toString() +
"' was asked to stop.");
311 message += abortedMessage.empty() ?
"" :
" Additional message: " + abortedMessage;
320 std::string(
"The skill '" + getSkillId().
toString() +
"' reached timeout.");
321 message += abortedMessage.empty() ?
"" :
" Additional message: " + abortedMessage;
332 .
status = TerminatedSkillStatus::Succeeded,
338 Skill::MakeFailedResult()
341 .
status = TerminatedSkillStatus::Failed,
347 Skill::MakeAbortedResult()
350 .
status = TerminatedSkillStatus::Aborted,
356 Skill::notifySkillToStop()
363 std::scoped_lock l(subskillsMutex);
370 Skill::notifyTimeoutReached()
372 if (stopped || timeoutReached)
378 std::scoped_lock l(subskillsMutex);
379 timeoutReached =
true;
385 Skill::shouldSkillTerminate()
const
387 return stopped || timeoutReached;
392 Skill::_onTimeoutReached()
401 for (
const auto& execId : subskills)
403 manager->abortSkillAsync(execId.toManagerIce());
408 Skill::_onStopRequested()
417 for (
const auto& execId : subskills)
419 manager->abortSkillAsync(execId.toManagerIce());
424 Skill::onTimeoutReached()
429 Skill::onStopRequested()
438 return {.
status = TerminatedSkillStatus::Succeeded};
446 return {.
status = ActiveOrTerminatedSkillStatus::Succeeded};
454 return {.
status = TerminatedSkillStatus::Succeeded};
462 <<
"'. Please overwrite this method.";
463 return {.status = TerminatedSkillStatus::Succeeded, .data =
nullptr};
469 description.skillId.providerId = pid;
475 this->callback = callback;
479 Skill::setManager(
const manager::dti::SkillManagerInterfacePrx& manager)
481 this->manager = manager;
485 Skill::setExecutorName(
const std::string& executorName)
487 this->executorName = executorName;
491 Skill::getSkillDescription()
const
497 Skill::getSkillId()
const
499 return description.skillId;