MTK6225电话管理--ShowScreens

 

本文简单的描述MO,MT的手机界面的显示过程。

 

1.呼出电话的screen

       呼出电话之后,进入:PsCBackSetCallFeatures()。

 

       进入状态机:CM_PS_SHOW_OUTGOING_CALL_SCREEN

             

       ProcessShowOutgoingCallScreen()

      

       EntryScr1001OutgoingCall()

 

       ShowCategory18Screen()

  

2.L4返回错误消息

       PsCbackOutgoingCallIdSync()

 

       LogCallInfoForCallHistory(GetOutgoingCallHandle());

    GetEndTimeAndLogUnconnectedMOCall();

 

       进入CM:CM_PS_CALLCONNECTED

       ProcessPSCallConnectFailEvent()

 

       PurgeOutgoingCallsStructure()

 

       ShowCallManagementErrorMessage()

 

3.呼出的电话被接通

       OutgoingCallConnected()

 

       DTGetRTCTime(&t);

    UpdateCallStartTimeAndLogCall(handle, &t);

 

       进入CM:CM_PS_CALLCONNECTED

       ProcessPSCallconnectedEvent()

              switch (GetCurrentState())    当前只可能是OUTGOING STATE。

                     MakeHold();

            SetPreviousState(GetCurrentState());

            SetCurrentState(CM_ACTIVE_STATE);

                     SetCallState(gtmpOutgoingIndex, CM_ACTIVE_STATE, FALSE);

                    

                     GoBackToHistory(SCR_CM_ACTIVECALLSCREEN);或者

                     EntryScr1002ActiveCall();

 

                     DummyScr1002ActiveCall()

                     如果大于1通电话:ShowCategory19Screen();否则ShowCategory20Screen()。

 

4.放弃OUTGOING CALL + 挂断一通ACTIVE/HOLD电话

       进入CM:CM_KB_HANGUPREQ

       ProcessKBHangupReqEvent()

              在这里,根据CM的当前状态以及需要挂断的电话的当前状态去调用不同的函数。

              MakePsAthRequest()和MakePsEndSelectiveCall().

      

       虽然发送的挂断电话消息不同,但是最后都是进入状态机:CM_PS_HANGUPSUC。

       ProcessPSHangupSucEvent()              所有挂断电话最后都是在这里处理的(包括网络挂断                                                            ACTIVE和HOLD CALL)。

              这个函数根据当前的CM状态做不同的处理,但是本质上是根据挂断电话的不同                  调用不同的LOG CALL函数和进入不同screen。

              1.挂断的是OUTGOING CALL

              LogCallInfoForCallHistory(*handle);

              GetEndTimeAndNotifyCallAborted()

 

              GetDateTimeAndNotifyCallAbortedCBack()

 

              设置start/end time,然后LogCall()

 

              EntryScrNotifyCallAborted()

 

              根据gDropRequestFlag来设置显示的消息是放弃?还是结束?

 

              ShowCategory63Screen()

 

              启动定时器:GoBackfromNotifyScr()

 

              2.挂断的是ACTIVE或者HOLD CALL

              LogCallInfoForCallHistory(*handle);

              GetEndTimeAndNotifyEndCallDuration(*handle);

 

              如果start time不为0的话,就根据CALL的origination_flag,调用:

              CHISTLogDialedCallDuration() or CHISTLogRecvdCallDuration()。计算最后通话时                  间以及总的通话时间,并写入NVRAM中。

 

              GetDateTimeAndNotifyEndCallDurationCBack()

 

              EntryScr1004NotifyEndCallDuration();

                     获取小显示的“通话已结束”和通话时间。注意:电话未接通就不显示时间。

 

              ShowCategory63Screen()

 

              启动定时器:GoBackfromNotifyScr()

   

