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.
== file layout ================================================================
A protocol file can contain either or both of and
definition blocks. Which one is used depends on how the protocol
is called (e.g. --generic=file,out,1,/tmp/data.xml,myproto would
only use the definitions block).
false
... first chunk spec ...
... another chunk etc. ...
... chunk spec ...
== input/output parameters ====================================================
Both and blocks can contain information about
the data mode (ascii/binary) and about separators between fields
and data sets, as well as a list of s. Each 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:
STRING default: "" file header put on top of the file
STRING default: "" file footer put at the end of the file
input & output:
BOOL default: false (= ASCII mode)
STRING default: "" field separator
STRING default: "" separator between data sets
are put between every two output properties, while
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:
tab
newline
or
\t
\r\n
--- Binary protocol parameters ---
To enable binary mode, simply include a true 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 tag. Options include the length
of the packet, a magic number to simplify decoding. Examples:
magic,0x12345678
length
none
== variable parameters (chunk spec) ===========================================
Both and block can contain a list of specs,
each of which describes the properties of on variable to write/read.
for ease of use (not tranferred)
the property tree node which provides the data
the value type (needed for formatting)
one of string, float, bool, int (default: int)
(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:
%s string
%d integer (default)
%f float
an optional multiplication factor which can be used for
unit conversion. (for example, radians to degrees).
an optional offset which can be used for unit conversion.
(for example, degrees Celcius to degrees Fahrenheit).
For input chunks there exist some more options:
optional boolean parameter to enable handling of incoming values
as relative changes (default: false)
(Can be eg. used to realise up/down buttons by just sending 1 or
-1 respectively)
an optional minimum limit for the value to be clamped to. This
limit is always specified as absolute value, also with relative
changes enabled. (default: 0)
an optional upper limit for the input value to be clamped to. If
equals no limit is applied. (default: 0)
instead of clamping to minimum and maximum limits, wrap values
around. Values will be in [min, max[ (default: false)
(Usefull for eg. heading selector to start again with 1 for
values higher than 360)
, , and are only used for numeric data types. can
additionally be used with type 'bool', where it toggles the value, if the received
value evaluates to 'true', otherwise the value is left unchanged.
Chunks can also consist of a single constant , like in:
Data Section
== examples ===================================================================
Writes log of this form:
V=16
H=3.590505
P=3.59
V=12
H=3.589020
P=3.59
newline
newline
false
speed
V=%d
/velocities/airspeed-kt
heading (rad)
H=%.6f
float
/orientation/heading-deg
0.0174532925199433
pitch angle (deg)
P=%03.2f
/orientation/pitch-deg
Control the heading bug by sending relative changes separated by newlines:
newline
heading bug
int
/autopilot/settings/heading-bug-deg
true
1
360
true
-- writing data in XML syntax -------------------------------------------------
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
false
\n
\n
<?xml version="1.0"?>\n\n<data>\n
</data>\n
\t<set>
/position/altitude-ft
float
\t\t<altitude-ft>%.8f</altitude-ft>
/velocities/airspeed-kt
float
\t\t<airspeed-kt>%.8f</airspeed-kt>
\t</set>
-- 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