Fr/Input helpers

From FlightGear wiki
Jump to navigation Jump to search

Aperçu

Cette page traite du code Nasal destiné aux périphériques d'entrée tels que les manettes, les manches, les manettes des gaz et les pédales. Si de petits scripts peuvent être facilement ajoutés directement dans la balise <binding> de la manette, les blocs de code plus volumineux doivent être organisés un peu différemment.

Comme toujours : « ne vous répétez pas » = pour faciliter la vie de tout le monde, le code ne doit pas être copié-collé, mais regroupé dans un emplacement « centralisé » sous forme de fonctions ou de classes, et appelé chaque fois que cela est nécessaire, où que ce soit. De cette façon, la maintenance ne s'effectue qu'à un seul endroit.

Le namespace input_helpers

Le code Input helper doit être stocké dans FGDATA/Nasal/input_helpers/<vendorname>.nas.

Pour éviter tout conflit, il convient de créer un fichier par fournisseur et, dans chacun de ces fichiers, un espace de noms (hachage) dédié à ce fournisseur.

Voir honeycomb.nas ci-dessous comme exemple :

# 
# Helpers for Honeycomb input devices
#

# !!! Abbreviated sample !!! 
# Check FGDATA repository for latest full version

# namespace
var honeycomb = {};

# Helper for the Honeycomb Alpha Yoke
honeycomb["alpha"] = {
    new: func(cfgnode) {
        var m = {
            parents: [me, input_helpers.config_manager.new(cfgnode)],
        };
        return m;
    },
    # abreviated file
};

config_manager - prise en charge des variantes de configuration pour un appareil

La classe input_helpers.config_manager est conçue pour permettre de définir différentes configurations pour un périphérique d'entrée au sein d'un seul fichier de configuration XML.

Pourquoi ? Prenons l'exemple du quadrant de commande Honeycomb Bravo. Il prend en charge six manettes dotées de « têtes » interchangeables : un jeu pour les avions de ligne et un autre pour les modèles monomoteurs et bimoteurs de l'aviation générale. Vous pouvez ainsi configurer le matériel avec des manettes allant d'une seule commande de puissance/mélange jusqu'à quatre moteurs à réaction.

Il vous faut maintenant trouver un moyen d'indiquer à FlightGear quels leviers vous avez installés sur votre quadrant de commande des gaz et comment interpréter les actions sur ces leviers. Pour éviter d'avoir à jongler avec des fichiers XML, nous avons simplement intégré le nombre limité de variantes dans le fichier XML et laissé le gestionnaire de configuration s'occuper du reste.

Si des fichiers XML contenant des balises <config-variants> sont chargés au démarrage, config_manager affichera une fenêtre contextuelle pour signaler ce fait et ouvrira une boîte de dialogue permettant de sélectionner la variante de configuration souhaitée.

La sélection est ajoutée au fichier aircraft.data et est ainsi enregistrée pour chaque avion, pour plus de souplesse.

<?xml version="1.0"?>
<!-- shortened version for illustration only -->
<PropertyList>
  <vendor-name>honeycomb</vendor-name>
  <model-name>bravo</model-name>
  <name>Honeycomb Aeronautical Bravo Throttle Quadrant</name>

  <debug-events type="bool">false</debug-events>
  <hid-debug-raw type="bool">false</hid-debug-raw>
  
<!-- 
  we need <nasal> to load the config_manager or a vendor
  specific derived class of it
-->
  <nasal>
    <open>
      <![CDATA[
      print("Honeycomb Bravo Nasal (event) open");
      bravo = input_helpers.honeycomb.bravo.new(cmdarg());
      ]]>
    </open>
    <close>
      <![CDATA[
      print("Honeycomb Bravo Nasal (event) close");
      if (ishash(bravo) and isfunc(bravo['close']))
        bravo.close(cmdarg());
      ]]>
    </close>
  </nasal>
<!--
  now we can add <config-variants>
-->
  <config-variants>
    <variant>
<!-- id must be a single word, no special chars, useable as hash key in Nasal -->
      <id>jet2</id> 
<!-- text for the GUI dialog -->
      <description>Airliner (two engines)</description>

<!-- 
  add property mappings for this variant. 
  <input> is used in the <event> elements
  <output> is the target property input will be aliased to
-->
      <mapping>
        <input>/input/honeycomb/bravo/lever[0]</input>
        <output>/controls/flight/speed-brake</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[2]</input>
        <output>/controls/engines/engine[0]/throttle</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[3]</input>
        <output>/controls/engines/engine[1]/throttle</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever-down-button[2]</input>
        <output>/controls/engines/engine[0]/cutoff</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever-down-button[3]</input>
        <output>/controls/engines/engine[1]/cutoff</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/reverser[2]</input>
        <output>/controls/engines/engine[0]/reverser</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/reverser[3]</input>
        <output>/controls/engines/engine[1]/reverser</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[5]</input>
        <output>/controls/flaps-lever-continuous</output>
      </mapping>
    </variant>
    <variant>
      <id>tm</id>
      <description>Throttle/Mixture</description>
      <mapping>
        <input>/input/honeycomb/bravo/lever[0]</input>
        <output>/controls/engines/engine[0]/throttle</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[1]</input>
        <output>/controls/engines/engine[0]/mixture</output>
      </mapping>
    </variant>
    <variant>
      <id>tpm</id>
      <description>Throttle/Prop/Mixture</description>
      <mapping>
        <input>/input/honeycomb/bravo/lever[0]</input>
        <output>/controls/engines/engine[0]/throttle</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[1]</input>
        <output>/controls/engines/engine[0]/propeller-pitch</output>
      </mapping>
      <mapping>
        <input>/input/honeycomb/bravo/lever[2]</input>
        <output>/controls/engines/engine[0]/mixture</output>
      </mapping>
    </variant>   
  </config-variants>
<!-- events cut; see latest version in FGDATA repository -->
</PropertyList>

Voir aussi

USB-HID

Honeycomb Input Devices