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 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;
}
}
}