详细设计说明书电话簿文档.docx

上传人:b****7 文档编号:8812544 上传时间:2023-02-01 格式:DOCX 页数:19 大小:634.34KB
下载 相关 举报
详细设计说明书电话簿文档.docx_第1页
第1页 / 共19页
详细设计说明书电话簿文档.docx_第2页
第2页 / 共19页
详细设计说明书电话簿文档.docx_第3页
第3页 / 共19页
详细设计说明书电话簿文档.docx_第4页
第4页 / 共19页
详细设计说明书电话簿文档.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

详细设计说明书电话簿文档.docx

《详细设计说明书电话簿文档.docx》由会员分享,可在线阅读,更多相关《详细设计说明书电话簿文档.docx(19页珍藏版)》请在冰豆网上搜索。

详细设计说明书电话簿文档.docx

详细设计说明书电话簿文档

[电话薄]

详细设计说明书

 

[MTK-M3项目组]

2005年5月6日

 

修改历史4

整体结构及功能描述5

关键数据结构说明5

主要存储分配7

各子模块实现及主要算法说明8

初始化8

查找9

添加9

list显示电话簿的电话记录操作10

删除10

复制,移动10

设置11

其它号码11

紧急号码11

服务电话12

本机号码12

快速拨号13

群组14

删除全部14

复制全部14

公共函数14

主要信号说明15

相关文档文件18

修改历史

时间

修改人

版本

修改内容

2005-5-6

付林海

1.0

创建初始版本

整体结构及功能描述

电话簿的设计从总的层次上来说可以分成两个部分,上层(MMI层)和底层(L4层)。

上层是人机界面层,下层是与L4层有关,比如读取SIM卡中电话记录,向SIM卡中添加记录等,上下层之间通过发消息来进行通信。

电话簿功能有:

快速查找(利用快速查找算法)、按姓名查找(可实现按号码,首字母等查找)、添加电话记录、复制、删除、编辑、群组、其它号码(可设置本机号码、服务号码、SOS号码)、设置功能。

