/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : bsp_key.h
  * @brief          : 板级支持包按键驱动头文件
  ******************************************************************************
  */
/* USER CODE END Header */

#ifndef BSP_KEY_H
#define BSP_KEY_H

#include <stdint.h>

/**
 * @brief 按键 ID 定义
 */
typedef enum {
    BSP_KEY_ID_KEY0 = 0,
    BSP_KEY_ID_KEY1,
    BSP_KEY_ID_WKUP,
    BSP_KEY_ID_MAX
} bsp_key_id_t;

/**
 * @brief 按键状态定义
 */
typedef enum {
    BSP_KEY_STATE_RELEASED = 0,
    BSP_KEY_STATE_PRESSED
} bsp_key_state_t;

/**
 * @brief 按键事件定义
 */
typedef enum {
    BSP_KEY_EVENT_NONE = 0,
    BSP_KEY_EVENT_PRESSED,        /* 按键按下事件 */
    BSP_KEY_EVENT_RELEASED,       /* 按键释放事件 */
    BSP_KEY_EVENT_LONG_PRESSED,   /* 按键长按事件 */
    BSP_KEY_EVENT_REPEAT,         /* 按键重复事件 */
    BSP_KEY_EVENT_SHORT_PRESSED   /* 按键短按事件 */
} bsp_key_event_t;

/**
 * @brief 初始化所有按键
 */
void bsp_key_init(void);

/**
 * @brief 更新按键状态（定期调用此函数，例如每 10ms）
 */
void bsp_key_update(void);

/**
 * @brief 读取去抖后的按键状态
 * @param key_id: 按键 ID
 * @retval 按键状态
 */
bsp_key_state_t bsp_key_read(bsp_key_id_t key_id);

/**
 * @brief 检查按键是否按下
 * @param key_id: 按键 ID
 * @retval 按下返回 1，否则返回 0
 */
uint8_t bsp_key_is_pressed(bsp_key_id_t key_id);

/**
 * @brief 检查按键是否释放
 * @param key_id: 按键 ID
 * @retval 释放返回 1，否则返回 0
 */
uint8_t bsp_key_is_released(bsp_key_id_t key_id);

/**
 * @brief 检查按键按下事件（边沿检测）
 * @param key_id: 按键 ID
 * @retval 按键按下返回 1，否则返回 0
 */
uint8_t bsp_key_get_press_event(bsp_key_id_t key_id);

/**
 * @brief 检查按键释放事件（边沿检测）
 * @param key_id: 按键 ID
 * @retval 按键释放返回 1，否则返回 0
 */
uint8_t bsp_key_get_release_event(bsp_key_id_t key_id);

/**
 * @brief 检查按键长按事件
 * @param key_id: 按键 ID
 * @retval 按键长按返回 1，否则返回 0
 */
uint8_t bsp_key_get_long_press_event(bsp_key_id_t key_id);

/**
 * @brief 检查按键重复事件
 * @param key_id: 按键 ID
 * @retval 按键重复事件发生返回 1，否则返回 0
 */
uint8_t bsp_key_get_repeat_event(bsp_key_id_t key_id);

/**
 * @brief 检查按键短按事件
 * @param key_id: 按键 ID
 * @retval 按键短按返回 1，否则返回 0
 */
uint8_t bsp_key_get_short_press_event(bsp_key_id_t key_id);

#endif /* BSP_KEY_H */
