Skip to content

Commit 84b7408

Browse files
author
Dimitri Alexeev
committed
joystick: Apply Gyroscope Zero-Rate Offset (ZRO) subtraction to live IMU data for Switch Controllers.
1 parent e52e681 commit 84b7408

1 file changed

Lines changed: 20 additions & 3 deletions

File tree

src/joystick/hidapi/SDL_hidapi_switch.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)