新增 usr_app 产品逻辑:手动>定时>条件仲裁、条件控温湿、定时任务、数码管显示、 按键/LED、风扇档位、NVM 掉电恢复、配对与开关机,上电按规格恢复上次状态。 新增 usr_periph:AHT20、CT1642、板级引脚与硬件封装;见宝协议 cond_config 改为 7 字节编解码,并接入产品 DP。 补充《温湿度风扇_固件需求规格书》,工程加入对应源文件。 .gitignore 忽略 WorkBuddy/Cursor 本地会话
194 lines
5.8 KiB
C
194 lines
5.8 KiB
C
/******************************************************************************
|
||
* @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();
|
||
}
|