diff --git a/src/input/controller.cpp b/src/input/controller.cpp index 06d97fe95..d69338236 100644 --- a/src/input/controller.cpp +++ b/src/input/controller.cpp @@ -271,11 +271,10 @@ void GameControllers::TryOpenSDLControllers(GameControllers& controllers) { } } - // Now, add any new controllers not already assigned for (int j = 0; j < controller_count; j++) { SDL_JoystickID id = new_joysticks[j]; if (assigned_ids.contains(id)) - continue; // already handled + continue; SDL_Gamepad* pad = SDL_OpenGamepad(id); if (!pad) @@ -288,6 +287,27 @@ void GameControllers::TryOpenSDLControllers(GameControllers& controllers) { slot_taken[i] = true; AddUserServiceEvent( {OrbisUserServiceEventType::Login, SDL_GetGamepadPlayerIndex(pad) + 1}); + + if (SDL_SetGamepadSensorEnabled(controllers[i]->m_sdl_gamepad, SDL_SENSOR_GYRO, + true)) { + controllers[i]->gyro_poll_rate = SDL_GetGamepadSensorDataRate( + controllers[i]->m_sdl_gamepad, SDL_SENSOR_GYRO); + LOG_INFO(Input, "Gyro initialized, poll rate: {}", + controllers[i]->gyro_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad {}", + controllers[i]->user_id); + } + if (SDL_SetGamepadSensorEnabled(controllers[i]->m_sdl_gamepad, SDL_SENSOR_ACCEL, + true)) { + controllers[i]->accel_poll_rate = SDL_GetGamepadSensorDataRate( + controllers[i]->m_sdl_gamepad, SDL_SENSOR_ACCEL); + LOG_INFO(Input, "Accel initialized, poll rate: {}", + controllers[i]->accel_poll_rate); + } else { + LOG_ERROR(Input, "Failed to initialize accel controls for gamepad {}", + controllers[i]->user_id); + } break; } } diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index d9ee4774c..526ea8f0c 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -194,6 +194,21 @@ void WindowSDL::WaitEvent() { case SDL_EVENT_GAMEPAD_AXIS_MOTION: OnGamepadEvent(&event); break; + case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:{ + int controller_id = Input::GetGamepadIndexFromJoystickId(event.gsensor.which) - 1; + switch ((SDL_SensorType)event.gsensor.sensor) { + case SDL_SENSOR_GYRO: + controllers[controller_id]->Gyro( + 0, event.gsensor.data); + break; + case SDL_SENSOR_ACCEL: + controllers[controller_id]->Acceleration( + 0, event.gsensor.data); + break; + default: + break; + } + break;} case SDL_EVENT_QUIT: is_open = false; break;