Skip to content

Commit

Permalink
Improved gamepad support
Browse files Browse the repository at this point in the history
Now it works ok also in RaspberryPi
  • Loading branch information
raysan5 committed Mar 16, 2016
1 parent d6bc7b8 commit db4585b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 34 deletions.
46 changes: 14 additions & 32 deletions src/core.c
Expand Up @@ -127,6 +127,7 @@

#define MOUSE_SENSITIVITY 0.8f
#define MAX_GAMEPAD_BUTTONS 11
#define MAX_GAMEPAD_AXIS 5
#endif

//----------------------------------------------------------------------------------
Expand Down Expand Up @@ -168,8 +169,7 @@ static bool gamepadReady = false; // Flag to know if gamepad is re
pthread_t gamepadThreadId; // Gamepad reading thread id

int gamepadButtons[MAX_GAMEPAD_BUTTONS];
int gamepadAxisX = 0;
int gamepadAxisY = 0;
float gamepadAxisValues[MAX_GAMEPAD_AXIS];
#endif

#if defined(PLATFORM_ANDROID) || defined(PLATFORM_RPI)
Expand Down Expand Up @@ -1177,30 +1177,22 @@ bool IsGamepadAvailable(int gamepad)
}

// Return axis movement vector for a gamepad
Vector2 GetGamepadMovement(int gamepad)
float GetGamepadAxisMovement(int gamepad, int axis)
{
Vector2 vec = { 0, 0 };

const float *axes;
int axisCount = 0;
float value = 0;

#if defined(PLATFORM_RPI)
// TODO: Get gamepad axis information
// Use gamepadAxisX, gamepadAxisY
if (axis < MAX_GAMEPAD_AXIS) value = gamepadAxisValues[axis];
#else
const float *axes;
int axisCount = 0;

axes = glfwGetJoystickAxes(gamepad, &axisCount);
#endif

if (axisCount >= 2)
{
vec.x = axes[0]; // Left joystick X
vec.y = axes[1]; // Left joystick Y

//vec.x = axes[2]; // Right joystick X
//vec.x = axes[3]; // Right joystick Y
}
if (axis < axisCount) value = axes[axis];
#endif

return vec;
return value;
}

// Detect if a gamepad button has been pressed once
Expand Down Expand Up @@ -2484,10 +2476,6 @@ static void *GamepadThread(void *arg)
unsigned char number; // event axis/button number
};

// These values are sensible on Logitech Dual Action Rumble and Xbox360 controller
const int joystickAxisX = 0;
const int joystickAxisY = 1;

// Read gamepad event
struct js_event gamepadEvent;

Expand All @@ -2512,17 +2500,11 @@ static void *GamepadThread(void *arg)
{
TraceLog(DEBUG, "Gamepad axis: %i, value: %i", gamepadEvent.number, gamepadEvent.value);

if (gamepadEvent.number == joystickAxisX) gamepadAxisX = (int)gamepadEvent.value;
if (gamepadEvent.number == joystickAxisY) gamepadAxisY = (int)gamepadEvent.value;
/*
switch (gamepadEvent.number)
if (gamepadEvent.number < MAX_GAMEPAD_AXIS)
{
case 0: // 1st Axis X
case 1: // 1st Axis Y
case 2: // 2st Axis X
case 3: // 2st Axis Y
// NOTE: Scaling of gamepadEvent.value to get values between -1..1
gamepadAxisValues[gamepadEvent.number] = (float)gamepadEvent.value/32768;
}
*/
}
}
}
Expand Down
32 changes: 30 additions & 2 deletions src/raylib.h
Expand Up @@ -190,7 +190,35 @@
#define GAMEPAD_BUTTON_SELECT 9
#define GAMEPAD_BUTTON_START 10

// TODO: Review Xbox360 USB Controller Buttons
// Xbox360 USB Controller Buttons
#define GAMEPAD_XBOX_BUTTON_A 0
#define GAMEPAD_XBOX_BUTTON_B 1
#define GAMEPAD_XBOX_BUTTON_X 2
#define GAMEPAD_XBOX_BUTTON_Y 3
#define GAMEPAD_XBOX_BUTTON_LB 4
#define GAMEPAD_XBOX_BUTTON_RB 5
#define GAMEPAD_XBOX_BUTTON_SELECT 6
#define GAMEPAD_XBOX_BUTTON_START 7

#if defined(PLATFORM_RPI)
#define GAMEPAD_XBOX_AXIS_DPAD_X 32
#define GAMEPAD_XBOX_AXIS_DPAD_Y 64
#define GAMEPAD_XBOX_AXIS_RIGHT_X 3
#define GAMEPAD_XBOX_AXIS_RIGHT_Y 4
#define GAMEPAD_XBOX_AXIS_LT 2
#define GAMEPAD_XBOX_AXIS_RT 5
#else
#define GAMEPAD_XBOX_BUTTON_UP 10
#define GAMEPAD_XBOX_BUTTON_DOWN 12
#define GAMEPAD_XBOX_BUTTON_LEFT 13
#define GAMEPAD_XBOX_BUTTON_RIGHT 11
#define GAMEPAD_XBOX_AXIS_RIGHT_X 4
#define GAMEPAD_XBOX_AXIS_RIGHT_Y 3
#define GAMEPAD_XBOX_AXIS_LT_RT 2
#endif

#define GAMEPAD_XBOX_AXIS_LEFT_X 0
#define GAMEPAD_XBOX_AXIS_LEFT_Y 1

// Android Physic Buttons
#define ANDROID_BACK 4
Expand Down Expand Up @@ -592,7 +620,7 @@ void DisableCursor(void); // Disables cursor
bool IsCursorHidden(void); // Returns true if cursor is not visible

bool IsGamepadAvailable(int gamepad); // Detect if a gamepad is available
Vector2 GetGamepadMovement(int gamepad); // Return axis movement vector for a gamepad
float GetGamepadAxisMovement(int gamepad, int axis); // Return axis movement value for a gamepad axis
bool IsGamepadButtonPressed(int gamepad, int button); // Detect if a gamepad button has been pressed once
bool IsGamepadButtonDown(int gamepad, int button); // Detect if a gamepad button is being pressed
bool IsGamepadButtonReleased(int gamepad, int button); // Detect if a gamepad button has been released once
Expand Down

0 comments on commit db4585b

Please sign in to comment.