File syn_xrce_dds.h¶
File List > proto > syn_xrce_dds.h
Go to the documentation of this file
#ifndef SYN_XRCE_DDS_H
#define SYN_XRCE_DDS_H
#include "../common/syn_defs.h"
#include "../net/syn_transport.h"
#include "../pt/syn_pt.h"
#include "../sched/syn_sched.h"
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#if !defined(SYN_USE_XRCE_DDS) || SYN_USE_XRCE_DDS
#ifdef __cplusplus
extern "C" {
#endif
/* ── Constants & Limits ─────────────────────────────────────────────────── */
#define SYN_XRCE_COOKIE 0x0100U
#define SYN_XRCE_CLIENT_KEY_DEFAULT 0xCAFEBABEU
#define SYN_XRCE_SESSION_ID_DEFAULT 0x81U
#define SYN_XRCE_STREAM_BEST_EFFORT 0x01U
#define SYN_XRCE_STREAM_RELIABLE 0x80U
#define SYN_XRCE_MAX_TOPIC_NAME 64U
#define SYN_XRCE_MAX_TYPE_NAME 64U
#define SYN_XRCE_MAX_OBJECTS 16U
/* XRCE-DDS Submessage Identifiers */
#define SYN_XRCE_SUBMSG_CREATE_CLIENT 0x00U
#define SYN_XRCE_SUBMSG_CREATE 0x01U
#define SYN_XRCE_SUBMSG_DELETE 0x02U
#define SYN_XRCE_SUBMSG_WRITE_DATA 0x03U
#define SYN_XRCE_SUBMSG_READ_DATA 0x04U
#define SYN_XRCE_SUBMSG_DATA 0x05U
#define SYN_XRCE_SUBMSG_STATUS 0x06U
#define SYN_XRCE_SUBMSG_HEARTBEAT 0x07U
#define SYN_XRCE_SUBMSG_ACKNACK 0x08U
/* XRCE-DDS Object Kinds */
#define SYN_XRCE_OBJKIND_PARTICIPANT 0x01U
#define SYN_XRCE_OBJKIND_TOPIC 0x02U
#define SYN_XRCE_OBJKIND_PUBLISHER 0x03U
#define SYN_XRCE_OBJKIND_SUBSCRIBER 0x04U
#define SYN_XRCE_OBJKIND_DATAWRITER 0x05U
#define SYN_XRCE_OBJKIND_DATAREADER 0x06U
/* XRCE-DDS Status Codes */
#define SYN_XRCE_STATUS_OK 0x00U
#define SYN_XRCE_STATUS_OK_MATCHED 0x01U
#define SYN_XRCE_STATUS_ERR_ALREADY_EXISTS 0x11U
#define SYN_XRCE_STATUS_ERR_UNKNOWN_REF 0x12U
#define SYN_XRCE_STATUS_ERR_INVALID_DATA 0x13U
#define SYN_XRCE_STATUS_ERR_INCOMPATIBLE 0x14U
#define SYN_XRCE_STATUS_ERR_RESOURCES 0x15U
/* ── CDR Codec Contexts ──────────────────────────────────────────────────── */
typedef struct {
uint8_t *data;
size_t size;
size_t pos;
bool error;
} SYN_CDR_Writer;
typedef struct {
const uint8_t *data;
size_t size;
size_t pos;
bool error;
} SYN_CDR_Reader;
/* ── Client Entity & State Types ─────────────────────────────────────────── */
typedef enum {
SYN_XRCE_STATE_DISCONNECTED = 0,
SYN_XRCE_STATE_CONNECTING,
SYN_XRCE_STATE_CONNECTED,
SYN_XRCE_STATE_ERROR
} SYN_XRCE_ClientState;
typedef struct {
uint16_t id;
uint8_t kind;
bool configured;
uint16_t parent;
} SYN_XRCE_Object;
typedef void (*SYN_XRCE_DataCb)(uint16_t reader_id, const uint8_t *payload, size_t len,
void *user_data);
typedef void (*SYN_XRCE_StatusCb)(uint16_t req_id, uint8_t status, void *user_data);
typedef struct {
uint32_t client_key;
uint8_t session_id;
SYN_Transport *transport;
uint32_t heartbeat_period_ms;
SYN_XRCE_DataCb on_data;
SYN_XRCE_StatusCb on_status;
void *user_data;
uint8_t *rx_buf;
size_t rx_buf_size;
uint8_t *tx_buf;
size_t tx_buf_size;
} SYN_XRCE_Config;
typedef struct {
SYN_XRCE_Config cfg;
SYN_XRCE_ClientState state;
SYN_PT pt;
uint16_t stream_seq_num;
uint16_t next_req_id;
uint32_t last_heartbeat_ms;
SYN_XRCE_Object objects[SYN_XRCE_MAX_OBJECTS];
size_t object_count;
} SYN_XRCE_Client;
/* ── CDR Serialization API ───────────────────────────────────────────────── */
void syn_cdr_writer_init(SYN_CDR_Writer *w, uint8_t *buf, size_t size);
bool syn_cdr_write_u8(SYN_CDR_Writer *w, uint8_t v);
bool syn_cdr_write_u16(SYN_CDR_Writer *w, uint16_t v);
bool syn_cdr_write_u32(SYN_CDR_Writer *w, uint32_t v);
bool syn_cdr_write_u64(SYN_CDR_Writer *w, uint64_t v);
bool syn_cdr_write_i8(SYN_CDR_Writer *w, int8_t v);
bool syn_cdr_write_i16(SYN_CDR_Writer *w, int16_t v);
bool syn_cdr_write_i32(SYN_CDR_Writer *w, int32_t v);
bool syn_cdr_write_i64(SYN_CDR_Writer *w, int64_t v);
bool syn_cdr_write_float(SYN_CDR_Writer *w, float v);
bool syn_cdr_write_double(SYN_CDR_Writer *w, double v);
bool syn_cdr_write_bool(SYN_CDR_Writer *w, bool v);
bool syn_cdr_write_string(SYN_CDR_Writer *w, const char *str);
bool syn_cdr_write_bytes(SYN_CDR_Writer *w, const uint8_t *bytes, size_t len);
/* ── CDR Deserialization API ─────────────────────────────────────────────── */
void syn_cdr_reader_init(SYN_CDR_Reader *r, const uint8_t *buf, size_t size);
bool syn_cdr_read_u8(SYN_CDR_Reader *r, uint8_t *out);
bool syn_cdr_read_u16(SYN_CDR_Reader *r, uint16_t *out);
bool syn_cdr_read_u32(SYN_CDR_Reader *r, uint32_t *out);
bool syn_cdr_read_u64(SYN_CDR_Reader *r, uint64_t *out);
bool syn_cdr_read_i8(SYN_CDR_Reader *r, int8_t *out);
bool syn_cdr_read_i16(SYN_CDR_Reader *r, int16_t *out);
bool syn_cdr_read_i32(SYN_CDR_Reader *r, int32_t *out);
bool syn_cdr_read_i64(SYN_CDR_Reader *r, int64_t *out);
bool syn_cdr_read_float(SYN_CDR_Reader *r, float *out);
bool syn_cdr_read_double(SYN_CDR_Reader *r, double *out);
bool syn_cdr_read_bool(SYN_CDR_Reader *r, bool *out);
bool syn_cdr_read_string(SYN_CDR_Reader *r, char *out_buf, size_t max_len);
bool syn_cdr_read_bytes(SYN_CDR_Reader *r, uint8_t *out_buf, size_t len);
/* ── XRCE-DDS Client Public API ──────────────────────────────────────────── */
SYN_Status syn_xrce_client_init(SYN_XRCE_Client *client, const SYN_XRCE_Config *cfg);
SYN_Status syn_xrce_client_create_session(SYN_XRCE_Client *client);
SYN_Status syn_xrce_client_create_participant(SYN_XRCE_Client *client, uint16_t participant_id);
SYN_Status syn_xrce_client_create_topic(SYN_XRCE_Client *client, uint16_t topic_id,
uint16_t participant_id, const char *topic_name,
const char *type_name);
SYN_Status syn_xrce_client_create_publisher(SYN_XRCE_Client *client, uint16_t publisher_id,
uint16_t participant_id);
SYN_Status syn_xrce_client_create_subscriber(SYN_XRCE_Client *client, uint16_t subscriber_id,
uint16_t participant_id);
SYN_Status syn_xrce_client_create_datawriter(SYN_XRCE_Client *client, uint16_t writer_id,
uint16_t publisher_id, uint16_t topic_id);
SYN_Status syn_xrce_client_create_datareader(SYN_XRCE_Client *client, uint16_t reader_id,
uint16_t subscriber_id, uint16_t topic_id);
SYN_Status syn_xrce_client_write_data(SYN_XRCE_Client *client, uint16_t writer_id,
const uint8_t *data, size_t len);
SYN_Status syn_xrce_client_read_data(SYN_XRCE_Client *client, uint16_t reader_id);
SYN_Status syn_xrce_client_step(SYN_XRCE_Client *client, uint32_t now_ms);
SYN_PT_Status syn_xrce_client_pt(SYN_PT *pt, SYN_Task *task);
#ifdef __cplusplus
}
#endif
#endif /* SYN_USE_XRCE_DDS */
#endif /* SYN_XRCE_DDS_H */