Controleur de jeu simu - 2 actions sur le même interrupteur

Bonjour,
je réalise un simulateur de vol complet. même si il est calqué sur un F18C (utilisé principalement dans DCS) j'aimerais qu'il soit utilisable dans d'autres simulateur.
C'est pourquoi, au lieux d'utiliser DCS-bios (qui est quand même utilisé pour faire fonctionner les éclairage spécifique au F18), j'utilise la carte comme un contrôleur de jeux.
je suis coincé sur un point. par exemple, lorsque j'active le levier du train d’atterrissage, ce dernier passe mon bouton "1" en actif. je peut donc mettre "bouton 1" pour baisser le train d’atterrissage. mais pour le relever... pas de bouton, car quant je passe le levier en "up", je passe le "bouton 1" à l'état inactif, donc rien ne ce passe. Ceci n'est qu'un exemple, étant donné que chaque bouton/interrupteur sera configuré via l'interface du jeux directement et peut changer en fonction des avions et/ou simulateur utilisé.
Mon idée est quant j'active mon levier, sa passe "bouton 1" en actif durant 10ms, et quant le levier passe en inactif, le "bouton 2" soit activé durant 10ms.
pour complexifier le tout, j'utilise une matrice, car bien sur, même avec 32 boutons il va me falloir un paquet de carte.
(Je repasserais pour le codage des potentiomètre et les incrémentateur rotatif, je ne m'y suis pas encore penché).

Mon code actuel : (il active bien le bouton durant les 300ms et le désactive apres, mais quant je repasse un bouton à l'état 0, c'est toujours le "bouton 1" qui se fait activer au lieu du "bouton n+1"

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROWS 4 // nombre de colones de la matrice bouton
#define NUMCOLS 4 // nombre de ligne de la matrice bouton

byte buttons[NUMROWS][NUMCOLS] = { // numéro bouton controleur -1
  {0,1,2,3},
  {4,5,6,7},
  {8,9,10,11},
  {12,13,14,15},
};

byte rowPins[NUMROWS] = {2,3,4,5}; // numéro des broche ligne
byte colPins[NUMCOLS] = {6,7,8,9}; // numéro des broche colone

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

void setup() {
  Joystick.begin();
}

void loop() { 
  CheckAllButtons();
}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              //Fixe l'état (0 ou 1) du bouton spécifié.
                              //si le numéro est 0 : la valeur est 1 si l'on appuie sur le bouton et 0 si le bouton est relâché.
                              delay(300);
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
                    case RELEASED:
                    case IDLE:
                              int j=i+j;
                              Joystick.setButton(buttbx.key[j].kchar, 1); 
                              //Fixe l'état (0 ou 1) du bouton spécifié.
                              //si le numéro est 0 : la valeur est 1 si l'on appuie sur le bouton et 0 si le bouton est relâché.
                              delay(300);
                              Joystick.setButton(buttbx.key[j].kchar, 0);
                              break;
            }
           }   
         }
     }
}

pour finir, je suis preneur d'une tempo qui ne bloc pas le programme en cas d'utilisation d'un autre interrupteur.
et merci d'avance...

Bonjour veloce

Il faut passer par un état de ton train d'atterrissage etatTrain.
etatTrainRentre et etatTrainSorti.

Si bouton PRESSED et etatTrain == etatTrainRentre, sortir le train, etatTrain = etatTrainSorti
Si bouton RELEASED et etatTrain == etatTrainSorti, rentrer le train, etatTrain = etatTrainEntre

Si tu veux un coups de main, mets la partie de code qui traite de ton train d'atterrissage.

A+
Cordialement
jpbbricole

Je me suis mal expliquer. Le train d’atterrissage n'est qu'un exemple étant donné que la commande peut servir à autre chose sur un autres avion ou un autre simulateur.
l'idée est de faire fonctionner interrupteur à 2 état (0 ou 1) comme si c'était 2 boutons à impulsions qui s'active à chaque changement d'état. Ensuite, c'est dans chaque simulateur qu'il faut configurer les boutons.
Dans le code indiqué, je tentais d'activer le bouton [i+1] quant le bouton [i] passait à l'état "0". mais sa ne fonctionne pas.
ci-dessous un nouveau code qui fonctionne presque. sauf que quand j'active un interrupteur, j'ai 2 impulsions qui sont envoyer.

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROWS 4 // nombre de colones de la matrice bouton
#define NUMCOLS 4 // nombre de ligne de la matrice bouton

byte buttons[NUMROWS][NUMCOLS] = { // numéro bouton controleur -1
  {0,2,4,6},
  {8,10,12,14},
  {16,18,20,22},
  {24,26,28,30},
};
byte buttonsre[NUMROWS][NUMCOLS] = { // numéro bouton controleur -1
  {1,3,5,7},
  {9,11,13,15},
  {17,19,21,23},
  {25,27,29,31},
};

byte rowPins[NUMROWS] = {2,3,4,5}; // numéro des broche ligne
byte colPins[NUMCOLS] = {6,7,8,9}; // numéro des broche colone

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 
Keypad buttbxre = Keypad( makeKeymap(buttonsre), rowPins, colPins, NUMROWS, NUMCOLS);

void setup() {
  Joystick.begin();
}

void loop() { 
  CheckAllButtons();
}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              //Fixe l'état (0 ou 1) du bouton spécifié.
                              //si le numéro est 0 : la valeur est 1 si l'on appuie sur le bouton et 0 si le bouton est relâché.
                              delay(50);
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
     if (buttbxre.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbxre.key[i].stateChanged )   
            {
            switch (buttbxre.key[i].kstate) {  
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbxre.key[i].kchar, 1); 
                              //Fixe l'état (0 ou 1) du bouton spécifié.
                              //si le numéro est 0 : la valeur est 1 si l'on appuie sur le bouton et 0 si le bouton est relâché.
                              delay(50);
                              Joystick.setButton(buttbxre.key[i].kchar, 0);
                              break;
            }
            }
        }
    }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.