Generic protocol: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
(minor formatting)
m (Robot: Cosmetic changes)
Line 1: Line 1:
The ''generic'' communication protocol for FlightGear provides a powerful way of adding a simple ASCII based or binary input/output protocol, just by defining an XML encoded configuration file and placing it in the [[$FG_ROOT]]/Protocol/ directory.
The ''generic'' communication protocol for FlightGear provides a powerful way of adding a simple ASCII based or binary input/output protocol, just by defining an XML encoded configuration file and placing it in the [[$FG ROOT]]/Protocol/ directory.


==XML File Layout==
== XML File Layout ==


A protocol file can contain either or both of '''<input>''' and '''<output>''' definition blocks. Which one is used depends on how the protocol is called. The following example would only use the <output> definitions block.
A protocol file can contain either or both of '''<input>''' and '''<output>''' definition blocks. Which one is used depends on how the protocol is called. The following example would only use the <output> definitions block.
Line 40: Line 40:
  </PropertyList>
  </PropertyList>


==Input/Output Parameters ==
== Input/Output Parameters ==


Both '''<input>''' and '''<input>''' blocks can contain information about the data mode (ascii/binary) and about separators between fields and data sets, as well as a list of '''<chunk>'''s. Each '''<chunk>''' defines a property that should be written (and how), or a variable and which property it should be written to.
Both '''<input>''' and '''<input>''' blocks can contain information about the data mode (ascii/binary) and about separators between fields and data sets, as well as a list of '''<chunk>'''s. Each '''<chunk>''' defines a property that should be written (and how), or a variable and which property it should be written to.


====ASCII protocol parameters====
==== ASCII protocol parameters ====


Output only:
Output only:
Line 75: Line 75:




====Binary protocol parameters====
==== Binary protocol parameters ====


To enable binary mode, simply include a '''<binary_mode>true</binary_mode>''' tag in your XML file. The format of the binary output is tightly packed, with 1 byte for bool, 4 bytes for int, and 8 bytes for double. At this time, strings are not supported. A configurable footer at the end of each "line" or packet of binary output can be added using the '''<binary_footer>''' tag. Options include the length of the packet, a magic number to simplify decoding. Examples:
To enable binary mode, simply include a '''<binary_mode>true</binary_mode>''' tag in your XML file. The format of the binary output is tightly packed, with 1 byte for bool, 4 bytes for int, and 8 bytes for double. At this time, strings are not supported. A configurable footer at the end of each "line" or packet of binary output can be added using the '''<binary_footer>''' tag. Options include the length of the packet, a magic number to simplify decoding. Examples:
Line 82: Line 82:
   <binary_footer>none</binary_footer>                <!-- default -->
   <binary_footer>none</binary_footer>                <!-- default -->


==Variable Parameters - <chunk> spec==
== Variable Parameters - <chunk> spec ==


Both <input> and <output> block can contain a list of <chunk> specs, each of which describes the properties of on variable to write/read.
Both <input> and <output> block can contain a list of <chunk> specs, each of which describes the properties of on variable to write/read.
=====<name>=====
===== <name> =====
For ease of use and not tranferred (like a notes tag)
For ease of use and not tranferred (like a notes tag)


=====<node>=====
===== <node> =====
The [[Property_Tree|property tree]] node which provides the data
The [[Property Tree|property tree]] node which provides the data


=====<type>=====
===== <type> =====
The value type which is needed for formatting, one of string, float, bool, int (default: int). Its recommended that this tag is present otherwise spurious results can occur.
The value type which is needed for formatting, one of string, float, bool, int (default: int). Its recommended that this tag is present otherwise spurious results can occur.


=====<format>=====
===== <format> =====
ASCII protocol only, not used or needed in binary mode. Defines the actual piece of text which should be sent. it can include "printf" style formatting options like:
ASCII protocol only, not used or needed in binary mode. Defines the actual piece of text which should be sent. it can include "printf" style formatting options like:
             <type>
             <type>
     %s      string
     %s      string
Line 101: Line 101:
     %f      float
     %f      float


