APP下载

飞行仿真中基于嵌入式Qt的CDU仿真模块设计

2014-09-22顾宏斌

长沙航空职业技术学院学报 2014年2期
关键词:按键上位嵌入式

周 旋,顾宏斌

(南京航空航天大学民航学院,江苏 南京 211100)

控制显示组件(Control and Display Unit)是飞行管理系统中人机交互的重要部件,是飞行员在飞行训练中使用最多的模块。飞行员使用CDU完成建立飞行计划、修改航路、输入FMC数据、检索显示页面等飞行管理功能。因此,对CDU的仿真是整个飞行模拟系统不可或缺的部分[1]。

目前为止,在科研领域,对CDU的仿真主要停留在仿真CDU的按键输入和页面显示功能,而CDU显示的难点,其页面的生成,则使用第三方软件生成[2],或只仿真少部分页面[3],无法满足实验和仿真的需要。本文在基于嵌入式Linux的ARM平台下,选择Qt作为GUI开发工具。参考737NG系列的CDU,归纳了页面特性,用面向对象的思想封装各级页面,将各级页面的信息和逻辑关系以资源文件的形式的存储在SQLite数据库中,根据可修改的数据库信息生成CDU页面,实现页面显示功能和按键事件响应,简化了CDU页面的开发复杂度。并使用标准键盘,将标准按键映射为CDU按键[4],为开发1:1 CDU仿真按键做好准备。经测试,该方案可以方便地生成CDU页面,处理按键事件,并与上位机通信。在设计新型号CDU时只需修改数据库和新建页面变量即可生成新的页面,满足对不同种CDU快速开发的需要。

1 飞行仿真中CDU模块的功能

CDU是飞行管理计算机系统(Flight Management Computer System)的人机接口,通过CDU的键盘向FMCS输入飞行计划、性能数据、修改航路、检索各种页面信息(如导航数据、性能数据、咨询信息、故障情况、自检信息等)[1]。

在737NG系列飞机中,CDU负责页面显示与发送按键事件。其页面的切换与数据的处理都是由FMC处理。但是在飞行仿真中,为了使各部分功能模块化,方便分工合作,充分利用处理性能,将页面标题生成和显示,以及对按键事件的处理功能交给CDU仿真模块,而上位机只负责复杂的飞行计划的仿真。上位机与CDU仿真模块通过UDP/IP协议通信,CDU仿真模块将需处理的飞行数据发送给上位机,经上位机处理后发回,并在CDU仿真模块中显示。如图1所示。

图1 CDU仿真模块的构架

2 CDU仿真模块设计方案

在飞行管理计算系统的仿真中,CDU仿真模块负责的是页面显示输出功能。其显示功能,就是根据键盘的输入,改变页面信息或者切换页面,并将页面上的信息传输给上位机的飞行计划处理单元。因此,事实上CDU仿真模块主要处理的任务就是根据外部响应切换页面。实际的问题就转化为,搭建一个实现显示、按键输入、并与上位机通信的嵌入式系统。

本文使用嵌入式Linux操作系统+QtGui来搭建CDU仿真模块,Linux内核具有可裁剪的特性,可以裁剪不用的部分加快启动时间[5]。Qt是主流的GUI解决方案,有面向对象性强,跨平台的特点[6]。由于CDU的页面数量很大,使用SQLite数据库存储页面初始化信息。SQLite是主要面向嵌入式设备,拥有ODBC接口的轻量级数据库。在Qt中使用QtSQL可以方便地使用SQLite数据库功能[7]。

此外由于CDU按键功能的特殊性,可以将CDU功能按钮的使能信息放在数据库中。事实上,除了少部分特殊页面的特殊功能以外,大部分页面的初始化信息全部存储在数据库中,只需要更改数据库信息,就可以改变页面的文字信息。

3 CDU仿真模块的设计

CDU仿真模块主要功能有页面生成、显示,按键事件响应和网络通信的功能。在系统启动后,首先读取数据库,初始化页面,然后接收上位机飞行计划相关信息并显示,根据按键事件做出插入、复制数据等操作,在完成某些操作后将信息传输给上位机。CDU仿真模块流程如图2所示。

图2 CDU仿真模块流程

图3 页面系统

3.1 页面系统

搭建CDU仿真模块的关键在于:如何方便地生成大量的CDU页面;如何处理复杂的页面逻辑关系?使用面向对象的方法,总结归纳CDU页面的特性,归纳的程度越高,就越能简化每个独立页面所需的代码。

(1)页面的生成

真实CDU的任何页面系统都包含三个部分:页面的标题信息,页面数据,页面切换标识。其中,标题信息为小字显示,页面数据和页面逻辑为大字显示,如图3所示。

