#ifndef RS_CTRL_OS_H
#define RS_CTRL_OS_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef int rcos_err_t;
#define RCOS_OK 0
#define RCOS_ERR_INVALID 1
#define RCOS_ERR_UTF8 2
#define RCOS_ERR_CONFIG 3
#define RCOS_ERR_COMMS 4
#define RCOS_ERR_DISCOVERY 5
#define RCOS_ERR_SERIALIZATION 6
#define RCOS_ERR_NODE_NOT_FOUND 7
#define RCOS_ERR_IO 8
#define RCOS_ERR_ZMQ 9
#define RCOS_ERR_BINCODE 10
#define RCOS_ERR_TRUNC 11
#define RCOS_ERR_INTERNAL 99
typedef struct RcOsTimeSyncHandle RcOsTimeSyncHandle;
typedef struct RcOsConfig RcOsConfig;
typedef struct RcOsServiceRegistry RcOsServiceRegistry;
typedef struct RcOsPubSub RcOsPubSub;
rcos_err_t rs_ctrl_os_init_logging(void);
rcos_err_t rs_ctrl_os_last_error(char *buf, size_t buf_len);
void rs_ctrl_os_str_free(char *p);
RcOsTimeSyncHandle *rs_ctrl_os_time_sync_new(void);
void rs_ctrl_os_time_sync_destroy(RcOsTimeSyncHandle *p);
uint64_t rs_ctrl_os_time_sync_now_ms(const RcOsTimeSyncHandle *p);
int rs_ctrl_os_time_sync_is_synced(const RcOsTimeSyncHandle *p);
RcOsConfig *rs_ctrl_os_config_open(const char *path_utf8);
void rs_ctrl_os_config_destroy(RcOsConfig *p);
rcos_err_t rs_ctrl_os_config_get_dynamic_toml(const RcOsConfig *cfg, char **out_toml);
char *rs_ctrl_os_config_get_my_id(const RcOsConfig *cfg);
char *rs_ctrl_os_config_get_host(const RcOsConfig *cfg);
uint16_t rs_ctrl_os_config_get_port(const RcOsConfig *cfg);
int rs_ctrl_os_config_get_is_master(const RcOsConfig *cfg);
int64_t rs_ctrl_os_config_get_publish_hz(const RcOsConfig *cfg);
int64_t rs_ctrl_os_config_get_subscribe_hz(const RcOsConfig *cfg);
int rs_ctrl_os_config_get_dynamic_load_enable(const RcOsConfig *cfg);
RcOsServiceRegistry *rs_ctrl_os_discovery_start(
const char *my_id,
const char *my_host,
uint16_t my_port,
int is_master,
const RcOsTimeSyncHandle *time_sync);
void rs_ctrl_os_registry_destroy(RcOsServiceRegistry *p);
RcOsPubSub *rs_ctrl_os_pubsub_new(const RcOsConfig *cfg, RcOsServiceRegistry *registry);
void rs_ctrl_os_pubsub_destroy(RcOsPubSub *p);
void rs_ctrl_os_pubsub_set_publish_hz(RcOsPubSub *bus, int64_t hz);
void rs_ctrl_os_pubsub_set_subscribe_hz(RcOsPubSub *bus, int64_t hz);
rcos_err_t rs_ctrl_os_pubsub_publish_raw(
RcOsPubSub *bus,
const char *topic_key,
const char *sub_topic,
const uint8_t *payload,
size_t payload_len);
rcos_err_t rs_ctrl_os_pubsub_try_recv_raw(
RcOsPubSub *bus,
const char *local_name,
char **sender_id_out,
char **sub_topic_out,
uint8_t **payload_out,
size_t *payload_len_out,
int *got_message_out);
void rs_ctrl_os_payload_free(uint8_t *p, size_t len);
rcos_err_t rs_ctrl_os_pubsub_set_sub_topics(
RcOsPubSub *bus,
const char *local_name,
const char *const *topics,
size_t topic_count);
rcos_err_t rs_ctrl_os_pubsub_publish_request(
RcOsPubSub *bus,
const char *topic_key,
const char *sub_topic,
uint64_t request_id,
const uint8_t *payload,
size_t payload_len);
rcos_err_t rs_ctrl_os_pubsub_publish_response(
RcOsPubSub *bus,
const char *topic_key,
const char *sub_topic,
uint64_t request_id,
const uint8_t *payload,
size_t payload_len);
rcos_err_t rs_ctrl_os_pubsub_try_recv_request(
RcOsPubSub *bus,
const char *local_name,
char **sender_id_out,
char **sub_topic_out,
uint64_t *request_id_out,
uint8_t **payload_out,
size_t *payload_len_out,
int *got_message_out);
rcos_err_t rs_ctrl_os_pubsub_try_recv_response(
RcOsPubSub *bus,
const char *local_name,
char **sender_id_out,
char **sub_topic_out,
uint64_t *request_id_out,
uint8_t **payload_out,
size_t *payload_len_out,
int *got_message_out);
#ifdef __cplusplus
}
#endif
#endif