nullMMI软件开发平台MMI软件开发平台Date:3/3/2005 Created by:Phoebe Chen
Figo Feng
Lin LinContentsContents平台介绍和
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
安排
Kenel接口
GUI接口
开发和调试实例平台介绍和计划平台介绍和计划 Spreadtrum提供了一套基于类似 mini widows机制的MMI开发平台,并且提供了与网络相关部分的MMI源码。同时我们也提供了MMI开发的配套工具软件包。客户可以基于此方便的做二次开发。现已有多款手机使用此平台进行开发。平台结构平台结构SOFTWARE APPLICATION PLATFORMRTOSDiagnostics
Drivers(HAL)
MN (Call,CB,NV,SS,SMS,GPRS)Layer 3Layer 1Layer 2TCP/UDPIP/PPPRTP/RTCPMultimedia Applications
Audio/Video/Test
Call
SMS
CBS
SS
PB
Game
….
MMI WAPMMS/WEBE-MailSIPH.324/MPTTATCMIDI
MP3
MPEG4
H.263
EnginesJ2MEJava AppDAL(LCD,KPD,CHR)
AUDIO, VIDEOOSA
EFSMMI Platform一个MMI示例一个MMI示例简述MMI开发平台的三个重要概念简述MMI开发平台的三个重要概念Application :描述了MMI Kernel中处理PS消息非常重要的模块,
例如sms, cc…..
WINDOW:窗口,用于处理focus消息(在此窗口下面才需要处理
的消息)…
Control:控件,也就是窗口要用到的公共的特性,比如编辑特性、
Text显示特性、动画特性等等…Application、Window和Control的关系 Application、Window和Control的关系 APPLICATIONWINDOWCONTROLCONTROLCONTROL2.Kernel接口2.Kernel接口MMI Kernel主要提供完善的消息驱动
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
和窗口管理
机制。
为各种上层应用(CC、SMS、WAP、MMS等)提供
良好的支持。 Kernel提供的功能Kernel提供的功能1.对消息流程进行管理
外部消息
主要包括PS消息、key消息、Timer消息和一些由其它模块发送过来的消息;
内部消息
MMI模块内部发送、接收和处理的消息,不与其它模块发生任何关系.(现在我们用到的就是focus消息,由窗口处理,这类消息使用最多最频繁)
2.提供窗口管理机制
了解Kernel对窗口的管理机制:
通过维护一个全局变量:是MMI Kernel中一个非常核心的数据结构,它是整个窗口调度过程的核心,这个数据结构由MMI Kernel维护。Application的概念Application的概念Application:描述了MMI Kernel中非常重要的应用处理模块。
可以分为两类:
需要注册系统消息的(SMS Application, Call Application, Stk Application…)
不需要注册系统消息的(DC, Multimedia)
注册消息APPLICATION举例注册消息APPLICATION举例系统消息由Application处理。如果需要系统消息,Application在初始化时要注册需处理的消息。Kernel只会根据注册的Application来分发。
一个PS消息可以被多个Application注册,Kernel会依次分发消息给各个Application。
我们现在需要注册消息的应用:
g_main_app
g_cc_app
g_sms_app
g_mmiphone_app
g_stk_app
…….
静态的,全局,一般在初始化时建立。Window的概念Window的概念Window:窗口是最终用户可以直接看到的一个个实在的屏幕,是直接和用户打交道的,专门处理用户的按键输入等操作,并且将最终用户输入后的处理结果显示在屏幕上。
窗口的消息处理函数,用来处理最终用户的直接输入。
窗口还要管理其所属的控件,将部分消息交给控件处理。
Control的概念Control的概念Control:控件,也就是窗口要用到的公共的特性,比如编辑特性、Text显示特性、动画特性等等。
使用控件可以使开发人员专注于应用的功能开发,而不是过多限制在界面的开发。 Kernel中的窗口管理Kernel中的窗口管理窗口管理是MMI Kernel中非常重要的部分,直接决定了上层应用的开发。
窗口管理主要包括应用窗口和控件之间的管理和通信、各个窗口间稳定的切换。
应用窗口负责上层的应用和显示等。 Kernel中的窗口管理, 举例Kernel中的窗口管理, 举例建立窗口的一些常量的属性:建立窗口wintab:
WINDOW_TABLE( MMISMS_EDIT_WIN_TAB ) =
{
CLEAR_LCD, //清屏
WIN_PRIO( WIN_ONE_LEVEL ), //窗口优先级
WIN_TITLE_ID( TXT_SMS_WRITE ), /固定的title
WIN_FUNC((uint32) HandleEditWinMsg ), //窗口消息处理函数
WIN_ID( MMISMS_EDIT_WIN_ID ), //ID
CREATE_TEXTEDITBOX_CTRL(
MMISMS_FULLSCREEN_CLIENT_LEFT,
MMISMS_FULLSCREEN_CLIENT_TOP,
MMISMS_FULLSCREEN_CLIENT_RIGHT,
MMI_INPUT_EDITBOX_BOTTOM,
MMISMS_MAX_UCS2_MESSAGE_LEN, MMISMS_MAX_MESSAGE_LEN, T9_PINYIN | T9_STROKE | T9_ENGLISH | T9_CHARACTER | T9_DIGITAL, T9_PINYIN_MODE, MMISMS_EDITWIN_EDITCTRL_ID), //控件
END_WIN
};
详细的讲解请见后面应用实例窗口Priority 窗口Priority 设置窗口优先级的目的是为了保护那些重要的窗口在处于Focus状态下不被打断,比如Call窗口,在Call的过程中不应该出现被SMS或者Alarm窗口打断,否则会影响Call的过程。
我们在这里暂时制定了4个优先级: WIN_LOWEST_LEVEL ,WIN_ONE_LEVEL,WIN_TWO_LEVEL,WIN_THREE_LEVEL。
我们提供了操作窗口优先级的两个函数:GetWinPriority, SetWinPriority。用户可以根据应用来调用这两个操作窗口优先级的函数。在窗口的初始化(针对静态常口)和创建(针对动态窗口)过程中,需要对窗口优先级进行设置。 窗口Priority (续)窗口Priority (续)虚拟窗口虚拟窗口虚拟窗口主要是指那种已经打开了但是无法得到Focus的应用窗口。比如在打电话的过程中来了一条短信,因为Call的窗口的等级比较高,这个时候来短信的窗口无法得到Focus,也无法显示出来。
当前应用窗口结束后,系统会优先使虚拟窗口链
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中的应用窗口得到Focus。
等级越高的应用窗口越先打开,当应用窗口处于同一等级时,按照先进先出方式(后打开的得到Focus )打开应用窗口。 Kernel中的消息机制Kernel中的消息机制消息分类 消息分类 从消息的接收情况,分为
外部消息
主要包括PS消息、key消息、Timer消息和一些由其它模块发送过来的消息;
内部消息,
MMI模块内部发送、接收和处理的消息,不与其它模块发生任何关系.
在App_Task的消息循环当中总是处理完内部消息之后再处理外部消息。
消息分类(续)消息分类(续)根据不同的消息发送和处理流程来划分,消息分为4个类别:
第一类消息为系统消息(主要为PS消息和其它一些System消息),只有App在注册后才能够处理这条消息,对于没有注册的系统消息,将交给默认的MainApp处理。一条系统消息可以被多个App注册和处理。
第二类为Focus消息,系统直接将这种类型的消息直接发送给处于Focus状态的APP,由APP对消息进行处理。
第三类广播消息,将根据Application的链表,调用每一个的消息处理过程,这属于每一个App都要处理的过程,每个App只处理自己感兴趣的消息,至于App的处理方式(是交给Window处理还是App本身处理),系统没有任何限制。(这个暂时没有用过)
第四类定时器消息,由于定时器使用的比较广泛,而且无法将其归为系统消息或Focus消息,为了更好的处理,将其单独的作为一类消息处理。 外部消息处理外部消息处理外部消息由Application来处理;
外部消息需要Application事先在mmk_regapp.def中定义应用所关心的消息;
外部消息队列由嵌入式操作系统维护;
内部消息处理内部消息处理内部消息不需要应用模块进行注册;
内部消息由Window,Control处理;
内部消息队列由Kernel模块维护;
内部消息定义在mmk_msg.h中;null消息处理流程MMI KERNELQueue(external)ControlWINDOWAPPLICATION窗口通信窗口通信 一般的窗口(包括应用窗口和控件)都需要彼此之间能够传送消息,比如应用窗口需要将消息传给控件(一个刷新的消息)或者一个控件需要另一个控件处理消息等,这些都会涉及到窗口间的通信,一般有两种通信方式:
异步通信方式,用MMK_PostMsg()函数来实现。
异步通信方式主要将消息发送到内部消息队列中,即当发送消息的窗口返回后,这条消息才会被处理。因为这是一种Focus消息,所以接收的窗口必须是应用窗口,只有应用窗口才可以得到Focus。
同步通信方式,用MMK_SendMsg()函数来实现。 3 GUI接口3 GUI接口GUI 模块的主要功能就是给应用开发提供最基本的图形控件接口,并跟窗口系统、消息机制结合,处理基本的人机操作。 Control的基本属性Control的基本属性图形化,和用户交互
可以Active
可接受消息,有消息处理函数
依赖于窗口存在
每个具体的control有唯一ID控件的使用控件的使用有2种形式
1. 在wintable中加入一个控件
2. 动态创建
控件的使用--wintable控件的使用--wintableCREATE_MENU_CTRL
CREATE_LISTBOX_CTRL
CREATE_TEXTEDITBOX_CTRL
CREATE_ANIMATION
……….控件的使用—动态创建控件的使用—动态创建创建控件: GUIANIMATE_Init()
将该控件加入到window中 MMK_CreateDynaCtrl()
设定控件的参数:GUIANIMATE_SetParam
GUI提供的控件GUI提供的控件Menu控件:菜单控件
EditBox控件:编辑框控件
ListBox控件:列表框控件
TextBox控件:文本框控件
Animate控件:图形控件
MessageBox控件:消息框控件
ProgressBox控件:进度条控件
Punctuation控件:标点符号控件
SoftKey控件:软键盘控件
Calendar控件:日历控件
字库:字体
LCD:显示屏
T9:输入法Menu控件介绍Menu控件介绍树状结构,显示多级菜单
实现菜单项的设定,显示,上下左右按键选择,选中后自动进入下级子菜单,或者执行相应的操作
菜单项文字过长滚动显示
分为两类:静态菜单,动态菜单
目前已实现的风格:文字菜单,旋转图,九宫格添加静态菜单添加静态菜单1.添加menu id (mmi_menutable.h)
2.添加menu and menu item (mmi_menutable.c)
3.将新增加的menu加入menutable中(mmi_menutable.def)
4.为菜单项写处理函数
添加动态菜单添加动态菜单1. 调用GUIMENU_InsertNodeEditBox控件EditBox控件能正确编辑、录入数字号码、密码、字母及文字
包括标题、软键盘;日期、时间、秒表、密码、数字号码、字母、非ascii码文字等正文的各种特殊显示
显示编辑中的光标
显示编辑中候选字的显示;
自动分页
支持滚动条
支持的输入法:T9ListBox控件ListBox控件分为三类:单选,多选,文字
支持上下滚动,连续滚动
支持数据分批载入
在标题上显示当前项和总项数(例如 2/200)
动态添加,删除,更改TextBox控件TextBox控件显示一段文本
包括标题、软键盘;文本内容
文本内容超过屏幕大小自动换行
支持滚动条
响应向上键向上卷动或翻页
响应向下键向下卷动或翻页 Animate控件Animate控件显示图形、图象、动画。
bmp, icon图像以及jpg, gif等流行的图像
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
示,自定义动画以及gif等流行的动画格式的显示。MessageBox控件MessageBox控件显示弹出框
支持图片,动画,文字,softkey,背景色的设定
支持多种显示风格Punctuation控件Punctuation控件显示当前支持的所有标点符号
和编辑框配合使用,将选中的标点符号插入到文本中Calendar控件Calendar控件显示日历
一页显示一个月的内容,12个月份有不同的背景图片,年月,周日~周六,日期,当前日与其他日有不一样的颜色
响应上键向前移一月,响应下键向后移一月,响应左键向前移一天,响应右键向后移一天。 其他控件其他控件SoftKey控件:
可设定文字,背景,icon
ProgressBox控件
显示当前进度
可设定最大值,最小值,当前值
Label控件
显示一行文字,过长则滚动显示
可动态更改显示区域,文字GUI_LCDGUI_LCD直接在屏幕上画线,显示图片
对底层lcd驱动进行包装
LCD_DrawHLine, LCD_DrawVLine, LCD_DrawRect, LCD_FillRect, LCD_DisplayCompressedBmp, LCD_DrawLine….GUI_FontGUI_Font直接在屏幕上显示字符串
获得字体的高度,宽度
GUI_GetFontWidth,GUI_GetFontHeight,LCD_DisplayStringInRect,LCD_DisplayString…..Control风格Control风格每一类control和window的缺省显示风格定义在文件mmi_theme.c/h中
用户可自定义各种不同的字体,背景色,前景色
mmidisplay_data.c/hGUI接口的参考GUI接口的参考详情参考GUI接口说明
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
及其相关头文件。null应用实例:(以SMS应用为例)开发实例一、Application的创建
开发实例二、利用Window Table设计窗口
开发实例三、更改图片铃声资源
null开发实例一、Application的创建Step 1:创建工作目录和相应的文件。
Step 2:定义Application变量。
Step 3:在mmk_ext_app.h中增加sms全局应用变量。
Step 4:注册系统消息。
Step 5:初始化sms应用模块。
Step 6:编写应用消息处理函数。nullStep 1:创建工作目录和相应的文件。 建立以下三个目录:
..\MS_APP\BMMI\Source\App\SMS
..\MS_APP\BMMI\Source\App\SMS\c
..\MS_APP\BMMI\Source\App\SMS\h
增加以下C/H文件(根据模块需要而定)
mmismsapp_main.c
mmismsapp_order.c
mmismsapp_wintab.c
mmisms_api.h
mmisms_app.h
mmismsapp_wintab.hnullStep 2:定义Application变量。 在mmisms_main.c中增加变量定义:
MMI_APPLICATION_T g_mmisms_app;//SMS的实体
nullStep 3:在mmk_ext_app.h中增加sms
全局应用变量#ifdef __cplusplus
extern "C"
{
#endif
.
.
.
extern MMI_APPLICATION_T g_cc_app;
extern MMI_APPLICATION_T g_mmisms_app;//SMS的实体
extern MMI_APPLICATION_T g_mmipb_app;
.
.
.
#ifdef __cplusplus
}
#endifnullStep 4:注册系统消息在mmk_regapp.def文件中增加此应用模块希望处理的系统消息。
例如,SMS应用可以接收消息ID号码在APP_MN_SMS_READY_IND到APP_MN_SMSCB_REJ_IND之间的消息。则在mmk_regapp.def文件中增加:
REG_APP(APP_MN_SMS_READY_IND, APP_MN_SMSCB_REJ_IND,&g_mmisms_app) nullStep 5:初始化sms应用模块。在MMIMAIN.C中增加对sms应用模块的初始化:
void APP_Init(void)
{
.
.
.
MMIPHONE_AppInit();
MMISMS_AppInit();//sms应用模块的初始化
MMIPB_InitApp();
.
.
.
}nullStep 5:初始化sms应用模块(续)在sms模块的初始化函数中指定消息处理函数和component类型
void MMISMS_AppInit()
{
.
.
.
g_mmisms_app.ProcessMsg = HandlePsMsg;
g_mmisms_app.component_type = CT_APPLICATION;
.
.
.
}
nullStep 6:编写应用消息处理函数LOCAL MMI_RESULT_E HandlePsMsg ( PWND app_ptr, uint16 msg_id, DPARAM param)
{
uint8 result = MMI_RESULT_TRUE;
switch ( msg_id )
{
case APP_MN_SMS_READY_IND:
break;
case APP_MN_READ_SMS_CNF:
break;
nullStep 6:编写应用消息处理函数(续) case APP_MN_UPDATE_SMS_STATE_CNF:
break; .
.
.
default:
result = MMI_RESULT_FALSE;
break;
}
return ( result );
}
null开发实例二、利用Window Table设计窗口请参考MMK_Window_Table开发说明书.doc
Step 1:在win.def文件中声明窗口表。
Step 2:在mmk_type.h文件中声明窗口ID。
Step 3:在mmk_type.h文件中声明控件ID。
Step 4:在mmi_text.def文件中声明文本的ID。
Step 5:创建Window Table表。
Step 6:使用Window Table表打开窗口。
Step 7:实现窗口的消息处理函数。
Step 8:依次类似编写每个Window。nullStep 1:在win.def文件中声明窗口表。 .
.
.
WIN_DEF( MMISMS_MENUWIN_TAB )
WIN_DEF( MMISMS_EDIT_WIN_TAB )
WIN_DEF( MMISMS_EDITOPTION_WIN_TAB )
.
.
.nullStep 2:在mmk_type.h文件中声明窗口IDtypedef enum
{
BEGIN_WIN_ID,
.
.
.
MMISMS_MENU_WIN_ID,
MMISMS_EDIT_WIN_ID,
MMISMS_EDITOPTION_WIN_ID,
.
.
.
}MMI_WINDOW_ID_E;nullStep 3:在mmk_type.h文件中声明控件IDtypedef enum
{
BEGIN_CTRL_ID,
.
.
.
MMISMS_MENU_CTRL_ID,
MMISMS_EDITWIN_EDITCTRL_ID,
MMISMS_SENDNUMOPTION_LISTCTRL_ID,
.
.
.
}MMI_CONTROL_ID_E;nullStep 4:在mmi_text.def文件中声明文本的 ID。 .
.
.
TEXT_DEF(TXT_SMS_WRITE, "Write",
"\x06\x51\x99\x6d\x88\x60\x6f")//写消息 .
.
.nullStep 5:创建Window Table表。WINDOW_TABLE( MMISMS_EDIT_WIN_TAB ) =
{
CLEAR_LCD,
WIN_PRIO( WIN_ONE_LEVEL ),
WIN_TITLE_ID( TXT_SMS_WRITE ),
WIN_FUNC((uint32) HandleEditWinMsg ),
WIN_ID( MMISMS_EDIT_WIN_ID ),
CREATE_TEXTEDITBOX_CTRL(0, 20, 127, 110, MMISMS_MAX_UCS2_MESSAGE_LEN, MMISMS_MAX_MESSAGE_LEN,
T9_PINYIN | T9_STROKE | T9_ENGLISH |
T9_CHARACTER | T9_DIGITAL, T9_PINYIN_MODE, MMISMS_EDITWIN_EDITCTRL_ID),
END_WIN
};nullStep 5:创建Window Table表(续)说明:
WINDOW_TABLE:是用来定义Table数组的,后面的参数是数组名,在应用调用MMK_CreateWin的时候需要用到。
CLEAR_LCD:清除LCD Buffer。
WIN_PRIO:设置窗口优先级的,参数为MMI_WIN_PRIORITY_E枚举类型。
WIN_TITLE_ID:用于设置窗口的标题。后面的参数是窗口文本的ID。
WIN_FUNC:设置窗口的消息处理函数。后面的参数是该窗口的消息处理函数。
WIN_ID:设置窗口ID,参数为MMI_WINDOW_ID_E枚举类型。
CREATE_TEXTEDITBOX_CTRL:用于创建一个Text EditBox控件。
END_WIN:Window Table的结束标志,每一个Window Table的最后一个成员必须是END_WIN宏。nullStep 6:使用Window Table表打开窗口。MMK_CreateWin((uint32*)MMISMS_EDIT_WIN_TAB, PNULL);nullStep 7:实现窗口的消息处理函数LOCAL MMI_RESULT_E HandleEditWinMsg( MMI_WINDOW_ID_E win_id,
MMI_MESSAGE_ID_E msg_id,
DPARAM param
)
{
MMI_RESULT_E recode = MMI_RESULT_TRUE;
TEXTEDIT_STRING_INFO_T edit_string;
switch(msg_id)
{
case MSG_OPEN_WINDOW:
break;
case MSG_FULL_PAINT:
break;
nullStep 7:实现窗口的消息处理函数(续) case MSG_CLOSE_WINDOW:
break;
.
.
.
default:
recode = MMI_RESULT_FALSE;
break;
}
return recode;
}
nullStep 8:依次类似编写每个WindownullThanks!