#ifndef _BSP_GPIO_H
#define _BSP_GPIO_H
#include "sr_config.h"

//原厂头文件
#include "stm32f4xx_hal.h"



#define BSP_GPIO_LOW          GPIO_PIN_RESET
#define BSP_GPIO_HIGH         GPIO_PIN_SET
#define BSP_GPIO_TOGGLE       2      //自定义，和st枚举不冲突即可
    
#define BSP_GPIO_OUTPUT       GPIO_MODE_OUTPUT_PP
#define BSP_GPIO_INPUT        GPIO_MODE_INPUT
#define BSP_GPIO_IRQ          0xFE   //自定义，和st枚举不冲突即可
#define BSP_GPIO_OD           GPIO_MODE_OUTPUT_OD
    
#define BSP_GPIO_NP           GPIO_NOPULL
#define BSP_GPIO_PU           GPIO_PULLUP
#define BSP_GPIO_PD           GPIO_PULLDOWN

#define BSP_GPIO_IRQ_RISING   GPIO_MODE_IT_RISING
#define BSP_GPIO_IRQ_FALLING  GPIO_MODE_IT_FALLING
#define BSP_GPIO_IRQ_DOUBLE   GPIO_MODE_IT_RISING_FALLING
#define BSP_GPIO_IRQ_HIGH     0xFF   //无效值
#define BSP_GPIO_IRQ_LOW      0xFF   //无效值


//引脚端口索引定义
typedef enum GPIO_PORT
{
  PNULL = -1,
#ifdef GPIOA
  PA,
#endif
#ifdef GPIOB
  PB,
#endif
#ifdef GPIOC
  PC,
#endif
#ifdef GPIOD
  PD,
#endif
#ifdef GPIOE
  PE,
#endif
#ifdef GPIOF
  PF,
#endif
#ifdef GPIOG
  PG,
#endif
#ifdef GPIOH
  PH,
#endif

  ST_PORT_MAX
}GPIO_PORT_E;


#define ST_PIN_MAX   16


//GPIO ID定义.高16位为port(端口索引)，低16位为index(pin索引).例如PB10，高16位=PB=1，index为10
#define _GPIO_ID(port,index)        (((((port) & 0xFFFFu) << 16) | ((index) & 0xFFFFu)))
#define _GPIO_PORT(id)              ((uint16_t)(((id) >> 16) & 0xFFFFu))
#define _GPIO_INDEX(id)             ((uint16_t)((id) & 0xFFFFu))
#define SR_GET_GPIO_ID(port,index)  _GPIO_ID(port,index)  /*!<开放给用户使用，获取GPIO ID*/

