/** * @file hdlc.h */ #ifndef HDLC_H #define HDLC_H #include "fcs.h" #include /** HDLC флаг начала и конца */ #define HDLC_FLAG_SEQUENCE 0x7E /** HDLC управляющее выходное значение */ #define HDLC_CONTROL_ESCAPE 0x7D /** HDLC все адресса станций */ #define HDLC_ALL_STATION_ADDR 0xFF /** Поддерживаемые HDLC фрейм типы */ typedef enum { HDLC_FRAME_DATA, HDLC_FRAME_ACK, HDLC_FRAME_NACK, } hdlc_frame_t; /** Информация о поле управления */ typedef struct { hdlc_frame_t frame; unsigned char seq_no :3; } hdlc_control_t; /** Перменные для hdlc_get_data и hdlc_get_data_with_state * для отслеживания полученных буферов */ typedef struct { char control_escape; FCS_SIZE fcs; int start_index; int end_index; int src_index; int dest_index; } hdlc_state_t; /** * Установить состояние hdlc * * @param[in] state состояние hdlc, которое будет использоваться * @retval 0 Успешно * @retval -EINVAL Невалидный параметр */ int hdlc_set_state(hdlc_state_t *state); /** * Получить текущее состояние hdlc * * @param[out] state Текущее состояние hdlc * @retval 0 Success * @retval -EINVAL Невалидный параметр */ int hdlc_get_state(hdlc_state_t *state); /** * Извлекает данные из указанного буфера, содержащего HDLC-фрейм. * Фреймы могут быть разобраны из нескольких буферов при получении через uart * * @param[out] control Структура поля управления с типом фрейма и номером последовательности. * @param[in] src Основной буффер для фрейма * @param[in] src_len Длинна основного буффера * @param[out] dest Целевой буффер (должен быть способен содержать максимальный размер кадра) * @param[out] dest_len Длинна целевого буффера * @retval >=0 Успешно (размер возвращаемого значения должен быть удален из исходного буфера) * @retval -EINVAL Невалидный параметр * @retval -INMSG Невалидное сообщение * @retval -EIO Невалидный FCS (размер dest_len должен быть удален из исходного буфера) * * @see hdlc_get_data_with_state */ int hdlc_get_data(hdlc_control_t *control, const char *src, unsigned int src_len, char *dest, unsigned int *dest_len); /** * Извлекает данные из указанного буфера, содержащего HDLC-фрейм. * Фреймы могут быть разобраны из нескольких буферов при получении через uart * * Эта функция вариация @ref hdlc_get_data * Разница только в первом аргументе: hdlc_state_t *state * Данные под этим указателем используются для отслеживания внутренних буферов. * * @see hdlc_get_data */ int hdlc_get_data_with_state(hdlc_state_t *state, hdlc_control_t *control, const char *src, unsigned int src_len, char *dest, unsigned int *dest_len); /** * Сбрасывает значения, используемые в функции hdlc_get_data для отслеживания полученных буферов */ void hdlc_get_data_reset(); /** * Эта функция вариация @ref hdlc_get_data_reset * Сбрасывает значения состояния, которые находятся под указателем, указанным в качестве аргумента * * Эта функция должна быть вызвана перед первым вызовом hdlc_get_data_with_state * когда используется пользовательское хранилище состояний. * * @see hdlc_get_data_reset */ void hdlc_get_data_reset_with_state(hdlc_state_t *state); /** * Создает кадр HDLC с указанным буфером данных. * * @param[in] control Структура поля управления с типом кадра и порядковым номером * @param[in] src Исходный буфер с данными * @param[in] src_len Длинна исходного буффера * @param[out] dest Целевой буфер (должно быть больше, чем исходный буфер) * @param[out] dest_len Длинна целевого буффера * @retval 0 Success * @retval -EINVAL Невалидный параметр */ int hdlc_frame_data(hdlc_control_t *control, const char *src, unsigned int src_len, char *dest, unsigned int *dest_len); int hello(); #endif