这些都是在MMI层中的功能,要实现这些功能需要向下层,即L4层发送消息,L4层收这些消息后,会向MMI层发送消息通知某些操作已经完成(如在读取电话簿的时候,L4层会向MMI层发送消息PRT_PHB_STARTUP_BEGIN_IND、PRT_PHB_STARTUP_READ_IND、PRT_PHB_STARTUP_FINISH_IND。

分别标志读取电话簿的开始,正在读取中和读取完毕。

关键数据结构说明

typedefstruct

{

//Globalvariables-Keepphonebookstateflag.

BOOLphb_ready;/*标志电话簿有没有初始化,如没有初始化的话,

*电话簿大多数功能是不能使用的,初始化是在

*开机时做的

*/

BOOLprocessing;/*是否正在处理*/

BOOLnvram_data_init;/*标志存储在NVRAM里面的参数有没有调入内存*/

U8refresh_list;

U16start_scr_id;

U16end_scr_id;

U8sim_name_len;/*sim卡上电话的名字长度*/

U8fdn_name_len;/*固定拨号电话的名字长度*/

U8bdn_name_len;

U8owner_name_len;/*本机号码的电话长度*/

U16sim_total;/*sim卡最大容量*/

U16sim_used;/*已被使用的sim卡电话簿的容量*/

U16phone_total;/*本机上电话簿最大容量*/

U16phone_used;/*已使用的本机电话簿容量*/

U16populate_count;

U16lookup_table_count;

//Pointertoglobalarray

void*optional_ids;

void*caller_group;

U16*list_filter;

//Systemsetting

U8prefer_storage;/*优先存储位置*/

U8view_field[MAX_PB_VIEW_FIELDS];

//Indexforlistscreen.

U16active_index;/*这三个变量用于群组编辑的时候*/

U16active_index_second;

U16active_index_third;

//Globalvariables-passingparameterbetweenfunctions.

U8*number_to_dial[5];

U16highlight_entry;

U16new_highlight_entry;

U8selected_storage;

U8image_location;

S32selected_pic_index;

S32selected_ring_index;

S32selected_grp_index;

S32selected_pattern_index;

S32selected_alert_index;

S32selected_pic_in_view;

BOOLdial_from_list;

U8sort_type;/*查找的类型,初始化为MMI_PHB_SORT_PINYIN(定义了拼音查

*找)或MMI_PHB_SORT_ENCODING

*/

//InlineSelectionList

U16ring_tone_list[MAX_PB_RING_TONES];

U16image_id_list[MAX_PB_PICTURES_TAGS];

U8*image_name_list[MAX_PB_PICTURES_TAGS];

U8*ring_tone_name_list[MAX_PB_RING_TONES];

U8*alert_name_list[MAX_PB_ALERT_TYPES+1];

U8*led_name_list[MAX_PB_LED_PATTERNS+1];

U8set_done_flag;

U8total_ring_tone;

U8total_image_id;

U8speak_name;

}mmi_phb_context_struct;

初始化的时候,从电话簿里面读出来的记录就存储在该数组中,sim卡上的电话簿从下标为

MAX_PB_PHONE_ENTRIES的数组元素开始,存储在本机电话簿后面。

typedefstruct

{

MMI_PHB_NUMBER_BCD_STRUCTtel;/*用bcd码表示的电话号码*/

MMI_PHB_NAME_STRUCTalpha_id;/*姓名*/

U8field;/*Indicateifanentryhasthefield*/

U8dummy;/*Makesureeachphbstructureistwo-bytesaligned.*/

}MMI_PHB_ENTRY_BCD_STRUCT;

typedefstruct

{

U8name_length;/*名字的长度*/

U8name_dcs;/*名字的编码类型*/

U8name[(MAX_PB_NAME_LENGTH+1)*ENCODING_LENGTH];/*姓名*/

}MMI_PHB_NAME_STRUCT;

typedefstruct

{

U8type;

U8length;/*电话号码长度*/

/*用bcd码表示的电话号码*/

U8number[(MAX_PB_NUMBER_LENGTH+1+1)*ENCODING_LENGTH];

}MMI_PHB_NUMBER_STRUCT;

//存储电话记录的可选字段

typedefstruct

{

U8homeNumber[MAX_PB_NUMBER_LENGTH+1+1];

U8companyName[(MAX_PB_COMPANY_LENGTH+1)*ENCODING_LENGTH];

U8emailAddress[MAX_PB_EMAIL_LENGTH+1];

U8officeNumber[MAX_PB_NUMBER_LENGTH+1+1];

U8faxNumber[MAX_PB_NUMBER_LENGTH+1+1];

}PHB_OPTIONAL_FIELDS_STRUCT;

typedefstruct

{

U16pictureTagID;

U16ringToneID;

U8callerGroupID;

}PHB_OPTIONAL_IDS_STRUCT;

主要存储分配

/*用于保存快速拨号*/

SpeedDialInfospeedDialTable[MAX_SPEED_DIAL_NUMBER];

MMI_PHB_LOOKUP_NODE_STRUCTLookUpTable[MAX_PB_SIM_ENTRIES+4*MAX_PB_PHONE_ENTRIES+4];

/*进入紧急号码编辑时,用于保存存储在sim卡上的紧急号码,这些号码是不可编辑的。

进入本机号码编辑时,用于保存存储在sim卡上的本机号码*/

staticMMI_PHB_ENTRY_STRUCTg_phb_sim_list[MAX_SIM_ENTRIES];

/*存储在NVRAM里面的紧急号码*/

staticMMI_SOS_NUMBER_STRUCTg_phb_nvram_list[MAX_NVRAM_SOS_ENTRIES];

/*用于保存当前的可选字段的状态*/

staticU8g_phb_temp_field_state[MAX_PB_VIEW_FIELDS];

各子模块实现及主要算法说明

初始化

初始化过程,在手机启动时,它的L4层会给MMI层发送一些消息,首先是PRT_PHB_STARTUP_BEGIN_IND消息,收到这个消息,表示正在启动电话本功能,这时候把g_phb_cntx.phb_ready设为否定,表示还没好。

接着手机L4层给MMI层发一条读取电话本记录的通知消息PRT_PHB_STARTUP_READ_IND,让MMI去读取电话本记录,在这里有函数mmi_phb_ind_startup_read对这个消息进行相应,并且读完一条后MMI发消息给L4层要求继续发下一条记录,收到下一条后还是用同一函数处理,这样可以不断的循环,把电话本中的记录完全读取。

在读取过程中每读取一条记录就把记录保存在phonebook数组中,注意:

这里我们可用g_phb_name_index全局数组作为一个索引,里面保存phonebook各个成员所在的位置,这样可以比较容易的进行排序操作。

所有记录都发给MMI层后,当MMI层还要读取下一条时,L4发消息PRT_PHB_STARTUP_FINISH_IND给MMI,表示读取结束,当收到此消息后MMI执行函数mmi_phb_ind_startup_finish,在里面完成g_phb_cntx的各个数据项的赋值。

比如总的记录条数,名字的最大长度等,还有读取nvram中的各种信息,用来完成g_phb_cntx的各个数据项的赋值,比如电话本的群组信息,电话记录中除手机号和姓名外可选的其它项,保存的位置等。

然后根据排序方式来进行排序。

排序算法,按照折半查找的方法,在排序好后不需要改变记录的位置,只需要把索引g_phb_name_index中的记录的下标位置交换既可。

排序的函数结构方式可以这样:

做一个通用的排序算法函数,此函数需要一个比较函数作为参数来对各个需要排序的成员进行大小比较,这样要按照不同的方式来排序的话,只需要改变这个比较函数就可以。

很容易实现算法的重用。

接下来是读取固定拨号,先向L4层发送消息PRT_PHB_GET_ENTRY_BY_INDEX_REQ,请求读取固定拨号,L4层响应返回消息PRT_PHB_GET_ENTRY_BY_INDEX_RSP,MMI层调用函数mmi_phb_fdn_get_list_to_ram_rsp进行处理,如果没有读取完,则继续发送消息请求读取固定拨号。

然后读取快速拨号,先从NVRAM里面读取快速拨号的号码,然后发消息

PRT_PHB_GET_ENTRY_BY_INDEX_REQ请求得到快速拨号的索引,L4层回传消息

PRT_PHB_GET_ENTRY_BY_INDEX_RSP作为响应,MMI层调用函数

PhbGetSpeedDialPhbIndexRsp进行处理。

mmi_phb_init是完成对菜单的设置,使每一菜单对应相应的响应函数。

它调用了函数

mmi_phb_search_init();

mmi_phb_operate_single_init();

mmi_phb_operate_mass_init();//在该函数里面除了设置菜单外还设置了消息PRT_PHB_UPDATE_IND的响应函数mmi_phb_ind_update

mmi_phb_caller_group_init();

mmi_phb_extra_number_init();//

mmi_phb_setting_init();

PhbInitSpeedDial();

查找

查找分为按姓名查找和快速查找。

按姓名查找:

首先调用mmi_phb_entry_search_name进入输入姓名界面,输入姓名后,用户选择查找,MMI会先调用mmi_phb_search_name_find_closet(使用二分查找)得到符合条件的记录集,如果是电话簿内部的查找,那么调用mmi_phb_list_pre_entry函数list显示记录,如果是发短信时查找电话簿,左键响应的函数为mmi_phb_sms_send_data_for_entry,该函数将选中的电话号码保存到g_msg_cntx.smsPhoneNumber中。

快速查找:

添加

list显示电话簿的电话记录操作

删除

复制,移动

设置

查询状态:

在初始化的时候设置了g_phb_cntx这个结构体,查询的时候,状态就是从该结构体中的sim_used和phone_used中取得。

设置优先存储

分为sim卡和NVRAM:

调用函数mmi_phb_storage_location_set_req发送消息PRT_PHB_SET_PREFERRED_STORAGE_REQ通知该参数已经改变,同时将该参数写入到NVRAM中,

其它号码

紧急号码

紧急号码保存在sim卡和NVRAM中,sim卡中的紧急号码是不可编辑的,NVRAM中的号码是可编辑的,进入编辑界面只能看到NVRAM中的号码。

服务电话

进入服务电话设置前,需获取快速拨号列表的信息,先发送消息

PRT_PHB_GET_ENTRY_BY_INDEX_REQ,Type为MMI_PHB_SDN

L4层收到处理完后,发送消息PRT_PHB_GET_ENTRY_BY_INDEX_RSP通知MMI,MMI调用函数mmi_phb_sdn_get_entry_rsp,list显示服务号码清单。

在list显示的时候可以拨打服务电话,相应的函数为mmi_phb_sdn_list_make_call。

本机号码

删除本机号码时先发送消息PRT_PHB_DEL_ENTRY_REQ,Type为MMI_PHB_MSISDN,L4层发消息PRT_PHB_DEL_ENTRY_RSP通知MMI号码已删除,MMI调用函数mmi_phb_owner_number_erase_rsp进行处理。

然后发送消息PRT_PHB_GET_ENTRY_BY_INDEX_REQ,type参数为MMI_PHB_MSISDN

取本机号码,L4层发送消息PRT_PHB_GET_ENTRY_BY_INDEX_RSP通知MMI处理完毕,

MMI层调用函数mmi_phb_owner_number_get_entry_rsp进入list显示界面。

编辑本机号码时先发送消息PRT_PHB_SET_ENTRY_REQ。

Type为MMI_PHB_MSISDN

L4层发送消息PRT_PHB_SET_ENTRY_RSP通知MMI,MMI调用函数

mmi_phb_owner_number_edit_rsp发送消息PRT_PHB_GET_ENTRY_BY_INDEX_REQ,type参数为MMI_PHB_MSISDN取得本机号码,然后进入list显示界面。

快速拨号

快速拨号清单在电话簿初始化的时候已经初始化,点击该菜单直接进入快速拨号清单。

编辑的时候,先从电话簿取得新号码,然后将整个speedDialTable这个数组写到NVRAM_EF_PHONEBOOK_SPEEDDIAL_LID存储单元中。

删除的时候,先将选中项对应得快速拨号号码清空,然后将speedDialTable这个然后将整个speedDialTable这个数组写到

NVRAM_EF_PHONEBOOK_SPEEDDIAL_LID存储单元中。

群组

首先从NVRAM中读取NVRAM_EF_PHB_CALLER_GROUPS_LID参数,然后list显示各个群组,当用户选择其中一个群组时进入对应群组的编辑界面,在该界面,如用户选择群组成员,则进入添加或者删除状态.

添加时调用mmi_phb_entry_callergroup_member_list函数进入电话选择界面,现在只支持本机存储的群组,选择一个电话号码时,先要将NVRAM_EF_PHB_IDS_LID单元里的数据提取到PhbOptIDs中,然后将相应的数组元素的callerID置为当前选中的群组,然后写入到NVRAM中。

删除时调用mmi_phb_callergroup_member_delete_member,在该函数中,先要将NVRAM_EF_PHB_IDS_LID单元里的数据提取到PhbOptIDs中,然后将相应的数组元素的callerID置为0,然后写入到NVRAM中。

删除全部

删除全部电话号码,先是检查有没有电话锁,如果设置了密码,需先输入密码进行校验,校验之后,调用mmi_phb_op_delete_all_pre_req函数,在该函数中,先找到符合要求的电话记录索引,然后向L4层发送消息PRT_PHB_DEL_ENTRY_REQ,处理完后L4层发消息PRT_PHB_DEL_ENTRY_RSP通知MMI层,MMI调用

mmi_phb_op_delete_all_one_after_one_rsp,该函数中先更新各个相关的数据结构,然后判断是否删除完毕,否则继续发消息PRT_PHB_DEL_ENTRY_REQ。

逐条删除是发消息PRT_PHB_DEL_ENTRY_REQ给L4层,L4层处理完毕后,发消息

PRT_PHB_DEL_ENTRY_RSP通知MMI,MMI调用mmi_phb_op_delete_entry_rsp。

复制全部

复制全部分为从sim卡到NVRAM和NVRAM到sim卡两种。

mmi_phb_op_copy_all_one_after_one_req函数先判断该电话记录是否在原存储器上,直到找到一条符合条件的记录,然后向L4层发送消息PRT_PHB_SET_ENTRY_REQ,L4层处理后,会发消息PRT_PHB_SET_ENTRY_RSP通知MMI层,MMI层调用函数

mmi_phb_op_copy_all_one_after_one_rsp,在该函数中,先判断目标是sim卡还是NVRAM,

如果是NVRAM,则需要增加相应的可选字段,如果目标为sim卡,则需要去掉可选字段。

接着判断是否copy全部完成,否则发消息调用mmi_phb_op_copy_all_one_after_one_req发消息PRT_PHB_SET_ENTRY_REQ继续下一条。

公共函数

mmi_phb_search_name

提供在电话簿、短信模块的根据姓名查找电话,是根据phbListView这个参数确定的,这个参数可能为MMI_PHB_LIST_FOR_PHB、MMI_PHB_LIST_FOR_SMS、MMI_PHB_LIST_FOR_SMS_SEARCH_NAME

主要信号说明

初始化

PRT_PHB_STARTUP_FINISH_INDmmi_phb_ind_startup_finish

PRT_PHB_STARTUP_BEGIN_INDmmi_phb_ind_startup_begin

PRT_PHB_STARTUP_READ_INDmmi_phb_ind_startup_read

取得固定拨号

取得快速拨号

首先调用PhbReadSpeedDialNVRAM将快速拨号的信息从NVRAM中读取出来。

然后要取得该号码对应的索引,需向L4发送消息。

取得SOS号码

复制全部

删除全部

相关文档文件

PhoneBookMain.c

PhoneBookExtraNumber.c

SpeedDial.c

Design-PhoneBook.pdf

PhoneBookSettings.c

PhoneBookStubsToOthers.c

PhoneBookSearch.c

PhoneBookOperateSingle.c

PhoneBookOperateMass.c

PhoneBookCallerGroups.c

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1