Display_Avr_3/hdlc/hdlc.h
2023-05-24 18:09:43 +03:00

128 lines
5.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file hdlc.h
*/
#ifndef HDLC_H
#define HDLC_H
#include "fcs.h"
#include <errno.h>
/** 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