本文简单的描述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()
设置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()
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()
看出:呼叫等待没有匿名电话处理,
7.接听来电(呼叫等待)
KbCBackCallIncomingAccepted()
1.不存在ACTIVE CALL
MakePsCallAcceptIncoming((void*)PsCBackIncomingCallAccepted); 消息是:PRT_INCOMINGCALL_ACCEPT_EVENT
回调:PsCBackIncomingCallAccepted(),
2.存在ACTIVE CALL
MakePsActiveHold((void*)PsCBackActiveCallsHeld); HOLD当前ACTIVE CALL后接听
消息:PRT_RETRIEVECALL_EVENT
回调:PsCBackActiveCallsHeld()
ProcessCallsHeld()
ProcessAcceptIncomingCall()
switch (GetPreviousState()) 判断接听之前的CM状态
设置CM的状态
设置INCOMING CALL的状态为ACTIVE
GoBackToHistory(SCR_CM_ACTIVECALLSCREEN);或者
EntryScr1002ActiveCall()
如果大于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;