/**
 *@file    sr_uart.h
 *@brief   uart抽象接口头文件
 *@details 提供uart相关枚举、结构体
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-04-19
 *@example ZhaoyangSDK\example\pal\hal\uart_example.c
 */

#ifndef _SR_HAL_UART_H
#define _SR_HAL_UART_H

#include "sr_device.h"

typedef enum SR_UART_BAUDRATE SR_UART_BAUD_E;
typedef enum SR_UART_DATA_BITS SR_UART_DATA_BIT_E;
typedef enum SR_UART_STOP_BITS SR_UART_STOP_BIT_E;
typedef enum SR_UART_PARITY SR_UART_PARITY_E;
typedef enum SR_UART_BIT_ORDER SR_UART_BIT_ORDER_E;
typedef enum SR_UART_NRZ SR_UART_NRZ_E;
typedef enum SR_UART_FC SR_UART_FC_E;
typedef enum SR_UART_EVENT SR_UART_EVENT_E;
typedef enum SR_UART_CTRL_CMD SR_UART_CTRL_CMD_E;
typedef struct SR_UART_CFG SR_UART_CFG_T;
typedef struct SR_UART_IO SR_UART_IO_T;


typedef struct SR_UART_DEV SR_UART_DEV_T;

/**
 * @brief UART事件回调函类型
 *
 * @param[in] dev   串口设备句柄指针
 * @param[in] event 事件类型
 * @param[in] size  收到的数据大小
 * @param[in] args  用户参数
 * @return    无
 */
typedef void (*UartEventCb)(SR_DEVICE_T *dev, SR_UART_EVENT_E event, uint32_t size, void *args);

#include "sr_bsp_uart.h"


/** @defgroup USART_CLK_SOURCE   USART时钟源
  * @{
  */
#define SR_UART_CLKS_PCLK1      BSP_UART_CLKS_PCLK1   /*!< APB clock*/
#define SR_UART_CLKS_SYSCLK     BSP_UART_CLKS_SYSCLK  /*!< SYSCLK clock*/
#define SR_UART_CLKS_HSI        BSP_UART_CLKS_HSI     /*!< HSI clock*/
#define SR_UART_CLKS_LSE        BSP_UART_CLKS_LSE     /*!< LSE clock */
/**
  * @}
  */

/**
 * @brief UART的引脚选择结构体
 */
struct  SR_UART_IO
{
	int txId;   /*!< 发送引脚gpio id,详见sr_bsp_gpio.h */
	int rxId;   /*!< 接收引脚gpio id */
};


/**
 * @brief 波特率
 */
enum SR_UART_BAUDRATE
{
	SR_UART_BAUD_2400 = 2400,
	SR_UART_BAUD_4800 = 4800,
	SR_UART_BAUD_9600 = 9600,
	SR_UART_BAUD_19200 = 19200,
	SR_UART_BAUD_38400 = 38400,
	SR_UART_BAUD_57600 = 57600,
	SR_UART_BAUD_115200 = 115200,
	SR_UART_BAUD_230400 = 230400,
	SR_UART_BAUD_460800 = 460800,
	SR_UART_BAUD_500000 = 500000,
	SR_UART_BAUD_921600 = 921600,
	SR_UART_BAUD_2000000 = 2000000,
	SR_UART_BAUD_2500000 = 2500000,
	SR_UART_BAUD_3000000 = 3000000,
};
#define IS_UART_BAUD(BAUDRATE) (((BAUDRATE) == SR_UART_BAUD_2400) || \
                                   ((BAUDRATE) == SR_UART_BAUD_4800) ||  \
                                   ((BAUDRATE) == SR_UART_BAUD_9600) ||  \
                                   ((BAUDRATE) == SR_UART_BAUD_19200) || \
                                   ((BAUDRATE) == SR_UART_BAUD_38400) || \
                                   ((BAUDRATE) == SR_UART_BAUD_57600) || \
                                   ((BAUDRATE) == SR_UART_BAUD_115200) || \
                                   ((BAUDRATE) == SR_UART_BAUD_230400) || \
                                   ((BAUDRATE) == SR_UART_BAUD_460800) || \
                                   ((BAUDRATE) == SR_UART_BAUD_500000) || \
                                   ((BAUDRATE) == SR_UART_BAUD_921600) || \
                                   ((BAUDRATE) == SR_UART_BAUD_2000000) || \
                                   ((BAUDRATE) == SR_UART_BAUD_2500000) || \
                                   ((BAUDRATE) == SR_UART_BAUD_3000000) \
                                 )
/**
 * @brief 数据位
 */
enum SR_UART_DATA_BITS
{
#if  0
	SR_UART_DATA_BIT_5 = BSP_UART_DATA_BIT_5,
	SR_UART_DATA_BIT_6 = BSP_UART_DATA_BIT_6,
	SR_UART_DATA_BIT_7 = BSP_UART_DATA_BIT_7,
#endif
	SR_UART_DATA_BIT_8 = BSP_UART_DATA_BIT_8,
	SR_UART_DATA_BIT_9 = BSP_UART_DATA_BIT_9,
};

  

/**
 * @brief 停止位
 */
enum SR_UART_STOP_BITS
{
	SR_UART_STOP_BIT_1 = BPS_UART_STOP_BIT_1,
	SR_UART_STOP_BIT_2 = BPS_UART_STOP_BIT_2,
	SR_UART_STOP_BIT_0_5 = BPS_UART_STOP_BIT_0_5,
	SR_UART_STOP_BIT_1_5 = BPS_UART_STOP_BIT_1_5,
};

/**
 * @brief 奇偶校验
 */
