MTK MMI event 小结

MTK MMI event 小结 2 昨天草草的写了几句,今天自己先复习了想写的东西,一看那么晚了,哎,都怪原来没有搞透,现在复习也有些地方不是很明白。如果有错误希望指正。 今天主要看分析,常用事件机制。做过MTK开发的童鞋应该知道要接受 MTK L4 层的消息,用一个注册函数 SetProtocolEventHandler,注册一个event 的 处理函数。比如短信,电话,电池电量,信号量等等都是通过 这个函数来注册消息。当L4 层,处理完封装事件后,就会把这个event 发送到MMI task 里来(消息发送可以看 MTK ta 阅读详情

在MTK MMI 里面有各种event,最常见的跟交互相关的 按键  event,触摸屏 event。跟各种具体事件比如电话event,短信event,电量event,信号量event,timer event等等。

MTK 都有相应的处理方式,跟交互相关的 按键(KeyBrd.c)和触摸屏(TouchScreen.c) 各有一套自己的机子,timer event 已经在 MTK timer 小结 3 介绍过,还有一套机制就是处理各种其他事件,它主要分为普通事件和interrupt event,interrupt event 主要用于需要弹出的对话框的event。

昨天草草的写了几句,今天自己先复习了想写的东西,一看那么晚了,哎,都怪原来没有搞透,现在复习也有些地方不是很明白。如果有错误希望指正。

今天主要看分析,常用事件机制。做过MTK开发的童鞋应该知道要接受 MTK L4 层的消息,用一个注册函数 SetProtocolEventHandler,注册一个event 的 处理函数。比如短信,电话,电池电量,信号量等等都是通过 这个函数来注册消息。当L4 层,处理完封装事件后,就会把这个event 发送到MMI task 里来(消息发送可以看 MTK task 小结 5 ),然后MMI task 通过这个 event 机制,找到相应的处理函数,进行处理。实现这种机制,也是考虑到零活性和扩张性。如果都在MMI task 里面,用 switch case 来处理,那就很疯狂了,长度不说,写个应用,定义个消息,都要去改MMI task,所以这个机制实现虽然比较简单,但是还是很有必要的。

昨天也说到,这个机制的 event 主要有两种,普通event 和 intrrupt event(中断事件),这些主要是一些需要中断当前应用的事件(主要是看那些弹出框),比如电话,有些应用需要提前处理这个消息,还要处理 这个事件处理完毕后的处理。还是看代码吧

在MMI task 最后,会调用函数 ProtocolEventHandler,这个函数是就是找相应的event 的相应 处理函数(平台不一样,可能实际的函数名字有些区别,但是流程基本上一样的,我这里被 #define 到 mmi_frm_execute_current_protocol_handler)。

// MsgStruct 是 具体事件的 消息体
void mmi_frm_execute_current_protocol_handler(U16 eventID, void *MsgStruct, int mod_src, void *peerBuf)
{
    U16 count = 0;

    PsExtPeerFuncPtr currFuncPtr = NULL;

    U8 interrup_result = MMI_FALSE; /* False not handle interrupt, True will handle */
   
     MMI_BOOL query_result = MMI_FALSE, execute_result = MMI_FALSE;
    interrupt_event_hdlr int_func = NULL, post_int_func = NULL;
    mmi_frm_int_event_type current_frm_int_event;
       

    {
        // 遍历 protocolEventHandler 查找 是否有event 注册了回调函数
        // 虽然这个方法感觉比较笨,就一个数组,实际上对速度没有什么影响
        for (count = 0; count < maxProtocolEvent; count++)
        {
            if (protocolEventHandler[count].eventID == eventID)
            {
                //找到 处理函数
                currFuncPtr = (PsExtPeerFuncPtr) protocolEventHandler[count].entryFuncPtr;
                // 这个地方时,一个优化
                // 处理的事情就是 把刚才现在处理的 event id 往前移动一个单位
                // 这是考虑到 程序的局部性原理, 这个优化还是很有必要的
                if (count > 0)
                {  
                    protocolEventHandler[count].eventID = protocolEventHandler[count - 1].eventID;
                    protocolEventHandler[count].entryFuncPtr = protocolEventHandler[count - 1].entryFuncPtr;
       
                    protocolEventHandler[count - 1].eventID = eventID;
                    protocolEventHandler[count - 1].entryFuncPtr = (PsFuncPtr) currFuncPtr;
                }
                break;
            }
        }
    }

    // 这个就是查找是否是中断事件
    current_frm_int_event = mmi_frm_interrupt_event_converter(eventID, MsgStruct);
    if (current_frm_int_event > 0)
    {
        // 查看改 中断事件是否有 注册 提前处理函数
        query_result = mmi_frm_query_interrupt_event_information(current_frm_int_event, &int_func, &post_int_func);
    }
    // 如果有 调用该函数
    if (query_result && int_func)
    {
        /* New interruption mechanism */
        execute_result = (*int_func)(current_frm_int_event);
    }
   
    //根据 event 相应的回调函数 以及 前面处理的结果,来觉得是否处理该事件
    // 要注意的是,如果如果 interrput 提前处理函数 返回 true,那么 这里就不会执行
    if ((currFuncPtr) && (!interrup_result) && (!execute_result))
    {
        (*currFuncPtr) (MsgStruct, mod_src, peerBuf);
    }
    else
    {
        MMI_TRACE(MMI_FW_TRC_G1_FRM, MMI_FRM_INFO_EVENT_EXECURPTO_NO_HDLR, eventID);
    }
   
    // interrupt event 最后处理函数
    if (query_result && post_int_func)
    {
        execute_result = (*post_int_func)(current_frm_int_event);
    }

 
}
看完这个,其实觉得挺简单的,对吧。就是一个数组,数组里关联了 event id 和 对应的处理函数。

还有就是增加了一种 intrrupt event。可以注册这种event 的 pre_handler  and post_handler。这样如果需要,可以提前做处理或者不响应该事件。

今天先到这 ,待续

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yanwuxufeng/archive/2010/07/29/5775323.aspx

MTK event事件分析总结 mtkevent事件传输及响应事件的分析! 立即下载

相关推荐

MTK MMI event

转自:http://blog.csdn.net/yanwuxufeng/article/details/5808309 在MTK MMI里面有各种event,最常见的跟交互相关的按键event,触摸屏event。跟各种具体事件相关的比如电话event,短信event,电量event,信号量eventtimer event等等。MTK都有相应的处理方式,跟交互相关的按键(KeyBrd.c)和

折翼飞翔 2400

(转)MTK 消息分发及窗口管理

一、总体结构 1. Software Architecture MediaTek Inc . (MTK) 2. MMI Architecture MTK 平台采用的是Pixtel Communications,Inc. 的PIXTEL MMI (现已被MTK 收购,作 为MTK 印度研发中心) 。MMI 的基本工作方式是消息驱动,整个MMI 就是一个任务,不 停的从消息队列中取出消息进行处理。...

qq_34810707的博客 898

idle界面显示Invalid WLAN

MTK手机的默认MAC address 是00 0c e7 00 00 00. 在DataAccountDef.h中有宏定义WLAN_MAC_ADDRESS_INVALID(x)   在函数mmi_wlan_send_event_notify会去调用WLAN_MAC_ADDRESS_INVALID进行判断。如果是mtk默认的MAC address,则wlan_state = DTCNT_BEAR

曹浩洋的专栏 1041

MTK MMI event 小结 5

昨天说了一下key event 的基本情况,今天直接从代码开始吧 先看执行key event 函数 mmi_frm_key_handle   void mmi_frm_key_handle(void *paraBuff) { kbd_data k; U32 msg_count; mmi_eq_keypad_detect_ind_struct *p; // 判断参数是否为空 // 在 初始化时,系统就注册了 MSG_ID

懒人 3456

MTK MMI event 小结 8

MTK MMI event 小结 7 中,说到,init 时候, 注册了触摸屏消息MSG_ID_TP_EVENT_IND 的处理函数 mmi_pen_touch_panel_event_ind, static void mmi_pen_touch_panel_event_ind(void *param ) { // 这个用于控制 只有一个 MSG_ID_TP_EVENT_IND 在 消息队列里 g_pen_is_driver_indication_in_q

懒人 2102

MTK MMI event 小结 6

MTK MMI event 小结 5 中,提到了event 处理函数 mmi_frm_key_handle,这个函数主要作用是判断是否需要处理按键,从按键缓存里面持续的读取按键信息,然后调用 mmi_frm_convert_process_key_event 进行处理。这个函数没有什么可说的,最多是在屏幕旋转的情况下,把 导航键 转换一下,接着它调用了 ProcessKeyEvent, 这个函数主要是对于一些状态的处理,防止key down 和up 不成对,出现混乱。 void P

懒人 3588

MTK MMI event 小结 3

昨天大概的说了下,普通 event 的执行过程。中间还有几个函数没有介绍,这里简单介绍一下   // 这个函数就是简单把 L4c 的interrupt消息,转换成 MMI 层interrupt的消息 static mmi_frm_int_event_type mmi_frm_interrupt_event_converter(U16 event_id, void *msg) { mmi_frm_int_event_type frm_interrupt_event

懒人 2427

MTK MMI event 小结 9

到这里 pen event 其实也就差不多了,说一下几个常用的函数: mmi_pen_enable /mmi_pen_disable  //打开/关闭 pen 事件 mmi_pen_set_calibration_data / mmi_pen_read_calibration_data  //设置和读取校准数据,校准数据总共四个值 x = x*x_scale + x_offset, y = y*y_scale + y_offset mmi_pen_start_calibration 

懒人 2154

MTK MMI event 小结 4

这三天一直没有更新blog,打破了一天一篇的规律。周六日加了两天,再加上一天的通宵,实在有些累。不过再怎么说,感觉是给自己找借口,原来计划是不管多忙,都要更新。以后不会发生了,除非客观原因,比如没网,没电等等。 今天就饥饿着总结MMI event,今天打算说说key eventMTK 的 key envent 管理其实跟 MTK MMI event 小结 2 说的protocol event 机制也差不了多少,简单来说,就是app 通过注册某一个key 的回调函数,当这个key事件产生是,该机

懒人 3471

MTK MMI event 小结 1

MTK MMI 里面有各种event,最常见的跟交互相关的 按键  event,触摸屏 event。跟各种具体事件比如电话event,短信event,电量event,信号量eventtimer event等等。 MTK 都有相应的处理方式,跟交互相关的 按键(KeyBrd.c)和触摸屏(TouchScreen.c) 各有一套自己的机子,timer event 已经在 MTK timer 小结 3 介绍过,还有一套机制就是处理各种其他事件,它主要分为普通事件和interrupt event,i

懒人 3088

MTK MMI event 小结 7

到这,key event 的处理基本上就算完成了。其他几个常用的函数注册key 处理函数了。了解了按键event的处理过程之后(其实也是比较简单的),注册函数就很好了解了,就是把相应key 和 event 的数组里放入一个回调函数的指针。比如 void SetKeyHandler(FuncPtr funcPtr, U16 keyCode, U16 keyType) 抛开其他语句,就是一句简单的实现currKeyFuncPtrs[keyCode][keyType] = funcPtr; 还有可以

懒人 3674

MTK MMI event 小结 1

MTK MMI 里面有各种event,最常见的跟交互相关的 按键  event,触摸屏 event。跟各种具体事件比如电话event,短信event,电量event,信号量eventtimer event等等。MTK 都有相应的处理方式,跟交互相关的 按键(KeyBrd.c)和触摸屏(TouchScreen.c) 各有一套自己的机子,timer event 已经在 MTK timer 小结 3

bravoon的专栏 582
上一篇: C语言嵌入式系统编程修炼之道——性能优化篇
下一篇: MTK 内存管理简单总结
manlt
博客等级 码龄16年 5粉丝 5原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值