配色: 字号:
MTK添加新的APP的总流程
2012-08-06 | 阅:  转:  |  分享 
  
MTK添加新的APP的总流程

添加程序文件

在plutommi\mmi\下建立MyAppInc(放头文件.h)MyAppRes(资源文件)MyAppSrc(源文件.c)。

1.在Inc下添加

MyAppGprot.h对外接口,外部调用函数原型声明于此。

MyAppProt.h内部接口,内部调用函数原型声明于此。

MyAppDefs.h 定义资源ID。

MyAppTypes.h 定义常量,自定义数据等。

2.在Src下添加

MyAppSrc.c 实现功能的函数。

在VC6.0下的FileView下的mmi_appfiles下addfiletoproject。

将文件加入整个项目。

make\plutommi\mmi_app\mmi_app.inc加一行/I"..\..\plutommi\mmi\MyApp\MyAppInc"

make\plutommi\mmi_app\mmi_app.lis加一行

/I"..\..\plutommi\mmi\MyApp\MyAppSrc\MyAppSrc.c

make\plutommi\mmi_app\mmi_app.pth加一行/I"..\..\plutommi\mmi\MyApp\MyAppSrc

四、程序开关部分

1、在plutommi\mmi\Inc\MMI_features_switch.h末尾添加

#defineCFG_MMI_MYAPP(__ON__)

2、在plutommi\Customer\CustResource\PLUTO_MMI\MMI_features_switchPLUTO.h末尾添加#defineCFG_MMI_MYAPP(__ON__)

3、在plutommi\Customer\CustResource\TELSDA25_08A_GEMINI_MMI\MMI_features_switchTELDA25_08A_GEMINI.h末尾添加

#defineCFG_MMI_MYAPP(__ON__)

其中,TELSDA25_08A_GEMINI_MMI为MTK源码的工程名

4、在MTK\plutommi\mmi\Inc\MMI_features.h末尾添加

#ifdefined(CFG_MMI_MYAPP)&&((CFG_MMI_MYAPP==__ON__)||(CFG_MMI_MYAPP==__AUTO__))

#ifndef__MMI_MYAPP__

#define__MMI_MYAPP__

#endif

#endif

模拟器编译环境下添加头文件

F:\sss\MTK\W180A_S_DriveOnly\MoDIS\mmi_app\mmi_app.ini下添加一行

/I"..\..\plutommi\mmi\MyApp\MyAppInc"

可以makexxxxgprsnew了,如果编译成功,模拟器编不过出现错误1083,就查查看看在MoDIS会不会有重复的MyAppSrc.c文件,或者模拟器下编译环境有没有添加头文件。

六、添加一项资源通常分三步:原料,ID,装载。

原料:即原材料,如图像就是准备一副新图,字串就是准备各种语言的Unicode编码。

ID:即资源项的别名,程序只能通过ID来获取资源项(ID一般定义在XXDefs.h中)。

装载:装载在编译目标烧录文件之前就会被执行,其目的有两个:一是将原材料转换成二进制数据,二是生成将ID与二进制数据联系起来的映射表。

资源装载预编译程序是plutommi\Customer\ResGenerator\mtk_resgenerator.exe,这个程序在每次编译目标烧录文件之前临时编译生成的。下面的修改基本上与这个程序有关。

添加文件

在plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI

下面创建一个新文件:plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI\Res_MyApp.c

头文件不要加StdC.h了

定义一个函数voidPopulateMyAppRes(void)

{

}

里面加相关资源就行了。



七、1.修改makefile

在文件plutommi\Customer\ResGenerator\MakeFile添加

-I"../../MMI/MainMenu/MainMenuInc"\

-I"../../MMI/MyApp/MyAppInc"\

2. 修改PopulateRes.c

在文件Plumommi\mmi\Resource\PopulateRes.c里加入(黑体)

/

GlobalFunction-Extern

/

/Populatewithoutcompileoption/

externvoidPopulateMyAppRes(void);



voidPopulateResData(void)

{

/

PopulateResoruce

/

RES_PRINT_INFO("PopulatingMyAppResource\n");

PopulateMyAppRes();

}



八、添加资源ID

相当于一个资源空间,基础ID同一定义在plutommi\MMI\Inc\MMIDataTypes.h

RESOURCE_BASE_ENUM_BEGIN()

………………

RESOURCE_BASE_RANGE(APP_MYAPP, 100),



在最后前加入

/

MyAppApp

/

#defineMYAPP_BASE ((U16)GET_RESOURCE_BASE(APP_MYAPP))

#defineMYAPP_BASE_MAX ((U16GET_RESOURCE_MAX(APP_MYAPP))



