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);
50 std::string
prefix =
"skill.";
51 properties->component(
55 "The name of the SkillManager (or SkillMemory) proxy this provider belongs to.");
66 auto& p = parent<SkillProviderComponentPluginUser>();
67 const std::string componentName = p.getName();
72 const std::unique_lock l(skillFactoriesMutex);
73 auto skillId = fac->createSkillDescription(providerId).skillId;
75 if (skillFactories.find(skillId) != skillFactories.end())
77 ARMARX_WARNING <<
"Try to add a skill factory for skill '" + skillId.toString() +
78 "' which already exists in list. Ignoring this skill.";
82 ARMARX_INFO <<
"Adding skill `" << skillId <<
"` to component `" << componentName <<
"` .";
84 skillFactories.emplace(skillId, std::move(fac));
99 return addSkillFactory<skills::LambdaSkill>(desc, f);
108 if (skillFactories.count(skillId) == 0)
110 ARMARX_INFO <<
"Could not find a skill factory for id: " << skillId;
114 auto* facPtr = skillFactories.at(skillId).get();
118 std::optional<skills::SkillStatusUpdate>
124 const std::shared_lock l(skillExecutionsMutex);
125 if (skillExecutions.find(execId) == skillExecutions.end())
132 return skillExecutions.at(execId).statusUpdate;
135 std::map<skills::SkillExecutionID, skills::SkillStatusUpdate>
138 std::map<skills::SkillExecutionID, skills::SkillStatusUpdate> skillUpdates;
140 const std::shared_lock l(skillExecutionsMutex);
141 for (
const auto& [key, impl] : skillExecutions)
143 const std::scoped_lock l2(impl.skillStatusesMutex);
144 skillUpdates.insert({key, impl.statusUpdate});
149 std::optional<skills::SkillDescription>
154 const std::shared_lock l(skillFactoriesMutex);
155 if (skillFactories.find(skillId) == skillFactories.end())
157 std::stringstream ss;
158 ss <<
"Skill description for skill '" + skillId.
toString() +
159 "' not found! Found instead: {"
161 for (
const auto& [k, _] : skillFactories)
163 ss <<
"\t" << k.toString() <<
"\n";
171 return skillFactories.at(skillId)->createSkillDescription(*skillId.
providerId);
174 std::map<skills::SkillID, skills::SkillDescription>
177 std::map<skills::SkillID, skills::SkillDescription> skillDesciptions;
178 const std::shared_lock l(skillFactoriesMutex);
179 for (
const auto& [key, fac] : skillFactories)
182 skillDesciptions.insert({key, fac->createSkillDescription(*key.providerId)});
184 return skillDesciptions;
195 .executionStartedTime =
203 auto l1 = std::unique_lock{skillFactoriesMutex};
205 const auto& fac = getSkillFactory(executionId.skillId);
206 ARMARX_CHECK(fac) <<
"Could not find a factory for skill " << executionId.skillId;
209 const std::unique_lock l2{skillExecutionsMutex};
211 skillExecutions.emplace(std::piecewise_construct,
212 std::make_tuple(executionId),
217 wrapper = &it.first->second;
227 ret.result = x.result;
232 if (wrapper && wrapper->
execution.joinable())
258 auto l1 = std::unique_lock{skillFactoriesMutex};
260 const auto& fac = getSkillFactory(executionId.skillId);
261 ARMARX_CHECK(fac) <<
"Could not find a factory for skill " << executionId.skillId;
264 const std::unique_lock l2{skillExecutionsMutex};
266 skillExecutions.emplace(std::piecewise_construct,
267 std::make_tuple(executionId),
272 wrapper = &it.first->second;
296 std::this_thread::sleep_for(std::chrono::milliseconds(20));
308 std::shared_lock l{skillExecutionsMutex};
309 auto it = skillExecutions.find(executionId);
310 if (it == skillExecutions.end())
313 "' found! Ignoring prepareSkill request.";
317 std::scoped_lock l2{it->second.skillStatusesMutex};
321 "' because its not in preparing phase.";
325 it->second.updateSkillParameters(
input);
334 std::shared_lock l(skillExecutionsMutex);
335 auto it = skillExecutions.find(executionId);
336 if (it == skillExecutions.end())
339 "' found! Ignoring abortSkill request.";
343 auto& runtime = it->second;
349 std::scoped_lock l(runtime.skillStatusesMutex);
350 auto status = runtime.statusUpdate;
352 if (
status.hasBeenTerminated())
357 std::this_thread::sleep_for(std::chrono::milliseconds(20));
368 std::shared_lock l(skillExecutionsMutex);
369 auto it = skillExecutions.find(executionId);
370 if (it == skillExecutions.end())
373 "' found! Ignoring abortSkill request.";
377 it->second.stopSkill();
390 IceUtil::Optional<skills::provider::dto::SkillDescription>
392 const skills::provider::dto::SkillID& skillId,
393 const Ice::Current& )
396 auto o = plugin->getSkillDescription(
id);
399 return o->toProviderIce();
404 skills::provider::dto::SkillDescriptionMap
407 skills::provider::dto::SkillDescriptionMap
ret;
408 for (
const auto& [k,
v] : plugin->getSkillDescriptions())
410 ret.insert({k.toProviderIce(),
v.toProviderIce()});
415 IceUtil::Optional<skills::provider::dto::SkillStatusUpdate>
417 const skills::provider::dto::SkillExecutionID& executionId,
418 const Ice::Current& )
422 auto o = plugin->getSkillExecutionStatus(execId);
425 return o->toProviderIce();
430 skills::provider::dto::SkillStatusUpdateMap
433 skills::provider::dto::SkillStatusUpdateMap
ret;
434 for (
const auto& [k,
v] : plugin->getSkillExecutionStatuses())
436 ret.insert({k.toProviderIce(),
v.toProviderIce()});
442 skills::provider::dto::SkillStatusUpdate
444 const skills::provider::dto::SkillExecutionRequest& info,
445 const Ice::Current& )
449 auto up = this->plugin->executeSkill(exec);
450 return up.toProviderIce();
453 skills::provider::dto::SkillExecutionID
455 const skills::provider::dto::SkillExecutionRequest& info,
456 const Ice::Current& current )
460 auto id = this->plugin->executeSkillAsync(exec);
461 return id.toProviderIce();
464 skills::provider::dto::ParameterUpdateResult
466 const skills::provider::dto::SkillExecutionID&
id,
468 const Ice::Current& current )
470 skills::provider::dto::ParameterUpdateResult res;
475 res.success = this->plugin->updateSkillParameters(exec, prep);
479 skills::provider::dto::AbortSkillResult
481 const Ice::Current& )
483 skills::provider::dto::AbortSkillResult res;
486 res.success = this->plugin->abortSkill(exec);
490 skills::provider::dto::AbortSkillResult
492 const skills::provider::dto::SkillExecutionID&
id,
493 const Ice::Current& )
495 skills::provider::dto::AbortSkillResult res;
498 res.success = this->plugin->abortSkillAsync(exec);