Program Listing for File set_arming_state_behavior.hpp

Return to documentation for file (include/as2_behaviors_platform/set_arming_state_behavior.hpp)

#ifndef __SET_ARMING_STATE_BEHAVIOR_HPP__
#define __SET_ARMING_STATE_BEHAVIOR_HPP__

#include "as2_behavior/behavior_server.hpp"
#include "as2_msgs/action/set_arming_state.hpp"
#include "std_srvs/srv/set_bool.hpp"

class SetArmingStateBehavior
    : public as2_behavior::BehaviorServer<as2_msgs::action::SetArmingState> {
public:
  SetArmingStateBehavior()
      : as2_behavior::BehaviorServer<as2_msgs::action::SetArmingState>("set_arming_state") {
    client_ = this->create_client<std_srvs::srv::SetBool>("set_arming_state");
  }

  rclcpp::Client<std_srvs::srv::SetBool>::SharedPtr client_;
  rclcpp::Client<std_srvs::srv::SetBool>::SharedFuture future_;

public:
  bool on_activate(std::shared_ptr<const as2_msgs::action::SetArmingState::Goal> goal) override {
    auto req = std::make_shared<std_srvs::srv::SetBool::Request>();

    req->data = goal->request;
    using namespace std::chrono_literals;
    if (!client_->wait_for_service(5s)) {
      RCLCPP_INFO(get_logger(), "service not available");
      return false;
    }
    future_ = client_->async_send_request(req).share();
    if (!future_.valid()) {
      RCLCPP_INFO(get_logger(), "request not sent");
      return false;
    }
    return true;
  };

  bool on_modify(std::shared_ptr<const as2_msgs::action::SetArmingState::Goal> goal) override {
    RCLCPP_WARN(get_logger(), "Cannot modify a service request");
    return false;
  };

  bool on_deactivate(const std::shared_ptr<std::string>& message) override {
    *message = "Unable to deactivate InstantBehavior";
    return false;
  };
  bool on_pause(const std::shared_ptr<std::string>& message) override {
    *message = "Unable to pause InstantBehavior";
    return false;
  };

  bool on_resume(const std::shared_ptr<std::string>& message) override {
    *message = "Unable to resume InstantBehavior";
    return false;
  };

  void on_execution_end(const as2_behavior::ExecutionStatus& state) override{};

  as2_behavior::ExecutionStatus on_run(
      const typename std::shared_ptr<const as2_msgs::action::SetArmingState::Goal>& goal,
      typename std::shared_ptr<as2_msgs::action::SetArmingState::Feedback>& feedback_msg,
      typename std::shared_ptr<as2_msgs::action::SetArmingState::Result>& result_msg) override {
    if (future_.valid() && future_.wait_for(std::chrono::seconds(0)) == std::future_status::ready) {
      auto result = future_.get();
      if (result->success) {
        result_msg->success = true;
        return as2_behavior::ExecutionStatus::SUCCESS;
      } else {
        result_msg->success = true;
        return as2_behavior::ExecutionStatus::FAILURE;
      }
    }
    return as2_behavior::ExecutionStatus::RUNNING;
  };
};
#endif