#include "collect_ctrl/yk_ctrl.h" #include "usart.h" #include "sys_drv_init.h" #include "sub_comm/sub_comm_task.h" #include /* 遥控通道总数自动跟随枚举 E_YK_CTRL_TYPE。 */ #define YK_DATA_NUM ((U8_T)E_KY_TYPE_NUM) /* 遥控缓存区: * - u8_data[] 便于按索引批量扫描执行; * - s_yk_data 便于按“语义字段”点对点写入; * 两者共用同一块内存,用于“写入命令”和“周期执行命令”的桥接。 */ typedef union { /* 按枚举下标访问的原始命令缓存。 */ U8_T u8_data[YK_DATA_NUM]; struct { E_CMD e_ctrl_dc_cont1; /* 直流接触器1(一枪主回路)。 */ E_CMD e_ctrl_dc_cont2; /* 直流接触器2(二枪主回路)。 */ E_CMD e_ctrl_dc_bus; /* 直流母联接触器。 */ E_CMD e_ctrl_ac_cont; /* 交流接触器。 */ E_CMD e_ctrl_fan; /* 散热风机。 */ E_CMD e_ctrl_relief_a; /* A枪泄放控制。 */ E_CMD e_ctrl_relief_b; /* B枪泄放控制。 */ E_CMD e_ctrl_lock1; /* 枪A电子锁。 */ E_CMD e_ctrl_lock2; /* 枪B电子锁。 */ E_CMD e_ctrl_aux_power1; /* 辅源1。 */ E_CMD e_ctrl_aux_power2; /* 辅源2。 */ E_CMD e_ctrl_v12_24_sw; /* 12/24V切换控制。 */ E_CMD e_ctrl_ac1; /* 模块交流接触器1。 */ E_CMD e_ctrl_ac2; /* 模块交流接触器2。 */ } s_yk_data; } U_YK_CTRL_DATA; /* 遥控命令全局缓存(模块私有): * - 写入口:v_yk_ctrl_impl() * - 执行入口:v_yk_ctrl_cheak() * 当前由采集任务周期调用,默认单任务上下文访问。 */ static U_YK_CTRL_DATA u_yk_data; /** * @brief 周期执行遥控缓存中的全部命令。 * * 执行策略: * 1) 按 E_YK_CTRL_TYPE 的顺序遍历; * 2) 将缓存命令传入 v_yk_ctrl() 下发到 DO; * 3) 不在本函数中清命令,保持“电平保持型”行为。 */ void v_yk_ctrl_cheak(void) { U8_T i; for (i = 0; i < YK_DATA_NUM; i++) { v_yk_ctrl((E_YK_CTRL_TYPE)i, (E_CMD)u_yk_data.u8_data[i]); //依次执行遥控命令 } } /** * @brief 将指定遥控类型下发到具体硬件 DO。 * * @param e_type 遥控类型(决定映射到哪个 DO)。 * @param e_cmd 遥控命令(开/关)。 * * 说明: * - 本函数只负责“硬件动作”; * - 命令缓存维护由 v_yk_ctrl_impl() 负责。 */ void v_yk_ctrl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd) { switch (e_type) { case E_KY_TYPE_DC_CONT1: /* 直流接触器1 */ { DO3(e_cmd); break; } case E_KY_TYPE_DC_CONT2: /* 直流接触器2 */ { DO6(e_cmd); break; } case E_KY_TYPE_DC_CONT_BUS: /* 母联接触器 */ { DO9(e_cmd); break; } case E_KY_TYPE_AC_CONT: /* 交流接触器 */ { DO7(e_cmd); break; } case E_KY_TYPE_FAN_CONT: /* 风扇接触器 */ { DO10(e_cmd); break; } case E_KY_TYPE_RELIEF_A: /* A枪泄放控制 */ { DO2(e_cmd); break; } case E_KY_TYPE_RELIEF_B: /* B枪泄放控制 */ { DO5(e_cmd); break; } case E_KY_TYPE_GUN_LOCK1: /* 枪A电子锁 */ { ELOCK_A(e_cmd); break; } case E_KY_TYPE_GUN_LOCK2: /* 枪B电子锁 */ { ELOCK_B(e_cmd); break; } case E_KY_TYPE_AUX_POWER1: /* 辅源1 */ { /* 辅源1: */ DO1(e_cmd); break; } case E_KY_TYPE_AUX_POWER2: /* 辅源2 */ { /* 辅源2: */ DO4(e_cmd); break; } case E_KY_TYPE_V12_24_SWITCH: /* 12/24V切换控制 */ { /* 12/24V切换:下发到副板 DO11 */ v_sub_comm_yk_set(E_SUB_YK_DO11, e_cmd); break; } case E_KY_TYPE_AC1: /* 交流接触器1,主板 DO7 */ { DO7(e_cmd); break; } case E_KY_TYPE_AC2: /* 交流接触器2,主板 DO8 */ { DO8(e_cmd); break; } default: break; } } /** * @brief 外部遥控写入接口(仅更新缓存,不直接动作)。 * * @param e_type 遥控类型。 * @param e_cmd 遥控命令。 * * 使用方式: * - 上层流程调用本函数写入命令; * - 采集任务周期调用 v_yk_ctrl_cheak() 统一执行; * 这样可以把遥控执行节拍收敛到单任务上下文,降低并发风险。 */ static void v_yk_cache_set(E_YK_CTRL_TYPE e_type, E_CMD e_cmd) { switch (e_type) { case E_KY_TYPE_DC_CONT1: /* 直流接触器1 */ { u_yk_data.s_yk_data.e_ctrl_dc_cont1 = e_cmd; break; } case E_KY_TYPE_DC_CONT2: /* 直流接触器2 */ { u_yk_data.s_yk_data.e_ctrl_dc_cont2 = e_cmd; break; } case E_KY_TYPE_DC_CONT_BUS: /* 母联接触器 */ { u_yk_data.s_yk_data.e_ctrl_dc_bus = e_cmd; break; } case E_KY_TYPE_AC_CONT: /* 交流接触器 */ { u_yk_data.s_yk_data.e_ctrl_ac_cont = e_cmd; break; } case E_KY_TYPE_FAN_CONT: /* 风扇接触器 */ { u_yk_data.s_yk_data.e_ctrl_fan = e_cmd; break; } case E_KY_TYPE_RELIEF_A: /* A枪泄放控制 */ { u_yk_data.s_yk_data.e_ctrl_relief_a = e_cmd; break; } case E_KY_TYPE_RELIEF_B: /* B枪泄放控制 */ { u_yk_data.s_yk_data.e_ctrl_relief_b = e_cmd; break; } case E_KY_TYPE_GUN_LOCK1: /* 枪A电子锁 */ { u_yk_data.s_yk_data.e_ctrl_lock1 = e_cmd; break; } case E_KY_TYPE_GUN_LOCK2: /* 枪B电子锁 */ { u_yk_data.s_yk_data.e_ctrl_lock2 = e_cmd; break; } case E_KY_TYPE_AUX_POWER1: /* 辅源1 */ { u_yk_data.s_yk_data.e_ctrl_aux_power1 = e_cmd; break; } case E_KY_TYPE_AUX_POWER2: /* 辅源2 */ { u_yk_data.s_yk_data.e_ctrl_aux_power2 = e_cmd; break; } case E_KY_TYPE_V12_24_SWITCH: /* 12/24V切换控制 */ { u_yk_data.s_yk_data.e_ctrl_v12_24_sw = e_cmd; break; } case E_KY_TYPE_AC1: /* 模块交流接触器1 */ { u_yk_data.s_yk_data.e_ctrl_ac1 = e_cmd; break; } case E_KY_TYPE_AC2: /* 模块交流接触器2 */ { u_yk_data.s_yk_data.e_ctrl_ac2 = e_cmd; break; } default: break; } } /** * @brief 遥控模块初始化。 * * 初始化互斥锁并清空所有遥控命令缓存,确保上电后不携带历史控制状态。 */ void v_yk_ctrl_init(void) { memset(&u_yk_data, 0, sizeof(U_YK_CTRL_DATA)); } /** * @brief 立即执行遥控(更新缓存并下发 DO)。 * * @param e_type 遥控类型。 * @param e_cmd 遥控命令。 */ void v_yk_ctrl_impl(E_YK_CTRL_TYPE e_type, E_CMD e_cmd) { //更新控制命令状态 v_yk_cache_set(e_type, e_cmd); //执行控制命令 v_yk_ctrl(e_type, e_cmd); } /** * @brief 获取遥控命令缓存中的对应控制状态。 * * @param e_type 遥控类型。 * @return E_CMD 遥控命令。 */ E_CMD e_yk_get_ctrl_cmd(E_YK_CTRL_TYPE e_type) { if (e_type < E_KY_TYPE_NUM) { return (E_CMD)u_yk_data.u8_data[e_type]; } return CMD_OFF; }