10#ifndef NROS_RCLCPP_PUBLISHER_HPP
11#define NROS_RCLCPP_PUBLISHER_HPP
17#include "rclcpp/detail/traits.hpp"
19#include "rclcpp/detail/std_detect.hpp"
20#include "rclcpp/detail/entity_name.hpp"
22#include "rclcpp/owned.hpp"
24#if defined(NROS_CPP_STD)
30#include "rclcpp/detail/nros_cpp_ffi.h"
31#include "rclcpp/event.hpp"
145#if defined(NROS_CPP_STD)
157class PublishResult :
public ::rclcpp::ResultOf<void> {
159 constexpr PublishResult(::rclcpp::ResultOf<void> r) : ::rclcpp::ResultOf<void>(r) {}
166template <
typename M>
inline void report_failed_publish(
const char* topic, int32_t code) {
167 static unsigned long failures = 0;
168 if ((failures++ % 1024UL) == 0) {
169 RCLC_LOG_ERROR(rclc_log_default_logger(),
170 "rclcpp::Publisher::publish on \"%.64s\" failed: rclcpp::ErrorCode %d "
171 "(%lu failure(s) so far)",
172 topic,
static_cast<int>(code), failures);
246#if defined(NROS_CPP_STD)
247 ::rclcpp::detail::PublishResult
publish(
const M& msg) {
248 const Result r = initialized_ ?
Result(M::ffi_publish(storage_, &msg))
253#if defined(NROS_CPP_HAS_SHARED_PTR)
260 template <typename D>::rclcpp::detail::PublishResult publish(::std::unique_ptr<M, D> msg) {
263 ::rclcpp::detail::report_failed_publish<M>(
get_topic_name(), r.raw());
266 return publish(
static_cast<const M&
>(*msg));
272 return Result(M::ffi_publish(storage_, &msg));
284 return Result(nros_cpp_publish_raw(storage_, data, len));
306 } ctx{
static_cast<W&&
>(writer), total_len};
307 auto size_cb = [](
size_t* out_total,
void* user) {
308 auto* c =
static_cast<Ctx*
>(user);
309 *out_total = c->total;
311 auto chunk_cb = [](uint8_t* out_buf,
size_t cap,
size_t* out_written,
void* user) {
312 auto* c =
static_cast<Ctx*
>(user);
313 *out_written = c->writer(out_buf, cap);
315 return Result(nros_cpp_publisher_publish_streamed(storage_, size_cb, chunk_cb,
316 static_cast<void*
>(&ctx)));
328 Loan() : pub_(nullptr), buf_(nullptr), cap_(0), token_(nullptr) {}
329 Loan(
Loan&& o) : pub_(o.pub_), buf_(o.buf_), cap_(o.cap_), token_(o.token_) {
350 uint8_t*
data() {
return buf_; }
351 const uint8_t*
data()
const {
return buf_; }
354 bool is_valid()
const {
return token_ !=
nullptr; }
359 nros_cpp_ret_t ret = nros_cpp_publisher_commit(pub_, token_, actual_len);
380 Loan(
void* pub, uint8_t* buf,
size_t cap,
void* token)
381 : pub_(pub), buf_(buf), cap_(cap), token_(token) {}
385 if (token_ && pub_) {
386 nros_cpp_publisher_discard(pub_, token_);
408 uint8_t* buf =
nullptr;
410 void* token =
nullptr;
411 nros_cpp_ret_t ret = nros_cpp_publisher_loan(storage_, requested_len, &buf, &cap, &token);
412 if (ret != 0) return ::rclcpp::ResultOf<Loan>::error(
Result(ret));
413 return ::rclcpp::ResultOf<Loan>::ok(
Loan{storage_, buf, cap, token});
440 if (!initialized_ || nros_cpp_publisher_get_actual_qos(storage_, &f) != 0) {
441 return ::rclcpp::detail::qos_all_unknown();
443 return ::rclcpp::detail::qos_from_ffi(f);
500 nros_cpp_publisher_destroy(storage_);
501 initialized_ =
false;
508 if (other.initialized_) {
509 nros_cpp_publisher_relocate(other.storage_, storage_);
510 ::memcpy(topic_name_, other.topic_name_, sizeof(topic_name_));
511 other.initialized_ = false;
516 if (
this != &other) {
518 nros_cpp_publisher_destroy(storage_);
519 initialized_ =
false;
521 if (other.initialized_) {
522 nros_cpp_publisher_relocate(other.storage_, storage_);
523 ::memcpy(topic_name_, other.topic_name_,
sizeof(topic_name_));
525 other.initialized_ =
false;
533 Publisher() : storage_(), topic_name_{}, initialized_(false) {}
548 return Result(nros_cpp_publisher_set_liveliness_lost(storage_, cb, user_context));
557 void* user_context =
nullptr) {
559 return Result(nros_cpp_publisher_set_offered_deadline_missed(storage_, deadline_ms, cb,
575 return Result(nros_cpp_publisher_set_matched(storage_, cb, user_context));
583 return Result(nros_cpp_publisher_set_incompatible_type(storage_, cb, user_context));
598 return Result(nros_cpp_publisher_assert_liveliness(storage_));
628 return Result(nros_cpp_publisher_get_gid(storage_, out_gid,
GID_SIZE));
635 friend class ::rclcpp::Node;
640 alignas(8) uint8_t storage_[NROS_PUBLISHER_SIZE +
sizeof(
void*)];
663 nros_cpp_ret_t ret = nros_cpp_publisher_create(&handle_, topic, M::TYPE_NAME, M::TYPE_HASH,
664 ffi_qos, out.storage_);
668 ::rclcpp::detail::assign_entity_name(out.topic_name_, topic);
669 out.initialized_ =
true;
687 const ::rclcpp::PublisherOptions& options) {
Definition executor.hpp:119
Result count_subscribers(const char *topic_name, size_t *out_count)
Definition executor.hpp:418
typename::rclcpp::Publisher< M >::SharedPtr create_publisher(const char *topic, const ::rclcpp::QoS &qos=::rclcpp::QoS::default_profile())
create_publisher<M>(topic, qos) — available on every target.
Definition publisher.hpp:326
~Loan()
Definition publisher.hpp:347
size_t capacity() const
Definition publisher.hpp:352
const uint8_t * data() const
Definition publisher.hpp:351
Loan(void *pub, uint8_t *buf, size_t cap, void *token)
Definition publisher.hpp:380
Loan(const Loan &)=delete
Result discard()
Abandon without sending. Consumes the loan.
Definition publisher.hpp:368
uint8_t * data()
Writable view of the loaned bytes.
Definition publisher.hpp:350
bool is_valid() const
Definition publisher.hpp:354
Loan(Loan &&o)
Definition publisher.hpp:329
Loan & operator=(Loan &&o)
Definition publisher.hpp:333
Loan & operator=(const Loan &)=delete
Result commit(size_t actual_len)
Send actual_len bytes. Consumes the loan.
Definition publisher.hpp:357
Loan()
Definition publisher.hpp:328
Definition publisher.hpp:178
Result assert_liveliness()
Definition publisher.hpp:596
~Publisher()
Destructor — releases publisher resources.
Definition publisher.hpp:498
::rclcpp::Owned< Publisher< M > > UniquePtr
Definition publisher.hpp:217
::rclcpp::QoS get_actual_qos() const
Definition publisher.hpp:438
Result publish_streamed(size_t total_len, W &&writer)
Definition publisher.hpp:301
Result get_gid(uint8_t(&out_gid)[GID_SIZE]) const
Definition publisher.hpp:626
const char * get_topic_name() const
Get the topic name.
Definition publisher.hpp:417
::rclcpp::ResultOf< Loan > loan(size_t requested_len)
Definition publisher.hpp:405
Result on_matched(PublisherMatchedCallbackType cb, void *user_context=nullptr)
Definition publisher.hpp:573
Result publish_serialized(const uint8_t *data, size_t len)
Definition publisher.hpp:282
Publisher & operator=(Publisher &&other)
Definition publisher.hpp:515
bool is_valid() const
Check if the publisher is initialized and valid.
Definition publisher.hpp:495
Result get_subscription_count(::rclcpp::Executor &executor, size_t *out_count) const
Definition publisher.hpp:489
Result publish_raw(const uint8_t *data, size_t len)
Renamed to publish_serialized (phase-515 C8); kept one release.
Definition publisher.hpp:289
Result publish(const M &msg)
Definition publisher.hpp:270
Publisher()
Definition publisher.hpp:533
Publisher(Publisher &&other)
Definition publisher.hpp:507
Result on_liveliness_lost(nros_cpp_publisher_count_cb_t cb, void *user_context=nullptr)
Definition publisher.hpp:546
Result on_incompatible_type(IncompatibleTypeCallbackType cb, void *user_context=nullptr)
Definition publisher.hpp:581
Result on_offered_deadline_missed(uint32_t deadline_ms, nros_cpp_publisher_count_cb_t cb, void *user_context=nullptr)
Definition publisher.hpp:556
static constexpr size_t GID_SIZE
Definition publisher.hpp:223
::rclcpp::Owned< Publisher< M > > SharedPtr
Definition publisher.hpp:202
bool is_durability_transient_local() const
Definition publisher.hpp:457
::rclcpp::Owned< Publisher< M > > ConstSharedPtr
Definition publisher.hpp:210
static constexpr QoS default_profile()
Default profile: RELIABLE + VOLATILE + KEEP_LAST(10).
Definition qos.hpp:799
int32_t raw() const
Get the raw integer code (for FFI interop).
Definition result.hpp:236
bool ok() const
Returns true if the operation succeeded.
Definition result.hpp:227
static constexpr ResultOf success()
Named constructors.
Definition result.hpp:239
Definition result.hpp:332
Inline storage-size macros for opaque entity buffers.
rclcpp::Executor — drives transport I/O and dispatches callbacks.
int nros_cpp_ret_t
Definition future.hpp:25
Definition rclcpp.hpp:418
constexpr nros_cpp_qos_t qos_to_ffi(const QoS &qos)
Definition qos.hpp:719
static constexpr size_t PUBLISHER_TOPIC_NAME_MAX
Definition publisher.hpp:66
bool ok()
Definition node.hpp:3564
ResultOf< Publisher< M > > create_publisher(::rclcpp::Node &node, const char *topic, const QoS &qos=QoS::default_profile())
Definition publisher.hpp:705
@ InvalidArgument
Null pointer, empty topic name, or out-of-range value.
Definition result.hpp:122
@ NotInitialized
Definition result.hpp:131
@ TransientLocal
Definition qos.hpp:165
ResultOf< void > Result
Definition result.hpp:247
rclcpp::Node and global session helpers.
rclcpp::QoS — full DDS-shaped QoS settings (Phase 108.B.7).
rclcpp::Result, rclcpp::ErrorCode, and the RCLCPP_TRY macro.
#define NROS_CPP_DEPRECATED_MSG(msg)
Definition result.hpp:101