元宇宙鏈遊系統開發原始碼(成熟技術)

Tg_StPv888發表於2023-02-22

原始檔(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進行操作而不需要對底層進行修改。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2936468/,如需轉載,請註明出處,否則將追究法律責任。

相關文章