options are configured at runtime via command line options. You can
specify multiple entries if you like, one per command line option.
+
The general form of the command line option is as follows:
--protocol=medium,direction,hz,medium_options,...
hz = number of times to process channel per second (floating
point values are ok.
-Generic Communction:
+
+Generic Communication:
--generic=params
With this option it is possible to output a pre-configured
- ASCII string using a predefined seperator. The configuration is
- defined in an XML file located in the Protocol directiory of
+ ASCII string using a predefined separator. The configuration is
+ defined in an XML file located in the Protocol directory of
the base package.
params can be:
socket communication: socket,dir,hz,machine,port,style,protocol
output to a file: file,dir,hz,filename,protocol
-
- The confinfiguration file is defined as follows:
-
- <?xml version="1.0"?>
- <PropertyList>
-
- <generic>
- <output>
- <seperator>\n</seperator>
-
- <chunk>
- <name>speed</name> <!-- for readabillity -->
- <type>int</type> <!-- one of: bool,int,float,string -->
- <format>V=%d</format> <!-- output format string -->
- <node>/velocities/speed</node> <!-- location of the value -->
- <offset>0.0</offset> <!-- add this to the value -->
- <factor>1.0</factor> <!-- multiply by this value -->
- </chunk>
-
- <chunk>
- ...
- </chunk>
-
- ...
-
- </output>
- </generic>
- </PropertyList>
+ See README.protocol for how to define a generic protocol.
Serial Port Communication:
--nmea=serial,out,0.5,COM1,4800
- Note that for unix varients you might use a device name like "/dev/ttyS0"
+ Note that for unix variants you might use a device name like "/dev/ttyS0"
+
Socket Communication:
When a value is displayed, you can click on it to bring up a form
to assign it a new value.
+
+
+ACMS flight data recorder playback
+
+ fgfs --fdm=acms --generic=file,in,1,<path_to_replay_file>,acms
+
The generic communication protocol for FlightGear provides a powerful way
-of adding a simple ASCII based or binary protocol, just by defining an
-XML encoded configuration file.
+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/data/Protocols/ directory.
-The definition of the protocol consists of variable separators, line separators,
-and chunks of text.
-Each chunk defines:
-<name> for ease of use
-<node> the property tree node which provides the data
-<type> the value type (needed for formatting)
-<format> defines the actual piece of text which should be sent.
- it can include formatting options like:
- <type>
- %s string
- %i integer (default)
- %f float
- (not used or needed in binary mode)
-<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 Celsius to degrees Fahrenheit).
+== 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 (e.g. --generic=file,out,1,/tmp/data.xml,myproto would
+only use the <output> definitions block).
-The output section also could define the variable separator and line separator.
+ <?xml version="1.0"?>
+ <PropertyList>
+ <generic>
-The separators can be either a control character such as a tab or newline, or a
-user specified string or other single character. The currently supported
-control characters are:
+ <output>
+ <binary_mode>false</binary_mode>
+ <line_separator></line_separator>
+ <var_separator></var_separator>
+ <preamble></preamble>
+ <postamble></postamble>
-<var_separator>:
-<line_separator>:
-Name Character
+ <chunk>
+ ... first chunk spec ...
+ </chunk>
-newline '\n'
-tab '\t'
-formfeed '\f'
-carriagereturn '\r'
-verticaltab '\v'
+ <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 <output> 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.
+
+output only:
+ <binary_mode> BOOL default: false (= ASCII mode)
+ <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:
+ <var_separator> STRING default: "" field separator
+ <line_separator> STRING default: "" separator between data sets
+
+
+<var_separator> are put between every two output properties, while
+<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>
-any other characters just need to be added to "Network/generic.cxx"
-The var_separator is placed between each variable, while the line_separator is
-placed at the end of each lot of variables.
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
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> <!-- default -->
+ <binary_footer>magic,0x12345678</binary_footer>
+ <binary_footer>length</binary_footer>
+ <binary_footer>none</binary_footer> <!-- default -->
+
+
+
+
+== 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 (not tranferred)
+ <node> the property tree node which provides the data
+ <type> the value type (needed for formatting)
+ one of string, float, bool, int (default: int)
+ <format> 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
+ (not used or needed in binary mode)
+
+ <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 to radians).
+
+
+Chunks can also consist of a single constant <format>, like in:
+
+
+
+
+== examples ===================================================================
+
+Writes log of this form:
+
+V=1736
+H=17647
+P=004.6
+V=1780
+H=18105
+P=006.4
+
-A simple protocol configuration file then could look something like the
-following:
<?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</name>
- <format>H=%02d</format>
- <node>/orientation/heading-deg</node>
- <factor>57.29578</factor> <!-- radians to degrees -->
- </chunk>
-
- <chunk>
- <name>pitch angle</name>
- <format>P=%05.1f</format>
- <type>float</type>
- <node>/orientation/pitch-deg</node>
- </chunk>
+ <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> <!-- degrees to radians -->
+ </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 syntax -------------------------------------------------
+
+Assuming the file is called $FG_ROOT/Protocols/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>
+ <line_separator></line_separator>
+ <var_separator></var_separator>
+ <preamble><?xml version="1.0"?>\n\n<data>\n</preamble>
+ <postamble></data>\n</postamble>
+
+ <chunk>
+ <format>\t<set>\n</format>
+ </chunk>
+
+ <chunk>
+ <node>/position/altitude-ft</node>
+ <type>float</type>
+ <format>\t\t<altitude-ft>%.8f</altitude-ft>\n</format>
+ </chunk>
+
+ <chunk>
+ <node>/velocities/airspeed-kt</node>
+ <type>float</type>
+ <format>\t\t<airspeed-kt>%.8f</airspeed-kt>\n</format>
+ </chunk>
+
+ <chunk>
+ <format>\t</set>\n</format>
+ </chunk>
+ </output>
+ </generic>
</PropertyList>
+
+