Program Listing for File behavior_server__class.hpp
↰ Return to documentation for file (/tmp/ws/src/aerostack2/as2_behaviors/as2_behavior/include/as2_behavior/__detail/behavior_server__class.hpp
)
#ifndef __BEHAVIOR_SERVER__CLASS_HPP__
#define __BEHAVIOR_SERVER__CLASS_HPP__
#include <as2_behavior/behavior_utils.hpp>
#include <as2_core/node.hpp>
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/service.hpp>
#include <rclcpp_action/rclcpp_action.hpp>
#include <rclcpp_action/server.hpp>
namespace as2_behavior {
template <typename actionT>
class BehaviorServer : public as2::Node {
protected:
public:
using GoalHandleAction = rclcpp_action::ServerGoalHandle<actionT>;
std::string action_name_;
typename rclcpp_action::Server<actionT>::SharedPtr action_server_;
public:
void register_action();
rclcpp_action::GoalResponse handleGoal(const rclcpp_action::GoalUUID& uuid,
std::shared_ptr<const typename actionT::Goal> goal);
rclcpp_action::CancelResponse handleCancel(const std::shared_ptr<GoalHandleAction> goal_handle);
void handleAccepted(const std::shared_ptr<GoalHandleAction> goal_handle);
std::shared_ptr<GoalHandleAction> goal_handle_;
as2_msgs::msg::BehaviorStatus behavior_status_;
// TODO: remove all the unnecessary using statements
using BehaviorStatus = as2_msgs::msg::BehaviorStatus;
using start_srv = typename actionT::Impl::SendGoalService;
using modify_srv = start_srv;
using result_srv = typename actionT::Impl::GetResultService;
using feedback_msg = typename actionT::Impl::FeedbackMessage;
using goal_status_msg = typename actionT::Impl::GoalStatusMessage;
using cancel_srv = typename actionT::Impl::CancelGoalService;
private:
// create rclmessage formed by goal and result_msg
typename rclcpp::Service<start_srv>::SharedPtr start_srv_;
typename rclcpp::Service<modify_srv>::SharedPtr modify_srv_;
rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr stop_srv_;
rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr pause_srv_;
rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr resume_srv_;
typename rclcpp::Publisher<feedback_msg>::SharedPtr feedback_pub_;
typename rclcpp::Publisher<goal_status_msg>::SharedPtr goal_status_pub_;
rclcpp::Publisher<BehaviorStatus>::SharedPtr behavior_status_pub_;
rclcpp::TimerBase::SharedPtr behavior_status_timer_;
rclcpp::TimerBase::SharedPtr run_timer_;
private:
std::string generate_name(const std::string& name);
private:
void register_service_servers();
void register_publishers();
void register_timers();
void register_run_timer();
void cleanup_run_timer(const ExecutionStatus& status);
public:
BehaviorServer(const std::string& name,
const rclcpp::NodeOptions& options = rclcpp::NodeOptions());
// TODO: CONVERT INTO PURE VIRTUAL FUNCTIONS
virtual bool on_activate(std::shared_ptr<const typename actionT::Goal> goal);
virtual bool on_modify(std::shared_ptr<const typename actionT::Goal> goal);
virtual bool on_deactivate(const std::shared_ptr<std::string>& message);
virtual bool on_pause(const std::shared_ptr<std::string>& message);
virtual bool on_resume(const std::shared_ptr<std::string>& message);
virtual void on_execution_end(const ExecutionStatus& state){};
virtual ExecutionStatus on_run(const typename std::shared_ptr<const typename actionT::Goal>& goal,
typename std::shared_ptr<typename actionT::Feedback>& feedback_msg,
typename std::shared_ptr<typename actionT::Result>& result_msg);
bool activate(std::shared_ptr<const typename actionT::Goal> goal);
void modify(std::shared_ptr<const typename actionT::Goal> goal);
void deactivate(const typename std_srvs::srv::Trigger::Request::SharedPtr goal,
typename std_srvs::srv::Trigger::Response::SharedPtr result);
void pause(const typename std_srvs::srv::Trigger::Request::SharedPtr goal,
typename std_srvs::srv::Trigger::Response::SharedPtr result);
void resume(const typename std_srvs::srv::Trigger::Request::SharedPtr goal,
typename std_srvs::srv::Trigger::Response::SharedPtr result);
void run(const typename std::shared_ptr<GoalHandleAction>& goal_handle_action);
void timer_callback() { run(goal_handle_); };
void publish_behavior_status();
};
}; // namespace as2_behavior
#endif // __BEHAVIOR_SERVER__CLASS_HPP__