typedef struct
{
U8 CallerID; //手机中保存的Caller ID状态。执行过程是:用户设置之后,MMI向L4发送消息,然后等待RSP消息。 等到RSP后,判断设置是否成功。如果返回结果为1,就把用户输入的CallerIDInput拷贝到CallerID中,然后写入NVRAM。
U8 CallerIDInput; //Caller ID的状态。可能值:
typedef enum
{
CLIR_INVOKE,//隐藏
CLIR_SUPPRESS,//显示
CLIR_AUTO //网络预设
} rmmi_clir_enum;
U8 CTRStatus; //手机中已经存储的CTR状态。0-没有提醒,1-一次,2-周期
U8 CTRStatusInput; //在【通话时间提示】这个SCREEN中,当前高亮的ITEM
U8 CTRNumber[MAX_CTR_NUM_DIGITS *ENCODING_LENGTH];
//手机中已经存储的提醒时间
U8 CTRNumberInput[MAX_CTR_NUM_DIGITS *ENCODING_LENGTH];
//接收用户输入的提醒时间
U8 CTDStatus; //通话时间显示是否开启
U8 CTDInput; //用于显示提示信息的索引。也就是:“通话时间显示”这个ITEM在//“通话设置”这个SCREEN中的索引
U8 AutoRedialStatus; //自动重拨是否开启
U8 AutoRedialInput; //与CTDInput是相同的作用
U8 LineID;
U8 LineIDInput;
#ifdef __MMI_LINE_SWITCH_SHOW_NUMBER__
U8 LineInfo[(MAX_PB_NUMBER_LENGTH + 25) *ENCODING_LENGTH];
#else
U8 LineInfo[25 *ENCODING_LENGTH];
#endif
U8 SSDisplayBuffer[MAX_DISP_UCS2]; //设置辅助服务时,保存操作结果字串
U8 SSBarPassStep; //控制输入密码的步骤
U8 SSBarType; //【呼叫限制】的类型
U8 SSBarAction; //开启或者关闭
U8 SSBarPassOld[BARR_SIM_PASS_LEN *ENCODING_LENGTH + 4];
U8 SSBarPassNew[BARR_SIM_PASS_LEN *ENCODING_LENGTH + 4];
U8 SSBarPassCfrm[BARR_SIM_PASS_LEN *ENCODING_LENGTH + 4];
U8 SSCFType; //【呼叫转移】的类型SS-附加服务,CF—Call Forward!
U8 SSCFCondQueryStage; //cond类型
U8 SSCFNum[(MAX_CC_ADDR_LEN *ENCODING_LENGTH) + 2];
//保存【呼叫转移】的号码
U8 SSCFNumFromPHB; //号码是否来源于电话簿
U8 SSCFNoAnsTimeIndex; //在设置【无人接听时间】时,用户选择的时间索引
} CallSetupContext;
1.【本机号码】
NVRAM保存:
ReadValue(NVRAM_CALLERID, &g_callset_context.CallerIDInput, DS_BYTE, &error);
WriteValue(NVRAM_CALLERID, &g_callset_context.CallerIDInput, DS_BYTE, &error);
函数InitNvramCallerId()在系统启动的时候被调用,获取NVRAM中保存的CALLER ID的设置,保存在g_callset_context.CallerIDInput中,然后调用SetCallerIdReq()发送消息到L4来设置,L4返回消息操作成功,则进入CBACK函数CALLSETCallerIDRsp(),设置g_callset_context.CallerID = g_callset_context.CallerIDInput。并且再写入到NVEAM中。
用户设置过程:
void InitCallerId(void)
{
SetHiliteHandler(MENU_CALLER_ID, HighlightCALLSETCallerId);
SetHiliteHandler(MENU_CID_SET_NWK, HiliteSetByNwk);
SetHiliteHandler(MENU_CID_SHOW_ID, HiliteShowCid);
SetHiliteHandler(MENU_CID_HIDE_ID, HiliteHideCid);
return;
}
选择后,ShowCategory15Screen(),SHOW出3个菜单:网络预设,隐藏号码,发送号码。然后根据当前高亮的菜单设置g_callset_context.CallerIDInput为:CLIR_INVOKE, CLIR_SUPPRESS,CLIR_AUTO其中之一。
然后,按下【确定】,即调用SetCallerIdReq()发送消息PRT_MMI_SS_SET_CLIR_FLAG_REQ到L4,L4返回消息PRT_MMI_SS_SET_CLIR_FLAG_RSP,进入CBACK函数:CALLSETCallerIDRsp()。如果设置成功,设置:
g_callset_context.CallerID = g_callset_context.CallerIDInput。
即:CallerIDInput保存的是用户选择的高亮的索引,CallerID保存的是已经成功设置的索引。
2.呼叫等待
void InitCallWaiting()
{
SetHiliteHandler(MENU8237_SCR8093_MNGCALL_MENU_WAIT, HighlightCALLSETCallWaiting);
SetHiliteHandler(MENU8237_MNGCALL_CALWAIT_MENU_ON, HighlightCALLSETCallWaitingOn);
SetHiliteHandler(MENU8237_MNGCALL_CALWAIT_MENU_OFF, HighlightCALLSETCallWaitingOff);
SetHiliteHandler(MENU8237_MNGCALL_CALWAIT_MENU_QUERY, HighlightCALLSETCallWaitingQuery);
return;
}
3个菜单: 开启EntryScrCallWaitingOnreq()-- MakeCall(“*43#”)
关闭EntryScrCallWaitingOffreq()-- MakeCall(“#43#”)
查询EntryScrCallWaitingQueryreq()-- MakeCall(“*#43#”)
CABCK函数:CALLSETWaitingRsp().
3.呼叫转移
InitCallForwarding()
SetHiliteHandler(MENU8237_SCR8093_MNGCALL_MENU_FWD, HighlightCALLSETCallFwd);
呼叫转移的类型:
typedef enum
{
FORWARD_UNREACHABLE = 0,
FORWARD_NOANSWER,
FORWARD_ALLCOND,
FORWARD_BUSY,
FORWARD_ALLVOICE,
FORWARD_DATA,
FORWARD_CANCEL_ALL
} SSForwardType;
任何一个菜单高亮后,都会设置变量g_callset_context.SSCFType。
g_callset_context.SSCFNum[]:保存了用户输入的呼叫转移的号码。
在设置的时候,会检测g_callset_context.SSCFNum,如果为空,就调用函数mmi_phb_call_enter_from_divert()从电话簿中查找号码。
设置号码之后,MakeCall(),设置。L4返回消息PRT_MMI_SS_CALL_FORWARD_RSP进入CBACK函数CALLSETForwardRsp()。
4.呼叫限制
Hilite设置InitCallBarring()。
呼叫限制类型:
typedef enum
{
BARRING_OUTGOING_ALLCALLS, 禁拨所有电话
BARRING_OUTGOING_INTERCALL, 禁拨国际长途
BARRING_OUTGOING_INTEREXCEPTHOME, 只许回拨国内
BARRING_INCOMING_ALLCALLS, 禁接所有来电
BARRING_INCOMING_ROAMING 禁接漫游来电
} SSBarType;
用户选择的操作:开启?关闭?查询?
typedef enum
{
BARRING_ON,
BARRING_OFF,
BARRING_QUERY,
BARRING_CHANGE_PSW,
BARRING_CANCEL_ALL
} SSBarAction;
MMI:MakeCall()
L4返回:PRT_MMI_SS_CALL_BARRING_RSP,进入:CALLSETBarringRsp()。
5.通话时间提示
NVRAM存储:
ReadValue(NVRAM_SETTING_CTR, &data, DS_BYTE, &error);
ReadValue(NVRAM_SETTING_CTR_TIME, &ctrTime, DS_SHORT, &error);
在InitManageCalls()中,
SetHiliteHandler(MENU_SETTING_CALL_REMINDER, HighlightCALLSETCallTimeReminder);
SetHintHandler(MENU_SETTING_CALL_REMINDER, HintCALLSETCallTimeReminder);
菜单入口函数:EntryCALLSETCallTimeReminder(),显示一个单选菜单项:
关闭;一声;周期。
用户无论选择哪个高亮,函数CtrHandler()就被调用设置g_callset_context.CTRStatusInput。
然后按下左键,进入SendCtr()
void SendCtr(void)
{
data = g_callset_context.CTRStatusInput;
if (data == 0)
{
WriteValue(NVRAM_SETTING_CTR, &data, DS_BYTE, &error);
DisplayPopup((PU8)GetString(STR_GLOBAL_DONE), IMG_GLOBAL_ACTIVATED,
1, ST_NOTIFYDURATION, SUCCESS_TONE);
DeleteScreenIfPresent(SCR_ID_CALLSET_CTR);
}
else
{
EntryCALLSETCtrTime();
}
}
EntryCALLSETCtrTime()是设置提醒时间的。这里首先判断输入的时间是否符合要求,如果不符合,则
if (GetHistoryScrID(SCR_ID_CALLSET_CTR_TIME, &History) == ST_SUCCESS)
{
if (History->inputBuffer != NULL)
{
memset(History->inputBuffer, 0, ENCODING_LENGTH);
}
if (History->guiBuffer != NULL)
{
memset(History->guiBuffer, 0, 2);
}
}
如果输入的时间符合要求,则调用SendCtrTime(),
WriteValue(NVRAM_SETTING_CTR, &data, DS_BYTE, &error);
WriteValue(NVRAM_SETTING_CTR_TIME, &time, DS_SHORT, &error);
然后返回到【通化设置】SCREEN,这时,会调用HintCALLSETCallTimeReminder()把用户设置的提醒类型和时间拷贝到g_callset_context.CTRNumber和g_callset_context.CTRNumber中。
6.通话时间显示
SetHiliteHandler(MENU_SETTING_CALL_TIME_DISPLAY, HighlightCALLSETCallTimeDisplay);
SetHintHandler(MENU_SETTING_CALL_TIME_DISPLAY,
HintCALLSETCallTimeDisplay);
在HintCALLSETCallTimeDisplay()中,调用GetCallTimeDisplay()从NVRAM中读取设置,ReadValue(NVRAM_SETTING_CALL_TIME_DISPLAY, &data, DS_BYTE, &error);并设置g_callset_context.CTDStatus。
按下左软件,更改设置后,写入NVRAM,调用Category52ChangeItemDescription()改变hint提示信息,改变左软件的label,然后设置g_callset_context.CTDStatus。
7.自动重拨
SetHiliteHandler(MENU9140_AUTO_REDIAL, HighlightCALLSETAutoRedial);
SetHintHandler(MENU9140_AUTO_REDIAL, HintCALLSETAutoRedial);
在HintCALLSETAutoRedial()中调用AutoRedialOnOffStatus()从NVRAM中读取设置,ReadValue(NVRAM_SETTING_AUTOREDIAL, &data, DS_BYTE, &error);,并设置变量g_callset_context.AutoRedialStatus。
按下左软件,更改设置后,写入NVRAM,
WriteValue(NVRAM_SETTING_AUTOREDIAL, &data, DS_BYTE, &error);
然后Category52ChangeItemDescription(),改变左软件label,并设置变量:
g_callset_context.AutoRedialStatus
8.IP拨号
WriteRecord(NVRAM_EF_IP_NUMBER_LID, 1, IPNumber, sizeof(IPNumber), &error);
WriteValue(NVRAM_IP_NUMBER_SETTING, &IPSetting, DS_BYTE, &error);
SetHiliteHandler(MENU_SETTING_IP_NUMBER, HighlightIPNumber);
SetHiliteHandler(MENU_IP_NUM_ACTIVATE, HighlightIPNumActivate);
SetHiliteHandler(MENU_IP_NUM_EDIT, HighlightIPNumEdit);
全局变量的说明:
IPSetting------当前开启的IP号码。可能为4个值:0,1,2,Oxff(没有启动任何一个号码)。
IPNumber[][]—保存了用户设置的IP号码。
newIPNum[]-------接收用户输入的IP号码
curIPnumIndex----在”IP拨号”这个SCREEN中,列了3个IP号码菜单,curIPnumIndex指示 当前高亮的菜单的索引。
ShowCategory53Screen()中,每个MENU的前面都可以有ICON的。在这里,因为只能开启一个IP号码,因此,只能在其中一个MENU前面显示ICON(打钩),是通过
if (IPSetting != 0xff)
{
highlite = IPSetting;
PPIcons[IPSetting] = IMG_VICON;
}
来控制的。IPSetting代表了当前开启的IP号码,这样就只为这个开启的MENU项打钩了。
9.来电警卫
系统启动初始化过程:
InitNvramData()、
LoadBlackListNum()
{
ReadValue(NVRAM_BLACK_LIST_MODE,&gBlackListMode, DS_BYTE, &error);
ReadValue(NVRAM_BLACK_LIST_SETTING, &gBlackListFlag, DS_BYTE, &error);
ReadRecord(NVRAM_EF_BLACK_LIST_LID, 1, BlackListNum, sizeof(BlackListNum), &error);
}
SetHiliteHandler(MENU_SETTING_BLACK_LIST, HighlightBlackList);
SetHintHandler(MENU_SETTING_BLACK_LIST, HintBlackList);
SetHiliteHandler(MENU_SETTING_BLACK_LIST_FLAG, HighlightBlackListFlag);
SetHintHandler(MENU_SETTING_BLACK_LIST_FLAG, HintBlackListFlag);
SetHiliteHandler(MENU_SETTING_BLACK_LIST_MODE, HighlightBlackListMode);
SetHiliteHandler(MENU_SETTING_BLACK_LIST_NUM, HighlightBlackListNum);
SetHintHandler(MENU_SETTING_BLACK_LIST_MODE, HintBlackListMode);
SetHiliteHandler(MENU_SETTING_BLACK_LIST_OP_EDIT, HighlightBlackListNumOptionEdit);
SetHiliteHandler(MENU_SETTING_BLACK_LIST_OP_DEL, HighlightBlackListNumOptionDel);
全局变量说明
gBlackListFlag----开关标志:1-开启,0-关闭
gBlackListMode---模式标志:1—只接,0—拒接
curBlackListNumIndex---当前高亮的黑名单索引(一共10个黑名单)
BLInputNumber---接收用户输入的号码
BlackListNum[][]—保存设置的黑名单号码
dispBlackListNum[][]—显示的黑名单号码
开关的设置
void SetBlackListFlag(pBOOL flag)
{
S16 error;
gBlackListFlag = flag;
WriteValue(NVRAM_BLACK_LIST_SETTING, &gBlackListFlag, DS_BYTE, &error);
}
模式的设置
void SetBlackListMode(pBOOL mode)
{
S16 error;
gBlackListMode = mode;
WriteValue(NVRAM_BLACK_LIST_MODE, &gBlackListMode, DS_BYTE, &error);
}
本文章为自己学习比较,如有错误,请不吝赐教!谢谢