/*******************************************************************************
*
*
* File:          hal_uart.h
* Description
* Version      V0.1
* Date         2021-11-24
* Author       kc
*******************************************************************************/

#ifndef __HAL_UART_H__
#define __HAL_UART_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_device_datatype.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/
/**
* @brief  UART停止位
*/
typedef enum
{
    HAL_UART_STOPBIT_1   = 0,
    HAL_UART_STOPBIT_1P5 = 1,
    HAL_UART_STOPBIT_2   = 1
} hal_uart_stopbit_e;

/**
* @brief  UART极性
*/
typedef enum
{
    HAL_UART_PARITY_NO    = 0,
    HAL_UART_PARITY_ODD   = 0x01,
    HAL_UART_PARITY_EVEN  = 0x03,
} hal_uart_parity_e;

/**
* @brief  UART数据宽度
*/
typedef enum
{
    HAL_UART_DATAWIDTH_5 = 0,
    HAL_UART_DATAWIDTH_6 = 1,
    HAL_UART_DATAWIDTH_7 = 2,
    HAL_UART_DATAWIDTH_8 = 3
} hal_uart_datawidth_e;

/**
* @brief  UART编号
*/
typedef enum
{
    HAL_UART_0,
    HAL_UART_1,
    HAL_UART_MAX
} hal_uart_num_e;

typedef struct
{
    uint32_t baudrate;
    hal_uart_stopbit_e stopbits;
    hal_uart_datawidth_e data_width;
    hal_uart_parity_e parity;
    uart_trans_cb     callback;
    void             *user_data;
} hal_uart_config_t;

/**
* @brief  UART DMA 通道TX/RX方向选择
*/
typedef enum
{
    HAL_UART0_DMA_PATH_TX,
    HAL_UART0_DMA_PATH_RX,
    HAL_UART1_DMA_PATH_TX,
    HAL_UART1_DMA_PATH_RX,
    HAL_UART_DMA_PATH_MAX
} hal_uart_dma_path_e;
/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  初始化设置uart 传输的波特率、位宽等参数
* @param  hal_uart_config_t
* @retval hal_uart_status
*/
void hal_uart_init(hal_uart_num_e num, hal_uart_config_t *huart);

/**
* @brief  关闭uart口
* @retval 无
*/
void hal_uart_deinit(hal_uart_num_e num);

/**
* @brief  阻塞式发送数据
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval hal_uart_status
*/
bool hal_uart_send_blocking(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  阻塞式接收数据
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval hal_uart_status
*/
bool hal_uart_recv_blocking(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  中断非阻塞式发送数据
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval 状态
*/
bool hal_uart_send_none_blocking(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  中断非阻塞式接收数据
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval hal_uart_status
*/
bool hal_uart_recv_none_blocking(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  使用DMA通道发送数据
* @param  num: 串口编号 串口0或串口1
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval true or false
*/
bool hal_uart_dma_send(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  使用DMA接收数据
* @param  num: 串口编号 串口0或串口1
* @param  pdata:传输数据指针
* @param  size:传输数据大小
* @retval true or false
*/
bool hal_uart_dma_recv(hal_uart_num_e num, uint8_t *pdata, uint16_t size);

/**
* @brief  UART DMA通道不再使用后关闭释放UART DMA资源
* @param  path:TX通道或RX通道
* @retval void
*/
void hal_uart_dma_path_close(hal_uart_dma_path_e path);
#endif /* __HAL_UART_H__ */
