Skocz do zawartości

Button Box na Arduino Pro Micro - problem z odwołaniem do konkretnego przycisku


espek

Pomocna odpowiedź

Cześć

To mój pierwszy post, więc witam serdecznie :)

Mam taki problem - zbudowałem sobie button box i zastosowałem dwa rodzaje przycisków (i tak chciałbym je wykorzystywać w grze) - bistabilne i monostabilne. Jestem w stanie zrobić, żeby wszystkie przyciski zachowywały się jak monostabilne lub wszystkie jako bistabilne. Jednak nie wiem w jaki sposób dojść do konkretnego przycisku. Komputer wykrywa button box jako gamepad z 45 przyciskami i wydawało mi się, że wystarczy się odwołać w pętli do konkretnego numeru przycisku, żeby zmienić jego zachowanie.

Mój kod na przyciski monostabilne:

//BUTTON BOX 45 buttons
//Arduino Pro Micro
//Tested in WIN7 + ETS2
//V1.0

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

#define NUMBUTTONS 45
#define NUMROWS 9
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23,24},
  {25,26,27,28,29},
  {30,31,32,33,34},
  {35,36,37,38,39},
  {40,41,42,43,44},
};


byte rowPins[NUMROWS] = {21,20,19,18,15,14,16,10,9};
byte colPins[NUMCOLS] = {8,7,6,5,3};

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

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK, 45, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

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);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }  
         }
     }
}

 

Część kodu na, żeby przyciski działały bistabilne:

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:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case HOLD:
                    case RELEASED:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              delay(100);
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                    case IDLE:
                    break;
            }
           }  
         }
     }
}

 

Wszystko byłoby git, ale jednak chcę mieć możliwość, żeby część przycisków działała jako bistabilne a część jako monostabilne. Miałem nadzieję, że jak chcę zaprogramować przyciski nr 5, 10, 36, 38 i 43 jako bistabilny to wystarczy wpisać:

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:
                        if ( (i == 10) || (i == 5) || (i == 36) || (i == 43) || (i == 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                                delay(100);
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                    case HOLD:
                        if ( (i != 10) && (i != 5) && (i != 36) && (i != 43) && (i != 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                            }
                    break;
                    case RELEASED:
                        if ( (i == 10) || (i == 5) || (i == 36) || (i == 43) || (i == 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 1);
                                delay(100);
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                    case IDLE:
                        if ( (i != 10) && (i != 5) && (i != 36) && (i != 43) && (i != 38) )
                            {
                                Joystick.setButton(buttbx.key[i].kchar, 0);
                            }
                    break;
                }
            }
        }
    }
}

Jednak tak się nie stało. i == 5 nie odwołuje się do przycisku nr 5. W jaki sposób odwołać się do tych przycisków?

Czy jest szansa, żeby to zadziałało jak zamiast i == 5 odwołam się na przykład buttons[1][1] ?

Z góry dziękuję za pomoc.

Link do komentarza
Share on other sites

Trudno odpowiedzieć na takie pytania nie widząc implementacji funkcji Joystick.setButton(buttbx.key.kchar, 1); ani definicji klas/struktur więc tak samo jak Ty nie mamy pojęcia czy jest szansa aby to zadziałało 😉 Jedyne co mi przychodzi względem tego do głowy to: trzeba sprawdzić!

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.