Program Listing for File set_offboard_mode_behavior.hpp
↰ Return to documentation for file (/tmp/ws/src/aerostack2/as2_behaviors/as2_behaviors_platform/include/as2_behaviors_platform/set_offboard_mode_behavior.hpp
)
#ifndef __SET_OFFBOARD_STATE_BEHAVIOR_HPP__
#define __SET_OFFBOARD_STATE_BEHAVIOR_HPP__
#include "as2_behavior/behavior_server.hpp"
#include "as2_core/names/services.hpp"
#include "as2_msgs/action/set_offboard_mode.hpp"
#include "std_srvs/srv/set_bool.hpp"
class SetOffboardModeBehavior
: public as2_behavior::BehaviorServer<as2_msgs::action::SetOffboardMode>
{
public:
SetOffboardModeBehavior()
: as2_behavior::BehaviorServer<as2_msgs::action::SetOffboardMode>(
as2_names::services::platform::set_offboard_mode) {
client_ = this->create_client<std_srvs::srv::SetBool>(
as2_names::services::platform::set_offboard_mode);
}
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::SetOffboardMode::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::SetOffboardMode::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::SetOffboardMode::Goal>& goal,
typename std::shared_ptr<as2_msgs::action::SetOffboardMode::Feedback>& feedback_msg,
typename std::shared_ptr<as2_msgs::action::SetOffboardMode::Result>& result_msg) override {
if (future_.valid() && future_.wait_for(std::chrono::seconds(0)) == std::future_status::ready) {
auto result = future_.get();
result_msg->success = result->success;
if (result->success) {
result_msg->success = true;
return as2_behavior::ExecutionStatus::SUCCESS;
} else {
result_msg->success = false;
return as2_behavior::ExecutionStatus::FAILURE;
}
}
return as2_behavior::ExecutionStatus::RUNNING;
};
};
#endif