(Xbox 1) (Broken) controls

This commit is contained in:
twinaphex 2012-07-14 06:15:03 +02:00
parent d9ff2d7c8f
commit 6b04a46c59
5 changed files with 167 additions and 33 deletions

View File

@ -297,7 +297,7 @@ static const struct platform_bind platform_keys[] = {
{ CTRL_UP_MASK | CTRL_RSTICK_UP_MASK, "RStick D-Pad Up" },
{ CTRL_DOWN_MASK | CTRL_RSTICK_DOWN_MASK, "RStick D-Pad Down" },
};
#elif defined(_XBOX)
#elif defined(_XBOX360)
static const struct platform_bind platform_keys[] = {
{ XINPUT_GAMEPAD_B, "B button" },
{ XINPUT_GAMEPAD_A, "A button" },
@ -309,18 +309,10 @@ static const struct platform_bind platform_keys[] = {
{ XINPUT_GAMEPAD_DPAD_RIGHT, "D-Pad Right" },
{ XINPUT_GAMEPAD_BACK, "Back button" },
{ XINPUT_GAMEPAD_START, "Start button" },
#ifdef _XBOX1
{ XINPUT_GAMEPAD_WHITE, "White button" },
#else
{ XINPUT_GAMEPAD_LEFT_SHOULDER, "Left Shoulder" },
#endif
{ XINPUT_GAMEPAD_LEFT_TRIGGER, "Left Trigger" },
{ XINPUT_GAMEPAD_LEFT_THUMB, "Left Thumb" },
#ifdef _XBOX1
{ XINPUT_GAMEPAD_BLACK, "Black button" },
#else
{ XINPUT_GAMEPAD_RIGHT_SHOULDER, "Right Shoulder" },
#endif
{ XINPUT_GAMEPAD_RIGHT_TRIGGER, "Right Trigger" },
{ XINPUT_GAMEPAD_RIGHT_THUMB, "Right Thumb" },
{ XINPUT_GAMEPAD_LSTICK_LEFT_MASK, "LStick Left" },
@ -340,6 +332,41 @@ static const struct platform_bind platform_keys[] = {
{ XINPUT_GAMEPAD_DPAD_UP | XINPUT_GAMEPAD_RSTICK_UP_MASK, "RStick D-Pad Up" },
{ XINPUT_GAMEPAD_DPAD_DOWN | XINPUT_GAMEPAD_RSTICK_DOWN_MASK, "RStick D-Pad Down" },
};
#elif defined(_XBOX1)
static const struct platform_bind platform_keys[] = {
{ XINPUT1_GAMEPAD_B, "B button" },
{ XINPUT1_GAMEPAD_A, "A button" },
{ XINPUT1_GAMEPAD_Y, "Y button" },
{ XINPUT1_GAMEPAD_X, "X button" },
{ XINPUT1_GAMEPAD_DPAD_UP, "D-Pad Up" },
{ XINPUT1_GAMEPAD_DPAD_DOWN, "D-Pad Down" },
{ XINPUT1_GAMEPAD_DPAD_LEFT, "D-Pad Left" },
{ XINPUT1_GAMEPAD_DPAD_RIGHT, "D-Pad Right" },
{ XINPUT1_GAMEPAD_BACK, "Back button" },
{ XINPUT1_GAMEPAD_START, "Start button" },
{ XINPUT1_GAMEPAD_WHITE, "White button" },
{ XINPUT1_GAMEPAD_LEFT_TRIGGER, "Left Trigger" },
{ XINPUT1_GAMEPAD_LEFT_THUMB, "Left Thumb" },
{ XINPUT1_GAMEPAD_BLACK, "Black button" },
{ XINPUT1_GAMEPAD_RIGHT_TRIGGER, "Right Trigger" },
{ XINPUT1_GAMEPAD_RIGHT_THUMB, "Right Thumb" },
{ XINPUT1_GAMEPAD_LSTICK_LEFT_MASK, "LStick Left" },
{ XINPUT1_GAMEPAD_LSTICK_RIGHT_MASK, "LStick Right" },
{ XINPUT1_GAMEPAD_LSTICK_UP_MASK, "LStick Up" },
{ XINPUT1_GAMEPAD_LSTICK_DOWN_MASK, "LStick Down" },
{ XINPUT1_GAMEPAD_DPAD_LEFT | XINPUT1_GAMEPAD_LSTICK_LEFT_MASK, "LStick D-Pad Left" },
{ XINPUT1_GAMEPAD_DPAD_RIGHT | XINPUT1_GAMEPAD_LSTICK_RIGHT_MASK, "LStick D-Pad Right" },
{ XINPUT1_GAMEPAD_DPAD_UP | XINPUT1_GAMEPAD_LSTICK_UP_MASK, "LStick D-Pad Up" },
{ XINPUT1_GAMEPAD_DPAD_DOWN | XINPUT1_GAMEPAD_LSTICK_DOWN_MASK, "LStick D-Pad Down" },
{ XINPUT1_GAMEPAD_RSTICK_LEFT_MASK, "RStick Left" },
{ XINPUT1_GAMEPAD_RSTICK_RIGHT_MASK, "RStick Right" },
{ XINPUT1_GAMEPAD_RSTICK_UP_MASK, "RStick Up" },
{ XINPUT1_GAMEPAD_RSTICK_DOWN_MASK, "RStick Down" },
{ XINPUT1_GAMEPAD_DPAD_LEFT | XINPUT1_GAMEPAD_RSTICK_LEFT_MASK, "RStick D-Pad Left" },
{ XINPUT1_GAMEPAD_DPAD_RIGHT | XINPUT1_GAMEPAD_RSTICK_RIGHT_MASK, "RStick D-Pad Right" },
{ XINPUT1_GAMEPAD_DPAD_UP | XINPUT1_GAMEPAD_RSTICK_UP_MASK, "RStick D-Pad Up" },
{ XINPUT1_GAMEPAD_DPAD_DOWN | XINPUT1_GAMEPAD_RSTICK_DOWN_MASK, "RStick D-Pad Down" },
};
#elif defined(GEKKO)
static const struct platform_bind platform_keys[] = {
{ PAD_BUTTON_B, "(NGC) B button" },

View File

@ -124,6 +124,10 @@ enum xdk_device_id
RARCH_LAST_PLATFORM_KEY
};
#ifdef _XBOX1
#include "../xbox1/xinput_xbox_input.h"
#endif
#elif defined(GEKKO)
#include <ogc/pad.h>
#ifdef HW_RVL

View File

@ -17,6 +17,7 @@
#ifndef __RARCH_XINPUT2_H
#define __RARCH_XINPUT2_H
#ifndef _XBOX1
#define XINPUT_GAMEPAD_LSTICK_LEFT_MASK (65536)
#define XINPUT_GAMEPAD_LSTICK_RIGHT_MASK (131072)
#define XINPUT_GAMEPAD_LSTICK_UP_MASK (262144)
@ -25,8 +26,6 @@
#define XINPUT_GAMEPAD_RSTICK_RIGHT_MASK (2097152)
#define XINPUT_GAMEPAD_RSTICK_UP_MASK (4194304)
#define XINPUT_GAMEPAD_RSTICK_DOWN_MASK (8388608)
#ifndef HAVE_XINPUT_XBOX1
#define XINPUT_GAMEPAD_LEFT_TRIGGER (16777216)
#define XINPUT_GAMEPAD_RIGHT_TRIGGER (33554432)
#endif

View File

@ -25,6 +25,7 @@
#include "../general.h"
#include "../libretro.h"
#include "../input/rarch_xinput2.h"
#include "xinput_xbox_input.h"
static uint64_t state[4];
HANDLE gamepads[4];
@ -61,35 +62,91 @@ static void xinput_input_poll(void *data)
// handle inserted devices
bInserted[i] = (dwInsertions & (1<<i)) ? true : false;
if(bInserted[i])
{
XINPUT_POLLING_PARAMETERS m_pollingParameters;
m_pollingParameters.fAutoPoll = TRUE;
m_pollingParameters.fInterruptOut = TRUE;
m_pollingParameters.bInputInterval = 8;
m_pollingParameters.bOutputInterval = 8;
gamepads[i] = XInputOpen(XDEVICE_TYPE_GAMEPAD, i, XDEVICE_NO_SLOT, NULL);
}
if (gamepads[i])
{
XINPUT_STATE state_tmp;
unsigned long retval;
XINPUT_POLLING_PARAMETERS m_pollingParameters;
// if the controller is removed after XGetDeviceChanges but before
// XInputOpen, the device handle will be NULL
m_pollingParameters.fAutoPoll = TRUE;
m_pollingParameters.fInterruptOut = TRUE;
m_pollingParameters.bInputInterval = 8;
m_pollingParameters.bOutputInterval = 8;
gamepads[i] = XInputOpen(XDEVICE_TYPE_GAMEPAD, i, XDEVICE_NO_SLOT, NULL);
if(gamepads[i])
{
retval = XInputGetState(gamepads[i], &state_tmp);
pads_connected += (retval != ERROR_SUCCESS) ? 0 : 1;
state[i] = state_tmp.Gamepad.wButtons;
state[i] |= ((state_tmp.Gamepad.sThumbLX < -DEADZONE)) << 16;
state[i] |= ((state_tmp.Gamepad.sThumbLX > DEADZONE)) << 17;
state[i] |= ((state_tmp.Gamepad.sThumbLY > DEADZONE)) << 18;
state[i] |= ((state_tmp.Gamepad.sThumbLY < -DEADZONE)) << 19;
state[i] |= ((state_tmp.Gamepad.sThumbRX < -DEADZONE)) << 20;
state[i] |= ((state_tmp.Gamepad.sThumbRX > DEADZONE)) << 21;
state[i] |= ((state_tmp.Gamepad.sThumbRY > DEADZONE)) << 22;
state[i] |= ((state_tmp.Gamepad.sThumbRY < -DEADZONE)) << 23;
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] > 128 ? 1 : 0)) << 24;
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] > 128 ? 1 : 0)) << 25;
}
retval = XInputGetState(gamepads[i], &state_tmp);
pads_connected += (retval != ERROR_SUCCESS) ? 0 : 1;
state[i] = 0;
//GBA Button B
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_B] ? 1 : 0) << XINPUT1_GAMEPAD_B;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_A] ? 1 : 0) << XINPUT1_GAMEPAD_A;
// Up (D-Pad)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_Y] ? 1 : 0) << XINPUT1_GAMEPAD_Y;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_X] ? 1 : 0) << XINPUT1_GAMEPAD_X;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) << XINPUT1_GAMEPAD_DPAD_UP;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) << XINPUT1_GAMEPAD_DPAD_DOWN;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) << XINPUT1_GAMEPAD_DPAD_LEFT;
// Unknown button (probably not mapped in VBA)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) << XINPUT1_GAMEPAD_DPAD_RIGHT;
// Down
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) << XINPUT1_GAMEPAD_BACK;
// Up (D-Pad)
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_START) << XINPUT1_GAMEPAD_START;
// Analog buttons seem to all report the same thing - GBA Button A
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_WHITE] ? 1 : 0) << XINPUT1_GAMEPAD_WHITE;
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] ? 1 : 0) << XINPUT1_GAMEPAD_LEFT_TRIGGER;
// Left
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) << XINPUT1_GAMEPAD_LEFT_THUMB;
// GBA Button A
state[i] |= (state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_BLACK] ? 1 : 0) << XINPUT1_GAMEPAD_BLACK;
// Right
state[i] |= (state_tmp.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) << XINPUT1_GAMEPAD_RIGHT_THUMB;
//state[i] |= ((state_tmp.Gamepad.sThumbLX < -DEADZONE)) << 16;
//state[i] |= ((state_tmp.Gamepad.sThumbLX > DEADZONE)) << 17;
//state[i] |= ((state_tmp.Gamepad.sThumbLY > DEADZONE)) << 18;
//state[i] |= ((state_tmp.Gamepad.sThumbLY < -DEADZONE)) << 19;
//state[i] |= ((state_tmp.Gamepad.sThumbRX < -DEADZONE)) << 20;
//state[i] |= ((state_tmp.Gamepad.sThumbRX > DEADZONE)) << 21;
//state[i] |= ((state_tmp.Gamepad.sThumbRY > DEADZONE)) << 22;
//state[i] |= ((state_tmp.Gamepad.sThumbRY < -DEADZONE)) << 23;
// GBA Button A
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_LEFT_TRIGGER] ? 1 : 0)) << XINPUT1_GAMEPAD_LEFT_TRIGGER;
// GBA Button A
state[i] |= ((state_tmp.Gamepad.bAnalogButtons[XINPUT_GAMEPAD_RIGHT_TRIGGER] ? 1 : 0)) << XINPUT1_GAMEPAD_RIGHT_TRIGGER;
}
}
}

