From 6204ae5002ea2878cf4f35fb5c22b7ece35e7102 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 8 Aug 2022 20:09:49 -0700 Subject: [PATCH] Restart the IMU if the controller stops sending gyro/accel data --- src/joystick/SDL_joystick.c | 1 + src/joystick/hidapi/SDL_hidapi_switch.c | 28 +++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 0d778a739..f685e3047 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -2897,6 +2897,7 @@ int SDL_PrivateJoystickSensor(SDL_Joystick *joystick, SDL_SensorType type, const /* Update internal sensor state */ SDL_memcpy(sensor->data, data, num_values*sizeof(*data)); + SDL_Log("Sensor %d data: %.2f,%.2f,%.2f\n", sensor->type, data[0], data[1], data[2]); /* Post the event, if desired */ #if !SDL_EVENTS_DISABLED diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index 1fee00212..e8680b4d5 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -269,6 +269,7 @@ typedef struct { Uint32 m_unRumblePending; SDL_bool m_bHasSensors; SDL_bool m_bReportSensors; + SDL_bool m_bHasSensorData; Uint32 m_unLastInput; SwitchInputOnlyControllerStatePacket_t m_lastInputOnlyState; @@ -1977,13 +1978,28 @@ static void HandleFullControllerState(SDL_Joystick *joystick, SDL_DriverSwitch_C } if (ctx->m_bReportSensors) { - SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[2].sGyroX); - SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[1].sGyroX); - SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[0].sGyroX); + SDL_bool bHasSensorData = (packet->imuState[0].sAccelX != 0 || + packet->imuState[0].sGyroX != 0); + if (bHasSensorData) { + ctx->m_bHasSensorData = SDL_TRUE; - SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[2].sAccelX); - SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[1].sAccelX); - SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[0].sAccelX); + SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[2].sGyroX); + SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[1].sGyroX); + SendSensorUpdate(joystick, ctx, SDL_SENSOR_GYRO, &packet->imuState[0].sGyroX); + + SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[2].sAccelX); + SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[1].sAccelX); + SendSensorUpdate(joystick, ctx, SDL_SENSOR_ACCEL, &packet->imuState[0].sAccelX); + + } else if (ctx->m_bHasSensorData) { + /* Uh oh, someone turned off the IMU? */ + SDL_UnlockMutex(ctx->device->dev_lock); + SetIMUEnabled(ctx, SDL_TRUE); + SDL_LockMutex(ctx->device->dev_lock); + + } else { + /* We have never gotten IMU data, probably not supported on this device */ + } } ctx->m_lastFullState = *packet;