徐丽华(第七一五研究所,杭州,310023)
基于JARI_EGK面向对象的声呐显控界面软件开发方法
徐丽华
(第七一五研究所,杭州,310023)
摘要提出一种基于控件技术的层次化设计和面向对象的设计方法。把各声呐功能模块的公用功能抽象成一个具备通用功能的基类,各声呐功能模块在基类的基础上扩展成独立的功能类,通过组合各功能类的对象,即可完成画面显示、各对象独立管理函数实现、数据刷新、事件响应等功能。工程应用结果表明,此方法开发的软件在功能和性能方面均满足声呐图形界面的要求。
关键词声呐图形界面;VxWorks;JARI_EGK;面向对象设计;功能类
声呐显控台是声呐系统的重要组成部分,是声呐操作人员人机交互的主要工具。显控台的设计主要考虑操作响应的实时性和人机界面的友好性。声呐显控软件主要以嵌入式实时系统VxWorks为平台进行开发,该操作系统以其卓越的多任务处理能力已经成为目前军事领域中使用最广泛的操作系统。VxWorks对图形界面开发支持较弱,界面开发基于WindML,较为复杂,并且无控件支持[1]。如果在声呐多功能显控台中直接利用WindML进行人机界面图形开发,需要程序开发人员熟悉外部的输入输出事件,程序开发的工作量很大,无法满足舰艇中声呐多功能显控台不断提高的用户需求[2]。本文应用VxWorks实时操作系统下基于控件技术的图形开发工具JARI_EGK和面向对象设计方法,实现了对WindML的封装和对声呐主要显示功能类的封装,完成了声呐图形界面软件开发,提高了软件重用性、可扩展性和可维护性。
根据声呐显控图形界面的内容及特点,声呐显示界面一般包含工作参数显示、图形信息显示、字符信息显示、设备状态显示和菜单显示。主要的显示内容可以归纳为三类,即图形窗口、图形信息和文字。图形窗口显示包括坐标刻度、左右舷标记、色标块显示和光标值显示等;图形信息显示包括方位-幅度图显示、方位-幅度-历程图显示、方位-距离扫描图显示和跟踪信息的图形显示等;文字显示包括工作参数显示、工作状态显示、跟踪结果的文字显示和菜单显示等。
2.1层次框架
窗口管理及可视化控件JARI_EGK作为多功能显控台的基本软件配置项,是一款针对嵌入式系统的图形用户界面设计工具,包括丰富的常用控件库和基于该控件库的用户图形界面设计工具[3]。JARI_EGK采用与平台无关面向对象的C++设计,可以实现跨平台应用的用户图形界面开发,实现基于事件驱动的GUI应用。针对VxWorks平台,JARI_EGK在WindML基础上实现了基本控件集,同时采用WindML窗口管理器,因此基于JARI_EGK开发的程序可与WindML其它应用程序并存。
2.2窗口和控件
JARI_EGK采用了面向对象的设计方法,包含了人机界面中基本的窗口和控件,它包括四个主要的类:Egk_Widget(控件基类)、Egk_Group(控件组类)、Egk_Window(窗口类)和Egk(全局类)。
Egk_Widget类是JARI_EGK其他所有小窗口类的基类,它包含有控件的基本属性,如X坐标、Y坐标、宽度和高度;控件的回调函数、显示、隐藏和是否可见等方法。另外还包括两个重要的虚函数virtual void Draw()和virtual void handle(int event),派生类可以重载这两个函数,分别用来重画控件和处理控件的消息事件。Egk_Group类是由Egk_Widget类派生出来的,而Egk_Window类是Egk_Group类的子类。
传统的声呐图形显示程序设计是采用面向过程的软件设计方法,把功能模块封装成公共的函数,没有整体窗口管理概念,代码的重复性高,较为复杂且容易出错。本文实现了完全基于面向对象的软件设计,对于不同的图形功能模块进行不同的类的定义,在JARI_EGK基础上进行二次封装,完成声呐各图形显示功能类的封装。声呐主要的图形功能模块为幅度图、历程图、扫描图、文字显示等,一个功能模块构造成一个相应的功能类。在类的构造函数中完成内存申请、内存清空、设置图形区域、设置图形颜色等初始化的构造,在类的析构函数中完成内存的释放,在类的虚函数Draw()中可根据不同的功能模块来完成类的画图。在主程序中发起一个任务用于某个功能模块的画图实现,一旦检测到有数据刷新,就把数据传入类的数据区保存起来,之后调用该类的Draw()函数来完成图形的重绘,图形画图功能即可完成。下面分节介绍通用基类的封装、功能类的派生、窗口和功能类的应用。
3.1通用基类的封装
在JARI_EGK基类Egk_Widget窗口类的基础上进行功能类的派生来完成功能类的封装。本文设计一个使用于声呐显控台的通用画图窗口类CDrawWin,该类完成声呐图形显示模块通用功能,包括设置窗口大小、设置视角、画面贴图、光标信息显示和刻度值显示等公共功能。从该窗口类派主要函数及注解如下。
class CDrawWin: public Egk_Widget
{
public:
void SetWin(int ileft,int itop,int iwidth,int iheight)//设置窗口大小
void SetView(int ipview)//设置视角,用来完成上下屏切换
void DrawMapBitBlt(int iactivebit)//完成内存画面后往显存贴图
void DrawMouseMove(int iActive,int iMouseFlag,int iAre,CPoint Point,CPoint iDispPos,int iMouseBegin,int iMousEnd,CString iText,float fMouseBegin,float fMousEnd,CString fText)//完成光标类型,光标显示相对窗口的区域,光标值的计算方式,以及需要传入的显示文字等功能
Void DrawScale(int iactive,int iScaleFlg,int iScaleBegin,int iScaleEnd,int iScaleNumb,int iScaleLenth)//完成刻度的显示,包括类型、起始值、个数、长度
}
3.2功能类的派生
根据声呐的主要显示内容,从通用画图窗口类CDrawWin派生出幅度图类、历程图类、扫描图类、文字显示类。各功能类分别根据自己的需要通过Draw()的改写来完成各自的功能。根据每一个需要完成的任务,申请一个类的对象,该对象即具备所有该类的资源。在功能类设计好之后,申请一个功能类的对象,同时对该对象的显示特点进行标记,在Draw()函数中根据该标记完成相应的画图。有某一功能类需要新的显示要求时,只要在Draw()函数内添加根据显示要求的画图方法即可。
根据不同的类型标志来实现不同的幅度图的显示。幅度图根据类型可分为:直线填充、柱状填充和包络图,根据不同的数据要求又可以判断是否需要进行幅度缩放显示。
历程类主要的实现方法为原画面整体向下移动一个象素,再灰度化当前一行的象素即可。历程图上还要实现跟踪打点并标注跟踪器号。
扫描类主要的实现方法为清空原扫描线,灰度化当前行数据,在上一行画新的扫描线。扫描类的Draw()函数可根据不同的标志画彩色扫描图和灰度扫描图。
文字类的画图包括标题栏信息显示,跟踪信息文字显示等纯文字显示,具体实现方法为直接文字信息输出。
下面以幅度类为例,描述功能类的派生方法和主要函数实现方法。
class CWinScope:public CDrawWin
{ //画幅度图的子类
public:
void SetData(unsigned char idata[])//通过该函数传递数据
Draw()//画具体各类型的幅度图
}
void CWinScope:: SetData(unsigned char idata[])
{data=idata;}
void CWinScope:: draw()//幅度图具体画面的实现
{
int i = 0; int px = x();int py = y(); int pw = w();
int ph = h();
egk_push_clip(px,py,pw,ph);
egk_backcolor(EGK_BLACK);
egk_rectf(px,py,pw,ph);
egk_color((Egk_Color)EGK_GREEN);
switch (m_nScopeFlag)
{
case 1: //根据标记选择被动主画面宽带幅度图
for(i = 1; i < pw; i++)
{egk_line(px+i,py+ph–1,px+i,py+ph–data [i]/2);}
//具体被动主画面宽带幅度图画图实现
break;
}}
3.3窗口和类的应用实例
在软件开发时,将整个双屏显示器作为一个Egk_Window窗口,将上屏或者下屏显示器作为Egk_Group控件组。在每个声呐画面组中添加JARI_EGK的控件对象或者添加从Egk_Widget控件基类派生的自定义类的控件对象。通过调用Egk::run()函数来实现整个声呐显控台人机界面的图形刷新。具体的开发方法流程图如图1所示。关于自定义功能模块的添加,以声呐被动波束形成幅度图及历程图为例。软件流程见图2,数据处理流程图见图3。本文给出主要的函数调用方法:(1)申请一个幅度类的对象和历程类的对象,完成对象的初始化,设置窗口位置,设置需要画图的种类,完成刻度的显示;(2)对该对象进行功能管理,收到未处理的数据后,把数据传递到对象的数据区,再根据对象数据区的数据完成画图。
具体对象的函数调用如下:
winBD_Scope.SetWin(BDScopeLeft,BDScopeTop,BDS copeWide,BDScopeHight);//设置画图位置
winBD_Scope.SetFlag(ScopeFlag1); //根据需要设置具体的画图方式,此处为画绿色填充幅度图。
winBD_Scope.DrawScale(BDDoing,2,0,180,5,5);//设置刻度
winBD_ScopeProcess.SetWin(BDScopeProcessLeft,BD ScopeProcessTop,BDScopeProcessWide,BDScopeProcessHi ght);//设置画图位置
winBD_ScopeProcess.SetFlag(ScopeProcessFlag1);
//根据需要设置具体的画图方式
winBD_ScopeProcess.DrawScale(BDDoing,4,0,30,4,5);//设置左侧垂直刻度,刻度值显示4个
申请并设置好被动幅度图、历程图的对象后,即在画面上完成图形框架的显示。在收到数据后,进行数据传递,再进行画图处理即可。
memmove(g_ucBD_ScopeData,orderbuffer[OrBufOut][ 0],BDScopeWide);//接收的信数据放置到数组中
winBD_Scope.SetData(g_ucBD_ScopeData);//数据传递
winBD_Scope.Draw(BDDoing); //完成作图
winBD_ScopeProcess.SetData(g_ucBD_ScopeData);//数据传递
winBD_ScopeProcess.Draw(BDDoing); //完成作图
以上程序实例表明,在采用面向对象的设计方法后,通用功能都在基类中实现,专用功能都在专用类中实现。
图1 窗口构成流程图
图2 被动幅度/历程图的构建
图3 被动幅度/历程图图形刷新
3.4面向对象设计方法的应用效果
本文对一些常用的声呐显控图形显示功能模块在JARI_EGK平台的基础上封装成类。每个类完成一个功能模块。当需要显示多个该功能模块对象时,直接在需要的位置生成该类的对象即可完成图形的显示和基本数据流的管理。采用功能模块类的封装后,图形软件就更具有模块化功能,程序的逻辑和条理也更为清晰,在软件具体开发时,只需要完成不同类的实例化,即完成画面可有机组合。在收到数据或者画面切换后各自管理图形刷新,每个模块的独立性很好。
本文提出了一种在VxWorks操作系统基础上,基于JARI_EGK图形开发工具和面向对象的声呐显控界面软件设计方法,有效的完成了声呐复杂图形界面的开发。和以往的面向过程的声呐显控软件相比,该技术在软件重用性、可扩展性和可维护性上有较大提高,整个软件框架结构稳定、逻辑清晰,软件开发人员只需要关注软件的具体实现,可避免对纷繁复杂的内部调度机制的理解和维护。该方法在多个工程上运用结果表明:采用该方法后,软件架构清晰,稳定性好,可扩展性和可维护性强。
参考文献:
[1] 周启平,张扬,吴琼. VxWorks开发指南与Tornado实用手册[M].北京:中国电力出版社,2004.
[2] 李青松. 基于JARI_EGK图形开发系统在声呐多功能显控台中的应用[J].声学与电子工程,2014,(4):31-34.
[3] 刘东涛,肖峰. 基于VxWorks的人机界面图形开发系统设计[J]. 指挥控制与仿真,2011,33(4):117-120.