47
xbox1/xinput_xbox_input.h Normal file
View File

@ -0,0 +1,47 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
* Copyright (C) 2011-2012 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _XDK_XINPUT1_H
#define _XDK_XINPUT1_H
enum {
XINPUT1_GAMEPAD_B = 1 << 0,
XINPUT1_GAMEPAD_A = 1 << 1,
XINPUT1_GAMEPAD_Y = 1 << 2,
XINPUT1_GAMEPAD_X = 1 << 3,
XINPUT1_GAMEPAD_DPAD_UP = 1 << 4,
XINPUT1_GAMEPAD_DPAD_DOWN = 1 << 5,
XINPUT1_GAMEPAD_DPAD_LEFT = 1 << 6,
XINPUT1_GAMEPAD_DPAD_RIGHT = 1 << 7,
XINPUT1_GAMEPAD_BACK = 1 << 8,
XINPUT1_GAMEPAD_START = 1 << 9,
XINPUT1_GAMEPAD_WHITE = 1 << 10,
XINPUT1_GAMEPAD_LEFT_TRIGGER = 1 << 11,
XINPUT1_GAMEPAD_LEFT_THUMB = 1 << 12,
XINPUT1_GAMEPAD_BLACK = 1 << 13,
XINPUT1_GAMEPAD_RIGHT_TRIGGER = 1 << 14,
XINPUT1_GAMEPAD_RIGHT_THUMB = 1 << 15,
XINPUT1_GAMEPAD_LSTICK_LEFT_MASK = 1 << 16,
XINPUT1_GAMEPAD_LSTICK_RIGHT_MASK = 1 << 17,
XINPUT1_GAMEPAD_LSTICK_UP_MASK = 1 << 18,
XINPUT1_GAMEPAD_LSTICK_DOWN_MASK = 1 << 19,
XINPUT1_GAMEPAD_RSTICK_LEFT_MASK = 1 << 20,
XINPUT1_GAMEPAD_RSTICK_RIGHT_MASK = 1 << 21,
XINPUT1_GAMEPAD_RSTICK_UP_MASK = 1 << 22,
XINPUT1_GAMEPAD_RSTICK_DOWN_MASK = 1 << 23,
};
#endif