因为要写一个基于同步模型的显示模块编译工具,查了一下已有的异步规范。把规范囫囵吞枣地看了一遍,随手记一点东西:

ARINC 661规范也就是「驾驶舱显示系统人机接口规范」,规定了驾驶舱内显示系统(CDS)和功能部件(UA)之间的通信标准和一系列显示逻辑。其规定按照组件(Widgets)的层次进行显示,组件树组成一个层次(Layer),这也是对于一个UA而言,所能获取到的最高显示层。

CDS内核控制着GUI的渲染和运行,将物理显示设备分为一个个窗口(Window)显示,每个窗口显示一个或多个层次。CDS控制层次的可见性与活动,通过网络保持和管理层次的UA的通信。

ARINC的事件是异步的,但是UA可以定期更新其层次内各组件的参数,以根据后端数据修改其显示效果。当操作员引发事件之时,事件会单向地通知给UA。个人理解:在这个过程中,UA实际上是完全异步于CDS的。

组件的显示效果取决于编译时参数和运行时参数。所有决定组件所需内存大小的参数都必须在编译时给定。运行时参数由UA根据其后端操控,CDS负责更新显示。

组件树以及其他的一些信息,存储在定义文件(DF)里。DF有两种格式:二进制与XML。XML格式比二进制格式多出一些元信息,其具体语法从标准给的例子可见一斑:

<?xml version="1.0"?>
<!DOCTYPE a661_df SYSTEM "a661.dtd">
<a661_df library_version="0" supp_version="2">
<model>
<prop name="ApplicationId" value="0x6788"/>
</model>
<a661_layer>
<model>
<prop name="LayerId" value="66"/>
<prop name="ContextNumber" value="0x1230"/>
<prop name="Height" value="20000"/>
<prop name="Width" value="20000"/>
</model>
<a661_widget name="CabinTempPanel" type="A661_PANEL">
<model>
<prop name="WidgetId" value="4641"/>
<prop name="PosX" value="11000"/>
<prop name="PosY" value="12700"/>
<prop name="SizeX" value="7620"/>
<prop name="SizeY" value="5978"/>
</model>
<a661_widget name="TemperatureCelciusScale" type="A661_PICTURE">
<model>
<prop name="WidgetId" value="4642"/>
<prop name="PosX" value="750"/>
<prop name="PosY" value="2390"/>
<prop name="SizeX" value="6126"/>
<prop name="SizeY" value="2490"/>
<prop name="PictureRef" value="SymbolTemperatureCelciusScale"/>
</model>
</a661_widget>
<a661_widget name="TemperatureIndicatedPointer" type="A661_SYMBOL">
<model>
<prop name="WidgetId" value="4643"/>
<prop name="PosX" value="3810" />
<prop name="PosY" value="2390" />
<prop name="RotationAngle" value="9100" />
<prop name="StyleSet" value="OEM_STYLESET_FREE_COLOR" />
<prop name="ColorIndex" value="OEM_WHITE" />
<prop name="PictureReference" value="SymbolTemperatureIndicatedPointer" />
</model>
</a661_widget>
<a661_widget name="TemperatureSelectedPointer" type="A661_SYMBOL">
<model>
<prop name="WidgetId" value="4644"/>
<prop name="PosX" value="3810" />
<prop name="PosY" value="2390" />
<prop name="RotationAngle" value="1820" />
<prop name="StyleSet" value="OEM_STYLESET_FREE_COLOR" />
<prop name="ColorIndex" value="OEM_GREEN4" />
<prop name="PictureReference" value="SymbolTemperatureSelectedPointer" />
</model>
</a661_widget>
<a661_widget name="IndicatedTempDRO" type="A661_LABEL">
<model>
<prop name="WidgetId" value="4645"/>
<prop name="PosX" value="2864" />
<prop name="PosY" value="1768" />
<prop name="SizeX" value="950" />
<prop name="SizeY" value="622" />
<prop name="StyleSet" value="OEM_STYLESET_NORMAL_READOUT" />
<prop name="Font" value="OEM_STYLESET_DEFAULT_FONT" />
<prop name="MaxStringLength" value="4" />
<prop name="Alignment" value="A661_RIGHT" />
<prop name="LabelString" value="24" />
</model>
</a661_widget>
<a661_widget name="IndicatedUnitLabel" type="A661_LABEL">
<model>
<prop name="WidgetId" value="4645"/>
<prop name="PosX" value="3984" />
<prop name="PosY" value="1768" />
<prop name="SizeX" value="473" />
<prop name="SizeY" value="622" />
<prop name="StyleSet" value="OEM_STYLESET_NORMAL_READOUT" />
<prop name="Font" value="OEM_STYLESET_DEFAULT_FONT" />
<prop name="MaxStringLength" value="2" />
<prop name="LabelString" value="°C" />
</model>
</a661_widget>
<a661_widget name="IncreaseSelectTemp" type="A661_PICTURE_PUSH_BUTTON">
<model>
<prop name="WidgetId" value="4646"/>
<prop name="PosX" value="473" />
<prop name="PosY" value="473" />
<prop name="SizeX" value="2864" />
<prop name="SizeY" value="950" />
<prop name="PictureReference" value="SymbolArrowUp" />
</model>
</a661_widget>
<a661_widget name="DecreaseSelectTemp" type="A661_PICTURE_PUSH_BUTTON">
<model>
<prop name="WidgetId" value="4647"/>
<prop name="PosX" value="3984" />
<prop name="PosY" value="473" />
<prop name="SizeX" value="2864" />
<prop name="SizeY" value="950" />
<prop name="PictureReference" value="SymbolArrowDown" />
</model>
</a661_widget>
</a661_widget>
</a661_layer>
</a661_df>