diff --git a/source/RobotAPI/libraries/skills/core/CMakeLists.txt b/source/RobotAPI/libraries/skills/core/CMakeLists.txt index 29145e60e305fa10decf06200685dcb99ec6a3d5..f757e4b5d8d069673c67d39e8b559250202d6c03 100644 --- a/source/RobotAPI/libraries/skills/core/CMakeLists.txt +++ b/source/RobotAPI/libraries/skills/core/CMakeLists.txt @@ -4,6 +4,8 @@ armarx_component_set_name("${LIB_NAME}") armarx_set_target("Library: ${LIB_NAME}") armarx_add_library( + ARON_FILES + aron/SkillErrorResult.xml LIBS ArmarXCoreInterfaces ArmarXCore diff --git a/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml b/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml new file mode 100644 index 0000000000000000000000000000000000000000..f222af7c14a350cfcb90c5081d938af5355ad2f4 --- /dev/null +++ b/source/RobotAPI/libraries/skills/core/aron/SkillErrorResult.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<AronTypeDefinition> + + <GenerateTypes> + + <Object name='armarx::skills::arondto::SkillErrorResult'> + <ObjectChild key='errorCode'> + <string /> + </ObjectChild> + + <ObjectChild key='data'> + <AnyObject shared_ptr="true" /> + </ObjectChild> + + <ObjectChild key='errorMessage'> + <string /> + </ObjectChild> + + </Object> + + </GenerateTypes> + +</AronTypeDefinition> diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp index ae4c5dd5cc39aac9ba52557f62527a50451c4c93..e9ca4358858f81395714792d44e4878c2acef008 100644 --- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp +++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp @@ -1,5 +1,10 @@ #include "SkillImplementationWrapper.h" +#include <ArmarXCore/core/exceptions/LocalException.h> +#include "RobotAPI/libraries/aron/core/data/variant/container/Dict.h" +#include "RobotAPI/libraries/aron/core/data/variant/primitive/Long.h" +#include "RobotAPI/libraries/aron/core/data/variant/primitive/String.h" +#include <RobotAPI/libraries/skills/core/aron/SkillErrorResult.aron.generated.h> namespace armarx { namespace skills::detail @@ -75,6 +80,7 @@ namespace armarx { std::unique_lock l(skillStatusesMutex); statusUpdate.status = status; + statusUpdate.result = data; if (skill) // if skill has been constructed { @@ -89,14 +95,6 @@ namespace armarx } }; - auto createErrorMessageData = [](const std::string& message) - { - auto obj = aron::make_dict(); - auto m = aron::make_string(message, aron::Path({"errormessage"})); - obj->addElement("errormessage", m); - return obj; - }; - { std::unique_lock l(skillStatusesMutex); @@ -130,9 +128,14 @@ namespace armarx // set initial parameters that were attached to the execution request (only add as we are not sure whether some updates already arrived) this->updateSkillParameters(initial_aron_params); - auto makeAbortedResult = [&](const aron::data::DictPtr& data) + auto makeAbortedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message) { - updateStatus(SkillStatus::Aborted, data); + armarx::skills::arondto::SkillErrorResult errorResult; + errorResult.errorCode = errorCode; + errorResult.data = data; + errorResult.errorMessage = message; + + updateStatus(SkillStatus::Aborted, errorResult.toAron()); std::unique_lock l(skillStatusesMutex); auto terminated = TerminatedSkillStatusUpdate{ @@ -145,9 +148,14 @@ namespace armarx }; - auto makeFailedResult = [&](const aron::data::DictPtr& data) + auto makeFailedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message) { - updateStatus(SkillStatus::Failed, data); + armarx::skills::arondto::SkillErrorResult errorResult; + errorResult.errorCode = errorCode; + errorResult.data = data; + errorResult.errorMessage = message; + + updateStatus(SkillStatus::Failed, errorResult.toAron()); std::unique_lock l(skillStatusesMutex); auto terminated = TerminatedSkillStatusUpdate{ @@ -174,15 +182,15 @@ namespace armarx // } - auto exitAndMakeFailedResult = [&](const aron::data::DictPtr& data) + auto exitAndMakeFailedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message) { skill->exitSkill(); // try to exit skill. Ignore return value - return makeFailedResult(data); + return makeFailedResult(errorCode, data, message); }; - auto exitAndMakeAbortedResult = [&](const aron::data::DictPtr& data) + auto exitAndMakeAbortedResult = [&](const std::string& errorCode, const aron::data::DictPtr& data, const std::string& message) { skill->exitSkill(); // try to exit skill. Ignore return value - return makeAbortedResult(data); + return makeAbortedResult(errorCode, data, message); }; // Construction succeeded! @@ -199,16 +207,16 @@ namespace armarx { std::string message = "SkillError 101: The initialization of skill '" + skillName + "' did not succeed."; - return exitAndMakeFailedResult(createErrorMessageData(message)); + return exitAndMakeFailedResult("101", nullptr, message); } } catch (const error::SkillAbortedException& ex) { - return exitAndMakeAbortedResult(createErrorMessageData(GetHandledExceptionString())); + return exitAndMakeAbortedResult("101x", nullptr, GetHandledExceptionString()); } catch (const error::SkillFailedException& ex) { - return exitAndMakeFailedResult(createErrorMessageData(GetHandledExceptionString())); + return exitAndMakeFailedResult("101x", nullptr, GetHandledExceptionString()); } catch (const std::exception& ex) { @@ -216,7 +224,7 @@ namespace armarx "SkillError 101e: An error occured during the initialization of skill '" + skillName + "'. The error was: " + GetHandledExceptionString(); ARMARX_ERROR_S << message; - return exitAndMakeFailedResult(createErrorMessageData(message)); + return exitAndMakeFailedResult("101e", nullptr, message); } // Init succeeded! @@ -244,16 +252,16 @@ namespace armarx std::string message = "SkillError 201: The prepare method of skill '" + skillName + "' did not succeed."; ARMARX_ERROR_S << message; - return exitAndMakeFailedResult(createErrorMessageData(message)); + return exitAndMakeFailedResult("201", nullptr, message); } } catch (const error::SkillAbortedException& ex) { - return exitAndMakeAbortedResult(createErrorMessageData(GetHandledExceptionString())); + return exitAndMakeAbortedResult("201x", nullptr, GetHandledExceptionString()); } catch (const error::SkillFailedException& ex) { - return exitAndMakeFailedResult(createErrorMessageData(GetHandledExceptionString())); + return exitAndMakeFailedResult("201x", nullptr, GetHandledExceptionString()); } catch (const std::exception& ex) { @@ -262,7 +270,7 @@ namespace armarx skillName + "'. The error was: " + GetHandledExceptionString(); ARMARX_ERROR_S << message; - return exitAndMakeFailedResult(createErrorMessageData(message)); + return exitAndMakeFailedResult("201e", nullptr, message); } // Prepare succeeded! @@ -282,22 +290,22 @@ namespace armarx std::string message = "SkillError 501: The main method of skill '" + skillName + "' did fail."; - return exitAndMakeFailedResult(mainRet.data); + return exitAndMakeFailedResult("501", mainRet.data, message); } else if (mainRet.status == TerminatedSkillStatus::Aborted) { std::string message = "SkillError 501: The main method of skill '" + skillName + "' got aborted."; - return exitAndMakeAbortedResult(mainRet.data); + return exitAndMakeAbortedResult("501", mainRet.data, message); } } catch (const error::SkillAbortedException& ex) { - return exitAndMakeAbortedResult(mainRet.data); + return exitAndMakeAbortedResult("501x", mainRet.data, GetHandledExceptionString()); } catch (const error::SkillFailedException& ex) { - return exitAndMakeFailedResult(mainRet.data); + return exitAndMakeFailedResult("501x", mainRet.data, GetHandledExceptionString()); } catch (const std::exception& ex) { @@ -305,7 +313,7 @@ namespace armarx "SkillError 501e: An error occured during the main method of skill '" + skillName + "'. The error was: " + GetHandledExceptionString(); ARMARX_ERROR_S << message; - return exitAndMakeFailedResult(mainRet.data); + return exitAndMakeFailedResult("501e", mainRet.data, message); } // Main succeeded! @@ -318,18 +326,18 @@ namespace armarx Skill::ExitResult exitRet = skill->exitSkill(); if (exitRet.status != TerminatedSkillStatus::Succeeded) { - // std::string message = "SkillError 601: The exit method of skill '" + skillName + - // "' did not succeed."; - return makeFailedResult(mainRet.data); + std::string message = "SkillError 601: The exit method of skill '" + skillName + + "' did not succeed."; + return makeFailedResult("601", mainRet.data, message); } } catch (const error::SkillAbortedException& ex) { - return makeAbortedResult(mainRet.data); + return makeAbortedResult("601x", mainRet.data, GetHandledExceptionString()); } catch (const error::SkillFailedException& ex) { - return makeFailedResult(mainRet.data); + return makeFailedResult("601x", mainRet.data, GetHandledExceptionString()); } catch (const std::exception& ex) { @@ -337,7 +345,7 @@ namespace armarx "SkillError 601e: An error occured during the exit method of skill '" + skillName + "'. The error was: " + GetHandledExceptionString(); ARMARX_ERROR_S << message; - return makeFailedResult(mainRet.data); + return makeFailedResult("601e", mainRet.data, message); } // Exit succeeded!