飞行仿真中,CDU仿真模块初始化页面标题信息和页面逻辑,页面数据由上位机处理生成并使用UDP传输给CDU仿真模块。在初始化过程中,把页面数据初始化为空字符,把它视作页面切换标识的子集。实际所有的页面数据都由CDU仿真模块初始化,在生成页面时可以忽略其区别,在之后在处理页面数据。

根据真实CDU显示特性,页面文字分为2类:小字体字符,包含页面标题信息[1];大字体字符,包括页面数据、页面标题和页面逻辑。

总结所有CDU页面的特点,可以发现小字体字符的位置不会变化,大字体字符有2种变化:左右分布或者左中右分布[1]。左右分布其实是左中右分布的特殊形式,即中间没有文字。把每组字符串视为单独的对象,创建继承QLabel类的QWord类,大字符为 QWordBig,小字体字符为 QWordS-mall。创建继承QWidget的QCDU类,作为CDU页面功能的基类,包含22个QWordBig类和12个QWordSmall类。参考真实CDU的显示特性,使用Qt的Layout排版,设置QwordBig分别左右对齐,中间对齐,并根据字符的长度自动调节QWordBig的长度,在填入初始化字符串后,该方案可以模拟所有的CDU页面。大字体字符串抽象图如图4所示。

图4 大字体字符串抽象图

(2)页面的切换

页面的存储使用Qt的堆栈功能,页面的切换则是使用了SQLite的查询功能。

虽然CDU的页面数量较大,但主要存储的是文字信息,实际占用的空间并不大。在CDU模块初始过程中,实际是初始化所有的QCDU对象。将所有的QCDU对象存储在QStackWidget堆栈中,每个对象获取唯一的堆栈号,并存储到数据库中,通过选择堆栈号,切换相应页面到前台。

真实CDU中,有3种方式切换页面:按下具有标准选择功能并对应行含有“<”或“>”字符的按键;按下功能按键;上下翻页键[1]。页面切换功能的实质是将行选键对应的字符与页面一一对应起来。为此,在后页的QCDU类中增加一组标识字符串,其表示标识为唯一,使之与前页字符串一一对应。当按下按键是,程序根据行选键对应的内容,搜索数据库,找到对应的堆栈号,使用QStack-Widget功能切换到指定页面。

如:真实CDU中,在位置起始页(POS INIT)中“ROUTE>”对应航路页(RTE)。因此,设置航路页的QCDU类的标识符为“ROUTE”。CDU仿真模块中,按下“ROUTE>”对应的行选键后,系统自动除去“>”符号,并在数据库中搜索“ROUTE”页面,搜索到RTE序号为5,使用QStackWidget类,切换显示到堆栈号为5的QCDU页面,即RTE,同时把便签栏数据复制到RTE中。

3.2 按键事件的处理

真实CDU一共有包括行选键、功能键、数字字母键在内的78个按键,仿真与实物的移植,提高仿真效果,订制与对应机型CDU在键盘大小,按键布局与按键功能一致的键盘。在程序中将键盘的输入映射为CDU按键,重新定义标准键盘的按键事件,如将F1~F6定义为左功能键。

功能键主要有12个快捷键,2个翻页键,1个执行键组成[1]。按下快捷键时调用QStackWidget,直接跳转到对应的页面。翻页键功能与之类似,配置QCDU加入堆栈时按页面排列,按下下一页按键时候当前页面序号+1,即转到下一页。按下执行键时检测上位机发送的使能变量,判断是否能够执行。

行选键是逻辑相对复杂的一种,每个功能键总计有5个功能,包括3个标准功能,2个非标准功能,其中非标准功能不常用[1]。将QCDU类作为基类,实现3个标准功能的处理函数,使用虚函数描述2个非标准功能,在子类中重写非标准功能处理函数。3个标准功能包括标准选择功能,标准输入功能,删除功能。标准输入功能和删除功能实际是QCDU类中22个QWord数据的交换。对于标准选择功能,需要对QWord中的字符串进行判断,在包含“>”或“<”进行页面切换,不含则与另两个标准功能类似,只进行页面内数据的交换。

虽然每个行选键在程序初始化时都有5个功能,但真实CDU系统中每个行选键都只拥有固定的几项功能,如起始位置检索页,该页中行选键都具有标准输入功能,而没有标准选择功能[1]。CDU仿真模块根据数据库中存储的信息使能行选键的功能,只需要修改数据库中的数据设置就能设置行选键的功能。

3.3 数据库的使用

