精简 usr_app 架构:去掉关机/休眠死代码,按键复用 key.c 状态机,ISR 重活统一延后到任务上下文

Type-C 长供电、上电即工作、无软关机,删除 app_boot/app_power 及 DP0 开关相关逻辑,
去掉空占位 app_fan_run 和无效的 usr_timer_pick_mode/rearm(数码管 4ms 扫描已 priority=1,
系统本来就不会进低功耗)。按键 5s 配对 / 12s OTA 改走 key.c 长按分级,去掉自计时与 1~5s 死区。
新增 app_defer,NVM/配对/OTA 只在 ISR 置位、在 500ms 任务上下文落地,避免再在 usr_timer 里写 flash。
规格书与注释同步精简。
This commit is contained in:
2026-08-31 17:57:52 +08:00
parent 5cc7e9dbd6
commit e324ebd99b
51 changed files with 542 additions and 886 deletions
+50 -31
View File
@@ -1,11 +1,9 @@
/******************************************************************************
* @file key_manager.c
* @brief CBR3 按键:读 PB1,短按切档、长按 3s 关机交给 usr_jb_main
* @brief CBR3 按键:读 PB1,短按切档;按住分级 5s 配对 / 12s OTA
* @author cyWu <1917507415@qq.com>
* @date 2026.08.29
* @version V1.0.0
* @history
* - V1.0.0, 2026.08.29, cyWu, 首次发布(移植门夹,短按语义改切档)
* @date 2026.08.31
* @version V3.0.0,直接复用 key.c 原生长按/连按/释放事件做按住分级
******************************************************************************/
#include "system/includes.h"
@@ -18,10 +16,11 @@
#define LOG_INFO_ENABLE
#include "debug.h"
/** 模块状态,替代原来 2 个散落的 static */
/** 模块状态 */
typedef struct {
uint8_t initialized;
uint8_t boot_key_lock; /**< 1=开机判定时键还按着,等松开才认短按/长按 */
uint8_t boot_key_lock; /**< 1=上电时键还按着,等松开才认短按(不挡长按分级) */
uint8_t ota_fired; /**< 1=已到点触发 OTA,本次按住松手不再提交配对 */
} KeyManagerCtx_t;
static KeyManagerCtx_t s_km;
@@ -36,25 +35,13 @@ static uint8_t key_user_read(void)
}
/**
* @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 短按:开机未松手前忽略
* @brief 短按(SHORT_Event,松手时刻 <5s):上电未松手前忽略,否则切档
* @return 无
*/
static void key_user_short(void)
{
if (s_km.boot_key_lock) {
s_km.boot_key_lock = 0; /* 开机松手当成释放,不当短按切档 */
s_km.boot_key_lock = 0; /* 上电松手当成释放,不当短按切档 */
log_info("boot key released\n");
return;
}
@@ -62,15 +49,44 @@ static void key_user_short(void)
}
/**
* @brief 长按 3s:开机未松手前忽略,避免开机手还按着就关机
* @brief 长按到点(LONG_Event,满 5s 仍按住):挂配对提示灯
* @note ⚠ 跑在 usr_timer 20ms(硬件定时器中断上下文):只准打标志 + 切灯效
* 事件(纯 RAM)。清绑定(写 VM)留给 app_function_loop(任务上下文)。
* @return 无
*/
static void key_user_long(void)
static void key_user_pair_hint(void)
{
if (s_km.boot_key_lock) {
return; /* 开机手还按着,忽略这次 3s 长按,避免一开机就关机 */
usr_on_key_pair_hint();
}
/**
* @brief 连按到点(LAST_Event,满 12s 仍按住,到点即触发不等松手):进 OTA
* @note ⚠ 同上,只置标志;usr_app_ota_init 由 app_function_loop 执行。
* key.c 的 keyHandle 对 LAST_Event 不清 eventType,松手前每 20ms 都会
* 再派发一次,这里用 ota_fired 挡住重复调用。
* @return 无
*/
static void key_user_ota_start(void)
{
if (s_km.ota_fired) {
return;
}
usr_on_key_long();
s_km.ota_fired = 1;
usr_on_key_ota_start();
}
/**
* @brief 释放(RELEASE_Event,只有按满 ≥5s 才会触发):未进 OTA 则提交配对
* @note 按满 12s 已触发 OTA 的这次按住,松手不再提交配对(ota_fired 拦住)。
* @return 无
*/
static void key_user_release(void)
{
s_km.boot_key_lock = 0;
if (!s_km.ota_fired) {
usr_on_key_pair_start();
}
s_km.ota_fired = 0;
}
static keyCategory_t s_keys[USR_KEY_COUNT] = {
@@ -78,12 +94,13 @@ static keyCategory_t s_keys[USR_KEY_COUNT] = {
.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.keyLongTime = BOARD_KEY_PAIR_MS, /* 满 5s 仍按住 -> longPressCb */
.fsm.keyLastTime = BOARD_KEY_OTA_MS, /* 满 12s 仍按住 -> lastPressCb */
.fsm.keyReadValue = key_user_read,
.func.ShortPressCb = key_user_short,
.func.longPressCb = key_user_long,
.func.releasePressCb = key_user_release,
.func.longPressCb = key_user_pair_hint,
.func.lastPressCb = key_user_ota_start,
},
};
@@ -98,18 +115,20 @@ void user_key_init(void)
}
keyParaInit(s_keys);
s_km.boot_key_lock = 0;
s_km.ota_fired = 0;
s_km.initialized = 1;
}
/**
* @brief 开机判定结束后:键还按着则锁住,松开才认短按/长按
* @brief 上电后:键还按着则锁住短按,松开才认短按
* @note 只锁短按,**不锁长按分级**:上电就按住 5s 进配对是受支持的用法。
* @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; /* 开机手还按着,等松开才认短按/长按,避免立刻关机 */
s_km.boot_key_lock = 1; /* 上电手还按着,等松开才认短按,避免一上电就切档 */
log_info("boot key held, wait release\n");
}
}