最近在一个blog中看到说表驱动编程,想到在项目中也用到了很多关于表驱动的用法,就想记录下来。也好供其他未用过的朋友做个参考。
现在很多手机类终端,都有一些待机界面的暗码处理, 比如查看IMEI的暗码 *#06#
首先在 xino_argot.h 中进行类型定义
typedef BOOLEAN (* P_ARGOT_FUNC)(const char * argot, uint8 argot_len);
然后在 xino_argot.c文件中添加 函数表
//暗码处理函数列表
const P_ARGOT_FUNC g_argot_func[] =
{
xino_Business_menu, //维护菜单暗码处理
xino_display_imei, //查看IMEI *#06#
xino_assert, //ASSERT
PNULL
};
在 xino_argot.c文件中添加 函数实现如下
/**
*
*函数名称:xino_Business_menu
*功能描述:暗码打开菜单
*返回值:成功-TRUE 失败-FALSE
*
**/
BOOLEAN xino_Business_menu(const char * argot, uint8 argot_len)
{
BOOLEAN b_invalid_argot = FALSE;
if (0x00 == strcmp(argot, "*#1234567#"))
{
SCI_TRACE_LOW("\r\n>>>lcs >> argot = *#1234567#");
XINO_CreateModifyLoginWin(); //打开维护菜单窗口
b_invalid_argot = TRUE;
}
return b_invalid_argot;
}
/**
*
*函数名称:xino_assert
*功能描述:ASSERT *#13328665749#
*返回值:成功-TRUE 失败-FALSE
*
**/
BOOLEAN xino_assert(const char * argot, uint8 argot_len)
{
BOOLEAN b_invalid_argot = FALSE;
if (0x00 == strcmp(argot, "*#13328665749#"))
{
SCI_ASSERT(FALSE);
b_invalid_argot = TRUE;
}
return b_invalid_argot;
}
/**
*
*函数名称:xino_display_imei
*功能描述:查看imei码 *#06#
*返回值:成功-TRUE 失败-FALSE
* 创建 : 徐金鹏 20090814
**/
BOOLEAN xino_display_imei(const char * argot, uint8 argot_len)
{
BOOLEAN b_invalid_argot = FALSE;
if (0x00 == strcmp(argot, "*#06#"))
{
show_IMEI(); // 显示本机 IMEI
b_invalid_argot = TRUE;
}
return b_invalid_argot;
}
下面接口是查找函数表 看输入的暗码是否在函数表中 如果在,进行处理并退出,如果不在, 继续后面的查找,直到找到的函数返回null
/**
*
*函数名称:xino_argot_entry
*功能描述:暗码解析入口
*返回值:成功-TRUE 失败-FALSE
*
**/
BOOLEAN xino_argot_entry(const char * argot, uint8 argot_len)
{
STR_NUM m_argot_str;
BOOLEAN b_invalid_argot = FALSE;
uint8 func_index = 0x00;
if (argot_len > 40)//MMIDIAL_PHONENUM_LEN 40
{
return FALSE;
}
memcpy(m_argot_str.num, argot, argot_len);
m_argot_str.num[argot_len] = 0x00;
m_argot_str.len = argot_len;
while(PNULL != g_argot_func[func_index])
{
if((g_argot_func[func_index])(m_argot_str.num, m_argot_str.len) == TRUE)
{
b_invalid_argot = TRUE;
break;
}
func_index++;
}
return b_invalid_argot;
}
调用示例
//维护菜单 暗码入口
if(xino_argot_entry((const char * )(str_info.str_ptr), str_info.str_len))
{
return ;
}
其中 str_info.str_ptr 为输入的内容 比如 ×#06# str_info.str_len 为输入内容的长度 本例为 5
这样操作的好处在于
如果新增一个 查看IMSI的 暗码 ×#07# 那么可以在表g_argot_func中添加 xino_display_imsi, //查看IMSI *#07# 一项
然后写xino_display_imsi 的实现
BOOLEAN xino_display_imsi(const char * argot, uint8 argot_len)
{
BOOLEAN b_invalid_argot = FALSE;
if (0x00 == strcmp(argot, "*#07#"))
{
show_IMSI(); // 显示本机 IMSI
b_invalid_argot = TRUE;
}
return b_invalid_argot;
}
到此即新增了暗码*#07# 暗码的功能, 非常方便以后的功能扩展。