我是靠谱客的博主 怕孤独楼房,最近开发中收集的这篇文章主要介绍MTK MMI event 小结 2,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

今天主要看分析,常用事件机制。做过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。这样如果需要,可以提前做处理或者不响应该事件。

今天先到这 ,待续

最后

以上就是怕孤独楼房为你收集整理的MTK MMI event 小结 2的全部内容,希望文章能够帮你解决MTK MMI event 小结 2所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部