58
58
#define SWITCH_GYRO_SCALE 14.2842f
59
59
#define SWITCH_ACCEL_SCALE 4096.f
60
60
61
- #define SWITCH_GYRO_SCALE_OFFSET 13371.0f
62
61
#define SWITCH_GYRO_SCALE_MULT 936.0f
63
- #define SWITCH_ACCEL_SCALE_OFFSET 16384.0f
64
62
#define SWITCH_ACCEL_SCALE_MULT 4.0f
65
63
66
64
enum
@@ -1044,6 +1042,8 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
1044
1042
if (WriteSubcommand (ctx , k_eSwitchSubcommandIDs_SPIFlashRead , (uint8_t * )& readParams , sizeof (readParams ), & reply )) {
1045
1043
Uint8 * pIMUScale ;
1046
1044
Sint16 sAccelRawX , sAccelRawY , sAccelRawZ , sGyroRawX , sGyroRawY , sGyroRawZ ;
1045
+ Sint16 sAccelSensCoeffX , sAccelSensCoeffY , sAccelSensCoeffZ ;
1046
+ Sint16 sGyroSensCoeffX , sGyroSensCoeffY , sGyroSensCoeffZ ;
1047
1047
1048
1048
// IMU scale gives us multipliers for converting raw values to real world values
1049
1049
pIMUScale = reply -> spiReadData .rgucReadData ;
@@ -1052,10 +1052,18 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
1052
1052
sAccelRawY = (pIMUScale [3 ] << 8 ) | pIMUScale [2 ];
1053
1053
sAccelRawZ = (pIMUScale [5 ] << 8 ) | pIMUScale [4 ];
1054
1054
1055
+ sAccelSensCoeffX = (pIMUScale [7 ] << 8 ) | pIMUScale [6 ];
1056
+ sAccelSensCoeffY = (pIMUScale [9 ] << 8 ) | pIMUScale [8 ];
1057
+ sAccelSensCoeffZ = (pIMUScale [11 ] << 8 ) | pIMUScale [10 ];
1058
+
1055
1059
sGyroRawX = (pIMUScale [13 ] << 8 ) | pIMUScale [12 ];
1056
1060
sGyroRawY = (pIMUScale [15 ] << 8 ) | pIMUScale [14 ];
1057
1061
sGyroRawZ = (pIMUScale [17 ] << 8 ) | pIMUScale [16 ];
1058
1062
1063
+ sGyroSensCoeffX = (pIMUScale [19 ] << 8 ) | pIMUScale [18 ];
1064
+ sGyroSensCoeffY = (pIMUScale [21 ] << 8 ) | pIMUScale [20 ];
1065
+ sGyroSensCoeffZ = (pIMUScale [23 ] << 8 ) | pIMUScale [22 ];
1066
+
1059
1067
// Check for user calibration data. If it's present and set, it'll override the factory settings
1060
1068
readParams .unAddress = k_unSPIIMUUserScaleStartOffset ;
1061
1069
readParams .ucLength = k_unSPIIMUUserScaleLength ;
@@ -1072,14 +1080,14 @@ static bool LoadIMUCalibration(SDL_DriverSwitch_Context *ctx)
1072
1080
}
1073
1081
1074
1082
// 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 ;
1078
1086
1079
1087
// 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 ;
1083
1091
1084
1092
} else {
1085
1093
// Use default values
0 commit comments