MTK-call history operate(1)

2023-10-07 00:19
文章标签 call history mtk operate

本文主要是介绍MTK-call history operate(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2008-05-24 | MTK-call history operate(1)

product: In CM, Where and How to write call log 

1.call history的保存。在各种通话状态中的保存过程

1.MO

(1)放弃outgoing call

ProcessPSHangupSucEvent()

       LogCallInfoForCallHistory(*handle);

       GetEndTimeAndNotifyCallAborted();

              CMGetExactTime(GetDateTimeAndNotifyCallAbortedCBack);

                                                 memcpy(&cm_p->state_info.CallStructureForCallLog.start_time, t, sizeof(MYTIME));  拷贝当前时间

                                             memcpy(&cm_p->state_info.CallStructureForCallLog.end_time, t, sizeof(MYTIME));

                                                 LogCall();

                                                        LogCallWithStartTime(&cm_p->state_info.CallStructureForCallLog);

                                                               if (CM_CALL_MO == log->orgination_flag) 判断电话类型:MO, MT

                                                           {

                                                              CHISTLogDialedCall(log);

                                                                             ReqWriteCallLog(call, PHB_LND);

                                                           }

                                                           else if (CM_CALL_MT == log->orgination_flag)

                                                          {

                                                              CHISTLogRecvdCall(log);

                                                                             ReqWriteCallLog(call, PHB_LNR);

                                                           }

                                                 EntryScrNotifyCallAborted();

 

       ReqWriteCallLog()这是最后写入函数

              设置返回消息PRT_MMI_PHB_SET_LAST_NUMBER_RSP的CBack函数:RspWriteDialedNum,RspWriteMissedNum,RspWriteRecvdNum。

              chis_p->process = CALL_LOG_PROC_WRITE;

 

              dataPtr = (SET_LAST_NUMBER_REQ*) OslConstructDataPtr(sizeof(SET_LAST_NUMBER_REQ));

          dataPtr->type = type;

          dataPtr->no_data = 0;

          dataPtr->index = 0xff;

              memset((U8*) & dataPtr->entry.tel, 0, sizeof(CALL_LOG_NUMBER_STRUCT));                   清空号码入口

              memset((U8*) & dataPtr->entry.alpha_id, 0, sizeof(CALL_LOG_NAME_STRUCT));               清空姓名入口

 

              //开始装载号码和姓名

              如果号码第一位是+,dataPtr->entry.tel.type = 145(0x91),否则dataPtr->entry.tel.type = 129(0x81).

              然后把号码转换成ASCII码,并拷贝到dataPtr->entry.tel.number中。

              姓名也要转换成ASCII码,并转换成大端格式。(小端:低位放低地址,大端:低位放高地址)

 

              ConvertMYTIME2RTC(&dataPtr->entry.time, &dailCall->start_time);     开始时间转换成RTC格式

          dataPtr->entry.call_duration = 0;       时间

          dataPtr->entry.count = 1;                  次数

 

              发送消息: PRT_MMI_PHB_SET_LAST_NUMBER_REQ

 

然后PS返回消息PRT_MMI_PHB_SET_LAST_NUMBER_RSP,进入CBACK函数:

RspWriteDialedNum()

       chis_p->nDialedCalls = (U8) rsp->no_list;      当前已拨电话数目

       chis_p->process = CALL_LOG_PROC_NONE;

 

 

(2)网络挂断MO call

ProcessEndCallIdAndGoBack()

       LogCallInfoForCallHistory()

       GetEndTimeAndLogUnconnectedMOCall()

              CMGetExactTime(GetDateTimeAndLogUnconnectedMOCallCBack);

                                                 memcpy(&cm_p->state_info.CallStructureForCallLog.start_time, t, sizeof(MYTIME));

                                             memcpy(&cm_p->state_info.CallStructureForCallLog.end_time, t, sizeof(MYTIME));

                                             LogCall();

       EntryScr1004NotifyEndCallDuration()

 

 

(3)MO call connect

OutgoingCallConnected()

       DTGetRTCTime(&t);   获取当前时间

       UpdateCallStartTimeAndLogCall(handle, &t);

              memcpy(&cm_p->state_info.AllCalls[index].start_time, t, sizeof(MYTIME));   //拷贝当前时间

              LogCallWithStartTime(&cm_p->state_info.AllCalls[index]);

 

MT CALL

(4)reject a MT

ProcessIncomingCallRejected

       LogCallInfoForCallHistory(GetIncomingCallHandle());

   PurgeIncomingCallStructure();

              SetCallState( )

                     GetEndTimeAndNotifyCallRejected()             reject a MT call

                            CMGetExactTime( GetDateTimeAndNotifyCallRejectedCBack );

                                                               memcpy(&cm_p->state_info.CallStructureForCallLog.start_time,t,sizeof(MYTIME));

                                                               memcpy(&cm_p->state_info.CallStructureForCallLog.end_time,t,sizeof(MYTIME));

                                                        CHISTLogRejectedCall(&cm_p->state_info.CallStructureForCallLog);

                                                                      ReqWriteCallLog( call, PHB_LNM );

                                                               EntryScr1004NotifyEndCallDuration( )

 

                     GetEndTimeAndNotifyCallMissed()            miss a MT call

                            memcpy(&cm_p->state_info.CallStructureForCallLog.start_time, &t, sizeof(MYTIME));

                        memcpy(&cm_p->state_info.CallStructureForCallLog.end_time, &t, sizeof(MYTIME));

                        CHISTLogMissedCall(&cm_p->state_info.CallStructureForCallLog);

                                   设置未接电话的status icon以及一些变量

                                   ReqWriteCallLog(call, PHB_LNM);

 

(5)接听MT

ProcessAcceptIncomingCall()

       EntryScr1002ActiveCall()

              DummyScr1002ActiveCall()

                     UpdateCallStartTimeAndLogCall()            与MO接通相同

                            memcpy(&cm_p->state_info.AllCalls[index].start_time, t, sizeof(MYTIME));

                            LogCallWithStartTime(&cm_p->state_info.AllCalls[index]);

 

 

(6)挂断ACTIVE、HOLD call

ProcessPSHangupSucEvent()

       LogCallInfoForCallHistory()

       GetEndTimeAndNotifyEndCallDuration()

              memcpy(&gTimeStructForEndedCallStartTime, &(cm_p->state_info.AllCalls[GetMMIStructIndexof(handle)].start_time), sizeof(MYTIME));       //开始时间

              memset(&temp, 0, sizeof(MYTIME));

              if (!(memcmp(&gTimeStructForEndedCallStartTime, &temp, sizeof(MYTIME)) == 0))         //开始时间不为0,即:要更新已经写入NVRAM的call log record

              {

                     DTGetRTCTime(&(cm_p->state_info.CallStructureForCallLog.end_time));     //获取电话结束时间

                     CHISTLogDialedCallDuration(&cm_p->state_info.CallStructureForCallLog); 或者

                            if (电话start time 与 end time不同)

                            {

                                   GetTimeDifference(&call->end_time, &call->start_time, &chis_p->last_call_time);                获取时间差,即最后通话时间

                           IncrementTime(chis_p->total_out_time, chis_p->last_call_time, &(chis_p->total_out_time)); 已拨电话总计增加

 

                           WriteRecord(NVRAM_EF_CALL_TIME_LID, 2, (void*)&chis_p->total_out_time, sizeof(MYTIME), &error);

                           WriteRecord(NVRAM_EF_CALL_TIME_LID, 1, (void*)&chis_p->last_call_time, sizeof(MYTIME), &error);

 

                           mmi_chist_log_call_duration(call, PHB_LND);       更新已经写入NVRAM中的record.

                                          首先根据类型:PHB_LND,PHB_LNR设置开始读取的record位置:

                                          if (type == PHB_LND)

                                      {

                                         start_lid = 1;

                                      }

                                      else if (type == PHB_LNR)

                                      {

                                                 //计算结果是5。

                                         start_lid = 1 + ((TOT_SIZE_OF_DIALED_LIST + TOT_SIZE_OF_ONE_LN_LIST -1)/TOT_SIZE_OF_ONE_LN_LIST) +

                                                  ((TOT_SIZE_OF_DIALED_LIST + TOT_SIZE_OF_ONE_LN_LIST -1)/TOT_SIZE_OF_ONE_LN_LIST);

                                     }

                                          注意:关于call log在NVRAM中的存储,文件ID是:NVRAM_EF_PHB_LN_ENTRY_LID。一共有6个record,每个record共924字节。

                                          是不是record1,2存储dialed call log,3,4存储misesed call log,5,6存储received call log?

                                          在下面的ReadRecord( )函数中,变量temp_call_log中最多只能读取10个log entry,那么另外10个call log也就是上面的record 6怎么读取的                                        (每种call log是20个)?

 

                                          temp_call_log = OslMalloc(NVRAM_EF_PHB_LN_ENTRY_SIZE);     分配空间,准备存储读取的call log

                                          ReadRecord(NVRAM_EF_PHB_LN_ENTRY_LID, start_lid, temp_call_log, NVRAM_EF_PHB_LN_ENTRY_SIZE, &error);       读取NVRAM

                                          for (i=0; i< temp_call_log->no_entry; i++)

                                          {

                                                 ConvertRTC2MYTIME(&start_time, &temp_call_log->array[i].time);      获取读取到的call log开始时间

                                                 if (CompareTime(start_time, call->start_time, NULL) == 0)                      与要保存的开始时间相同

                                                 {           

                                                        先把temp_call_log->array[i].addr_bcd[]中的BCD码转换成ASCII码,再转换成UCS2。

                                                        AnsiiToUnicodeString(ucs2_number, (S8*) tempNumber);

                                                        if (pfnUnicodeStrcmp((const S8*)ucs2_number, (const S8*)call->num) == 0)         与要保存的电话号码相同

                                                        {

                                                               更新temp_call_log->array[i].call_duration = call.end_time – call.start_time;

                                                               WriteRecord(NVRAM_EF_PHB_LN_ENTRY_LID, start_lid, temp_call_log, NVRAM_EF_PHB_LN_ENTRY_SIZE, &error);

                                           break;

                                                        }

                                                 }                                       

                                          }                                       

                            }

 

                     CHISTLogRecvdCallDuration(&cm_p->state_info.CallStructureForCallLog);

                            if (电话start time 与 end time不同)

                            {

                                   GetTimeDifference(&call->end_time, &call->start_time, &chis_p->last_call_time);                获取时间差,即最后通话时间

                           IncrementTime(chis_p->total_in_time, chis_p->last_call_time, &(chis_p->total_in_time));      已接电话总计增加

 

                           WriteRecord(NVRAM_EF_CALL_TIME_LID, 3, (void*)&chis_p->total_in_time, sizeof(MYTIME), &error);

                           WriteRecord(NVRAM_EF_CALL_TIME_LID, 1, (void*)&chis_p->last_call_time, sizeof(MYTIME), &error);

 

                           mmi_chist_log_call_duration(call, PHB_LNR);

                            }

              }

 

              CMGetExactTime(GetDateTimeAndNotifyEndCallDurationCBack);

                                                 EntryScr1004NotifyEndCallDuration();

这篇关于MTK-call history operate(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154843

相关文章

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

AutoGen Function Call 函数调用解析(一)

目录 一、AutoGen Function Call 1.1 register_for_llm 注册调用 1.2 register_for_execution 注册执行 1.3 三种注册方法 1.3.1 函数定义和注册分开 1.3.2 定义函数时注册 1.3.3  register_function 函数注册 二、实例 本文主要对 AutoGen Function Call

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二

MTK平台AndroidP/Q快速生成dtb.img和dtbo.img(2秒生成)

背景: MTK升级新的Android版本后,无法快速编译dtbo image,当我们修改DWS和PROJECT DTS后验证问题非常麻烦,必须删除out下KERNEL_OBJ才能生成新的dtbo.img,而且必须整编。 所以跟据编译流程,写了下面这个脚本,可以快速生成dtbo和dtb image,可以几秒钟完成 使用方法: (1)将脚本放在工程跟目录 (2)修改脚本开头的几个变量,改为你

MTK AndroidP/Q快速打包ramdisk

一、Android P/Q ramdisk与老版本的差异 Android老版本的ramdisk是out下的root/ramdisk打包而来,里面包含了init  /sbin  init.rc   default.prop等文件。是一个完整的ramdisk Android新版本ramdisk分为了out 下的ramdisk目录和root目录,init ,init.rc等文件大部分都放到了syst

Android P/Q MTK平台无依赖打包boot.img

背景:        有时排查版本问题,需要用到替换img的方式来查找问题出现在哪个img,若出现在bootimg,那到底是kernel、DTB 还是ramdisk。此时就需要单独替换其中一个的方式来打包,之前直接make bootimage-nodeps就可以了,但现在发现执行这个命令无效了。下面就分析下新版本如何找到正确的打包命令。 一、找到编译boot的命令 之前Android编译lo

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

Python __call__ 用法 作用

当一个对象为可被调用对象时,callable(object)返回为True,否则为False: Python中的对象有可被调用和不可被调用之分。 def func_test():print("func_test run")class class_test():def __init__(self):pass# func_test is callable return Trueprint("fu

history命令内容格式优化:添加日期时间及IP地址

目录 一、历史记录格式1.1操作步骤1.2其他说明 二、历史记录问题2.1记录显示不全2.2定时自动记录 一、历史记录格式 1.1操作步骤 [可选步骤]清空当前历史记录:history -c && > ~/.bash_history && history -r 编辑对应的配置文件: 用户配置文件:vim ~/.bashrc系统配置文件[推荐]:sudo vim /etc

Vue 项目hash和history模式打包部署与服务器配置

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 在开发 Vue 项目时,Vue Router 提供了两种模式来创建单页面应用(SPA)的 URL:hash 模式和 history 模式。 简单说下两者的主要区别: hash 模式下的 URL 看起来不那么美观,带有一个 # 符号。在这种模式下,URL 中的 hash 值(# 后面的部分)会改变,但页面不会重新加载。因为不会向服务器发送请求,服