enum SR_UART_PARITY
{
	SR_UART_PARITY_NONE = BSP_UART_PARITY_NONE,
	SR_UART_PARITY_ODD = BSP_UART_PARITY_ODD,
	SR_UART_PARITY_EVEN = BSP_UART_PARITY_EVEN,
};

/**
 * @brief 字节序
 */
enum SR_UART_BIT_ORDER
{
	SR_UART_ORDER_LSB = BSP_UART_ORDER_LSB,
	SR_UART_ORDER_MSB = BSP_UART_ORDER_MSB,

};


/**
 * @brief 流控
 */
enum SR_UART_FC
{
	SR_UART_FC_CTSRTS = BSP_UART_FC_CTSRTS,
	SR_UART_FC_NONE = BSP_UART_FC_NONE,
};

/**
 * @brief 串口事件类型
 */
enum SR_UART_EVENT
{
	SR_UART_EVT_NONE = 0,	 /* 无事件 */
	SR_UART_EVT_RXNE = 1,    /* 收到数据 */
	SR_UART_EVT_TC	         /* 发送完成 */
};

#define SR_UART_RX_MINBUFSZ 64 /*!< 最小接收buf大小 */
#define SR_UART_TX_MINBUFSZ 64 /*!< 最小发送buf大小 */

// 串口默认初始化参数
#define SR_UART_CFG_DEFAULT                         \
	{                                                  \
		(uint32_t)SR_UART_BAUD_115200, /* 115200 bits/s */   \
	    (uint32_t)SR_UART_DATA_BIT_8,  /* 8 databits */      \
	    (uint32_t)SR_UART_STOP_BIT_1,  /* 1 stopbit */       \
	    (uint32_t)SR_UART_PARITY_NONE, /* No parity  */      \
	    (uint32_t)SR_UART_ORDER_LSB,   /* LSB first sent */  \
	    (uint32_t)SR_UART_FC_NONE,	   /* Off flowcontrol */ \
		(uint32_t)SR_UART_RX_MINBUFSZ, /* rxBuf size */      \
		(uint32_t)SR_UART_TX_MINBUFSZ, /* txBuf size */      \
	}

#define SR_UART_RX_MINBUFSZ 64 /*!< 最小接收buf大小 */
#define SR_UART_TX_MINBUFSZ 64 /*!< 最小发送buf大小 */



/**
 * @brief 串口配置结构体
 */
struct SR_UART_CFG
{
	uint32_t baudrate;	  /*!< 波特率 */
	uint32_t dataBits;	  /*!< 数据位 */
	uint32_t stopBits;	  /*!< 停止位 */
	uint32_t parity;	  /*!< 奇偶校验 */
	uint32_t bitOrder;	  /*!< bit位顺序 */
	uint32_t fc;          /*!< 流控 */
	uint16_t rxBufsz;	  /*!< 接收buf大小 */
	uint16_t txBufsz;	  /*!< 发送buf大小 */
};
/**
 * @brief 串口设备结构体
 */
struct SR_UART_DEV
{
	SR_DEVICE_T parent;	 /*!< 公共父类 */
	UartEventCb eventCb; /*!< 事件回调函数 */
	void *evtCbArgs;	 /*!< 事件回调函数的用户参数 */
};

/*--------------------------------抽象接口------------------------------*/

/**
 * @brief 打开串口设备
 *
 * @param[in] uartId 指定要打开的串口ID,SR_UART_ID_E类型
 *
 * @return 成功返回串口设备指针(SR_DEVICE_T *类型)，失败返回SR_NULL
 */
#define SR_HalUartOpen(uartId) BspUartOpen(uartId)

/**
 * @brief 关闭指定串口设备
 *
 * @param[in] dev 串口设备指针，SR_DEVICE_T *类型
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalUartClose(uartId) BspUartClose(uartId)

/**
 * @brief 配置串口设备参数
 *
 * @param[in] dev     串口设备指针，SR_DEVICE_T *类型
 * @param[in] uartCfg 串口配置结构体
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalUartConfig(dev, uartCfg) BspUartConfig(dev, uartCfg)

/**
 * @brief 从串口设备读取数据
 *
 * @param[in]  dev    串口设备指针，SR_DEVICE_T *类型
 * @param[out] buffer 数据缓冲区指针
 * @param[in]  size   期望读取的数据量
 *
 * @return 成功：>=0,实际读取的字节数  失败：负值错误码
 */
#define SR_HalUartRead(dev, buffer, size) BspUartRead(dev, buffer, size)

/**
 * @brief 向串口设备写入数据
 *
 * @param[in] dev 串口设备指针，SR_DEVICE_T *类型
 * @param[in] buffer 数据缓冲区指针
 * @param[in] size 待写入的数据量
 *
 * @return 成功：>0,实际发送的字节数  失败：负值错误码
 */
#define SR_HalUartWrite(dev, buffer, size) BspUartWrite(dev, buffer, size)

/**
 * @brief UART事件回调设置
 *
 * @param[in] dev 串口设备指针，SR_DEVICE_T *类型
 * @param[in] cb 回调函数指针
 * @param[in] args 回调函数传入参数
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalUartSetCb(dev, cb, args) BspUartSetCallback(dev, cb, args)

/**
 * @brief UART时钟和IO口选择
 *
 * @param[in] dev  串口设备指针，SR_DEVICE_T *类型
 * @param[in] clk  串口时钟源，可选值@ref USART_CLK_SOURCE,SR_IGNORE表示忽略不配置
 * @param[in] io   串口GPIO选择，SR_UART_IO_T *类型，SR_NULL表示不配置
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalUartClkIoSel(dev,clk,io) BspUartClkIoSel(dev,clk,io)


#endif
