Fix sensor handling if they are enabled but an error was thrown regardless

This commit is contained in:
kalaposfos13 2025-02-24 19:40:25 +01:00
parent 76b4da6212
commit b884ae62d5
4 changed files with 13 additions and 11 deletions

View File

@ -316,11 +316,11 @@ int PS4_SYSV_ABI scePadRead(s32 handle, OrbisPadData* pData, s32 num) {
pData[i].angularVelocity.y = states[i].angularVelocity.y; pData[i].angularVelocity.y = states[i].angularVelocity.y;
pData[i].angularVelocity.z = states[i].angularVelocity.z; pData[i].angularVelocity.z = states[i].angularVelocity.z;
if (engine) { if (engine) {
const auto accel_poll_rate = engine->GetAccelPollRate(); const auto gyro_poll_rate = engine->GetAccelPollRate();
if (accel_poll_rate != 0.0f) { if (gyro_poll_rate != 0.0f) {
GameController::CalculateOrientation(pData[i].acceleration, GameController::CalculateOrientation(pData[i].acceleration,
pData[i].angularVelocity, pData[i].angularVelocity,
1.0f / accel_poll_rate, pData[i].orientation); 1.0f / gyro_poll_rate, pData[i].orientation);
} }
} }
pData[i].touchData.touchNum = pData[i].touchData.touchNum =
@ -385,10 +385,10 @@ int PS4_SYSV_ABI scePadReadState(s32 handle, OrbisPadData* pData) {
pData->angularVelocity.y = state.angularVelocity.y; pData->angularVelocity.y = state.angularVelocity.y;
pData->angularVelocity.z = state.angularVelocity.z; pData->angularVelocity.z = state.angularVelocity.z;
if (engine) { if (engine) {
const auto accel_poll_rate = engine->GetAccelPollRate(); const auto gyro_poll_rate = engine->GetAccelPollRate();
if (accel_poll_rate != 0.0f) { if (gyro_poll_rate != 0.0f) {
GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity, GameController::CalculateOrientation(pData->acceleration, pData->angularVelocity,
1.0f / accel_poll_rate, pData->orientation); 1.0f / gyro_poll_rate, pData->orientation);
} }
} }
pData->touchData.touchNum = pData->touchData.touchNum =

View File

@ -182,7 +182,7 @@ void GameController::CalculateOrientation(Libraries::Pad::OrbisFVector3& acceler
// Normalize accelerometer measurement // Normalize accelerometer measurement
float norm = std::sqrt(ax * ax + ay * ay + az * az); float norm = std::sqrt(ax * ax + ay * ay + az * az);
if (norm == 0.0f) if (norm == 0.0f || deltaTime == 0.0f)
return; // Handle NaN return; // Handle NaN
norm = 1.0f / norm; norm = 1.0f / norm;
ax *= norm; ax *= norm;

View File

@ -134,13 +134,15 @@ void SDLInputEngine::Init() {
m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO); m_gyro_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_GYRO);
LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate); LOG_INFO(Input, "Gyro initialized, poll rate: {}", m_gyro_poll_rate);
} else { } else {
LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad"); LOG_ERROR(Input, "Failed to initialize gyro controls for gamepad, error: {}", SDL_GetError());
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_GYRO, false);
} }
if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) { if (SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, true)) {
m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL); m_accel_poll_rate = SDL_GetGamepadSensorDataRate(m_gamepad, SDL_SENSOR_ACCEL);
LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate); LOG_INFO(Input, "Accel initialized, poll rate: {}", m_accel_poll_rate);
} else { } else {
LOG_ERROR(Input, "Failed to initialize accel controls for gamepad"); LOG_ERROR(Input, "Failed to initialize accel controls for gamepad, error: {}", SDL_GetError());
SDL_SetGamepadSensorEnabled(m_gamepad, SDL_SENSOR_ACCEL, false);
} }
} }

View File

@ -27,8 +27,8 @@ public:
private: private:
SDL_Gamepad* m_gamepad = nullptr; SDL_Gamepad* m_gamepad = nullptr;
float m_gyro_poll_rate{}; float m_gyro_poll_rate = 0.0f;
float m_accel_poll_rate{}; float m_accel_poll_rate = 0.0f;
}; };
} // namespace Input } // namespace Input