Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40785
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 200
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-05 10:27
文章分类
文章存档

2011年(1)

2009年(1)

2008年(16)

我的朋友

分类:

2008-10-06 09:29:51

Source code study

Splash state and maintop state

概述:

         DPF在跑起來時先會去偵測SD卡,如果SD卡裏面包含有update用的firmware romdata,則按下up/down/enter會進入burn flash操作;按menu會進入開機畫面,然後slide show,直到userkey down的動作。詳細如下圖所示。

 

各個state之間的切換通過smtkStateMgrChangeState這個function實現,下面主要介紹splashmaintop这兩個state

 

一、       State_Splash

Splash state的工作是為了顯示出logo,還有一些閃爍的特效。需要顯示的圖片有:

splash_light.bmp              

該圖片要轉換成splash_light.bin,特效包括:Light Tiny, Light Small, Light Medium, Light, Light Large, Light Medium, Light Small, Light Tiny, Light Line, Light Line, Light Line.

 

logo.jpg            

 

 

我們可以更換這些圖片,但是圖片的名字不能改,並且splash_light圖片的格式和大小都要參照icon_list的設定。

 

Splash state包括三個主要的函數:InitializeProTerminate還有一個Proc的實現函數DrawSplash

1.  Initialize

SplashInitialize要完成幾件事:創建logo surfacelight tiny surfacelight small surface, light medium surface, light large surface, and light line surface. Logo surfaceresourcelogo.jpg or logo.dat,主要看是否有define dynamic loadingLight tiny surfaceresourcesplash_light.bin,而light small/medium/large/line surface都是透過mmpM2dStretchSrcCopy函數copy light tiny surface而來的。下圖是程式流程圖。

 

2.  Proc

SplashProc接收到Keypad Event時不做動作,黨接收到TIMER Event時,主要完成幾件事:Draw SplashChange State,轉到SMTK_STATE_CLIENTUSB_CLIENT)或SMTK_STATE_SLIDE_SHOWif have File)或SMTK_STATE_CALENDAR。程式流程圖如下。

 

 

3.  Terminate

SplashTerminate主要是deleteInitialize申請的資源,按最先申請的最後釋放的原則,delete splash bitmap的順序是:lightXSurflightLSurflightMSurflightSSurflightTSurflogoSurfCall mmpM2dDeleteSurface這個function來實現。

 

4.  DrawSplash

Draw splash30次動畫來show,最初的6次用於show S logoS logo通過mmpM2dSetClipRectRegion函數剪切來分6showshow的順序如下圖。

showlogo后,根據g_animCountshow light的動畫,主要是call mmpM2dAlphaBlend這個函數。具體流程圖如下。

 

g_animCount的取值如下。

G1: SPLASH_ANIM_COUNT-7, SPLASH_ANIM_COUNT-13

G2: SPLASH_ANIM_COUNT-8, SPLASH_ANIM_COUNT-12

G3: SPLASH_ANIM_COUNT-9, SPLASH_ANIM_COUNT-11

G4: SPLASH_ANIM_COUNT-10

G5: SPLASH_ANIM_COUNT-14, SPLASH_ANIM_COUNT-15, SPLASH_ANIM_COUNT-16

 

二、       State_Maintop

在一般state下,按下menu key,會進入到maintop state,其主要工作是切換到各個substateState_Calendar, State_Card_Select, State_Photo, State_System_Setting, State_Audio, State_Video

Maintop.jpg

 

DrawIcon函數中,會將这張圖分成6bitmap show出來。

 

首先看看一些比較重要的結構体和變數:

(1)       static MMP_UINT ss[11] = {8, 16, 24, 32, 39, 43, 46, 48, 49, 50, 50} ;

//該數組保存的是向左/右移的距離。

(2)       SMTK_MAINTOP_TAG結構体,通過parentchild構成一個雙向的鏈表

typedef struct SMTK_MAINTOP_TAG

{

    struct SMTK_MAINTOP_TAG*    parent;              //當前Icon的上一個Icon

    struct SMTK_MAINTOP_TAG*    child;                  //當前Icon的下一個Icon

    MMP_BOOL                  visible;               //當前Icon的可視性,即隱藏還是顯示

         MMP_INT                                              posIndex;          //要左移或右移的間隔ss數組的Index

         MMP_UINT                  index;                 //當前Icon在該鏈表中的Index

} SMTK_MAINTOP;

(3)       SMTK_MAINTOP_MGR_TAG

 typedef struct SMTK_MAINTOP_MGR_TAG

{

         MMP_INT                                    actionCount;   

         MMP_UINT                                  currentIndex;  //當前的Icon Index

         SMTK_MAINTOP*                      headG;              //指向Icon鏈表的頭一個結點

         MMP_BOOL                      toLeft;               //true時向左移,false向右移

         MMP_BOOL                      toMove;            //是否移動

         MMP_SURFACE                          surf;                    //Iconsurface

         MMP_SURFACE                          tmpSurf;            //臨時的surface

         SMTK_MAINTOP_PARAM*  param;              //存儲stateMgr.info,記錄state index

 

} SMTK_MAINTOP_MGR;

 

 

下面是一些主要的function介紹。

 

1.  Initialize

MaintopInitialize主要是為stateSurf分配空間,並call smtkMainTopMgrInitialize這個function來初始化maintopMgr結構体。

 

2.  Proc

MaintopProc主要是處理TIMER EventKEY_DOWN Event:當接收到TIMER Event時,會去call Process_MainTop函數來做相應處理,並call smtkGuiMgrFlip來顯示出來;當接收到KEY_DOWN Event時,會去call Keydown_MainTop來做相應的處理。詳細請參考Process_MainTopKeydown_MainTop这兩個function

 

3.  Terminate

釋放掉在Initialize中分配的空間,要callsmtkMainTopMgrTerminate這個function來釋放maintopMgr結構体。

 

4.  smtkMainTopMgrInitialize

function主要是初始化maintop manager。分以下幾個步驟:aCreate null surface for maintopMgr.tmpSurf and maintopMgr.SurfbCall transparentCorner function to initialize corner transparentc、建立maintop的循環雙向鏈表,用於切換各個substated、初始化maintopMgr的其他成員變數。

 

5.  Process_MainTop

main menubackground,將image loadstatesurf中,並調整其伸縮度到適當。程式流程圖如下。

其中smtkMainTopMgrDraw這個函數是draw menu iconbackground,要calldrawBackgroundDrawIcon兩個函數;mmpM2dStretchSrcCopy函數,transfer a block of image from the source rectangle to the destination rectangle,並調整destinationstretch and shrink尺寸。

 

6.  Keydown_MainTop

Keydown event的實現函數,只接收key_upkey_downkey_enter。主流程圖如下。

 

阅读(748) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:GPIO KEY修改步驟

给主人留下些什么吧!~~