This repository has been archived on 2025-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
torsion/User/agreement/agreement_slave.c

569 lines
21 KiB
C

/*
* @Author: shenghao.xu
* @Date: 2023-04-06 09:33:45
* @LastEditors: shenghao.xu
* @LastEditTime: 2023-06-19 23:46:16
* @Description:
* email:545403892@qq.com
* Copyright (c) 2023 by shenghao.xu, All Rights Reserved.
*/
#include "agreement_slave.h"
// 查询IP输入电流
static bool command_req_query_ip_input_current(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
rsp.data.current.c = S2B_UINT32(rsp.data.current.c);
rsp.default_value.c = S2B_UINT32(rsp.default_value.c);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.default_value.c, sizeof(uint32_t));
offset += sizeof(uint32_t);
osel_memcpy(resp->pbuf->data_p + offset, (uint8_t *)&rsp.data.current.c, sizeof(uint32_t));
offset += sizeof(uint32_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 调节IP输入电流
static bool command_req_adjust_ip_input_current(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
float32_t f;
osel_memcpy((uint8_t *)&f, (uint8_t *)&data->data.adjust_ip_input_current.value, sizeof(float32_t));
f.c = B2S_UINT32(f.c);
rsp = handle.slave_request_done_call((command_e)data->command, &f);
rsp.data.current.c = S2B_UINT32(rsp.data.current.c);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.current.f, sizeof(float32));
offset += sizeof(float32);
resp->pbuf->data_len = offset;
}
return true;
}
// 查询状态
static bool command_req_query_state(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.query_state, sizeof(slave_req_query_state_t));
offset += sizeof(slave_req_query_state_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 查询流程
static bool command_req_query_process(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t sum;
uint16_t crc;
uint16_t offset = 0;
resp->pbuf = pbuf_allocz(LARGE_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
config_convert_pbuf(rsp.data.config, &resp->pbuf);
offset = resp->pbuf->data_len;
// 填充异或校验
sum = xor_compute(resp->pbuf->data_p, offset);
crc = crc16_compute(resp->pbuf->data_p, offset);
resp->pbuf->data_p[offset] = sum;
offset++;
crc = S2B_UINT16(crc);
osel_memcpy(&resp->pbuf->data_p[offset], (uint8_t *)&crc, sizeof(uint16_t));
offset += sizeof(uint16_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 配置流程
static bool command_req_config_process(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t sum;
uint16_t crc;
uint16_t offset = 0;
resp->pbuf = pbuf_allocz(LARGE_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, data->data.config);
config_convert_pbuf(rsp.data.config, &resp->pbuf);
offset = resp->pbuf->data_len;
// 填充异或校验
sum = xor_compute(resp->pbuf->data_p, offset);
crc = crc16_compute(resp->pbuf->data_p, offset);
resp->pbuf->data_p[offset] = sum;
offset++;
crc = S2B_UINT16(crc);
osel_memcpy(&resp->pbuf->data_p[offset], (uint8_t *)&crc, sizeof(uint16_t));
offset += sizeof(uint16_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 执行流程
static bool command_req_execute_process(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
osel_memcpy((uint8_t *)&g_execute_process, (uint8_t *)&data->data.execute_process, sizeof(execute_process_t));
rsp = handle.slave_request_done_call((command_e)data->command, &g_execute_process);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.query_state, sizeof(execute_process_t));
offset += sizeof(execute_process_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 停止流程
static bool command_req_stop_process(const command_req_t *const data, command_resp_t *resp)
{
// slave_request_done_t rsp;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
handle.slave_request_done_call((command_e)data->command, NULL);
}
return true;
}
// 查询数据
static bool command_req_query_data(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
resp->pbuf = pbuf_allocz(LARGE_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
query_data_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.query_data, sizeof(query_data_t));
if (d.count > 0)
{
rsp = handle.slave_request_done_call((command_e)data->command, &d);
query_data_convert_pbuf(rsp.data.query_data_rsp, d.count, &resp->pbuf);
}
}
return true;
}
// 配置地址
static bool command_req_config_address(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
config_address_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.config_address, sizeof(config_address_t));
rsp = handle.slave_request_done_call((command_e)data->command, &d);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.config_address, sizeof(config_address_t));
offset += sizeof(config_address_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 查询地址
static bool command_req_query_address(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.query_address, sizeof(query_address_t));
offset += sizeof(query_address_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 标定传感器
static bool command_req_calibration_sensor(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
resp->pbuf = pbuf_allocz(MEDIUM_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
calibration_sensor_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.calibration_sensor, sizeof(calibration_sensor_t));
rsp = handle.slave_request_done_call((command_e)data->command, &d);
calibration_sensor_convert_pbuf(rsp.data.calibration_sensor, &resp->pbuf);
}
return true;
}
// 设置阀门状态
static bool command_req_set_valve(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
set_valve_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.set_valve, sizeof(set_valve_t));
rsp = handle.slave_request_done_call((command_e)data->command, &d);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.set_valve, sizeof(set_valve_t));
offset += sizeof(set_valve_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 查询比例阀
static bool command_req_query_valve(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, (uint8_t *)&data->data.query_valve_ratio.value_no);
rsp.data.valve_ratio.value.c = S2B_UINT32(rsp.data.valve_ratio.value.c);
rsp.default_value.c = S2B_UINT32(rsp.default_value.c);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.default_value.c, sizeof(uint32_t));
offset += sizeof(uint32_t);
osel_memcpy(resp->pbuf->data_p + offset, (uint8_t *)&rsp.data.valve_ratio, sizeof(set_valve_ratio_t));
offset += sizeof(set_valve_ratio_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 设置比例阀
static bool command_req_set_valve_ratio(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
set_valve_ratio_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.valve_ratio, sizeof(set_valve_ratio_t));
d.value.c = B2S_UINT32(d.value.c);
rsp = handle.slave_request_done_call((command_e)data->command, &d);
rsp.data.valve_ratio.value.c = S2B_UINT32(rsp.data.valve_ratio.value.c);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.valve_ratio, sizeof(set_valve_ratio_t));
offset += sizeof(set_valve_ratio_t);
resp->pbuf->data_len = offset;
}
return true;
}
static bool command_req_set_stepper_motor(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
stepper_motor_t d;
float32_t f;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.stepper_motor, sizeof(stepper_motor_t));
d.angle = B2S_UINT32(d.angle);
d.dir = data->data.stepper_motor.dir;
f.f = data->data.stepper_motor.angle;
f.c = B2S_UINT32(f.c);
d.angle = f.f;
rsp = handle.slave_request_done_call((command_e)data->command, &d);
f.f = rsp.data.stepper_motor.angle;
f.c = S2B_UINT32(f.c);
rsp.data.stepper_motor.angle = f.f;
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.stepper_motor, sizeof(stepper_motor_t));
offset += sizeof(stepper_motor_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 查询I/P 输入PWM占空比
static bool command_req_query_ip_pwm_duty(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.query_ip_pwm_duty, sizeof(query_ip_pwm_duty_t));
offset += sizeof(query_ip_pwm_duty_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 调节I/P 输入PWM占空比
static bool command_req_set_ip_pwm_duty(const command_req_t *const data, command_resp_t *resp)
{
uint8_t offset = 0;
float32_t f;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
adjust_ip_pwm_duty_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.adjust_ip_input_current, sizeof(adjust_ip_pwm_duty_t));
f.f = d.percent;
f.c = B2S_UINT32(f.c);
d.percent = f.f;
handle.slave_request_done_call((command_e)data->command, &d);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&data->data.adjust_ip_input_current, sizeof(adjust_ip_pwm_duty_t));
offset += sizeof(adjust_ip_pwm_duty_t);
resp->pbuf->data_len = offset;
}
return true;
}
// 设置I/P 模式
static bool command_req_set_ip_mode(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
set_ip_mode_t d;
osel_memcpy((uint8_t *)&d, (uint8_t *)&data->data.set_ip_mode, sizeof(set_ip_mode_t));
rsp = handle.slave_request_done_call((command_e)data->command, &d);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.set_ip_mode, sizeof(set_ip_mode_t));
offset += 2 + rsp.data.set_ip_mode.data_length;
resp->pbuf->data_len = offset;
}
return true;
}
// 查询I/P 模式
static bool command_req_query_ip_mode(const command_req_t *const data, command_resp_t *resp)
{
slave_request_done_t rsp;
uint8_t offset = 0;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
rsp = handle.slave_request_done_call((command_e)data->command, NULL);
osel_memcpy(resp->pbuf->data_p, (uint8_t *)&rsp.data.query_ip_mode, sizeof(query_ip_mode_t));
offset += 2 + rsp.data.set_ip_mode.data_length;
resp->pbuf->data_len = offset;
}
return true;
}
// 复位设备
static bool command_req_reset_device(const command_req_t *const data, command_resp_t *resp)
{
// slave_request_done_t rsp;
resp->pbuf = pbuf_allocz(SMALL_PBUF_BUFFER_SIZE __PLINE1);
if (!DBG_ASSERT(resp->pbuf != NULL __DBG_LINE))
return false;
if (handle.slave_request_done_call != NULL)
{
handle.slave_request_done_call((command_e)data->command, NULL);
}
return true;
}
bool agreement_slave_init(void)
{
command_req_ptr_arr[COMMAND_RESET_DEVICE] = command_req_reset_device; // 复位设备
command_req_ptr_arr[COMMAND_QUERY_IP_INPUT_CURRENT] = command_req_query_ip_input_current; // 查询IP输入电流
command_req_ptr_arr[COMMAND_ADJUST_IP_INPUT_CURRENT] = command_req_adjust_ip_input_current; // 调节IP输入电流
command_req_ptr_arr[COMMAND_QUERY_STATE] = command_req_query_state; // 查询状态
command_req_ptr_arr[COMMAND_QUERY_PROCESS] = command_req_query_process; // 查询流程
command_req_ptr_arr[COMMAND_CONFIG_PROCESS] = command_req_config_process; // 配置流程
command_req_ptr_arr[COMMAND_EXECUTE_PROCESS] = command_req_execute_process; // 执行流程
command_req_ptr_arr[COMMAND_STOP_PROCESS] = command_req_stop_process; // 停止流程
command_req_ptr_arr[COMMAND_QUERY_DATA] = command_req_query_data; // 查询数据
command_req_ptr_arr[COMMAND_CONFIG_ADDRESS] = command_req_config_address; // 配置地址
command_req_ptr_arr[COMMAND_QUERY_ADDRESS] = command_req_query_address; // 查询地址
command_req_ptr_arr[COMMAND_CALIBRATE_SENSOR] = command_req_calibration_sensor; // 标定传感器
command_req_ptr_arr[COMMAND_SET_VALVE] = command_req_set_valve; // 设置阀门状态
command_req_ptr_arr[COMMAND_QUERY_VALVE] = command_req_query_valve; // 查询比例阀
command_req_ptr_arr[COMMAND_SET_VALVE_RATIO] = command_req_set_valve_ratio; // 设置比例阀
command_req_ptr_arr[COMMAND_SET_STEPPER_MOTOR] = command_req_set_stepper_motor; // 设置步进电机
command_req_ptr_arr[COMMAND_QUERY_IP_INPUT_PWM_DUTY] = command_req_query_ip_pwm_duty;
command_req_ptr_arr[COMMAND_ADJUST_IP_INPUT_PWM_DUTY] = command_req_set_ip_pwm_duty;
command_req_ptr_arr[COMMAND_SET_IP_MODE] = command_req_set_ip_mode;
command_req_ptr_arr[COMMAND_QUERY_IP_MODE] = command_req_query_ip_mode;
return true;
}
void agreement_slave_req(uint8_t *data, uint16_t len)
{
agreement_response_fill_t rsp;
command_resp_t resp;
command_req_t req;
pbuf_t *pbuf;
uint16_t offset = 0, surplus = 0;
// LOG_HEX(data, len);
osel_memset((uint8_t *)&req, 0, sizeof(command_req_t));
osel_memset((uint8_t *)&resp, 0, sizeof(command_resp_t));
osel_memcpy((uint8_t *)&req.src, data, sizeof(uint16_t));
offset += sizeof(uint16_t);
osel_memcpy((uint8_t *)&req.dst, data + offset, sizeof(uint16_t));
offset += sizeof(uint16_t);
req.src = S2B_UINT16(req.src);
req.dst = S2B_UINT16(req.dst);
req.command = data[offset++];
if (!DBG_ASSERT(handle.response_call != NULL __DBG_LINE))
return;
if (!DBG_ASSERT(req.command < COMMAND_MAX __DBG_LINE))
return;
if (command_req_ptr_arr[req.command] == NULL)
{
return;
}
surplus = len - offset;
if (surplus > 0)
{
if (req.command == COMMAND_CONFIG_PROCESS)
{
// 配置流程指令,数据结构中有指针,需要单独处理
req.data.config = data_convert_config(data + offset, surplus); // req.data.config 中的指针是全局变量,不需要释放
}
else if (req.command == COMMAND_CALIBRATE_SENSOR)
{
// 标定传感器指令,数据结构中有指针,需要单独处理
calibration_sensor_t *calibration_sensor = NULL;
calibration_sensor = data_convert_calibration_sensor(data + offset, surplus);
if (!DBG_ASSERT(calibration_sensor != NULL __DBG_LINE))
{
return;
}
else
{
// req.data.calibration_sensor 中的指针是全局变量,不需要释放
req.data.calibration_sensor.state = calibration_sensor->state;
req.data.calibration_sensor.sensor_data.count = calibration_sensor->sensor_data.count;
req.data.calibration_sensor.sensor_data.sensors = calibration_sensor->sensor_data.sensors;
}
}
else if (req.command == COMMAND_QUERY_DATA)
{
// 查询数据指令,数据结构中有指针,需要单独处理
query_data_t *query_data = NULL;
query_data = data_convert_query_data(data + offset, surplus);
if (!DBG_ASSERT(query_data != NULL __DBG_LINE))
{
return;
}
else
{
// req.data.query_data 中的指针是全局变量,不需要释放
req.data.query_data.count = query_data->count;
req.data.query_data.sensors = query_data->sensors;
}
}
else
{
osel_memcpy((uint8_t *)&req.data, data + offset, surplus);
}
}
if (!command_req_ptr_arr[req.command](&req, &resp))
{
return;
}
rsp.dst = S2B_UINT16(req.src);
rsp.src = S2B_UINT16(req.dst);
rsp.command = req.command + 0x80;
rsp.data = resp.pbuf->data_p;
rsp.data_len = resp.pbuf->data_len;
pbuf = agreement_response_fill(&rsp);
pbuf_freez(&resp.pbuf __PLINE2);
handle.response_call(pbuf->data_p, pbuf->data_len);
pbuf_freez(&pbuf __PLINE2);
LOG_PRINT("mem used:%d%%\r\n", my_mem_perused(0));
return;
}
bool mock_config_query_data(void)
{
g_config = mock_commond_req_config();
return true;
}