19#ifndef CARLA_ROS2_MIDDLEWARE_TESTING
20#ifdef CARLA_ROS2_MIDDLEWARE_ZENOH
38class ZenohSubscriberMiddleware :
public ISubscriberMiddleware {
40 using msg_type =
typename S::msg_type;
42 ZenohSubscriberMiddleware() {
44 z_internal_null(&_subscriber);
45 z_internal_null(&_liveliness_token);
47 ZenohSubscriberMiddleware(
const ZenohSubscriberMiddleware&) =
delete;
48 ZenohSubscriberMiddleware& operator=(
const ZenohSubscriberMiddleware&) =
delete;
50 ~ZenohSubscriberMiddleware()
override {
53 z_drop(z_move(_liveliness_token));
54 z_drop(z_move(_subscriber));
58 const std::string& topic_name,
60 bool* new_message_flag)
override
62 return InitImpl(topic_name, message_ptr, new_message_flag, kZenohDefaultQos);
66 const std::string& topic_name,
68 bool* new_message_flag,
69 const QosProfile& qos)
override
75 return InitImpl(topic_name, message_ptr, new_message_flag,
76 zenoh_qos_keyexpr(qos));
81 const std::string& topic_name,
83 bool* new_message_flag,
84 const std::string& qos_str)
86 _message_ptr =
static_cast<msg_type*
>(message_ptr);
87 _new_message_ptr = new_message_flag;
89 const z_loaned_session_t* session = zenoh_get_shared_session();
91 const std::string topic_no_rt = zenoh_strip_rt_prefix(topic_name);
92 const char* type_name = CdrTopicInfo<msg_type>::type_name();
93 const char* type_hash = CdrTopicInfo<msg_type>::type_hash();
94 if (type_hash ==
nullptr) {
95 log_error(
"ZenohSubscriberMiddleware: no type_hash for topic '",
100 const std::string ke_str = zenoh_make_topic_keyexpr(
101 zenoh_ros_domain_id(), topic_no_rt, type_name, type_hash);
103 if (z_view_keyexpr_from_str(&ke, ke_str.c_str()) != Z_OK) {
104 log_error(
"ZenohSubscriberMiddleware (", topic_name,
105 "): invalid keyexpr '", ke_str,
"'");
109 z_owned_closure_sample_t closure;
110 z_closure_sample(&closure, &on_sample,
nullptr,
this);
112 z_subscriber_options_t sub_opts;
113 z_subscriber_options_default(&sub_opts);
114 if (z_declare_subscriber(session, &_subscriber, z_loan(ke),
115 z_move(closure), &sub_opts) != Z_OK) {
116 log_error(
"ZenohSubscriberMiddleware (", topic_name,
117 "): z_declare_subscriber failed");
121 const std::string lv_ke_str = zenoh_make_topic_liveliness_keyexpr(
122 zenoh_ros_domain_id(), zenoh_session_zid(), zenoh_next_entity_id(),
123 kZenohEntityKindSub, topic_no_rt, type_name, type_hash,
125 z_view_keyexpr_t lv_ke;
126 if (z_view_keyexpr_from_str(&lv_ke, lv_ke_str.c_str()) != Z_OK) {
127 log_error(
"ZenohSubscriberMiddleware (", topic_name,
128 "): invalid liveliness keyexpr");
131 if (z_liveliness_declare_token(session, &_liveliness_token,
132 z_loan(lv_ke),
nullptr) != Z_OK) {
133 log_error(
"ZenohSubscriberMiddleware (", topic_name,
134 "): z_liveliness_declare_token failed");
141 _alive.store(
true, std::memory_order_relaxed);
142 _topic_name = topic_name;
147 bool IsAlive()
const override {
148 return _alive.load(std::memory_order_relaxed);
151 std::string GetTopicName()
const override {
156 static void on_sample(z_loaned_sample_t* sample,
void* context) {
157 auto* self =
static_cast<ZenohSubscriberMiddleware*
>(context);
158 const z_loaned_bytes_t* payload = z_sample_payload(sample);
159 z_owned_slice_t slice;
160 if (z_bytes_to_slice(payload, &slice) != Z_OK) {
161 log_error(
"ZenohSubscriberMiddleware (", self->_topic_name,
162 "): z_bytes_to_slice failed");
165 const z_loaned_slice_t* ls = z_slice_loan(&slice);
166 const uint8_t* data = z_slice_data(ls);
167 const size_t len = z_slice_len(ls);
169 log_error(
"ZenohSubscriberMiddleware (", self->_topic_name,
170 "): deserialization failed");
172 *self->_new_message_ptr =
true;
174 z_drop(z_move(slice));
177 z_owned_subscriber_t _subscriber;
178 z_owned_liveliness_token_t _liveliness_token;
180 msg_type* _message_ptr {
nullptr };
181 bool* _new_message_ptr {
nullptr };
183 std::atomic<bool> _alive {
false };
184 std::string _topic_name;
bool deserialize_from_cdr(const uint8_t *data, size_t size, T &msg)
Deserialize a msg::X from a CDR byte buffer that was produced by serialize_to_cdr() or by any ROS2-co...
This file contains definitions of common data structures used in traffic manager.