62
62
#define SWITCH_GYRO_SCALE 14.2842f
63
63
#define SWITCH_ACCEL_SCALE 4096.f
64
64
65
- #define SWITCH_GYRO_SCALE_OFFSET 13371.0f
66
65
#define SWITCH_GYRO_SCALE_MULT 936.0f
67
- #define SWITCH_ACCEL_SCALE_OFFSET 16384.0f
68
66
#define SWITCH_ACCEL_SCALE_MULT 4.0f
69
67
70
68
typedef enum
@@ -925,6 +923,8 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
925
923
if (WriteSubcommand (ctx , k_eSwitchSubcommandIDs_SPIFlashRead , (uint8_t * )& readParams , sizeof (readParams ), & reply )) {
926
924
Uint8 * pIMUScale ;
927
925
Sint16 sAccelRawX , sAccelRawY , sAccelRawZ , sGyroRawX , sGyroRawY , sGyroRawZ ;
926
+ Sint16 sAccelSensCoeffX , sAccelSensCoeffY , sAccelSensCoeffZ ;
927
+ Sint16 sGyroSensCoeffX , sGyroSensCoeffY , sGyroSensCoeffZ ;
928
928
929
929
/* IMU scale gives us multipliers for converting raw values to real world values */
930
930
pIMUScale = reply -> spiReadData .rgucReadData ;
@@ -933,10 +933,18 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
933
933
sAccelRawY = (pIMUScale [3 ] << 8 ) | pIMUScale [2 ];
934
934
sAccelRawZ = (pIMUScale [5 ] << 8 ) | pIMUScale [4 ];
935
935
936
+ sAccelSensCoeffX = (pIMUScale [7 ] << 8 ) | pIMUScale [6 ];
937
+ sAccelSensCoeffY = (pIMUScale [9 ] << 8 ) | pIMUScale [8 ];
938
+ sAccelSensCoeffZ = (pIMUScale [11 ] << 8 ) | pIMUScale [10 ];
939
+
936
940
sGyroRawX = (pIMUScale [13 ] << 8 ) | pIMUScale [12 ];
937
941
sGyroRawY = (pIMUScale [15 ] << 8 ) | pIMUScale [14 ];
938
942
sGyroRawZ = (pIMUScale [17 ] << 8 ) | pIMUScale [16 ];
939
943
944
+ sGyroSensCoeffX = (pIMUScale [19 ] << 8 ) | pIMUScale [18 ];
945
+ sGyroSensCoeffY = (pIMUScale [21 ] << 8 ) | pIMUScale [20 ];
946
+ sGyroSensCoeffZ = (pIMUScale [23 ] << 8 ) | pIMUScale [22 ];
947
+
940
948
/* Check for user calibration data. If it's present and set, it'll override the factory settings */
941
949
readParams .unAddress = k_unSPIIMUUserScaleStartOffset ;
942
950
readParams .ucLength = k_unSPIIMUUserScaleLength ;
@@ -953,14 +961,14 @@ static SDL_bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
953
961
}
954
962
955
963
/* 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 ;
959
967
960
968
/* 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 ;
964
972
965
973
} else {
966
974
/* Use default values */
0 commit comments