ArduinoJoystickLibrary icon indicating copy to clipboard operation
ArduinoJoystickLibrary copied to clipboard

More than 32 buttons and 2 hats

Open pw-sys opened this issue 6 years ago • 9 comments

Describe your feature request Is it possible to change the maximum number of hats to 4 or 5 and the maximum number of buttons to 64 or 128?

pw-sys avatar Nov 02 '18 13:11 pw-sys

These tend to be limitations of the software that is integrating with the device. For example:

XInput supports maximum of 4 axes, 10 buttons, 2 triggers and 8-direction digital pad per controller, compared to DirectInput's support for 8 axes, 128 buttons, and full-range POV. (The number of axes, buttons and triggers XInput supports corresponds directly to the Xbox 360 controller.)

From https://en.wikipedia.org/wiki/DirectInput

I know you can increase the button count beyond 32 (see https://github.com/MHeironimus/ArduinoJoystickLibrary/wiki/FAQ), but the program you are using it with may or may not support them.

I have tried to do 4 hats in the past, but could not get it to work consistently enough to officially add it to the library. I can add that as a future feature request.

MHeironimus avatar Jun 09 '20 12:06 MHeironimus

MHeironimus, could you please make a code to accept more than 32 buttons (64 buttons)? because I'm using shift register but the code doesn't accept more than 32 buttons. Thank you

mauriciokami avatar Jun 30 '20 19:06 mauriciokami

@mauriciokami The library currently supports over 32 buttons (32 is just the default value). The default Windows Joystick test application can only display 32 buttons. You have to use an application that supports over 32 buttons to see them. For example:

image

Here is a quick sketch that defines 64 buttons (it only sets the last 4 buttons for simplicity).

#include <Joystick.h>

Joystick_ Joystick(0x06, JOYSTICK_TYPE_GAMEPAD, 64, 0, 
  false, false, false, false, false, false, false, false, false, false, false);

void setup() {
  // Initialize Button Pins
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);

  // Initialize Joystick Library
  Joystick.begin();
}

// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;

// Last state of the button
int lastButtonState[4] = {0,0,0,0};

void loop() {

  // Read pin values
  for (int index = 0; index < 4; index++)
  {
    int currentButtonState = !digitalRead(index + pinToButtonMap);
    if (currentButtonState != lastButtonState[index])
    {
      Joystick.setButton(63 - index, currentButtonState);
      lastButtonState[index] = currentButtonState;
    }
  }

  delay(50);
}

MHeironimus avatar Jun 30 '20 21:06 MHeironimus

@mauriciokami FYI: 128 buttons also works.

image

MHeironimus avatar Jun 30 '20 21:06 MHeironimus

very good

HUANGJIN169 avatar Jul 01 '20 03:07 HUANGJIN169

Is it possible to create 3 instances of joystick to solve the 32 buttons limit? Although some games handle 128 buttons without problem, i.e. DCS. But a lot of games still ignore anything over 32 buttons. I read some info from another Arduino HID project, and the dev mentioned that 32u4 is capable to handle 3 usb device using single report and can expend to more if multi report is used. https://github.com/NicoHood/HID/wiki/API-Documentation

Jack-XHP avatar Jul 09 '20 03:07 Jack-XHP

Is it possible to have more than 32 buttons (48 would be nice) and 6 Axis? I tried assigning the flags on the gamepad to true, with no success.

oneandrelom avatar Jul 26 '20 05:07 oneandrelom

@oneandrelom Yes, but the software you are using must support it. For example, the built-in Windows Test application only supports 32. See https://github.com/MHeironimus/ArduinoJoystickLibrary/wiki/FAQ for more details.

MHeironimus avatar Jul 26 '20 12:07 MHeironimus

@MHeironimus Thanks, the example, MultipleJoystickTest, provided the solution. I configured a gamepad as a 32 button and a joystick as a 32 button, six axis device.

oneandrelom avatar Jul 26 '20 14:07 oneandrelom