APP下载

基于Zinc的雷达显控软件系统设计

2011-08-10

舰船电子对抗 2011年6期
关键词:管理器串口应用程序

周 芸

(船舶重工集团公司723所,扬州225001)

0 引 言

在雷达数据处理系统中,显控终端承担着雷达数据录取、目标显示、人机交互、控制雷达工作、对外接口通讯等多项任务,是整个系统的控制处理中心。随着现代雷达技术的迅速发展,对雷达显控终端的实时性、任务异步性提出了更高的要求。VxWorks操作系统因其多任务、强实时、可裁减、高可靠性等诸多独特优势而在实时显控设备这一信息吞吐量大、计算解算频繁、实时性要求高的平台上获得了开发者和设备使用者的广泛认可,但其图形界面显示相对薄弱,较普遍的用法是采用风河公司提供的WindML媒体库,其图形功能使用用户图形库(UGL)组件,代码繁琐,效率较低,开发高质量图形界面相当困难[1]。

Zinc是运行在VxWorks上的图形用户接口工具(GUI),它类似在Windows下使用VB可视化编程一样,用户可以实现“拖-放”式的“所见即所得”的图形界面设计,把设计者从大量编码的图形界面开发中解放出来,最大地简化了界面开发过程,而显控软件复杂的多任务实时并发处理则由VxWorks操作系统得到保证。Zinc的开发及运行环境如图1所示。

图1 Zinc开发及运行环境示意图

1 Zinc运行机制

Zinc的应用程序是在基于事件驱动(Eventdriven)的机制下运行的。输入设备和应用程序之间是通过事件相互作用的。Zinc的事件有3种来源:操作系统本身、外部设备和用户应用程序。例如键盘输入就是一个典型的外部设备输入事件。在Zinc应用程序运行过程中,事件管理器以轮询的方式接收类似键盘、鼠标等外部设备以中断驱动方式发出的数据信息,然后把这些信息对应的事件汇集起来,放进内部的事件队列等待下一步的处理。

在Zinc应用中,ZafApplication::Control()函数是主要的控制环,它通过调用ZafWindowManager::Get()例程从事件管理器中得到事件,并且在应用终止之前不断地把它们送到窗口管理器中。当事件传递到窗口管理器时,窗口管理器就会决定事件的最终目的地和正确路由,并正确地分派它们到相应的作用对象。首先,Event()方法调用最终的继承类,这个类可能是Zinc库中的类,或者是用户自定义的继承类,如果这个最终继承类并不处理事件,这个事件就会传递到其基类的Event()方法,这个处理可能一直进行到找到最终的基类ZafWindowObject,此基类收到事件,要么处理它,要么把它交给操作系统对象进行处理,如图2所示。

图2 Zinc的运行机制

2 Zinc工程开发

2.1 实例

某雷达显控终端界面是用Zinc设计实现的,终端界面上的元素复杂,但设计方法步骤相同,下面通过简单的示例来介绍Zinc的开发过程。这个例子创建1个串口接收窗口,在这个窗口中可以设置接收端口、波特率、控制位等,并且在对话框中显示接收到的数据,如图3所示。

图3 Zinc创建的串口接收窗口

设计步骤如下:

(1)步骤1:利用Zinc Designer设计窗口,生成.znc文件。

(2)步骤2:编辑视窗对象,设置对象属性。

在编辑窗口上,有1排Zinc对象工具栏,用户首先须选择一个窗口并放置,再在窗口上放置按钮或菜单等其他对象。以“设置串口”按钮为例,按下这个按扭后,将发送1个用户应用程序事件(自定义EVENT_CUSTOM_SET_PORT),用户可选择串口位置、波特率等信息来配置串口。设置这个按钮属性时,在“Send message”项的下拉菜单中选择“True”,在“Send message value”项中输入“10 005”(这是1个用户应用程序事件,其值应大于10 000),在“Send message text”项中输入“EVENT_CUSTOM_SET_PORT”。当应用程序运行后,用户点击这个按扭时就会向内部事件队列发送1个EVENT_CUSTOM_SET_PORT事件,经过窗口管理器的路由后,按照“设置串口”的Event()方法来实现串口设置。

(3)步骤3:生成源代码。

视窗对象编辑完成并保存example.znc文件后,选择“Generate Code”,它的任务是生成example.cpp文件、example.hpp文件和example.inc文件。用户在example.cpp文件中编写代码。example.inc是1个数据结构文件,存放了用户的数据列表、对象列表、用户函数列表等结构信息。

(4)步骤4:运行应用程序。

在Tornado下生成一个Download型工程,加载上面生成的3个文件,然后加入1个通用程序的入口文件v_app.cpp,编译后下载到目标机。程序在开始运行时,会寻找example.znc资源文件,事先必须把它存放在VxWorks的同一目录下。

3 显控软件设计

根据某工程对显控设备的具体要求,本应用软件采用模块化设计思想,划分为以下几个功能模块:任务管理模块、初始化模块、人机交互模块、图形显示模块、通讯模块、数据处理维护模块,而每个功能模块由一个或多个任务组成。人机界面布局上分为双页显示,主页面是雷达的PPI显示,雷达工作模式及参数信息显示,次页面显示雷达各分机的工作参数和自检信息。设计框图如图4。

图4 显控软件设计架构

