You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
7.6 KiB
293 lines
7.6 KiB
|
|
#include "controls/devices/joystick.h" |
|
|
|
#include "controls/controller_motion.h" |
|
#include "stubs.h" |
|
|
|
namespace dvl { |
|
|
|
ControllerButton JoyButtonToControllerButton(const SDL_Event &event) |
|
{ |
|
switch (event.type) { |
|
case SDL_JOYBUTTONDOWN: |
|
case SDL_JOYBUTTONUP: |
|
switch (event.jbutton.button) { |
|
#ifdef JOY_BUTTON_A |
|
case JOY_BUTTON_A: |
|
return ControllerButton_BUTTON_A; |
|
#endif |
|
#ifdef JOY_BUTTON_B |
|
case JOY_BUTTON_B: |
|
return ControllerButton_BUTTON_B; |
|
#endif |
|
#ifdef JOY_BUTTON_X |
|
case JOY_BUTTON_X: |
|
return ControllerButton_BUTTON_X; |
|
#endif |
|
#ifdef JOY_BUTTON_Y |
|
case JOY_BUTTON_Y: |
|
return ControllerButton_BUTTON_Y; |
|
#endif |
|
#ifdef JOY_BUTTON_LEFTSTICK |
|
case JOY_BUTTON_LEFTSTICK: |
|
return ControllerButton_BUTTON_LEFTSTICK; |
|
#endif |
|
#ifdef JOY_BUTTON_RIGHTSTICK |
|
case JOY_BUTTON_RIGHTSTICK: |
|
return ControllerButton_BUTTON_RIGHTSTICK; |
|
#endif |
|
#ifdef JOY_BUTTON_LEFTSHOULDER |
|
case JOY_BUTTON_LEFTSHOULDER: |
|
return ControllerButton_BUTTON_LEFTSHOULDER; |
|
#endif |
|
#ifdef JOY_BUTTON_RIGHTSHOULDER |
|
case JOY_BUTTON_RIGHTSHOULDER: |
|
return ControllerButton_BUTTON_RIGHTSHOULDER; |
|
#endif |
|
#ifdef JOY_BUTTON_TRIGGERLEFT |
|
case JOY_BUTTON_TRIGGERLEFT: |
|
return ControllerButton_AXIS_TRIGGERLEFT; |
|
#endif |
|
#ifdef JOY_BUTTON_TRIGGERRIGHT |
|
case JOY_BUTTON_TRIGGERRIGHT: |
|
return ControllerButton_AXIS_TRIGGERRIGHT; |
|
#endif |
|
#ifdef JOY_BUTTON_START |
|
case JOY_BUTTON_START: |
|
return ControllerButton_BUTTON_START; |
|
#endif |
|
#ifdef JOY_BUTTON_BACK |
|
case JOY_BUTTON_BACK: |
|
return ControllerButton_BUTTON_BACK; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_LEFT |
|
case JOY_BUTTON_DPAD_LEFT: |
|
return ControllerButton_BUTTON_DPAD_LEFT; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_UP |
|
case JOY_BUTTON_DPAD_UP: |
|
return ControllerButton_BUTTON_DPAD_UP; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_RIGHT |
|
case JOY_BUTTON_DPAD_RIGHT: |
|
return ControllerButton_BUTTON_DPAD_RIGHT; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_DOWN |
|
case JOY_BUTTON_DPAD_DOWN: |
|
return ControllerButton_BUTTON_DPAD_DOWN; |
|
#endif |
|
default: |
|
break; |
|
} |
|
break; |
|
case SDL_JOYHATMOTION: |
|
#if defined(JOY_HAT_DPAD_UP_HAT) && defined(JOY_HAT_DPAD_UP) |
|
if (event.jhat.hat == JOY_HAT_DPAD_UP_HAT && (event.jhat.value & JOY_HAT_DPAD_UP) != 0) |
|
return ControllerButton_BUTTON_DPAD_UP; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_DOWN_HAT) && defined(JOY_HAT_DPAD_DOWN) |
|
if (event.jhat.hat == JOY_HAT_DPAD_DOWN_HAT && (event.jhat.value & JOY_HAT_DPAD_DOWN) != 0) |
|
return ControllerButton_BUTTON_DPAD_DOWN; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_LEFT_HAT) && defined(JOY_HAT_DPAD_LEFT) |
|
if (event.jhat.hat == JOY_HAT_DPAD_LEFT_HAT && (event.jhat.value & JOY_HAT_DPAD_LEFT) != 0) |
|
return ControllerButton_BUTTON_DPAD_LEFT; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_RIGHT_HAT) && defined(JOY_HAT_DPAD_RIGHT) |
|
if (event.jhat.hat == JOY_HAT_DPAD_RIGHT_HAT && (event.jhat.value & JOY_HAT_DPAD_RIGHT) != 0) |
|
return ControllerButton_BUTTON_DPAD_RIGHT; |
|
#endif |
|
return ControllerButton_IGNORE; |
|
break; |
|
default: |
|
break; |
|
} |
|
return ControllerButton_NONE; |
|
} |
|
|
|
namespace { |
|
|
|
int JoyButtonToControllerButton(ControllerButton button) |
|
{ |
|
if (button == ControllerButton_AXIS_TRIGGERLEFT || button == ControllerButton_AXIS_TRIGGERRIGHT) |
|
UNIMPLEMENTED(); |
|
switch (button) { |
|
#ifdef JOY_BUTTON_A |
|
case ControllerButton_BUTTON_A: |
|
return JOY_BUTTON_A; |
|
#endif |
|
#ifdef JOY_BUTTON_B |
|
case ControllerButton_BUTTON_B: |
|
return JOY_BUTTON_B; |
|
#endif |
|
#ifdef JOY_BUTTON_X |
|
case ControllerButton_BUTTON_X: |
|
return JOY_BUTTON_X; |
|
#endif |
|
#ifdef JOY_BUTTON_Y |
|
case ControllerButton_BUTTON_Y: |
|
return JOY_BUTTON_Y; |
|
#endif |
|
#ifdef JOY_BUTTON_BACK |
|
case ControllerButton_BUTTON_BACK: |
|
return JOY_BUTTON_BACK; |
|
#endif |
|
#ifdef JOY_BUTTON_START |
|
case ControllerButton_BUTTON_START: |
|
return JOY_BUTTON_START; |
|
#endif |
|
#ifdef JOY_BUTTON_LEFTSTICK |
|
case ControllerButton_BUTTON_LEFTSTICK: |
|
return JOY_BUTTON_LEFTSTICK; |
|
#endif |
|
#ifdef JOY_BUTTON_RIGHTSTICK |
|
case ControllerButton_BUTTON_RIGHTSTICK: |
|
return JOY_BUTTON_RIGHTSTICK; |
|
#endif |
|
#ifdef JOY_BUTTON_LEFTSHOULDER |
|
case ControllerButton_BUTTON_LEFTSHOULDER: |
|
return JOY_BUTTON_LEFTSHOULDER; |
|
#endif |
|
#ifdef JOY_BUTTON_RIGHTSHOULDER |
|
case ControllerButton_BUTTON_RIGHTSHOULDER: |
|
return JOY_BUTTON_RIGHTSHOULDER; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_UP |
|
case ControllerButton_BUTTON_DPAD_UP: |
|
return JOY_BUTTON_DPAD_UP; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_DOWN |
|
case ControllerButton_BUTTON_DPAD_DOWN: |
|
return JOY_BUTTON_DPAD_DOWN; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_LEFT |
|
case ControllerButton_BUTTON_DPAD_LEFT: |
|
return JOY_BUTTON_DPAD_LEFT; |
|
#endif |
|
#ifdef JOY_BUTTON_DPAD_RIGHT |
|
case ControllerButton_BUTTON_DPAD_RIGHT: |
|
return JOY_BUTTON_DPAD_RIGHT; |
|
#endif |
|
default: |
|
return -1; |
|
} |
|
} |
|
|
|
bool IsJoystickHatButtonPressed(ControllerButton button) |
|
{ |
|
switch (button) { |
|
#if defined(JOY_HAT_DPAD_UP_HAT) && defined(JOY_HAT_DPAD_UP) |
|
case ControllerButton_BUTTON_DPAD_UP: |
|
return (SDL_JoystickGetHat(CurrentJoystick(), JOY_HAT_DPAD_UP_HAT) & JOY_HAT_DPAD_UP) != 0; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_DOWN_HAT) && defined(JOY_HAT_DPAD_DOWN) |
|
case ControllerButton_BUTTON_DPAD_DOWN: |
|
return (SDL_JoystickGetHat(CurrentJoystick(), JOY_HAT_DPAD_DOWN_HAT) & JOY_HAT_DPAD_DOWN) != 0; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_LEFT_HAT) && defined(JOY_HAT_DPAD_LEFT) |
|
case ControllerButton_BUTTON_DPAD_LEFT: |
|
return (SDL_JoystickGetHat(CurrentJoystick(), JOY_HAT_DPAD_LEFT_HAT) & JOY_HAT_DPAD_LEFT) != 0; |
|
#endif |
|
#if defined(JOY_HAT_DPAD_RIGHT_HAT) && defined(JOY_HAT_DPAD_RIGHT) |
|
case ControllerButton_BUTTON_DPAD_RIGHT: |
|
return (SDL_JoystickGetHat(CurrentJoystick(), JOY_HAT_DPAD_RIGHT_HAT) & JOY_HAT_DPAD_RIGHT) != 0; |
|
#endif |
|
default: |
|
return false; |
|
} |
|
} |
|
|
|
} // namespace |
|
|
|
bool IsJoystickButtonPressed(ControllerButton button) |
|
{ |
|
if (CurrentJoystick() == NULL) |
|
return false; |
|
if (IsJoystickHatButtonPressed(button)) |
|
return true; |
|
const int joy_button = JoyButtonToControllerButton(button); |
|
return joy_button != -1 && SDL_JoystickGetButton(CurrentJoystick(), joy_button); |
|
} |
|
|
|
bool ProcessJoystickAxisMotion(const SDL_Event &event) |
|
{ |
|
if (event.type != SDL_JOYAXISMOTION) |
|
return false; |
|
switch (event.jaxis.axis) { |
|
#ifdef JOY_AXIS_LEFTX |
|
case JOY_AXIS_LEFTX: |
|
leftStickXUnscaled = event.jaxis.value; |
|
leftStickNeedsScaling = true; |
|
break; |
|
#endif |
|
#ifdef JOY_AXIS_LEFTY |
|
case JOY_AXIS_LEFTY: |
|
leftStickYUnscaled = -event.jaxis.value; |
|
leftStickNeedsScaling = true; |
|
break; |
|
#endif |
|
#ifdef JOY_AXIS_RIGHTX |
|
case JOY_AXIS_RIGHTX: |
|
rightStickXUnscaled = event.jaxis.value; |
|
rightStickNeedsScaling = true; |
|
break; |
|
#endif |
|
#ifdef JOY_AXIS_RIGHTY |
|
case JOY_AXIS_RIGHTY: |
|
rightStickYUnscaled = -event.jaxis.value; |
|
rightStickNeedsScaling = true; |
|
break; |
|
#endif |
|
default: |
|
return false; |
|
} |
|
return true; |
|
} |
|
|
|
static SDL_Joystick *current_joystick = NULL; |
|
|
|
SDL_Joystick *CurrentJoystick() |
|
{ |
|
return current_joystick; |
|
} |
|
|
|
static int current_joystick_index = -1; |
|
|
|
int CurrentJoystickIndex() |
|
{ |
|
return current_joystick_index; |
|
} |
|
|
|
void InitJoystick() |
|
{ |
|
#if HAS_KBCTRL == 1 |
|
sgbControllerActive = true; |
|
#endif |
|
|
|
if (SDL_NumJoysticks() == 0) { |
|
current_joystick_index = -1; |
|
#if HAS_KBCTRL == 0 |
|
sgbControllerActive = false; |
|
#endif |
|
return; |
|
} |
|
|
|
// Get the first available controller. |
|
for (int i = 0; i < SDL_NumJoysticks(); ++i) { |
|
#ifndef USE_SDL1 |
|
if (!SDL_IsGameController(i)) |
|
continue; |
|
#endif |
|
SDL_Log("Initializing joystick %d: %s", i, SDL_JoystickNameForIndex(i)); |
|
current_joystick = SDL_JoystickOpen(i); |
|
if (current_joystick == NULL) { |
|
SDL_Log(SDL_GetError()); |
|
continue; |
|
} |
|
current_joystick_index = i; |
|
sgbControllerActive = true; |
|
break; |
|
} |
|
} |
|
|
|
} // namespace dvl
|
|
|