148 lines
3.1 KiB
C
148 lines
3.1 KiB
C
/******************************************************************************
|
|
* @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, 从天誉 MJ-1.0 充电板移植到杰理 BR28
|
|
******************************************************************************/
|
|
|
|
#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;
|
|
}
|
|
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;
|
|
}
|
|
for (i = 0; i < dt; i++) {
|
|
keyCheckProcess();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief 派发按键回调
|
|
* @return 无
|
|
*/
|
|
void user_key_handle(void)
|
|
{
|
|
if (!s_km.initialized) {
|
|
return;
|
|
}
|
|
keyHandle();
|
|
}
|