/*!<开放给用户使用，获取GPIO ID*/
typedef enum
{
    SR_GPIO0 = _GPIO_ID(PA,0),
    SR_GPIO1 = _GPIO_ID(PA,1),
    SR_GPIO2 = _GPIO_ID(PA,2),
    SR_GPIO3 = _GPIO_ID(PA,3),
    SR_GPIO4 = _GPIO_ID(PA,4),
    SR_GPIO5 = _GPIO_ID(PA,5),
    SR_GPIO6 = _GPIO_ID(PA,6),
    SR_GPIO7 = _GPIO_ID(PA,7),
    SR_GPIO8 = _GPIO_ID(PA,8),
    SR_GPIO9 = _GPIO_ID(PA,9),
    SR_GPIO10 = _GPIO_ID(PA,10),
    SR_GPIO11 = _GPIO_ID(PA,11),
    SR_GPIO12 = _GPIO_ID(PA,12),
    SR_GPIO13 = _GPIO_ID(PA,13),
    SR_GPIO14 = _GPIO_ID(PA,14),
    SR_GPIO15 = _GPIO_ID(PA,15),

    SR_GPIO20 = _GPIO_ID(PB,0),
    SR_GPIO21 = _GPIO_ID(PB,1),
    SR_GPIO22 = _GPIO_ID(PB,2),
    SR_GPIO23 = _GPIO_ID(PB,3),
    SR_GPIO24 = _GPIO_ID(PB,4),
    SR_GPIO25 = _GPIO_ID(PB,5),
    SR_GPIO26 = _GPIO_ID(PB,6),
    SR_GPIO27 = _GPIO_ID(PB,7),
    SR_GPIO28 = _GPIO_ID(PB,8),
    SR_GPIO29 = _GPIO_ID(PB,9),
    SR_GPIO30 = _GPIO_ID(PB,10),
    SR_GPIO31 = _GPIO_ID(PB,11),
    SR_GPIO32 = _GPIO_ID(PB,12),
    SR_GPIO33 = _GPIO_ID(PB,13),
    SR_GPIO34 = _GPIO_ID(PB,14),
    SR_GPIO35 = _GPIO_ID(PB,15),

    SR_GPIO40 = _GPIO_ID(PC,0),
    SR_GPIO41 = _GPIO_ID(PC,1),
    SR_GPIO42 = _GPIO_ID(PC,2),
    SR_GPIO43 = _GPIO_ID(PC,3),
    SR_GPIO44 = _GPIO_ID(PC,4),
    SR_GPIO45 = _GPIO_ID(PC,5),
    SR_GPIO46 = _GPIO_ID(PC,6),
    SR_GPIO47 = _GPIO_ID(PC,7),
    SR_GPIO48 = _GPIO_ID(PC,8),
    SR_GPIO49 = _GPIO_ID(PC,9),
    SR_GPIO50 = _GPIO_ID(PC,10),
    SR_GPIO51 = _GPIO_ID(PC,11),
    SR_GPIO52 = _GPIO_ID(PC,12),
    SR_GPIO53 = _GPIO_ID(PC,13),
    SR_GPIO54 = _GPIO_ID(PC,14),
    SR_GPIO55 = _GPIO_ID(PC,15),

    SR_GPIO60 = _GPIO_ID(PD,0),
    SR_GPIO61 = _GPIO_ID(PD,1),
    SR_GPIO62 = _GPIO_ID(PD,2),
    SR_GPIO63 = _GPIO_ID(PD,3),
    SR_GPIO64 = _GPIO_ID(PD,4),
    SR_GPIO65 = _GPIO_ID(PD,5),
    SR_GPIO66 = _GPIO_ID(PD,6),
    SR_GPIO67 = _GPIO_ID(PD,7),
    SR_GPIO68 = _GPIO_ID(PD,8),
    SR_GPIO69 = _GPIO_ID(PD,9),
    SR_GPIO70 = _GPIO_ID(PD,10),
    SR_GPIO71 = _GPIO_ID(PD,11),
    SR_GPIO72 = _GPIO_ID(PD,12),
    SR_GPIO73 = _GPIO_ID(PD,13),
    SR_GPIO74 = _GPIO_ID(PD,14),
    SR_GPIO75 = _GPIO_ID(PD,15),

    SR_GPIO80 = _GPIO_ID(PE,0),
    SR_GPIO81 = _GPIO_ID(PE,1),
    SR_GPIO82 = _GPIO_ID(PE,2),
    SR_GPIO83 = _GPIO_ID(PE,3),
    SR_GPIO84 = _GPIO_ID(PE,4),
    SR_GPIO85 = _GPIO_ID(PE,5),
    SR_GPIO86 = _GPIO_ID(PE,6),
    SR_GPIO87 = _GPIO_ID(PE,7),
    SR_GPIO88 = _GPIO_ID(PE,8),
    SR_GPIO89 = _GPIO_ID(PE,9),
    SR_GPIO90 = _GPIO_ID(PE,10),
    SR_GPIO91 = _GPIO_ID(PE,11),
    SR_GPIO92 = _GPIO_ID(PE,12),
    SR_GPIO93 = _GPIO_ID(PE,13),
    SR_GPIO94 = _GPIO_ID(PE,14),
    SR_GPIO95 = _GPIO_ID(PE,15),

    SR_GPIO100 = _GPIO_ID(PF,0),
    SR_GPIO101 = _GPIO_ID(PF,1),
    SR_GPIO102 = _GPIO_ID(PF,2),
    SR_GPIO103 = _GPIO_ID(PF,3),
    SR_GPIO104 = _GPIO_ID(PF,4),
    SR_GPIO105 = _GPIO_ID(PF,5),
    SR_GPIO106 = _GPIO_ID(PF,6),
    SR_GPIO107 = _GPIO_ID(PF,7),
    SR_GPIO108 = _GPIO_ID(PF,8),
    SR_GPIO109 = _GPIO_ID(PF,9),
    SR_GPIO110 = _GPIO_ID(PF,10),
    SR_GPIO111 = _GPIO_ID(PF,11),
    SR_GPIO112 = _GPIO_ID(PF,12),
    SR_GPIO113 = _GPIO_ID(PF,13),
    SR_GPIO114 = _GPIO_ID(PF,14),
    SR_GPIO115 = _GPIO_ID(PF,15),

    SR_GPIO120 = _GPIO_ID(PG,0),
    SR_GPIO121 = _GPIO_ID(PG,1),
    SR_GPIO122 = _GPIO_ID(PG,2),
    SR_GPIO123 = _GPIO_ID(PG,3),
    SR_GPIO124 = _GPIO_ID(PG,4),
    SR_GPIO125 = _GPIO_ID(PG,5),
    SR_GPIO126 = _GPIO_ID(PG,6),
    SR_GPIO127 = _GPIO_ID(PG,7),
    SR_GPIO128 = _GPIO_ID(PG,8),
    SR_GPIO129 = _GPIO_ID(PG,9),
    SR_GPIO130 = _GPIO_ID(PG,10),
    SR_GPIO131 = _GPIO_ID(PG,11),
    SR_GPIO132 = _GPIO_ID(PG,12),
    SR_GPIO133 = _GPIO_ID(PG,13),
    SR_GPIO134 = _GPIO_ID(PG,14),
    SR_GPIO135 = _GPIO_ID(PG,15),

    SR_GPIO140 = _GPIO_ID(PH,0),
    SR_GPIO141 = _GPIO_ID(PH,1),
    
} SR_GPIO_ID_E;

int BspGpioInit(int gpioId, SR_GPIO_CFG_T *gpioCfg);
int BspGpioDeinit(int gpioId);
int BspGpioWrite(int gpioId, uint8_t value);
int BspGpioRead(int gpioId);
int BspGpioEnableIrq(int gpioId);
int BspGpioDisableIrq(int gpioId);
int BspGpioSetCb(int gpioId, SR_GPIO_IRQ_MODE_E irqMode, SR_GPIO_IRQ_CB_T *gpioIrqCb);
int BspGpioUnsetCb(int gpioId);

#endif
