MTK-call history initialize

 

资源加载过程

InitializeAll()

       PopulateResData()

              PopulateCallHistoryRes()                 

                     AddCallLogApplicationRes();                  未接电话,已拨电话,已接电话。

                     PopulateResetCallRes();                          删除通话记录

                     AddSMSCounterApplicationRes();          短信计数器

                     PopulateCallTimes();                                通话时间

                     PopulateCallCost();                                 通话cost

                     #ifdef __MMI_GPRS_FEATURES__

                            AddGPRSCounterApplicationRes(); GPRS计数器

                     #endif

 

 

系统初始化过程

InitializeAll()

       InitCallLogs()

              SetProtocolEventHandler(ReadyLogIndication, PRT_MMI_PHB_LAST_NUMBER_READY_IND);

              SetHintHandler(….)    设置MENU的hilite和hint响应。注意:这里只设置了前3个MENU:未接电话,已拨电话,已接电话 中,涉及到的MENU的响应。

              …

              InitCallHistoryContext();     //初始化全局变量

                     memset((U8*) chis_p, 0, sizeof(call_history_context_struct));

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

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

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

 

 

InitAllApplications()

       InitCallCost();                            //设置call cost中MENU的hilite and hint响应

   InitCallHistory();

              InitCallsReset();                  //[删除通话记录]中MENU的响应

          InitSMSCounter();              //[短信计数器]中MENU的响应

          InitCallTimes();                   //[通话时间]中MENU的响应

          InitGPRSCounter();            //[GPRS计数器]中MENU的响应

 

 

启动过程:

上电后,当PS的call log准备好之后,发送消息:PRT_MMI_PHB_LAST_NUMBER_READY_IND给MMI,进入CBack函数:

ReadyLogIndication()

       chis_p->isCallLogReady = TRUE;

   chis_p->isFirstTime = TRUE;

   chis_p->sequenceId = 0;

       mmi_chist_init_get_data_from_nvram();读取missed call flag: g_chist_have_missed_call(0—no missed call, 1—yes missed call) 。NVRAM_CHIST_HAVE_MISSED_CALL。

       if (g_chist_have_missed_call == 1)

           IdleSetStatusIcon(STATUS_ICON_MISSED_CALL);

       else

              HideStatusIcon(STATUS_ICON_MISSED_CALL);

      

       ReqReadDialedNum();       开始读取call logs

    return;

 

ReqReadDialedNum()

       #ifndef __MMI_CH_MIXED_CALL_LOG__

          chis_p->dialedCalls = (LOG_CALL*) chis_p->callsLog;    // chis_p->callsLog[]是实际存储的位置,即如果不支持mixed call log,那么在分别进入3中类型的call logs

       #endif                                                                                         //时,获取的call log都存储在chis_p->callsLog[]中。然后把3个指针之一指向这里。

       设置消息PRT_MMI_PHB_GET_LAST_NUMBER_REQ的一些参数

       SetProtocolEventHandler(RspReadDialedNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);

   OslMsgSendExtQueue(&Message);

 

L4返回消息:PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:

RspReadDialedNum()

       rsp = (GET_LAST_NUMBER_RSP*) info;

       if (chis_p->sequenceId == 1)     //第一次读取,先清空缓冲区

   {

         chis_p->nDialedCalls = 0;

         memset((PS8) chis_p->dialedCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);

       }

       for (index = 0; index < rsp->no_list; index++) //抽取信息

      {

        CHISTExtractPSCallLog(&chis_p->dialedCalls[chis_p->nDialedCalls], &rsp->list[index]);

              {

 

                     1.获取姓名在拷贝PS中的姓名到CALL LOG时,

                            如果是UCS2,注意:PS中存储方式是大端格式,要转换成系统中的小端格式

                            如果是ASCII码,AnsiiToUnicodeString((S8*) logCall->pbName, (S8*) phbLastNumber->alpha_id.name);

                     2.获取号码。PS中保存的号码是ASCII码

                            if (phbLastNumber->tel.type & 0x10)

                        {

                           logCall->number[0] = '+';

                           AnsiiToUnicodeString((PS8) (logCall->number + 2), (PS8) phbLastNumber->tel.number);

                        }

                        else

                        {

                           AnsiiToUnicodeString((PS8) logCall->number, (PS8) phbLastNumber->tel.number);

                        }

                     3.start time:ConvertRTC2MYTIME(&logCall->startTime, &phbLastNumber->time);

                     4. duration:mmi_dt_utc_sec_2_mytime(phbLastNumber->call_duration, &logCall->duration, MMI_FALSE);

                 5.counters:logCall->no_of_times = phbLastNumber->count;                 

              }

          chis_p->nDialedCalls++;

       }

       if (rsp->more_data && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST)    没有读取完,再次读取

     {

           chis_p->sequenceId++;

        ASSERT(chis_p->sequenceId < 11);

          ReqReadDialedNum();

        return;

       }

 

       chis_p->sequenceId = 0;    所有dialed call全部提取完毕

       if (chis_p->isFirstTime == TRUE)     //表示这是在初始化时第一次读取,需要把所有的dialed,missed,received call log全部读取出来。

       {

        ReqReadMissedNum();

        return;

    }

 

 

       //如果不是初始化时读取的,就进入这里,即:dialed call list

       chis_p->isReqSent = FALSE;  

    EntryCHISTViewDialedCallList();

 

 

