Files
CCU621M/app/collect_ctrl/led_ctrl.c
T

245 lines
8.4 KiB
C

#include "collect_ctrl/led_ctrl.h"
#include "collect_ctrl/collect_task.h"
#include "flowctrl/flow_interface.h"
#define LED_TYPE (1)
static U8_T g_u8_led_state_cache[GUN_MAX_CNT]; //两把枪指示灯状态缓存(供sub_comm读取)
#if 1 //接口函数
/**
* ************************************************************************
* @brief - 获取枪状态 返回led状态值
*
* @param[in] u8_gunNo - 抢号 0-N
*
* @return E_LED_STATE_TYPE - LED 显示状态
*
* E_LED_TYPE_GREEN_STEADY = 0, //绿灯常亮
* E_LED_TYPE_GREEN_BLINK , //绿灯闪烁
* E_LED_TYPE_RED_STEADY , //红灯常亮
* E_LED_TYPE_RED_BLINK , //红灯闪烁
* E_LED_TYPE_YELLOW_BLINK , //黄灯闪烁
*
* @author jiankalka
* @date 2025-09-05
* ************************************************************************
*/
static E_LED_STATE_TYPE e_led_get_gun_state(U8_T u8_gunNo)
{
E_LED_STATE_TYPE e_ret = E_LED_TYPE_GREEN_STEADY;
E_PILE_STATE_TYPE e_pile_state;
U8_T u8_gunLink = u8_get_gun_yx_data(YX_GUN_LINK,u8_gunNo); //枪连接状态
E_FLOW_REAL_STATE flow_state = (E_FLOW_REAL_STATE)u16_flow_put_data(u8_gunNo , E_FLOW_PUT_DATA_GUN_REAL_STATE,0); //0空闲 1充电启动 2绝缘启动 3绝缘计算完成 4绝缘检测模块停止 5开始预充 6预充完成 7充电中 8BMS通讯超时 9充电停止 10充电停止完成
U8_T u8_fault_num = u8_get_fault_sum(0,0); //整桩故障信息数量
U8_T u8_alarm_num = u8_get_fault_sum(0,1); //整桩告警信息数量
U8_T u8_gun_fault_num = u8_get_fault_sum(u8_gunNo+1,0); //该枪 故障信息数量
U8_T u8_gun_alarm_num = u8_get_fault_sum(u8_gunNo+1,1); //该枪 故障信息数量
if(u8_fault_num != 0 || u8_alarm_num != 0 || //整桩故障 则整桩报告警
u8_gun_fault_num != 0 || u8_gun_alarm_num != 0)
{
e_pile_state = E_PILE_STATE_TYPE_FAULT;//存在故障
}
else if(u8_gunLink == 0)
{
e_pile_state = E_PILE_STATE_TYPE_IDLE; //空闲未插枪
}
else if(flow_state > E_FLOW_REAL_FREE && flow_state < E_FLOW_REAL_CHARGEING) //
{
e_pile_state = E_PILE_STATE_TYPE_STARTING; //启动中
}
else if(flow_state >= E_FLOW_REAL_CHARGEING && flow_state < E_FLOW_REAL_STOP_OK) //
{
e_pile_state = E_PILE_STATE_TYPE_CHARGING; //充电中
}
else //
{
e_pile_state = E_PILE_STATE_TYPE_PLUGGED_NOT_START; //插枪未启动
}
if(g_t_share_data.t_sys_fix_cfg.u_enable.bit_enable.bit_ledGbEn == 0)
{
/*
"黄灯常亮,表示 枪处于空闲状况
红灯常亮,表示 出现故障
绿灯常亮,表示 插枪、充电完成
绿色呼吸灯,表示 准备充电阶段、绝缘检测阶段、充电阶段
若是流水类型,充电中 绿灯流水显示"
*/
switch (e_pile_state)
{
case E_PILE_STATE_TYPE_FAULT : //存在故障
{
e_ret = E_LED_TYPE_RED_STEADY; //存在故障 红灯常亮
break;
}
case E_PILE_STATE_TYPE_IDLE: //空闲未插枪
{
e_ret = E_LED_TYPE_YELLOW_STEADY; //未插枪 黄灯常亮
break;
}
case E_PILE_STATE_TYPE_STARTING: //启动中
{
e_ret = E_LED_TYPE_GREEN_BLINK; //启动中 绿灯闪烁
break;
}
case E_PILE_STATE_TYPE_CHARGING: //充电中
{
if(g_t_share_data.t_sys_fix_cfg.e_ledType == E_LED_TYPE_3)
{
e_ret = E_LED_TYPE_GREEN_RUNNING; //充电中 绿灯流水显示
}
else
{
e_ret = E_LED_TYPE_GREEN_BLINK; //充电中 绿灯闪烁
}
break;
}
case E_PILE_STATE_TYPE_PLUGGED_NOT_START: //插枪未启动
{
e_ret = E_LED_TYPE_GREEN_STEADY ; //插枪未启动 绿灯常量
break;
}
default:
break;
}
}
else
{
/*
故障 黄灯闪烁
空闲未插枪 绿灯常量
启动中 红灯闪烁
充电中 红灯常量,若是流水类型,充电中红灯流水显示
插枪未启动 绿灯闪烁
*/
switch (e_pile_state)
{
case E_PILE_STATE_TYPE_FAULT : //存在故障
{
e_ret = E_LED_TYPE_YELLOW_BLINK; //存在故障 黄灯闪烁
break;
}
case E_PILE_STATE_TYPE_IDLE: //空闲未插枪
{
e_ret = E_LED_TYPE_GREEN_STEADY; //未插枪 绿灯常亮
break;
}
case E_PILE_STATE_TYPE_STARTING: //启动中
{
e_ret = E_LED_TYPE_RED_BLINK; //启动中 红灯闪烁
break;
}
case E_PILE_STATE_TYPE_CHARGING: //充电中
{
if(g_t_share_data.t_sys_fix_cfg.e_ledType == E_LED_TYPE_3)
{
e_ret = E_LED_TYPE_RED_RUNNING; //充电中 红灯流水显示
}
else
{
e_ret = E_LED_TYPE_RED_STEADY; //充电中 红灯常亮
}
break;
}
case E_PILE_STATE_TYPE_PLUGGED_NOT_START: //插枪未启动
{
e_ret = E_LED_TYPE_GREEN_BLINK ; //插枪未启动 绿灯闪烁
break;
}
default:
break;
}
}
return e_ret;
}
#endif
/**
* ************************************************************************
* @brief - LED 控制函数
*
* @param[in] u16_sleepTime - 函数执行周期
*
*
* @author jiankalka
* @date 2025-08-05
* ************************************************************************
*/
void v_led_ctrl(U16_T u16_sleepTime)
{
/*
E_LED_TYPE_GREEN_STEADY = 0, //绿灯常亮
E_LED_TYPE_GREEN_BLINK , //绿灯闪烁
E_LED_TYPE_RED_STEADY , //红灯常亮
E_LED_TYPE_RED_BLINK , //红灯闪烁
E_LED_TYPE_YELLOW_BLINK , //黄灯闪烁
E_LED_TYPE_YELLOW_STEADY , //黄灯常亮
E_LED_TYPE_GREEN_RUNNING , //绿灯流水显示
E_LED_TYPE_RED_RUNNING , //红灯流水显示
E_LED_TYPE_YELLOW_RUNNING , //黄灯流水显示
*/
/* 本项目当前不执行 v_led_do_ctrl() 硬件动作,仅刷新全局状态缓存 */
v_led_state_refresh();
}
/**
* ************************************************************************
* @brief - LED 灯初始化
*
*
*
* @author jiankalka
* @date 2025-08-05
* ************************************************************************
*/
void v_led_init(void)
{
memset(g_u8_led_state_cache, 0, sizeof(g_u8_led_state_cache));
v_led_state_refresh(); /* 上电默认灯态,后续由 SubComm 发 0x04 前周期刷新 */
}
/**
* ************************************************************************
* @brief - 刷新两把枪 LED 状态缓存
*
* @author jiankalka
* @date 2026-04-29
* ************************************************************************
*/
void v_led_state_refresh(void)
{
g_u8_led_state_cache[GUN_A] = (U8_T)e_led_get_gun_state(GUN_A);
g_u8_led_state_cache[GUN_B] = (U8_T)e_led_get_gun_state(GUN_B);
}
/**
* ************************************************************************
* @brief - 获取指定枪 LED 状态缓存
*
* @param[in] u8_gunNo - 枪号 0-N
*
* @return U8_T - LED 状态(E_LED_STATE_TYPE 编码)
*
* @author jiankalka
* @date 2026-04-29
* ************************************************************************
*/
U8_T u8_led_state_get(U8_T u8_gunNo)
{
if (u8_gunNo >= (U8_T)GUN_MAX_CNT)
{
return 0U;
}
return g_u8_led_state_cache[u8_gunNo];
}