=====<factor>=====
===== <factor> =====
An optional multiplication factor which can be used for unit conversion, for example, radians to degrees.
An optional multiplication factor which can be used for unit conversion, for example, radians to degrees.


=====<offset>=====
===== <offset> =====
An optional offset which can be used for unit conversion, for example, degrees Celcius to degrees Fahrenheit.
An optional offset which can be used for unit conversion, for example, degrees Celcius to degrees Fahrenheit.


====<format>====
==== <format> ====
Chunks can also consist of a single constant <format>, like in:
Chunks can also consist of a single constant <format>, like in:
  <format>Data Section</format>
  <format>Data Section</format>




==Examples==
== Examples ==
====Example 1====
==== Example 1 ====
Writes log of this form:
Writes log of this form:
  V=16
  V=16
Line 157: Line 157:


===Writing data in XML format====
===Writing data in XML format====
Assuming the file is called [[$FG_ROOT]]/Protocol/xmltest.xml, then it could be used as  
Assuming the file is called [[$FG ROOT]]/Protocol/xmltest.xml, then it could be used as  
  fgfs --generic=file,out,1,/tmp/data.xml,xmltest
  fgfs --generic=file,out,1,/tmp/data.xml,xmltest


Line 195: Line 195:




==Analyzing the resulting binary packet format==
== Analyzing the resulting binary packet format ==
A utility called ''generic-protocol-analyse'' can be found under FlightGear/utils/xmlgrep which can be used to analyze the resulting data packet for the binary protocol. The output would be something like:
A utility called ''generic-protocol-analyse'' can be found under FlightGear/utils/xmlgrep which can be used to analyze the resulting data packet for the binary protocol. The output would be something like:
<pre>
<pre>
Line 212: Line 212:
</pre>
</pre>


