一、进入ILDE界面
1.EntryIdleScreen()
2.mmi_idle_entry_idle_screen()
注册按键:HandleIdleScreenDigitEntry()
IdleSetLRKey()注册左软件EntryMainMenuFromIdleScreen(),右软件mmi_phb_idle_enter_phb_list()
注册SEND键CHISTGetCallLogBySENDKey()
注册相机按键mmi_camera_entry_app_screen()
注册声音按键SetDefaultVolumeKeyHandlers()
二、按下数字键(123456)
1. HandleIdleScreenDigitEntry()
判断是否处飞行静音模式
2. IdleScreenDigitHandler()
ShowCategory16Screen()建立拨号输入框,并且注册每个按键的响应
执行数字键‘1’的响应:MMI_key_1_down()
注册 左软件IdleDialPadSavePhoneBook(),SEND键IdleDialPadCall (),#键IdleAbbrevDialling(),
速拨IdleCallSpeedDialOnLongPress(),语音DialVoiceMail()
三、按下SEND键拨号
1. IdleDialPadCall()
gTempUseIPNum——
判断是否是ssc_table2[]中号码()
mmi_idle_remove_dialer_screen_exit_handler()
2. MakeCall()
在初始化函数InitCallInfo( )中设置了cm_p->ucm_action_type = MMI_GSM_UCM_NO_ACTION,cm_p->ucm_operation = MMI_GSM_UCM_IDLE
因此: mmi_ucm_app_make_call(MMI_UCM_VOICE_CALL_TYPE, (U8*)strNumber);
return;
3. mmi_ucm_app_make_call()
把拨号信息装载到g_ucm_p->mo_info中(module_id, dial_type, dial_num.num_uri,只有号码,暂时还没有姓名)
4. mmi_ucm_outgoing_call_sendkey()
判断是否是飞行模式mmi_bootup_get_active_flight_mode()
判断UCM是否存在有待处理的CALL:mmi_ucm_is_pending_action()
判断是否是call related supplementary service:mmi_ucm_is_crss()
判断是否是紧急呼叫:mmi_ucm_is_sos_number()--CheckValidEmergencyNo1()
判断是否是空号码
判断是否已经存在SOS
判断UCM是否忙:mmi_ucm_is_busy()--没有需要处理的Call,没有OUTGOING, INCOMING的group,没有emergency call。
判断是否可以显示拨号选项:mmi_ucm_dial_option()
以上都排除之后,存在以下3中拨号:
(1)是SS_OPERATION:mmi_ucm_dial_action()
(2)已经存在DATA/CSD且本次拨号非DATA/CSD,或者已经存在非DATA/CSD且本次拨号是DATA/CSD:(即:DATA/CSD与正常call不能同时存在)
g_ucm_p->mo_info.is_wait_dial = TRUE;
mmi_ucm_end_all_action();
(3)已经有一组group电话状态为MMI_UCM_ACTIVE_STATE:mmi_ucm_hold_and_dial_action()
(4) mmi_ucm_dial_action( )
如果拨号失败,设置自动重拨。
5. mmi_ucm_dial_action()
S32 freeTab = g_ucm_p->call_list.num_group;
mmi_ucm_id_info_struct actionId; 这个变量传到下一个函数去
g_ucm_p->call_misc.curr_action = MMI_UCM_DIAL;
装载g_ucm_p->call_list.group_info[freeTab]信息(group_id, call_type, call_state)
装载g_ucm_p->call_list.group_info[freeTab].call_info[0]信息
g_ucm_p->call_list.group_info[freeTab].num_call++;
g_ucm_p->call_list.num_group++;
装载actionId
mmi_ucm_pre_send_req(MMI_UCM_DIAL, &actionId, NULL, &g_ucm_p->mo_info);
6. mmi_ucm_pre_send_req( ) 所有关于CALL的请求都要走这里
mmi_ucm_dial_req_struct dialReq;
装载dialReq
mmi_ucm_send_req(op_code, first_ptr->call_type, &dialReq);
7. mmi_ucm_send_req( ) 所有关于CALL的请求都要走这里
mmi_gsm_ucm_act_req(MMI_UCM_DIAL, act_struct);
8. mmi_gsm_ucm_act_req( )
设置了cm_p->ucm_action_type = MMI_GSM_UCM_NORMAL,cm_p->ucm_operation = MMI_GSM_UCM_DIAL
mmi_gsm_dial(act_struct)
9. mmi_gsm_dial( )
MakeCall((PS8)dial_number);
10.MakeCall( )
此时,cm_p->ucm_operation = MMI_GSM_UCM_DIAL
判断是否是紧急拨号
判断号码是否为空,是否含有非法字符
MakeCallEx(strNumber, TRUE, CSMCC_VOICE_CALL);
11.MakeCallEX( )
装载UnicodeDTMFPadCallBuffer
CheckShortCutOrCall(call_type);
12. CheckShortCutOrCall( )
装载DTMFPadCallBuffer
判断是否含有#
判断是否是短号码
MakeMyCall((PS8) dtmfBuf,call_type)
13. MakeMyCall( )
OUTGOING_CALL outCall;
装载outCall。(号码,类型)
MakeOutgoingcall(outCall);
14. MakeOutgoingcall( )
OutgoingProcessCMEvent(CM_KB_OUTGOINGCALL, &MsgStruct); 进入状态机
15. ProcessKBOutgoingEvent()
装载gCurrOutcall(号码和类型)
switch (GetCurrentState())
case CM_IDLE_STATE:
SetPreviousState(CM_IDLE_STATE);
SetCurrentState(CM_OUTGOING_STATE);
AddNewCallInfo()
MakePsInitiateCall((PU8)MsgStruct, (void*)OutgoingCallConnected);
16. MakePsInitiateCall( )
获取IP number。不使用为NULL
MakePsSSVUSSDReq(MsgStruct, (PU8) IPNum, length, (void*)PsCBackSetCallFeatures);
17. MakePsSSVUSSDReq( )
装载消息结构,发送消息:PRT_USSDVSS_REQ(到L4层分析号码)