9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
306 lines
8.0 KiB
C
306 lines
8.0 KiB
C
#include "collect_ctrl/yk_ctrl.h"
|
||
|
||
#include "usart.h"
|
||
#include "sys_drv_init.h"
|
||
#include "sub_comm/sub_comm_task.h"
|
||
#include <string.h>
|
||
|
||
/* 遥控通道总数自动跟随枚举 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;
|
||
}
|
||
|