/*** * @Author: shenghao.xu * @Date: 2023-04-06 18:11:36 * @LastEditors: shenghao.xu * @LastEditTime: 2023-04-06 18:12:03 * @Description: * @email:545403892@qq.com * @Copyright (c) 2023 by shenghao.xu, All Rights Reserved. */ #ifndef __AGREEEMENT_FRAME_H__ #define __AGREEEMENT_FRAME_H__ #include "../lib/inc/lib.h" /** * 帧头 帧长度 源地址 目标地址 报文类型 报文体 校验 帧尾 1 2 2 2 1 n 2 1 */ #define FRAME_HEAD 0x05 // 帧头 #define FRAME_TAIL 0x1b // 帧尾 #define FRAME_LENGTH_WITHOUT_BODY (1 + 2 + 2 + 2 + 1 + 2 + 1) // 帧长度不包括报文体 // 以下协议相关参数定义 typedef enum { RUN_STATE_UNEXECUTED = 0x00, // 未执行 RUN_STATE_EXECUTING = 0x01, // 执行中 RUN_STATE_PREPARED = 0x02, // 准备完毕 RUN_STATE_FAILED = 0x03, // 执行失败 RUN_STATE_READY_RUN = 0x04, // 准备运行 } run_state_e; typedef enum { SENSOR_PRESSURE = 0x01, // 压力传感器 SENSOR_FLOW = 0x02, // 流量传感器 SENSOR_TEMPERATURE = 0x03, // 温度传感器 SENSOR_LASER = 0x04, // 激光传感器 SENSOR_MINOR_LOOP = 0x05, // 小回路传感器 SENSOR_PROPORTIONAL_VALVE = 0x06, // 比例阀传感器 SENSOR_STEP_MOTOR = 0x07, // 步进电机传感器 SENSOR_PT100_TEMPERATURE = 0x08, // PT100温度传感器 SENSOR_MAX, } sensor_e; // 传感器枚举 typedef enum { UNIT_TWO_WAY_VALVE = 0x10, // 两通阀 UNIT_THREE_WAY_VALVE = 0x11, // 三通阀 UNIT_PROPORTIONAL_VALVE = 0x12, // 比例阀 UNIT_IP_CONVERTER = 0x13, // IP转换器 } unit_e; // 组件枚举 typedef enum { ACTION_WAIT = 0x00, // 等待 ACTION_WORK = 0x01, // 工作 ACTION_VALVE = 0x10, // 操作阀门 ACTION_IP_CONVERTER = 0x20, // 操作IP转换器 } action_e; // 动作枚举 #pragma pack(1) typedef struct { uint8_t valve_type; // 阀门类型 uint8_t no; // 阀门编号 union { bool open; // 两通阀:开关 uint8_t position; // 三通阀:位置 1:左 2:右 float32_t value; // 比例阀:压力值 } data; // 阀门数据 } valve_t; // 阀门数据结构 typedef struct { float32_t value; // 电流值 } ip_converter_t; // IP转换器数据结构 typedef struct { uint8_t type; // 动作类型 union { valve_t valve; // 阀门数据 ip_converter_t ip_converter; // IP转换器数据 uint16_t sleep; // 等待时间ms } data; // 动作数据 } action_t; // 动作数据结构 typedef struct { uint8_t action_count; // 动作数量 action_t *actions; // 动作数组, 每个方案包含多个动作,在执行时,按照动作的顺序执行 } plan_t; // 流程方案数据结构 typedef struct { uint8_t plan_count; // 流程方案数量 plan_t *plans; // 流程方案数组, 每个流程包含多个方案,在执行时,按照方案的顺序执行 } process_t; // 流程数据结构 typedef struct { uint8_t process_count; // 流程数量 process_t *processes; // 流程数组, 每个配置包含多个流程,在执行时,按照流程的顺序执行 } config_t; // 配置数据结构 typedef struct { float32_t value; // 电流值 } adjust_ip_input_current_t; // 调整IP输入电流请求数据域 typedef struct { uint16_t address; } config_address_t; // 配置地址数据域 typedef struct { uint16_t address; } query_address_t; // 查询地址数据域 typedef struct { uint8_t process_index; // 配置参数中流程数组的索引 uint8_t plan_index; // 配置参数中流程方案数组的索引 } execute_process_t; // 执行流程数据域 typedef union { uint8_t data; struct { uint8_t sensor_1 : 1; // 传感器1 uint8_t sensor_2 : 1; // 传感器2 uint8_t sensor_3 : 1; // 传感器3 uint8_t sensor_4 : 1; // 传感器4 uint8_t sensor_5 : 1; // 传感器5 uint8_t sensor_6 : 1; // 传感器6 uint8_t sensor_7 : 1; // 传感器7 uint8_t sensor_8 : 1; // 传感器8 } bits; } sensor_bits_e; typedef struct { uint8_t sensor_class; // 传感器类型 sensor_bits_e sensor; // 传感器 } query_data_sensor_t; typedef struct { uint8_t count; // 传感器分类数量 query_data_sensor_t *sensors; } query_data_t; // 查询数据数据域 typedef struct { query_data_sensor_t; uint8_t count; float32_t data[8]; // 传感器最大数量为8 } query_data_rsp_t; typedef struct { uint8_t state; // 0:零位 1:满值 query_data_t sensor_data; } calibration_sensor_t; // 标定传感器数据域 typedef struct { uint8_t unit; // 组件类型 uint8_t status; // 两通阀1:开启 0:关闭 三通阀位置 1:左 2:右 uint8_t index; // 阀门编号 } set_valve_t; // 设置阀门数据域 typedef struct { uint8_t value_no; // PID传感器编号 } query_valve_ratio_t; // 设置比例阀数据域 typedef struct { uint8_t value_no; // 比例编号 float32_t value; // 比例阀值 uint8_t pid_sensor_class; // PID传感器类型 0x01 压力传感器 0x00 使用默认的比例阀 uint8_t pid_sensor_no; // PID传感器编号 } set_valve_ratio_t; // 设置比例阀数据域 typedef struct { uint8_t dir; // 步进电机运行方向 0:逆时针旋转 1:顺时针旋转 float32 angle; // 角度 } stepper_motor_t; typedef struct { uint8_t frequency; // 频率 float32 percent; // 占空比 } query_ip_pwm_duty_t; typedef struct { float32 percent; // 占空比 } adjust_ip_pwm_duty_t; typedef struct { uint8_t mode; // 1: 电流模式 2: PWM模式 uint8_t data_length; union { uint8_t frequency; } data; } set_ip_mode_t; typedef struct { uint8_t mode; // 1: 电流模式 2: PWM模式 uint8_t data_length; union { uint8_t frequency; } data; } query_ip_mode_t; #pragma pack() // 结束:协议数据结构定义 typedef enum { COMMAND_RESET_DEVICE = 0x00, // 复位设备 COMMAND_QUERY_IP_INPUT_CURRENT = 0x01, // 查询IP输入电流 COMMAND_ADJUST_IP_INPUT_CURRENT = 0x02, // 调节IP输入电流 COMMAND_QUERY_STATE = 0x03, // 查询状态 COMMAND_QUERY_PROCESS = 0x04, // 查询流程 COMMAND_CONFIG_PROCESS = 0x05, // 配置流程 COMMAND_EXECUTE_PROCESS = 0x06, // 执行流程 COMMAND_STOP_PROCESS = 0x07, // 停止流程 COMMAND_QUERY_DATA = 0x08, // 查询数据 COMMAND_CONFIG_ADDRESS = 0x09, // 配置地址 COMMAND_QUERY_ADDRESS = 0x0A, // 查询地址 COMMAND_CALIBRATE_SENSOR = 0x0B, // 标定传感器 COMMAND_SET_VALVE = 0x0C, // 设置阀门 COMMAND_QUERY_VALVE = 0x0D, // 查询比例阀 COMMAND_SET_VALVE_RATIO = 0x0E, // 设置比例阀 COMMAND_SET_STEPPER_MOTOR = 0x0F, // 设置步进电机 COMMAND_QUERY_IP_INPUT_PWM_DUTY = 0x10, // 查询I/P 输入PWM占空比 COMMAND_ADJUST_IP_INPUT_PWM_DUTY = 0x11, // 调节I/P 输入PWM占空比 COMMAND_SET_IP_MODE = 0x12, // 设置I/P 模式 COMMAND_QUERY_IP_MODE = 0x13, // 查询I/P 模式 COMMAND_MAX, } command_e; #pragma pack(1) typedef struct { uint8_t code[11]; // 标识码 'epm' union { uint8_t data; struct { uint8_t lo : 4; // 低位 uint8_t hi : 4; // 高位 } bits; } version; uint8_t status; // 运行状态 0:未执行 1:执行中 2:准备完毕 3:执行失败 uint8_t process_index; // 当前执行的流程编号 uint8_t plan_index; // 当前执行的方案编号 uint8_t action_index; // 当前执行的动作编号 uint8_t two_way_valve; // 两通阀状态 bits uint8_t three_way_valve; // 三通阀状态 bits } slave_req_query_state_t; typedef struct { union { float32_t current; // 电流值 slave_req_query_state_t query_state; // 查询状态数据域 config_t config; // 配置数据域 execute_process_t execute_process; // 执行流程数据域 config_address_t config_address; // 配置地址数据域 query_address_t query_address; // 查询地址数据域 query_data_t query_data; // 查询数据数据域 query_data_rsp_t *query_data_rsp; // 查询数据响应数据域,需要手动释放 calibration_sensor_t calibration_sensor; // 标定传感器数据域 set_valve_t set_valve; // 设置阀门数据域 set_valve_ratio_t valve_ratio; // 比例阀值 stepper_motor_t stepper_motor; // 步进电机数据域 query_ip_pwm_duty_t query_ip_pwm_duty; // 查询I/P 输入PWM占空比 adjust_ip_pwm_duty_t adjust_ip_pwm_duty; // 调节I/P 输入PWM占空比 set_ip_mode_t set_ip_mode; // 设置I/P 模式 query_ip_mode_t query_ip_mode; // 查询I/P 模式 } data; float32_t default_value; // 默认值 } slave_request_done_t; #pragma pack() typedef void (*response_cb)(uint8_t *data, uint16_t len); // 回复消息注册接口 typedef slave_request_done_t (*slave_request_done_cb)(command_e command, void *data); // 从机请求处理完成回调 #pragma pack(1) typedef struct { uint16_t src; // 源地址 uint16_t dst; // 目的地址 uint8_t command; union { adjust_ip_input_current_t adjust_ip_input_current; // 调节IP输入电流数据域 config_address_t config_address; // 配置地址数据域 execute_process_t execute_process; // 执行流程数据域 query_data_t query_data; // 查询数据数据域 config_t *config; // 配置流程数据域 calibration_sensor_t calibration_sensor; // 标定传感器数据域 set_valve_t set_valve; // 设置阀门数据域 query_valve_ratio_t query_valve_ratio; // 查询比例阀数据域 set_valve_ratio_t valve_ratio; // 设置比例阀数据域 stepper_motor_t stepper_motor; // 设置步进电机数据域 adjust_ip_pwm_duty_t adjust_ip_pwm_duty; // 调节I/P 输入PWM占空比 set_ip_mode_t set_ip_mode; // 设置I/P 模式 } data; } command_req_t; typedef struct { pbuf_t *pbuf; } command_resp_t; typedef struct { uint16_t src; // 源地址 uint16_t dst; // 目的地址 uint8_t command; // 命令 uint8_t *data; // 数据 uint16_t data_len; // 数据长度 } agreement_response_fill_t; // 回复消息填充结构体 typedef struct { uint8_t slave; // 0: master 1: slave ; 主机或从机公用一个注册接口,只能注册一种类型 response_cb response_call; // 回复消息注册接口 slave_request_done_cb slave_request_done_call; // 从机请求处理完成回调 } agreement_init_t; #pragma pack() extern bool (*command_req_ptr_arr[COMMAND_MAX])(const command_req_t *const data, command_resp_t *resp); extern agreement_init_t handle; extern config_t *g_config; extern execute_process_t g_execute_process; // 执行流程数据域 extern pbuf_t *agreement_response_fill(const agreement_response_fill_t *const rsp); extern void config_convert_pbuf(config_t config, pbuf_t **pbuf); extern config_t *data_convert_config(uint8_t *data, uint16_t len); extern config_t *config_alloc(uint8_t process_count, uint8_t plan_count, uint8_t action_count); extern void config_free(config_t *config); extern void config_print(config_t *config); extern calibration_sensor_t *data_convert_calibration_sensor(uint8_t *data, uint16_t len); extern void calibration_sensor_convert_pbuf(calibration_sensor_t calibration_sensor, pbuf_t **const pbuf); extern query_data_t *data_convert_query_data(uint8_t *data, uint16_t len); extern void query_data_convert_pbuf(query_data_rsp_t *query_data, uint8_t count, pbuf_t **const pbuf); extern config_t *mock_commond_req_config(void); #endif // __AGREEEMENT_FRAME_H__