Skip to content

Commit 6a71328

Browse files
committed
Fixed Nintendo Switch Pro thumbstick calibration
Fixes #13246 (cherry picked from commit 038a380)
1 parent 6701f93 commit 6a71328

File tree

1 file changed

+26
-22
lines changed

1 file changed

+26
-22
lines changed

src/joystick/hidapi/SDL_hidapi_switch.c

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
817817
SwitchSPIOpData_t readFactoryParams;
818818
const int MAX_ATTEMPTS = 3;
819819
int attempt;
820-
820+
821821
/* Read User Calibration Info */
822822
readUserParams.unAddress = k_unSPIStickUserCalibrationStartOffset;
823823
readUserParams.ucLength = k_unSPIStickUserCalibrationLength;
@@ -860,7 +860,7 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
860860
/* Stick calibration values are 12-bits each and are packed by bit
861861
* For whatever reason the fields are in a different order for each stick
862862
* Left: X-Max, Y-Max, X-Center, Y-Center, X-Min, Y-Min
863-
* Right: X-Center, Y-Center, X-Min, Y-Min, X-Max, Y-Max
863+
* Right: X-Center, Y-Center, X-Max, Y-Max, X-Min, Y-Min
864864
*/
865865

866866
/* Left stick */
@@ -874,10 +874,10 @@ static SDL_bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
874874
/* Right stick */
875875
ctx->m_StickCalData[1].axis[0].sCenter = ((pRightStickCal[1] << 8) & 0xF00) | pRightStickCal[0]; /* X Axis center */
876876
ctx->m_StickCalData[1].axis[1].sCenter = (pRightStickCal[2] << 4) | (pRightStickCal[1] >> 4); /* Y Axis center */
877-
ctx->m_StickCalData[1].axis[0].sMin = ((pRightStickCal[4] << 8) & 0xF00) | pRightStickCal[3]; /* X Axis min below center */
878-
ctx->m_StickCalData[1].axis[1].sMin = (pRightStickCal[5] << 4) | (pRightStickCal[4] >> 4); /* Y Axis min below center */
879-
ctx->m_StickCalData[1].axis[0].sMax = ((pRightStickCal[7] << 8) & 0xF00) | pRightStickCal[6]; /* X Axis max above center */
880-
ctx->m_StickCalData[1].axis[1].sMax = (pRightStickCal[8] << 4) | (pRightStickCal[7] >> 4); /* Y Axis max above center */
877+
ctx->m_StickCalData[1].axis[0].sMax = ((pRightStickCal[4] << 8) & 0xF00) | pRightStickCal[3]; /* X Axis max above center */
878+
ctx->m_StickCalData[1].axis[1].sMax = (pRightStickCal[5] << 4) | (pRightStickCal[4] >> 4); /* Y Axis max above center */
879+
ctx->m_StickCalData[1].axis[0].sMin = ((pRightStickCal[7] << 8) & 0xF00) | pRightStickCal[6]; /* X Axis min below center */
880+
ctx->m_StickCalData[1].axis[1].sMin = (pRightStickCal[8] << 4) | (pRightStickCal[7] >> 4); /* Y Axis min below center */
881881

882882
/* Filter out any values that were uninitialized (0xFFF) in the SPI read */
883883
for (stick = 0; stick < 2; ++stick) {
@@ -990,15 +990,17 @@ static Sint16 ApplyStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, i
990990
{
991991
sRawValue -= ctx->m_StickCalData[nStick].axis[nAxis].sCenter;
992992

993-
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
994-
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
995-
}
996-
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
997-
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
993+
if (sRawValue >= 0) {
994+
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
995+
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
996+
}
997+
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_StickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
998+
} else {
999+
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
1000+
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
1001+
}
1002+
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
9981003
}
999-
1000-
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, ctx->m_StickExtents[nStick].axis[nAxis].sMax,
1001-
SDL_MIN_SINT16, SDL_MAX_SINT16);
10021004
}
10031005

10041006
static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, int nAxis, Sint16 sRawValue)
@@ -1008,15 +1010,17 @@ static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nSt
10081010

10091011
sRawValue -= usJoystickCenter;
10101012

1011-
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
1012-
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
1013-
}
1014-
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
1015-
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
1013+
if (sRawValue >= 0) {
1014+
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
1015+
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
1016+
}
1017+
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
1018+
} else {
1019+
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
1020+
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
1021+
}
1022+
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
10161023
}
1017-
1018-
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax,
1019-
SDL_MIN_SINT16, SDL_MAX_SINT16);
10201024
}
10211025

10221026
static void SDLCALL SDL_GameControllerButtonReportingHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint)

0 commit comments

Comments
 (0)