From c7adda371145baf3521e102e492491999dedde5a Mon Sep 17 00:00:00 2001 From: Wuchuyuan <1917507415@qq.com> Date: Thu, 10 Sep 2026 14:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=87=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=97=AA=E5=AE=8C=E5=A4=9A=E4=B8=80=E9=97=AA=EF=BC=8C=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E9=85=8D=E5=AF=B9=E5=A4=B1=E8=B4=A5=E7=81=AF=E5=9B=A0?= =?UTF-8?q?=E4=BC=91=E7=9C=A0=E5=8F=88=E6=85=A2=E5=8F=88=E5=B0=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 切模式/配对快闪用优先级拦住待机绿,闪完同一拍衔上常亮;短灯效播完前禁睡,避免节拍被拉长。 Co-authored-by: Cursor --- apps/usr_app/app_led.c | 38 ++++++++++++++++++++------------- apps/usr_app/app_led.h | 7 ++++++ apps/usr_app/led_manager.c | 19 ++++++++++------- apps/usr_jb_proto/usr_jb_main.c | 8 ++++--- 4 files changed, 46 insertions(+), 26 deletions(-) diff --git a/apps/usr_app/app_led.c b/apps/usr_app/app_led.c index 353f23d..7990239 100644 --- a/apps/usr_app/app_led.c +++ b/apps/usr_app/app_led.c @@ -2,8 +2,8 @@ * @file app_led.c * @brief CBC2 灯效适配:充电红与待机绿可同时亮,不再 if-else 互斥 * @author cyWu <1917507415@qq.com> - * @date 2026.08.25 - * @version V2.0.0 + * @date 2026.09.10 + * @version V2.5.0 * @history * - V1.0.0, 2026.08.21, cyWu, 首次发布 * - V1.1.0, 2026.08.25, cyWu, 开机绿灯只提示几秒 @@ -12,6 +12,7 @@ * - V2.2.0, 2026.08.25, cyWu, 重启/清场逻辑各提一个小函数,把意图写进注释 * - V2.3.0, 2026.08.27, cyWu, 新增 OTA 红绿交替灯效 * - V2.4.0, 2026.08.27, cyWu, 新增空电关机红闪 5 下灯效 + * - V2.5.0, 2026.09.10, cyWu, 切模式时保留待机绿,闪完不再多一闪 ******************************************************************************/ #include "app_led.h" @@ -53,15 +54,6 @@ static uint8_t green_pattern_busy(void) || LED_IsEventExist(LED_EVENT_PAIR_FAIL)); } -/** - * @brief 绿灯正被配对/切模式/结果占用时,不要再挂待机绿 - * @return 1=绿灯忙 - */ -static uint8_t green_busy(void) -{ - return (uint8_t)(LED_IsEventExist(LED_EVENT_PAIRING) || green_pattern_busy()); -} - /** * @brief 灯效初始化 * @return APP_LED_OK=成功 @@ -157,6 +149,20 @@ uint8_t app_led_is_empty_off(void) return s_empty_off; } +/** + * @brief 短灯效还在播时不要进休眠 + * @return 1=应禁睡,0=可以睡 + */ +uint8_t app_led_need_nosleep(void) +{ + if (s_ota || s_empty_off) { + return 1; + } + return (uint8_t)(LED_IsEventExist(LED_EVENT_PAIR_FAIL) + || LED_IsEventExist(LED_EVENT_PAIR_OK) + || LED_IsEventExist(LED_EVENT_MODE)); +} + /** * @brief 播放一次性配对结果灯 * @param ok 1=成功常绿,0=失败红绿交替 @@ -263,11 +269,13 @@ void app_led_run(uint16_t dt, uint8_t app_power) led_clear_function_events(); } else { #if BOARD_LED_STANDBY_ON - /* 正在充电(红)或已充满(绿)时都不叠加待机绿,只有完全没接电才显示待机 */ - if ((charge_led == 0) && !pairing && !green_busy()) { - LED_EventAdd(LED_EVENT_STANDBY); - } else { + /* 配对/切模式/配对失败用 return 1 拦住待机,这里不用删。 + * 充电红不占用绿灯:拦截只是不跑待机 handler,绿灯会停在上次的亮。 + * 所以充电时要删待机,把绿灯掐灭。 */ + if (charge_led == 1) { LED_EventDelete(LED_EVENT_STANDBY); + } else { + LED_EventAdd(LED_EVENT_STANDBY); } #endif } diff --git a/apps/usr_app/app_led.h b/apps/usr_app/app_led.h index 5d7bb99..c29b13e 100644 --- a/apps/usr_app/app_led.h +++ b/apps/usr_app/app_led.h @@ -75,6 +75,13 @@ void app_led_request_empty_off(void); */ uint8_t app_led_is_empty_off(void); +/** + * @brief 短灯效还在播时不要进休眠(配对失败/成功、切模式闪) + * @note 灯刷新跟业务定时器走;休眠后节拍被拉长,交替闪会又慢又少。 + * @return 1=应禁睡,0=可以睡 + */ +uint8_t app_led_need_nosleep(void); + /** * @brief 清空全部灯事件并灭灯(关机前调用) * @return 无 diff --git a/apps/usr_app/led_manager.c b/apps/usr_app/led_manager.c index 14b8db4..86092de 100644 --- a/apps/usr_app/led_manager.c +++ b/apps/usr_app/led_manager.c @@ -2,12 +2,13 @@ * @file led_manager.c * @brief CBC2 灯事件:充电红与待机绿走不同通道,可同时亮 * @author cyWu <1917507415@qq.com> - * @date 2026.08.27 - * @version V1.1.0 + * @date 2026.09.10 + * @version V1.2.0 * @history * - V1.0.0, 2026.08.25, cyWu, 首次发布,实现红绿独立通道灯事件表 * - V1.1.0, 2026.08.27, cyWu, 新增 LED_EVENT_BOOT_REJECT:拒绝开机低电闪, * 供 app_boot 在按键判定阶段直接复用事件库 + * - V1.2.0, 2026.09.10, cyWu, 切模式闪时待机绿不写灯,闪完同一拍衔上常亮 ******************************************************************************/ #include "led_manager.h" @@ -67,26 +68,29 @@ static uint8_t led_standby_handler(LED_Config_t *led_config) /** * @brief 配对绿快闪(无限) + * @note 返回 1 拦住待机绿,否则待机会把快闪盖成常亮 * @param led_config 配置 - * @return 0 + * @return 1 */ static uint8_t led_pairing_handler(LED_Config_t *led_config) { (void)LED_Update(led_config); - return 0; + return 1; } /** * @brief 切模式闪完两下后删事件 + * @note 还在闪时返回 1,拦住待机绿,避免把闪烁盖成常亮 * @param led_config 配置 - * @return 0 + * @return 1=还在闪,0=闪完已删 */ static uint8_t led_mode_handler(LED_Config_t *led_config) { if (LED_Update(led_config) == 0) { LED_EventDelete(LED_EVENT_MODE); /* 闪完两下后删,绿灯还给待机/配对 */ + return 0; } - return 0; + return 1; } /** @@ -248,8 +252,7 @@ void user_led_init(void) .config.alternatingBlinkParams.Group[0] = LED_CHANNEL(LED_CH_RED), .config.alternatingBlinkParams.Group[1] = LED_CHANNEL(LED_CH_GREEN), .config.alternatingBlinkParams.Cycle = (uint32_t)(BOARD_LED_ALT_MS * 2u), - .config.runNum = (uint16_t)((BOARD_LED_PAIR_FAIL_MS + (BOARD_LED_ALT_MS * 2u) - 1u) - / (BOARD_LED_ALT_MS * 2u)), + .config.runNum = (uint16_t)((BOARD_LED_PAIR_FAIL_MS + (BOARD_LED_ALT_MS * 2u) - 1u)/ (BOARD_LED_ALT_MS * 2u)), .ledEventHandler = led_pair_fail_handler, }, [LED_EVENT_OTA] = { diff --git a/apps/usr_jb_proto/usr_jb_main.c b/apps/usr_jb_proto/usr_jb_main.c index f952563..d97bfe4 100644 --- a/apps/usr_jb_proto/usr_jb_main.c +++ b/apps/usr_jb_proto/usr_jb_main.c @@ -159,8 +159,9 @@ static void usr_poweroff_finalize_hook(void) * @brief 按当前业务状态判断能不能休眠 * @note 换向死区(bsp_motor_is_busy 已把它算进"忙")、点动、玩法、按键按住、 * 关机等待、配网窗口,统一都是"不能睡",节拍周期都一样用 USR_TIMER_IDLE_MS。 - * 配网只跟 120s 配对窗口(app_pair_is_active):窗口内禁睡,保证广播 - * 节拍不被低功耗拉长;成功或超时后恢复可休眠。 + * 配网只跟 120s 配对窗口(app_pair_is_active):窗口内禁睡。 + * 超时后配对失败灯还要再闪约 3s,这段也禁睡,否则节拍被拉长, + * 红绿交替会又慢又少。 * @return 本次应使用的档位 */ static UsrTickMode_t usr_timer_pick_mode(void) @@ -168,7 +169,8 @@ static UsrTickMode_t usr_timer_pick_mode(void) if (bsp_key_is_pressed() || app_power_poweroff_pending() || app_mode_get_active() || bsp_motor_is_busy() || app_function_is_hand_busy() - || app_pair_is_active()) { + || app_pair_is_active() + || app_led_need_nosleep()) { return USR_TICK_BLOCK_SLEEP; } return USR_TICK_IDLE;