#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]; }