10#ifndef NROS_CPP_NODE_HPP
11#define NROS_CPP_NODE_HPP
16#if defined(NROS_CPP_STD) || (__STDC_HOSTED__ + 0)
18#if defined(NROS_CPP_STD) || (__STDC_HOSTED__ + 0)
26#include "nros_cpp_ffi.h"
29#include "nros/nros_cpp_config_generated.h"
34#include "nros/options.hpp"
48#ifdef NROS_RMW_CYCLONEDDS
49extern "C" int32_t nros_rmw_cyclonedds_register(
void);
51#if defined(NROS_RMW_XRCE) || defined(NROS_RMW_XRCE_CFFI)
52extern "C" int32_t nros_rmw_xrce_register(
void);
54#ifdef NROS_RMW_ZENOH_CFFI
55extern "C" int32_t nros_rmw_zenoh_register(
void);
58extern "C" int32_t nros_rmw_uorb_register(
void);
67template <
typename M>
class Publisher;
68template <
typename M>
class Subscription;
69template <
typename S>
class Service;
70template <
typename S>
class Client;
71template <
typename A>
class ActionServer;
72template <
typename A>
class ActionClient;
170 if (!
out.executor_handle_) {
177 out.initialized_ =
true;
184 if (!initialized_)
return "";
190 if (!initialized_)
return "";
201 if (!initialized_)
return nullptr;
237 ::nros_cpp_node_set_qos_overrides(&handle_,
overrides, len);
255 template <
typename M>
271 template <
typename M>
281 template <
typename M>
297 template <
typename M>
320 typename M,
typename F,
321 typename =
typename std::enable_if<std::is_convertible<
F,
void (*)(
const M&)>::value>::type>
333 template <
typename M,
typename F,
334 typename =
typename std::enable_if<
335 std::is_convertible<F, void (*)(
const M&,
const uint8_t*, size_t)>::value>::type>
338 const SubscriptionOptions& options = {});
346 template <
typename S>
362 template <
typename S,
typename F,
363 typename =
typename std::enable_if<std::is_convertible<
364 F, void (*)(
const typename S::Request&,
typename S::Response&)>::value>::type>
365 Result
create_service(Service<S>& out,
const char* service_name, F callback,
366 const QoS& qos =
QoS::services(),
const ServiceOptions& options = {});
374 template <
typename S>
375 Result
create_client(Client<S>& out,
const char* service_name,
388 template <
typename S,
typename F,
389 typename =
typename std::enable_if<
390 std::is_convertible<F, void (*)(
const typename S::Response&)>::value>::type>
391 Result
create_client(Client<S>& out,
const char* service_name, F callback,
392 const QoS& qos =
QoS::services(),
const ClientOptions& options = {});
404 template <
typename A>
407 const ActionServerOptions& options = {});
415 template <
typename A>
422 template <
typename A>
426 template <
typename A>
438 void* context =
nullptr) {
440 size_t handle_id = 0;
444 out.executor_ = executor_handle_;
445 out.handle_id_ = handle_id;
446 out.initialized_ =
true;
460 void* context =
nullptr) {
462 size_t handle_id = 0;
464 context, &handle_id);
466 out.executor_ = executor_handle_;
467 out.handle_id_ = handle_id;
468 out.initialized_ =
true;
481 void* context =
nullptr) {
486 out.initialized_ =
true;
495 initialized_ =
false;
501 : handle_(
other.handle_), initialized_(
other.initialized_),
502 executor_handle_(
other.executor_handle_) {
503 other.initialized_ =
false;
504 other.executor_handle_ =
nullptr;
508 if (
this != &
other) {
512 handle_ =
other.handle_;
513 initialized_ =
other.initialized_;
514 executor_handle_ =
other.executor_handle_;
515 other.initialized_ =
false;
516 other.executor_handle_ =
nullptr;
527 void* executor_handle_;
551 template <
int = 0>
struct GlobalStorageHolder {
553 static bool initialized;
555 static uint8_t* global_storage() {
return GlobalStorageHolder<>::storage; }
556 static bool& global_initialized() {
return GlobalStorageHolder<>::initialized; }
563alignas(8) uint8_t Node::GlobalStorageHolder<N>::storage[NROS_CPP_EXECUTOR_STORAGE_SIZE] = {};
564template <
int N>
bool Node::GlobalStorageHolder<N>::initialized =
false;
569#if defined(NROS_CPP_STD) || (__STDC_HOSTED__ + 0)
574 if (locator ==
nullptr) {
575 const char*
env_loc = ::std::getenv(
"NROS_LOCATOR");
579 locator =
"tcp/127.0.0.1:7447";
582 if (domain_id == 0) {
583 const char*
env_dom = ::std::getenv(
"ROS_DOMAIN_ID");
588 if (*
p <
'0' || *
p >
'9') {
592 acc =
acc * 10 +
static_cast<unsigned>(*
p -
'0');
602 return init(locator, domain_id,
"nros_cpp");
612#if defined(NROS_CPP_STD) || (__STDC_HOSTED__ + 0)
618 if (locator ==
nullptr) {
619 const char*
env_loc = ::std::getenv(
"NROS_LOCATOR");
623 locator =
"tcp/127.0.0.1:7447";
626 if (domain_id == 0) {
627 const char*
env_dom = ::std::getenv(
"ROS_DOMAIN_ID");
631 if (*
p <
'0' || *
p >
'9') {
635 acc =
acc * 10 +
static_cast<unsigned>(*
p -
'0');
658 Node::global_initialized() =
true;
664 if (!Node::global_initialized()) {
668 Node::global_initialized() =
false;
697 if (
path ==
nullptr) {
700#if defined(NROS_CPP_STD) || (__STDC_HOSTED__ + 0)
718 return Node::global_initialized();
729 if (!Node::global_initialized()) {
732 out.executor_handle_ = Node::global_storage();
750 out.executor_handle_ = storage_;
774 : executor_handle_(executor_handle), name_(
name),
796 options_.domain_id_override =
id;
810 options_.sched_context_id =
sc_id;
817 out.executor_handle_ = executor_handle_;
821 out.initialized_ =
true;
829 if (
src !=
nullptr) {
836 for (
size_t i = n; i < cap; ++i) {
842 void* executor_handle_;
844 nros_cpp_node_options_t options_;
NodeBuilder node_builder(const char *name)
Definition node.hpp:847
void * handle()
Definition executor.hpp:166
Result create_node(Node &out, const char *name, const char *ns=nullptr)
Definition node.hpp:748
ErrorCode error() const
Definition result.hpp:183
bool ok() const
Definition result.hpp:176
Definition guard_condition.hpp:45
NodeBuilder & domain_id(uint32_t id)
Definition node.hpp:795
NodeBuilder & sched(uint8_t sc_id)
Definition node.hpp:809
NodeBuilder(void *executor_handle, const char *name)
Definition node.hpp:773
NodeBuilder & rmw(const char *name)
Definition node.hpp:781
NodeBuilder & locator(const char *loc)
Definition node.hpp:788
NodeBuilder & namespace_(const char *ns)
Definition node.hpp:802
Result build(Node &out) const
Materialize the Node.
Definition node.hpp:815
friend Result init(const char *locator, uint8_t domain_id)
Definition node.hpp:568
Result create_polling_action_server(PollingActionServer< A > &out, const char *action_name)
Result create_client(Client< S > &out, const char *service_name, const QoS &qos=QoS::services())
Definition client.hpp:240
friend class ComponentNode
Definition node.hpp:531
Result create_action_server(ActionServer< A > &out, const char *action_name, const QoS &qos=QoS::services(), const ActionServerOptions &options={})
Definition action_server.hpp:350
friend class NodeBuilder
Definition node.hpp:530
const void * get_logger() const
Definition node.hpp:200
friend bool ok()
Check if the nros session is initialized.
Definition node.hpp:717
const nros_cpp_node_t * ffi_handle() const
Definition node.hpp:223
const char * get_namespace() const
Get the node namespace.
Definition node.hpp:189
friend Result spin()
Definition nros.hpp:77
Result create_subscription(Subscription< M > &out, const char *topic, const QoS &qos=QoS::default_profile())
Definition subscription.hpp:460
Result create_action_client(ActionClient< A > &out, const char *action_name, const QoS &qos=QoS::services())
Definition action_client.hpp:399
void * executor_handle() const
Definition node.hpp:247
friend Result create_node(Node &out, const char *name, const char *ns)
Definition node.hpp:728
Result create_timer(Timer &out, uint64_t period_ms, nros_cpp_timer_callback_t callback, void *context=nullptr)
Definition node.hpp:437
friend class Executor
Definition node.hpp:529
Node(Node &&other)
Definition node.hpp:500
Result create_service(Service< S > &out, const char *service_name, const QoS &qos=QoS::services())
Definition service.hpp:214
~Node()
Destructor — releases node resources.
Definition node.hpp:492
Result create_publisher(Publisher< M > &out, const char *topic, const QoS &qos=QoS::default_profile())
Definition publisher.hpp:272
static Result create(Node &out, const char *name, const char *ns=nullptr)
Definition node.hpp:169
Result create_subscription_with_info(Subscription< M > &out, const char *topic, F callback, const QoS &qos=QoS::default_profile(), const SubscriptionOptions &options={})
Definition subscription.hpp:567
Node()
Default constructor — creates an uninitialized node.
Definition node.hpp:161
bool is_valid() const
Check if the node is initialized and valid.
Definition node.hpp:206
Result create_polling_action_client(PollingActionClient< A > &out, const char *action_name)
Phase 122.3.d.b — Create an L1 polling-mode action client.
friend void * global_handle()
Definition nros.hpp:50
friend Result spin_once(int32_t timeout_ms)
Definition nros.hpp:62
Result create_timer_oneshot(Timer &out, uint64_t delay_ms, nros_cpp_timer_callback_t callback, void *context=nullptr)
Definition node.hpp:459
Result create_guard_condition(GuardCondition &out, nros_cpp_guard_callback_t callback, void *context=nullptr)
Definition node.hpp:480
void set_qos_overrides(const nros_cpp_qos_override_t *overrides, size_t len)
Definition node.hpp:235
friend Result shutdown()
Definition node.hpp:663
const char * get_name() const
Get the node name.
Definition node.hpp:183
Node & operator=(Node &&other)
Definition node.hpp:507
static constexpr QoS default_profile()
Default profile: RELIABLE + VOLATILE + KEEP_LAST(10).
Definition qos.hpp:160
static constexpr QoS services()
Services profile: RELIABLE + VOLATILE + KEEP_LAST(10).
Definition qos.hpp:166
static constexpr Result success()
Named constructors.
Definition result.hpp:74
nros::Executor — drives transport I/O and dispatches callbacks.
int nros_cpp_ret_t
Definition future.hpp:20
nros::GuardCondition — cross-thread wake source.
Result init_with_launch(const char *path, int argc=0, char **argv=nullptr, const char *session_name=nullptr)
Definition node.hpp:693
Expected< Node > make_node(const char *name, const char *ns=nullptr)
Definition node.hpp:739
Result shutdown()
Definition node.hpp:663
bool ok()
Check if the nros session is initialized.
Definition node.hpp:717
Result init_with_launch_auto(int argc=0, char **argv=nullptr, const char *session_name=nullptr)
Definition node.hpp:679
Result init(const char *locator=nullptr, uint8_t domain_id=0)
Definition node.hpp:568
Result create_node(Node &out, const char *name, const char *ns=nullptr)
Definition node.hpp:728
nros::QoS — full DDS-shaped QoS settings (Phase 108.B.7).
nros::Result, nros::ErrorCode, and the NROS_TRY macro.
nros::Timer — periodic callback driven by the executor.