Wednesday, 30 December 2009

An ARINC 661 tutorial: Hello World

After the general overview and an architecture presentation, this is the third post about the ARINC 661 standard.

Let's continue by a little Hello World. Following the tradition, we will want to show a "Hello World!" label. But to make this example a little more interesting, we will put it in a container.

You should remember that all graphic stuff in ARINC 661 is performed in the CDS side (the ARINC 661 Server). Also the definition of the GUI is stored in a Definition File (DF) which is used by the CDS at initialization. There are two "flavors" of DFs: The binary version (which was the only one which was defined at the beginning of the standard), and the XML version, which was mainly devised to simplify Definition File editing (but as all the informations provided in the binary DFs are also there in the XML DFs, nothing prevent to use them also in a ARINC 661 Server).

We will probably cover binary DFs in another part of this tutorial, but for now, we will use XML Definition Files to explain how the standard works.

So are you ready. Let's dive into our first ARINC 661 Definition File guys!

It's a simple Hello World so we will only define one very simple DF. OK, let's go:

<?xml version="1.0"?>
<!DOCTYPE a661_df SYSTEM "a661.dtd">
<a661_df library_version="0" supp_version="2">
<model>
<prop name="ApplicationId" value="1"/>
</model>
<a661_layer>
<model>
<prop name="LayerId" value="5"/>
<prop name="ContextNumber" value="0"/>
<prop name="Height" value="10000"/>
<prop name="Width" value="10000"/>
</model>
<a661_widget name="SamplePanel" type="A661_PANEL">
<model>
<prop name="WidgetIdent" value="1"/>
<prop name="Enable" value="A661_TRUE"/>
<prop name="Visible" value="A661_TRUE"/>
<prop name="PosX" value="0"/>
<prop name="PosY" value="0"/>
<prop name="SizeX" value="10000"/>
<prop name="SizeY" value="10000"/>
<prop name="StyleSet" value="STYLESET_DEFAULT"/>
</model>
<a661_widget name="Hello World Label" type="A661_LABEL">
<model>
<prop name="WidgetIdent" value="2"/>
<prop name="Anonymous" value="A661_FALSE"/>
<prop name="Visible" value="A661_TRUE"/>
<prop name="PosX" value="5000" />
<prop name="PosY" value="5000" />
<prop name="SizeX" value="1500" />
<prop name="SizeY" value="1000" />
<prop name="StyleSet" value="STYLESET_DEFAULT" />
<prop name="MaxStringLength" value="20" />
<prop name="Alignment" value="A661_CENTER" />
<prop name="LabelString" value="Hello World!" />
<prop name="ColorIndex" value="black" />
<prop name="RotationAngle" value="0.0" />
<prop name="MotionAllowed" value="A661_TRUE" />
</model>
</a661_widget>
</a661_widget>
</a661_layer>
</a661_df>

OK, now lets go to the details.

<?xml version="1.0"?>
<!DOCTYPE a661_df SYSTEM "a661.dtd">

Well like all XML documents, it begins with the declaration of the DTD for ARINC 661. Nothing much to say here. Here the DTD is assumed to be in the file system, but there's nothing particular about the DTD declaration in the standard.

<a661_df library_version="0" supp_version="2">

The supplement (or release) version of the standard. Tne standard is currently at supplement 3. This allows to define for which version the DF was defined.

<model>
<prop name="ApplicationId" value="1"/>
</model>

The first interesting thing here. The ARINC 661 standard defines a concept of Applications, or User Applications (see the previous post). A User Application can send or receive messages to/from the Server. And there is a gold rule: Each Definition File defines widgets (I will explain how later in this post), but the widgets defined in this Definition File are managed by one Application only. That way, we are sure that will be no resource conflicts on who is able to change the state of a widget. This is an important feature which may simplify certification of an ARINC 661 Cockpit Display System, but also allows ARINC 661 implementation to live peacefully in the context of Integrated Modular Avionics (such as ARINC 653). So here we define the identification of the Application which will manage this Definition File content (of course an Application can manage more than one DF).

