Files
wuchuyuan 0dd65e1552 1、喷淋器 P1/P2功能实现
2、红灯按连接态慢闪
2026-09-09 19:57:00 +08:00

226 lines
8.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************************************************
* @file led_manager.c
* @brief CBR2 红绿 LED 事件表:绿=作业态,红=连接/配网态(规格书第 6 章)
* @author cyWu <1917507415@qq.com>
* @date 2026.09.09
* @version V1.0.0P0 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();
}