.. _program_listing_file_include_as2_behavior___impl_behavior_server__impl.hpp: Program Listing for File behavior_server__impl.hpp ================================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/as2_behavior/__impl/behavior_server__impl.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef __AS2_BEHAVIOR_SERVER__IMPL_HPP__ #define __AS2_BEHAVIOR_SERVER__IMPL_HPP__ #include "as2_behavior/__detail/behavior_server__class.hpp" namespace as2_behavior { template BehaviorServer::BehaviorServer(const std::string& name, const rclcpp::NodeOptions& options) : as2::Node(name, options), action_name_(name) { register_action(); register_service_servers(); register_publishers(); register_timers(); } template void BehaviorServer::register_action() { // create a group for the action server auto action_server_group = this->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); this->action_server_ = rclcpp_action::create_server( this, this->generate_global_name(action_name_), std::bind(&BehaviorServer::handleGoal, this, std::placeholders::_1, std::placeholders::_2), std::bind(&BehaviorServer::handleCancel, this, std::placeholders::_1), std::bind(&BehaviorServer::handleAccepted, this, std::placeholders::_1)); // this->action_server_-> }; template rclcpp_action::GoalResponse BehaviorServer::handleGoal( const rclcpp_action::GoalUUID& uuid, std::shared_ptr goal) { RCLCPP_DEBUG(this->get_logger(), "Received goal request with UUID: %s", (char*)uuid.data()); if (this->activate(goal)) { return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE; } else { return rclcpp_action::GoalResponse::REJECT; } } template rclcpp_action::CancelResponse BehaviorServer::handleCancel( const std::shared_ptr goal_handle) { RCLCPP_INFO(this->get_logger(), "Request to cancel goal received"); std_srvs::srv::Trigger::Request::SharedPtr req = std::make_shared(); std_srvs::srv::Trigger::Response::SharedPtr res = std::make_shared(); deactivate(req, res); if (res->success) { return rclcpp_action::CancelResponse::ACCEPT; } else { return rclcpp_action::CancelResponse::REJECT; } }; template void BehaviorServer::handleAccepted(const std::shared_ptr goal_handle) { goal_handle_ = goal_handle; }; template std::string BehaviorServer::generate_name(const std::string& name) { return std::string(this->get_name()) + "/_behavior/" + name; } template void BehaviorServer::register_service_servers() { pause_srv_ = this->create_service( generate_name("pause"), std::bind(&BehaviorServer::pause, this, std::placeholders::_1, std::placeholders::_2)); resume_srv_ = this->create_service( generate_name("resume"), std::bind(&BehaviorServer::resume, this, std::placeholders::_1, std::placeholders::_2)); stop_srv_ = this->create_service( generate_name("stop"), std::bind(&BehaviorServer::deactivate, this, std::placeholders::_1, std::placeholders::_2)); } template void BehaviorServer::register_publishers() { // feedback_pub_ = this->create_publisher(generate_name("feedback"), 10); // goal_status_pub_ = this->create_publisher(generate_name("goal_status"), 10); behavior_status_pub_ = this->create_publisher(generate_name("behavior_status"), 10); } template void BehaviorServer::register_timers() { behavior_status_timer_ = this->create_timer( std::chrono::milliseconds(100), std::bind(&BehaviorServer::publish_behavior_status, this)); } template void BehaviorServer::register_run_timer() { run_timer_ = this->create_timer(std::chrono::milliseconds(100), std::bind(&BehaviorServer::timer_callback, this)); } template void BehaviorServer::cleanup_run_timer(const ExecutionStatus& state) { on_execution_end(state); goal_handle_.reset(); run_timer_.reset(); } template bool BehaviorServer::on_activate(std::shared_ptr goal) { return true; }; template bool BehaviorServer::on_modify(std::shared_ptr goal) { return true; } template bool BehaviorServer::on_deactivate(const std::shared_ptr& message) { return true; } template bool BehaviorServer::on_pause(const std::shared_ptr& message) { return true; } template bool BehaviorServer::on_resume(const std::shared_ptr& message) { return true; } /* template ExecutionStatus BehaviorServer::on_run(typename feedback_msg::SharedPtr& fb) { return ExecutionStatus::SUCCESS; } */ template ExecutionStatus BehaviorServer::on_run( const typename std::shared_ptr& goal, typename std::shared_ptr& feedback_msg, typename std::shared_ptr& result_msg) { return ExecutionStatus::SUCCESS; } // namespace as2_behavior template bool BehaviorServer::activate(std::shared_ptr goal) { RCLCPP_INFO(this->get_logger(), "START"); if (on_activate(goal)) { register_run_timer(); behavior_status_.status = BehaviorStatus::RUNNING; return true; } return false; }; template void BehaviorServer::deactivate( const typename std_srvs::srv::Trigger::Request::SharedPtr goal, typename std_srvs::srv::Trigger::Response::SharedPtr result) { RCLCPP_INFO(this->get_logger(), "STOP"); auto msg = std::make_shared(); result->success = on_deactivate(msg); result->message = *msg; if (result->success) { cleanup_run_timer(ExecutionStatus::ABORTED); behavior_status_.status = BehaviorStatus::IDLE; } }; template void BehaviorServer::modify(std::shared_ptr goal) { RCLCPP_INFO(this->get_logger(), "MODIFY"); on_modify(goal); }; template void BehaviorServer::pause(const typename std_srvs::srv::Trigger::Request::SharedPtr goal, typename std_srvs::srv::Trigger::Response::SharedPtr result) { RCLCPP_INFO(this->get_logger(), "PAUSE"); if (behavior_status_.status != BehaviorStatus::RUNNING) { result->success = false; result->message = "Behavior is not running"; return; } auto msg = std::make_shared(); result->success = on_pause(msg); result->message = *msg; if (result->success) { behavior_status_.status = BehaviorStatus::PAUSED; } }; template void BehaviorServer::resume(const typename std_srvs::srv::Trigger::Request::SharedPtr goal, typename std_srvs::srv::Trigger::Response::SharedPtr result) { RCLCPP_INFO(this->get_logger(), "RESUME"); if (behavior_status_.status != BehaviorStatus::PAUSED) { result->success = false; result->message = "Behavior is not paused"; return; } auto msg = std::make_shared(); result->success = on_resume(msg); result->message = *msg; if (result->success) { behavior_status_.status = BehaviorStatus::RUNNING; } }; template void BehaviorServer::run( const typename std::shared_ptr& goal_handle_action) { if (behavior_status_.status != BehaviorStatus::RUNNING) { return; }; auto goal = goal_handle_action->get_goal(); auto feedback = std::make_shared(); auto result = std::make_shared(); ExecutionStatus status = on_run(goal, feedback, result); switch (status) { case ExecutionStatus::SUCCESS: { RCLCPP_INFO(this->get_logger(), "SUCCESS"); behavior_status_.status = BehaviorStatus::IDLE; goal_handle_->succeed(result); } break; case ExecutionStatus::RUNNING: { auto clk = this->get_clock(); RCLCPP_INFO_THROTTLE(this->get_logger(), *clk, 5000, "RUNNING"); goal_handle_action->publish_feedback(feedback); behavior_status_.status = BehaviorStatus::RUNNING; } break; case ExecutionStatus::FAILURE: { RCLCPP_INFO(this->get_logger(), "FAILURE"); behavior_status_.status = BehaviorStatus::IDLE; goal_handle_->abort(result); } break; case ExecutionStatus::ABORTED: { RCLCPP_INFO(this->get_logger(), "ABORTED"); behavior_status_.status = BehaviorStatus::IDLE; goal_handle_->abort(result); } break; } if (behavior_status_.status != BehaviorStatus::RUNNING) { cleanup_run_timer(status); } } template void BehaviorServer::publish_behavior_status() { BehaviorStatus msg; msg.status = behavior_status_.status; behavior_status_pub_->publish(msg); } }; // namespace as2_behavior #endif // AS2_BEHAVIOR__BEHAVIOR_SERVER_HPP_