1、开机按满 5s 绿灯先切配对快闪提示,松手才清绑定并进配网,继续按到 12s 仍可改道 OTA
2、app_led_init 提前到按键判定前,3s 常亮 / 5s 快闪 / 拒绝开机低电闪统一走灯效事件表,去掉开机阶段手搓 GPIO 闪烁
This commit is contained in:
+34
-21
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user