epm/User/agreement/agreement_frame.h

361 lines
12 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/***
* @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_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
{
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; // 设置阀门数据域
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__