18 auto& p = parent<SkillProviderComponentPluginUser>();
19 p.getProxy(myPrx, -1);
25 auto& p = parent<SkillProviderComponentPluginUser>();
26 const std::string providerName = p.getName();
30 .providerInterface = myPrx,
33 ARMARX_INFO <<
"Adding provider to manager: " << i.providerId;
34 manager->addProvider(i.toIce());
40 auto& p = parent<SkillProviderComponentPluginUser>();
41 std::string providerName = p.getName();
43 auto id = skills::manager::dto::ProviderID{providerName};
44 manager->removeProvider(
id);
48 skillFactories.clear();
54 std::string
prefix =
"skill.";
55 properties->component(
59 "The name of the SkillManager (or SkillMemory) proxy this provider belongs to.");
70 auto& p = parent<SkillProviderComponentPluginUser>();
71 const std::string componentName = p.getName();
76 const std::unique_lock l(skillFactoriesMutex);
77 auto skillId = fac->createSkillDescription(providerId).skillId;
79 if (skillFactories.find(skillId) != skillFactories.end())
81 ARMARX_WARNING <<
"Try to add a skill factory for skill '" + skillId.toString() +
82 "' which already exists in list. Ignoring this skill.";
86 ARMARX_INFO <<
"Adding skill `" << skillId <<
"` to component `" << componentName <<
"` .";
88 skillFactories.emplace(skillId, std::move(fac));
105 return addSkillFactory<skills::LambdaSkill>(desc, f);
114 if (skillFactories.count(skillId) == 0)
116 ARMARX_INFO <<
"Could not find a skill factory for id: " << skillId;
120 auto* facPtr = skillFactories.at(skillId).get();
124 std::optional<skills::SkillStatusUpdate>
130 const std::shared_lock l(skillExecutionsMutex);
131 if (skillExecutions.find(execId) == skillExecutions.end())
138 std::scoped_lock l2{skillExecutions.at(execId).skillStatusesMutex};
139 return skillExecutions.at(execId).statusUpdate;
142 std::map<skills::SkillExecutionID, skills::SkillStatusUpdate>
145 std::map<skills::SkillExecutionID, skills::SkillStatusUpdate> skillUpdates;
147 const std::shared_lock l(skillExecutionsMutex);
148 for (
const auto& [key, impl] : skillExecutions)
150 const std::scoped_lock l2(impl.skillStatusesMutex);
151 skillUpdates.insert({key, impl.statusUpdate});
156 std::optional<skills::SkillDescription>
161 const std::shared_lock l(skillFactoriesMutex);
162 if (skillFactories.find(skillId) == skillFactories.end())
164 std::stringstream ss;
165 ss <<
"Skill description for skill '" + skillId.
toString() +
166 "' not found! Found instead: {"
168 for (
const auto& [k, _] : skillFactories)
170 ss <<
"\t" << k.toString() <<
"\n";
178 return skillFactories.at(skillId)->createSkillDescription(*skillId.
providerId);
181 std::map<skills::SkillID, skills::SkillDescription>
184 std::map<skills::SkillID, skills::SkillDescription> skillDesciptions;
185 const std::shared_lock l(skillFactoriesMutex);
186 for (
const auto& [key, fac] : skillFactories)
189 skillDesciptions.insert({key, fac->createSkillDescription(*key.providerId)});
191 return skillDesciptions;
202 .executionStartedTime =
210 auto l1 = std::unique_lock{skillFactoriesMutex};
212 const auto& fac = getSkillFactory(executionId.skillId);
213 ARMARX_CHECK(fac) <<
"Could not find a factory for skill " << executionId.skillId;
216 const std::unique_lock l2{skillExecutionsMutex};
218 skillExecutions.emplace(std::piecewise_construct,
219 std::make_tuple(executionId),
224 wrapper = &it.first->second;
236 ret.result = x.result;
239 catch (std::exception& e)
242 <<
"Got an uncatched Exception when executing a skill. Exception was: "
248 if (wrapper && wrapper->
execution.joinable())
273 auto l1 = std::unique_lock{skillFactoriesMutex};
275 const auto& fac = getSkillFactory(executionRequest.
skillId);
279 const std::unique_lock l2{skillExecutionsMutex};
285 if (skillExecutions.count(executionId) > 0)
287 ARMARX_ERROR <<
"SkillsExecutionID already exists! This is undefined behaviour "
288 "and should not occur!";
292 skillExecutions.emplace(std::piecewise_construct,
293 std::make_tuple(executionId),
298 wrapper = &it.first->second;
310 catch (std::exception& e)
313 <<
"Got an uncatched Exception when executing a skill. Exception was: "
331 std::this_thread::sleep_for(std::chrono::milliseconds(20));
343 std::shared_lock l{skillExecutionsMutex};
344 auto it = skillExecutions.find(executionId);
345 if (it == skillExecutions.end())
348 "' found! Ignoring prepareSkill request.";
352 std::scoped_lock l2{it->second.skillStatusesMutex};
356 "' because its not in preparing phase.";
360 it->second.updateSkillParameters(
input);
369 std::shared_lock l(skillExecutionsMutex);
370 auto it = skillExecutions.find(executionId);
371 if (it == skillExecutions.end())
374 "' found! Ignoring abortSkill request.";
378 auto& runtime = it->second;
384 std::scoped_lock l2(runtime.skillStatusesMutex);
385 auto status = runtime.statusUpdate;
387 if (
status.hasBeenTerminated())
392 std::this_thread::sleep_for(std::chrono::milliseconds(20));
403 std::shared_lock l(skillExecutionsMutex);
404 auto it = skillExecutions.find(executionId);
405 if (it == skillExecutions.end())
408 "' found! Ignoring abortSkill request.";
412 it->second.stopSkill();
425 IceUtil::Optional<skills::provider::dto::SkillDescription>
427 const skills::provider::dto::SkillID& skillId,
428 const Ice::Current& )
431 auto o = plugin->getSkillDescription(
id);
434 return o->toProviderIce();
439 skills::provider::dto::SkillDescriptionMap
442 skills::provider::dto::SkillDescriptionMap
ret;
443 for (
const auto& [k,
v] : plugin->getSkillDescriptions())
445 ret.insert({k.toProviderIce(),
v.toProviderIce()});
450 IceUtil::Optional<skills::provider::dto::SkillStatusUpdate>
452 const skills::provider::dto::SkillExecutionID& executionId,
453 const Ice::Current& )
457 auto o = plugin->getSkillExecutionStatus(execId);
460 return o->toProviderIce();
465 skills::provider::dto::SkillStatusUpdateMap
468 skills::provider::dto::SkillStatusUpdateMap
ret;
469 for (
const auto& [k,
v] : plugin->getSkillExecutionStatuses())
471 ret.insert({k.toProviderIce(),
v.toProviderIce()});
477 skills::provider::dto::SkillStatusUpdate
479 const skills::provider::dto::SkillExecutionRequest& info,
480 const Ice::Current& )
484 auto up = this->plugin->executeSkill(exec);
485 return up.toProviderIce();
488 skills::provider::dto::SkillExecutionID
490 const skills::provider::dto::SkillExecutionRequest& info,
491 const Ice::Current& current )
495 auto id = this->plugin->executeSkillAsync(exec);
496 return id.toProviderIce();
499 skills::provider::dto::ParameterUpdateResult
501 const skills::provider::dto::SkillExecutionID&
id,
503 const Ice::Current& current )
505 skills::provider::dto::ParameterUpdateResult res;
510 res.success = this->plugin->updateSkillParameters(exec, prep);
514 skills::provider::dto::AbortSkillResult
516 const Ice::Current& )
518 skills::provider::dto::AbortSkillResult res;
521 res.success = this->plugin->abortSkill(exec);
525 skills::provider::dto::AbortSkillResult
527 const skills::provider::dto::SkillExecutionID&
id,
528 const Ice::Current& )
530 skills::provider::dto::AbortSkillResult res;
533 res.success = this->plugin->abortSkillAsync(exec);