From 6204ae5002ea2878cf4f35fb5c22b7ece35e7102 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 0d778a739e1..f685e3047f0 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 1fee002125f..e8680b4d517 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;