GamePad Right Trigger polls as cbutton(leftstick) and caxis

Hi,

I’m building a client/server for game controllers using SDL2’s new Game Controller API. Everything is working excellently…except for when I poll an SDL_Event, the right trigger is polling as both the cbutton.button (SDL_CONTROLLER_BUTTON_LEFTSTICK) and it’s normal caxis.axis (SDL_CONTROLLER_AXIS_TRIGGERRIGHT). I checked my code to make sure I didn’t miss any break statements between the switches as well as my values on the server side. The debugger stops on SDL_CONTROLLER_BUTTON_LEFTSTICK(this happens after It already stops on it’s proper caxis.axis event) when I press the right trigger. Any insight as to why this might be happening would be greatly appreciated, especially from the library developers :slight_smile: Thank you!

My computer is a Del Inspiron 15 7000 series with Windows 8.1 and i7 Processor.
The controller I’m using is a Playstation 4 controller.

Here’s the code:

Code:

void InputHandler::HandleInput(bool & quit)
{
while (SDL_PollEvent(&inputEvent))
{
switch (inputEvent.type)
{
case SDL_QUIT:
quit = true;
SDL_Quit();
break;
case SDL_CONTROLLERDEVICEADDED:
cserv.AddController(inputEvent.cdevice.which);
break;
case SDL_CONTROLLERDEVICEREMOVED:
cserv.RemoveController(inputEvent.cdevice.which);
break;
case SDL_CONTROLLERBUTTONDOWN:
switch (inputEvent.cbutton.button)
{
case SDL_CONTROLLER_BUTTON_DPAD_UP:
cserv.OnDUpPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
cserv.OnDDownPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
cserv.OnDRightPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
cserv.OnDLeftPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_A:
cserv.OnAButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_B:
cserv.OnBButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_X:
cserv.OnXButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_Y:
cserv.OnYButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_START:
cserv.OnStartButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_BACK:
cserv.OnSelectButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
cserv.OnLButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
cserv.OnRButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_LEFTSTICK:
cserv.OnLStickButtonPressed(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_RIGHTSTICK:
cserv.OnRStickButtonPressed(inputEvent.cbutton.which);
break;
}
break;
case SDL_CONTROLLERBUTTONUP:
switch (inputEvent.cbutton.button)
{
case SDL_CONTROLLER_BUTTON_DPAD_UP:
cserv.OnDUpReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
cserv.OnDDownReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
cserv.OnDRightReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
cserv.OnDLeftReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_A:
cserv.OnAButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_B:
cserv.OnBButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_X:
cserv.OnXButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_Y:
cserv.OnYButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_START:
cserv.OnStartButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_BACK:
cserv.OnSelectButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER:
cserv.OnLButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER:
cserv.OnRButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_LEFTSTICK:
cserv.OnLStickButtonReleased(inputEvent.cbutton.which);
break;
case SDL_CONTROLLER_BUTTON_RIGHTSTICK:
cserv.OnRStickButtonReleased(inputEvent.cbutton.which);
break;
}
break;
case SDL_CONTROLLERAXISMOTION:
switch (inputEvent.caxis.axis)
{
case SDL_CONTROLLER_AXIS_LEFTX:
if (inputEvent.caxis.value > cserv.GetDeadzone() || inputEvent.caxis.value < -cserv.GetDeadzone())
{
cserv.OnLStickXPressed(inputEvent.caxis.which);
cserv.SetLStickXVel(inputEvent.caxis.value);
}
else
{
cserv.OnLStickXReleased(inputEvent.caxis.which);
cserv.SetLStickXVel(0);
}
break;
case SDL_CONTROLLER_AXIS_LEFTY:
if (inputEvent.caxis.value > cserv.GetDeadzone() || inputEvent.caxis.value < -cserv.GetDeadzone())
{
cserv.OnLStickYPressed(inputEvent.caxis.which);
cserv.SetLStickYVel(inputEvent.caxis.value);
}
else
{
cserv.OnLStickYReleased(inputEvent.caxis.which);
cserv.SetLStickYVel(0);
}

			break;
		case SDL_CONTROLLER_AXIS_RIGHTX:
			if (inputEvent.caxis.value > cserv.GetDeadzone() || inputEvent.caxis.value < -cserv.GetDeadzone())
			{
				cserv.OnRStickXPressed(inputEvent.caxis.which);
				cserv.SetRStickXVel(inputEvent.caxis.value);
			
			}
			else
			{
				cserv.OnRStickXReleased(inputEvent.caxis.which);
				cserv.SetRStickXVel(0);
			}
			break;
		case SDL_CONTROLLER_AXIS_RIGHTY:
			if (inputEvent.caxis.value > cserv.GetDeadzone() || inputEvent.caxis.value < -cserv.GetDeadzone())
			{
				cserv.OnRStickYPressed(inputEvent.caxis.which);
				cserv.SetRStickYVel(inputEvent.caxis.value);
			}
			else
			{
				cserv.OnRStickYReleased(inputEvent.caxis.which);
				cserv.SetRStickYVel(0);
			}
			break;
		case SDL_CONTROLLER_AXIS_TRIGGERLEFT:
			if (inputEvent.caxis.value > cserv.GetDeadzone())
			{
				cserv.OnLTriggerPressed(inputEvent.caxis.which);
				cserv.SetLTriggerVel(inputEvent.caxis.value);
			}
			else
			{
				cserv.OnLTriggerReleased(inputEvent.caxis.which);
				cserv.SetLTriggerVel(0);
			}
			break;
		case SDL_CONTROLLER_AXIS_TRIGGERRIGHT:
			if (inputEvent.caxis.value > cserv.GetDeadzone())
			{
				cserv.OnRTriggerPressed(inputEvent.caxis.which);
				cserv.SetRTriggerVel(inputEvent.caxis.value);
			}
			else
			{
				cserv.OnRTriggerReleased(inputEvent.caxis.which);
				cserv.SetRTriggerVel(0);
			}
			break;
		case SDL_CONTROLLER_AXIS_MAX:
			#ifdef CONSOLE_DEBUG_
							std::cout << "MAX AXIS" << std::endl;
			#endif
			break;
		case SDL_CONTROLLER_AXIS_INVALID:
			#ifdef CONSOLE_DEBUG_
							std::cout << "INVALID AXIS" << std::endl;
			#endif
			break;
		}
		break;
	case SDL_FINGERDOWN:
		tserv.OnFingerDown();
		tserv.IncrementFingerCount(4);
		tserv.AddFinger(inputEvent.tfinger.fingerId, inputEvent.tfinger.pressure, 
						SCREEN_WIDTH * inputEvent.tfinger.x, SCREEN_HEIGHT * inputEvent.tfinger.y);
		break;
	case SDL_FINGERUP:
		tserv.OnFingerUp(); 
		tserv.RemoveFinger(inputEvent.tfinger.fingerId);
		tserv.DecrementFingerCount();
		break;
	case SDL_FINGERMOTION:
		tserv.distanceX = SCREEN_WIDTH * inputEvent.tfinger.dx;
		tserv.distanceY = SCREEN_HEIGHT * inputEvent.tfinger.dy;
		for (int i = 0; i < tserv.fingers.size(); i++)
		{
			if (tserv.fingers[i].id == inputEvent.tfinger.fingerId)
			{
				tserv.fingers[i].x = SCREEN_WIDTH * inputEvent.tfinger.x;
				tserv.fingers[i].y = SCREEN_HEIGHT * inputEvent.tfinger.y;
				break;
			}
		}
		break;
	case SDL_KEYDOWN:
		switch (inputEvent.key.keysym.sym)
		{
		case SDLK_ESCAPE:
			quit = true;
			SDL_Quit();
			break;
		case SDLK_UP:
			kserv.OnUpPressed();
			break;
		case SDLK_DOWN:
			kserv.OnDownPressed();
			break;
		case SDLK_RIGHT:
			kserv.OnRightPressed();
			break;
		case SDLK_LEFT:
			kserv.OnLeftPressed();
			break;
		case SDLK_RETURN:
			kserv.OnEnterPressed();
			break;
		case SDLK_SPACE:
			kserv.OnSpacePressed();
			break;
		case SDLK_w:
			kserv.OnWPressed();
			break;
		case SDLK_a:
			kserv.OnAPressed();
			break;
		case SDLK_s:
			kserv.OnSPressed();
			break;
		case SDLK_d:
			kserv.OnDPressed();
			break;
		}
		break;
	case SDL_KEYUP:
		switch (inputEvent.key.keysym.sym)
		{
		case SDLK_UP:
			kserv.OnUpReleased();
			break;
		case SDLK_DOWN:
			kserv.OnDownReleased();
			break;
		case SDLK_RIGHT:
			kserv.OnRightReleased();
			break;
		case SDLK_LEFT:
			kserv.OnLeftReleased();
			break;
		case SDLK_RETURN:
			kserv.OnEnterReleased();
			break;
		case SDLK_SPACE:
			kserv.OnSpaceReleased();
			break;
		case SDLK_w:
			kserv.OnWReleased();
			break;
		case SDLK_a:
			kserv.OnAReleased();
			break;
		case SDLK_s:
			kserv.OnSReleased();
			break;
		case SDLK_d:
			kserv.OnDReleased();
			break;
		}
		break;
	case SDL_MOUSEMOTION:
		mserv.x = inputEvent.motion.x;
		mserv.y = inputEvent.motion.y;
		break;
	case SDL_MOUSEBUTTONDOWN:
		switch (inputEvent.button.button)
		{
		case SDL_BUTTON_LEFT:
			mserv.OnLeftPressed();
			break;
		case SDL_BUTTON_RIGHT:
			mserv.OnRightPressed();
			break;
		}
		break;
	case SDL_MOUSEBUTTONUP:
		switch (inputEvent.button.button)
		{
		case SDL_BUTTON_LEFT:
			mserv.OnLeftReleased();
			break;
		case SDL_BUTTON_RIGHT:
			mserv.OnRightReleased();
			break;
		}
		break;
	case SDL_MOUSEWHEEL:

		mserv.wheelX = inputEvent.wheel.x;
		mserv.wheelY = inputEvent.wheel.y;
		break;
	}
}

}

Also, this bug disappears when I use the free InputMapper program that allows my controller to map to XInput for steam game usage, so it must be a controller mapping issue rather than my code. Does anyone know what may be causing this?