#ifndef _BSP_UART_H_
#define _BSP_UART_H_

#include "main.h"
#include "algo_queue.h"

/******************************************
 * 结构体: bsp_uart_t
 * 功能: UART控制结构体
 * 描述: 包含UART的所有配置和状态信息
*******************************************/
typedef struct bsp_uart_t bsp_uart_t;

/* 类型重定义 */
#define usart_type          UART_HandleTypeDef 
#define dma_type            DMA_HandleTypeDef  

#define BSP_UART_BAUD_RATE_4800     (4800)
#define BSP_UART_BAUD_RATE_9600     (9600)
#define BSP_UART_BAUD_RATE_19200    (19200)
#define BSP_UART_BAUD_RATE_57600    (57600)
#define BSP_UART_BAUD_RATE_115200   (57600)

/******************************************
 * 结构体: bsp_uart_relay_t
 * 功能: UART转发结构体
 * 描述: 用于配置UART数据转发功能
*******************************************/
typedef struct
{
    u8 flag;                              /* 串口转发标志位 */
    bsp_uart_t *uart;                     /* 转发出去的串口指针 */
    u16 time_out;                         /* 转发超时时间 */
} bsp_uart_relay_t;



struct bsp_uart_t
{
    queue rx_queue;                                  /* 数据接收队列 */
    usart_type *uart;                               /* 串口句柄指针 */
        
    dma_type *tx_dma;                               /* 发送DMA句柄 */
    dma_type *rx_dma;                               /* 接收DMA句柄 */

    u8 tx_dma_ch;                                   /* 发送DMA通道号 */
    u8 rx_dma_ch;                                   /* 接收DMA通道号 */
    vu8 tx_dma_complete_flag;                       /* DMA接收完成标志位 */
        
    u8 *tx_addr;                                    /* DMA发送缓冲区地址 */
    u8 *rx_addr;                                    /* DMA接收缓冲区地址 */
    u16 tx_dma_len;                                 /* DMA发送缓冲区长度 */
    u16 rx_dma_len;                                 /* DMA接收缓冲区长度 */

    u16 rx_len;                                     /* 接收到的数据长度 */
    u16 rx_time_count;                              /* 超时计数 */
    u16 rx_time_over;                               /* 超时时间 */
    u8 rx_start_flag;                               /* 开始超时计数标志位 */

    bsp_uart_relay_t relay;                         /* 串口转发配置 */
    
    struct
    {
        void (*baud_rate)(bsp_uart_t *,u32);
    }set;  
    
    void (*init)(bsp_uart_t *);                     /* 初始化函数指针 */
    void (*send)(bsp_uart_t *, u8 *, u16);          /* 串口发送函数指针 */

    void (*tx_dma_tc_int)(bsp_uart_t *);            /* DMA发送完成中断处理函数指针 */
    
    void (*rx_idle_int)(bsp_uart_t *);              /* 空闲中断处理函数指针 */
    void (*rx_time_increment_int)(bsp_uart_t *, u16); /* 中断计数函数指针 */
    void (*rx_data_analysis)(u8 *, u16, void *);    /* 数据解析函数指针 */
    void (*rx_task)(bsp_uart_t *);                  /* 串口接收任务函数指针 */ 
    
};

/* 声明外部变量 */
extern bsp_uart_t com_uart1;
extern bsp_uart_t com_uart2;        /*COM2*/
extern bsp_uart_t com_uart3;        /*COM3*/
extern bsp_uart_t com_uart4;        /*COM1*/
extern bsp_uart_t com_uart6;        /*COM6*/
#endif
