MTK优美代码赏析2:MenuItemMask_flag

从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中操作才能有效。

下面贴出这两个函数实现的代码:

代码

 1 
 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做准备:

1     U16 nNumofItem;
2     U16 nStrItemList[6];

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);

该函数的实现为:

代码

 1 
 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

void mmi_frm_unhide_menu_itemU16 menu_item_id);将要显示的菜单ID对应MenuItemMask数组中的位   置0

而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优秀的代码不断学习。

posted on 2010-09-03 01:57 Anpher Zhang 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zhangsufeng/archive/2010/09/03/1816633.html

MTK优美代码赏析2:MenuItemMask_flag相关推荐

  1. MTK优美代码赏析6:电话本里的快速排序和插入排序算法

    MTK优美代码赏析6:电话本里的快速排序和插入排序算法 记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实 ...

  2. 国际c语言混乱编码大赛,国际C语言混乱代码大赛代码赏析(一)【转】

    国际C语言混乱代码大赛代码赏析(一) 近段时间在看<C专家编程>,里面提到国际C语言混乱代码大赛(The International Obfuscated C Code Contest I ...

  3. MTK LIGHT 代码分析

    MTK LIGHT 代码分析 项目上需要做些客制化的东西,需要用到light 一块的东西,好久以前看过,但是没有记录下来,这次重新看看,然后记录下来. lightservice start priva ...

  4. 代码赏析:子窗口对于键盘和鼠标的响应

    一.引言 首先声明,代码并不是我写的:其次,代码是我在小甲鱼的<Win32 SDK程序设计>系列教程的第41讲中看到的.因为本人一方面在学习这个教程,一方面也对于优美的代码有着自己的独特的 ...

  5. hyperf——代码赏析

    犹豫工作中,看到同事写的代码,太优美了.所以忍不住赏析一番,记录下来以免以后忘记. 数据整合 获取uid%16后组装的数据 数组操作(larvel) 协程操作 数据整合 获取uid%16后组装的数据 ...

  6. GPS之MTK平台代码小结以及gps协议注释

            分类:             通信硬件与通讯协议              2014-10-20 09:55     337人阅读     评论(0)     收藏     举报   ...

  7. 【算法设计与分析】经典代码赏析【1】

    什么样的代码才是好的代码?这是一个将永远继续下去的话题.就如艺术品从来都不仅仅是艺术,艺术级的代码从来都不只是技术问题.什么样的代码才是称得上"艺术级"的代码?没有标准答案.但也许 ...

  8. 读取jar包资源代码赏析

    2019独角兽企业重金招聘Python工程师标准>>> 该代码来自jfinal engine.读取jar包内代码通常通过classLoader获取 // // Source code ...

  9. 利用python创建学生管理系统软件代码赏析

    目录 一.学生管理系统v1.0(需求) 二.代码实现 一.学生管理系统v1.0(需求) 1.添加学生信息 2.删除学生信息 3.查看学生信息 4.修改学生信息 二.代码实现 # 使用字典存储学生信息 ...

最新文章

  1. python要不要装pycharm-Python和pyCharm安装
  2. 解决Linux中使用google chrome浏览器出现:ERR_PROXY_CONNECTION_FAILED 代理错误,导致不能够上网
  3. Win7安装VC++6.0已知的兼容性问题的解决方法
  4. mysql函数及解析,Mysql研究之MySQL常用内置函数完全解析
  5. oracle 多个实例互相切换实例
  6. EasyUI 中 MenuButton 的使用方法
  7. 如何部署 OB 社区版
  8. mysql可以装到其他端口吗_linux下怎么在另一个端口安装高版本mysql
  9. 个所税服务器没有企业信息,【重要】企业纳税申报一定要看进来!
  10. python抓取网易云音乐评论_Python 爬取网易云音乐评论
  11. oracle sqlt(sqltxplain) 诊断工具
  12. 202012月份的计算机出成绩,四六级成绩什么时候出2021 四六级成绩查询时间202012月份...
  13. Qt我的文档 桌面路径
  14. 真是绝了,做了这么多年程序员第一次搞懂微服务架构的数据一致性
  15. CGB2202API基础第1天
  16. ruby--数值类(Numeric)
  17. 隐私合规:检测第三方SDK调用的隐私权限
  18. 中职学校计算机专业宣传口号,中职学校文明宣传标语
  19. 如何解压 .lz4 后缀文件
  20. 基于Spring Session实现JIM分布式Session

热门文章

  1. 史上最全阿里 Java 面试题总结及答案
  2. 软件工程学习笔记(二)软件项目管理
  3. 最新版手机端C/C++语言编程的软件
  4. vim如何与外界复制粘贴
  5. 网管服务器维修,网管员管理和维护的超级武器
  6. 汽车估损师跟二手车评估师的区别及鉴定方法
  7. Python3.6 安装PIL
  8. Matlab中极值I型分布(Gumbel分布)的evcdf和evpdf及evinv函数
  9. 类和对象:类与对象定义
  10. 学会使用getopt函数