10#ifndef NROS_CPP_ACTION_CLIENT_HPP
11#define NROS_CPP_ACTION_CLIENT_HPP
19#include "nros/size_bound.hpp"
35#include "nros_cpp_ffi.h"
39 const uint8_t goal_id[16],
42 const uint8_t* data,
size_t len,
45 const uint8_t* data,
size_t len,
96 return nros_cpp_action_goal_accept_decode(data, len, &out->
goal_id, &out->
accepted) ==
122 return Result(nros_cpp_action_client_wait_for_action_server(storage_, timeout_ms));
128 uint8_t buf[::nros::detail::buffer_bounds<GoalType>::tx];
130 if (GoalType::ffi_serialize(&goal, buf,
sizeof(buf), &len) != 0) {
133 return Result(nros_cpp_action_client_send_goal(storage_, buf, len,
134 reinterpret_cast<uint8_t(*)[16]
>(goal_id)));
157 storage_, executor_,
reinterpret_cast<const uint8_t(*)[16]
>(goal_id),
buf,
sizeof(
buf),
161 if (ResultType::ffi_deserialize(
buf, len, &result) != 0) {
190 uint8_t buf[::nros::detail::buffer_bounds<GoalType>::tx];
192 if (GoalType::ffi_serialize(&
goal,
buf,
sizeof(
buf), &len) != 0) {
198 storage_,
buf, len,
reinterpret_cast<uint8_t(*)[16]
>(goal_id));
231 template <
size_t Cap>
234 if (!initialized_)
return Fut();
237 storage_,
reinterpret_cast<const uint8_t(*)[16]
>(goal_id));
238 if (
ret != 0)
return Fut();
268 if (FeedbackType::ffi_deserialize(
buf, len, &feedback) != 0) {
295 if (initialized_ && !feedback_stream_.
is_valid()) {
298 return feedback_stream_;
338 uint8_t buf[::nros::detail::buffer_bounds<GoalType>::tx];
340 if (GoalType::ffi_serialize(&
goal,
buf,
sizeof(
buf), &len) != 0) {
344 storage_,
buf, len,
reinterpret_cast<uint8_t(*)[16]
>(goal_id)));
364 storage_,
reinterpret_cast<const uint8_t(*)[16]
>(goal_id)));
391 storage_,
reinterpret_cast<const uint8_t(*)[16]
>(goal_id)));
411 if (!initialized_)
return;
422 initialized_ =
false;
431 : executor_(
other.executor_), initialized_(
other.initialized_) {
432 if (
other.initialized_) {
434 other.initialized_ =
false;
440 if (
this != &
other) {
445 executor_ =
other.executor_;
446 initialized_ =
other.initialized_;
447 if (
other.initialized_) {
449 other.initialized_ =
false;
471 char action_name_[256] = {};
485 nros_cpp_ret_t ret = nros_cpp_action_client_create(&handle_, action_name, A::TYPE_NAME,
486 A::Goal::TYPE_HASH, ffi_qos, out.storage_);
490 while (action_name[name_len] !=
'\0' && name_len + 1 <
sizeof(out.action_name_)) {
491 out.action_name_[name_len] = action_name[name_len];
494 out.action_name_[name_len] =
'\0';
495 out.executor_ = executor_handle_;
496 out.initialized_ =
true;
nros_cpp_ret_t nros_cpp_action_client_set_callbacks(void *handle, nros_cpp_action_client_goal_response_callback_t goal_response, nros_cpp_action_client_feedback_callback_t feedback, nros_cpp_action_client_result_callback_t result, void *context)
void(* nros_cpp_action_client_goal_response_callback_t)(bool accepted, const uint8_t goal_id[16], void *ctx)
Definition action_client.hpp:38
void(* nros_cpp_action_client_feedback_callback_t)(const uint8_t goal_id[16], const uint8_t *data, size_t len, void *ctx)
Definition action_client.hpp:41
void(* nros_cpp_action_client_result_callback_t)(const uint8_t goal_id[16], int32_t status, const uint8_t *data, size_t len, void *ctx)
Definition action_client.hpp:44
nros::ActionServer<A> — typed action server.
Definition action_client.hpp:73
Result get_result(const uint8_t goal_id[16], ResultType &result)
Definition action_client.hpp:145
Future< GoalAccept > send_goal_future(const GoalType &goal)
Definition action_client.hpp:187
Result wait_for_action_server(uint32_t timeout_ms=5000)
Definition action_client.hpp:120
Future< ResultType > get_result_future(const uint8_t goal_id[16])
Definition action_client.hpp:222
Result get_result_async(const uint8_t goal_id[16])
Definition action_client.hpp:388
ActionClient()
Definition action_client.hpp:458
ActionClient & operator=(ActionClient &&other)
Definition action_client.hpp:439
bool is_valid() const
Check if the action client is initialized and valid.
Definition action_client.hpp:416
const Stream< FeedbackType > & feedback_stream() const
Definition action_client.hpp:301
Stream< FeedbackType > & feedback_stream()
Definition action_client.hpp:294
typename A::Result ResultType
Definition action_client.hpp:76
Result try_recv_feedback(FeedbackType &feedback)
Definition action_client.hpp:253
Future< ResultType, Cap > get_result_future_sized(const uint8_t goal_id[16])
Definition action_client.hpp:232
typename A::Goal GoalType
Definition action_client.hpp:75
Result send_goal_async(const GoalType &goal, uint8_t goal_id[16])
Definition action_client.hpp:335
Result try_recv_cancel_response(CancelReturnCode &out)
Definition action_client.hpp:372
~ActionClient()
Destructor — releases action client resources.
Definition action_client.hpp:419
Result set_callbacks(const SendGoalOptions &options)
Definition action_client.hpp:399
ActionClient(ActionClient &&other)
Definition action_client.hpp:430
Result send_goal(const GoalType &goal, uint8_t goal_id[16])
Definition action_client.hpp:125
Result try_recv_feedback_sized(FeedbackType &feedback)
Definition action_client.hpp:259
typename A::Feedback FeedbackType
Definition action_client.hpp:77
Result get_result_sized(const uint8_t goal_id[16], ResultType &result)
Definition action_client.hpp:151
void poll()
Definition action_client.hpp:410
Result cancel_goal(const uint8_t goal_id[16])
Definition action_client.hpp:361
Result create_action_client(ActionClient< A > &out, const char *action_name, const QoS &qos=QoS::services())
Definition action_client.hpp:482
static constexpr Result success()
Named constructors.
Definition result.hpp:112
bool is_valid() const
Check if the stream is connected to a valid source.
Definition stream.hpp:119
Inline storage-size macros for opaque entity buffers.
nros::Future<T> — single-shot deferred result.
int nros_cpp_ret_t
Definition future.hpp:21
@ Error
Generic failure not covered by a more specific code.
@ TryAgain
Transient — no data ready yet (non-blocking take). Retry later.
CancelReturnCode
Definition action_server.hpp:83
nros::Node and global session helpers.
nros::Result, nros::ErrorCode, and the NROS_TRY macro.
nros::Stream<T> — multi-shot message receiver.
Definition action_client.hpp:83
static const size_t SERIALIZED_SIZE_MAX
Definition action_client.hpp:89
bool accepted
Definition action_client.hpp:85
uint8_t goal_id[16]
Definition action_client.hpp:84
static int ffi_deserialize(const uint8_t *data, size_t len, GoalAccept *out)
Definition action_client.hpp:94
Definition action_client.hpp:312
void * context
User context pointer passed to all callbacks.
Definition action_client.hpp:321
void(* goal_response)(bool accepted, const uint8_t goal_id[16], void *ctx)
Called when the server accepts or rejects the goal.
Definition action_client.hpp:314
SendGoalOptions()
Definition action_client.hpp:323
void(* result)(const uint8_t goal_id[16], int32_t status, const uint8_t *data, size_t len, void *ctx)
Called when the result is received.
Definition action_client.hpp:318
void(* feedback)(const uint8_t goal_id[16], const uint8_t *data, size_t len, void *ctx)
Called when feedback is received for the goal.
Definition action_client.hpp:316