/****************************************************************************** * @file led_manager.c * @brief CBR3 灯事件:单灯 PC2,高优先级覆盖低优先级 * @author cyWu <1917507415@qq.com> * @date 2026.08.29 * @version V1.0.0,首次发布(移植门夹,删红绿双通道改单灯) * * @note 灯效优先级(见规格书第 6 章,高者覆盖): * OTA(200ms 闪) > 配对中(100ms 快闪) / 配对结果 > 正常开机常亮。 * 单灯无充电/低电/空电事件。 ******************************************************************************/ #include "led_manager.h" #include "system/includes.h" #include "bsp_hw.h" #include "board_pin.h" static uint8_t led_keep_handler(LED_Config_t *led_config); static uint8_t led_standby_handler(LED_Config_t *led_config); static uint8_t led_pairing_handler(LED_Config_t *led_config); static uint8_t led_pair_ok_handler(LED_Config_t *led_config); static uint8_t led_pair_fail_handler(LED_Config_t *led_config); static uint8_t led_ota_handler(LED_Config_t *led_config); /** * @brief 只改掩码里的通道(单灯即唯一通道) * @param led 通道掩码 * @param state LED_ON / LED_OFF * @return 无 */ static void set_led_multi(uint16_t led, uint8_t state) { if (led & LED_CHANNEL(LED_CH_ON)) { bsp_led_set(state); } } /** * @brief 常亮/闪烁一直跑:返回 1 独占,单灯不允许叠加 * @param led_config 配置 * @return 1 */ static uint8_t led_keep_handler(LED_Config_t *led_config) { (void)LED_Update(led_config); return 1; } /** * @brief 待机常亮;runNum>0 时亮满后删事件 * @param led_config 配置 * @return 1 */ static uint8_t led_standby_handler(LED_Config_t *led_config) { if (LED_Update(led_config) == 0) { LED_EventDelete(LED_EVENT_STANDBY); } return 1; } /** * @brief 配对快闪(无限) * @param led_config 配置 * @return 1 */ static uint8_t led_pairing_handler(LED_Config_t *led_config) { (void)LED_Update(led_config); return 1; } /** * @brief 配对成功常亮若干秒后删事件 * @param led_config 配置 * @return 1 */ static uint8_t led_pair_ok_handler(LED_Config_t *led_config) { if (LED_Update(led_config) == 0) { LED_EventDelete(LED_EVENT_PAIR_OK); } return 1; } /** * @brief 配对失败 200ms 闪若干秒后删事件 * @param led_config 配置 * @return 1 */ static uint8_t led_pair_fail_handler(LED_Config_t *led_config) { if (LED_Update(led_config) == 0) { LED_EventDelete(LED_EVENT_PAIR_FAIL); } return 1; } /** * @brief OTA 200ms 闪(无限):最高优先级 * @param led_config 配置 * @return 1 */ static uint8_t led_ota_handler(LED_Config_t *led_config) { (void)LED_Update(led_config); return 1; } /** * @brief 注册回调并装载 CBR3 事件表(GPIO 已在 bsp_hw_init) * @return 无 */ void user_led_init(void) { static LED_EventTableItem_t led_event_category[LED_EVENT_MAX] = { [LED_EVENT_STANDBY] = { /* 正常开机常亮 */ .event = LED_EVENT_STANDBY, .priority = PRIORITY_1, .config.ledMask = LED_CHANNEL(LED_CH_ON), .config.state = LED_LIGHT, #if BOARD_LED_STANDBY_ON .config.runNum = 0, /* 0=一直亮 */ #else .config.runNum = 1, #endif .ledEventHandler = led_standby_handler, }, [LED_EVENT_PAIRING] = { /* 配对中 100ms 快闪(无限) */ .event = LED_EVENT_PAIRING, .priority = PRIORITY_2, .config.ledMask = LED_CHANNEL(LED_CH_ON), .config.state = LED_BLINKING, .config.blinkParams.orDer = 0, .config.blinkParams.onTime = BOARD_LED_FAST_ON_MS, .config.blinkParams.offTime = BOARD_LED_FAST_OFF_MS, .config.runNum = 0, .ledEventHandler = led_pairing_handler, }, [LED_EVENT_PAIR_OK] = { /* 配对成功常亮若干秒(允许直接回到常亮) */ .event = LED_EVENT_PAIR_OK, .priority = PRIORITY_2, .config.ledMask = LED_CHANNEL(LED_CH_ON), .config.state = LED_LIGHT, .config.runNum = (uint16_t)((BOARD_LED_PAIR_OK_MS + 999u) / 1000u), .ledEventHandler = led_pair_ok_handler, }, [LED_EVENT_PAIR_FAIL] = { /* 配对失败 200ms 闪提示若干秒 */ .event = LED_EVENT_PAIR_FAIL, .priority = PRIORITY_2, .config.ledMask = LED_CHANNEL(LED_CH_ON), .config.state = LED_BLINKING, .config.blinkParams.orDer = 0, .config.blinkParams.onTime = BOARD_LED_OTA_ON_MS, .config.blinkParams.offTime = BOARD_LED_OTA_OFF_MS, .config.runNum = (uint16_t)(BOARD_LED_PAIR_FAIL_MS / (BOARD_LED_OTA_ON_MS + BOARD_LED_OTA_OFF_MS)), .ledEventHandler = led_pair_fail_handler, }, [LED_EVENT_OTA] = { /* OTA:200ms 闪一直闪,直到升级结束或复位 */ .event = LED_EVENT_OTA, .priority = PRIORITY_3, .config.ledMask = LED_CHANNEL(LED_CH_ON), .config.state = LED_BLINKING, .config.blinkParams.orDer = 0, .config.blinkParams.onTime = BOARD_LED_OTA_ON_MS, .config.blinkParams.offTime = BOARD_LED_OTA_OFF_MS, .config.runNum = 0, /* 0=无限 */ .ledEventHandler = led_ota_handler, }, }; LED_SetStateInit(set_led_multi); SET_TimeGetInit((TIME_Get_t)timer_get_ms); LED_EventTableInit(led_event_category); bsp_led_set(0); } /** * @brief 跑一轮 LED 事件 * @return 无 */ void user_led_handle(void) { LED_EventHandle(); }