/**
 *@file sr_gpio.h
 *@brief GPIO抽象接口
 *@details 提供GPIO相关枚举、结构体
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author Lierda-RDC
 *@date 2024-04-01
 *@example ZhaoyangSDK\example\pal\hal\gpio_example
 */
#ifndef _SR_HAL_GPIO_H
#define _SR_HAL_GPIO_H

#include "sr_config.h"
#include "sr_stddef.h"


/**
 * @brief 有效电平枚举
 */
enum SR_ACT_LEVEL
{
    ACT_LOW = 0,
    ACT_HIGH = 1
};

/**
 * @brief 引脚有效电平结构体
 */
struct SR_GPIO_ACT_LEVEL
{
    uint32_t gpioId;  /*!<gpio ID号 */
    uint8_t  actLvl;  /*!<有效电平，取值为 SR_ACT_LVL_E */
};
typedef enum SR_ACT_LEVEL SR_ACT_LVL_E;
typedef struct SR_GPIO_ACT_LEVEL SR_GPIO_ACT_LVL_T;

#ifdef  SR_USE_GPIO
#include "sr_device.h"

typedef enum SR_GPIO_LEVEL SR_GPIO_LVL_E;
typedef enum SR_GPIO_MODE SR_GPIO_MODE_E;
typedef enum SR_GPIO_PULL SR_GPIO_PULL_E;
typedef enum SR_GPIO_IRQ_MODE SR_GPIO_IRQ_MODE_E;
typedef struct ST_GPIO_IRQ_CB SR_GPIO_IRQ_CB_T;
typedef struct SR_GPIO_CFG SR_GPIO_CFG_T;

#include "sr_bsp_gpio.h"

/**
 * @brief 引脚电平
 */
enum SR_GPIO_LEVEL
{
    SR_GPIO_LOW = BSP_GPIO_LOW,       /*!< 电平低 */
    SR_GPIO_HIGH = BSP_GPIO_HIGH,     /*!< 电平高 */
    SR_GPIO_TOGGLE = BSP_GPIO_TOGGLE, /*!< 电平翻转 */
};

/**
 * @brief 引脚模式 gpioMode取值
 */
enum SR_GPIO_MODE
{
    SR_GPIO_OUTPUT = BSP_GPIO_OUTPUT, /*!< 推挽输出 */
    SR_GPIO_OD = BSP_GPIO_OD,         /*!< 开漏输出 */
    SR_GPIO_AF_OUTPUT = BSP_GPIO_AF_OUTPUT,    /*!< 复用推挽输出 */
    SR_GPIO_AF_OD = BSP_GPIO_AF_OD,    /*!< 复用开漏输出 */
    SR_GPIO_INPUT = BSP_GPIO_INPUT,    /*!< 输入 */
    SR_GPIO_ANALOG = BSP_GPIO_ANALOG,  /*!< 模拟 */
    SR_GPIO_IRQ = BSP_GPIO_IRQ,        /*!< 中断 */


};

/**
 * @brief 引脚上下拉
 */
enum SR_GPIO_PULL
{
    SR_GPIO_NP = BSP_GPIO_NP, /*!< 无上下拉 */
    SR_GPIO_PU = BSP_GPIO_PU, /*!< 上拉 */
    SR_GPIO_PD = BSP_GPIO_PD  /*!< 下拉 */
};

/**
 * @brief 中断触发模式
 */
enum SR_GPIO_IRQ_MODE
{
    SR_GPIO_IRQ_RISING = BSP_GPIO_IRQ_RISING,   /*!< 上升沿 */
    SR_GPIO_IRQ_FALLING = BSP_GPIO_IRQ_FALLING, /*!< 下降沿 */
    SR_GPIO_IRQ_DOUBLE = BSP_GPIO_IRQ_DOUBLE,   /*!< 双边沿 */
};


/** @defgroup GPIO_AF   GPIO复用功能
  * @{
  */
