Mstar液晶电视方案OSD代码详解Word文档格式.docx
- 文档编号:14537432
- 上传时间:2022-10-23
- 格式:DOCX
- 页数:6
- 大小:18.23KB
Mstar液晶电视方案OSD代码详解Word文档格式.docx
《Mstar液晶电视方案OSD代码详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《Mstar液晶电视方案OSD代码详解Word文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
UI动作表:
指在特定UI场景中,对于UI输入的命令进行对应处理的索引表;
OSD画布:
指整个OSD呈现的区域,一般为一个矩形区域;
OSD位置:
一般指在OSD画布中,相较左上角原点的相对位置;
OSD物件:
呈现在画布上,表示特定信息,具有特定属性的像素组合。
二、MSTOSD流程图
Mstar的OSD方案,感觉主要是在msosd.c(底层部分),menu.c,menutbl.c这里,主要有MenuPageType、MenuItemType、DrawSubMenuGroupType、MenuItemFuncType等几个Stucture,菜单位置、大小及相应操作方法都在结构体里;
在Main循环程序中经过不断的调用keyDetectHander()、irDecodeCommand()和OsdHandler()来达到OSD的各种功能与目的。
三、模块说明
1、UserCommand
这部分指的是用户利用Keypad、Ir或VisualKey进行操作,产生中断触发激活KeyEvent;
主要功能是在Irfunc.c、keyPad.c里完成的,在keyDetectHandler()、irDecodeCommand()中获得相关按键信息,而后经过MenuProcessKey()、ExecuteKeyEvent()执行相应的操作(包括画OSD以及执行按键功能等)。
这里比较重要的是如何将某状态下的按键(如某一按键连续按两次或者一直按下)转化成正确的MenuItemActionType,因为所有的按键最终都会被转到ExecuteKeyEvent()进行处理,而ExecuteKeyEvent()正是根据不同的MenuItemActionType实现不同的功能;
实现此功能的关键在于所使用的MenuStructure上,详细内容请参考MenuTable模块。
2、DrawOSD
在Global.h中定义的一些与OSD相关的全局变量(如:
g_ucMenuPageIndex、g_ucMenuItemIndex、g_ucOsdTimeCounter等等),在UserCommand部分中若用户进行了不同的操作则会影响到这些变量,根据变量值的不同,OsdHandler()、DrawOsdMenu()、DrawOsdMenuPage()、DrawOsdSubMenuGroup()也就能够画出不同的OSD界面了;
这几个函数大部分是在Menu.c里定义的,实现这些函数的功能则是依靠调用底层部分(msosd.c)的各种功能函数,一般来讲,我们不需要更改底层的内容。
同样,实现各种OSD界面风格的关键也是在于所使用的MenuStructure上,因此,理解MenuDef.h中的各种MenuStructure是学习整个MstarOSD结构的关键。
3、MenuTable
这个非常重要,理解了MenuStructure,整个OSD学习也就容易多了,在MenuDef.h中定义的如下几个结构:
A、菜单页面结构体:
typedefstruct
{
BYTEXSize,YSize;
//定义MenuPage窗口大小(SetWindowSize)
BYTEPrevMenuPage;
//前一个MenuPage(场景)
MenuItemType*MenuItems;
//该MenuPage下的MenuItems
BYTEMenuItemCount;
//该MenuPage下的MenuItems个数
BYTEItemSelLength,ItemSubGroupSelLength;
//Item及可选长度
fpExecFuncExecFunction;
//执行功能,如PowerOn/Off等
//MenuFontType*Fonts;
//关闭,暂时未用
BYTEFlags;
//标志位,是否可见/保持
}MenuPageType;
在MenuDef.h中的枚举型变量MenuPageIndexType与MenuTbl.c中的tblMenus[]一起定义了MenuPageType类型的各种MenuPage。
如:
MENU_MAIN,//值5,为1级菜单(MENU_ROOT为虚拟根菜单,另外还有1、2、3级菜单)
MENU_PICTURE,//2级菜单
MENU_SOUND,
MENU_CHANNEL,
MENU_FUNCTION,
MENU_PC,
MENU_OSD,//值11,为2级菜单
等等。
该结构与DrawOsdMenu间的沟通桥梁是定义在Menu.h中的如下宏定义:
#defineCURRENT_MENUtblMenus[g_ucMenuPageIndex]
#defineCURRENT_MENU_ITEMSCURRENT_MENU.MenuItems
#defineCURRENT_MENU_ITEM_COUNT(CURRENT_MENU.MenuItemCount)
#defineCURRENT_MENU_ITEMCURRENT_MENU_ITEMS[g_ucMenuItemIndex]
#defineCURRENT_MENU_ITEM_FUNCCURRENT_MENU_ITEM.KeyFunction
B、页面选项结构体:
BYTEXPos,YPos;
//MenuItem区域
BYTEUnSelColorType,SelColorType;
//选中与未选中图标颜色模式
BYTENextMenuPage;
//下一个MenuPage(场景)
DrawMenuTextTypeDrawItemMethod;
//画Item方法,包括可选颜色、字体等
fpDisplayTextDisplayText;
//所要显示的字符
MenuItemActionType*KeyEvents;
//按键触发事件类别(该MenuItem下各按键动作,导航信息)
MenuItemFuncTypeKeyFunction;
//所选Item对应功能
DrawSubMenuGroupType*DrawSubMenuGroup;
//画菜单的方法
//该MenuItem是否可选、在不同模式下是否可用(MENU_MAIN)
}MenuItemType;
MenuItemActionType*KeyEvents选项对应不同状态下各个按键的不同响应(导航信息)。
例如:
当使用IR按下Menu按键时,IR产生一个IRKEY_OSD_MENU值,利用IrDecommand()调用MenuProcessKey(BTN_OSD),在这里,就必须判断当前状态下的KeyEvent,用于产生对应的MenuItemActionType供ExecuteKeyEvent()使用,若当前状态(即当前g_ucMenuPageIndex与g_ucMenuItemIndex的值)与按下此按键后的状态相同,也就是按下Menu键后再次按下Menu键,这时,所依据的KeyEvent就为CURRENT_MENU_ITEM.KeyEvent指向的结构(定义在MenuTbl.h),为MenuItemActionTypecodeNaviAdjustKeyEvent[BTN_ENDBTN]=
MIA_POWER,//BTN_POWER
MIA_SOURCE,//BTN_SOURCE
MIA_INCVALUE,//BTN_Right
MIA_GOTOPREV,//BTN_Osd
MIA_PREVITEM,//BTN_Up
MIA_NEXTITEM,//BTN_Down
MIA_DECVALUE,//BTN_Left
MIA_PIPFUNC//BTN_Pip
};
即对应BTN_Osd为MIA_GOTOPREV,表示在两次按下Menu键后返回第一次按下Menu键前的场景,应该说明的一点是不同状态下所对应的KeyEvent大多会有异同。
因此,每个Button能够转换成多种类型的MenuAction,而后调用ExecuteKeyEvent(MenuAction)来执行这个MenuAction。
另外还需要注意的是,对于不同的InputSource,OSD需要显示的MenuPage或MenuItem是会不同的,决定是否显示某一MenuPage的控制权在于MenuPage为1级MENU_MAIN中该结构体下的Flag位(MenuItem的控制权在各自MenuPage下该Flag位),经过IsItemSelectable()获得其值,若为True则画之,否则就蔽之;
画出具体某一MenuItem的功能函数是DrawOsdSubMenuGroup()。
C、菜单物件结构体:
//DrawSubMenuItemTextmethod
//选中与未选中图标颜色样式
//文本信息显示的位置
BYTELength;
//选中/箭头等长度
//所要显示的文本信息
fpGetValueGetValue;
//获取数值,如OSD位置、透明度等
}DrawSubMenuGroupType;
这个部分要说明的是DisplayText,因为有多种语言格式,需要从MenuStrings模块中选择正确语言的DisplayTextStrings(实际上是个表),在String.c中的GetStringToBuffer()实现此功能,大致过程是:
在DrawSubMenuGroupType结构里添加指向定义在MenuStr.c里的各种字符串函数,返回定义在Strings.h里的对应字符串索引,该索引最终指向Strings.c里的某些字符表代码,最后当调用DrawOsdSubMenuGroup()时就显示出各种菜单信息。
另外全局变量bCurrFontTableId表示当前使用哪种语言字库,使用OSD菜单下进行语系更改时改变其值,从而实现语言重载,显示出对应语系下的OSD信息。
D、菜单功能结构体:
fpAdjustValueAdjustFunction;
//调整功能函数
//执行功能函数
}MenuItemFuncType;
在Menu.c中的ExecuteKeyEvent()函数中判断菜单项的功能,如果有相应功能便执行。
4、MenuStrings
表结构,主要定义在Strings.c里,依据用户选择不同的语言查找相应的表;
当我们需要更改或添加语言时,能够使用Mstar提供的制作ICON及修改添加语言功能的工具,其中,Mstgen.exe功能是制作I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mstar 液晶电视 方案 OSD 代码 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)