bigbaicai

芯方式是以半导体人、电子工程师等电子行业相关领域从业人员为核心的知识经验学习、分享、交流社群。 凭借开放、合作、共赢的运营理念,聚集了来自国内外知名院校和顶尖科技公司的半导体人、电子工程师。 我们致力于营造专业、认真、有温度的分享交流环境,将高质量的内容和方案成规模地生产和分享,帮助个人和团队在芯方式找到有价值的Key。 http://www.icfans.com/

自动重拨(auto redial)功能

0
阅读(2115)

[DESCRIPTION]
自动重拨是 GSM 02.07 中要求的一个功能,在规范中的名字是 Automatic calling repeat call。
按照规范要求,只有如下图要求的 error cause 才可以进行 auto redial。可以看到这些 error cause 多是表示网络
没有能够连通的情况。而不是对方主动挂断的情况。如果对方主动挂断也要被 redial,那就变成骚扰电话了。
Auto redial 的时间也是有限制的。随着 redial 次数的增加,redial 的时间间隔也会增长。这也是为了使 redial
功能不陷入骚扰电话的行列。
MTK 将 Auto redial 功能做到的 MMI。OEM 公司可以根据自己的需要来对 redial 功能进行修改和重新设计。具体请
参考 solution。
[SOLUTION]来自半导体社区
Before 09B:
1、开机 auto redial 功能:
顺次进入 Call Center(通话中心)->Call Settings(通话设置)->Advance settings(高级设置)->Auto redial(自动重
拨)。设置为 on 表示开机自动重拨功能,设置为 off 表示关闭自动重拨功能。这个设置对 SIM1 和 SIM2 是同时生效
的。
2、Auto redial 的工作流程:
MO Call 失败后,代码会走到函数 ProcessPSCallConnectFailEvent 中。这支函数中会做如下动作:
A: 判断 error cause 是否在指定范围内。IsRedialNeeded
B: 判断 auto redial 功能是否有打开。IsRedialSet
C: 发送 auto redial 的 Ind 给 UCM。UCM 会负责显示提示窗口以及设置 redial 的时间。mmi_gsm_auto_redial_ind
设置 redial 号码是通过函数 SetRedialNumber 来完成的。
Auto redial 的 Ind 由函数 mmi_ucm_auto_redial_ind 来处理。在这支函数中会对 Call 状态进行最后一次判断,如
果条件符合,调用函数 mmi_ucm_entry_auto_redial 显示 redial 的提示窗口,并设置
StartTimer(UCM_AUTO_REDIAL_TIMER, g_ucm_p->auto_redial.time * UI_POPUP_NOTIFYDURATION_TIME,
mmi_ucm_auto_redial_timeout_handler); Timer 超时后调用函数 mmi_ucm_auto_redial_timeout_handler 并进一步
调用函数 mmi_ucm_outgoing_call_sendkey 将号码拨出。号码传递是在函数 mmi_ucm_auto_redial_timeout_handler
中通过下面方式完成的。
strncpy((S8*)g_ucm_p->mo_info.dial_num.num_uri, (S8*)g_ucm_p->auto_redial.num_uri, num_len);
3、重新设置 auto redial 的 error cause 条件。
在函数 IsRedialNeeded 中添加新的 case。例如:
switch (response)
{
case ERR_USER_BUSY:
SetMaxAttempts(10);
result = TRUE;
break;
注:目前该功能是完全按照 Spec 来做的,新的修改可能会导入新的问题,请一定在测试充分的情况下应用。
After 09B:
1、开机 auto redial 功能:
顺次进入 Call Center(通话中心)->Call Settings(通话设置)->Advance settings(高级设置)->Auto redial(自动重
拨)。设置为 on 表示开机自动重拨功能,设置为 off 表示关闭自动重拨功能。这个设置对 SIM1 和 SIM2 是同时生效
的。

ICfans
2、Auto redial 的工作流程:
MO Call 失败后,代码会走到函数 srv_gcall_redial 中。这支函数中会做如下动作:
A: 判断 auto redial 功能是否有打开。srv_gcall_redial_is_set
B: 判断 error cause 是否在指定范围内。srv_gcall_redial_set_max_attempt
C: 设置重拨时间间隔以及剩余重拨次数。srv_gcall_redial_set_backoff
D: 发送 auto redial 的 Ind 给 UCM。UCM 会负责显示提示窗口以及设置 redial 的时间。mmi_ucm_auto_redial_ind
设置 redial 号码是通过函数 srv_gcall_ucm_auto_redial_ind 与 srv_ucm_auto_redial_ind 接力完成的,最终号码
会保存到 g_ucm_srv_p->auto_redial 中。
设置重拨 Timer 是在函数 srv_ucm_auto_redial_ind中来做的。超时后会调用
srv_ucm_auto_redial_timeout_handler 将号码拨出。
3、重新设置 auto redial 的 error cause 条件。
在函数 srv_gcall_redial_set_max_attempt 中添加新的 case。例如:
switch (cause)
{
case SRV_GCALL_RESULT_USER_BUSY:
case SRV_GCALL_RESULT_NO_USER_RESPONDING:
case SRV_GCALL_RESULT_DEST_OUT_OF_ORDER:
case SRV_GCALL_RESULT_NO_ANSWER_ON_ALERT:
case SRV_GCALL_RESULT_NO_CIRCUIT_CHANNEL_AVAIL:
case SRV_GCALL_RESULT_TEMPORARY_FAILURE:
case SRV_GCALL_RESULT_SWITCH_EQUIPMENT_CONGESTION:
case SRV_GCALL_RESULT_REQUESTED_CKT_CHANEL_NOT_AVIL:
case SRV_GCALL_RESULT_RESOURCE_UNAVAIL_UNSPECIFIED:
case ERR_USER_BUSY:
cm_p->redial_info.max_attempt = 10;
return MMI_TRUE;
case SRV_GCALL_RESULT_UNASSIGNED_NUM:
case SRV_GCALL_RESULT_NO_ROUTE_TO_DESTINATION:
case SRV_GCALL_RESULT_NUMBER_CHANGED:
case SRV_GCALL_RESULT_INVALID_NUMBER_FORMAT:
case SRV_GCALL_RESULT_NETWORK_OUT_OF_ORDER:
cm_p->redial_info.max_attempt = 1;
return MMI_TRUE;
default:
return MMI_FALSE;
}
注:目前该功能是完全按照 Spec 来做的,新的修改可能会引出新的问题,请一定在测试充分的情况下应用。