128 lines
5.1 KiB
C
128 lines
5.1 KiB
C
/**
|
||
* @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 |