前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度解析:元宇宙养殖农业DAPP系统开发逻辑详细方案

深度解析:元宇宙养殖农业DAPP系统开发逻辑详细方案

原创
作者头像
系统_I8O28578624
发布2023-02-07 11:31:49
2590
发布2023-02-07 11:31:49
举报
文章被收录于专栏:YYDSYYDSYYDS

源文件(dispatch.c):

u32 func_ChipCheck(u8 *cmd_in, u8 *cmd_out)
{
	/*do something*/
	PRINT_WARN("func %s,line num: %d, %p,%d!\r\n", __FUNCTION__, __LINE__, cmd_in, 2);
	return (0);
}

u32 func_DataTrans(u8 *cmd_in, u8 *cmd_out)
{
	/*do something*/
	PRINT_WARN("func %s,line num: %d, %p,%d!\r\n", __FUNCTION__, __LINE__, cmd_in, 2);
	return (0);
}
u32 func_DataSave(u8 *cmd_in, u8 *cmd_out)
{
	/*do something*/
	PRINT_WARN("func %s,line num: %d, %p,%d!\r\n", __FUNCTION__, __LINE__, cmd_in, 2);
	return (0);
}

建立索引关系,即functionlist中的功能接口和funcCodelist的接口名称一一对应起来,同时编写索引查找函数。在源文件进行定义:

pFunc functionlist[] = {
	func_ChipCheck,
	func_DataTrans,
	func_DataSave,
};

u8 funcCodelist[] =
{
	ChipCheck,
	DataTrans,
	DataSave,
};
/**
 * 功能接口的回调函数
 *
 * @author KingBoy (2020/5/24)
 *
 * @param p 被调用的函数
 * @param cmd_in 输入参数
 * @param cmd_out 输出参数
 *
 * @return u32 0-success
 */
u32 dispath_callback(pFunc p, u8 *cmd_in, u8 *cmd_out)
{
	u32 ret = 0;
	ret = (*p)(cmd_in, cmd_out);
	return (ret);
}
/**
 * 功能派发接口
 *
 * @author KingBoy (2020/5/23)
 *
 * @param cmd_ptr 输入输出:数据起始地址
 * @param cmd_len 输入输出:数据长度
 */
void function_dispatch(u8 *cmd_ptr, u32 *cmd_len)
{
	int func_code;

	func_code = getEnumIndex(*(cmd_ptr));
	PRINT_WARN("func %s,line num: %d, %02x\r\n", __FUNCTION__, __LINE__, func_code);
	if (func_code != -1)
	{
		//用法1,直接定义函数数组后调用
		//functionlist[func_code](cmd_ptr, cmd_ptr);
		//用法2,使用回调函数进行处理
		dispath_callback(functionlist[func_code], cmd_ptr, cmd_ptr);
	}
	else
	{
		PRINT_WARN("func %s,line num: %d, %02x\r\n", __FUNCTION__, __LINE__, func_code);
	}
}
/**
 * 获取功能的索引位置
 *
 * @author KingBoy (2020/5/23)
 *
 * @param value 功能码值
 *
 * @return int 索引位置,-1为未找到
 */
int getEnumIndex(u8 value)
{
	int i = 0;
	for (i = 0; i < sizeof(funcCodelist); i++)
	{
		if (value == funcCodelist[i])
		{
			return (i);
		}
	}
	if (i >= sizeof(funcCodelist))
	{
		return (ERR_NOFUNC);
	}

	return (0);
}

function_dispatch即处理的函数,cmd_ptr将外部数据传入,根据第一个字节的取值决定是执行哪个功能函数(*(cmd_ptr)),在getEnumIndex中获得该功能的索引位置,如果查到的位置合法(不是-1),则调用回调函数dispath_callback并将需要调用的功能函数functionlist[func_code]传入,同时传入函数的参数(u8 *cmd_in, u8 *cmd_out)。

对于相似的功能接口来说,可以选择直接调用(functionlist[func_code](cmd_ptr, cmd_ptr);)或者是回调函数调用(dispath_callback(functionlist[func_code], cmd_ptr, cmd_ptr);)两者的处理等价。

如果使用回调函数,当想要修改功能时,可以只在dispath_callback进行操作而不需要对底层进行修改。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档