5.来电

       PsCBackCallIncoming()

 

       匿名电话处理:MakePsAthRequest( (void*)PsCBackIncomingCallRejected);

 

       进入状态机:CM_PS_CALL_INCOMING

       ProcessIncomingCallEvent()

      

       switch (GetCurrentState())    当前只可能为IDLE或者OUTGOING。(ACTIVE或者                                                    HOLD就是呼叫等待了)

              CASE  IDLE STATE:

                     AddNewCallInfo()

                     黑名单处理

                     自动应答处理

                     EntryScrIncomingCallEvent()

              CASE OUTGOING STATE:

                     与上面的不同有2处:1.如果启动了自动重拨则清除。

                                                        2.没有自动应答处理

                     获取来电的显示姓名或号码,imageID

 

                     ShowCategory17Screen()

 

6.呼叫等待

       PsCBackCallWait()

 

       进入CM: CM_PS_CALL_WAIT

      

       ReleaseCall();

             

       ProcessCallWait()

 

       AddNewCallInfo()

 

       黑名单处理

 

      EntryScrIncomingCallEvent() 与上面的相同,ShowCategory17Screen()。

      看出:呼叫等待没有匿名电话处理,

7.接听来电(呼叫等待)

       KbCBackCallIncomingAccepted()

 

       如果启动了自动应答,关闭自动应答定时器。

 

       停止响铃

 

       进入CM:CM_KB_INCOMING_CALL_ACCEPT

 

       ProcessStateCheckIncomingCall()

 

       根据当前是否存在ACTIVE CALL,调用不同的函数去发送接听消息

       1.不存在ACTIVE CALL

       MakePsCallAcceptIncoming((void*)PsCBackIncomingCallAccepted);                                                       消息是:PRT_INCOMINGCALL_ACCEPT_EVENT

      

       回调:PsCBackIncomingCallAccepted(),

 

       进入状态机:CM_PS_INCOMING_CALL_CONNECTED

 

       2.存在ACTIVE CALL

       MakePsActiveHold((void*)PsCBackActiveCallsHeld); HOLD当前ACTIVE CALL后接听

                            消息:PRT_RETRIEVECALL_EVENT

      

       回调:PsCBackActiveCallsHeld()

 

       进入CM:CM_PS_ACTIVE_CALL_HELD

 
       ProcessCallsHeld()

 

       同步电话:SyncCallList();

 

       MakeHold()

 

       进入状态机:CM_PS_INCOMING_CALL_CONNECTED

 

       ProcessAcceptIncomingCall()

 

       设置gCallHandleForStartTimeUpdate = call_handle。在进入1002screen的时候要用来判           断进入LOG CALL。

      

       switch (GetPreviousState())  判断接听之前的CM状态

              设置CM的状态

              设置INCOMING CALL的状态为ACTIVE

              GoBackToHistory(SCR_CM_ACTIVECALLSCREEN);或者

              EntryScr1002ActiveCall()

 

             DummyScr1002ActiveCall()

                     如果大于1通电话:ShowCategory19Screen();否则ShowCategory20Screen()。

 

 

8.拒接来电

       KbCBackCallIncomingRejected()

 

       停止响铃

 

       进入状态机:CM_KB_INCOMING_CALL_REJECT

 

       在这里,根据拒接电话性质的不同,调用不同的函数(回调函数都一样):

       1.拒接呼叫等待的电话:MakePsSendUDUB()

       2.拒接CCBS电话:MakePsEndSelectiveCall()

       3.拒接正常情况下的电话:MakePsAthRequest()

 

       进入CBACK函数:PsCBackIncomingCallRejected()

       进入状态机:CM_PS_INCOMING_CALL_REJECTED

 

       ProcessIncomingCallRejected()

 

       switch (GetPreviousState())恢复之前的CM状态

 

       LogCallInfoForCallHistory()

       PurgeIncomingCallStructure()

              在这里,设置了SetCallState(IDLE_STATE).如果是黑名单,不会LOG CALL。

             否则:    if( g_bUserReject )        用户主动拒接

                                   GetEndTimeAndNotifyCallRejected();

                            else                         网络挂断(对方放弃)

                         GetEndTimeAndNotifyCallMissed();

      

               GetEndTimeAndNotifyCallRejected()

 

              GetDateTimeAndNotifyCallRejectedCBack()

               设置start/end time为当前时间,并且CHISTLogRejectedCall()

 

              EntryScr1004NotifyEndCallDuration()

 

              GetEndTimeAndNotifyCallMissed()的操作类似:设置start/end time为当前时间,并且CHISTLogMissedCall()。最后EntryScr1004NotifyEndCallDuration()。

 

 