RESOURCE_BASE_TABLE_ITEM(APP_MYAPP)



/pleaseaddnewresourcebasetableabovethisline/

/Endofresourcetable/

RESOURCE_BASE_TABLE_END()

九、主屏幕序号定义在MyAppDefs.h中

typedefenum

{

SCR_MYAPP_MAIN=MYAPP_BASE+1,

}SCREENID_LIST_MYAPP;



十、字串ID定义在MyAppDefs.h中

typedefenum

{

STR_MYAPP_HELLO=MYAPP_BASE+1,

}STRINGID_LIST_MYAPP;

十一、字串资源在plutommi\Customer\CustResource\PLUTO_MMI\ref_list.txt中添加一行(注:最好不要在Excel中编辑此文件,因为Excel默认会为每个字串加上双引号)STR_MYAPP_HELLO MyApp 20 Hello,World Hello,World 你好,世界 你好,世界, Hello,World

下面是对表格每一列的描述:

第一列是字串ID,与MyAppDefs.h中定义的要完全一致。

第二列是字串所属的程序名(可任意写,仅供自己参考)。

第三列指本字串的最大长度(取所有语言中文本最长的一个)。

第四列是字串描述,也可任意写。

从第五列起就是各种语言所对应的字串。

字串装载

在函数PopulateMyAppRes(Res_MyApp中)中添加一行:

voidPopulateMyAppRes(void)

{

ADD_APPLICATION_STRING2(STR_MYAPP_HELLO,"Hello,World","MyApp.");

}

读取字串使用函数GetString

voidmmi_myapp_enrty(void)

{

……

gui_print_text((UI_string_type)GetString(STR_MYAPP_HELLO));

……

}



十二、菜单资源