此时,由于我们是初始化时第一次读取call log,因此要一次性读取所有的call log,进入红色部分的if中去,即继续读取missed call log:

ReqReadMissedNum()

       chis_p->missedCalls = (LOG_CALL*) chis_p->callsLog;   共用一个存储空间

       消息:PRT_MMI_PHB_GET_LAST_NUMBER_REQ

       SetProtocolEventHandler(RspReadMissedNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);

    OslMsgSendExtQueue(&Message);

    return;

 

PS返回消息PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:

RspReadMissedNum()

       if (chis_p->sequenceId == 1)     第一匹读取

   {

         chis_p->nMissedCalls = 0;

         memset((PS8) chis_p->missedCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);

       }

     for (index = 0; index < rsp->no_list; index++) 抽取call log,抽取函数都是相同的

     {

         CHISTExtractPSCallLog(&chis_p->missedCalls[chis_p->nMissedCalls], &rsp->list[index]);

         chis_p->nMissedCalls++;

      }

       if (rsp->more_data && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST)    判断是否读取完毕

   {

        chis_p->sequenceId++;

         ASSERT(chis_p->sequenceId < 11);

        ReqReadMissedNum();

         return;

      }

 

       chis_p->sequenceId = 0;    读取完毕

       if (chis_p->isFirstTime == TRUE)     如果是初始化的话,继续读取received call log

       {

              ReqReadRecvdNum();

       return;

       }

 

       chis_p->isReqSent = FALSE;                      如果不是初始化,就进入missed call log list

    EntryCHISTViewMissedCallList();

 

 

继续读取received call log

ReqReadRecvdNum()

       chis_p->recvdCalls = (LOG_CALL*) chis_p->callsLog;     共用一个存储空间

       SetProtocolEventHandler(RspReadRecvdNum, PRT_MMI_PHB_GET_LAST_NUMBER_RSP);

    OslMsgSendExtQueue(&Message);

    return;

 

PS返回消息:PRT_MMI_PHB_GET_LAST_NUMBER_RSP,进入:

RspReadRecvdNum()

       if (chis_p->sequenceId == 1)     初始化变量

     {

        chis_p->nRecvdCalls = 0;

        memset((PS8) chis_p->recvdCalls, 0, sizeof(LOG_CALL) * TOT_SIZE_OF_ONE_LN_LIST);

      }

       for (index = 0; index < rsp->no_list; index++) 抽取消息

   {

        CHISTExtractPSCallLog(&chis_p->recvdCalls[chis_p->nRecvdCalls], &rsp->list[index]);

         chis_p->nRecvdCalls++;

      }

     if (rsp->more_data  && rsp->no_list == TOT_SIZE_OF_ONE_LN_LIST) 判断是否读取完毕

      {

        chis_p->sequenceId++;

         ASSERT(chis_p->sequenceId < 11);

         ReqReadRecvdNum();

        return;

      }

 

 

       执行到这里时,说明已经读取完毕。

       chis_p->sequenceId = 0;

 

       //表示这是初始化时第一次读取。注意:这里直接返回。因为是初始化读取的,不是进入某个call log list,以此直接返回。

       //以上读取的3种call log中,每次读取之后,所有的call log信息都是存储在同一个空间chis_p->callsLog[]。为什么是这样?我的理解:初始化的这次读取,仅仅      //是要证明每种call log都能够正确的读取出来。 在以后系统正常工作中,如果要进入某种call log,就单独读取某一种call log,并存储在这个空间中,然后show       //出call log list。

       if (chis_p->isFirstTime == TRUE)        

       {

        chis_p->isFirstTime = FALSE;

        return;        

    }

 

       //进入到这里,说明不是初始化的读取,而是要进入received Call log list

       chis_p->isReqSent = FALSE;          

       EntryCHISTViewRecvdCallList();    show received call log list。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT物联网小镇

赏点银子去植发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值