9.网络挂断一通电话

       PsCBackNetworkCallDropped

         停止响铃,进入状态机:CM_PS_NWK_CALL_DROP

        ProcessEndCallIdAndGoBack()

        switch (state):被挂断的电话当前是什么状态

              caseCM_INCOMING_STATE:

                     进入状态机:CM_PS_INCOMING_CALL_DROPPED

                     ProcessIncomingCallRejected() 与拒接来电处理相同。

                            最后进入:EntryScr1004NotifyEndCallDuration().

                     break;

              case CM_OUTGOING_STATE:

                     LogCallInfoForCallHistory(GetOutgoingCallHandle());

            GetEndTimeAndLogUnconnectedMOCall();

                     自动重拨处理

                     SetCallState(handle, CM_IDLE_STATE, TRUE); 在这里设置了变量:

                                   gCallEndedBeforeConnFlag=1

                     设置CM状态

                     EntryScr1004NotifyEndCallDuration();

                     break;

              case CM_HOLD_STATE:

                     if (GetCurrentState() == CM_OUTGOING_STATE) 此时还有MO

                     {

                            ogCallInfoForCallHistory(handle);

                GetEndTimeAndNotifyEndCallDuration(handle);

                SetCallState(handle, CM_IDLE_STATE, TRUE);

                            return CM_CALL_SUCCESS;

                     }

                     SetCallflag(handle, CM_HANGUP_REQUESTED, TRUE);

            OutgoingProcessCMEvent(CM_PS_HANGUPSUC, (void*)&handle);

                     break;

              case CM_ACTIVE_STATE:

            SetCallflag(handle, CM_HANGUP_REQUESTED, TRUE);

            OutgoingProcessCMEvent(CM_PS_HANGUPSUC, (void*)&handle);

              小结:挂断HOLD CALL的处理比挂断ACTIVE CALL的处理多了这样的代码:                    当前存在OUTGOING CALL。注意:不可能同时存在ACTIVE CALL和OUGTOING            CALL的。如果没有OUTGOING CALL,最后都进入状态机:CM_PS_HANGUPSUC

                            ProcessPSHangupSucEvent()   与主动挂断电话的处理相同。

                            GetEndTimeAndNotifyEndCallDuration(*handle);                    

                            最后EntryScr1004NotifyEndCallDuration();

                     设置CM状态。

                     break;

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MTK WLAN框架学习的过程中,如何分析WLAN throughput问题是一个重要的问题。WLAN throughput指的是无线网络的传输速率,通常以Mbps为单位。以下是分析WLAN throughput问题的步骤: 第一步,了解网络配置和设备状态。首先,要了解无线网络的拓扑结构、各设备之间的连接方式以及无线路由器的设置。同时,需要检查所有设备的状态,如信号强度、频率、传输模式等。 第二步,检查网络性能。可以使用网络性能测试工具,如iPerf或Speedtest等,进行测试并评估网络的实际吞吐量。通过测试结果,可以确定网络中是否存在吞吐量问题。 第三步,检查网络干扰。干扰是影响无线网络质量的常见问题。可以使用无线扫描工具,如Wi-Fi Analyzer或inSSIDer等,来检测网络中存在的干扰源,如其他无线网络、电磁干扰或距离过近的设备等。 第四步,优化网络设置。根据分析结果,可以采取一些优化措施来改善WLAN throughput。例如,调整无线路由器的位置和天线方向,选择合适的频率和传输模式,增加信号增强器或使用更高效的设备等。 第五步,进行性能监测。在优化网络设置后,需要进行性能监测,以确保网络吞吐量的提升。可以使用网络监测工具,如Wireshark或MTK提供的调试工具,来监测数据包的传输和分析网络的性能表现。 综上所述,分析WLAN throughput问题需要了解网络配置和设备状态,检查网络性能和干扰情况,优化网络设置,并进行性能监测。通过这些步骤,可以有效地解决WLAN throughput问题,并提升无线网络的传输速率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值