226 lines
8.0 KiB
C
226 lines
8.0 KiB
C
/******************************************************************************
|
||
* @file led_manager.c
|
||
* @brief CBR2 红绿 LED 事件表:绿=作业态,红=连接/配网态(规格书第 6 章)
|
||
* @author cyWu <1917507415@qq.com>
|
||
* @date 2026.09.09
|
||
* @version V1.0.0,P0 Bring-up(独立通道,区别于加热垫互斥灯)
|
||
*
|
||
* @note 红绿独立:绿灯事件只动绿灯、红灯事件只动红灯,handler 返回 0
|
||
* 放行另一通道;仅 OTA / 配对失败(PAIR_FAIL)临时占双灯(返回 1)。
|
||
******************************************************************************/
|
||
|
||
#include "led_manager.h"
|
||
#include "system/includes.h"
|
||
#include "bsp_hw.h"
|
||
#include "board_pin.h"
|
||
|
||
static uint8_t led_grn_idle_handler(LED_Config_t *led_config);
|
||
static uint8_t led_grn_spray_handler(LED_Config_t *led_config);
|
||
static uint8_t led_red_paired_handler(LED_Config_t *led_config);
|
||
static uint8_t led_red_pairing_handler(LED_Config_t *led_config);
|
||
static uint8_t led_red_reconn_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_RED)) {
|
||
bsp_led_red_set(state);
|
||
}
|
||
if (led & LED_CHANNEL(LED_CH_GREEN)) {
|
||
bsp_led_green_set(state);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 绿灯常亮(空闲):只动绿灯,放行红灯通道
|
||
* @param led_config 配置
|
||
* @return 0=放行其它优先级
|
||
*/
|
||
static uint8_t led_grn_idle_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @brief 绿灯闪(作业中 500ms):只动绿灯,放行红灯通道
|
||
* @param led_config 配置
|
||
* @return 0=放行其它优先级
|
||
*/
|
||
static uint8_t led_grn_spray_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @brief 红灯常亮(BLE 已连接):只动红灯,放行绿灯通道
|
||
* @param led_config 配置
|
||
* @return 0=放行其它优先级
|
||
*/
|
||
static uint8_t led_red_paired_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @brief 红灯快闪(满 5s 提示 / 配对中 100ms):只动红灯,放行绿灯通道
|
||
* @param led_config 配置
|
||
* @return 0=放行其它优先级
|
||
*/
|
||
static uint8_t led_red_pairing_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @brief 红灯慢闪(已配对未连接 / 重连中 500ms):只动红灯,放行绿灯
|
||
* @param led_config 配置
|
||
* @return 0=放行其它优先级
|
||
*/
|
||
static uint8_t led_red_reconn_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 0;
|
||
}
|
||
|
||
/**
|
||
* @brief 配对失败红绿交替 3s:到点自删,交回双通道常态
|
||
* @param led_config 配置
|
||
* @return 1=占双灯,0=已自删
|
||
*/
|
||
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 0;
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
/**
|
||
* @brief OTA 红绿交替(无限):最高优先级,拦下其它一切
|
||
* @param led_config 配置
|
||
* @return 1
|
||
*/
|
||
static uint8_t led_ota_handler(LED_Config_t *led_config)
|
||
{
|
||
(void)LED_Update(led_config);
|
||
return 1;
|
||
}
|
||
|
||
/**
|
||
* @brief 注册回调并装载 CBR2 事件表(GPIO 已在 bsp_hw_init)
|
||
* @note 事件枚举数值 = 事件表下标(led.c LED_EventDelete 依赖)
|
||
* @return 无
|
||
*/
|
||
void user_led_init(void)
|
||
{
|
||
static LED_EventTableItem_t led_event_category[LED_EVENT_MAX] = {
|
||
[LED_EVENT_GRN_IDLE] = {
|
||
/* 空闲(DP1=0):绿灯常亮,不碰红灯 */
|
||
.event = LED_EVENT_GRN_IDLE,
|
||
.priority = PRIORITY_1,
|
||
.config.ledMask = LED_CHANNEL(LED_CH_GREEN),
|
||
.config.state = LED_LIGHT,
|
||
.config.runNum = 0, /* 0=一直亮 */
|
||
.ledEventHandler = led_grn_idle_handler,
|
||
},
|
||
[LED_EVENT_GRN_SPRAY] = {
|
||
/* 作业中(含间隔等待):绿灯 500ms 闪,不碰红灯 */
|
||
.event = LED_EVENT_GRN_SPRAY,
|
||
.priority = PRIORITY_1,
|
||
.config.ledMask = LED_CHANNEL(LED_CH_GREEN),
|
||
.config.state = LED_BLINKING,
|
||
.config.blinkParams.orDer = 0,
|
||
.config.blinkParams.onTime = BOARD_LED_SPRAY_ON_MS,
|
||
.config.blinkParams.offTime = BOARD_LED_SPRAY_OFF_MS,
|
||
.config.runNum = 0,
|
||
.ledEventHandler = led_grn_spray_handler,
|
||
},
|
||
[LED_EVENT_RED_PAIRED] = {
|
||
/* BLE 已连接:红灯常亮,不碰绿灯 */
|
||
.event = LED_EVENT_RED_PAIRED,
|
||
.priority = PRIORITY_2,
|
||
.config.ledMask = LED_CHANNEL(LED_CH_RED),
|
||
.config.state = LED_LIGHT,
|
||
.config.runNum = 0,
|
||
.ledEventHandler = led_red_paired_handler,
|
||
},
|
||
[LED_EVENT_RED_PAIRING] = {
|
||
/* 配网键满 5s 提示 / 配对进行中:红灯 100ms 快闪,不碰绿灯 */
|
||
.event = LED_EVENT_RED_PAIRING,
|
||
.priority = PRIORITY_2,
|
||
.config.ledMask = LED_CHANNEL(LED_CH_RED),
|
||
.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_red_pairing_handler,
|
||
},
|
||
[LED_EVENT_RED_RECONN] = {
|
||
/* 已配对未连接(上电重连 / 断连):红灯 500ms 慢闪,不碰绿灯 */
|
||
.event = LED_EVENT_RED_RECONN,
|
||
.priority = PRIORITY_2,
|
||
.config.ledMask = LED_CHANNEL(LED_CH_RED),
|
||
.config.state = LED_BLINKING,
|
||
.config.blinkParams.orDer = 0,
|
||
.config.blinkParams.onTime = BOARD_LED_RECONN_ON_MS,
|
||
.config.blinkParams.offTime = BOARD_LED_RECONN_OFF_MS,
|
||
.config.runNum = 0,
|
||
.ledEventHandler = led_red_reconn_handler,
|
||
},
|
||
[LED_EVENT_PAIR_FAIL] = {
|
||
/* 配对失败:红绿交替 3s 后自删(半周期 BOARD_LED_PAIR_FAIL_MS) */
|
||
.event = LED_EVENT_PAIR_FAIL,
|
||
.priority = PRIORITY_3,
|
||
.config.ledMask = (uint16_t)(LED_CHANNEL(LED_CH_RED) | LED_CHANNEL(LED_CH_GREEN)),
|
||
.config.state = LED_ALTERNATING_BLINK,
|
||
.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_PAIR_FAIL_MS * 2u),
|
||
.config.runNum = (uint16_t)((BOARD_LED_PAIR_FAIL_HOLD_MS
|
||
+ (BOARD_LED_PAIR_FAIL_MS * 2u) - 1u)
|
||
/ (BOARD_LED_PAIR_FAIL_MS * 2u)),
|
||
.ledEventHandler = led_pair_fail_handler,
|
||
},
|
||
[LED_EVENT_OTA] = {
|
||
/* OTA:红绿交替一直闪(200ms 半周期),直到升级结束/复位 */
|
||
.event = LED_EVENT_OTA,
|
||
.priority = PRIORITY_4,
|
||
.config.ledMask = (uint16_t)(LED_CHANNEL(LED_CH_RED) | LED_CHANNEL(LED_CH_GREEN)),
|
||
.config.state = LED_ALTERNATING_BLINK,
|
||
.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_OTA_ON_MS
|
||
+ 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_all_off();
|
||
}
|
||
|
||
/**
|
||
* @brief 跑一轮 LED 事件
|
||
* @return 无
|
||
*/
|
||
void user_led_handle(void)
|
||
{
|
||
LED_EventHandle();
|
||
}
|