ProfilingEngine.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:24k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   Profiling.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   MAUI
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   MMI performance profiling utilities and framework
  48.  *
  49.  * Author:
  50.  * -------
  51.  * -------
  52.  *
  53.  *============================================================================
  54.  *             HISTORY
  55.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  56.  *------------------------------------------------------------------------------
  57.  * removed!
  58.  *
  59.  * removed!
  60.  * removed!
  61.  * removed!
  62.  *
  63.  * removed!
  64.  * removed!
  65.  * removed!
  66.  *
  67.  * removed!
  68.  * removed!
  69.  * removed!
  70.  *
  71.  * removed!
  72.  * removed!
  73.  * removed!
  74.  *
  75.  * removed!
  76.  * removed!
  77.  * removed!
  78.  *
  79.  * removed!
  80.  * removed!
  81.  * removed!
  82.  *
  83.  * removed!
  84.  * removed!
  85.  * removed!
  86.  *
  87.  * removed!
  88.  * removed!
  89.  * removed!
  90.  *
  91.  *------------------------------------------------------------------------------
  92.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  93.  *============================================================================
  94.  ****************************************************************************/
  95. /*  Include: MMI header file */
  96. #include "MMI_features.h"
  97. #include "stdC.h"
  98. #include "L4Dr1.h"
  99. #include "PixtelDataTypes.h"
  100. #include "gui_data_types.h"
  101. #include "gui.h"
  102. #include "gui_themes.h"
  103. #include "UCS2prot.h"
  104. #include "ProfilingEngine.h"
  105. #include "DebugInitDef.h"
  106. #ifndef __MTK_TARGET__
  107. /* MoDIS or PC Simulator */
  108. #include <sys/timeb.h>
  109. #include <time.h>
  110. #elif defined(KAL_ON_NUCLEUS)
  111. #include "kal_nucleus.h"
  112. #endif /* __MTK_TARGET__ */ 
  113. #include "gdi_include.h"
  114. /*  Include: PS header file */
  115. #ifdef __MMI_INTERACTIVE_PROFILNG__
  116. /* 
  117.  * Define
  118.  */
  119. /* Screen outout buffer size */
  120. #define MMI_FRM_PROFILING_OUTBUF_SIZE       64
  121. /* Number of interactive profing set */
  122. #define MMI_FRM_PROFILING_NUM_ISET          3
  123. /* 
  124.  * Typedef 
  125.  */
  126. #ifdef MMI_ON_WIN32
  127. typedef clock_t profiling_tick_t;
  128. #else 
  129. typedef kal_uint32 profiling_tick_t;
  130. #endif 
  131. typedef struct
  132. {
  133.     /* Start tick of interactive mode */
  134.     profiling_tick_t interactive_start[MMI_FRM_PROFILING_NUM_ISET];
  135.     /* End tick of interactive mode */
  136.     profiling_tick_t interactive_end[MMI_FRM_PROFILING_NUM_ISET];
  137. } mmi_frm_profiling_struct;
  138. /* 
  139.  * Local Variable
  140.  */
  141. /* Context of profiling */
  142. static mmi_frm_profiling_struct g_mmi_frm_profiling_data;
  143. /* Enable interactive profiling */
  144. static MMI_BOOL g_mmi_frm_profiling_interactive_enabled = MMI_FALSE;
  145. static MMI_BOOL g_mmi_frm_profiling_gdi_profile_enabled = MMI_FALSE;
  146. static const color g_mmi_frm_profiling_bgcolor = {0, 0, 0, 100};
  147. static const color g_mmi_frm_profiling_fgcolor = {255, 255, 255, 100};
  148. /* Delay emulation */
  149. static profiling_tick_t g_mmi_frm_profiling_delay_start_time[MMI_FRM_PROFILING_DELAY_MAX_TYPE];
  150. static profiling_tick_t g_mmi_frm_profiling_delay_tick[MMI_FRM_PROFILING_DELAY_MAX_TYPE];
  151. /* 
  152.  * Local Function
  153.  */
  154. /*****************************************************************************
  155.  * FUNCTION
  156.  *  mmi_frm_profiling_get_time
  157.  * DESCRIPTION
  158.  *  Portable way for 
  159.  * PARAMETERS
  160.  *  void
  161.  * RETURNS
  162.  *  It returns time in millisecond for PC Simulator and ticks for target/MoDIS
  163.  *****************************************************************************/
  164. static profiling_tick_t mmi_frm_profiling_get_time(void)
  165. {
  166.     /*----------------------------------------------------------------*/
  167.     /* Local Variables                                                */
  168.     /*----------------------------------------------------------------*/
  169.     profiling_tick_t t;
  170.     /*----------------------------------------------------------------*/
  171.     /* Code Body                                                      */
  172.     /*----------------------------------------------------------------*/
  173. #ifdef MMI_ON_WIN32
  174.     t = clock();
  175.     return t * 1000 / CLOCKS_PER_SEC;
  176. #else /* MMI_ON_WIN32 */
  177.     kal_get_time(&t);
  178.     return t;
  179. #endif /* MMI_ON_WIN32 */
  180. }
  181. /* 
  182.  * Global Variable
  183.  */
  184. /* 
  185.  * Global Function
  186.  */
  187. /*****************************************************************************
  188.  * FUNCTION
  189.  *  mmi_frm_profiling_interactive_is_enabled
  190.  * DESCRIPTION
  191.  *  Is interactive profiling enabled
  192.  * PARAMETERS
  193.  *  void
  194.  * RETURNS
  195.  *  void
  196.  *****************************************************************************/
  197. MMI_BOOL mmi_frm_profiling_interactive_is_enabled(void)
  198. {
  199.     /*----------------------------------------------------------------*/
  200.     /* Local Variables                                                */
  201.     /*----------------------------------------------------------------*/
  202.     /*----------------------------------------------------------------*/
  203.     /* Code Body                                                      */
  204.     /*----------------------------------------------------------------*/
  205.     return g_mmi_frm_profiling_interactive_enabled;
  206. }
  207. /*****************************************************************************
  208.  * FUNCTION
  209.  *  mmi_frm_profiling_interactive_enable
  210.  * DESCRIPTION
  211.  *  Enable/disable interactive profiling
  212.  * PARAMETERS
  213.  *  enable      [IN]        
  214.  * RETURNS
  215.  *  void
  216.  *****************************************************************************/
  217. void mmi_frm_profiling_interactive_enable(MMI_BOOL enable)
  218. {
  219.     /*----------------------------------------------------------------*/
  220.     /* Local Variables                                                */
  221.     /*----------------------------------------------------------------*/
  222.     /*----------------------------------------------------------------*/
  223.     /* Code Body                                                      */
  224.     /*----------------------------------------------------------------*/
  225.     g_mmi_frm_profiling_interactive_enabled = enable;
  226. }
  227. /*****************************************************************************
  228.  * FUNCTION
  229.  *  mmi_frm_profiling_gdi_profile_is_enabled
  230.  * DESCRIPTION
  231.  *  Is interactive profiling enabled
  232.  * PARAMETERS
  233.  *  void
  234.  * RETURNS
  235.  *  void
  236.  *****************************************************************************/
  237. MMI_BOOL mmi_frm_profiling_gdi_profile_is_enabled(void)
  238. {
  239.     /*----------------------------------------------------------------*/
  240.     /* Local Variables                                                */
  241.     /*----------------------------------------------------------------*/
  242.     /*----------------------------------------------------------------*/
  243.     /* Code Body                                                      */
  244.     /*----------------------------------------------------------------*/
  245.     return g_mmi_frm_profiling_gdi_profile_enabled;
  246. }
  247. /*****************************************************************************
  248.  * FUNCTION
  249.  *  mmi_frm_profiling_gdi_profile_enable
  250.  * DESCRIPTION
  251.  *  Enable/disable interactive profiling
  252.  * PARAMETERS
  253.  *  enable      [IN]        
  254.  * RETURNS
  255.  *  void
  256.  *****************************************************************************/
  257. void mmi_frm_profiling_gdi_profile_enable(MMI_BOOL enable)
  258. {
  259.     /*----------------------------------------------------------------*/
  260.     /* Local Variables                                                */
  261.     /*----------------------------------------------------------------*/
  262.     /*----------------------------------------------------------------*/
  263.     /* Code Body                                                      */
  264.     /*----------------------------------------------------------------*/
  265.     g_mmi_frm_profiling_gdi_profile_enabled = enable;
  266. }
  267. /*****************************************************************************
  268.  * FUNCTION
  269.  *  mmi_frm_profiling_interactive_start
  270.  * DESCRIPTION
  271.  *  Start of interactive profiling
  272.  * PARAMETERS
  273.  *  void
  274.  * RETURNS
  275.  *  void
  276.  *****************************************************************************/
  277. void mmi_frm_profiling_interactive_start(void)
  278. {
  279.     /*----------------------------------------------------------------*/
  280.     /* Local Variables                                                */
  281.     /*----------------------------------------------------------------*/
  282.     /*----------------------------------------------------------------*/
  283.     /* Code Body                                                      */
  284.     /*----------------------------------------------------------------*/
  285.     if (g_mmi_frm_profiling_interactive_enabled)
  286.     {
  287.         g_mmi_frm_profiling_data.interactive_start[0] = mmi_frm_profiling_get_time();
  288.     }
  289. }
  290. /*****************************************************************************
  291.  * FUNCTION
  292.  *  mmi_frm_profiling_interactive_start2
  293.  * DESCRIPTION
  294.  *  Start of interactive profiling of 2nd test set
  295.  * PARAMETERS
  296.  *  void
  297.  * RETURNS
  298.  *  void
  299.  *****************************************************************************/
  300. void mmi_frm_profiling_interactive_start2(void)
  301. {
  302.     /*----------------------------------------------------------------*/
  303.     /* Local Variables                                                */
  304.     /*----------------------------------------------------------------*/
  305.     /*----------------------------------------------------------------*/
  306.     /* Code Body                                                      */
  307.     /*----------------------------------------------------------------*/
  308.     if (g_mmi_frm_profiling_interactive_enabled)
  309.     {
  310.         g_mmi_frm_profiling_data.interactive_start[1] = mmi_frm_profiling_get_time();
  311.     }
  312. }
  313. /*****************************************************************************
  314.  * FUNCTION
  315.  *  mmi_frm_profiling_interactive_start3
  316.  * DESCRIPTION
  317.  *  Start of interactive profiling of 3rd test set
  318.  * PARAMETERS
  319.  *  void
  320.  * RETURNS
  321.  *  void
  322.  *****************************************************************************/
  323. void mmi_frm_profiling_interactive_start3(void)
  324. {
  325.     /*----------------------------------------------------------------*/
  326.     /* Local Variables                                                */
  327.     /*----------------------------------------------------------------*/
  328.     /*----------------------------------------------------------------*/
  329.     /* Code Body                                                      */
  330.     /*----------------------------------------------------------------*/
  331.     if (g_mmi_frm_profiling_interactive_enabled)
  332.     {
  333.         g_mmi_frm_profiling_data.interactive_start[2] = mmi_frm_profiling_get_time();
  334.     }
  335. }
  336. /*****************************************************************************
  337.  * FUNCTION
  338.  *  mmi_frm_profiling_interactive_end
  339.  * DESCRIPTION
  340.  *  End of interactive profiling
  341.  * PARAMETERS
  342.  *  void
  343.  * RETURNS
  344.  *  void
  345.  *****************************************************************************/
  346. void mmi_frm_profiling_interactive_end(void)
  347. {
  348.     /*----------------------------------------------------------------*/
  349.     /* Local Variables                                                */
  350.     /*----------------------------------------------------------------*/
  351.     /*----------------------------------------------------------------*/
  352.     /* Code Body                                                      */
  353.     /*----------------------------------------------------------------*/
  354.     if (g_mmi_frm_profiling_interactive_enabled)
  355.     {
  356.         g_mmi_frm_profiling_data.interactive_end[0] = mmi_frm_profiling_get_time();
  357.     }
  358. }
  359. /*****************************************************************************
  360.  * FUNCTION
  361.  *  mmi_frm_profiling_interactive_end2
  362.  * DESCRIPTION
  363.  *  End of interactive profiling of 2nd test set
  364.  * PARAMETERS
  365.  *  void
  366.  * RETURNS
  367.  *  void
  368.  *****************************************************************************/
  369. void mmi_frm_profiling_interactive_end2(void)
  370. {
  371.     /*----------------------------------------------------------------*/
  372.     /* Local Variables                                                */
  373.     /*----------------------------------------------------------------*/
  374.     /*----------------------------------------------------------------*/
  375.     /* Code Body                                                      */
  376.     /*----------------------------------------------------------------*/
  377.     if (g_mmi_frm_profiling_interactive_enabled)
  378.     {
  379.         g_mmi_frm_profiling_data.interactive_end[1] = mmi_frm_profiling_get_time();
  380.     }
  381. }
  382. /*****************************************************************************
  383.  * FUNCTION
  384.  *  mmi_frm_profiling_interactive_end3
  385.  * DESCRIPTION
  386.  *  End of interactive profiling of 3rd test set
  387.  * PARAMETERS
  388.  *  void
  389.  * RETURNS
  390.  *  void
  391.  *****************************************************************************/
  392. void mmi_frm_profiling_interactive_end3(void)
  393. {
  394.     /*----------------------------------------------------------------*/
  395.     /* Local Variables                                                */
  396.     /*----------------------------------------------------------------*/
  397.     /*----------------------------------------------------------------*/
  398.     /* Code Body                                                      */
  399.     /*----------------------------------------------------------------*/
  400.     if (g_mmi_frm_profiling_interactive_enabled)
  401.     {
  402.         g_mmi_frm_profiling_data.interactive_end[2] = mmi_frm_profiling_get_time();
  403.     }
  404. }
  405. /*****************************************************************************
  406.  * FUNCTION
  407.  *  mmi_frm_profiling_interactive_show
  408.  * DESCRIPTION
  409.  *  Display profiling information on screen (typically on softkey bar)
  410.  * PARAMETERS
  411.  *  prompt      [IN]        Prompt string to be displayed
  412.  *  flags       [IN]        Which to show (MMI_FRM_PROFILING_MASK_#)
  413.  * RETURNS
  414.  *  void
  415.  *****************************************************************************/
  416. void mmi_frm_profiling_interactive_show(U8 *prompt, U32 flags)
  417. {
  418.     /*----------------------------------------------------------------*/
  419.     /* Local Variables                                                */
  420.     /*----------------------------------------------------------------*/
  421.     S32 i;
  422.     profiling_tick_t ms;    /* millisecond */
  423.     S32 prompt_len;
  424.     U8 ascii_str[MMI_FRM_PROFILING_OUTBUF_SIZE + 1];
  425.     U8 unicode_str[(MMI_FRM_PROFILING_OUTBUF_SIZE + 1) * 2];
  426.     S32 sw, sh; /* string width, height */
  427.     S32 x1, y1, x2, y2;
  428.     S32 bottom_y;
  429.     /*----------------------------------------------------------------*/
  430.     /* Code Body                                                      */
  431.     /*----------------------------------------------------------------*/
  432.     if (!g_mmi_frm_profiling_interactive_enabled)
  433.     {
  434.         return;
  435.     }
  436.     gui_lock_double_buffer();
  437.     bottom_y = UI_device_height - 1;
  438.     for (i = 0; i < MMI_FRM_PROFILING_NUM_ISET; i++)
  439.     {
  440.         if (!(flags & (MMI_FRM_PROFILING_MASK_1 << i)))
  441.         {
  442.             continue;
  443.         }
  444.         ms = g_mmi_frm_profiling_data.interactive_end[i] - g_mmi_frm_profiling_data.interactive_start[i];
  445.     #ifndef MMI_ON_WIN32
  446.         ms = ms * 1000 / KAL_TICKS_1_SEC;
  447.     #endif 
  448.         sprintf((char*)ascii_str, "%d.%03d", (int)(ms / 1000), (int)(ms % 1000));
  449.         UCS2Strncpy((S8*) unicode_str, (S8*) prompt, MMI_FRM_PROFILING_OUTBUF_SIZE);
  450.         prompt_len = UCS2Strlen((S8*) unicode_str);
  451.         AnsiiNToUnicodeString(
  452.             (S8*) unicode_str + (prompt_len * 2),
  453.             (S8*) ascii_str,
  454.             MMI_FRM_PROFILING_OUTBUF_SIZE - prompt_len);
  455.         gui_set_font(&MMI_small_font);
  456.         gui_measure_string((UI_string_type) unicode_str, &sw, &sh);
  457.         x1 = (UI_device_width - sw) >> 1;
  458.         x2 = x1 + sw - 1;
  459.         y2 = bottom_y;
  460.         y1 = y2 - sh + 1;
  461.         bottom_y -= sh + 1;
  462.         gui_push_clip();
  463.         gui_set_clip(x1, y1, x2, y2);
  464.         gui_fill_rectangle(x1, y1, x2, y2, g_mmi_frm_profiling_bgcolor);
  465.         gui_set_text_color(g_mmi_frm_profiling_fgcolor);
  466.         gui_move_text_cursor(x1, y1);
  467.         gui_print_text((UI_string_type) unicode_str);
  468.         gui_pop_clip();
  469.         gui_BLT_double_buffer(x1, y1, x2, y2);
  470.     }
  471.     gui_unlock_double_buffer();
  472.     gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
  473. }
  474. /*****************************************************************************              
  475.  * Delay emulation 
  476.  * 
  477.  * This is used internally in MTK to experiment human perception of UI delay
  478.  *****************************************************************************/
  479. /*****************************************************************************
  480.  * FUNCTION
  481.  *  mmi_frm_profiling_delay_set
  482.  * DESCRIPTION
  483.  *  Configure delay emulation
  484.  *
  485.  *  Set 'ms' to 0 to disable the UI delay effects
  486.  * PARAMETERS
  487.  *  type        [IN]        Type of delay event
  488.  *  ms          [IN]        Delay in milliseconds
  489.  * RETURNS
  490.  *  void
  491.  *****************************************************************************/
  492. void mmi_frm_profiling_delay_set(mmi_frm_profiling_delay_enum type, U32 ms)
  493. {
  494.     /*----------------------------------------------------------------*/
  495.     /* Local Variables                                                */
  496.     /*----------------------------------------------------------------*/
  497.     /*----------------------------------------------------------------*/
  498.     /* Code Body                                                      */
  499.     /*----------------------------------------------------------------*/
  500.     MMI_ASSERT(type < MMI_FRM_PROFILING_DELAY_MAX_TYPE);
  501. #ifdef MMI_ON_WIN32
  502.     g_mmi_frm_profiling_delay_tick[type] = (profiling_tick_t) ms;
  503. #else
  504.     g_mmi_frm_profiling_delay_tick[type] = (profiling_tick_t) kal_milli_secs_to_ticks(ms);
  505. #endif
  506. }
  507. /*****************************************************************************
  508.  * FUNCTION
  509.  *  mmi_frm_profiling_delay_get
  510.  * DESCRIPTION
  511.  *  Get the configured delay emulation
  512.  * PARAMETERS
  513.  *  type        [IN]        Type of delay event
  514.  * RETURNS
  515.  *  
  516.  *****************************************************************************/
  517. U32 mmi_frm_profiling_delay_get(mmi_frm_profiling_delay_enum type)
  518. {
  519.     /*----------------------------------------------------------------*/
  520.     /* Local Variables                                                */
  521.     /*----------------------------------------------------------------*/
  522.     /*----------------------------------------------------------------*/
  523.     /* Code Body                                                      */
  524.     /*----------------------------------------------------------------*/
  525.     MMI_ASSERT(type < MMI_FRM_PROFILING_DELAY_MAX_TYPE);
  526. #ifdef MMI_ON_WIN32
  527.     return g_mmi_frm_profiling_delay_tick[type];
  528. #else
  529.     return kal_ticks_to_milli_secs(g_mmi_frm_profiling_delay_tick[type]);
  530. #endif
  531. }
  532. /*****************************************************************************
  533.  * FUNCTION
  534.  *  mmi_frm_profiling_delay_start_timer
  535.  * DESCRIPTION
  536.  *  Configure the current time to emulate UI delay effect
  537.  * PARAMETERS
  538.  *  type        [IN]        Type of event
  539.  * RETURNS
  540.  *  Expected delay time in ticks
  541.  *****************************************************************************/
  542. void mmi_frm_profiling_delay_start_timer(mmi_frm_profiling_delay_enum type)
  543. {
  544.     /*----------------------------------------------------------------*/
  545.     /* Local Variables                                                */
  546.     /*----------------------------------------------------------------*/
  547.     
  548.     /*----------------------------------------------------------------*/
  549.     /* Code Body                                                      */
  550.     /*----------------------------------------------------------------*/
  551.     MMI_ASSERT(type < MMI_FRM_PROFILING_DELAY_MAX_TYPE);
  552.     
  553.     if (!g_mmi_frm_profiling_delay_tick[type])
  554.     {
  555.         return;
  556.     }
  557.     
  558.     if ((g_mmi_frm_profiling_delay_start_time[type] = mmi_frm_profiling_get_time()) == 0)
  559.     {
  560.         /* Keep non-zero value before mmi_frm_profiling_delay_perform() is invoked */
  561.         g_mmi_frm_profiling_delay_start_time[type] = 1; 
  562.     }
  563.     gdi_lcd_freeze(TRUE);
  564. }
  565. /*****************************************************************************
  566.  * FUNCTION
  567.  *  mmi_frm_profiling_delay_perform
  568.  * DESCRIPTION
  569.  *  Start to emulate UI delay effect.
  570.  *
  571.  *  Note: mmi_frm_profiling_start_delay_timer() should be used first.
  572.  * PARAMETERS
  573.  *  type        [IN]        Type of event
  574.  * RETURNS
  575.  *  Expected delay time in ticks
  576.  *****************************************************************************/
  577. void mmi_frm_profiling_delay_perform(mmi_frm_profiling_delay_enum type)
  578. {
  579.     /*----------------------------------------------------------------*/
  580.     /* Local Variables                                                */
  581.     /*----------------------------------------------------------------*/
  582.     profiling_tick_t curr_tick, start_tick, delay_tick, offset_tick;
  583.     
  584.     /*----------------------------------------------------------------*/
  585.     /* Code Body                                                      */
  586.     /*----------------------------------------------------------------*/
  587.     MMI_ASSERT(type < MMI_FRM_PROFILING_DELAY_MAX_TYPE);
  588.     offset_tick = g_mmi_frm_profiling_delay_tick[MMI_FRM_PROFILING_DELAY_OFFSET];
  589.     delay_tick = g_mmi_frm_profiling_delay_tick[type];
  590.     start_tick = g_mmi_frm_profiling_delay_start_time[type];
  591.     if (!delay_tick || !start_tick)
  592.     {
  593.         return;
  594.     }
  595.     if (offset_tick > delay_tick)
  596.     {
  597.         delay_tick = 0;
  598.     }
  599.     else
  600.     {
  601.         delay_tick -= offset_tick;
  602.     }
  603.     curr_tick = mmi_frm_profiling_get_time();
  604.         
  605.     if (curr_tick > start_tick && /* timer not overflow (it's 32-bit variable) */
  606.         (curr_tick - start_tick) < delay_tick)
  607.     {
  608.     #ifdef MMI_ON_WIN32
  609.         Sleep(delay_tick - (curr_tick - start_tick));
  610.     #else
  611.         kal_sleep_task(delay_tick - (curr_tick - start_tick));
  612.     #endif
  613.     }
  614.     
  615.     gdi_lcd_freeze(FALSE);
  616.     gdi_lcd_repaint_all();
  617.     g_mmi_frm_profiling_delay_start_time[type] = 0;
  618. }
  619. #endif /* __MMI_INTERACTIVE_PROFILNG__ */