基于WindML的图形界面控制系统设计*
2014-07-25
(东北电子技术研究所 锦州 121000)
基于WindML的图形界面控制系统设计*
蒲元远吉高卿
(东北电子技术研究所 锦州 121000)
论文结合实际项目介绍了WindML软件架构,如何安装、配置和使用WindML,在应用程序开发图形界面软件的流程,如何进行多页软件设计,WindML中的双缓冲技术,汉字的显示以及帮组页面的制作,并给出了程序运行的相应结果。
VxWorks;WindML双缓冲;汉字显示;多页显示;软件架构
ClassNumberTN97
1 引言
VxWorks作为性能优秀的嵌入式实时操作系统,不论在可靠性、实时性、可裁减性方面,还是在开放性、易用性等方面都是相当不错的。目前,嵌入式实时操作系统VxWorks以其良好的可靠性和卓越的实时性被广泛地应用在国防、航空和航天等领域中。VxWorks图形开发组件WIND MEDIA LIBRARY是一个适用于VxWorks下开发图形用户界面的媒体库,它提供了一系列的API函数,功能强大,易于实现图形用户界面的开发。本文就图形界面控制系统、WindML、应用程序设计等,作进一步的研究和探讨[1]。
2 图形界面控制系统
本系统由主显控制器、从显控制器以及分配器构成,如图1所示。主显控制器硬件由CPU模块、接口模块和人机交付模块(显示屏幕、键盘)组成,它通过CPU模块自带的网口接收上级的控制、气象等数据,通过接口模块接收分配器上报的信息以及与分显控制器通信;主显控制器和从显控制器都使用了WindML设计,通过键盘进行页面切换、输入数据等,通过WindML图形开发在屏幕上显示信息[2]。
图1 图形界面控制系统构成图
3 WindML
3.1 图形驱动架构
WindML图形驱动主要通过以下三层进行通信:2D层、板级支持包及操作系统和图形设备。体系结构如图2所示[3]。
图2 图形驱动体系结构
2D层与图形驱动程序通过UGL图形接口结构(ugl_ugi_driver结构)进行通信,ugl_ugi_driver结构在install-Dir/target/h/ugl/uglugi.h中定义。[2]图形驱动程序通过硬件提取API与操作系统通信,硬件提取API提供了允许图形驱动保留独立于母板和CPU的接口。一般包含几个可扩展的寄存器作为图形加速器,可加速的操作有线条、填充、颜色扩充和光标。
3.2 安装使用步骤
本项目使用WindRiver的WindML3.0版本,集成在Tornado2.2.1上;配置好BSP包后,选择配置WindML。如图3所示,需要选择所对应的CPU平台,图形像素的大小,刷新率,是否需要鼠标、键盘,最后在Bitmap Fonts页中选择需要添加的汉字。
4 应用程序设计
4.1 应用程序开发流程
用WindML API进行绘图操作的一般步骤:1)程序初始化,调用uglInitialize;2)设备驱动装载(uglRegistryFind),包括显示、字体、事件处理、框架等;3)获取ugl信息;4)创建图形设备gc;5)设置字体;6)分配图形空间,以及创建位图;7)使用WindML的API函数输出字符,像素描点等。流程如图4所示[4]。
图4 使用WindML进行应用程序开发的流程
在本项目中,使用了基于VxWorks的实时多任务设计,显示主处理函数为专用的任务,它为循环不断接收其他任务给显示任务传输的消息,对消息进行解析刷新显示。根据不同的消息显示不同的页面和每页中的内容。应用程序框架代码如下:
UGL_FOREVER{
if(ERROR!=(msgQReceive(QueueDisplay,msgBuffer,MESSAGE_MAX_LENGTH,WAIT_FOREVER))){
msg=msgBuffer;
switch(*msg){
case H_SYSCONTROL:
SysToDraw(msg);
break;
case Cycle_Queue_ID:
CycleToDraw(msg);
break;
default:break;
} } }
4.2 多页设计
为了使图形控制系统功能显示细化,操作更清晰,本项目图形控制系统采用页面擦除的方法来实现页面的多级显示。键盘设计为中断方式,根据键盘输入,显示需要的页面及信息。多页选择见图4,选择后进入的主态势页面见图5,也可以从主态势页面返回到选择页面,本项目多页设计的层级化。主体代码如下[5]:
intConnect(INUM_TO_IVEC(INT_VEC_GET(KBD_INT_LVL)),(VOIDFUNCPTR)IntKeyProg,0))//连接中断服务程序
sysIntDisablePIC(KBD_INT_LVL);//关键盘中断
KeyValue[0]=sysInByte(COMMAND_8042);//读取键盘值
switch(KeyValue[0]){ //根据键盘值切换
case 0x1c:/** 回车 **/
KeyValue[1]=Key_Enter;
break;
case 0x0c:/** - **/
KeyValue[1]=Key_Minus;
break;
……
default:break;}
sysIntEnablePIC(KBD_INT_LVL);//开键盘中断
图5 图形控制系统多页设计效果图
图6 图形控制系统多页设计效果图
4.3 双缓存技术
本项目中的图形控制系统采用了双缓冲技术,它不改变可见视频缓存区起始地址,而是在内存中开辟一块与屏幕一样大小的存储区域,作为缓冲屏幕,同时将下一帧要显示的图像绘制到这个缓冲屏幕上面,在显示的时候将虚拟屏幕中的数据直接复制到可见视频缓存区里。由于图形绘制过程是在不可见的虚拟屏幕中进行,所以可以消除屏幕的闪烁、抖动。主体代码如下[6]:
page[0]= UGL_PAGE_ZERO_ID;
page[0]= uglPageCreate(devId);
page[1]= uglPageCreate(devId);
uglPageDrawSet (devId, page[1]);
if (pageIndex == 0){
uglPageVisibleSet(devId, page[1]);
uglPageDrawSet(devId, page[0]);
pageIndex = 1;}
else {
uglPageVisibleSet(devId, page[0]);
uglPageDrawSet(devId, page[1]);
pageIndex = 0;}
4.4 如何显示汉字
在图形方式下,要显示汉字,必须要有汉字字模,并通过适当的转换公式,将汉字编码转换为字模在字库中的位移,然后选用读写指令实现字模的读取和显示。可以通过两种方法输出汉字,第一种是进行二次开发以支持汉字的显示,读取字库文件,使用uglPixelSet屏幕点函数输出汉字;第二种是编辑VxWorks自带的bmf字库文件,通过WindML的支持,然后在程序中直接调用uglTextDrawW()显示汉字。本项目采用后一种方式,实际使用步骤如下[7]:
1)修改bmf字库文件。在$BASEDIR argetsrcuglfontsmf,找到需修改的bmf文件uflbr18.c,其中第一行注释/* uflbr18.c - Lucida_Sans_Bold_18 font for BMF font driver */ ,“—”后面的“Lucida_Sans_Bold_18”将由WindML Configuration解释为“Lucida_Sans_Bold_18”字体。配置图见图2。
2)修改汉字字体。uflbr18.c中,会看到如下格式的汉字信息,可以编辑我们所需要的汉字。其中index和page的值可在UltraEdit直接得到。然后设置长宽为16X16,最后32个字节可以通过取模工具(字模3增强版)获得。
/********导************/
181, /* index */
188, /* page */
0, /* size (MSB)*/
36, /* size (LSB)*/
16, /* width */
16, /* height */
16, /* ascent */
0x04, 0x00, 0x04, 0x00, 0x04, 0x7e, 0x04, 0x92, 0x14, 0x92, 0x24, 0x92, 0x04, 0x92, 0x04, 0x92, 0x44, 0x92, 0x84, 0x92, 0x7f, 0x92, 0x04, 0xbf, 0x04, 0x82, 0x06, 0xe0, 0x04, 0x00, 0x00, 0x00
3)在应用程序中使用。在应用程序中使用汉字,需要如下几个步骤:
(1)uglFontFindString(fontDrvId, "familyName=Lucida;pixelSize=18", &fontoilDef);//找到对应文件
(2)font_oil = uglFontCreate(fontDrvId, &fontoilDef);//创建字体
(3)uglForegroundColorSet(gc, colorTable[DARKGRAY].uglColor);//设置颜色
(4)uglFontSet(gc, font_oil);//设置字体
(5)uglTextDrawW(gc, InfoTopPosX,InfoTopPosY,-1, "综");//输出汉字
uglTextDrawW(gc, InfoTopPosX,InfoTopPosY+Pix24,-1, "合");
4.5 如何显示图片
图像数据是位图矩阵的像素的颜色信息,图像数据的存储格式和含义,因表示像素颜色的位数不同而不同,对于没有压缩的图像数据,当用1位表示一个像素颜色。同样可以使用uglPixelSet屏幕点显示函数显示图片。可以用取模工具,取出其数组,主体代码如下[8]:
for(kk=0;kk<64*8;kk++){
for(jj=0;jj<8;jj++){
if(Bmp_boat[kk]&temp_bit){
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[YELLOW].uglColor);
}
else {
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[BLACK].uglColor);
}
temp_bit=temp_bit>>1;
}
temp_bit=0x80;
}
通过这种像素打点的方法,可以显示任何内容的点阵图片。
4.6 帮助界面,如何显示字符串
本项目中的图形控制系统需要制作帮助文档。通过读取固定格式的bin文件,将读取的字符逐个画在界面上,并且计算字符的高度和宽度;如果bin文件过大,可设计成多个屏幕显示,并通过输入键盘切换显示的帮助页面。帮助页面效果如图6所示[9]。
图7 图形控制系统帮主页面效果图
cd("/ata0a/");//创建磁盘格式
UVHandle=open("/ata0a/help.bin",O_CREAT|O_RDWR,0);//打开len=lseek(UVHandle,0,SEEK_END);
read(UVHandle,HpBuffer,len);
//以下逐个显示字符
for(i=0;i uglTextDraw(gc,10,displayHeight/5+15*i,PageArrow,strBuf); //此处可以使用uglTextDrawW显示汉字 strBuf+=PageArrow;} close(UVHandle); ioctl(UVHandle,FIOFLUSH,0); 本文介绍了WindML软件架构,安装、配置WindML,结合项目开发实际,详细阐述了图形界面控制系统中所使用到的设计原理,所开发的图形控制系统已成功运用于某型号舰船的子系统控制中枢,界面美观,运行稳定,达到了预期设计的目的。按照这些设计原理,也开发出其他型号的显示控制器[10]。 [1]杨娟,王子勇,等.基于WindML的S3C2440显示驱动设计[J].硅谷,2011(9). [2]陈君,唐秀.VxWork下图形用户界面开发中双缓冲技术应用[J].微计算机信息,2006(8). [3]司江英,徐博宁,等.VxWorks系统下的汉字显示[J].科技信息,2009(2). [4]WindML SDK 3.0 Programmer’s guide[Z]. Wind River Systems,Inc.,2002. [5]查振羽,熊华钢.基于VxWorks实时控制系统中文交互界面开发平台[J].计算机工程与设计,2009(8). [6]赵漫菲,王光辉.基于嵌入式操作系统VxWorks的多级界面开发[J].计算机工程与设计,2005(10). [7]陈君,唐秀明.VxWork下图形用户界面开发中双缓冲技术应用[J].微计算机信息,2006(8). [8]何江水,高有行.VxWorks汉字的显示支持[J].微计算机信息,2005(5). [9]孔祥营,张保山,俞烈彬.VxWorks驱动及分布式编程[M].北京:中国电力出版社,2007. [10]周祖洋,傅建刚,万洋.Windows下的位图在VxWorks中大字显示的实现[J].应用科技,2005(7). DesignofGraphicsControlSystemBasedonWindML PU Yuanyuan JI Gaoqing (Northeast Research Institute of Electronics Technology, Jinzhou 121000) According to the actual project experience, the architecture of WindML, how to setup, configure and use WindML develop environment, and the steps of develop graphics software in applications, how to develop Multi-page applications,how to use Double Buffering, Chinese character show and make helping page are introduced. At last, the results of the program running are given. VxWorks, WindML, double buffering, chinese character show, multi-page show, software architecture 2013年11月10日, :2013年12月23日 蒲元远,男,工程师,研究方向:主要从事计算机软件及应用。 TN97DOI:10.3969/j.issn1672-9730.2014.05.0245 结语