APP下载

基于WindML的图形开发与应用

2016-01-23练学辉朱佳丽乔大雷海军驻南京地区雷达系统军事代表室南京0003中国船舶重工集团公司第七二四研究所南京53

雷达与对抗 2015年1期

练学辉,朱佳丽,乔大雷(.海军驻南京地区雷达系统军事代表室,南京0003; .中国船舶重工集团公司第七二四研究所,南京53)



基于WindML的图形开发与应用

练学辉1,朱佳丽2,乔大雷2
(1.海军驻南京地区雷达系统军事代表室,南京210003; 2.中国船舶重工集团公司第七二四研究所,南京211153)

摘要:以电子地图显示软件开发为背景,研究了Vxworks下使用WindML3.0进行嵌入式图形开发的全过程,包括WindML的配置和加载、WindML下图形开发的总体框架等,并实现了WindML下图形窗口的创建、显示、刷新,汉字的显示,并利用双缓冲技术解决电子地图刷新时的屏幕闪烁问题。

关键词:WindML图形开发; WindML配置和加载;窗口显示;双缓冲;汉字显示

0 引言

Vxworks实时操作系统具有高实时性、高可靠性等特点,被广泛应用于工业控制、国防军事等领域。Vxworks6.0以下版本采用的是Tornado开发工具,而Vxworks6.0以上版本集成的是Workbench开发工具。Vxworks能够支持大多数常用的工作平台和目标处理器,除基本的功能和开发工具外,它还具有多媒体应用开发组件WindML。WindML组件为嵌入式系统提供了基于常用设备的图形、视频以及音频技术。Tornado 和Workbench开发工具均支持WindML组件,且Workbench支持更高的WindML版本。

本文总结了基于WindML3.0的图形开发过程,包括WindML的配置、加载及遇到的问题与解决方法,同时描述了基于WindML实现电子地图的任意缩放、平滑漫游以及名称标绘等功能的内容,主要介绍基于WindML的绘图窗口的创建、显示、刷新,双缓冲技术在电子地图显示软件中的具体应用以及汉字显示的实现。

1 WindML简介

WindML多媒体库是Tornado的可选组件之一,具有一整套Vxworks操作系统下的基本图形功能,为开发者提供了一个层次清晰、结构合理的图形开发框架。WindML主要包括软件开发包(SDK)和设备驱动程序开发包(DDK)这两个组件。WindML的层次结构如图1所示。

图1 WindML层次结构

SDK层定义了应用程序与底层硬件驱动程序之间的接口,使得WindML开发者可以独立于底层硬件来完成应用程序的开发。SDK层提供的接口主要包括图形设备资源的初始化以及销毁程序、多媒体应用程序接口、事件服务、内存管理、设备管理等。DDK是SDK与硬件之间的中间层。在利用WindML实现图形相关功能时,图形绘制工作由应用程序调用SDK层的API函数来完成,而API函数则通过调用特定图形设备的DDK层驱动程序完成对图形设备的实际访问。

2 WindML的配置和加载

WindML是以源码形式释放的组件,在WindML完成安装后需要对WindML进行设置并对其进行编译生成相应的库文件。WindML的设置包括处理器类型的选择、图形设备的选择、键盘设备的字体选择、是否支持双缓冲等选项。WindML的设置可以使用Tornado图形化配置或命令行方式来实现。在完成WindML设置后,需要对WindML配置文件进行编译,在进行编译前需要先进行clean操作,否则编译会出现问题。在Tornado中使用图形工具进行WindML(V3.0)设置的具体过程如下:

·打开…configpcPentiumconfig.h文件,添加如下代码:

#define INCLUDE_WINDML

#define INCLUDE_WINDML_PS2_POINTER

#define INCLUDE_WINDML_PS2_KEYBOARD

·进入Tornado2.2->Tools->WindML…;

·进入WindML Build(图2)界面;

图2 WindML Build界面

·选择Configure(图3a),进入WindML Configuration,选择PENTIUM/gnu;

·点击Devices(图3(b)),选择VESA BIOS/Generic Monitor/16-RGB565/1024 * 768/60/No Pointer/PC-AT Type/No Audio;

·点击Advanced(图3(c)),选择JPEG/Double Buffer;

·点击Bitmap Fonts(图3(d)),选择Include Unicode Support/All Font;

·选择File->Save;

·进入WindML Build,选择所保存配置,点击Build进行编译。

为了支持中文汉字的显示,图3 d)中需添加自己开发的中文字库。在完成WindML库文件的设置和编译后,WindML相关组件在Vxworks工程的组件管理窗口中由不存在或不可选状态变为可选状态,在组件管理窗口中添加相应的WindML组件完成开发环境的配置。对于简易图形界面的开发,只要将2D graphics和complete 2D library添加进Vxworks即可。WindML支持双缓冲技术[1]。开发过程中若需使用该技术,除了在WindML配置文件中添加双缓冲相关内容,还需修改sysLib.c文件以实现BSP对双缓冲的支持。修改完成后,保存并重新编译BSP。

图3 WindWL Configuration界面

3 WindML在电子地图开发中的应用

Vxworks图形开发[3-5]提供的功能相对简单。与Windows具有丰富直观的图形化开发控件相比,WindML仅提供了点、线、矩形、椭圆等简单图形的绘制功能,因此很多图形相关的显示功能只能通过函数集来实现。同时,Vxworks没有提供汉字显示解决方案[2],不支持汉字显示,需要自己设计并实现。

绘制电子地图时要先创建显示区域。由于WindML没有窗口类资源及相关控件,只能通过函数集来实现窗口的创建、显示及刷新。在电子地图漫游过程中,在使用图形绘制函数进行电子地图动态刷新时,大量数据的高频刷新会引起屏幕的严重闪烁,通过使用双缓冲技术在后台缓冲区完成电子地图的绘制后再将其显示在前台,可以有效解决屏幕闪烁现象。

3.1 WindML图形开发流程

在利用WindML进行图形开发的过程中,遵循规范的开发流程可以有效提高编程效率,减少编程错误。具体的流程如下:

(1)调用函数uglInitialize()完成初始化;

(2)通过uglDriverFind()获取设备的驱动信息,包括显示器、字体等;

(3)建立颜色索引表;

(4)通过uglGcCreate()创建图形上下文;(5)在指定的图形上下文中进行绘图操作;(6)完成所有资源的释放并退出。

3.2窗口的创建与显示

使用WindML的函数进行电子地图绘制时,先通过winCreate函数进行窗口的创建,winAttach进行窗口的绑定,再用winDrawStart函数进行窗口锁定,然后设置区域绘制所需的线宽、前景色、背景色、区域的大小等参数,通过uglRectangle等绘图函数实现在窗口指定区域内绘制所需图形,绘制完成后通过winDrawEnd函数进行窗口的解锁。

在创建多个窗口时,由于WindML组件没有提供窗口互锁功能,组件中的窗口可以重叠、嵌套等操作,如果需要屏幕上每次只显示一个窗口,可以通过定义全局变量tWin来实现窗口互锁。具体做法如下:

(1)定义全局变量tWin,初始化tWin的值为0,并假定tWin不为0时窗口显示相关的事件得不到响应,tWin为0时响应指定的窗口显示事件;

(2)为每个窗口创建一个任务,该任务的调用函数包括窗口的初始化、显示、事件处理以及关闭;

(3)每次处理窗口显示相关的事件时,先判断tWin是否为0,如果tWin为0则调用taskSpawn显示相应的窗口,同时令tWin等于taskSpawn的返回值,只要窗口显示调用成功,则tWin就不会等于0,此时其他的窗口显示相关事件就得不到响应,这样就相当于实现了窗口互锁;

(4)当前窗口关闭后,tWin值被置为0,此时就相当于解除了窗口互锁。

3.3汉字的显示

WindML不支持汉字显示,当直接在WindML下对电子地图中的中文地名进行标绘时,会显示乱码。考虑到WindML对双字节编码的支持,通过自己开发点阵字库,实现对汉字的点阵存储、点阵获取、点阵显示的全过程,并利用WindML的双字节显示函数实现汉字显示。点阵字库添加的具体步骤如下:

(1)开发自己的点阵字库并给字库定义一个文件名,将做好的字库文件以”.c”为后缀;

(2)放在WindML的字体引擎WINDBASE/target/src/ugl/fonts/bmf目录下;

(3)打开WindML配置菜单,在Bitmap Fonts页面下添加字库文件,保存并编译配置文件以完成汉字字库的添加。

在完成汉字字库的添加工作后,就可以在程序中运用WindML自带的接口函数进行汉字的显示。具体过程如下:

(1)使用uglDriverFind()函数选择字体驱动;

(2)利用uglFontFindString()函数查找已经配置好的字体;

(3)利用uglCreateFont()创建字体;

(4)使用uglFontSet()函数来设置字体;

(5)调用uglTextDrawW()来进行汉字的显示。

在使用WindML的接口函数进行汉字显示时,汉字的颜色、大小均可改变。开发不同的点阵字库,通过字库文件中的width和height参数设定点阵字体的大小,保存字库文件,通过UglFontFindString函数中的familyName和pixelSize来查找合适的字体,将查询结果存储于UGL_FONT_DEF结构体中,然后通过ugl-CreateFont函数创建指定大小和类型的字体。使用ug-lTextDrawW进行汉字显示时,在建立颜色索引表之后,通过uglBackgroundColorSet和uglForegroundColor-Set函数即可设置汉字的显示颜色。

3.4双缓冲技术的实现

开发电子地图显示软件时,地图需随参考物位置变化实时更新,刷新时需要先擦除画面然后再进行绘制。调用API函数进行电子地图刷新时,需要重新计算并绘制地图上的大量信息。若采用边计算边绘制的方式,不可避免地会出现屏幕闪烁现象,而使用双缓冲技术可以很好地解决这一问题。双缓冲是指在内存中创建一块与屏幕绘图区域一致的存储区域,作为缓冲屏幕。在图形绘制的过程中,先将图形对象绘制在存储区域,绘制完成后再一次性将缓冲屏幕中的数据复制到可见视频缓冲区中。

WindML双缓冲技术主要由函数uglPageDrawSet 和uglPageVisibleSet实现。电子地图实时刷新时,调用函数uglPageDrawSet指定待绘制的缓冲区(页面),绘制完成后通过调用函数uglPageVisibleSet将后台缓冲区的画面拷贝到前台进行显示,实现电子地图的刷新。在使用双缓冲技术进行图形刷新的过程中,操作页面的坐标偏移不能小于等于0,否则会出现致命错误并导致Vxworks系统重启。WindML下双缓冲技术的具体实现步骤如下:

(1)判断是否支持双缓冲;

(2)创建双缓冲页: page[0]= UGL_PAGE_ZERO_ID page[1]= uglPageCreate(devId);

(3)通过uglPageDrawSet(devId,page[1])函数设置活动绘图缓冲页;

(4)根据当前数据绘制图形;

(5)通过uglPageVisibleSet(devId,page[1])函数显示绘制好的图形;

(6)通过uglPageDrawSet(devId,page[0])函数设置活动绘图缓冲页;

(7)根据当前数据重绘图形;

(8)通过uglPageVisibleSet(devId,page[0])函数显示绘制好的图形;

(9)重复步骤3~8;

(10)通过uglPageDestroy(devId,page[1])函数释放缓冲区域。

4 结束语

本文总结了基于WindML的嵌入式图形开发过程,上述技术已被应用于电子地图开发过程中,实现了电子地图的显示和刷新,并获得了较好的显示效果。

参考文献:

[1]陈君,唐秀明.Vxworks下图形用户界面开发中双缓冲技术应用[J].微计算机信息,2006(22).

[2]刘亚丽,颜丽娟.一种基于Vxworks的汉字输入法实现[J].电子科技,2012(2).

[3]蔡华,卞新高,史中权,等.基于Vxworks的WindML图形界面开发方法[J].工业控制计算机,2005(18).

[4]皇甫祯,陈怀民,等.基于Vxworks的图形界面开发方法[J].测控技术,2008(27).

[5]袁渊,增文火.基于嵌入式操作系统Vxworks的图形界面开发[J].华东船舶工业学院学报,2003(17).

Graphic development and application based on WindML

LIAN Xue-hui1,ZHU Jia-li2,QIAO Da-lei2
(1.Military Representatives Office of Radar System of the PLA Navy in Nanjing,Nanjing 210003; 2.No.724 Research Institute of CSIC,Nanjing 211153)

Abstract:The embedded graphic development is studied through the WindML3.0 at the Vxworks on the background of the e-chart,including the WindML configuration and loading as well as the overall framework of the graphic development.The creation of the graphic windows,display,refresh,and Chinese character display based on the WindML are realized.Besides,the problem that the screen flashes when the e-chart is refreshed is resolved through the double buffering technology.

Keywords:WindML graphic development; WindML configuration and loading; window display; double buffering; Chinese character display

作者简介:练学辉(1965-),男,高级工程师,研究方向:雷达总体技术;朱佳丽(1986-),女,工程师,硕士,研究方向:数据处理及显示技术;乔大雷(1980-),男,工程师,硕士,研究方向:雷达数据处理。

收稿日期:2014-12-20;修回日期:2015-01-11

文章编号:1009-0401(2015)01-0065-04

文献标志码:A

中图分类号:TP31