Gemini 版本 从Idle拨号到出现outgoing画面的具体流程以及函数调用。(由于排版问题,请copy到UE查看)
在IDLE界面输入电话号码 IdleApp.c
mmi_idle_entry_idle_screen()
SetGroupKeyHandler(HandleIdleScreenDigitEntry,
IdleScreenDigits,
MAX_IDLE_SCREEN_DIGITS - 1,
KEY_EVENT_DOWN);
CHISTResetCallLogIndex();
设置全局变量:currKeyFuncPtrs[][]。把IdleScreenDigits[]里定义的 KEY_0,KEY_1,…KEY_9,KEY_START,KEY_POUND这几个按键的响应函数都设置为函 数:HandleIdleScreenDigitEntry()。
按下按键输入数字后,进入HandleIdleScreenDigitEntry()
HandleIdleScreenDigitEntry()
保存keycode g_idle_context.IdleScreenDigitKeyCode
IdleScreenDigitHandler() IDLE_SCREEN_DIGIT_HANDLER_ID
SetDialingKeypadCallHandler(
(MTPNP_AD_Get_UsableSide() >= MTPNP_AD_SIMCARD1_USABLE) ? IdleDialPadCall : EntryScrEmergencyCallDialing);
ExecuteCurrKeyHandler(g_idle_context.IdleScreenDigitKeyCode, KEY_EVENT_DOWN);
SetLeftSoftkeyFunction(IdleDialPadSavePhoneBook, KEY_EVENT_UP);
MTPNP_PFAL_CC_HandleSendKeys(((MTPNP_AD_Get_UsableSide() >= MTPNP_AD_SIMCARD1_USABLE) ? IdleDialPadCall : EntryScrEmergencyCallDialing),KEY_EVENT_UP/*IdleDialPadCall*/);
SetKeyHandler(IdleAbbrevDialling, KEY_POUND, KEY_EVENT_UP);
SetCategory16RightSoftkeyFunction(GoBackHistory, KEY_EVENT_UP);
按send key进入直接拨号
IdleDialPadCall()
SetTempUseIPNumber(FALSE);//设置gTempUseIPNum=0,没有使用IP拨号
SSCStringParsing2()
ClearInputEventHandler(MMI_DEVICE_ALL);
mmi_idle_remove_dialer_screen_exit_handler();
MakeCall(g_idle_context.DialPadCallBuffer);
以上都是在IDLE这个application中操作哦,然后进入MakeCall,进入CALL MANAGEMENT中操作。
然后把g_idle_context.DialPadCallBuffer保存的用户输入的号码与补充业务的字串作比较。
如果是某个补充业务的字串,就直接执行代码中与定义的处理函数;如果不是补充业务的字串,就MakeCall ()。
补充业务的字串在文件:SSCStringHandle.h中定义。
MakeCall()
DUAL分支
mmi_ucm_app_make_call(MMI_UCM_VOICE_CALL_TYPE, (U8*)strNumber);
mmi_ucm_outgoing_call_sendkey()
mmi_ucm_dial_action();
mmi_ucm_pre_send_req(MMI_UCM_DIAL, &actionId, NULL, &g_ucm_p->mo_info);
mmi_ucm_send_req(op_code, first_ptr->call_type, &dialReq);
mmi_gsm_ucm_act_req(MMI_UCM_DIAL, act_struct);
SetUCMOperationState(MMI_GSM_UCM_NORMAL, MMI_GSM_UCM_DIAL);
mmi_gsm_dial(act_struct);
MakeCall((PS8)dial_number);循环一遍 又回到了顶端,进入call分支
实际call分支
检查号码是否是紧急号码,格式是否符合要求,
MakeCallEx(strNumber, TRUE, CSMCC_VOICE_CALL);
ClearDtmfBuf();
FillDtmfBuff((PU8) strNumber);
CheckShortCutOrCall(call_type);
MakeMyCall()
MakeOutgoingcall(outCall);
OutgoingProcessCMEvent(CM_KB_OUTGOINGCALL, &MsgStruct);进入状态机处理
ProcessKBOutgoingEvent()
呼叫电话,不能在CM当前处于OUTGOING状态。
AllowMoreCalls()判断能否再呼出一通电话。当1当前已经大于或等于6通电话了,2存在紧急电话 EmergencyCallPresent(),3当前存在正在挂断的电话GetCallAbortReqSentFlag(),4存在呼叫等待的电话并 且在history screen中,存在ITEM_SCR_USSN_MSG。
gtmpOutgoingIndex = GetFirstFreeIndex();
AddNewCallInfo()注意:如果在IDLE状态下呼叫,这个电话当前状态设置为OUGTOING,如果不是在IDLE状态下呼叫电话,那么这 个CALL的当前状态被设置为GetCurrentState()。
MakePsInitiateCall((PU8)MsgStruct, (void*)OutgoingCallConnected);//callback 被替换了。没用到
MakePsSSVUSSDReq(MsgStruct, (PU8) IPNum, length, (void*)PsCBackSetCallFeatures);
SetProtocolEventHandler((PsFuncPtr) callBack, PRT_USSDVSS_RSP);
OslMsgSendExtQueue(&Message);
然后L4返回消息PRT_USSDVSS_RSP,进入CBACK:
PsCBackSetCallFeatures()
TRUE==DeriveAndSetCallFeatures()
PhoneNumberStruct = mmi_phb_call_get_data_for_call_mgnt(GetOutgoingNumber(), TRUE, SIM1);
SetCMPhoneBookStruct(&PhoneNumberStruct);
SetOutgoingNamefromPhonebook();
mmi_gsm_dial_rsp(TRUE, CC_OPERATION, NULL);
SetUCMOperationState(MMI_GSM_UCM_NO_ACTION, MMI_GSM_UCM_IDLE);
mmi_gsm_get_call_list()
GetCMPhoneBookStruct()
mmi_ucm_dispatch_rsp(MMI_UCM_DIAL, MMI_UCM_VOICE_CALL_TYPE, (void *)&dial_rsp);
mmi_ucm_dial_act_rsp(act_struct);
mmi_ucm_sync_call_list(rsp->call_list);
mmi_ucm_set_process_state()
mmi_ucm_go_back_screen_check()
mmi_ucm_entry_marker()
mmi_ucm_entry_outgoing_call()
EntryNewScreen(SCR_ID_UCM_OUTGOING, ..., ..., NULL);进入outgoing界面
register key handle
TurnOnBacklight(1)
CHISTSetDialFromCallLogFlag(0);
首先判断L4返回的消息是否成功,并且判断是否是VOICE CALL。
如果失败,显示失败提示信息,然后恢复CM之前的状态,设置这个CALL为IDLE状态,并且如果之前有INCOMING或者OUTGOING CALL,那么要重新设置变量:SetCMPhoneBookStruct(&phb_data);
如果成功,并且gIsCCCall=1,那么就根据呼叫的号码到电话簿中找相关的信息:
PhoneNumberStruct = mmi_phb_call_get_data_for_call_mgnt(GetOutgoingNumber(), TRUE);
并且设置SetCMPhoneBookStruct(&PhoneNumberStruct);就是设置gPhoneNumberStruct变量。
然后根据CHISTGetDialFromCallLogFlag()来判断是否从CALL LOG中拨号:
如果不是,那么就用刚才从电话簿中获取的信息去设置cm_p中的AllCalls变量: SetOutgoingNamefromPhonebook();--把gPhoneNumberStruct里面的name,name_dcs复制到 cm_p->state_info.AllCalls[index]的pBname和name_dcs中。
如果是,并且CALL LOG中的名字与从电话簿中获取的名字一致,则什么都不做;如果不一致,那么就使用CALL LOG中的名字,设置gPhoneNumberStruct的值全为0。
outgoing界面等待对方回应或者用户挂断电话。