<a661_layer>
<model>
<prop name="LayerId" value="5"/>
<prop name="ContextNumber" value="0"/>
<prop name="Height" value="10000"/>
<prop name="Width" value="10000"/>
</model>

Here we have the declaration of a Layer, which is the top-most element in the ARINC 661 widget hierarchy. A Definition File contains one or more Layers, but a Layer is not a widget, which means that it is not possible to include a layer as a child of another. hmm almost but we will look after that later (in another post).
Height and Width are optional, because a Layer being not a Widget, defining its size is just a hint (in the XML File, it may be used by for editors). The ContextNumber is something used in runtime, we will also left it in another post.

<a661_widget name="SamplePanel" type="A661_PANEL">
<model>
<prop name="WidgetIdent" value="1"/>
<prop name="Enable" value="A661_TRUE"/>
<prop name="Visible" value="A661_TRUE"/>
<prop name="PosX" value="0"/>
<prop name="PosY" value="0"/>
<prop name="SizeX" value="10000"/>
<prop name="SizeY" value="10000"/>
<prop name="StyleSet" value="STYLESET_DEFAULT"/>
</model>

Our top-most widget in the Layer (we also can have more than one top-most elements in a Layer, we just chose here to have only one of them). For each widget declaration we have its name and most importantly, its type, here A661_PANEL. The widget type just points on one fixed widget type defined in the ARINC 661 Standard. A661_PANEL is a container which can have a Look and Feel. In fact it's exactly the ARINC 661 definition of a Panel.
Another very important part of each widget identify is its WidgetId, which must be unique for each Layer. Apart from this identification, our panel has a position and a Size
I know what question you will ask: all of this is very good, but were is its background color, its border color and all this stuff? Well Look and Feel is not in the Definition of the GUI, as in all well-defined widget toolkits. Unfortunately the standard does not standardize the Look and Feel definition itself.
Not completely. It allows to define the style of the widget, using a keyword or a number. That way, if you have defined elsewhere several styles for your widget, you can point to it in your Definition File, by using the property StyleSet.

<a661_widget name="Hello World Label" type="A661_LABEL">
<model>
<prop name="WidgetIdent" value="2"/>
<prop name="Anonymous" value="A661_FALSE"/>
<prop name="Visible" value="A661_TRUE"/>
<prop name="PosX" value="5000" />
<prop name="PosY" value="5000" />
<prop name="SizeX" value="1500" />
<prop name="SizeY" value="1000" />
<prop name="StyleSet" value="STYLESET_DEFAULT" />
<prop name="MaxStringLength" value="20" />
<prop name="Alignment" value="A661_CENTER" />
<prop name="LabelString" value="Hello World!" />
<prop name="ColorIndex" value="black" />
<prop name="RotationAngle" value="0.0" />
<prop name="MotionAllowed" value="A661_TRUE" />
</model>
</a661_widget>

After that it is very simple. You understand that the label (type: A661_LABEL of course) is a child of the A661_PANEL container. As was already the case for the StyleSet, the Font used to draw the label is a pointer to a Font resource defined elsewhere. The Alignment of the label use one of several already fixed enumeration values, but this should be straithforward. And MaxStringLength is something that will be useful at runtime. It defines the maximum number of characters that the label can accept (if modified by the User Application), and it ensures that no memory allocation will be necessary after the Server initialization (something not allowed in certified environments). ColorIndex and RotationAngle and MotionAllowed are also easy to understand.

Two last things to know: In ARINC 661, the reference point is at the bottom left corner, rather than at the two left as in other widget toolkits (or in OpenGL). So the Y axis goes up and not down. And all lengths are defined in 100th of millimeters rather than in pixels, which ensures that the definition will look the same on different monitors. Which is why you can see in this example rather big values for Widths and Heights.
And now a screen shot of the result with a Java-like Look & Feel for the panel:

Sunday, 20 December 2009

An ARINC 661 tutorial: architecture

