从mtk业已经有15个月了,现在自己虽然对这个mtk的架构很熟悉了,但感觉自己欠缺的还是太多,窥到嵌入式的冰山一角让我更加渴望更深层次的学习。
感谢艾利平老师,虽然他已离职数月,但他教导我的思想依然清晰的萦绕在耳旁,每当我困惑和苦恼时指引我方向。。
艾老师教导的对我特别特别有现实指导意义的一句话是:原始的(或者是前期)的系统是完美的,出现问题的部分往往是我们后期所作的修改导致的,任何的问题都要在这个前提下进行修改才能最高效最快速的找到问题所在。
随着工作的不断深入,我对艾老师的这句话的体味越来越深,无论是自己新增加的模块还是自己修改的简单的bug,我都会先努力把原先的完美的系统架构和处理流程走一遍,然后将自己设计的思路和系统的流程进行无缝的整合,最后才去做代码实现。这样一来不仅使自己的代码更加精炼高效,而且使得编码的过程充满了乐趣。
艾老师现在在SKY工作,有认识他的朋友见了他请代我向他问个好啊。
作者 张素丰 ,转载请注明出处: http://www.cnblogs.com/zhangsufeng/archive/2010/09/03/1816633.html
废话不谈了,开始正文。
最近测试组对手机里IP通话这方面很是重视,不仅要求IP设置里面的内容可设置也可取消设置,而且要求通过通话记录等所有相关方式实现IP拨号。在做这块内容时自己频繁的用到mmi_frm_hide_menu_item和mmi_frm_unhide_menu_item函数,以前只知道用,没怎么去看过他的实现,今天禁不住好奇就偷偷钻进去瞄了一眼,不看还不想看,一看就觉得惊奇,这两个函数功能虽简单,却使用另一种自己没想到的手法去实现。让我再次感叹mtk代码的规范优美。
首先介绍在这之中一个很重要的变量:static U8 MenuItemMask[(MAX_MENU_ITEMS_VALUE / 8) + 1];
mtk使用8位数的数组来存储所有菜单的显示属性,每个数的每个位代表一个菜单是否显示,0表示显示,1表示隐藏。
用位来表示菜单的显示属性,这种做法让我惊叹,不仅数据量得到减小,而且逻辑紧密,接口清晰。
但有一点不足,就是这两个函数操作的menuid必须定义在GlobalMenuItems.h中操作才能有效。
下面贴出这两个函数实现的代码:
2 /*****************************************************************************
3 * FUNCTION
4 * mmi_frm_hide_menu_item
5 * DESCRIPTION
6 * Set the bit represented the menuitem on to hide it
7 * PARAMETERS
8 * menu_item_id [IN] Id of the menuitem
9 * RETURNS
10 * void
11 *****************************************************************************/
12 void mmi_frm_hide_menu_item(U16 menu_item_id)
13 {
14 /*----------------------------------------------------------------*/
15 /* Local Variables */
16 /*----------------------------------------------------------------*/
17 U16 idx = 0, reminding = 0;
18 U16 item_id = menu_item_id - 1;
19
20 /*----------------------------------------------------------------*/
21 /* Code Body */
22 /*----------------------------------------------------------------*/
23 if (menu_item_id < MAX_MENU_ITEMS_VALUE)
24 {
25 idx = item_id / 8;
26 reminding = item_id - (idx * 8);
27 MenuItemMask[idx] |= (1 << (7 - reminding));
28 }
29 }
30
31
32
33 /*****************************************************************************
34 * FUNCTION
35 * mmi_frm_unhide_menu_item
36 * DESCRIPTION
37 * Reset the bit represented the menuitem on to unhide it
38 * PARAMETERS
39 * menu_item_id [IN] Id of the menuitem
40 * RETURNS
41 * void
42 *****************************************************************************/
43 void mmi_frm_unhide_menu_item(U16 menu_item_id)
44 {
45 /*----------------------------------------------------------------*/
46 /* Local Variables */
47 /*----------------------------------------------------------------*/
48 U16 idx = 0, reminding = 0;
49 U16 item_id = menu_item_id - 1;
50
51 /*----------------------------------------------------------------*/
52 /* Code Body */
53 /*----------------------------------------------------------------*/
54 if (menu_item_id < MAX_MENU_ITEMS_VALUE)
55 {
56 idx = item_id / 8;
57 reminding = item_id - (idx * 8);
58 MenuItemMask[idx] &= ~(1 << (7 - reminding));
59 }
60 }
61
一般在调用完这两个函数后还会执行如下的动作,以便为shouCategory做准备:
2 U16 nStrItemList[6];
3
4 nNumofItem = GetNumOfChild_Ext(MENU_ID_PHB_EXTRA_NUMBER);
5 GetSequenceStringIds_Ext(MENU_ID_PHB_EXTRA_NUMBER, nStrItemList);
执行的这两个函数实现如下:
代码
其中核心的实现函数为:MMI_BOOL mmi_frm_test_menu_item_hide(U16 menu_item_id);
该函数的实现为:
2 /*****************************************************************************
3 * FUNCTION
4 * mmi_frm_test_menu_item_hide
5 * DESCRIPTION
6 * test if the menuitem is hidden or not
7 * PARAMETERS
8 * menu_item_id [IN] Id of the menuitem
9 * RETURNS
10 * MMI_BOOL MMI_TRUE if the menuitem is hidden
11 *****************************************************************************/
12 MMI_BOOL mmi_frm_test_menu_item_hide(U16 menu_item_id)
13 {
14 /*----------------------------------------------------------------*/
15 /* Local Variables */
16 /*----------------------------------------------------------------*/
17 U16 idx = 0, reminding = 0;
18 U16 item_id = menu_item_id - 1;
19
20 /*----------------------------------------------------------------*/
21 /* Code Body */
22 /*----------------------------------------------------------------*/
23 if (menu_item_id < MAX_MENU_ITEMS_VALUE)
24 {
25 idx = item_id / 8;
26 reminding = item_id - (idx * 8);
27 if ((MenuItemMask[idx] >> (7 - reminding)) & 1)
28 {
29 return MMI_TRUE;
30 }
31 }
32 return MMI_FALSE;
33 }
34
void mmi_frm_hide_menu_item(U16 menu_item_id);将要隐藏的菜单ID对应MenuItemMask数组中的位 置1
而MMI_BOOL mmi_frm_test_menu_item_hide(U16 menu_item_id);通过判断MenuItemMask中对应的位是否是1来判断这个位所对应的菜单是否被隐藏,他所使用到的
CUSTOM_MENU nCustMenus[MAX_MENU_ITEMS];
定义在StandaloneRes.c中InitializeResourceVariables函数里面
nCustMenus = (CUSTOM_MENU *)(langpack2ndJumpTbl[9]);//071706 menu resource
其中
void* langpack2ndJumpTbl[] = {
(void*) mtk_gLanguageArray, (void*) &mtk_gMaxDeployedLangs,
(void*) mtk_gStringList,
(void*) mtk_gIMEModeArray, (void*) mtk_gIMEQSearchModeArray
,(void*) mtk_gIMELDBArray, (void*) &mtk_gIMEModule
#if defined(__MMI_T9_TR_CHINESE__)
,(void*) &l0104
#else
,0
#endif
#if defined(__MMI_T9_SM_CHINESE__)
, (void*) &l0204
#else
,0
#endif
,(void*) mtk_nCustMenus//071706 menu resource
};
则nCustMenus[] 为CUSTOM_MENU mtk_nCustMenus[]
上述数组是在Mtk_resgenerator.cpp 中生成的,进入MTK编译系统,这里就不阐述了。
上述的工作方式希望对自己以后得代码有参考价值。向mtk优秀的代码不断学习。