/****************************************************************************** * @file key_manager.c * @brief CBC2 按键:读 PB1,短按/长按交给 usr_jb_main * @author cyWu <1917507415@qq.com> * @date 2026.08.25 * @version V1.0.0 * @history * - V1.0.0, 2026.08.25, cyWu, 首次发布,实现短按切模式、长按 3s 关机与开机按键锁 ******************************************************************************/ #include "system/includes.h" #include "key_manager.h" #include "bsp_hw.h" #include "board_pin.h" #define LOG_TAG_CONST APP #define LOG_TAG "[KEY]" #define LOG_INFO_ENABLE #include "debug.h" /** 模块状态,替代原来 2 个散落的 static */ typedef struct { uint8_t initialized; uint8_t boot_key_lock; /**< 1=开机判定时键还按着,等松开才认短按/长按 */ } KeyManagerCtx_t; static KeyManagerCtx_t s_km; /** * @brief 读按键:1=按下 * @return 1=按下,0=松开 */ static uint8_t key_user_read(void) { return bsp_key_is_pressed(); } /** * @brief 松开:清掉开机按着键的锁 * @return 无 */ static void key_user_release(void) { if (s_km.boot_key_lock) { s_km.boot_key_lock = 0; log_info("boot key released\n"); } } /** * @brief 短按:开机未松手前忽略 * @return 无 */ static void key_user_short(void) { if (s_km.boot_key_lock) { s_km.boot_key_lock = 0; /* 开机松手当成释放,不当短按切模式 */ log_info("boot key released\n"); return; } usr_on_key_short(); } /** * @brief 长按 3s:开机未松手前忽略,避免开机手还按着就关机 * @return 无 */ static void key_user_long(void) { if (s_km.boot_key_lock) { return; /* 开机手还按着,忽略这次 3s 长按,避免一开机就关机 */ } usr_on_key_long(); } static keyCategory_t s_keys[USR_KEY_COUNT] = { [USR_KEY_USER] = { .fsm.keyShield = KEY_ENABLE, .fsm.keyDownLevel = Bit_SET, .fsm.eventType = NULL_Event, .fsm.keyLongTime = BOARD_KEY_POWER_MS, .fsm.keyLastTime = (BOARD_KEY_POWER_MS + 7000), /* 大于长按即可,不使用持续按 */ .fsm.keyReadValue = key_user_read, .func.ShortPressCb = key_user_short, .func.longPressCb = key_user_long, .func.releasePressCb = key_user_release, }, }; /** * @brief 装载按键表 * @return 无 */ void user_key_init(void) { if (s_km.initialized) { return; } keyParaInit(s_keys); s_km.boot_key_lock = 0; s_km.initialized = 1; } /** * @brief 开机判定结束后:键还按着则锁住,松开才认短按/长按 * @return 无 */ void user_key_lock_if_held(void) { reset_key_Status(USR_KEY_USER); if (bsp_key_is_pressed()) { s_km.boot_key_lock = 1; /* 开机手还按着,等松开才认短按/长按,避免立刻关机 */ log_info("boot key held, wait release\n"); } } /** * @brief 按真实毫秒推进状态机 * @param dt 距上次调用的毫秒数 * @return 无 */ void user_key_scan(uint16_t dt) { uint16_t i; if (!s_km.initialized) { return; } if (dt == 0) { dt = 1; } /* 按键库按 1ms 步进,业务节拍是 20ms,这里循环 dt 次对齐真实时间 */ for (i = 0; i < dt; i++) { keyCheckProcess(); } } /** * @brief 派发按键回调 * @return 无 */ void user_key_handle(void) { if (!s_km.initialized) { return; } keyHandle(); }