MTK UCM outgoing

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界面等待对方回应或者用户挂断电话。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值