Définir des commandes pour des interrupteurs à 2 ou 3 positions


  • Membre VEAF

    C’est un sujet qui a été abordé aujourd’hui par Perka. Je capitalise sur l’explication que je lui ai donné, et je vous transmets ici le résultat de mes recherches.

    Situation

    Sur nos manettes de bourgeois, il y a souvent, en plus de boutons poussoirs simples ou sous forme de “hats” (chapeaux, comme le trim par exemple), des interrupteurs qui peuvent prendre plusieurs positions maintenues.

    dbffae41-eb35-44ac-ba16-6337d74b626c-image.png

    Par exemple, sur la manette des gaz du Warthog, il y a un interrupteur “Flaps” (1) qui peut prendre trois positions, et un interrupteur “EAC” (2) qui peut en prendre 2.

    On constate que, quand souhaite utiliser un de ces interrupteurs pour mapper une commande double de DCS (par exemple, Master Arm ON et OFF), cela ne fonctionne pas comme prévu

    Explication

    La raison est que toutes les positions de ces interrupteurs ne génèrent pas une commande dans DCS.

    Globalement, un joystick complexe comme la manette des gaz du Warthog est vu dans Windows (par la librairie DirectX, qui sert à l’interfaçage direct du matériel pour les jeux) comme un ensemble d’axes et de boutons qui sont soit pressés (ON), soit non (OFF).

    Par exemple, le bouton qui vous sert à larguer des bombes sur votre joystick est un simple poussoir, dont la position pressée déclenche un signal électrique qui va être reconnu par Windows comme le fait que le bouton DirectX est pressé (ON). Quand on le lache physiquement, le signal se coupe, et Windows cesse de voir ce bouton comme ON ; mécaniquement, il est considéré comme OFF (le seul autre état).

    Dans le cas d’un bouton à plusieurs positions (comme l’interrupteur “EAC”), une seule des deux positions déclenchera un signal électrique (la position “vers l’avant” dans le cas de l’EAC. Et donc seule cette position correspond à un bouton DirectX pour Windows. L’autre est simplement neutre.
    Si vous voulez mapper dans DCS la position basse de cet interrupteur, vous constaterez que c’est impossible.

    Pour un interrupteur à trois positions (comme l’interrupteur “FLAPS”) c’est pareil : seules 2 des 3 positions possibles seront actives, la troisième correspondra simplement à une absence de signal.

    Solution

    Il est possible de créer des commandes dans DCS, en éditant les fichiers .lua qui sont dans les répertoires Input des modules comme par exemple le fichier Mods\aircraft\FA-18C\Input\FA-18C\joystick\default.lua

    On peut créer un contrôle qui exécute une action spécifique quand un bouton DirectX est enfoncé, et une autre quand il ne l’est plus.
    Par exemple, on peut créer un contrôle qui déclenche le Master Arm (ON) quand le bouton DirectX correspondant à l’interrupteur “EAC” en position haute est enfoncé (et maintenu, donc) et qui déclenche le Master Arm (OFF) quand il n’est plus enfoncé (donc, quand on déplace l’interrupteur dans l’autre position).
    Voici le contrôle correspondant :

    {down = SMS_commands.MasterArmSw, up = SMS_commands.MasterArmSw, cockpit_device_id = devices.SMS, value_down = 1.0, value_up = 0.0, name = _('Master Arm Switch 2-Pos ARM/SAFE'), category = {_('Toggle Switches'), _('Master Arm Panel')}},

    Je vous l’explique rapidement.

    • down= correspond à la commande qui est actionnée quand le bouton est enfoncé (en l’occurence, SMS_commands.MasterArmSw)
    • up= correspond à la commande qui est actionnée quand le bouton cesse d’être enfoncé (en l’occurence, SMS_commands.MasterArmSw ; oui, vous avez bien lu, c’est la même que pour down ! C’est la valeur qui va être différente - voir plus bas)
    • value_down= est la valeur (le paramètre) envoyé à la commande décrite dans down= quand le bouton est enfoncé (ici, 1.0 qui correspond à la montée de l’interrupteur Master Arm dans le cockpit)
    • value_up= est la valeur (le paramètre) envoyé à la commande décrite dans up= quand le bouton est enfoncé (ici, 0.0 qui correspond à la descente de l’interrupteur Master Arm dans le cockpit)
    • cockpit_device_id= va de paire avec up= et down= pour définir l’instrument qui reçoit la commande.
    • category= est la liste des catégories dans lesquelles le contrôle sera rangé (qu’on voit dans la liste déroulante catégories dans le dialogue Controls Options)
    • name= est le nom que le contrôle aura dans le dialogue Controls Options

    En pratique, ici on crée un contrôle (unique) qu’on pourra assigner à la position active d’un interrupteur (comme EAC par exemple), et qui appellera la commande SMS_commands.MasterArmSw dans l’instrument devices.SMS avec la valeur 1.0 quand l’interrupteur est dans cette position, et la valeur 0.0 quand il n’y est plus.

    Concrètement, cela permet de mettre le Master Arm sur ON quand l’interrupteur physique est dans une position, et sur OFF quand il est dans une autre.

    Aller plus loin

    C’est un domaine bien compliqué, heureusement bien décrit et documenté par l’excellent LeCuvier sur le forum d’Eagle Dynamics (en anglais).

    Vous pouvez voir ce que j’ai choisi de mettre dans mes mods “Config - Keys - XXXX” qui sont à votre disposition sur mon Google Drive (compatibles OvGME, voir mon tutoriel sur OvGME)

    N’hésitez pas à me demander si vous avez des questions !


  • Membre VEAF

    Bien joué … et surtout bien expliqué 👍



  • Merci ZIP vais étudier ça avec une tablette de Doliprane à coté et un cerveau de rechange lol 🙂