Restart the IMU if the controller stops sending gyro/accel data

main
Sam Lantinga 2022-08-08 20:09:49 -07:00
parent 56c1481cab
commit 6204ae5002
2 changed files with 23 additions and 6 deletions

View File

@ -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

View File

@ -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;