Initial import
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
/******************************************************************************
|
||||
* @file key_manager.c
|
||||
* @brief CBC4 按键:读 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();
|
||||
}
|
||||
Reference in New Issue
Block a user