您的位置:首页 > 其它

MTK MMI event 小结 3

2010-07-31 01:26 316 查看
昨天大概的说了下,普通 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 = 0;

switch (event_id)
{
// GPIO 消息
case PRT_EQ_GPIO_DETECT_IND:
{
mmi_eq_gpio_detect_ind_struct *gpio_detect_ind = (mmi_eq_gpio_detect_ind_struct *)msg;
switch (gpio_detect_ind->gpio_device)
{
// 翻盖关闭
case EXT_DEV_CLAM_CLOSE:
{
frm_interrupt_event = MMI_FRM_INT_CLAM_CLOSE;
break;
}
// 翻盖打开
case EXT_DEV_CLAM_OPEN:
{
frm_interrupt_event = MMI_FRM_INT_CLAM_OPEN;
break;
}
// 耳机插入 拔出
case EXT_DEV_EARPHONE:
{
if (gpio_detect_ind->on_off == 1)
{
frm_interrupt_event = MMI_FRM_INT_EARPHONE_PLUG_IN;
}
else
{
frm_interrupt_event = MMI_FRM_INT_EARPHONE_PLUG_OUT;
}
break;
}
}
break;
}
// 充电信息,
case PRT_BATTERY_STATUS_IND:
{
mmi_eq_battery_status_ind_struct *battery_status_ind = (mmi_eq_battery_status_ind_struct*)msg;

frm_interrupt_event = mmi_frm_get_frm_int_event_macro(
battery_status_ind->battery_status,
mmi_frm_int_event_battery_table,
sizeof(mmi_frm_int_event_battery_table) / sizeof(mmi_frm_int_event_battery_table[0]));
/* For low battery indication */
if (battery_status_ind->battery_status == PMIC_VBAT_STATUS)
{
if (battery_status_ind->battery_voltage == BATTERY_LOW_WARNING)
{
frm_interrupt_event = MMI_FRM_INT_BATTERY_LOW_WARNING;
}
else if (battery_status_ind->battery_voltage == BATTERY_LOW_TX_PROHIBIT)
{
frm_interrupt_event = MMI_FRM_INT_BATTERY_LOW_TX_PROHIBIT;
}
}
break;
}
case MSG_ID_TIMER_EXPIRY:
case MSG_ID_MMI_EQ_POWER_ON_IND:
case MSG_ID_MMI_EQ_KEYPAD_DETECT_IND:
{
break;
}
default:
{
//其他 interrupt event,主要是弹出框相关,短信报告等等
frm_interrupt_event = mmi_frm_get_frm_int_event_macro(
event_id,
mmi_frm_int_event_convert_table,
sizeof(mmi_frm_int_event_convert_table) / sizeof(mmi_frm_int_event_convert_table[0]));
break;
}
}
return frm_interrupt_event;
}


这个函数就是把 L4C 的消息转换到 MMI 的消息,然后通过 mmi_frm_query_interrupt_event_information 这个函数去查找,是否有相应的注册。这个函数比较简单,就是数组里去比较。

还有一个常用的函数是 SetProtocolEventHandler,也就是注册一个消息的地回调函数。

具体也没有什么可说的,无非就是循环查找是否有这个 event。

1,如果有,看func 是否为空,为空表示去掉这个event 的注册,不为空,就直接修改 这个event 的 func

2,没有,就增加一个event。

这里注意,由一个小小的优化,就是判断,event 数组的最后是否为无效的 event,如果无效,那么减少总注册event 的个数。

这个样可以减少 循环查询的次数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: