基于VxWorks的人机界面图形开发系统设计

2011-07-16 07:37刘东涛
指挥控制与仿真 2011年4期
关键词:管理器输入法控件

刘东涛,肖 峰

(1. 海军驻426厂军事代表室,辽宁 大连 116015;2. 江苏自动化研究所,江苏 连云港 222006)

1 嵌入式人机界面开发面临的问题

VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发平台的关键组成部分[1]。它以其良好的可靠性和卓越的实时性被广泛地应用于通信、军事、航空、航天等对实时性要求极高的领域中。

随着VxWorks的应用群体不断扩大,应用范围不断拓广,用户的需求也在不断提高,很多应用系统已经不再局限于无界面、无交互的方式。越来越多的用户要求提供高性能、高可靠的图形用户界面支撑系统。而图形化界面开发恰恰是VxWorks的弱点,国外对嵌入式图形系统的研究起步较早,在国内占据了大部分市场,处于垄断地位,如WindRive公司的Tilcon。但是Tilcon存在的缺点是中文支持度不好,不支持中文输入功能[2]。国内在图形开发环境方面起步比较晚,在这方面的研究主要是基于VxWorks的图形中间件软件包──WindML进行二次开发[3]。在WindML基础上自行开发图形相关的功能函数,利用这种手段编写的程序无法将显示逻辑和数据处理逻辑划分开来,界面开发工作量大,导致代码重复,维护成本较高。作为操作系统和应用程序之间的中间件──飞漫公司的MiniGUI已经取得一定的成果,但MiniGUI的窗口管理器没有完全基于WindML窗口管理器,不能完全兼容WindML(VxWorks标准的图形开发库),使得MiniGUI在VxWorks上应用受到限制。针对这种情况,本文在VxWorks标准图形库WindML的基础上提出了一种基于控件技术的人机界面图形开发库JARI-EGK的设计方法。

2 JARI-EGK层次框架

嵌入式系统往往是一种定制设备,有不同的硬件设备,各个系统对人机界面图形库要求各不相同,如有的系统只要求一些图形功能,而有的系统则要求完备的图形用户界面开发库支持,因此,嵌入式窗口系统必须层次化,方便配置和定制。

为了屏蔽人机界面图形库与不同硬件设备的关联,要求设计时就考虑分层次设计。如图1所示,JARI-EGK建立在图形抽象层(WindML)之上。WindML支持多媒体程序运行于嵌入式操作系统,主要目的是用来提供基本的图形、视频和音频技术,以及提供一个设计标准设备驱动程序框架。WindML包含两个组件——软件开发包(SDK)和驱动程序(DDK),SDK组件用来开发应用程序,它提供了一个全面的API集[4],包括图形、输入处理、多媒体、字体和内存管理,DDK组件是用来实现驱动程序的,它提供了一个完整的驱动程序参考集,包括硬件配置和API集,以便开发者能够迅速地引导和应用自己的驱动程序[5]。在不同硬件平台上运行时,只需通过适应性的底层作图函数修改就能满足JARI-EGK的需求。WindML 为操作系统提供一个基本的抽象层,JARI-EGK为更高一级的抽象,JARI-EGK中的抽象层可通过WindML将特定底层硬件的细节隐藏起来,而上层应用程序则无需关心底层的硬件平台输出和输入设备,进而应用程序只关心自己的特定功能满足要求就可以了。WindML屏蔽了JARI-EGK与硬件平台之间的关系,使得JARI-EGK可方便地应用到不同的硬件环境中去。

图1 JARI-EGK层次图

3 JARI-EGK图形开发系统设计

在JARI-EGK设计过程中,本文重点分析了窗口和控件关系、事件传递机制、窗口和控件状态更新机制和中文输入等问题。

3.1 窗口和控件类关系

在JARI-EGK的设计过程中,考虑到窗口、控件、控件组等关系,它们是有独立也有联系的各个错综复杂的关系的结合体。每个控件本身有共同的特点比如大小、位置、事件处理等,但是每个控件又有自己的不同行为,比如文本框、按钮、TAB控件等,它们的外观和事件处理方法都不相同,同时控件本身也存在父子关系,比如TAB控件包含几页,页里面包含多少控件等,对于窗口也具有控件的某些特性、大小位置以及部分事件处理,整个JARI-EGK图形系统应该具有组织、管理和查询所有控件和窗口的能力[6],以及应用系统中包含多个窗口和控件,因而如何组织一个有效的数据结构管理这些控件和窗口是十分必要的。综合这些原因,在JARI-EGK图形系统中采用面向对象的设计理念,面向对象设计主要优点有:封装性,继承性,多态性。在设计过程中,为了增加代码重用,建立一个良好的类关系,采用不同类来设计窗口以及各个控件。由于这些原因首先设计了四个主要的类Egk_Widget(控件基类)、Egk_Window(窗口类)、Egk_Group(控件组类)和Egk(全局类),其基本关系如图2所示。

控件基类(Egk_Widget)包含了窗口和控件的基本信息,譬如长、宽等。JARI-EGK中的所有的控件、窗口和控件组都是由控件基类派生,控件基类来实现不同控件之间的相似功能,各控件的消息处理和回调都是由重载控件基类的函数来实现的的,从而可以让每个属于控件基类的控件均保持有相同的函数,这就是面向对象的多态性。由于窗口等有可能包含有控件,所以添加了Egk_Group(控件组类),Egk_Group也继承自控件基类,同时又有自己的属性,Egk_Group设置链表可以添加、删除、查询控件基类指针。在控件基类的设计过程中添加变量来区分当前控件类型是窗口还是控件。

图2 窗口、控件类基本关系图

当创建窗口的时候,在Egk类这个全局静态变量链表里面增加一个窗口类指针。窗口包含一个控件指针数组,控件指针数组的第一个指针指向窗口本身,余下的依次指向其它控件以及控件组,控件组又可以包含别的控件指针,也就是可以包含其它控件,结束时控件指针数组设置结束标志、整个窗口、控件、控件组形成一个整体。另外设计一个窗口链表类包含各个窗口信息,譬如窗口ID号等,当存在多个窗口时,窗口链表类依次增加,查询方法是存在多个窗口,先从窗口查询开始,接着遍历窗口包含的控件组和控件,对于控件组再遍历控件组包含的所有控件。

3.2 事件传递机制

控件和窗口采用了面向对象的设计理念, 事件传递通过重载控件基类的事件处理函数virtual int handle(int event)。外部消息,比如WindML底层事件(鼠标、键盘原始信息),首先发送给窗口[7]。这个由WindML窗口管理器处理。Egk类函数Egk::run()负责分发这些消息,根据窗口的ID号,发到相应的窗口类,窗口类里面的控件组成员变量包含了所有加载到本窗口的控件指针,窗口类遍历控件指针,根据控件基类位置信息判断给哪个控件发送信息,然后就发送给该控件,控件基类指针指向要选中的控件,这样具体执行事件处理函数就可以执行消息响应了。比如当窗口接收到鼠标按下消息后,判断位置在按钮区域,然后执行按钮的事件处理函数handle来实现按钮的响应。如果含有控件组那么传给控件组,控件组再遍历控件指针数组,根据控件基类位置信息判断给确定控件发送消息,具体的那个控件再执行相应的事件处理函数,如图3(a)所示。对相似控件事件处理也充分利用面向对象中的继承和派生方法,通过对已有控件事件处理函数的继承,既可以让该控件继承已有控件类的大部分处理行为,同时又具有自己的特殊行为。比如,一般的编辑框会接收所有的键盘输入,当我们希望自己的编辑框只接收数字时,就可以用这种办法屏蔽非数字的字符输入。

图3 JARI-EGK、WindML窗口信息处理对照图

JARI-EGK的事件处理采用开放性的设计原则,能够和WindML应用程序能够无缝结合,如图3(a)、图3(b)所示。对于JARI-EGK应用程序和WindML应用程序,WindML窗口相关的窗口信息和窗口管理起都是一样的,WindML窗口只和底层事件、窗口信息和窗口管理器相关,对于WindML窗口来说两个是完全相同的处理流程,所以JARI-EGK应用程序和WINDML应用程序能够完全兼容。

3.3 窗口和控件状态更新机制

窗口控件的行为和窗口一样,即能够接收键盘和鼠标等外部输入,也可以在自己的区域内进行输出,只是它们的所有活动被限制在主窗口中。当把控件和窗口都已经创建完毕,接着就是循环等待各种外部事件。窗口和控件状态更新实现机理如图所示。设计的过程中我们在控件基类里添加一个变量_damage,当仅仅控件需要更新时,我们把控件的_damage变成EGK_DAMAGE_CHILD,同时也设置它所隶属窗口的_damage值也为EGK_DAMAGE_CHILD,当控件需要更新时,发送消息告诉窗口需要更新但不是全部更新,Egk::run()循环检测到窗口的更新信息只是更新控件,窗口类查询控件每个控件更新信息后,直接调用控件的Draw函数,更新控件,当整个窗口需要更新时,我们把窗口的_ damage变成EGK_DAMAGE_ALL这时窗口类更新整个窗口及其控件,这种更新机制保证了控件的及时有效的重绘。

图4 窗口更新示意图

3.4 中文输入设计

JARI-EGK 的中文输入是一个相对独立的模块(称为 JARI-IME),完全内嵌在WindML中,它实际是一个特殊的窗口。该窗口将在启动之后,首先将自己注册为输入法窗口,输入法窗口一直出现在各个窗口的顶层。键盘信息管理负责管理输入法模块、底层键盘信息、WindML窗口之间键盘信息传递,键盘信息管理根据WindML窗口根据输入法状态决定键盘信息发送给输入法窗口还是WindML窗口。发送给输入法窗口后[8],经过输入发模块转换成相应信息后再返回给WindML窗口,如图5。当活动主窗口发生变化时,窗口管理器会通知输入法窗口当前的活动窗口。这样,当输入法窗口接收到按键消息并且翻译为适当的字符之后,就可以将其发送到当前的活动窗口。

窗口管理器为输入法窗口定义了如下消息,当活动窗口发生变化时,JARI-EGK会向 IME 窗口发送这些消息:

IME_EGK_ SEND:发送该消息到当前活动窗口;

IME_EGK_ OPEN:发送该消息到当前活动窗口,告诉当前活动窗口输入法窗口已经打开;

IME_EGK_CLOSE:发送该消息到当前活动窗口,告诉当前活动窗口输入法窗口已经关闭。

图5 输入法模块示意图

4 结束语

在嵌入式操作系统VxWorks的图形界面开发过程中,WindML作为VxWorks的标准图形开发组件往往是最佳选择,由于WindML只能实现点线圆作图、窗口移动缩放等简单功能,图形界面开发支持较弱。本文采用基于控件技术的层次化设计和面向对象的设计方法,在WindML基础之上实现了一种在VxWorks实时操作系统下具有自主知识产权和开放体系结构的人机界面图形开发系统JARI_EGK。目前JARI-EGK已经成功应用到海军多个项目软件开发中,实际工程应用表明,JARI_EGK在功能和性能方面能够满足VxWorks实时操作系统下图形界面开发要求。

JARI_EGK目前只能实现了二维图形界面显示开发,但是三维图形界面显示已经是大势所趋,因而如何实现三维图形界面显示开发将是今后下一步研究工作的重点。

[1]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境[M].北京:中国电力出版社,2002.

[2]张加林,李松,等.基于Tilcon的VxWorks图形界面开发技术[J].指挥控制与仿真,2007(5).

[3]皇甫祯,陈怀民,等.VxWorks嵌入式图形界面设计[J].测控技术,2008(8).

[4]WindML DDK 3.0 PROGRAMMER’S GUIDE [R],Wind River Systems, Inc.2002.

[5]WindML SDK 3.0 PROGRAMMER’S GUIDE [R], Wind River Systems, Inc.2002.

[6]赵甫,李跃,等. VxWorks上的一种GUI系统的设计与实现[J]. 计算机工程与设计,2006(15).

[7]董英英,王启峰,等.基于S3C2440的WindML图形驱动设计[J].现代电子技术,2010(16).

[8]万海东,刘丹,等.军事指挥系统中VxWorks下汉字显示技术[J]. 计算机工程与设计,2009(13).

猜你喜欢
管理器输入法控件
要命的输入法
启动Windows11任务管理器的几种方法
基于.net的用户定义验证控件的应用分析
应急状态启动磁盘管理器
Windows文件缓冲处理技术概述
关于.net控件数组的探讨
找回微软拼音输入法设置
输入法顺序听我使唤
百度被诉侵犯商标权和不正当竞争
基于嵌入式MINIGUI控件子类化技术的深入研究与应用