47 using ResultSharedPtr =
typename Action::Result::SharedPtr;
48 using FeedbackSharedPtr =
typename Action::Feedback::SharedPtr;
58 ResultSharedPtr req_result_;
59 FeedbackSharedPtr req_feedback_;
60 rclcpp::Logger logger_;
63 std::shared_ptr<GoalHandle> gh_;
64 ResultSharedPtr preallocated_result_;
65 FeedbackSharedPtr preallocated_feedback_;
68 std::shared_ptr<GoalHandle> & gh,
69 const ResultSharedPtr & preallocated_result =
nullptr,
70 const FeedbackSharedPtr & preallocated_feedback =
nullptr)
72 gh, preallocated_result, preallocated_feedback, rclcpp::get_logger(
"realtime_tools"))
77 std::shared_ptr<GoalHandle> & gh,
78 const ResultSharedPtr & preallocated_result,
79 const FeedbackSharedPtr & preallocated_feedback,
80 rclcpp::Logger logger)
87 preallocated_result_(preallocated_result),
88 preallocated_feedback_(preallocated_feedback)
90 if (!preallocated_result_) {preallocated_result_.reset(
new typename Action::Result);}
91 if (!preallocated_feedback_) {preallocated_feedback_.reset(
new typename Action::Feedback);}
94 void setAborted(ResultSharedPtr result =
nullptr)
96 if (req_execute_ && !req_succeed_ && !req_abort_ && !req_cancel_) {
97 std::lock_guard<std::mutex> guard(mutex_);
104 void setCanceled(ResultSharedPtr result =
nullptr)
106 if (req_execute_ && !req_succeed_ && !req_abort_ && !req_cancel_) {
107 std::lock_guard<std::mutex> guard(mutex_);
109 req_result_ = result;
114 void setSucceeded(ResultSharedPtr result =
nullptr)
116 if (req_execute_ && !req_succeed_ && !req_abort_ && !req_cancel_) {
117 std::lock_guard<std::mutex> guard(mutex_);
119 req_result_ = result;
124 void setFeedback(FeedbackSharedPtr feedback =
nullptr)
126 std::lock_guard<std::mutex> guard(mutex_);
127 req_feedback_ = feedback;
132 if (!req_succeed_ && !req_abort_ && !req_cancel_) {
133 std::lock_guard<std::mutex> guard(mutex_);
138 bool valid() {
return nullptr != gh_.get();}
140 void runNonRealtime()
142 if (!valid()) {
return;}
144 std::lock_guard<std::mutex> guard(mutex_);
147 if (req_execute_ && !gh_->is_executing() && gh_->is_active() && !gh_->is_canceling()) {
150 if (req_abort_ && gh_->is_executing()) {
151 gh_->abort(req_result_);
154 if (req_cancel_ && gh_->is_active()) {
155 gh_->canceled(req_result_);
158 if (req_succeed_ && !gh_->is_canceling()) {
159 gh_->succeed(req_result_);
160 req_succeed_ =
false;
162 if (req_feedback_ && gh_->is_executing()) {
163 gh_->publish_feedback(req_feedback_);
165 }
catch (
const rclcpp::exceptions::RCLErrorBase & e) {
167 RCLCPP_WARN(logger_,
"%s", e.formatted_message.c_str());