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. (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