/** * @file agile_button.h * @brief Agile Button 软件包头文件 * @author 马龙伟 (2544047213@qq.com) * @version 1.1.1 * @date 2021-12-29 * * @attention * *

© Copyright (c) 2021 Ma Longwei. * All rights reserved.

* */ #ifndef __PKG_AGILE_BUTTON_H #define __PKG_AGILE_BUTTON_H #ifdef __cplusplus extern "C" { #endif #include #include #include /** @defgroup AGILE_BUTTON_Exported_Types Agile Button Exported Types * @{ */ /** * @brief Agile Button 对象事件 */ enum agile_btn_event { BTN_PRESS_DOWN_EVENT = 0, /**< 按下事件 */ BTN_HOLD_EVENT, /**< 持续按下有效事件 */ BTN_PRESS_UP_EVENT, /**< 弹起事件 */ BTN_CLICK_EVENT, /**< 点击事件 */ BTN_EVENT_SUM /**< 事件总数目 */ }; /** * @brief Agile Button 对象状态 */ enum agile_btn_state { BTN_STATE_NONE_PRESS = 0, /**< 未按下状态 */ BTN_STATE_CHECK_PRESS, /**< 抖动检查状态 */ BTN_STATE_PRESS_DOWN, /**< 按下状态 */ BTN_STATE_PRESS_HOLD, /**< 持续按下状态 */ BTN_STATE_PRESS_UP, /**< 弹起状态 */ }; typedef struct agile_btn agile_btn_t; /**< Agile Button 结构体 */ /** * @brief Agile Button 结构体 */ struct agile_btn { uint8_t active; /**< 激活标志 */ uint8_t repeat_cnt; /**< 按键重按计数 */ uint8_t elimination_time; /**< 按键消抖时间(单位ms,默认15ms) */ enum agile_btn_event event; /**< 按键对象事件 */ enum agile_btn_state state; /**< 按键对象状态 */ uint32_t hold_time; /**< 按键按下持续时间(单位ms) */ uint32_t prev_hold_time; /**< 缓存 hold_time 变量 */ uint32_t hold_cycle_time; /**< 按键按下后持续调用回调函数的周期(单位ms,默认1s) */ uint32_t pin; /**< 按键引脚 */ uint32_t active_logic; /**< 有效电平(PIN_HIGH/PIN_LOW) */ rt_tick_t tick_timeout; /**< 超时时间 */ void (*event_cb[BTN_EVENT_SUM])(agile_btn_t *btn); /**< 按键对象事件回调函数 */ rt_slist_t slist; /**< 单向链表节点 */ }; /** * @} */ /** @addtogroup AGILE_BUTTON_Exported_Functions * @{ */ #ifdef RT_USING_HEAP agile_btn_t *agile_btn_create(uint32_t pin, uint32_t active_logic, uint32_t pin_mode); int agile_btn_delete(agile_btn_t *btn); #endif int agile_btn_init(agile_btn_t *btn, uint32_t pin, uint32_t active_logic, uint32_t pin_mode); int agile_btn_start(agile_btn_t *btn); int agile_btn_stop(agile_btn_t *btn); int agile_btn_set_elimination_time(agile_btn_t *btn, uint8_t elimination_time); int agile_btn_set_hold_cycle_time(agile_btn_t *btn, uint32_t hold_cycle_time); int agile_btn_set_event_cb(agile_btn_t *btn, enum agile_btn_event event, void (*event_cb)(agile_btn_t *btn)); void agile_btn_process(void); void agile_btn_env_init(void); /** * @} */ #ifdef __cplusplus } #endif #endif /* __PKG_AGILE_BUTTON_H */