3.1 设计难点1

设计中的难点1是非GUI任务与GUI任务之间的通讯

对于显控软件来说,双屏显示任务称为GUI任务,与图形绘制相关的操作都在这个任务中完成,而所有其他的任务称为非GUI任务。非GUI任务需要在不同的时期和GUI任务通信,而非GUI任务与GUI任务之间的通信方式将对整个软件系统的实时性、可靠性和稳定性产生影响。

Zinc主要提供了如下几种通信机制供程序员选择使用:Zinc入口点、共享内存、OS消息队列。

(1)Zinc入口点对Zinc来说,主要的通信入口函数是ZafEventManager::Put(),通过它可以把事件放到事件队列上,此方法属于异步方法。

(2)共享内存在VxWorks中,共享内存是容易实现的。为了安全地共享内存,最好给共享的内存分配1个信号量,这样就能防止共享内存被同时多次修改。共享内存的使用并不要求线程安全,但是对Zinc却是要求的,否则当1个窗口对象的成员指向共享内存时,1个异常就会发生。

(3)OS消息队列可以在Zinc中创建OS消息队列,利用消息队列实现从GUI任务到非GUI任务的通信,或者是从非GUI任务到GUI任务的通信,但不允许同时进行2个方向上的通信。

在显控软件中使用的是Zinc入口点方式。网络接收任务(非GUI任务)接收来自雷达内各分系统的资源数据,利用ZafEvenManager::Put()函数将其存放到事件队列中,GUI任务利用ZafApplication::Control()循环读取事件队列,进而窗口管理器决定事件的最终目的地和合适的路由并将其发送。

非GUI任务与GUI任务之间通信的实现主要包括如下几个方面:

(a)用户事件的定义

Zinc中的事件共分为7类,其中用户事件的取值范围为10 000~32 767。在显控软件系统中定义“刷新数据”用户事件为:

const ZafEventType EVENT_CUSTOM_SETTEXT=10011;

其中ZafEventType为Zinc事件类型。

(b)数据打包并发送用户事件

char*text= “hello”;//要刷新的文本“hello”

ZafEventStruct event(EVENT_CUSTOM_SETTEXT); //创建“刷新文本”事件

event.route=pMainWin;//事件路由的目标窗口

event.SetVoidData(text);//数据打包到事件中

zafApplication->EventManager()->Put(event);//发送事件

(c)用户事件的处理

ZafEventType MainWin::Event(const ZafE-ventStruct &event)

char*tmpText;

//判断是否是用户事件EVENT_CUSTOM_SETTEXT

if(event.type== EVENT_CUSTOM_SETTEXT)

tmpText= (char*)event.VoidData();

ProcessText(tmpText);//事件处理函数

else

/*处理其他事件*/

这样类似操作就能使界面的控件“活”起来。

3.2 设计难点2

设计中的难点2是多页显示技术。在人机界面上有时需要多页可切换的页面以增加显示信息容量,用Zinc设计显控界面时,在界面框架布局上设计合理就可以实现这项技术。

将应用程序对应的根窗口设计为主窗口(R),而显控界面的每个页面设计为子窗口(M,F),在子窗口上又可以添加各种类型的子子窗口(M1,M2,M3,…,F1,F2,F3,…),如图5所示。

图5 多窗口层次关系

这样在用Zinc Designer进行界面设计时初始化将子窗口M的属性设置为显示,子窗口F设置为隐藏,子子窗口 M1,M2,…,F1,F2,…的可视属性和其父窗口相同,这样在接收到外部的换页指令后,可以通过子窗口(M或F)的指针来调用SetVisible函数(参数true或false),可实现页面的显示或隐藏。

4 Zinc Designer与编写代码相结合设计界面

在Zinc中可以利用Zinc Designer来设计图形用户界面,实际上也可以直接写代码来绘制图形。就修改而言,窗口上的控件如果较多且较规则,用Zinc Designer设计时修改很方便。但要绘制一些不规则的复杂图形(如PPI显示)时当然要通过写代码来实现。实际应用中,最好将2种方法结合起来使用。

设计界面的步骤主要有:

(1)用Zinc Designer设计好界面,并产生代码。

(2)对界面上的对象根据需要定义相应的类,并对其中的成员函数编写代码。

另外,在Tornado安装目录下的\target\src\zinc\demos子目录中有Zinc提供的2种用法的例子,只要对其深入研究,定会开发出高质量的程序。

5 结束语

总之,Zinc是基于VxWorks强大的GUI开发工具。Zinc的类库及编程方法与MFC十分类似,有过MFC编程经验的人一定体会过MFC为Windows编程带来的方便,而Zinc堪称VxWorks上的MFC[2]。利用Zinc已经成功实现了在某型雷达终端上的图形界面设计,系统运行稳定且性能良好。

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

[2]侯俊杰.深入浅出MFC[M].武汉:华中科技大学出版社,2007.

猜你喜欢

管理器串口应用程序
基于NPORT的地面综合气象观测系统通信测试方法及故障处理
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
基于EM9000工控板高性能双串口通信模型设计与实现
删除Win10中自带的应用程序
Windows文件缓冲处理技术概述
谷歌禁止加密货币应用程序
船舶电子设备串口数据的软件共享方法
CSerialPort 类分析及漏洞的修正
三星电子将开设应用程序下载商店