昨天大概的说了下,普通 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 的个数。
这个样可以减少 循环查询的次数。
转自:
http://blog.csdn.net/yanwuxufeng/archive/2010/07/31/5777875.aspx