P0功能已实现,按键、LED、过零检测、配网、OTA都已正常实现
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
/******************************************************************************
|
||||
* @file led_manager.c
|
||||
* @brief CBR1 红绿 LED 事件表:跟继电器 / 配对 / OTA(规格书第 6 章)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.04
|
||||
* @version V1.0.0,P0 Bring-up(由门夹双通道事件表裁剪:删电池/充电/模式事件)
|
||||
*
|
||||
* @note 加热垫红绿互斥(一次只一种图案),高事件(配对/结果/OTA)添加前
|
||||
* app_led 层先全清事件+灭灯;事件结束自删后 app_led_run 按继电器
|
||||
* 实际态自动重新挂 HEAT 事件。
|
||||
******************************************************************************/
|
||||
|
||||
#include "led_manager.h"
|
||||
#include "system/includes.h"
|
||||
#include "bsp_hw.h"
|
||||
#include "board_pin.h"
|
||||
|
||||
static uint8_t led_heat_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_RED)) {
|
||||
bsp_led_red_set(state);
|
||||
}
|
||||
if (led & LED_CHANNEL(LED_CH_GREEN)) {
|
||||
bsp_led_green_set(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 跟继电器常亮:返回 1 占住最低槽
|
||||
* @param led_config 配置
|
||||
* @return 1
|
||||
*/
|
||||
static uint8_t led_heat_handler(LED_Config_t *led_config)
|
||||
{
|
||||
(void)LED_Update(led_config);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配对绿快闪(无限):返回 1 拦下更低优先级,配对期间只此一灯
|
||||
* @param led_config 配置
|
||||
* @return 1
|
||||
*/
|
||||
static uint8_t led_pairing_handler(LED_Config_t *led_config)
|
||||
{
|
||||
(void)LED_Update(led_config);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配对成功常绿若干秒:到点自删,灯交回 app_led_run
|
||||
* @param led_config 配置
|
||||
* @return 1=还在亮,0=已自删
|
||||
*/
|
||||
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 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配对失败红绿交替若干秒:到点自删
|
||||
* @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 注册回调并装载 CBR1 事件表(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_HEAT_OFF] = {
|
||||
/* 加热关(实际断开):绿灯常亮,红灯灭 */
|
||||
.event = LED_EVENT_HEAT_OFF,
|
||||
.priority = PRIORITY_1,
|
||||
.config.ledMask = LED_CHANNEL(LED_CH_GREEN),
|
||||
.config.state = LED_LIGHT,
|
||||
.config.runNum = 0, /* 0=一直亮 */
|
||||
.ledEventHandler = led_heat_handler,
|
||||
},
|
||||
[LED_EVENT_HEAT_ON] = {
|
||||
/* 加热开(实际吸合):红灯常亮,绿灯灭 */
|
||||
.event = LED_EVENT_HEAT_ON,
|
||||
.priority = PRIORITY_1,
|
||||
.config.ledMask = LED_CHANNEL(LED_CH_RED),
|
||||
.config.state = LED_LIGHT,
|
||||
.config.runNum = 0,
|
||||
.ledEventHandler = led_heat_handler,
|
||||
},
|
||||
[LED_EVENT_PAIRING] = {
|
||||
/* 按住满5s提示 / 配对中:绿灯 100ms 快闪(红灯由 app_led 层保证灭) */
|
||||
.event = LED_EVENT_PAIRING,
|
||||
.priority = PRIORITY_2,
|
||||
.config.ledMask = LED_CHANNEL(LED_CH_GREEN),
|
||||
.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] = {
|
||||
/* 配对成功:绿灯常亮 3s 后回跟继电器 */
|
||||
.event = LED_EVENT_PAIR_OK,
|
||||
.priority = PRIORITY_2,
|
||||
.config.ledMask = LED_CHANNEL(LED_CH_GREEN),
|
||||
.config.state = LED_LIGHT,
|
||||
.config.runNum = (uint16_t)((BOARD_LED_PAIR_OK_MS + 999u) / 1000u),
|
||||
.ledEventHandler = led_pair_ok_handler,
|
||||
},
|
||||
[LED_EVENT_PAIR_FAIL] = {
|
||||
/* 配对失败:红绿交替 3s 后回跟继电器(半周期 BOARD_LED_ALT_MS) */
|
||||
.event = LED_EVENT_PAIR_FAIL,
|
||||
.priority = PRIORITY_2,
|
||||
.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_ALT_MS * 2u),
|
||||
.config.runNum = (uint16_t)((BOARD_LED_PAIR_FAIL_MS + (BOARD_LED_ALT_MS * 2u) - 1u)
|
||||
/ (BOARD_LED_ALT_MS * 2u)),
|
||||
.ledEventHandler = led_pair_fail_handler,
|
||||
},
|
||||
[LED_EVENT_OTA] = {
|
||||
/* OTA:红绿交替一直闪(200ms 半周期),直到升级结束/复位 */
|
||||
.event = LED_EVENT_OTA,
|
||||
.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_ALT_MS * 2u),
|
||||
.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();
|
||||
}
|
||||
Reference in New Issue
Block a user