@@ -351,6 +351,10 @@ typedef struct
351351 float fGyroScaleX ;
352352 float fGyroScaleY ;
353353 float fGyroScaleZ ;
354+
355+ Sint16 sGyroOffsetX ;
356+ Sint16 sGyroOffsetY ;
357+ Sint16 sGyroOffsetZ ;
354358 } m_IMUScaleData ;
355359} SDL_DriverSwitch_Context ;
356360
@@ -1129,6 +1133,11 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
11291133 }
11301134 }
11311135
1136+ // Gyro zero-rate offset
1137+ ctx -> m_IMUScaleData .sGyroOffsetX = sGyroRawX ;
1138+ ctx -> m_IMUScaleData .sGyroOffsetY = sGyroRawY ;
1139+ ctx -> m_IMUScaleData .sGyroOffsetZ = sGyroRawZ ;
1140+
11321141 // Accelerometer scale
11331142 ctx -> m_IMUScaleData .fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / ((float )sAccelSensCoeffX - (float )sAccelRawX ) * SDL_STANDARD_GRAVITY ;
11341143 ctx -> m_IMUScaleData .fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / ((float )sAccelSensCoeffY - (float )sAccelRawY ) * SDL_STANDARD_GRAVITY ;
@@ -1151,6 +1160,10 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
11511160 ctx -> m_IMUScaleData .fGyroScaleX = gyroScale ;
11521161 ctx -> m_IMUScaleData .fGyroScaleY = gyroScale ;
11531162 ctx -> m_IMUScaleData .fGyroScaleZ = gyroScale ;
1163+
1164+ ctx -> m_IMUScaleData .sGyroOffsetX = 0 ;
1165+ ctx -> m_IMUScaleData .sGyroOffsetY = 0 ;
1166+ ctx -> m_IMUScaleData .sGyroOffsetZ = 0 ;
11541167 }
11551168 return true;
11561169}
@@ -2366,9 +2379,13 @@ static void SendSensorUpdate(Uint64 timestamp, SDL_Joystick *joystick, SDL_Drive
23662379 * users will want consistent axis mappings across devices.
23672380 */
23682381 if (type == SDL_SENSOR_GYRO || type == SDL_SENSOR_GYRO_L || type == SDL_SENSOR_GYRO_R ) {
2369- data [0 ] = - (ctx -> m_IMUScaleData .fGyroScaleY * (float )values [1 ]);
2370- data [1 ] = ctx -> m_IMUScaleData .fGyroScaleZ * (float )values [2 ];
2371- data [2 ] = - (ctx -> m_IMUScaleData .fGyroScaleX * (float )values [0 ]);
2382+ const float gyroX = (float )(values [0 ] - ctx -> m_IMUScaleData .sGyroOffsetX );
2383+ const float gyroY = (float )(values [1 ] - ctx -> m_IMUScaleData .sGyroOffsetY );
2384+ const float gyroZ = (float )(values [2 ] - ctx -> m_IMUScaleData .sGyroOffsetZ );
2385+
2386+ data [0 ] = - (ctx -> m_IMUScaleData .fGyroScaleY * gyroY );
2387+ data [1 ] = ctx -> m_IMUScaleData .fGyroScaleZ * gyroZ ;
2388+ data [2 ] = - (ctx -> m_IMUScaleData .fGyroScaleX * gyroX );
23722389 } else {
23732390 data [0 ] = - (ctx -> m_IMUScaleData .fAccelScaleY * (float )values [1 ]);
23742391 data [1 ] = ctx -> m_IMUScaleData .fAccelScaleZ * (float )values [2 ];
0 commit comments