Skip to content

Commit 038a380

Browse files
committed
Fixed Nintendo Switch Pro thumbstick calibration
Fixes #13246
1 parent e6c2649 commit 038a380

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

src/joystick/hidapi/SDL_hidapi_switch.c

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -979,7 +979,7 @@ static bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
979979
/* Stick calibration values are 12-bits each and are packed by bit
980980
* For whatever reason the fields are in a different order for each stick
981981
* Left: X-Max, Y-Max, X-Center, Y-Center, X-Min, Y-Min
982-
* Right: X-Center, Y-Center, X-Min, Y-Min, X-Max, Y-Max
982+
* Right: X-Center, Y-Center, X-Max, Y-Max, X-Min, Y-Min
983983
*/
984984

985985
// Left stick
@@ -993,10 +993,10 @@ static bool LoadStickCalibration(SDL_DriverSwitch_Context *ctx)
993993
// Right stick
994994
ctx->m_StickCalData[1].axis[0].sCenter = ((pRightStickCal[1] << 8) & 0xF00) | pRightStickCal[0]; // X Axis center
995995
ctx->m_StickCalData[1].axis[1].sCenter = (pRightStickCal[2] << 4) | (pRightStickCal[1] >> 4); // Y Axis center
996-
ctx->m_StickCalData[1].axis[0].sMin = ((pRightStickCal[4] << 8) & 0xF00) | pRightStickCal[3]; // X Axis min below center
997-
ctx->m_StickCalData[1].axis[1].sMin = (pRightStickCal[5] << 4) | (pRightStickCal[4] >> 4); // Y Axis min below center
998-
ctx->m_StickCalData[1].axis[0].sMax = ((pRightStickCal[7] << 8) & 0xF00) | pRightStickCal[6]; // X Axis max above center
999-
ctx->m_StickCalData[1].axis[1].sMax = (pRightStickCal[8] << 4) | (pRightStickCal[7] >> 4); // Y Axis max above center
996+
ctx->m_StickCalData[1].axis[0].sMax = ((pRightStickCal[4] << 8) & 0xF00) | pRightStickCal[3]; // X Axis max above center
997+
ctx->m_StickCalData[1].axis[1].sMax = (pRightStickCal[5] << 4) | (pRightStickCal[4] >> 4); // Y Axis max above center
998+
ctx->m_StickCalData[1].axis[0].sMin = ((pRightStickCal[7] << 8) & 0xF00) | pRightStickCal[6]; // X Axis min below center
999+
ctx->m_StickCalData[1].axis[1].sMin = (pRightStickCal[8] << 4) | (pRightStickCal[7] >> 4); // Y Axis min below center
10001000

10011001
// Filter out any values that were uninitialized (0xFFF) in the SPI read
10021002
for (stick = 0; stick < 2; ++stick) {
@@ -1109,14 +1109,17 @@ static Sint16 ApplyStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, i
11091109
{
11101110
sRawValue -= ctx->m_StickCalData[nStick].axis[nAxis].sCenter;
11111111

1112-
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
1113-
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
1114-
}
1115-
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
1116-
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
1112+
if (sRawValue >= 0) {
1113+
if (sRawValue > ctx->m_StickExtents[nStick].axis[nAxis].sMax) {
1114+
ctx->m_StickExtents[nStick].axis[nAxis].sMax = sRawValue;
1115+
}
1116+
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_StickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
1117+
} else {
1118+
if (sRawValue < ctx->m_StickExtents[nStick].axis[nAxis].sMin) {
1119+
ctx->m_StickExtents[nStick].axis[nAxis].sMin = sRawValue;
1120+
}
1121+
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
11171122
}
1118-
1119-
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_StickExtents[nStick].axis[nAxis].sMin, ctx->m_StickExtents[nStick].axis[nAxis].sMax, SDL_MIN_SINT16, SDL_MAX_SINT16);
11201123
}
11211124

11221125
static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nStick, int nAxis, Sint16 sRawValue)
@@ -1126,14 +1129,17 @@ static Sint16 ApplySimpleStickCalibration(SDL_DriverSwitch_Context *ctx, int nSt
11261129

11271130
sRawValue -= usJoystickCenter;
11281131

1129-
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
1130-
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
1131-
}
1132-
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
1133-
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
1132+
if (sRawValue >= 0) {
1133+
if (sRawValue > ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax) {
1134+
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax = sRawValue;
1135+
}
1136+
return (Sint16)HIDAPI_RemapVal(sRawValue, 0, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax, 0, SDL_MAX_SINT16);
1137+
} else {
1138+
if (sRawValue < ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin) {
1139+
ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin = sRawValue;
1140+
}
1141+
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, 0, SDL_MIN_SINT16, 0);
11341142
}
1135-
1136-
return (Sint16)HIDAPI_RemapVal(sRawValue, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMin, ctx->m_SimpleStickExtents[nStick].axis[nAxis].sMax, SDL_MIN_SINT16, SDL_MAX_SINT16);
11371143
}
11381144

11391145
static Uint8 RemapButton(SDL_DriverSwitch_Context *ctx, Uint8 button)

0 commit comments

Comments
 (0)