深度解析:元宇宙养殖农业DAPP系统开发逻辑详细方案
2023-03-07 09:03:02 时间
源文件(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
进行操作而不需要对底层进行修改。
相关文章
- 数据孤岛是业务效率的无声杀手
- 2023展望:新的一年将给大数据分析领域带来什么?
- 阿里云ADB基于Hudi构建Lakehouse的实践
- 大数据在医疗保健领域的使用案例
- 微软增加说明:KB5021751 更新扫描已经 / 即将过时 Office 过程中不会触碰用户隐私
- 2022 Gartner全球云数据库管理系统魔力象限发布 腾讯云数据库入选
- 场景化、重实操,分享一个实时数仓实践案例
- Arctic的湖仓一体践行之路
- 分布式计算MapReduce究竟是怎么一回事?
- 淘系数据模型治理优秀实践
- 大数据分析对医疗保健的影响
- 当我们说大数据Hadoop,究竟在说什么?
- 2022年及以后大数据的五个发展趋势
- 网易严选离线数仓治理实践
- 2023 年数据治理趋势
- 一份“靠谱”的年度经营计划,你学会了吗?
- 漫谈对大数据的思考
- 测试一下,读懂数据的能力,你有吗?
- 用艺术的眼光探索数据之美
- 聊聊数据分析成果如何落地