16#ifndef EASYFLEET_MISSION_MANAGER__DETAIL__RUNNING_CAPABILITY_HPP_
17#define EASYFLEET_MISSION_MANAGER__DETAIL__RUNNING_CAPABILITY_HPP_
24#include "rclcpp/rclcpp.hpp"
26#include "easyfleet_core/capability_client.hpp"
28#include "easyfleet_mission_manager/ansi.hpp"
29#include "easyfleet_mission_manager/capability_state.hpp"
30#include "easyfleet_mission_manager/output.hpp"
31#include "easyfleet_mission_manager/status_markers.hpp"
42namespace easyfleet_mission_manager::detail
49inline easyfleet::CapabilityState outcome_to_state(uint8_t outcome_value)
53 switch (outcome_value) {
54 case 0:
return easyfleet::CapabilityState::SUCCEEDED;
55 case 1:
return easyfleet::CapabilityState::ABORTED;
56 case 2:
return easyfleet::CapabilityState::CANCELED;
57 case 3:
return easyfleet::CapabilityState::REJECTED;
58 case 4:
return easyfleet::CapabilityState::TIMEOUT;
59 default:
return easyfleet::CapabilityState::UNREACHABLE;
75 virtual easyfleet::CapabilityState
state()
const = 0;
84template<
typename ActionT>
98 const std::string & action_name,
99 std::string robot_name,
100 std::string capability_type,
102 : client_(
Client::create(node, action_name)),
103 robot_name_(std::move(robot_name)),
104 capability_type_(std::move(capability_type)),
114 void run(
const typename ActionT::Goal & goal, std::chrono::seconds timeout)
128 const auto generation = generation_.fetch_add(1) + 1;
129 state_.store(easyfleet::CapabilityState::RUNNING);
130 deadline_ = std::chrono::steady_clock::now() + timeout;
131 status_.set_status(robot_name_,
"Running " + capability_type_);
136 if (generation_.load() != generation) {
139 const auto new_state = outcome_to_state(
static_cast<uint8_t
>(response.
outcome));
140 state_.store(new_state);
143 capability_type_ +
" -> " + easyfleet::to_string(new_state));
144 std::ostringstream out;
145 out <<
" " << easyfleet_mission_manager::ansi::dim <<
"[" << robot_name_ <<
"/" <<
146 capability_type_ <<
"] " << easyfleet_mission_manager::ansi::reset <<
147 "finished with outcome " << easyfleet_mission_manager::ansi::magenta <<
148 easyfleet::to_string(new_state) << easyfleet_mission_manager::ansi::reset;
149 easyfleet_mission_manager::safe_print(out.str());
158 easyfleet::CapabilityState
state()
const override
160 return state_.load();
165 if (state_.load() == easyfleet::CapabilityState::RUNNING &&
166 std::chrono::steady_clock::now() >= deadline_)
174 std::string robot_name_;
175 std::string capability_type_;
177 std::atomic<easyfleet::CapabilityState> state_{easyfleet::CapabilityState::IDLE};
178 std::chrono::steady_clock::time_point deadline_;
180 std::atomic<uint64_t> generation_{0};
The simplest possible way to ask a capability to do something.
Definition capability_client.hpp:56
std::shared_ptr< CapabilityClient< ActionT > > SharedPtr
Shared pointer to a CapabilityClient<ActionT>.
Definition capability_client.hpp:59
Publishes a floating TEXT_VIEW_FACING marker above each robot's own base_link, showing a short,...
Definition status_markers.hpp:47
Non-template interface RobotHandle holds one of per capability type it has ever run,...
Definition running_capability.hpp:67
virtual void stop()=0
Asks the in-flight goal, if any, to stop.
virtual easyfleet::CapabilityState state() const =0
virtual void check_timeout()=0
Called periodically (from FleetSession::spin_some()) so a timeout passed to run() actually gets enfor...
RunningCapability(rclcpp::Node &node, const std::string &action_name, std::string robot_name, std::string capability_type, easyfleet_mission_manager::StatusMarkerPublisher &status)
Definition running_capability.hpp:96
easyfleet::CapabilityState state() const override
Definition running_capability.hpp:158
void run(const typename ActionT::Goal &goal, std::chrono::seconds timeout)
Sends goal and starts tracking it.
Definition running_capability.hpp:114
easyfleet_core::CapabilityClient< ActionT > Client
The CapabilityClient<ActionT> specialization this instance wraps.
Definition running_capability.hpp:89
void stop() override
Asks the in-flight goal, if any, to stop.
Definition running_capability.hpp:153
void check_timeout() override
Called periodically (from FleetSession::spin_some()) so a timeout passed to run() actually gets enfor...
Definition running_capability.hpp:163
Final outcome of a request, as delivered to a ResponseCallback or returned by request_and_wait().
Definition capability_client.hpp:75
Outcome outcome
How the request ended.
Definition capability_client.hpp:77