SkillImplementationWrapper.cpp
Go to the documentation of this file.
2 
3 namespace armarx
4 {
5  namespace skills::detail
6  {
7  SkillImplementationWrapper::SkillImplementationWrapper(std::unique_ptr<skills::Skill>&& skill) :
8  skill(std::move(skill))
9  {
11  }
12 
14  {
15  std::unique_lock l(executingMutex);
16 
17  const std::string skillName = skill->description.skillName;
18  ARMARX_INFO_S << "Executing skill: " << skillName;
19 
20  // reset execution params. This func is also used to clean up once this method returns
21  auto resetExecParam = [&](){
22  std::unique_lock l2(skillStatusMutex); // skill is not updating
23  //statusUpdate.status = skills::provider::dto::Execution::Status::Idle; I decided to not update the status to idle every time the skill stops.
24  statusUpdate.data = nullptr;
26  };
27 
28  // set params and setup variables
29  auto setExecParams = [&](){
30  std::lock_guard l(skillStatusMutex);
31  statusUpdate.usedParameterization = parameterization;
32  statusUpdate.executorName = executorName;
33  };
34 
35  resetExecParam();
36  setExecParams();
37 
38  auto& aron_params = parameterization.usedInputParams;
39  auto updateStatus = [&](const SkillStatus status, const aron::data::DictPtr& data = nullptr){
40  std::lock_guard l(skillStatusMutex);
42  statusUpdate.data = data;
43 
45 
46  if (callbackInterface)
47  {
48  callbackInterface->updateStatusForSkill(statusUpdate.toIce());
49  }
50  };
51 
52  auto createErrorMessage = [](const std::string& message){
53  auto obj = aron::make_dict();
54  auto m = aron::make_string(message, aron::Path({"errormessage"}));
55  obj->addElement("errormessage", m);
56  return obj;
57  };
58 
59  // Check params
60  if (skill->description.acceptedType && not(aron_params))
61  {
62  std::string message = "SkillError 001: The Skill '" + skillName + "' requires a type but params are NULL.";
64  resetExecParam();
65  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
66  }
67 
68  if (skill->description.acceptedType && aron_params && not(aron_params->fullfillsType(skill->description.acceptedType)))
69  {
70  std::string message = "SkillError 002: The Skill '" + skillName + "' has a type and got parameters but the input does not match the type.";
72  resetExecParam();
73  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
74  }
75 
76  // Check if skill is available with the given parameterization
77  try
78  {
79  if (not skill->isSkillAvailable(Skill::InitInput{.executorName = executorName, .params = aron_params}))
80  {
81  std::string message = "SkillError 101: The Skill '" + skillName + "' is not available.";
83  resetExecParam();
84  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
85  }
86  }
87  catch (const std::exception& ex)
88  {
89  std::string message = "SkillError 101e: An error occured during the check whether skill '" + skillName + "' is available. The error was: " + GetHandledExceptionString();
91  resetExecParam();
92  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
93  }
94 
95  // set scheduled
96  updateStatus(SkillStatus::Scheduled);
97 
98  // reset skill and perhaps wait for dependencies
99  try
100  {
101  skill->resetSkill();
102  }
103  catch (const std::exception& ex)
104  {
105  std::string message = "SkillError 201e: An error occured during the reset of skill '" + skillName + "'. The error was: " + GetHandledExceptionString();
107 
108  updateStatus(SkillStatus::Failed);
109  resetExecParam();
110  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
111  }
112 
113  try
114  {
115  skill->waitForDependenciesOfSkill();
116  }
117  catch (const std::exception& ex)
118  {
119  std::string message = "SkillError 301e: An error occured during waiting for skill dependencies of skill '" + skillName + "'. The error was: " + GetHandledExceptionString();
121 
122  updateStatus(SkillStatus::Failed);
123  resetExecParam();
124  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
125  }
126 
127  // execute. If the skill fails for some reason, from this point it will always execute its exit function.
128  updateStatus(SkillStatus::Running);
129 
130 
131  try
132  {
133  Skill::InitResult initRet = skill->initSkill({executorName, aron_params});
135  {
136  std::string message = "SkillError 401: The initialization of skill '" + skillName + "' did not succeed.";
137  skill->exitSkill({executorName, aron_params}); // try to exit skill. Ignore return value
138 
139  updateStatus(skills::toSkillStatus(initRet.status));
140  resetExecParam();
141  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, initRet.status});
142  }
143  }
144  catch (const std::exception& ex)
145  {
146  std::string message = "SkillError 401e: An error occured during the initialization of skill '" + skillName + "'. The error was: " + GetHandledExceptionString();
148  skill->exitSkill({executorName, aron_params}); // try to exit skill. Ignore return value
149 
150  updateStatus(SkillStatus::Failed);
151  resetExecParam();
152  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
153  }
154  // Init succeeded!
155 
156 
157  Skill::MainResult mainRet;
158  try
159  {
160  mainRet = skill->mainOfSkill({executorName, aron_params, [&updateStatus](const aron::data::DictPtr& update)
161  {
162  // during execution the statusUpdate.status is always RUNNING
163  updateStatus(SkillStatus::Running, update);
164  }});
166  {
167  std::string message = "SkillError 501: The main method of skill '" + skillName + "' did not succeed.";
168  skill->exitSkill({executorName, aron_params}); // try to exit skill. Ignore return value
169 
170  updateStatus(skills::toSkillStatus(mainRet.status));
171  resetExecParam();
172  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, mainRet.status});
173  }
174  }
175  catch (const std::exception& ex)
176  {
177  std::string message = "SkillError 501e: An error occured during the main method of skill '" + skillName + "'. The error was: " + GetHandledExceptionString();
179  skill->exitSkill({executorName, aron_params}); // try to exit skill. Ignore return value
180 
181  updateStatus(SkillStatus::Failed);
182  resetExecParam();
183  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
184  }
185  // Main succeeded!
186 
187  try
188  {
189  Skill::ExitResult exitRet = skill->exitSkill({executorName, aron_params});
191  {
192  std::string message = "SkillError 601: The exit method of skill '" + skillName + "' did not succeed.";
193  skill->exitSkill({executorName, aron_params}); // try to exit skill. Ignore return value
194 
195  updateStatus(skills::toSkillStatus(exitRet.status));
196  resetExecParam();
197  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, exitRet.status});
198  }
199  }
200  catch (const std::exception& ex)
201  {
202  std::string message = "SkillError 601e: An error occured during the exit method of skill '" + skillName + "'. The error was: " + GetHandledExceptionString();
204 
205  updateStatus(SkillStatus::Failed);
206  resetExecParam();
207  return TerminatedSkillStatusUpdate({{skill->getSkillId(), executorName, parameterization, createErrorMessage(message)}, TerminatedSkillStatus::Failed});
208  }
209  // Exit succeeded!
210 
211 
212  // All succeeded!
213  updateStatus(SkillStatus::Succeeded);
214 
215  // Tidy up
216  resetExecParam();
217 
218  // return result of main method
219  return {{skill->getSkillId(), executorName, parameterization, mainRet.data}, TerminatedSkillStatus::Succeeded};
220  }
221  }
222 }
armarx::skills::Skill::ExitResult::status
TerminatedSkillStatus status
Definition: Skill.h:60
armarx::skills::detail::SkillImplementationWrapper::statusUpdate
SkillStatusUpdate statusUpdate
Definition: SkillImplementationWrapper.h:27
armarx::skills::SkillStatusUpdateBase::data
aron::data::DictPtr data
Definition: SkillStatusUpdate.h:60
armarx::skills::TerminatedSkillStatus::Succeeded
@ Succeeded
armarx::aron::make_dict
aron::data::DictPtr make_dict(_Args &&... args)
Definition: Dict.h:104
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::skills::SkillParameterization::usedCallbackInterface
callback::dti::SkillProviderCallbackInterfacePrx usedCallbackInterface
Definition: SkillParameterization.h:16
armarx::skills::SkillStatusUpdate::status
SkillStatus status
Definition: SkillStatusUpdate.h:84
armarx::skills::SkillStatus::Scheduled
@ Scheduled
armarx::aron::make_string
aron::data::StringPtr make_string(_Args &&... args)
Definition: String.h:76
SkillImplementationWrapper.h
armarx::skills::detail::SkillImplementationWrapper::setupAndExecuteSkill
TerminatedSkillStatusUpdate setupAndExecuteSkill(const std::string &executorName, const skills::SkillParameterization)
Definition: SkillImplementationWrapper.cpp:13
armarx::skills::SkillStatusUpdateBase::usedParameterization
SkillParameterization usedParameterization
Definition: SkillStatusUpdate.h:57
armarx::skills::detail::SkillImplementationWrapper::executingMutex
std::shared_mutex executingMutex
Definition: SkillImplementationWrapper.h:30
armarx::aron::Path
The Path class.
Definition: Path.h:36
armarx::GetHandledExceptionString
std::string GetHandledExceptionString()
Definition: Exception.cpp:147
armarx::status
status
Definition: FiniteStateMachine.h:259
armarx::skills::detail::SkillImplementationWrapper::skill
const std::unique_ptr< Skill > skill
Definition: SkillImplementationWrapper.h:21
armarx::skills::SkillParameterization::usedInputParams
aron::data::DictPtr usedInputParams
Definition: SkillParameterization.h:15
message
message(STATUS "Boost-Library-Dir: " "${Boost_LIBRARY_DIRS}") message(STATUS "Boost-LIBRARIES
Definition: CMakeLists.txt:8
ARMARX_ERROR_S
#define ARMARX_ERROR_S
Definition: Logging.h:209
armarx::skills::detail::SkillImplementationWrapper::skillStatusMutex
std::shared_mutex skillStatusMutex
Definition: SkillImplementationWrapper.h:26
armarx::skills::detail::SkillImplementationWrapper::SkillImplementationWrapper
SkillImplementationWrapper(std::unique_ptr< skills::Skill > &&skill)
Definition: SkillImplementationWrapper.cpp:7
armarx::skills::Skill::MainResult
Definition: Skill.h:52
armarx::armem::server::ltm::util::mongodb::detail::update
bool update(mongocxx::collection &coll, const nlohmann::json &query, const nlohmann::json &update)
Definition: mongodb.cpp:67
armarx::skills::Skill::ExitResult
Definition: Skill.h:58
armarx::skills::TerminatedSkillStatusUpdate
Definition: SkillStatusUpdate.h:64
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
armarx::skills::Skill::MainResult::status
TerminatedSkillStatus status
Definition: Skill.h:54
armarx::skills::TerminatedSkillStatus::Failed
@ Failed
std
Definition: Application.h:66
armarx::skills::Skill::InitResult::status
TerminatedSkillStatus status
Definition: Skill.h:36
armarx::skills::Skill::MainResult::data
aron::data::DictPtr data
Definition: Skill.h:55
armarx::skills::Skill::InitResult
Definition: Skill.h:34
armarx::skills::SkillStatus::Running
@ Running
armarx::skills::SkillParameterization
Definition: SkillParameterization.h:13
ARMARX_INFO_S
#define ARMARX_INFO_S
Definition: Logging.h:195
armarx::skills::toSkillStatus
SkillStatus toSkillStatus(const ActiveOrTerminatedSkillStatus &d)
Definition: SkillStatusUpdate.cpp:7
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::skills::Skill::InitInput
Definition: Skill.h:39
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
armarx::skills::SkillStatus
SkillStatus
Definition: SkillStatusUpdate.h:16
armarx::skills::SkillStatus::Succeeded
@ Succeeded
armarx::skills::SkillStatusUpdateBase::executorName
std::string executorName
Definition: SkillStatusUpdate.h:56
armarx::skills::SkillStatus::Failed
@ Failed
armarx::skills::SkillStatusUpdate::toIce
provider::dto::SkillStatusUpdate toIce() const
Definition: SkillStatusUpdate.cpp:188