#ifndef SUB_COMM_TASK_H #define SUB_COMM_TASK_H #include #include "publicdata/type.h" /* ======================== 副板遥控(YK) 点位定义 ======================== */ /* 说明: * - 副板 YK 代表“主板下发到副板的输出控制命令”; * - 当前定义的 DO11~DO16 对应副板继电器 K1~K6(协议命令 0x02); * - 预留点位用于后续扩展,不影响现有协议与数据结构布局。 */ typedef enum { /* 实际点位:DO11 ~ DO16(副板输出) */ E_SUB_YK_DO11 = 0, E_SUB_YK_DO12, E_SUB_YK_DO13, E_SUB_YK_DO14, E_SUB_YK_DO15, E_SUB_YK_DO16, /* 预留点位:便于后续扩展(副板输出) */ E_SUB_YK_RSVD1, E_SUB_YK_RSVD2, E_SUB_YK_RSVD3, E_SUB_YK_RSVD4, E_SUB_YK_RSVD5, E_SUB_YK_RSVD6, E_SUB_YK_NUM } E_SUB_YK_TYPE; typedef union { /* 按 bit 存储的命令缓存(节省空间): * - 低 12 bit 对应 E_SUB_YK_TYPE 的 12 个点位; * - bit 取值:0=CMD_OFF,1=CMD_ON; * - u8_bytes 便于协议层直接取字节序列(低字节在前)。 */ uint16_t u16_bits; U8_T u8_bytes[2]; struct { /* bit-field 视图(与枚举顺序一一对应) */ uint16_t do11 : 1; /* DO11 / K1 */ uint16_t do12 : 1; /* DO12 / K2 */ uint16_t do13 : 1; /* DO13 / K3 */ uint16_t do14 : 1; /* DO14 / K4 */ uint16_t do15 : 1; /* DO15 / K5 */ uint16_t do16 : 1; /* DO16 / K6 */ uint16_t rsvd1 : 1; /* 预留1 */ uint16_t rsvd2 : 1; /* 预留2 */ uint16_t rsvd3 : 1; /* 预留3 */ uint16_t rsvd4 : 1; /* 预留4 */ uint16_t rsvd5 : 1; /* 预留5 */ uint16_t rsvd6 : 1; /* 预留6 */ uint16_t _pad : 4; /* 对齐到 16bit */ } b_yk; } U_SUB_YK_DATA; /* ======================== 副板遥信(YX) 点位定义 ======================== */ /* 说明: * - 副板 YX 代表“从副板采集回来的输入状态”; * - 当前包含: * 1) YX13~YX22:10 路 DI 输入检测 * 2) DIP1~DIP6:6 路拨码开关位(用于副板地址/模式等) * - 具体编码由协议命令 0x01 的数据域决定(在 sub_comm_task.c 中实现映射)。 */ typedef enum { /* 实际点位:YX13 ~ YX22(副板输入) */ E_SUB_YX_13 = 0, E_SUB_YX_14, E_SUB_YX_15, E_SUB_YX_16, E_SUB_YX_17, E_SUB_YX_18, E_SUB_YX_19, E_SUB_YX_20, E_SUB_YX_21, E_SUB_YX_22, /* 拨码位:6 位 */ E_SUB_DIP_1, E_SUB_DIP_2, E_SUB_DIP_3, E_SUB_DIP_4, E_SUB_DIP_5, E_SUB_DIP_6, /* 预留位:8 bit(用于后续扩展副板DI/状态位) */ E_SUB_YX_RSVD1, E_SUB_YX_RSVD2, E_SUB_YX_RSVD3, E_SUB_YX_RSVD4, E_SUB_YX_RSVD5, E_SUB_YX_RSVD6, E_SUB_YX_RSVD7, E_SUB_YX_RSVD8, E_SUB_YX_NUM } E_SUB_YX_TYPE; typedef union { /* 按 bit 存储的采集缓存(节省空间): * - 低 24 bit 对应 E_SUB_YX_TYPE 的点位(16个有效 + 8个预留); * - bit 取值:0/1; * - u8_bytes 便于协议层直接取字节序列(低字节在前)。 */ uint32_t u32_bits; U8_T u8_bytes[4]; struct { /* bit-field 视图(与枚举顺序一一对应) */ uint16_t yx13 : 1; uint16_t yx14 : 1; uint16_t yx15 : 1; uint16_t yx16 : 1; uint16_t yx17 : 1; uint16_t yx18 : 1; uint16_t yx19 : 1; uint16_t yx20 : 1; uint16_t yx21 : 1; uint16_t yx22 : 1; uint16_t dip1 : 1; uint16_t dip2 : 1; uint16_t dip3 : 1; uint16_t dip4 : 1; uint16_t dip5 : 1; uint16_t dip6 : 1; uint16_t rsvd1 : 1; uint16_t rsvd2 : 1; uint16_t rsvd3 : 1; uint16_t rsvd4 : 1; uint16_t rsvd5 : 1; uint16_t rsvd6 : 1; uint16_t rsvd7 : 1; uint16_t rsvd8 : 1; uint16_t _pad : 8; /* 对齐到 32bit */ } b_yx; } U_SUB_YX_DATA; /* 缓存访问接口: * - YK:上层写入命令缓存;副板通信线程负责周期下发(协议实现后接入) * - YX:副板通信线程刷新采集缓存;上层读取缓存即可 */ /** * @brief 写入副板遥控(YK)命令缓存。 * @note 该函数只更新缓存;真正的串口下发由 SubComm 线程周期执行。 */ void v_sub_comm_yk_set(E_SUB_YK_TYPE e_type, E_CMD e_cmd); /** * @brief 读取副板遥控(YK)命令缓存(用于调试或回显)。 */ E_CMD e_sub_comm_yk_get(E_SUB_YK_TYPE e_type); /** * @brief 读取副板遥信(YX)/拨码(DIP)采集缓存。 * @return 0/1 状态值 */ U8_T u8_sub_comm_yx_get(E_SUB_YX_TYPE e_type); void v_sub_comm_task(void *arg); U8_T u8_sub_comm_get_gun_num(void); #endif