==Links==
== Links ==
* Sourced from [http://cvs.flightgear.org/viewvc/source/docs-mini/README.protocol?view=markup source/docs-mini/README.protocol]
* Sourced from [http://cvs.flightgear.org/viewvc/source/docs-mini/README.protocol?view=markup source/docs-mini/README.protocol]

Revision as of 18:02, 8 March 2011

The generic communication protocol for FlightGear provides a powerful way of adding a simple ASCII based or binary input/output protocol, just by defining an XML encoded configuration file and placing it in the $FG ROOT/Protocol/ directory.

XML File Layout

A protocol file can contain either or both of <input> and <output> definition blocks. Which one is used depends on how the protocol is called. The following example would only use the <output> definitions block.

--generic=file,out,1,/tmp/data.xml,myproto

Overview of the XML file

<?xml version="1.0"?>
<PropertyList>
   <generic>

       <output>
           <binary_mode>false</binary_mode>
           <line_separator></line_separator>
           <var_separator></var_separator>
           <preamble></preamble>
           <postamble></postamble>

           <chunk>
               ... first chunk spec ...
           </chunk>

           <chunk>
               ... another chunk etc. ...
           </chunk>
       </output>

       <input>
           <line_separator></line_separator>
           <var_separator></var_separator>

           <chunk>
               ... chunk spec ...
           </chunk>
       </input>

   </generic>
</PropertyList>

Input/Output Parameters

Both <input> and <input> blocks can contain information about the data mode (ascii/binary) and about separators between fields and data sets, as well as a list of <chunk>s. Each <chunk> defines a property that should be written (and how), or a variable and which property it should be written to.

ASCII protocol parameters

Output only:

<preamble>        STRING  default: ""    file header put on top of the file
<postamble>       STRING  default: ""    file footer put at the end of the file

Input & Output:

<binary_mode>	    BOOL    default: false (= ASCII mode)
<var_separator>   STRING  default: ""    field separator
<line_separator>  STRING  default: ""    separator between data sets
  • <var_separator> is put between every two output properties
  • <line_separator> is put at the end of each data set.

Both can contain arbitrary strings or one of the following keywords:

 Name             Character
------------------------------
 newline          '\n'
 tab              '\t'
 formfeed         '\f'
 carriagereturn   '\r'
 verticaltab      '\v'

Typical use could be:

<var_separator>tab</var_separator>
<line_separator>newline</var_separator>

or

<var_separator>\t</var_separator>
<line_separator>\r\n</line_separator>


Binary protocol parameters

To enable binary mode, simply include a <binary_mode>true</binary_mode> tag in your XML file. The format of the binary output is tightly packed, with 1 byte for bool, 4 bytes for int, and 8 bytes for double. At this time, strings are not supported. A configurable footer at the end of each "line" or packet of binary output can be added using the <binary_footer> tag. Options include the length of the packet, a magic number to simplify decoding. Examples:

 <binary_footer>magic,0x12345678</binary_footer>
 <binary_footer>length</binary_footer>
 <binary_footer>none</binary_footer>                 

Variable Parameters - <chunk> spec

Both <input> and <output> block can contain a list of <chunk> specs, each of which describes the properties of on variable to write/read.

<name>

For ease of use and not tranferred (like a notes tag)

<node>

The property tree node which provides the data

<type>

The value type which is needed for formatting, one of string, float, bool, int (default: int). Its recommended that this tag is present otherwise spurious results can occur.

<format>

ASCII protocol only, not used or needed in binary mode. Defines the actual piece of text which should be sent. it can include "printf" style formatting options like:

           <type>
   %s      string
   %d      integer (default)
   %f      float
<factor>

An optional multiplication factor which can be used for unit conversion, for example, radians to degrees.

<offset>

An optional offset which can be used for unit conversion, for example, degrees Celcius to degrees Fahrenheit.

<format>

Chunks can also consist of a single constant <format>, like in:

<format>Data Section</format>


Examples

Example 1

Writes log of this form:

V=16
H=3.590505
P=3.59
V=12
H=3.589020
P=3.59


<?xml version="1.0"?> 
<PropertyList>
<generic>

   <output>
     <line_separator>newline</line_separator>
     <var_separator>newline</var_separator>
     <binary_mode>false</binary_mode>

     <chunk>
       <name>speed</name>
       <format>V=%d</format>
       <node>/velocities/airspeed-kt</node>
     </chunk>

     <chunk>
       <name>heading (rad)</name>
       <format>H=%.6f</format>
       <type>float</type>
       <node>/orientation/heading-deg</node>
       <factor>0.0174532925199433</factor>  
     </chunk>

     <chunk>
       <name>pitch angle (deg)</name>
       <format>P=%03.2f</format>
       <node>/orientation/pitch-deg</node>
     </chunk>
  </output>

</generic>
</PropertyList>

Writing data in XML format=

Assuming the file is called $FG ROOT/Protocol/xmltest.xml, then it could be used as

fgfs --generic=file,out,1,/tmp/data.xml,xmltest


<?xml version="1.0"?>
<PropertyList>
 <generic>
   <output>
     <binary_mode>false</binary_mode>
     <var_separator>\n</var_separator>
     <line_separator>\n</line_separator>
     <preamble><?xml version="1.0"?>\n\n<data>\n</preamble>
     <postamble></data>\n</postamble>

     <chunk>
       <format>\t<set></format>
     </chunk>

     <chunk>
       <node>/position/altitude-ft</node>
       <type>float</type>
       <format>\t\t<altitude-ft>%.8f</altitude-ft></format>
     </chunk>

     <chunk>
       <node>/velocities/airspeed-kt</node>
       <type>float</type>
       <format>\t\t<airspeed-kt>%.8f</airspeed-kt></format>
     </chunk>

     <chunk>
       <format>\t</set></format>
     </chunk>
   </output>
</generic>
</PropertyList>


Analyzing the resulting binary packet format

A utility called generic-protocol-analyse can be found under FlightGear/utils/xmlgrep which can be used to analyze the resulting data packet for the binary protocol. The output would be something like:

bintest.xml
Generic binary output protocol packet description:

 pos | size |  type  | factor     | description
-----|------|--------|------------|------------------------
   0 |    4 |    int |            | indicated speed (kt)
   4 |    4 |  float |            | pitch att (deg)
   8 |    4 |  float |            | magnetic heading (deg)
  12 |    4 |    int |            | outside air temperarure (degF)
  16 |    1 |   bool |            | autocoord

total package size: 17 bytes

Links