Skip to content

Commit 558a89f

Browse files
ceski-1slouken
authored andcommitted
Read Switch controller gyro/accel sensitivity coeffs (SDL3)
These vary by controller, so using the stored values should improve the accuracy of the sensor data.
1 parent fd4ffa6 commit 558a89f

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/joystick/hidapi/SDL_hidapi_switch.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,7 @@
5858
#define SWITCH_GYRO_SCALE 14.2842f
5959
#define SWITCH_ACCEL_SCALE 4096.f
6060

61-
#define SWITCH_GYRO_SCALE_OFFSET 13371.0f
6261
#define SWITCH_GYRO_SCALE_MULT 936.0f
63-
#define SWITCH_ACCEL_SCALE_OFFSET 16384.0f
6462
#define SWITCH_ACCEL_SCALE_MULT 4.0f
6563

6664
enum
@@ -1044,6 +1042,8 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
10441042
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
10451043
Uint8 *pIMUScale;
10461044
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
1045+
Sint16 sAccelSensCoeffX, sAccelSensCoeffY, sAccelSensCoeffZ;
1046+
Sint16 sGyroSensCoeffX, sGyroSensCoeffY, sGyroSensCoeffZ;
10471047

10481048
// IMU scale gives us multipliers for converting raw values to real world values
10491049
pIMUScale = reply->spiReadData.rgucReadData;
@@ -1052,10 +1052,18 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
10521052
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
10531053
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
10541054

1055+
sAccelSensCoeffX = (pIMUScale[7] << 8) | pIMUScale[6];
1056+
sAccelSensCoeffY = (pIMUScale[9] << 8) | pIMUScale[8];
1057+
sAccelSensCoeffZ = (pIMUScale[11] << 8) | pIMUScale[10];
1058+
10551059
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
10561060
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
10571061
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
10581062

1063+
sGyroSensCoeffX = (pIMUScale[19] << 8) | pIMUScale[18];
1064+
sGyroSensCoeffY = (pIMUScale[21] << 8) | pIMUScale[20];
1065+
sGyroSensCoeffZ = (pIMUScale[23] << 8) | pIMUScale[22];
1066+
10591067
// Check for user calibration data. If it's present and set, it'll override the factory settings
10601068
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
10611069
readParams.ucLength = k_unSPIIMUUserScaleLength;
@@ -1072,14 +1080,14 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
10721080
}
10731081

10741082
// Accelerometer scale
1075-
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
1076-
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
1077-
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
1083+
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffX - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
1084+
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffY - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
1085+
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffZ - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
10781086

10791087
// Gyro scale
1080-
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawX) * SDL_PI_F / 180.0f;
1081-
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawY) * SDL_PI_F / 180.0f;
1082-
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawZ) * SDL_PI_F / 180.0f;
1088+
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffX - (float)sGyroRawX) * SDL_PI_F / 180.0f;
1089+
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffY - (float)sGyroRawY) * SDL_PI_F / 180.0f;
1090+
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffZ - (float)sGyroRawZ) * SDL_PI_F / 180.0f;
10831091

10841092
} else {
10851093
// Use default values

0 commit comments

Comments
 (0)