QQ登录

只需一步,快速开始

楼主: 胡秀伟
打印 上一主题 下一主题

基于XML的系统配置及改进技术

  [复制链接]

主题

好友

462

积分

专业技术学员

21#
发表于 2012-4-13 22:18:01 |只看该作者
根据设定的位置,该设备在屏幕上的显示位置如图所示
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

22#
发表于 2012-4-13 22:18:16 |只看该作者
本帖最后由 胡秀伟 于 2012-4-13 22:19 编辑

图.............................

未命名12.JPG (6.39 KB, 下载次数: 610)

未命名12.JPG
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

23#
发表于 2012-4-13 22:19:54 |只看该作者
3.2.2显示格式设定
显示格式设定了该设备数据显示的格式,包括数据显示需要调用的程序函数、数据显示的最大刻度值和最小刻度值、数据显示的数值跨度、数据显示的最大刻度和最小刻度、过零显示等。其“树”结构如图所示
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

24#
发表于 2012-4-13 22:20:13 |只看该作者
本帖最后由 胡秀伟 于 2012-4-13 22:21 编辑

图,,,,,,,,,,,,,,,,,,,,,,,,

未命名13.JPG (16.36 KB, 下载次数: 646)

未命名13.JPG
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

25#
发表于 2012-4-13 22:22:36 |只看该作者
配置文件中<loadfn>节点规定了平显数据显示调用的函数。在描述座舱系统的程序 Cockpit中,建立如下一个通过字符串搜索调用函数的结构体,FlightGear 源程序通过解析 XML 文档可以获得该节点的值“heading”,通过该字符串指向调用函数,完成平显数据显示。
truct FuncTable {
const char *name;
FLTFNPTR func;
} fn_table[] = { { "heading", get_heading }……. }
平显中有部分变量默认使用的是英制单位,例如海拔高度(英尺)、空速(海里/时)等,这就给直观的读取飞行数据变量带来了一定的障碍。通过以上的流程可以发现,平显数据是在调用函数中完成的。例如描述海拔高度的函数 get_agl( ),其原型为:
agl = current_aircraft.fdm_state->get_Altitude( )
- current_aircraft.fdm_state->get_Runway_altitude( );
将英制单位转换为公制单位只需要进行单位转换即可达到在平显中显示公制单位的数据。修改如下:
agl = (current_aircraft.fdm_state->get_Altitude( )
-current_aircraft.fdm_state->get_Runway_altitude( ))* SG_FEET_TO_METER;
其中 SG_FEET_TO_METER 定义为 0.3048,表示 1 英尺=0.3048 米。
3.2.3图形显示设定
HUD 平显界面是由基本的矩形组成的,图形显示设定设备的矩形边框是否显示,从而完成设备的图形显示。图形显示设定的“树”形结构图如图所示
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

26#
发表于 2012-4-13 22:22:53 |只看该作者
图.........................

未命名14.JPG (13.6 KB, 下载次数: 606)

未命名14.JPG
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

27#
发表于 2012-4-13 22:24:03 |只看该作者
节点中的 Ticks 和 Caps 表示设备边框的显示。不同的设备的矩形框的区别在于显示时边框的圆缺不同。例如航向显示器,需要有左右边框和下边框,没有上边框,true 表示边框显示,false 则表示不显示边框。Tick 和 Cap 的具体显示位置如图所示。
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

28#
发表于 2012-4-13 22:24:22 |只看该作者
图.............................

未命名15.JPG (9.31 KB, 下载次数: 662)

未命名15.JPG
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

29#
发表于 2012-4-13 22:25:38 |只看该作者
4 XML 的改进
4.1 存在的不足与完善需求
FlightGear 飞行模拟器软件内部使用了大量的 XML 配置文件作为定义程序运行环境、外界数据(大气云层等),以及各类飞行器的参数定义等。可见基于 XML 的系统配置是 FlightGear软件定义环境的核心,也是保证 FlightGear 开源软件可以支持多平台的重要原因。但是由于FlightGear 飞行模拟器的开源性,导致其 XML 解析程序不够规范,例如在同一程序文件中,定义了几个不同的函数,却实现的是同一功能。XML 程序解析在 FlightGear 整体软件中有大量应用,不同的维护者利用自己封装的 C++函数去实现,显得程序十分庞大,杂乱无章,缺乏规范性。
鉴于FlightGear飞行模拟器在 XML 解析上存在的问题,可以利用全新的 XML 解析程序来替代 FlightGear 中原有的 XML 解析程序。对于全新的 XML 解析程序来说,需要满足以下几点需求:
1) 代码规模小,操作简单,内核轻便,便于多平台的移植;
2) 可以实现基本的 XML 配置文件操作,例如搜索节点、读取属性、保存节点值等;
3) 以标准 C 语言实现,程序书写规范, 体系结构完整。
miniXML 就是满足需求的一个解析 XML 文档的标准 C 语言库,它最初是 Robert为了 Gutenprint 项目而开发的,是一个操作更简单、内核更轻便的解析工具,它具有基本的配置文件操作,并且程序书写规范,体系结构完整,因此选择 miniXML 替代 FlightGear 内原有的解析 XML 模块。
4.2 miniXML 结构及解析流程
利用 VC++ 6.0 编译 miniXML 源码,生成静态链接库 mxml.lib。将 mxml.lib 和 mxml.h 文件拷贝到 FlightGear 的库目录下,在 FlightGear 的链接器属性中添加 mxml.lib,设置其路径,并在程序中需要包含以下头文件:
#include <mxml.h>
即可以在 FlightGear 软件体系中调用 miniXML 下的函数完成 XML 文档的解析。
在 miniXML 中使用 mxml_node_t 结构体对 XML 文档中的节点进行定义。其定义如下:
typedef struct mxml_node_s
{
mxml_type_t type; /* 节点类型 */
struct mxml_node_s *next; /* 同一父节点的下一个节点*/
struct mxml_node_s *prev; /* 同一父节点的上一个节点*/
struct mxml_node_s *parent; /* 父节点 */
struct mxml_node_s *child; /* 第一个子节点*/
struct mxml_node_s *last_child; /* 最后一个子节点 */
mxml_value_t value; /*节点值 */
} mxml_node_t;
Type 成员变量定义不同的节点类型(element, integer, opaque, real, text),可以在不同的节点类型的成员变量获取共用体类型的值(value)。miniXML 节点值的变量成员详见下表
miniXML 节点值的成员变量
回复

使用道具 举报

主题

好友

462

积分

专业技术学员

30#
发表于 2012-4-13 22:25:56 |只看该作者
本帖最后由 胡秀伟 于 2012-4-13 22:27 编辑

图......................................

未命名16.JPG (15.33 KB, 下载次数: 635)

未命名16.JPG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入FG

本版积分规则

手机版|联系我们| FlightGear ( 吉ICP备19002044号-7 )

GMT+8, 2024-4-26 03:08

Powered by Discuz! X3.2

© 2001-2013 FlightGear Inc.

返回顶部