Files
JBao_Temp_Humi_Fan_FW/apps/usr_app/led_manager.c
T
wuchuyuan 5cc7e9dbd6 接入温湿度风扇产品固件(仲裁/条件/定时/显示),并补齐规格书与外设驱动
新增 usr_app 产品逻辑:手动>定时>条件仲裁、条件控温湿、定时任务、数码管显示、
按键/LED、风扇档位、NVM 掉电恢复、配对与开关机,上电按规格恢复上次状态。
新增 usr_periph:AHT20、CT1642、板级引脚与硬件封装;见宝协议 cond_config
改为 7 字节编解码,并接入产品 DP。
补充《温湿度风扇_固件需求规格书》,工程加入对应源文件。
.gitignore 忽略 WorkBuddy/Cursor 本地会话
2026-08-31 15:17:27 +08:00

194 lines
5.8 KiB
C
Raw 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 CBR3 灯事件:单灯 PC2,高优先级覆盖低优先级
* @author cyWu <1917507415@qq.com>
* @date 2026.08.29
* @version V1.0.0
* @history
* - V1.0.0, 2026.08.29, cyWu, 首次发布(移植门夹,删红绿双通道改单灯)
*
* @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();
}