Skip to content

Commit 9eb50a9

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

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
@@ -62,9 +62,7 @@
6262
#define SWITCH_GYRO_SCALE 14.2842f
6363
#define SWITCH_ACCEL_SCALE 4096.f
6464

65-
#define SWITCH_GYRO_SCALE_OFFSET 13371.0f
6665
#define SWITCH_GYRO_SCALE_MULT 936.0f
67-
#define SWITCH_ACCEL_SCALE_OFFSET 16384.0f
6866
#define SWITCH_ACCEL_SCALE_MULT 4.0f
6967

7068
typedef enum
@@ -925,6 +923,8 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
925923
if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_SPIFlashRead, (uint8_t *)&readParams, sizeof(readParams), &reply)) {
926924
Uint8 *pIMUScale;
927925
Sint16 sAccelRawX, sAccelRawY, sAccelRawZ, sGyroRawX, sGyroRawY, sGyroRawZ;
926+
Sint16 sAccelSensCoeffX, sAccelSensCoeffY, sAccelSensCoeffZ;
927+
Sint16 sGyroSensCoeffX, sGyroSensCoeffY, sGyroSensCoeffZ;
928928

929929
/* IMU scale gives us multipliers for converting raw values to real world values */
930930
pIMUScale = reply->spiReadData.rgucReadData;
@@ -933,10 +933,18 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
933933
sAccelRawY = (pIMUScale[3] << 8) | pIMUScale[2];
934934
sAccelRawZ = (pIMUScale[5] << 8) | pIMUScale[4];
935935

936+
sAccelSensCoeffX = (pIMUScale[7] << 8) | pIMUScale[6];
937+
sAccelSensCoeffY = (pIMUScale[9] << 8) | pIMUScale[8];
938+
sAccelSensCoeffZ = (pIMUScale[11] << 8) | pIMUScale[10];
939+
936940
sGyroRawX = (pIMUScale[13] << 8) | pIMUScale[12];
937941
sGyroRawY = (pIMUScale[15] << 8) | pIMUScale[14];
938942
sGyroRawZ = (pIMUScale[17] << 8) | pIMUScale[16];
939943

944+
sGyroSensCoeffX = (pIMUScale[19] << 8) | pIMUScale[18];
945+
sGyroSensCoeffY = (pIMUScale[21] << 8) | pIMUScale[20];
946+
sGyroSensCoeffZ = (pIMUScale[23] << 8) | pIMUScale[22];
947+
940948
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
941949
readParams.unAddress = k_unSPIIMUUserScaleStartOffset;
942950
readParams.ucLength = k_unSPIIMUUserScaleLength;
@@ -953,14 +961,14 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
953961
}
954962

955963
/* Accelerometer scale */
956-
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
957-
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
958-
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / (SWITCH_ACCEL_SCALE_OFFSET - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
964+
ctx->m_IMUScaleData.fAccelScaleX = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffX - (float)sAccelRawX) * SDL_STANDARD_GRAVITY;
965+
ctx->m_IMUScaleData.fAccelScaleY = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffY - (float)sAccelRawY) * SDL_STANDARD_GRAVITY;
966+
ctx->m_IMUScaleData.fAccelScaleZ = SWITCH_ACCEL_SCALE_MULT / ((float)sAccelSensCoeffZ - (float)sAccelRawZ) * SDL_STANDARD_GRAVITY;
959967

960968
/* Gyro scale */
961-
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawX) * (float)M_PI / 180.0f;
962-
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawY) * (float)M_PI / 180.0f;
963-
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / (SWITCH_GYRO_SCALE_OFFSET - (float)sGyroRawZ) * (float)M_PI / 180.0f;
969+
ctx->m_IMUScaleData.fGyroScaleX = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffX - (float)sGyroRawX) * (float)M_PI / 180.0f;
970+
ctx->m_IMUScaleData.fGyroScaleY = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffY - (float)sGyroRawY) * (float)M_PI / 180.0f;
971+
ctx->m_IMUScaleData.fGyroScaleZ = SWITCH_GYRO_SCALE_MULT / ((float)sGyroSensCoeffZ - (float)sGyroRawZ) * (float)M_PI / 180.0f;
964972

965973
} else {
966974
/* Use default values */

0 commit comments

Comments
 (0)