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