下面为描述上的方便,我们将Hello World称为一个模块。首先建立新的模块目录,之后把模块相关文件都放到这个目录下统一进行管理,新的模块一般放到plutommi/MMI下面,这里我们新建一个目录“HelloWorld”,然后在模块目录“HelloWorld”下再建三个子目录:“Inc”、“Src”和“Res”,分别用来存放模块的头文件、源文件和资源文件,目录结构如下图所示:
接着我们在Inc下创建几个头文件:HelloWorldGprot.h,HelloWorldProt.h, HelloWorldTypes.h, HelloWorldDefs.h, 再在Src下创建一个源文件:HelloWorld.c,关于文件名和函数名等的命名标准每个公司及个人各有不同,统一就好,否则在进行大的项目开发时彼此协同会遇到问题,有时候弄不好光这些问题就能折腾你半天甚至数日或数月,呵呵。
上面几个文件的作用我大致讲下:
HelloWorldGprot.h 模块对外接口,供模块外部调用的函数原型在此申明,模块内部接口就不要放这里了
HelloWorldProt.h 模块内部接口,供模块内部调用的函数原型在此申明
HelloWorldTypes.h 本模块用到的一些常量、自定义数据类型、结构的定义
HelloWorldDefs.h 本模块用到的资源ID定义
HelloWorld.c 模块功能函数的实现部分
头文件HelloWorldGprot.h的内容大致如下:
#ifndef __HELLOWORLD_GPROT_H__
#define __HELLOWORLD_GPROT_H__
#include "PixtelDataTypes.h"
#include "HelloWorldTypes.h"
extern void mmi_HelloWorld_entry(void);
#endif /* __HELLOWORLD_GPROT_H__ */
头文件HelloWorldProt.h的内容的大致如下:
#ifndef __HELLOWORLD_PROT_H__
#define __HELLOWORLD_PROT_H__
#include "HelloWorldGprot.h"
extern void mmi_HelloWorld_entry(void); /* 本模块主界面入口例程 */
extern void mmi_HelloWorld_exit(void); /* 本模块主界面退出例程 */
#endif /* __HELLOWORLD_PROT_H__ */
其他几个文件的内容因模块功能而异,这里先略过,后面再讲。
紧接着,我们要修改的相关系统文件,使这个模块成为整个项目的一部分,需要修改的系统文件如下:
make/plutommi/mmi_app/mmi_app.inc 所有mmi部分的头文件所在目录的相对路径列表
make/plutommi/mmi_app/mmi_app.pth 所有mmi部分的源文件所在目录的相对路径列表
make/plutommi/mmi_app/mmi_app.lis 所有mmi部分的源文件(相对路径)列表
在上述3个文件里面分别加上我们模块的对应内容,就现在讲的HelloWorld而言,所加内容如下:
make/plutommi/mmi_app/mmi_app.inc文件追加一行“plutommi/mmi/HelloWorld/Inc”
make/plutommi/mmi_app/mmi_app.pth文件追加一行“plutommi/mmi/HelloWorld/Src”
make/plutommi/mmi_app/mmi_app.lis文件追加一行“plutommi/mmi/HelloWorld/Src/HelloWorld.c”
再接着,我们需要增加一个开关,以决定这个模块是否成为最终发布版本的一部分,这实际上是一个编译开关,需要修改系统文件及相关的模块源文件,需要修改的系统文件包括:
plutommi/Customer/CustResource/PLUTO_MMI/MMI_featuresPLUTO.h,这里我们用 名字为“__MMI_HELLOWORLD_ENABLED__”这个开关好了,在这个文件里面追加一行:
#define __MMI_HELLOWORLD_ENABLED__,同时在相关源文件里面用:
#ifdef __MMI_HELLOWORLD_ENABLED__
#endif
来框住相关代码行就OK了,当不打算将这个模块发布的时候,注释掉“#define __MMI_HELLOWORLD_ENABLED__”这一句重新make一次就好了。
下面讲具体实现的部分,为了简化描述,我们暂时先将我们的模块入口挂接到主菜单入口处(后面讲到资源的部分可将入口移到某个新建的子菜单下),修改下文件“plutommi/mmi/mainmenu/mainmenusrc/MainMenu.c”中的goto_main_menu函数,如下所示红色字体部分:
void goto_main_menu(void)
{
#ifdef __MMI_HELLOWORLD_ENABLED__
mmi_HelloWorld_entry();
return;
#else
… // 此处为之前goto_main_menu的代码
#endif
}
同时我们需要在文件MainMenu.c中包含头文件HelloWorldGprot.h,所以再在这个文件的头文件包含代码块(通常是文件的顶部区域)追加这一句:#include "HelloWorldGprot.h"。
下面是HelloWorld.c的内容:
#include "stdC.h"
#include "MMI_Features.h"
#include "L4Dr.h"
#include "L4Dr1.h"
#include "AllAppGprot.h"
#include "FrameworkStruct.h"
#include "GlobalConstants.h"
#include "EventsGprot.h"
#include "mmiappfnptrs.h"
#include "HistoryGprot.h"
#include "HelloWorldProt.h"
#include "HelloWorldTypes.h"
#include "HelloWorldDefs.h"
#include "MainMenuDef.h"
#include "wgui_categories.h"
#include "Unicodexdcl.h"
/* 模块入口 */
void mmi_HelloWorld_entry(void)
{
#ifdef __MMI_HELLOWORLD_ENABLED__
EntryNewScreen(MAIN_MENU_SCREENID, mmi_HelloWorld_exit, NULL, NULL);
entry_full_screen();
clear_screen();
gui_move_text_cursor(50, 100);
gui_set_text_color(UI_COLOR_RED);
gui_print_text(L"Hello, World");
gui_BLT_double_buffer(0, 0, UI_device_width - 1, UI_device_height - 1);
SetKeyHandler(GoBackHistory, KEY_RSK, KEY_EVENT_UP);
#endif
}
void mmi_HelloWorld_exit(void)
{
#ifdef __MMI_HELLOWORLD_ENABLED__
history currHistory;
S16 nHistory = 0;
currHistory.scrnID = MAIN_MENU_SCREENID;
currHistory.entryFuncPtr = mmi_HelloWorld_entry;
pfnUnicodeStrcpy( (S8*)currHistory.inputBuffer, (S8*)&nHistory);
AddHistory(currHistory);
#endif
}
编码的部分基本上就是这些了。
修改Makefile文件:
用UE打开/plutommi/Customer/ResGenerator/Makefile文件,
在PLUTO_INC =这一项里面追加一行 -I "../../MMI/HelloWorld/Inc"
/注意,以便编译系统能顺利找到我们定义资源ID的头文件"HelloWorldDefs.h"
追加新行的时候别忘了在上一行尾部添上续行符号“/
”,表示不换行,最后一行千万不要加
使用VC编译并测试模拟器,需将新工程的头文件添加引用了新工程的相应工程模块的ini
文件
打开工程/MoDIS/mmi_app/mmi_app.ini添加头文件路径/I "../../plutommi/mmi/
HelloWorld/Inc"
打开打开工程/MoDIS/mmi_framework/mmi_framework.ini添加头文件路径/I "../../
plutommi/mmi/HelloWorld/Inc"
修改模拟器/MoDIS/mmi_app/ mmi_app.dsp添加c文件路径
# Begin Source File
SOURCE=../../plutommi/mmi/HelloWorld/Src/HelloWorld.c
# End Source File
make m600base_a gprs update//编译资源及代码
注:
模拟器和真机共用同一套资源,所以需要使用make命令先编辑资源make SUPERMM_GEMINI
gprs resgen
编译模拟器make m600base_a gprs new
编译出错可根据build/m600base_a 下的log文件查看
常用的make命令
修改应用程序文件后需要make 工程 gprs/gsm update
修改资源文件后需要 make 工程 gprs/gsm resgen
中断后继续执行 make 工程 gprs/gsm r
中断后继续执行某个模块 make 工程 gprs/gsm r mmi_app(模块名)