feat: 绿灯行为 — 自检慢闪 + 车辆存在指示

- 自检阶段 (loop1_INI_LOOP 或线圈未稳定): 绿灯慢闪 (500ms)
- 正常工作: 有车亮, 无车灭
- 绿灯统一由 TMR15 ISR poll_green_led() 驱动, 单点控制
- 移除 vd1_task 和 loop_task 中所有手动 LEDB_ON/OFF
- 移除线圈重连时的 6 次绿灯闪烁 (由黄灯故障码替代)
This commit is contained in:
wangfq
2026-06-23 13:55:53 +08:00
parent f61e2e3cc0
commit f59baac571
2 changed files with 38 additions and 12 deletions

View File

@@ -143,6 +143,7 @@ uint8_t update_moving_average(uint32_t* p_sum, uint16_t* p_cnt,
uint32_t* p_origin, uint32_t new_value,
uint8_t window);
void poll_yellow_led(void);
void poll_green_led(void);
void LEDA_ON_OFF(void);
void vd1_task(void);

View File

@@ -183,6 +183,41 @@ void LEDA_ON_OFF(void)
LED_RED_GPIO->odt ^= LED_RED_PIN;
}
/*===========================================================================
* 绿灯指示 (LEDB, PA9)
*
* 由 TMR15 ISR 每 5ms 驱动一次,是绿灯的唯一控制入口。
*
* 模式:
* 自检中 (loop1_INI_LOOP==1 或 线圈未稳定):
* → 慢闪 (500ms 亮 / 500ms 灭)
* 正常工作:
* → 有车亮 (VD_FLAG==1), 无车灭
*===========================================================================*/
void poll_green_led(void)
{
#define GREEN_SLOW_HALF 100 // 500ms (100 × 5ms)
static uint16_t _slow_tick = 0;
/*--- 自检阶段:慢闪 ---*/
if (loop1_INI_LOOP || !g_loop_power_up_state) {
_slow_tick++;
if (_slow_tick >= GREEN_SLOW_HALF) {
_slow_tick = 0;
LED_GREEN_GPIO->odt ^= LED_GREEN_PIN; // toggle
}
return;
}
/*--- 正常工作:车辆存在指示 ---*/
_slow_tick = 0;
if (loop1_VD_FLAG)
LEDB_ON;
else
LEDB_OFF;
}
/*===========================================================================
* 黄灯故障指示 (LEDC, PA10)
*
@@ -535,8 +570,9 @@ void TMR15_GLOBAL_IRQHandler(void)
loop1_LOOP_OK = 0;
}
/*--- 硬件驱动:呼吸灯 + 故障灯 ---*/
/*--- 硬件驱动:呼吸灯 + 指示灯 ---*/
poll_red_pwm();
poll_green_led();
poll_yellow_led();
tmr_flag_clear(TMR15, TMR_OVF_FLAG);
@@ -578,7 +614,6 @@ void vd1_task(void)
loop1_VD_FLAG = 1;
loop1_FLAG_IN = 1;
LEDB_ON;
/* 有限存在计时(非安全复位模式下) */
if (!SET_SAFE) {
@@ -613,7 +648,6 @@ void vd1_task(void)
loop1_FLAG_OUT = 1;
loop1_VD_HOLD = 0;
loop1_LC_HOLD = 0;
LEDB_OFF;
loop1_ORG_CNT = 0;
loop1_ORG_SUM = 0;
@@ -642,14 +676,6 @@ void loop_task_function(void *pvParameters)
if (loop1_LOOP_OK) {
/*--- 线圈重连 ---*/
if (!loop1_LOOP_OK0) {
/* 线圈恢复:绿灯闪烁提示 */
int i;
for (i = 0; i < 6; i++) {
LEDB_ON;
vTaskDelay(200);
LEDB_OFF;
vTaskDelay(200);
}
loop1_LOOP_OK0 = 1;
g_disconnect_active = 0; // 重连,清除断开标记
}
@@ -673,7 +699,6 @@ void loop_task_function(void *pvParameters)
loop1_VD_FLAG = 0;
RLY1_OFF;
RLY2_OFF;
LEDB_OFF;
/*
* 断开计数规则: