新增 usr_app 产品逻辑:手动>定时>条件仲裁、条件控温湿、定时任务、数码管显示、 按键/LED、风扇档位、NVM 掉电恢复、配对与开关机,上电按规格恢复上次状态。 新增 usr_periph:AHT20、CT1642、板级引脚与硬件封装;见宝协议 cond_config 改为 7 字节编解码,并接入产品 DP。 补充《温湿度风扇_固件需求规格书》,工程加入对应源文件。 .gitignore 忽略 WorkBuddy/Cursor 本地会话
144 lines
3.3 KiB
C
144 lines
3.3 KiB
C
/******************************************************************************
|
||
* @file app_led.c
|
||
* @brief CBR3 灯效适配:单灯 PC2,OTA/配对/常亮
|
||
* @author cyWu <1917507415@qq.com>
|
||
* @date 2026.08.29
|
||
* @version V1.0.0
|
||
* @history
|
||
* - V1.0.0, 2026.08.29, cyWu, 首次发布(移植门夹,删红绿双通道/充电/低电/空电)
|
||
******************************************************************************/
|
||
|
||
#include "app_led.h"
|
||
#include "led_manager.h"
|
||
#include "bsp_hw.h"
|
||
#include "board_pin.h"
|
||
#include "app_pair.h"
|
||
|
||
static uint8_t s_initialized;
|
||
static uint8_t s_ota; /* 1=OTA 灯效中,app_led_run 不再叠其它灯 */
|
||
|
||
/**
|
||
* @brief 重新播放一次「一次性/限时」灯效,让它从第 0 帧重新开始
|
||
* @note 先 Delete 清空槽位再 Add,强制重新计时(见 led.c LED_EventAdd 语义)
|
||
* @param evt 要重启的事件
|
||
* @return 无
|
||
*/
|
||
static void led_restart(LED_Event_t evt)
|
||
{
|
||
LED_EventDelete(evt);
|
||
LED_EventAdd(evt);
|
||
}
|
||
|
||
/**
|
||
* @brief 灯效初始化
|
||
* @return APP_LED_OK=成功
|
||
*/
|
||
AppLed_Ret_t app_led_init(void)
|
||
{
|
||
if (s_initialized) {
|
||
return APP_LED_OK;
|
||
}
|
||
user_led_init();
|
||
s_initialized = 1;
|
||
return APP_LED_OK;
|
||
}
|
||
|
||
/**
|
||
* @brief 查询模块是否已初始化
|
||
* @return APP_LED_OK=已初始化,APP_LED_ERR_NOT_INIT=未初始化
|
||
*/
|
||
AppLed_Ret_t app_led_get_status(void)
|
||
{
|
||
return s_initialized ? APP_LED_OK : APP_LED_ERR_NOT_INIT;
|
||
}
|
||
|
||
/**
|
||
* @brief 重新挂开机常亮
|
||
* @return 无
|
||
*/
|
||
void app_led_hint_power_on(void)
|
||
{
|
||
if (!s_initialized || s_ota) {
|
||
return;
|
||
}
|
||
led_restart(LED_EVENT_STANDBY);
|
||
}
|
||
|
||
/**
|
||
* @brief 进入 OTA:清掉其它灯,挂 200ms 闪一直闪
|
||
* @return 无
|
||
*/
|
||
void app_led_request_ota(void)
|
||
{
|
||
if (!s_initialized) {
|
||
return;
|
||
}
|
||
s_ota = 1;
|
||
LED_EventAllDelete();
|
||
bsp_led_set(0);
|
||
LED_EventAdd(LED_EVENT_OTA);
|
||
}
|
||
|
||
/**
|
||
* @brief 查询是否处于 OTA 灯效
|
||
* @return 1=OTA 灯效中,0=否
|
||
*/
|
||
uint8_t app_led_is_ota(void)
|
||
{
|
||
return s_ota;
|
||
}
|
||
|
||
/**
|
||
* @brief 按优先级刷新灯
|
||
* @param dt 距上次调用的毫秒数
|
||
* @param power_on 1=开机态(挂常亮),0=关机态(灯灭)
|
||
* @return 无
|
||
*/
|
||
void app_led_run(uint16_t dt, uint8_t power_on)
|
||
{
|
||
AppPairEvt_t pair_evt;
|
||
|
||
if (!s_initialized) {
|
||
return;
|
||
}
|
||
|
||
/* OTA 期间只跑 200ms 闪 */
|
||
if (s_ota) {
|
||
LED_EventAdd(LED_EVENT_OTA);
|
||
user_led_handle();
|
||
return;
|
||
}
|
||
|
||
/* 配对成功/失败是边沿事件,只在那一拍切灯效 */
|
||
pair_evt = app_pair_tick_1ms(dt);
|
||
if (pair_evt == APP_PAIR_EVT_OK) {
|
||
LED_EventDelete(LED_EVENT_PAIRING);
|
||
led_restart(LED_EVENT_PAIR_OK);
|
||
} else if (pair_evt == APP_PAIR_EVT_FAIL) {
|
||
LED_EventDelete(LED_EVENT_PAIRING);
|
||
led_restart(LED_EVENT_PAIR_FAIL);
|
||
}
|
||
|
||
if (!power_on) {
|
||
LED_EventDelete(LED_EVENT_STANDBY);
|
||
LED_EventDelete(LED_EVENT_PAIRING);
|
||
} else if (app_pair_is_active()) {
|
||
LED_EventAdd(LED_EVENT_PAIRING);
|
||
LED_EventDelete(LED_EVENT_STANDBY);
|
||
} else if (!LED_IsEventExist(LED_EVENT_PAIR_OK) && !LED_IsEventExist(LED_EVENT_PAIR_FAIL)) {
|
||
LED_EventAdd(LED_EVENT_STANDBY);
|
||
}
|
||
|
||
user_led_handle();
|
||
}
|
||
|
||
/**
|
||
* @brief 清空全部灯事件并灭灯
|
||
* @return 无
|
||
*/
|
||
void app_led_clear(void)
|
||
{
|
||
LED_EventAllDelete();
|
||
bsp_led_set(0);
|
||
}
|