epm/User/agreement/agreement.c

132 lines
3.3 KiB
C

/*
* @Author: shenghao.xu
* @Date: 2023-04-06 09:07:29
* @LastEditors: shenghao.xu
* @LastEditTime: 2023-05-04 16:28:34
* @Description:
* email:545403892@qq.com
* Copyright (c) 2023 by shenghao.xu, All Rights Reserved.
*/
#include "agreement.h"
#include "agreement_slave.h"
#include "agreement_master.h"
bool (*command_req_ptr_arr[COMMAND_MAX])(const command_req_t *const data, command_resp_t *resp);
agreement_init_t handle;
bool agreement_init(const agreement_init_t *const init)
{
if (!DBG_ASSERT(init != NULL __DBG_LINE))
{
return false;
}
osel_memcpy((uint8_t *)&handle, (uint8_t *)init, sizeof(agreement_init_t));
if (!DBG_ASSERT(handle.response_call != NULL __DBG_LINE))
{
return false;
}
if (init->slave == 1)
{
agreement_slave_init();
}
else
{
agreement_master_init();
}
return true;
}
// 主机请求指令
bool agreement_master_req(const command_req_t *const data)
{
command_resp_t resp;
agreement_response_fill_t rsp;
pbuf_t *pbuf;
if (!DBG_ASSERT(handle.response_call != NULL __DBG_LINE))
return false;
if (!DBG_ASSERT(data->command < COMMAND_MAX __DBG_LINE))
return false;
if (command_req_ptr_arr[data->command] == NULL)
{
return false;
}
if (!command_req_ptr_arr[data->command](data, &resp))
{
return false;
}
rsp.src = data->src;
rsp.dst = data->dst;
rsp.command = data->command;
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 true;
}
// 填充报文内容
pbuf_t *agreement_response_fill(const agreement_response_fill_t *const rsp)
{
pbuf_t *pbuf;
uint16_t length, offset = 0;
uint16_t crc16 = 0;
uint8_t *ptr_len, *ptr_crc;
if (!DBG_ASSERT(rsp != NULL __DBG_LINE))
return NULL;
length = rsp->data_len + FRAME_LENGTH_WITHOUT_BODY;
pbuf = pbuf_allocz(length __PLINE1);
if (!DBG_ASSERT(pbuf != NULL __DBG_LINE))
return NULL;
// 填充帧头
pbuf->data_p[offset] = FRAME_HEAD;
offset++;
// 填充帧长
ptr_len = &pbuf->data_p[offset];
offset += 2;
ptr_crc = &pbuf->data_p[offset];
// 填充源地址
osel_memcpy(&pbuf->data_p[offset], (uint8_t *)&(rsp->src), sizeof(uint16_t));
offset += 2;
// 填充目的地址
osel_memcpy(&pbuf->data_p[offset], (uint8_t *)&(rsp->dst), sizeof(uint16_t));
offset += 2;
// 填充报文类型
pbuf->data_p[offset] = rsp->command;
offset++;
// 填充报文体
osel_memcpy(&pbuf->data_p[offset], rsp->data, rsp->data_len);
offset += rsp->data_len;
// 填充帧长
length = S2B_UINT16(FRAME_LENGTH_WITHOUT_BODY - 1 + rsp->data_len);
osel_memcpy(ptr_len, (uint8_t *)(&length), sizeof(uint16_t));
// 填充crc16
crc16 = crc16_compute(ptr_crc, 5 + rsp->data_len);
crc16 = S2B_UINT16(crc16);
osel_memcpy(&pbuf->data_p[offset], (uint8_t *)&crc16, sizeof(uint16_t));
offset += 2;
// 填充帧尾
pbuf->data_p[offset] = FRAME_TAIL;
offset++;
pbuf->data_len = offset;
return pbuf;
}