#define SR_GPIO_AF0     BSP_GPIO_AF0      
#define SR_GPIO_AF1     BSP_GPIO_AF1   
#define SR_GPIO_AF2     BSP_GPIO_AF2   
#define SR_GPIO_AF3     BSP_GPIO_AF3   
#define SR_GPIO_AF4     BSP_GPIO_AF4   
#define SR_GPIO_AF5     BSP_GPIO_AF5   
#define SR_GPIO_AF6     BSP_GPIO_AF6   
#define SR_GPIO_AF7     BSP_GPIO_AF7   
#define SR_GPIO_AF8     BSP_GPIO_AF8   
#define SR_GPIO_AF9     BSP_GPIO_AF9   
#define SR_GPIO_AF10    BSP_GPIO_AF10  
#define SR_GPIO_AF11    BSP_GPIO_AF11  
#define SR_GPIO_AF12    BSP_GPIO_AF12  
#define SR_GPIO_AF13    BSP_GPIO_AF13  
#define SR_GPIO_AF14    BSP_GPIO_AF14  
#define SR_GPIO_AF15    BSP_GPIO_AF15  
#define SR_GPIO_NOAF    BSP_GPIO_NOAF  
/**
  * @}
  */


/**
 * @brief GPIO中断回调函数定义
 *
 * @param args 用户参数
 *
 * @return 无
 */
typedef void (*GpioCb)(void *args);

/**
 * @brief GPIO中断回调结构体
 */
struct ST_GPIO_IRQ_CB
{
    GpioCb func; /*!< 中断回调函数 */
    void *args;  /*!< 中断回调的用户参数 */
};

/**
 * @brief GPIO配置结构体
 */
struct SR_GPIO_CFG
{
    uint32_t gpioID;            /*!< 引脚ID号 */
    SR_GPIO_MODE_E gpioMode;    /*!< 引脚模式 */
    SR_GPIO_PULL_E pull;        /*!< 引脚上下拉 */
    SR_GPIO_IRQ_MODE_E irqMode; /*!< 中断触发模式 */
    SR_GPIO_IRQ_CB_T *irqCb;    /*!< 中断回调 */
    uint32_t  altFun;           /*!< 复用功能 */
    uint8_t initLvl;            /*!< 初始电平，仅输出模式下有效 */
};

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

/**
 * @brief 初始化，设置GPIO引脚的工作模式
 *
 * @param[in] gpioId  GPIO的ID号
 * @param[in] gpioCfg GPIO的配置参数结构体
 *
 * @return 返回操作结果，如果成功则返回0，否则返回相应的错误代码
 */
#define SR_HalGpioInit(gpioId, gpioCfg) BspGpioInit(gpioId, gpioCfg)

/**
 * @brief GPIO去初始化
 *
 * @param[in] gpioId GPIO的ID号
 *
 * @return 返回操作结果，如果成功则返回0，否则返回相应的错误代码
 */
#define SR_HalGpioDeinit(gpioId) BspGpioDeinit(gpioId)

/**
 * @brief GPIO电平设置
 *
 * @param[in] gpioId GPIO的ID号
 * @param[in] level  待设置电平,取值为SR_GPIO_LEVEL_E
 *
 * @return 返回操作结果，如果成功则返回0，否则返回相应的错误代码
 */
#define SR_HalGpioWrite(gpioId, level) BspGpioWrite(gpioId, level)

/**
 * @brief GPIO电平读取
 *
 * @param[in] gpioId GPIO的ID号
 *
 * @return 返回读取的电平值。 1：高电平   0：低电平  负值：错误码
 */
#define SR_HalGpioRead(gpioId) BspGpioRead(gpioId)

/**
 * @brief 使能GPIO中断
 *
 * @param[in] gpioId GPIO的ID号
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalGpioIrqEnable(gpioId) BspGpioEnableIrq(gpioId)

/**
 * @brief 禁用GPIO中断
 *
 * @param[in] gpioId GPIO的ID号
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalGpioIrqDisable(gpioId) BspGpioDisableIrq(gpioId)

/**
 * @brief 设置GPIO中断回调
 *
 * @param[in] gpioId GPIO的编号
 * @param[in] irqMode GPIO中断模式
 * @param[inout] gpioIrqCb GPIO中断回调函数的结构体指针
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalGpioSetCb(gpioId, irqMode, gpioIrqCb) BspGpioSetCb(gpioId, irqMode, gpioIrqCb)

/**
 * @brief 取消设置GPIO中断回调
 *
 * @param[in] gpioId GPIO的ID号
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalGpioUnsetCb(gpioId) BspGpioUnsetCb(gpioId)

#endif

#endif