如果将页面数据及页面逻辑信息都存储在程序中,不仅会使程序结构复杂,且扩大了程序的体积。并且由于CDU页面较多,当需要建立新页面时,要将页面标题数据全部输入,对于不熟悉程序源代码的人来说维护较为麻烦。因此,参照程序本体/资源文件模型,将页面中的标题数据和逻辑信息存储在资源文件中,在程序本体启动时读取资源文件,根据资源文件初始化。

资源文件是一种存储在硬盘中的文件,其中可以包含文字、位图、音频等信息。资源文件不需要经过编译,程序在初始化时通过特定的方式读取资源文件,并存储在内存中。使用资源文件可以减少主程序体积,在替换资源时不用重新编译程序,且不影响程序运行速度。为了方便资源文件的维护和扩展,使用SQLite数据库文件格式存储资源文件。

资源文件中存储的数据包括4个部分:

(1)页面标识名称(title)。对于每一个页面,使用一个唯一的字符型常量与其对应,称为页面标识。程序中使用该名称区分每个页面,确保页面变量能从资源文件中正确读取对应的信息。

(2)换页信息(pagename),该条目与页面逻辑有关。存储的文本用作检索名称,用于搜索

(3)行选键使能信息。决定了行选键的功能,为了方便维护,每个使能功能以可用位置的形式存储。如在位置起始页中,L2,L3,L5,L6,R4,R5 按键拥有标准输入功能,R1,R2,R3,R6拥有标准选择功能。在数据库存储方式为:fselect值为7,8,9,12。fenter值为 2,3,4,5,10,11。

(4)页面显示信息。即CDU页面显示的信息,参照实际CDU系统输入。

3.4 网络通信

由于嵌入式系统的处理能力较弱,CDU仿真模块主要处理的是页面的生成和按键事件的处理,负责较复杂运算的FMC的功能由上位机处理。由于传输距离很近,选择使用UDP/IP通信协议进行数据的传输。在CDU仿真模块页面初始化完成后,发送页面名称,请求上位机发送相应页面数据,根据机发送的信息显示页面数据。每当进行切换页面操作时,CDU仿真模块将页面标题、页面数据按顺序发送给上位机。

4 实验与验证

4.1 功能验证

打开CDU仿真模块,运行上位机,并填入页面数据。CDU进入IDENT(识别检索)页,页面的数据能完整显示。按下字母按键,便签栏数据改变。按下行选键6R,页面切换,进入POS INIT(位置初始化)页,所有数据正常显示。按下PageDown,进入POS REF页。按下行选键1L,数据被复制到便签栏中,如图5所示。

图5 实物展示

4.2 增加新页面测试

在已有页面基础上增加NAV DATA(导航数据页面)。由于NAV DATA没有非标准按键功能,直接使用QCdu类建立对象,插入堆栈。

QCdu*CduNavdata=new Cdu("NAV DATA");

insertcdu(CduNavdata);

数据库中新建NAV DATA元素见表1。

表1

5 结论

通过对真实CDU页面逻辑的分析,基于嵌入式Qt开发环境建立了可与上位机交互的CDU仿真模块。使用面向对象仿真技术和数据库抽象出页面显示特性和页面逻辑,简化了完整CDU模块的设计,为完全模拟CDU模块打下基础。使用标准键盘模拟按键输入,方便调试,并具有扩展性。实验结果表明,该方法能较好地模拟真实CDU的运行,并能减少CDU页面开发的开发量,适应于各种飞行仿真环境。

[1]钦庆生.飞行管理计算机系统[M].北京:国防工业出版社,1991.

[2]向明,马存宝.基于VAPS的FMS CDU实时仿真系统开发[J].计算机仿真,2006,(8).

[3]廖蜂,郑书朋,侯伟钦,等.一种高逼真度的控制显示组件仿真方法[J].计算机工程,2011,(4).

[4]陈又军.基于仿真硬件CDU的飞行管理系统训练器扩展研究[J].航空维修与工程,2009,(4).

[5]孙天泽.嵌入式Linux开发技术[M].北京:航空航天大学出版社,2011.

[6]蔡志明,卢传富,李立夏.精通Qt4编程[M].北京:电子工业出版社,2008.

[7]孙磊.基于ARM Linux的嵌入式数据库SQLite的移植开发[D].昆明:昆明理工大学,2008.

猜你喜欢

按键上位嵌入式
基于有限状态机的按键检测程序设计
按键消抖在单片机和FPGA实验教学中的应用
特斯拉 风云之老阿姨上位
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
“三扶”齐上位 决战必打赢
基于ZigBee和VC上位机的教室智能监测管理系统
一种多方向导光按键结构设计
以新思路促推现代农业上位
Altera加入嵌入式视觉联盟