Bindings: Difference between revisions

From FlightGear wiki
Jump to navigation Jump to search
m (→‎Related content: + Howto:Reassign keyboard bindings)
(Begin cleanup)
Line 1: Line 1:
{{Incomplete}}
'''Bindings''' define what happens when a user:
'''Bindings''' define what happens when a user:
* [[Howto: Make a clickable panel#Pick|clicks an object]] in the [[scenery]] or an [[aircraft]]
* [[Howto: Make a clickable panel|Clicks an object]] in the [[scenery]] or in an [[aircraft]].
* press a key on the keyboard or [[joystick]]
* Presses a key/button on the keyboard or [[joystick]].
* clicks a [[menu]] item
* Clicks a [[menu]] item
* click a buttons or fields in a dialog
* Interacts with a dialog
You can assign multiple bindings to one object/button/key. Each binding may contain one [[conditions|condition]] element to make it conditionally executed. Each binding must specify a command node with its particular type, see below.
You can assign multiple bindings to one object, button or key. Bindings may contain [[conditions]] to make them conditionally executed. Each binding must specify a command node with its particular type, see below.


This article gives a small overview of frequently used bindings. Please refer to <tt>[[$FG_ROOT]]/Docs/README.commands</tt> for additional information and a complete list of available bindings.
This article gives a small overview of frequently used bindings. Please refer to {{readme file|commands}} for additional information and a complete list of available bindings.


All given codes are examples, found on various places in the [[FlightGear]] package.
All given codes are examples, found on various places in the [[FlightGear]] package.


== Commands ==
== Commands ==
 
Below are a number of useful commands. See for the complete list, see {{flightgear file|src/Main/fg_commands.cxx|l=1425}}.  
Below are a number of useful commands. See further [http://mapserver.flightgear.org/git/?p=flightgear;a=blob;f=src/Main/fg_commands.cxx;h=4c3272916f56a3180e29b9d8457e697bb71cfecb;hb=HEAD#l1555 fg_commands.cxx].  


To learn more about adding your own custom fgcommands to the source code, see [[Howto:Add new fgcommands to FlightGear]]
To learn more about adding your own custom fgcommands to the source code, see [[Howto:Add new fgcommands to FlightGear]]
Line 20: Line 17:
=== dialog-close ===
=== dialog-close ===
Closes the active dialog.
Closes the active dialog.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>dialog-close</command>
  <command>dialog-close</command>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>


=== dialog-show ===
=== dialog-show ===
Shows a dialog, which should be present in <tt>[[$FG ROOT]]/gui/dialogs</tt>. Starting with FlightGear 2.7 dialog files located in <tt><Current aircraft directory>/gui/dialogs</tt> are also loaded. This should be used for dialogs specific to a certain aircraft.
Shows a dialog, which should be present in <tt>''[[$FG_ROOT]]/gui/dialogs''</tt>. Starting with FlightGear 2.7dialog files located in <tt>''<aircraft directory>/gui/dialogs''</tt> are also loaded. This should be used for dialogs specific to a certain aircraft.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>dialog-show</command>
  <command>dialog-show</command>
<dialog-name>location-in-air</dialog-name>
  <dialog-name>location-in-air</dialog-name>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 38: Line 35:
=== nasal ===
=== nasal ===
[[Nasal]] is frequently used for complicated systems, because it can execute virtually any function and allows running previously-defined Nasal functions.
[[Nasal]] is frequently used for complicated systems, because it can execute virtually any function and allows running previously-defined Nasal functions.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>nasal</command>
  <command>nasal</command>
<script>b777.afds.input(0,1);</script>
  <script>b777.afds.input(0,1);</script>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
The [[List of Nasal extension functions#cmdarg.28.29|cmdarg()]] function is often useful in these situations to extract offset values passed to the binding. It returns the specific <tt>&lt;binding&gt;</tt> node, which contains a <tt>&lt;setting&gt;</tt> node at runtime if used in a joystick axis that represents the value of that axis.
The {{func link|cmdarg}} function is often useful in these situations to extract offset values passed to the binding. It returns the specific <tt>&lt;binding&gt;</tt> node, which contains a <tt>&lt;setting&gt;</tt> node at runtime if used in a joystick axis that represents the value of that axis.


In joysticks and keyboard keys the script is run in a specific namespace; please refer to the documentation for what the namespace is.
In joysticks and keyboard keys the script is run in a specific namespace; please refer to the documentation for what the namespace is.
Line 50: Line 47:
=== property-adjust ===
=== property-adjust ===
Increases or decreases a property's value with a given step. Maximum and minimum values are optional.
Increases or decreases a property's value with a given step. Maximum and minimum values are optional.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-adjust</command>
  <command>property-adjust</command>
<property>/autopilot/settings/heading-bug-deg</property>
  <property>/autopilot/settings/heading-bug-deg</property>
<step>1</step>    <!-- will add 1 to /autopilot/settings/heading-bug-deg whenever this binding is called -->
  <step>1</step>    <!-- will add 1 to /autopilot/settings/heading-bug-deg whenever this binding is called -->
<min>000</min>    <!-- the property will never be allowed to go below 0 -->
  <min>000</min>    <!-- the property will never be allowed to go below 0 -->
<max>360</max>    <!-- ...or above 360 -->
  <max>360</max>    <!-- ...or above 360 -->
<wrap>true</wrap> <!-- when we hit 361, wrap back to 0 and vice-versa -->
  <wrap>true</wrap> <!-- when we hit 361, wrap back to 0 and vice-versa -->
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 63: Line 60:
=== property-assign ===
=== property-assign ===
One of the most important commands. It sets a property to a predefined value.
One of the most important commands. It sets a property to a predefined value.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-assign</command>
  <command>property-assign</command>
<property>/autopilot/settings/target-speed-kt</property>
  <property>/autopilot/settings/target-speed-kt</property>
<value>0</value>
  <value>0</value>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 73: Line 70:
=== property-cycle ===
=== property-cycle ===
Cycles between a list of values and assigns one to a property. The value-list can vary in length. If the current value is "value1", it will change to "value2"; if it is "value2", it will change to "value3", and so on, wrapping around the end.  If the current value is not in the list, it will jump to the first one.
Cycles between a list of values and assigns one to a property. The value-list can vary in length. If the current value is "value1", it will change to "value2"; if it is "value2", it will change to "value3", and so on, wrapping around the end.  If the current value is not in the list, it will jump to the first one.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-cycle</command>
  <command>property-cycle</command>
<property>/autopilot/autobrake/setting</property>
  <property>/autopilot/autobrake/setting</property>
<value type="string">ARM</value>
  <value type="string">ARM</value>
<value type="string">DISARM</value>
  <value type="string">DISARM</value>
<value type="string">OFF</value>
  <value type="string">OFF</value>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 88: Line 85:
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-interpolate</command>
  <command>property-interpolate</command>
<property>/controls/flight/aileron-trim</property>
  <property>/controls/flight/aileron-trim</property>
<value type="double">0</value>
  <value type="double">0</value>
<rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
  <rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 98: Line 95:
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-interpolate</command>
  <command>property-interpolate</command>
<property>/controls/flight/aileron-trim</property>
  <property>/controls/flight/aileron-trim</property>
<value type="double">0</value>
  <value type="double">0</value>
<time>2</time><!-- 2 seconds to 0 from 1, 0.5, -1 etc. -->
  <time>2</time><!-- 2 seconds to 0 from 1, 0.5, -1 etc. -->
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 108: Line 105:
<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-interpolate</command>
  <command>property-interpolate</command>
<property>/controls/flight/aileron-trim</property>
  <property>/controls/flight/aileron-trim</property>
<property>/controls/flight/default-aileron-trim</property><!-- the value to interpolate to, is 0 -->
  <property>/controls/flight/default-aileron-trim</property><!-- the value to interpolate to, is 0 -->
<rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
  <rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 119: Line 116:
<syntaxhighlight>
<syntaxhighlight>
<binding>
<binding>
<command>property-multiply</command>
  <command>property-multiply</command>
<property>/controls/flight/aileron</property>
  <property>/controls/flight/aileron</property>
<factor>0.5</factor>
  <factor>0.5</factor>
<min>-1</min>
  <min>-1</min>
<max>1</max>
  <max>1</max>
<mask>all</mask>
  <mask>all</mask>
<wrap>true</wrap>
  <wrap>true</wrap>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 139: Line 136:
=== property-randomize ===
=== property-randomize ===
Assigns a random value (between min and max) to a property.
Assigns a random value (between min and max) to a property.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-randomize</command>
  <command>property-randomize</command>
<property>/orientation/pitch-deg</property>
  <property>/orientation/pitch-deg</property>
<min>0</min>
  <min>0</min>
<max>360</max>
  <max>360</max>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 150: Line 147:
=== property-scale ===
=== property-scale ===
Set the value of a property based on an axis, often used in [[joystick]] configuration files.
Set the value of a property based on an axis, often used in [[joystick]] configuration files.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-scale</command>
  <command>property-scale</command>
<property>/controls/flight/aileron</property>
  <property>/controls/flight/aileron</property>
<offset>0.001</offset>
  <offset>0.001</offset>
<factor>-1</factor>
  <factor>-1</factor>
<power>3</power>
  <power>3</power>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 169: Line 166:
=== property-swap ===
=== property-swap ===
Swaps the values of two properties, useful for radio panels.
Swaps the values of two properties, useful for radio panels.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-swap</command>
  <command>property-swap</command>
<property>/instrumentation/comm/frequencies/selected-mhz</property>
  <property>/instrumentation/comm/frequencies/selected-mhz</property>
<property>/instrumentation/comm/frequencies/standby-mhz</property>
  <property>/instrumentation/comm/frequencies/standby-mhz</property>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 179: Line 176:
=== property-toggle ===
=== property-toggle ===
Toggles the value of a property on each click, between true (1) and false (0).
Toggles the value of a property on each click, between true (1) and false (0).
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-toggle</command>
  <command>property-toggle</command>
<property>/controls/gear/gear-down</property>
  <property>/controls/gear/gear-down</property>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Or - if defined - it toggles between two custom values.
Or - if defined - it toggles between two custom values.
<syntaxhighlight>
<syntaxhighlight lang="xml">
<binding>
<binding>
<command>property-toggle</command>
  <command>property-toggle</command>
<property>/controls/gear/gear-down</property>
  <property>/controls/gear/gear-down</property>
<value>2</value>
  <value>2</value>
<value>3</value>
  <value>3</value>
</binding>
</binding>
</syntaxhighlight>
</syntaxhighlight>
Line 198: Line 195:
{{cquote|
{{cquote|
<syntaxhighlight lang="nasal">
<syntaxhighlight lang="nasal">
fgcommand("request-metar", var n = props.Node.new({ "path": "/foo/mymetar", "station":"LOWI"}));
fgcommand("request-metar", props.Node.new({"path": "/foo/mymetar", "station": "LOWI"}));
</syntaxhighlight>
</syntaxhighlight>


Line 208: Line 205:


== Related content ==
== Related content ==
* <tt>[[$FG_ROOT]]/Docs/README.commands</tt> [https://gitorious.org/fg/fgdata/blobs/master/Docs/README.commands view online]
* {{readme file|commands}}
* [[Howto:Make a clickable panel]]
* [[Howto:Make a clickable panel]]
* [[Howto:Reassign keyboard bindings]]
* [[Howto:Reassign keyboard bindings]]

Revision as of 11:32, 26 October 2015

Bindings define what happens when a user:

You can assign multiple bindings to one object, button or key. Bindings may contain conditions to make them conditionally executed. Each binding must specify a command node with its particular type, see below.

This article gives a small overview of frequently used bindings. Please refer to $FG_ROOT/Docs/README.commands for additional information and a complete list of available bindings.

All given codes are examples, found on various places in the FlightGear package.

Commands

Below are a number of useful commands. See for the complete list, see flightgear/src/Main/fg_commands.cxx (line 1425).

To learn more about adding your own custom fgcommands to the source code, see Howto:Add new fgcommands to FlightGear

dialog-close

Closes the active dialog.

<binding>
  <command>dialog-close</command>
</binding>

dialog-show

Shows a dialog, which should be present in $FG_ROOT/gui/dialogs. Starting with FlightGear 2.7, dialog files located in <aircraft directory>/gui/dialogs are also loaded. This should be used for dialogs specific to a certain aircraft.

<binding>
  <command>dialog-show</command>
  <dialog-name>location-in-air</dialog-name>
</binding>
  • dialog-name: the name of the dialog, as designated in its .xml file.

nasal

Nasal is frequently used for complicated systems, because it can execute virtually any function and allows running previously-defined Nasal functions.

<binding>
  <command>nasal</command>
  <script>b777.afds.input(0,1);</script>
</binding>

The cmdarg function is often useful in these situations to extract offset values passed to the binding. It returns the specific <binding> node, which contains a <setting> node at runtime if used in a joystick axis that represents the value of that axis.

In joysticks and keyboard keys the script is run in a specific namespace; please refer to the documentation for what the namespace is.

property-adjust

Increases or decreases a property's value with a given step. Maximum and minimum values are optional.

<binding>
  <command>property-adjust</command>
  <property>/autopilot/settings/heading-bug-deg</property>
  <step>1</step>    <!-- will add 1 to /autopilot/settings/heading-bug-deg whenever this binding is called -->
  <min>000</min>    <!-- the property will never be allowed to go below 0 -->
  <max>360</max>    <!-- ...or above 360 -->
  <wrap>true</wrap> <!-- when we hit 361, wrap back to 0 and vice-versa -->
</binding>

property-assign

One of the most important commands. It sets a property to a predefined value.

<binding>
  <command>property-assign</command>
  <property>/autopilot/settings/target-speed-kt</property>
  <value>0</value>
</binding>

property-cycle

Cycles between a list of values and assigns one to a property. The value-list can vary in length. If the current value is "value1", it will change to "value2"; if it is "value2", it will change to "value3", and so on, wrapping around the end. If the current value is not in the list, it will jump to the first one.

<binding>
  <command>property-cycle</command>
  <property>/autopilot/autobrake/setting</property>
  <value type="string">ARM</value>
  <value type="string">DISARM</value>
  <value type="string">OFF</value>
</binding>

As of May 2013, the command supports additional behaviours to simplify use with the new knob and slider animations. The wrapping behaviour can be disabled by setting <wrap>0</wrap>, and the command uses the 'offset' argument to select a direction of movement. This means a property-cycle bound to a multi-position knob will function as expected for movement in both directions.

property-interpolate

Interpolates to a value with a given rate of change (per second).

<binding>
  <command>property-interpolate</command>
  <property>/controls/flight/aileron-trim</property>
  <value type="double">0</value>
  <rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
</binding>

Instead of using <rate>, one could use

<binding>
  <command>property-interpolate</command>
  <property>/controls/flight/aileron-trim</property>
  <value type="double">0</value>
  <time>2</time><!-- 2 seconds to 0 from 1, 0.5, -1 etc. -->
</binding>

You can also interpolate to a value given by a property.

<binding>
  <command>property-interpolate</command>
  <property>/controls/flight/aileron-trim</property>
  <property>/controls/flight/default-aileron-trim</property><!-- the value to interpolate to, is 0 -->
  <rate>0.5</rate><!-- 2 seconds to 0 from 1 or -1 -->
</binding>

property-multiply

Multiply the value of a property by a given factor.

<binding>
  <command>property-multiply</command>
  <property>/controls/flight/aileron</property>
  <factor>0.5</factor>
  <min>-1</min>
  <max>1</max>
  <mask>all</mask>
  <wrap>true</wrap>
</binding>
  • factor: the amount to multiply by.
  • min: minimum value.
  • max: maximum value.
  • mask:
    • integer: mutiply only left of the decimal point.
    • decimal: multiply only the right of the decimal point.
    • all: multiply the entire value.
  • wrap: true if the value should be wrapped if it passes min/max. It is required to set both min and max in that case.

property-randomize

Assigns a random value (between min and max) to a property.

<binding>
  <command>property-randomize</command>
  <property>/orientation/pitch-deg</property>
  <min>0</min>
  <max>360</max>
</binding>

property-scale

Set the value of a property based on an axis, often used in joystick configuration files.

<binding>
  <command>property-scale</command>
  <property>/controls/flight/aileron</property>
  <offset>0.001</offset>
  <factor>-1</factor>
  <power>3</power>
</binding>
  • offset: the offset to shift by, before applying the factor.
  • factor: the factor to multiply by (use negative to reverse).
  • squared: if true will square the resulting value (same as power=2).
  • power: the resulting value will be taken to the power of this integer value (overrides squared).

Remember: ((property+offset)*factor)^power=result

property-swap

Swaps the values of two properties, useful for radio panels.

<binding>
  <command>property-swap</command>
  <property>/instrumentation/comm/frequencies/selected-mhz</property>
  <property>/instrumentation/comm/frequencies/standby-mhz</property>
</binding>

property-toggle

Toggles the value of a property on each click, between true (1) and false (0).

<binding>
  <command>property-toggle</command>
  <property>/controls/gear/gear-down</property>
</binding>

Or - if defined - it toggles between two custom values.

<binding>
  <command>property-toggle</command>
  <property>/controls/gear/gear-down</property>
  <value>2</value>
  <value>3</value>
</binding>

request-metar

Cquote1.png
fgcommand("request-metar", props.Node.new({"path": "/foo/mymetar", "station": "LOWI"}));

If you pass an existing path, the station ID will be updated, and if you pass the same station ID as before, no additional request is made. As usual for metar-properties, there's a time-to-live and valid flags you can check, and the metar refreshes automatically every 900 seconds. You can also write to the station ID directly to change station, update the time-to-live, and wait for the valid signal.

There's also an unregister command ('clear-metar') to cancel the binding into the property tree.[1]
— James Turner
Cquote2.png
  1. James Turner (Sun, 23 Sep 2012 08:56:48 -0700). [Flightgear-devel] Requesting arbitrary metar.


Related content