详细设计说明书(通话记录)[通话记录]
详细设计说明书
[MTK-M3项目组]
康佳通信科技开发中心软件所
2005年4月26日
目录
修改历史 3
1整体结构及功能描述: 4
1.1已拨电话: 4
1.2未接电话: 4
1.3已接电话: 5
1.4删除电话记录: 5
1.5通话时间: 5
1.6通话费用: 5
1.7短信计数器: 6
2关键数据结构说明 6
3 主要存储分配: 8
4各子模块实现及主要算法说明 9
4.1 初始化 9
4.2未接电话 10
4.3 已接...
[通话记录]
详细
[MTK-M3项目组]
康佳通信科技开发中心软件所
2005年4月26日
目录
修改历史 3
1整体结构及功能描述: 4
1.1已拨电话: 4
1.2未接电话: 4
1.3已接电话: 5
1.4删除电话记录: 5
1.5通话时间: 5
1.6通话费用: 5
1.7短信计数器: 6
2关键数据结构说明 6
3 主要存储分配: 8
4各子模块实现及主要算法说明 9
4.1 初始化 9
4.2未接电话 10
4.3 已接电话和已拨电话: 14
4.4删除通话话记录: 14
4.5通话时间: 15
4.6通话费用: 15
4.7短信计数器: 17
5内部调用的主要
数说明: 18
6模块提供的外部接口函数说明 19
7主要信号说明 19
8相关文档文件 20
修改历史
时间
修改人
版本
修改内容
2005-4-26
余文美
1.0
创建初始版本
1整体结构及功能描述:
通话记录模块的设计和其他模块一样,从整体上来说,主要是MMI和
栈之间通过2个队列MMIQueue和L4Queue来互发消息实现相互之间的通信。从MMI来看,该模块主要由通话记录,通话费用,通话时间,以及短信计数器几个部分组成,用下图表示为:
其个子模块的功能描述如下:
1.1已拨电话:
在NVRAM中最多可以保存10条最近的已拨电话的记录。当手机对外进行呼叫的同时,就会向NVRAM写入一条已拨电话的记录。当已拨电话记录已满的情况下(即已有10条已拨电话的通话记录),新加入的已拨电话记录将覆盖已存在的第一条已拨电话记录。当手机关机时,会将已拨电话的通话记录复制到SIM卡中,在手机开机后再从SIM卡上读取出来。每条记录只对应于一个电话号码,当用户拨出的电话号码在已拨电话记录中已经存在时,新的拨号时间将覆盖原来的拨号时间,但拨号的次数加1。
1.2未接电话:
在NVRAM中最多可以保存20条最近的未接电话的记录。当用户拒绝或者没有接来电时,就会向NVRAM写入一条未接电话的记录。当未接电话记录已满的情况下(即已有20条未接电话的通话记录),新的未接电话记录将覆盖已存在的第一条未接电话记录。每条记录只对应于一个电话号码,当来电的电话号码在未接电话记录中已经存在时,新的来电的时间将覆盖原来的来电时间,但未接的次数加1。
1.3已接电话:
在NVRAM中最多可以保存20条最近的已接电话的记录。当用户接听来电时,就会向NVRAM写入一条已接电话的记录。当已接电话记录已满的情况下(即已有20条已接电话的通话记录),新的已接电话记录将覆盖已存在的第一条已接电话记录。每条记录只对应于一个电话号码,当来电的电话号码在已接电话记录中已经存在时,新的来电的时间将覆盖原来的来电时间,但已接的次数加1。
1.4删除电话记录:
删除已接电话,未接电话,已拨电话中的任一电话记录。
1.5通话时间:
通话时间屏幕将显示以下通话时间:
A. 上次通话时间:在弹出的提示内显示上次通话的时间;
B. 总共打出电话的时间:在弹出的提示内显示总共打出的通话时间;(从上次Reset后算起)
C. 总共接电话的时间:在弹出的提示内显示总共接电话的通话时间;(从上次Reset后算起)
D. 清空所有的通话时间:将所有的通话时间清空。
1.6通话费用:
通话费用界面将显示以下通话费用:
A. 上次通话费用:显示上次通话的通话费用;
B. 总共通话费用:显示总共通话的通话费用;(从上次Reset后算起)
C. 清空通话费用:将所有的通话费用清空;
D. 最大通话费用:提示最多允许的通话费用;
E. 价格及费率:将提示价格以及费率。
1.7短信计数器:
短信计数器屏幕将显示已发送和已接受的短信的条数。当光标选中其中任何一项时,就会弹出数目的提示。
2关键数据结构说明
TOT_SIZE_OF_DIALED_LIST 10 //已拨电话的记录最大数目
TOT_SIZE_OF_MISSED_LIST 20 //未接电话的记录最大数目
TOT_SIZE_OF_RECVD_LIST 20 //已接电话的记录最大数目
CS_NOTIFYDURATION //提示框显示的时间
//保存通话记录的信息
typedef struct {
U8 numType; //电话号码的类型
U8 numLength; //电话号码的长度
U8 number[(MAX_CC_ADDR_LEN+1)*ENCODING_LENGTH]; //号码字串
U8 nameLength; //姓名长度
U8 nameDCS; //名字的数据编码格式
S8 pbName[(MAX_PB_NAME_LENGTH+1)*ENCODING_LENGTH]; //姓名字串
MYTIME startTime; //通话开始的时间
U16 no_of_times; //对同一电话号码未接/已接/已拨通话的次数
} LOG_CALL;
typedef struct
{
U8 curCallLogType; //当前通话记录的类型
U8 currDialedCallIndex; //当前已拨电话在已拨电话列表中的index
U8 currMissedCallIndex; //当前未接电话在未接电话列表中的index
U8 currRecvdCallIndex; //当前已接电话在已接电话列表中的index
U8 nDialedCalls; //已拨电话记录的数目
U8 nMissedCalls; //未接电话记录的数目
U8 nRecvdCalls; //已接电话记录的数目
U8 nMissedCallBeforeView; //未读未接电话的数目
U8 dialFromCallLog; //用户从通话记录中拨打电话时通话记录的类型
BOOL isFirstTime; //开机后是不是第一次阅读通话记录
BOOL isDeleteAll; //是否要删除所有通话记录
BOOL isCallLogReady; //PS是否准备好被阅读
BOOL saveMissedScrn; //是否要保存未接电话的界面
LOG_CALL *dialedCalls; //指向已拨电话记录的指针
LOG_CALL *missedCalls; //指向未接电话记录的指针
LOG_CALL *recvdCalls; //指向已接电话记录的指针
LOG_CALL callsLog[TOT_SIZE_OF_CALLS_LIST]; //保存通话记录的数组
U8 nSendSMSCount; //已发送的短消息的数目
U8 nRecvSMSCount; //已接收短消息的数目
U8 currCostIndex; //当前高亮显示的通话费用在费用列表中的index
U16 currCostItem; //当前高亮显示的通话菜单
U32 lastCallCost; //上次通话费用
U32 allCallCost; //所有通话费用
U32 maxCallCost; //最大通话费用
U8 newMaxCostStr[10*ENCODING_LENGTH]; //用户编辑最大通话费用时输入的字符串
double ppu; //当前的通话费率
U8 PPUStr[20*ENCODING_LENGTH]; //当前通话费率字符串
U8 newPPUStr[20*ENCODING_LENGTH]; //用户编辑通话费率时的输入的字符串
U8 currencyStr[4*ENCODING_LENGTH]; //存储通话价格的数组
U8 newCurrencyStr[4*ENCODING_LENGTH]; //存储用户编辑通话价格时输入的字符串
MYTIME total_out_time; //总共拨出电话的时间
MYTIME total_in_time; //总共拨进电话的时间
MYTIME last_call_time; //上次通话时间
}call_history_context_struct;
3 主要存储分配:
NVRAM_CALL_TIME_LID
记录的个数:NVRAM_CALL_TIME_RECORD_TOTAL 3
分为
Last_call_time
Total_Sent_time
Total_received_time
记录的大小:NVRAM_CALL_TIME_RECORD_SIZE 8
typedef struct
{
kal_uint8 call_time[NVRAM_CALL_TIME_RECORD_SIZE];
}nvram_call_time_struct;
NVRAM_SMSCOUNTERS_SENT
记录的个数: 1
记录的大小: 1
NVRAM_ SMSCOUNTERS_RECD
记录的个数: 1
记录的大小: 1
4各子模块实现及主要算法说明
4.1 初始化
进入此模块主要分为两个步骤:首先是在系统启动时初始化,然后再从主菜单选择进入。系统初始化阶段,调用函数InitializeAll,在这个函数中对通话记录模块进行了初始化,即调用InitCallLogs函数,在该函数中首先注册协议栈消息的相应函数SetProtocolEventHandler( ReadyLogIndication, PRT_MMI_PHB_LAST_NUMBER_READY_IND );当系统检测到通话记录模块已经准备就绪后,PS/L4便会向MMI Queue写入PRT_MMI_PHB_LAST_NUMBER_READY_IND的消息,当MMI task读取到该消息后,就调用函数ReadyLogIndication来完成一系列的检测和初始化工作。这一阶段完成了大部分的工作。用图表说明如下:
菜单的入口在CallHistoryMain.c中,里面的InitCallHistory包含了其他几个模块的初始化函数,它也是在系统启动时的InitializeAll中执行的。在函数EntryScrCallHistoryMainMenu中,显示菜单,并且相应的菜单响应都已经注册好了。
4.2未接电话
下面主要介绍查询未接电话记录的流程,主要的流程用流程图可以描述如下:
现详细描述实现此功能的具体流程:
在初始化时函数InitCallLogs注册未接电话的菜单高亮显示事件。HighlightCHISTMissedCalls();当高亮显示此菜单时运行此函数。此函数里注册了一些响应键盘消息的函数,在这里我们只关注按左软键进入的函数 ReqReadDailNumByKey()。该函数主要是根据first_time和callLogready来判断是否能进入查询流程,如果能进入查询流程,则进入函数ReqReadMissedNum()。
ReqReadMissedNum ()函数首先建立一个GET_LAST_NUMBER_REQ类型的指针,并给它分配相应大小的内存,然后把PHB_LNM赋给该指针结构中的type,表示查询的是未接电话。把建好的指针赋给消息的数据指针。再对消息结构中的其他成员赋相应的值后,消息就建好了。建立好消息后向NS/L4 Queue发送查询消息PRT_MMI_PHB_GET_LAST_NUMBER_REQ,并且注册得到查询结果后的处理函数RspReadMissedNum()。
当CALL_LOG_RESULT_OK时,RspReadMissedNum()函数将未接电话的查询结果一个个读出来,并通过函数CHISTExtractPSCallLog()将查询的结构转换成我们自定义的电话记录的格式。当查询完毕后用函数EntryCHISTViewMissedCallList将未接电话全部显示出来。
在函数EntryCHISTViewMissedCallList中,显示所有未接电话的记录,并注册成菜单和菜单高亮显示时的回调函数CHISTGetCurrMissedCallIndex,把当前所选中的菜单的序列号保存在currMissedCallIndex中。注册了左键菜单函数EntryCHISTViewMissedCall,该函数显示所选未接电话记录的详细信息,包括时间,姓名,电话号码,次数等。在该函数中注册了左键菜单函数EntryCHISTMissedListOptions,如果进入该函数,可以对电话号码进行编辑,删除,保存,回拨等功能。这个函数没有直接去注册各菜单行为的入口函数。而是用此函数RegisterHighlightHandler( ExecuteCurrHiliteHandler );,这个函数一次性执行了所有菜单的注册高亮显示的入口函数。这些在InitCallLogs中已经注册了的。
对未接电话的电话号码进行的操作的菜单的高亮显示函数已经在InitCallLogs中注册过了,下面对这些菜单项的实现做一个介绍:
1. 删除功能:
高亮显示删除时,会调用HighlightCHISTDeleteDialedNum函数,在该函数中注册了左键的响应函数EntryCHISTDeleteDialedCallConfirm,该函数为跳出一个确认删除的提示框,同时注册左键入口函数CHISTDeleteDialedNum,在该函数中调用了函数ReqDeleteCallLog,在该函数中又建立了DEL_LAST_NUMBER_REQ型的结构指针,并建立了消息PRT_MMI_PHB_DEL_LAST_NUMBER_RSP,发送给L4 queue,消息的数据指针指向的数据类型是DEL_LAST_NUMBER_REQ型,这个消息包含了号码的类型PHB_LNM和要删除的index。并注册了返回消息时的处理函数RspDeleteMissedNum,在该函数中,如果result.flag的值为CALL_LOG_RESULT_OK(0)时则表示dialedCalls中序号为该index的记录删除成功。
2. 保存功能:
高亮显示保存时,调用函数HighlightCHISTSaveDialedNum,该函数的注册左键的响应函数CHISTSaveDialedNum,在该函数中调用SaveNumberFromIdleScrn将号码显示在屏幕上后,调用mmi_phb_op_add_pre_entry对号码进行保存。当电话簿还有空间存储电话号码时,调用函数mmi_phb_entry_op_add_choose_storage选择存储位置,并调用mmi_phb_entry_op_edit_entry对该记录进行编辑后保存到电话簿中。这关系到电话簿模块的内容,在这里不做详述。值得关注的是,在保存了电话号码到电话簿后,显示通话记录列表名称的记录名也要相应的进行改变。可以用下图表示:
3. 回拨功能:
高亮显示回拨时,调用函数HighlightCHISTCallDialedNum,在该函数中注册左键的响应函数CHISTCallDialedNum,在该函数中通过判断dialedCalls和currDialedCallIndex找到当前需要处理的记录,并对应其名字或号码对该记录进行拨打。
4. 编辑功能:
高亮显示编辑时,调用函数HighlightCHISTEditRecvdNum,在该函数中注册左键的响应函数CHISTEditRecvdNum,在该函数中通过调用IdleScreenDigitHandler将号码显示在屏幕上对其进行编辑。
4.3 已接电话和已拨电话:
已接电话和已拨电话记录的查询的流程以及高亮显示option菜单的流程及算法都和未接电话类似,这里不再赘述。已接,已接电话记录的查询主要的流程如下图所示:
4.4删除通话话记录:
在初始化时InitAllApplications调用函数InitCallHistory,在该函数中InitCallsReset注册了菜单高亮度显示函数。当高亮度显示菜单删除通话记录时调用HighlightCHISTResetCallLog,在该函数中注册了左键的响应函数EntryCHISTResetCallLog,该函数显示要删除的通话记录的菜单项,这个函数没有直接去注册各菜单行为的入口函数。而是用此函数RegisterHighlightHandler( ExecuteCurrHiliteHandler );,这个函数一次性执行了所有菜单的注册高亮显示的入口函数。这些在InitCallsReset中已经注册了的。
高亮显示的这些菜单,是实现对未接电话,已接电话,已拨电话记录的删除功能。下面对删除已拨电话的功能做一下介绍,删除已接电话,未接电话与之类似,不再赘述。
当高亮显示已拨电话时,调用函数HighlightCHISTDeleteAllDialed,该函数中注册了左键的响应函数EntryCHISTDeleteAllDialedConfirm,该函数为弹出一个删除提示框,
并注册左键响应函数DeleteAllDialedCalls,在该函数中建立了DEL_LAST_NUMBER_REQ型的结构指针,并建立消息PRT_MMI_PHB_DEL_LAST_NUMBER_REQ,该消息的数据类型是DEL_LAST_NUMBER_REQ型的,号码类型是PHB_LND,建立好消息后,向L4 Queue发送消息,并注册了返回消息时的处理函数RspDeleteAllDialedNum,当result.flag为CALL_LOG_RESULT_OK(0)时,删除成功并给出删除成功的提示。
4.5通话时间:
在初始化时InitAllApplications调用函数时调用函数InitCallTimes,在该函数中注册了菜单高亮显示的函数。当高亮显示通话时间菜单时,调用函数HighlightCHISTCallTime,在该函数中注册了左键响应函数EntryCHISTCallTime,该函数从NVRAM中读出上次通话,已拨电话总计,已接电话总计的时间,并通过ShowCategory52Screen函数,将通话时间显示出来。这个函数没有直接去注册各菜单行为的入口函数。而是用此函数RegisterHighlightHandler( ExecuteCurrHiliteHandler );,这个函数一次性执行了所有菜单的注册高亮显示的入口函数。这些在InitCallTimes中已经注册了的。
当高亮显示所有计时归零菜单时,调用函数HighlightCHISTResetAllTime,在该函数中注册了左键的响应函数EntryCHISTResetAllTimeConfirm,该函数为一个提示是否归零的提示框,在该函数中注册了左键的响应函数CHISTResetAllTime,该函数将last_call_time,total_out_time,total_in_time的值都归零,并将值写入NVRAM,并给出归零成功的提示。
4.6通话费用:
在初始化时InitAllApplications调用函数InitCallCost,该函数中注册了菜单高亮显示的函数,当高亮显示通话费用菜单时,调用函数HighlightCHISTCallCost,在该函数中注册了左键响应函数CHISTGetCallCost,在该函数中调用函数ReqGetAllCallCost,ReqGetLastCallCost,ReqGetPriceAndUnit,ReqGetMaxCallCost等函数得到总通话费用,上次通话费用,价格及费率,费用限制的值。下面只对统计总通话费用的实现做一个介绍,其他的与之类似,就不再赘述。
当查询总通话费用时,调用函数ReqGetAllCallCost,该函数向L4 queue发送PRT_MMI_CC_GET_ACM_REQ的消息,并注册消息返回时的处理函数RspGetAllCallCost,该函数建立一个MSG_MMI_CC_GET_ACM_RSP_STRUCT型的结构指针,将L4返回的结果的acm的值赋给allCallCost。就得到总共通话的费用。
当高亮显示通话限制或通话费用归零,价格及费率菜单时,按左键会提示输入PIN2码。现举通话费用归零菜单为例,当按左键时就会调用函数SECSETGetPIN2StatusReq,在这个函数中建立好ID为PRT_MMI_SMU_CHECK_PIN_STATUS_REQ的消息,并向L4 queue发送,同时设置好消息返回时的函数SECSETGetPIN2StatusRsp。如果PIN2码没有被锁住,则调用函数EntrySECSETPIN2提示输入PIN2码,并调用函数VerifyPin2对输入的PIN2码进行验证,如果验证成功,那么将通话的费用归0。如果不成功,则给出错误提示,并重新要求输入。如果PIN2被锁住,那么,则提示输入PUK2码,如果成功,则提示输入PIN2码,如果成功,那么将通话费用归0。PIN2码验证的流程可以用下图表示:
4.7短信计数器:
在初始化时InitCallHistory时调用函数InitSMSCounter,在该函数中注册高亮显示菜单时的函数。当高亮显示短信计数器时,调用函数HighlightCHISTSMSCount,该函数注册了左键的响应函数EntryCHISTSMSCount,该函数显示已发送和已接收短信数目的菜单,这个函数没有直接去注册各菜单行为的入口函数。而是用此函数RegisterHighlightHandler( ExecuteCurrHiliteHandler );,这个函数一次性执行了所有菜单的注册高亮显示的入口函数。这些在InitSMSCounter中已经注册了的。
在InitSMSCounter函数中还调用了函数InitNvramSMSCounters,该函数从NVRAM中将已发送和已接收的短信的数目读出来,并赋给nSendSMSCount和nRecvSMSCount。当高亮显示已发送和已接收菜单时,通过函数ShowCategory52Screen直接显示出来。当短信的数目不为空时,按左键会出现确定删除的提示框,由于原理在上面已经描述过了,这里便不再赘述。
5内部调用的主要函数说明:
void ReqReadMissedNum(void) //向Ps发出查询未接电话记录的请求
void RspReadMissedNum(void *info) //处理得到查询未接电话记录结果的函数(此处的info
应该是ps返回的未接电话记录的信息)
void ReqReadDialedNum(void) //向Ps发出查询已拨电话记录的请求
void RspReadDialedNum(void *info) //处理得到查询已拨电话记录结果的函数(此处的info
应该是ps返回的已拨电话记录的信息)
void ReqReadRecvdNum(void) //向Ps发出查询已接电话记录的请求
void RspReadRecvdNum(void *info) //处理得到查询已拨电话记录结果的函数(此处的info
应该是ps返回的已拨电话记录的信息)
void CHISTDeleteDialedNum( void ) //删除当前已拨电话记录中的号码的信息
void CHISTSaveDialedNum( void ) //将当前已拨电话记录中的号码保存到电话簿
void CHISTCallDialedNum( void ) //对当前已拨电话记录中的号码进行呼叫
void CHISTEditDialedNum( void ) //对当前已拨电话记录中的号码进行编辑
void CHISTCallMissedNum( void ) //删除当前未接电话记录中的号码的信息
void CHISTSaveRecvdNum( void ) //将当前未接电话记录中的号码保存到电话簿
void CHISTCallMissedNum( void ) //对当前未接电话记录中的号码进行呼叫
void CHISTEditMissedNum( void ) //对当前未拨电话记录中的号码进行编辑
void CHISTDeleteRecvdNum( void ) //删除当前已接电话记录中的号码的信息
void CHISTSaveRecvdNum( void ) //将当前已接电话记录中的号码保存到电话簿
void CHISTCallRecvdNum( void ) //对当前已接电话记录中的号码进行呼叫
void CHISTEditRecvdNum( void ) //对当前已接电话记录中的号码进行编辑
6模块提供的外部接口函数说明
U8 CHISTGetMissedCallCountBeforeView(void ) //得到在浏览未接电话记录前未接电话的数目
void CHISTLogMissedCall( CALL_INFO* call ) //向NVRAM录入未接电话的信息
void CHISTLogRecvdCall( CALL_INFO* call ) //向NVRAM录入已接电话的信息
void CHISTLogDialedCall( CALL_INFO* call ) //向NVRAM录入已接电话的信息
void CHISTLogDialedCallDuration( CALL_INFO* call ) //向NVRAM录入总共拨出电话的通话时间和上次通话时间
void InitNvramSMSCounters( void ) //从NVRAM中读出已发送和已接受短信的数目
void CHISTIncSentSMS( void ) //已发送短信的数目加一并写入NVRAM
void CHISTIncRecvdSMS( void ) //已接收短信的数目加一并写入NVRAM
void InitCallHistory( void ) //初始化通话记录模块
void InitCallLogs( void ) //初始化通话记录的协议事件处理
void CHISTResetCallLogIndex (void) //初始化当前高亮显示的通话记录的index的值
void CHISTGetCallLogName(LOG_CALL *item) //如果从通话记录中选择一个电话进行拨打,那么得到该电话记录的名字
U8 CHISTGetMissedCallCountBeforeView(void ) //得到未读的未接电话的数目
void CHISTLogDialedCallDuration( CALL_INFO* call ) //录入上次打出电话的通话时间,总的打出电话的通话时间也随之增加
void CHISTIncSentSMS( void ) //已发送的短消息的数目加1
void CHISTIncRecvdSMS( void ) //已接收的短消息的数目加1
7主要信号说明
PRT_MMI_PHB_LAST_NUMBER_READY_IND //PS返回的通话记录准备好的消息
PRT_MMI_PHB_GET_LAST_NUMBER_RSP //PS返回的得到已拨电话记录信息的消息
PRT_MMI_PHB_SET_LAST_NUMBER_RSP //PS返回的写入通话记录信息的消息
PRT_MMI_CC_RESET_ACM_RES //PS返回的清空通话费用操作成功与否的消息
PRT_MMI_CC_GET_CCM_RES //PS返回的得到上次通话费用的消息
PRT_MMI_CC_GET_ACM_RES //PS返回的得到总通话费用的消息
PRT_MMI_CC_GET_MAX_ACM_RES //PS返回的得到最大通话费用的消息
PRT_MMI_CC_SET_MAX_ACM_RSP //PS返回的设置最大通话费用成功与否的消息
PRT_MMI_CALL_COST_PRICEUNIT_GET_RSP //PS返回的得到价格和通话费率的消息
PRT_MMI_CALL_COST_PRICEUNIT_SET_RSP //PS返回的设置价格和通话费率成功与否的消息
8相关文档文件
Calllog.c
Callcost.c
Calltime.c
Callsmscounter.c
MMI_DD_CALLHISTORY.PDF
DESIGN_CALLHISTORY.PDF
本文档为【详细设计说明书(通话记录)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。