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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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