#ifndef SET_TELEMETRY_H #define SET_TELEMETRY_H #include "set_protocol.h" #ifdef __cplusplus extern "C" { #endif #define SETP_SUBSCRIBE_HEADER_SIZE 8U #define SETP_PUBLISH_HEADER_SIZE 10U #define SETP_PUBLISH_ITEM_HEADER_SIZE 8U typedef enum { SETP_VALUE_U16 = 1, SETP_VALUE_I16 = 2, SETP_VALUE_U32 = 3, SETP_VALUE_I32 = 4, SETP_VALUE_F32 = 5, SETP_VALUE_BYTES = 6 } setp_value_encoding_t; typedef struct { uint8_t *output; uint16_t capacity; uint16_t length; uint16_t item_count; } setp_publish_builder_t; typedef struct { const uint8_t *payload; uint16_t length; uint16_t offset; uint16_t remaining; uint16_t subscription_id; uint16_t sample_sequence; uint32_t timestamp_ms; } setp_publish_view_t; typedef struct { uint32_t address; uint8_t encoding; uint8_t element_count; uint16_t data_length; const uint8_t *data; } setp_publish_item_t; size_t setp_subscribe_encode(uint16_t subscription_id, uint32_t period_ms, const uint32_t *addresses, uint16_t address_count, uint8_t *out, size_t capacity); bool setp_subscribe_decode_header(const uint8_t *payload, uint16_t length, uint16_t *subscription_id, uint32_t *period_ms, uint16_t *address_count); bool setp_subscribe_address(const uint8_t *payload, uint16_t length, uint16_t index, uint32_t *address); bool setp_publish_begin(setp_publish_builder_t *builder, uint16_t subscription_id, uint16_t sample_sequence, uint32_t timestamp_ms, uint8_t *out, uint16_t capacity); bool setp_publish_add(setp_publish_builder_t *builder, uint32_t address, uint8_t encoding, uint8_t element_count, const uint8_t *data, uint16_t data_length); size_t setp_publish_finish(setp_publish_builder_t *builder); bool setp_publish_view_init(setp_publish_view_t *view, const uint8_t *payload, uint16_t length); bool setp_publish_next(setp_publish_view_t *view, setp_publish_item_t *item); #ifdef __cplusplus } #endif #endif /* SET_TELEMETRY_H */