#include "controls/devices/game_controller.h" #ifndef USE_SDL1 #include "controls/controller_motion.h" #include "controls/devices/joystick.h" #include "stubs.h" namespace dvl { static SDL_GameController *current_game_controller = NULL; static bool sgbTriggerLeftDown = false; static bool sgbTriggerRightDown = false; ControllerButton GameControllerToControllerButton(const SDL_Event &event) { switch (event.type) { case SDL_CONTROLLERAXISMOTION: switch (event.caxis.axis) { case SDL_CONTROLLER_AXIS_TRIGGERLEFT: if (event.caxis.value < 8192) { // 25% pressed sgbTriggerLeftDown = false; } if (event.caxis.value > 16384 && !sgbTriggerLeftDown) { // 50% pressed sgbTriggerLeftDown = true; return ControllerButton_AXIS_TRIGGERLEFT; } return ControllerButton_NONE; case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: if (event.caxis.value < 8192) { // 25% pressed sgbTriggerRightDown = false; } if (event.caxis.value > 16384 && !sgbTriggerRightDown) { // 50% pressed sgbTriggerRightDown = true; return ControllerButton_AXIS_TRIGGERRIGHT; } return ControllerButton_NONE; } break; case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: switch (event.cbutton.button) { case SDL_CONTROLLER_BUTTON_A: return ControllerButton_BUTTON_A; case SDL_CONTROLLER_BUTTON_B: return ControllerButton_BUTTON_B; case SDL_CONTROLLER_BUTTON_X: return ControllerButton_BUTTON_X; case SDL_CONTROLLER_BUTTON_Y: return ControllerButton_BUTTON_Y; case SDL_CONTROLLER_BUTTON_LEFTSTICK: return ControllerButton_BUTTON_LEFTSTICK; case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return ControllerButton_BUTTON_RIGHTSTICK; case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return ControllerButton_BUTTON_LEFTSHOULDER; case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: return ControllerButton_BUTTON_RIGHTSHOULDER; case SDL_CONTROLLER_BUTTON_START: return ControllerButton_BUTTON_START; case SDL_CONTROLLER_BUTTON_BACK: return ControllerButton_BUTTON_BACK; case SDL_CONTROLLER_BUTTON_DPAD_UP: return ControllerButton_BUTTON_DPAD_UP; case SDL_CONTROLLER_BUTTON_DPAD_DOWN: return ControllerButton_BUTTON_DPAD_DOWN; case SDL_CONTROLLER_BUTTON_DPAD_LEFT: return ControllerButton_BUTTON_DPAD_LEFT; case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return ControllerButton_BUTTON_DPAD_RIGHT; default: break; } default: break; } return ControllerButton_NONE; } namespace { SDL_GameControllerButton ControllerButtonToGameControllerButton(ControllerButton button) { if (button == ControllerButton_AXIS_TRIGGERLEFT || button == ControllerButton_AXIS_TRIGGERRIGHT) UNIMPLEMENTED(); switch (button) { case ControllerButton_BUTTON_A: return SDL_CONTROLLER_BUTTON_A; case ControllerButton_BUTTON_B: return SDL_CONTROLLER_BUTTON_B; case ControllerButton_BUTTON_X: return SDL_CONTROLLER_BUTTON_X; case ControllerButton_BUTTON_Y: return SDL_CONTROLLER_BUTTON_Y; case ControllerButton_BUTTON_BACK: return SDL_CONTROLLER_BUTTON_BACK; case ControllerButton_BUTTON_START: return SDL_CONTROLLER_BUTTON_START; case ControllerButton_BUTTON_LEFTSTICK: return SDL_CONTROLLER_BUTTON_LEFTSTICK; case ControllerButton_BUTTON_RIGHTSTICK: return SDL_CONTROLLER_BUTTON_RIGHTSTICK; case ControllerButton_BUTTON_LEFTSHOULDER: return SDL_CONTROLLER_BUTTON_LEFTSHOULDER; case ControllerButton_BUTTON_RIGHTSHOULDER: return SDL_CONTROLLER_BUTTON_RIGHTSHOULDER; case ControllerButton_BUTTON_DPAD_UP: return SDL_CONTROLLER_BUTTON_DPAD_UP; case ControllerButton_BUTTON_DPAD_DOWN: return SDL_CONTROLLER_BUTTON_DPAD_DOWN; case ControllerButton_BUTTON_DPAD_LEFT: return SDL_CONTROLLER_BUTTON_DPAD_LEFT; case ControllerButton_BUTTON_DPAD_RIGHT: return SDL_CONTROLLER_BUTTON_DPAD_RIGHT; default: return SDL_CONTROLLER_BUTTON_INVALID; } } } // namespace bool IsGameControllerButtonPressed(ControllerButton button) { if (current_game_controller == NULL) return false; const SDL_GameControllerButton gc_button = ControllerButtonToGameControllerButton(button); return gc_button != SDL_CONTROLLER_BUTTON_INVALID && SDL_GameControllerGetButton(current_game_controller, gc_button); } bool ProcessGameControllerAxisMotion(const SDL_Event &event) { if (event.type != SDL_CONTROLLERAXISMOTION) return false; switch (event.caxis.axis) { case SDL_CONTROLLER_AXIS_LEFTX: leftStickXUnscaled = event.caxis.value; leftStickNeedsScaling = true; break; case SDL_CONTROLLER_AXIS_LEFTY: leftStickYUnscaled = -event.caxis.value; leftStickNeedsScaling = true; break; case SDL_CONTROLLER_AXIS_RIGHTX: rightStickXUnscaled = event.caxis.value; rightStickNeedsScaling = true; break; case SDL_CONTROLLER_AXIS_RIGHTY: rightStickYUnscaled = -event.caxis.value; rightStickNeedsScaling = true; break; default: return false; } return true; } SDL_GameController *CurrentGameController() { return current_game_controller; } void InitGameController() { if (CurrentJoystickIndex() == -1) return; const SDL_JoystickGUID guid = SDL_JoystickGetGUID(CurrentJoystick()); SDL_Log("Opening gamepad %d: %s", CurrentJoystickIndex(), SDL_GameControllerMappingForGUID(guid)); current_game_controller = SDL_GameControllerOpen(CurrentJoystickIndex()); if (current_game_controller == NULL) SDL_Log(SDL_GetError()); } } // namespace dvl #endif