Well I promised a second part in my first introductory blog to ARINC 661. That's it.
The following image is a a rough diagram on how ARINC 661 works at design time and at runtime:


  • The ARINC 661 Server (also called ARINC 661 Kernel), which is a part of the Cockpit Display System (CDS) is initialized with a set a ARINC 661 Definition Files. Remember that they are the equivalent of XUL or HTML Files, which means that the code of the Server is completely generic, and that any set of DFs can be used to start the Server. Hence the Server GUI code is not hard coded.

  • At runtime, the System Applications (called user Applications or UA in the standard) are able to communicate to the Server to change widget parameters that were created at initialization. From the other side, the Server send to the User Application user events on widgets (such as clicks on buttons, change of text fields, etc...)



The format of a Definition File is completely defined in the standard. The "base format" is binary based (for the computer savvy, with Big-Endian ordering, to be sure that it's the same in any architecture). But the standard also defines an XML format.

The low-level network communication is not defined by the standard (allowing to use any relevant network transport protocol, such as ARINC 429, AFDX, or even simpler protocols such as UDP or TCP. But the content of the messages send from/to the Server or the User Application are also formally defined by the standard.

This architecture allows for very cool things, which are new for avionics systems: It is possible to define a Cockpit GUI completely on standard PC hardware and OS, and even to test it (at least on the CDS side), and then deploy the GUI definition (the Definition Files) on the real avionics system without any change.

Thursday, 17 December 2009

An ARINC 661 tutorial: an introduction

For those of you who don't know what ARINC661 can mean (and I bet that's the majority of those who will read this post, if there are any of course), I suggest you go to the Wikipedia article for ARINC 661. As it is written:
ARINC 661 is a standard which aims to normalize the definition of a Cockpit Display System (CDS), and the communication between the CDS and User Applications (UA) which manage Aircraft avionics functions. The GUI definition is completely defined in binary Definition Files (DF).

The CDS software is constituted of a kernel which is able to create the GUI hierarchy specified in the DF during initialization, thus not needing to be recompiled if the GUI definition changes.


Which must trigger something for those of you who are familiar with HTML, or even better, familiar with XUL, the Mozilla declarative interface language.

XUL made it possible to define the user interface of Firefox once in a XML file and run Firefox on every possible platform, rather than having to hard-code it for each platform, which would have been extremely burdensome and error prone. Rather than that, the Mozilla people thought better. They defined a grammar to define generic UI components (panels, buttons, sliders, etc...), and only had to implement each of these small components on the different platform they wanted to support. Oh and the engine which could assemble these components together. Smart idea. You only have to look at how Firefox has become a reference in the browsers world.

Well in the case of XUL the engine which assemble the widgets is called Gecko, and each specific UI is defined in a XUL XML file (well you can do a lot more than that, like defining your own widget templates for example, but we don't need to look into all of this now).

Let's say that ARINC 661 uses a Definition File (DF), which is the equivalent of the XUL file, and the engine is called ARINC 661 kernel or CDS (Cockpit Display System).

Well there are some differences: As it is designed to be used in avionics, ARINC 661 is designed to work in real-time systems, and a CDS must be DO-178B compliant. For this reasons there are some major differences between languages such as XUL and ARINC 661.

But don't be upset by this disclaimer. At the core, these languages share a lot of similarities, and ARINC 661 is not overly complex at its core. Which does not mean that it does not have its own subtleties BTW.


I realize that this post is already too long for an introduction. Let's close it to say a few other things about this standard before delving into details:

  • ARINC 661 is an ARINC standard, used to standardize avionics concepts. Another very well know ARINC standard is ARINC 429, which is, as wikipedia says, the technical standard for the predominant avionics data bus used on most higher-end commercial and transport aircraft.

  • ARINC 661 is not an academic document. It was at the basis of the Airbus A380 Cockpit GUI development, and is also seemingly used for other Airbus aircrafts. It is also used by Boeing, for example for the 787 development

  • Last but not least, I am a member of the ARINC 661 committee



Stay connected and I hope that I will have time to draft the second part soon.