设在[MainMenu]([Organizer]([Hello,World]。

菜单项ID的头文件全部在plutommi\MMI\Inc\GlobalMenuItems.h中:

EnumGLOBALMENUITEMSID

{

IDLE_SCREEN_MENU_ID=1,

……

MENU_ID_MYAPP_HELLO,

MENU_ID_DEVAPP_START,

MENU_ID_DEVAPP_END=MENU_ID_DEVAPP_START+100,

MAX_MENU_ITEMS_VALUE,

MENU_ITEM_END

};

菜单加载

全部在\plutommi\Customer\CustResource\PLUTO_MMI\Res_MMI\Res_MainMenu.c中

/

//Organizer

#ifdefined(__MMI_VERSION_2__)

typedefenum

{

#ifdef__MMI_MYAPP__

MENU_ENUM_MYAPP_HELLO,

#endif

ORG_ENUM_TOTAL

}OrganizerMenu;



/oganizer/

ADD_APPLICATION_MENUITEM((MAIN_MENU_ORGANIZER_MENUID,IDLE_SCREEN_MENU_ID,ORG_ENUM_TOTAL,

#ifdefined(__MMI_CALENDAR__)

ORGANIZER_CALENDER_MENU,

#endif

#ifdefined(__MMI_TODOLIST__)

ORGANIZER_TODOLIST_MENU,

#endif

ORGANIZER_ALARM_MENU,



#ifdefined(__MMI_WORLD_CLOCK__)

ORGANIZER_WORLDCLOCK_MENU,

#endif

#ifdef__MMI_NOTE_APP__

MENU_ID_NOTE_APP_MAIN,

#endif

#ifdef__MMI_MESSAGES_CLUB__

EXTRA_SHORTCUTS_MENUID,

#endif

#ifdef__MMI_UDX_SUPPORT__

MENU_ID_UDX_MAIN_MENU,

#endif

#ifdef__SYNCML_SUPPORT__

MENU_ID_SYNCML_MAIN,

#endif



#ifdef__MMI_SYNCML_DEVICE_SYNC__

MENU_ID_SYNCML_DEV_MAIN,

#endif



#ifdef__MMI_MYAPP__

MENU_ID_MYAPP_HELLO,

#endif



SHOW,MOVEABLEWITHINPARENT|INSERTABLE,DISP_LIST,

MAIN_MENU_ORGANIZER_TEXT,MAIN_MENU_ORGANIZER_ICON));



通过上面三步我们已经将新的菜单项成功插入到工具箱菜单,也就是说我们解决了菜单几个元素中的“父菜单项”的问题,接着我们来看看其他几项元素。这里我们介绍下ADD_APPLICATION_MENUITEM这个宏,刚才往工具箱菜单插入我们的菜单项时已经接触到这个宏了,生成菜单资源用的就是这个宏,接着我们就会用到。这个宏的参数个数是可变的,其参数具体含义如下:

参数1:菜单项本身的ID,就我们的例子而言是MENU_ID_MYAPP_HELLO

参数2:菜单项的父菜单ID,这里是MAIN_MENU_ORGANIZER_MENUID

参数3:本菜单子菜单个数,假定为N好了,这个参数之后是变参部分,随后的N个参数为各个子菜单的ID

参数4+N:菜单是否显示,一般为SHOW

参数5+N:菜单其他属性,可以是这些值的组合:NONMOVEABLE,MOVEABLEWITHOARENT,MOVEABLECROSSPARENT,INSERTABLE,SHORTCUTABLE,一般我们就用SHORTCUTABLE就好了。

参数6+N:下级菜单的显示风格,以下风格任选其一就好:

DISP_LIST—列表显示,常见风格

DISP_MATRIX—矩阵显示,如九格宫、十二格宫,主菜单一般用这种风格

DISP_CIRCULAR_3D—循环3D显示,只有主菜单用到

DISP_PAGE—翻页格式,每个菜单项一页,一般也是主菜单才会用到

DISP_FIXED_GRID—很少用到,可忽略

参数7+N:菜单项显示文本对应的字串资源ID

参数8+N:菜单项对应的小图标的资源ID

加载MENU_ID_MYAPP_HELLO本身:

voidPopulateMyAppRes(void)

{

ADD_APPLICATION_MENUITEM((MENU_ID_MYAPP_HELLO,MAIN_MENU_ORGANIZER_MENUID,0,SHOW,SHORTCUTABLE,DISP_LIST,STR_MYAPP_HELLO,IMG_MYAPP_HELLO));

}

修改MyAppSrc.c

实际上就是给菜单项设定一个响应动作,使之转到我们模块的入口,设置菜单项响应动作的函数是SetHiliteHandler,设置的动作只需要在系统上电后初始化的部分执行一次就可以了,这里我们为模块新增一个函数,这个函数专门处理我们模块上电初始化的部分,如下红色字体所示我们在MyAppSrc.c中增加一下部分:

voidmmi_myapp_hilite_hello(void)

{

SetLeftSoftkeyFunction(mmi_myapp_entry,KEY_EVENT_UP);

}



voidmmi_myapp_init(void)

{

SetHiliteHandler(MENU_ID_MYAPP_HELLO,mmi_myapp_hilite_hello);

}

这实际上要用两个函数,由这两个函数共同完成菜单点击通知的接收和转入我们模块主入口的动作。

声明这两个函数

修改MyAppProt.h

externvoidmmi_myapp_hilite_hello(void);

修改MyAppGprot.h

externvoidmmi_myapp_inti(void);



mmi_myapp_init这个函数是一个外部接口,我们把申明放到MyAppGprot.h中;mmi_MyApp_hilite_hello这个函数是内部接口,我们把申明放到MyAppProt.h中。然后我们把mmi_Myapp_init放入到函数InitAllApplications中调用已完成我们模块的初始化设定.

修改文件“plutommi\mmi\Framework\Tasks\TasksSrc\MMITask.c”

……

#ifdef__MMI_MYAPP__

#include"MyAppGprot.h"

#endif

……

voidInitAllApplications(void)

{

……

#ifdef__MMI_MYAPP__

#include"MyAppGprot.h"

#endif……

}

修改此文件编译时需在make文件夹Framework的编译地址后面加上MyApp文件的地址(如同修改mmi_app一样)。

模拟器的Framework.ini同样需要加上编译路径。

十三、图像资源

图像ID

先在MyAppDefs.h中添加字串ID:

Typedefenum

{

IMG_MYAPP_HELLO=MYAPP_BASE+1,

}IMAGEID_LIST_MYAPP;

新加目录\plutommi\Customer\Images\PLUTO320X480\MainLCD\新加入一个MyApp

在MyApp加入一副图片SB_MYAPP.bmp

装载图片

VoidPopulateMyAppRes(void)

{

……

ADD_APPLICATION_IMAGE2(IMG_MYAPP_HELLO,CUST_IMG_PATH"\\\\MainLCD\\\\MyApp\\\\SB_MyApp.bmp","HelloWorld!");

……

}

将图片作为菜单ICON

只需要将菜单项的最后一个参数修改就行

voidPopulateMyAppRes(void)

{

ADD_APPLICATION_MENUITEM((MENU_ID_MYAPP_HELLO,MAIN_MENU_ORGANIZER_MENUID,0,SHOW,SHORTCUTABLE,DISP_LIST,STR_MYAPP_HELLO,IMG_MYAPP_HELLO));

}

MakeW....Gprsremake一般就行。

献花(0)
+1
(本文系小云蔡首藏)