余正风 张燕平 秦正运
(中国直升机设计研究所 江西省景德镇市 333000)
在如今航空技术突飞猛进的发展下,航空电子系统愈加复杂,综合显示控制系统的多功能显示器作为显示仪表的迭代品,不仅需要实时给飞行员提供导航、飞行参数和其他关键信息的显示,还需要将复杂的飞行信息用规范的可视化图表集成显示,有助于飞行员在人机交互中快速获取信息,从而有效的操纵整个系统。
VAPS 作为常用于航空飞行器显示端辅助开发的图形界面设计工具,通过强大的GUI 编辑器对需设计的显示图符进行建模作为一个个控件,形成图符库;然后根据具体需求配置图符控件的属性,添加相应的逻辑,从而组建出完整的画面。但在使用过程中,因为对显示要求的不断提升,基础图符控件已然捉襟见肘,需要通过增加代码控制的方式对基础图符进行二次开发,使图符控件的功能满足设计的显示需求,也使图符库使用起来更加高效、便捷,减少开发工作量。
VAPS XT 是由加拿大Presagis 公司研发的一款图形界面设计工具,广泛应用于航空、车辆仪表等高性能电子设备应用的设计开发。VAPS XT 拥有良好的图形用户界面,用户可以利用工具提供的控件以及设定行为来快速设计仪器仪表图形,且提供了自定义控件的能力,具有便捷、灵活、可视化等优点;并且VAPS XT 支持UDP、TCP、共享内存等数据通道机制与外界进行数据交互。在设计结束后,可通过代码生成器将设计的图形转换成C++代码,无需改动即可以应用到不同平台上去。VAPS 已经在F-22、NH90 等机型以及国内多型号直升机的座舱显示设备中应用。
如图1 所示,机载显控软件分为用户系统(User Application, UA)和座舱显示系统(Cockpit Display System,CDS),UA 作为控制端,用于控制画面显示,接收CDS 反馈的人机交互指令,CDS 作为显示终端,接收来自UA 包括画面ID、图符驱动数据等信息,二者通过总线或共享内存的方式进行交互。其中CDS 分为数据通讯和画面显示两部分,数据通讯负责数据收发和处理,VAPS 主要用于画面显示部分的开发,并且采用nCOM 交互数据,在使用时通过构建数据描述文件(Data Description File, DD)将接收的通讯数据按照VAPS 规定的使用格式进行处理,从而在VAPS 工程中关联画面数据来驱动画面的动态显示。
图1: 机载显控软件架构
VAPS 进行画面开发分为3 个步骤。
2.1.1 构建图形符号形成图形符号库
使用VAPS 中包含的图形、字符、仪表、数据和计算控件进行HMI 的图形化开发,将这些基本图元部件按需求组合,通过建立图形符号对象的输入输出,关联内部控制逻辑,形成更复杂的图形符号;设计好的图形符号保存在图形符号库内,为画面显示的开发实现提供支持,使构成的整个画面更加规范。
2.1.2 实现画面布局和内部逻辑
在VAPS XT 中新建一个Format 对象,根据设计需求,从图形符号库选取合适的图形符号,合理对图形符号分配位置和配置属性,完成整个画面布局,通过数据流(Data Flow)中使用数值比较、逻辑判断等VAPS 提供的语句,对各个图符的输入输出数据进行处理,实现画面中图符的状态控制。
2.1.3 通信数据的I/O 处理
由于UA 端和CDS 端的硬件或者软件配置的不同(例如系统大小端序不同、结构体对齐方式不同等),nCom 提供DD 文件作为数据接口,通过构建Data Sender/Receiver 对象,实现应用间的通讯。CDS 端接收通讯数据并解析处理,解析后的数据以DD 的格式通过nCom 传递给构成画面的每个图符模型的参数,驱动画面中每个图符的显示。
2.2.1 代码控件实现
如表1 所示,在VAPS XT 中依次点击“File”、“NEW...”出 现 弹 窗,点 击 第 三 栏“Advanced Objects”,选择“Class”,设置名称“Name”和路径“Location”,点击“确定”,从而创建类,此时出现类定义窗口,根据要实现的需求选择基类,然后保存。
表1: 基类列表
在“Project View”中找到此工程,右键选择生成代码,生成框架代码,根据建立Class 工程时选择的路径,找到其make 文件下的sln 文件,使用Visual Studio 2010 开发工具打开。在目录中会生成三种分别以vxtCls*Plugin,vxtBaseCls*,vxtCls*命名的3 个类的文件,vxtCls*Plugin 为VAPS 图形设计界面上使用,在初始化、构建VAPS 属性设置栏等功能上需要调用其他2种类,vxtBaseCls*和vxtCls*类是设计界面和最终执行文件中需要的,其中vxtBaseCls*为vxtCls*的基类,主要进行获取属性信息、创建对象等一些操作。
我们需要在派生类vxtCls*中的各个函数中按需求编写相应功能,从而实现代码控件。如Calculator 类只需要在派生类vxtCls*中的函数s_vCalculate 中添加我们实现功能的代码,并在vUpdate 函数进行调用此函数即可;GrObject 类则需要在vDraw、pGetSelectObjet、vCalculateExtent 等函数中添加代码。
由于VAPS 没提供文本控件的相关的设计界面,如果设计文本类的代码控件,需要我们手动添加相关的类,因此创建GrObject 类,删除工程文件中生成的vxtBaseCls*和vxtCls*类文件,手动添加sqx*类和vxtCls*Plugin 类文件。如图2 所示。
图2: 文本控件工程目录
在实现文本控件的功能时,VAPS 底层开放了部分源码,并提供了文本编辑类sqxTextCommon 可以进行使用,它可编辑绘图的基本属性,如颜色、大小、对齐方式等等,我们可以通过从此类派生出子类,在子类中实现我们想要的功能,以供vxtCls*Plugin 类使用。下面以Calculator 类的文本控件“WideTextOut 控件”为例,实现一个计算输入字符串数据长度的功能,在vCalculateExtent 中加入计算文本的宽度和高度的代码,然后在vUpdateTextExtent 中调用vCalculateExtent,实现代码如下所示:
编写完文件后保存。我们需要分别编译StaticOGL、release 两个配置。StaticOGL 会编译出.lib文件,给window 下的工程文件链接使用;release 会编译出.dll 文件,供VAPS 设计界面使用,给开发人员在设计时提供预览功能。编译需要新建bat 文件并运行,bat 文件内容如下所示:
编译生成的控件“WideTextOut”相比VAPS 自带的基础控件“WideText”,复用其全部属性并多生成两个Float 类型的输出属性,分别为文本宽度(TextWidth)和文本高度(TextHeight),在使用VAPS 绘制特定场景下不定长的显示文本时,便可应用该代码控件,实现对文本长度和宽度的控制,达到预期的显示效果。如表2 所示。
表2: WideTextOut 控件属性列表
2.2.2 代码控件应用
基于代码控件的实现,我们可以在开发过程中实现更多的功能。在这里以一个示例进行阐述:需要在画面中设计一个滚动标语进行循环滚动显示UA 端发送的提示信息。在VAPS 的基础控件不具备获取传入变长字符串长度的情况下,无法控制滚动标语的匀速运行,从而影响观感,因此需要运用前面描述的文本控件,将UA端传输至CDS 端的字符串数据的长度获取,作为一个输出值供设计滚动标语的控件使用。
在VAPS XT 中依次点击“File”、“NEW...”,选择第一栏“Objects”中的“Graphical Object”,生成一个未添加任何属性的“滚动标语控件(Rolltitles 控件)”,在“Properties”界面根据设计需求添加属性如表3 所示。
表3: Rolltitles 控件属性列表
设置好属性后,在“Implementation View”窗口依次拖入VAPS 工具自带的对象“RectWidthHeight”、“StencilGroup”、“SignalGenerator”、“sliderHoriz”以及刚刚生成的控件“WideTextOut”。了解它们的作用:“RectWidthHeight”设置文本显示的窗口大小并提供给“StencilGroup”,“StencilGroup”将超出窗口大小的显示内容剪切掉,“sliderHoriz”控制整个文本在设置的窗口内进行滚动,“SignalGenerator”用于计算和控制每次文本滚动的运动频率,“WideTextOut”负责给“SignalGenerator”输入文本长宽。如图3 所示。
图3: 模型视图
设置数据流(Data Flow)关联以上各个对象,然后“Rolltitles 控件”将设置的字符大小属性和UA 端发送的字符串传入WideTextOut 控件,WideTextOut 控件通过代码实现字符串长度的获取,结合字符大小计算出整个标语的长度,再作为TextHeight 属性通过数据流(Data Flow)关联给Rolltitles 控件,如此便可以将其用于SignalGenerator 的value 值计算,控制滚动的速率保持稳定。如图4 所示。
图4: 数据流控制
完成全部数据流(Data Flow)的设置,Rolltitles 控件至此就完成了设计,可以拖动到画面需要显示的位置,通过关联外部DD 数据或者直接输入字符串进行使用,点击“play”能够预览运行效果。如图5 所示。
图5: Rolltitles 控件的使用
代码控件在机载显控软件开发的应用,已得到充分的验证,其“基于模型”和“基于代码”的组合使用,使得生成的代码控件较之基础控件可以更全能的应用于图符图表设计,降低了开发难度和维护成本,提升了功能实现的便捷性,同时也给自定义图符图表控件增加了扩展性,可以用更直观更全面的方式呈现画面,进而提高飞行员的工作效率和飞行安全性。