1、开机按满 5s 绿灯先切配对快闪提示,松手才清绑定并进配网,继续按到 12s 仍可改道 OTA

2、app_led_init 提前到按键判定前,3s 常亮 / 5s 快闪 / 拒绝开机低电闪统一走灯效事件表,去掉开机阶段手搓 GPIO 闪烁
This commit is contained in:
2026-08-27 20:19:57 +08:00
parent 215e1be6bb
commit 026d6d5da7
5 changed files with 89 additions and 37 deletions
+34 -21
View File
@@ -2,11 +2,19 @@
* @file app_boot.c
* @brief 深睡唤醒 / 上电按键判定实现
* @author cyWu <1917507415@qq.com>
* @date 2026.08.26
* @version V1.1.0
* @date 2026.08.27
* @version V1.4.0
* @history
* - V1.0.0, 2026.08.25, cyWu, 首次发布,实现深睡唤醒按键判定(3s 开机 / 5s 配对)
* - V1.1.0, 2026.08.26, cyWu, 新增 12s 长按进 OTA、开机前低电量拦截
* - V1.2.0, 2026.08.27, cyWu, 按满 5s 绿灯即按配对节奏快闪,松手才真正提交配网
* - V1.3.0, 2026.08.27, cyWu, 3s/5s 提示灯改直接复用 LED 事件库
* LED_EVENT_STANDBY/LED_EVENT_PAIRING),
* 不再手写一份闪烁定时逻辑
* - V1.4.0, 2026.08.27, cyWu, LED 事件库初始化提前到 usr_jb_init(调用本文件
* 前完成),本文件不再自己调 user_led_init
* 拒绝开机低电闪也改用新增的 LED_EVENT_BOOT_REJECT
* 事件,去掉手写的闪烁计次循环
******************************************************************************/
#include "app_boot.h"
@@ -15,6 +23,7 @@
#include "board_pin.h"
#include "app_main.h"
#include "usr_le_api.h"
#include "led_manager.h"
#include "asm/power/power_api.h"
#include "asm/power/power_reset.h"
@@ -62,18 +71,17 @@ static void boot_sleep(void)
}
/**
* @brief 拒绝开机前的低电提示:红灯闪 BOARD_BOOT_LOWBAT_BLINK_N 下
* @brief 拒绝开机前的低电提示:红灯闪 BOARD_BOOT_LOWBAT_BLINK_N 下
* @note 直接挂 LED_EVENT_BOOT_REJECT,闪烁节奏/次数由 led_manager 的事件表
* 统一管理,这里只管等它闪完(事件闪完会自己删掉)
* @return 无
*/
static void boot_blink_low_battery(void)
{
uint8_t i;
for (i = 0; i < BOARD_BOOT_LOWBAT_BLINK_N; i++) {
bsp_led_red_set(1);
boot_delay_ms(BOARD_BOOT_LOWBAT_ON_MS);
bsp_led_red_set(0);
boot_delay_ms(BOARD_BOOT_LOWBAT_OFF_MS);
LED_EventAdd(LED_EVENT_BOOT_REJECT);
while (LED_IsEventExist(LED_EVENT_BOOT_REJECT)) {
clr_wdt();
user_led_handle();
}
}
@@ -134,15 +142,19 @@ static uint8_t boot_skip_key_wait(void)
/**
* @brief 等待并判定开机按键
* @note 配对(5s)不再一到点就立即提交:需要继续按住观察是否会按到 12s
* 触发 OTA,真正的配对提交放在松手那一刻做,行为上仍是“按满 5s
* 再松手即进配对”,只是多给了继续按到 12s 改道 OTA 的机会。
* 触发 OTA,真正的配对提交放在松手那一刻做。按满 5s 绿灯先切到配对
* 快闪提示,行为上仍是“按满 5s 再松手即进配对”,只是多给了继续按到
* 12s 改道 OTA 的机会。
* 3s 常亮 / 5s 快闪直接复用 led_manager 的 LED_EVENT_STANDBY /
* LED_EVENT_PAIRING 事件(和正常运行时配对灯效完全一致的节奏),
* 不再手写一份闪烁定时。LED 事件库由调用方(usr_jb_init)在本函数
* 之前完成初始化,这里直接假定可用,跟 bsp_hw_init() 一个道理。
* @return 无(深睡分支不返回)
*/
void app_boot_wait_key(void)
{
uint32_t t0;
uint32_t elapsed;
uint8_t green_on = 0;
uint8_t pair_armed = 0;
usr_var.usr_goto_pair = 0;
@@ -165,7 +177,6 @@ void app_boot_wait_key(void)
}
t0 = timer_get_ms();
bsp_led_all_off();
log_info("boot key hold, wait 3s on / 5s pair / 12s ota\n");
while (bsp_key_is_pressed()) {
@@ -179,19 +190,21 @@ void app_boot_wait_key(void)
return;
}
/* 5s 只武装配对,真正提交放到松手那一刻,给继续按到 12s 改道 OTA 的机会 */
/* 5s 只武装配对并切到快闪,真正提交放到松手那一刻,给继续按到 12s 改道 OTA 的机会 */
if (!pair_armed && (elapsed >= BOARD_KEY_PAIR_MS)) {
pair_armed = 1;
log_info("boot hold %ums, pair armed (release now for pair, "
LED_EventDelete(LED_EVENT_STANDBY);
LED_EventAdd(LED_EVENT_PAIRING);
log_info("boot hold %ums, pair hint blink (release now for pair, "
"keep holding to %ums for ota)\n",
(unsigned)elapsed, (unsigned)BOARD_KEY_OTA_MS);
}
if (!green_on && (elapsed >= BOARD_KEY_POWER_MS)) {
green_on = 1;
bsp_led_green_set(1);
} else if (!pair_armed && !LED_IsEventExist(LED_EVENT_STANDBY)
&& (elapsed >= BOARD_KEY_POWER_MS)) {
LED_EventAdd(LED_EVENT_STANDBY);
log_info("boot hold 3s, will power on\n");
}
user_led_handle(); /* 按事件表当前状态刷新一次灯,闪烁节奏由事件配置自己算 */
}
elapsed = timer_get_ms() - t0;