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);
104 skills::SkillExecutionID
105 Skill::callSubskillAsync(
const SkillID& skillId,
116 parametersFunction(parameters);
118 return callSubskillAsync(proxy, parameters);
124 std::scoped_lock l(this->parametersMutex);
125 if (this->parameters ==
nullptr)
128 this->parameters = d;
133 this->parameters->mergeAndReplaceCopy(d);
141 if (running or exiting or finished)
146 std::scoped_lock l(this->parametersMutex);
147 this->parameters = d;
151 Skill::getParameters()
const
153 return this->parameters;
160 this->initializing =
true;
161 this->constructing =
false;
162 this->preparing =
false;
163 this->running =
false;
164 this->exiting =
false;
165 this->finished =
false;
168 installConditionWithCallback(
173 [&]() { notifyTimeoutReached(); });
175 conditionCheckingThread = std::thread(
179 while (initializing or preparing or
183 std::scoped_lock l(conditionCallbacksMutex);
184 for (
auto& p : conditionCallbacks)
195 const auto sleepDuration = metronome.waitForNextTick();
196 if (not sleepDuration.isPositive())
199 <<
"ConditionCheckingThread: execution took too long ("
200 << -sleepDuration <<
" vs "
201 << conditionCheckingThreadFrequency.toCycleDuration()
206 return {.status = TerminatedSkillStatus::Succeeded};
212 this->preparing =
true;
213 this->initializing =
false;
214 this->constructing =
false;
215 this->running =
false;
216 this->exiting =
false;
219 if (shouldSkillTerminate())
221 return {.status = ActiveOrTerminatedSkillStatus::Aborted};
225 if (not description.parametersType)
227 return {.status = ActiveOrTerminatedSkillStatus::Succeeded};
229 if (this->parameters && this->parameters->fullfillsType(description.parametersType))
232 return {.status = ActiveOrTerminatedSkillStatus::Succeeded};
242 this->running =
true;
243 this->initializing =
false;
244 this->constructing =
false;
245 this->preparing =
false;
246 this->exiting =
false;
248 return {.status = TerminatedSkillStatus::Succeeded};
255 this->exiting =
true;
256 this->running =
false;
257 this->initializing =
false;
258 this->constructing =
false;
259 this->preparing =
false;
262 if (conditionCheckingThread.joinable())
264 conditionCheckingThread.join();
269 this->exiting =
false;
270 return {.status = TerminatedSkillStatus::Succeeded};
276 std::scoped_lock l(parametersMutex);
277 auto _res = this->_init();
278 auto res = this->init();
283 Skill::prepareSkill()
285 std::scoped_lock l(parametersMutex);
286 auto _res = this->_prepare();
287 auto res = this->prepare();
294 std::scoped_lock l(parametersMutex);
295 auto _res = this->_main();
296 auto res = this->
main();
304 std::scoped_lock l(parametersMutex);
305 auto res = this->exit();
306 auto _res = this->_exit();
311 Skill::throwIfSkillShouldTerminate(
const std::function<
void()>& do_before,
312 const std::string& abortedMessage)
314 if (shouldSkillTerminate())
317 throwIfSkillShouldTerminate(abortedMessage);
322 Skill::throwIfSkillShouldTerminate(
const std::string& abortedMessage)
327 std::string(
"The skill '" + getSkillId().
toString() +
"' was asked to stop.");
328 message += abortedMessage.empty() ?
"" :
" Additional message: " + abortedMessage;
337 std::string(
"The skill '" + getSkillId().
toString() +
"' reached timeout.");
338 message += abortedMessage.empty() ?
"" :
" Additional message: " + abortedMessage;
349 .
status = TerminatedSkillStatus::Succeeded,
355 Skill::MakeFailedResult()
358 .
status = TerminatedSkillStatus::Failed,
364 Skill::MakeAbortedResult()
367 .
status = TerminatedSkillStatus::Aborted,
373 Skill::notifySkillToStop()
380 std::scoped_lock l(subskillsMutex);
387 Skill::notifyTimeoutReached()
389 if (stopped || timeoutReached)
395 std::scoped_lock l(subskillsMutex);
396 timeoutReached =
true;
402 Skill::shouldSkillTerminate()
const
404 return stopped || timeoutReached;
409 Skill::_onTimeoutReached()
418 for (
const auto& execId : subskills)
420 manager->abortSkillAsync(execId.toManagerIce());
425 Skill::_onStopRequested()
434 for (
const auto& execId : subskills)
436 manager->abortSkillAsync(execId.toManagerIce());
441 Skill::onTimeoutReached()
446 Skill::onStopRequested()
455 return {.
status = TerminatedSkillStatus::Succeeded};
463 return {.
status = ActiveOrTerminatedSkillStatus::Succeeded};
471 return {.
status = TerminatedSkillStatus::Succeeded};
479 <<
"'. Please overwrite this method.";
480 return {.status = TerminatedSkillStatus::Succeeded, .data =
nullptr};
486 description.skillId.providerId = pid;
492 this->callback = callback;
496 Skill::setManager(
const manager::dti::SkillManagerInterfacePrx& manager)
498 this->manager = manager;
502 Skill::setExecutorName(
const std::string& executorName)
504 this->executorName = executorName;
508 Skill::getSkillDescription()
const
514 Skill::getSkillId()
const
516 return description.skillId;