The SDL forums have moved to discourse.libsdl.org.
This is just a read-only archive of the previous forums, to keep old links working.


SDL Forum Index
SDL
Simple Directmedia Layer Forums
GamePad Right Trigger polls as cbutton(leftstick) and caxis
mjspritzer


Joined: 06 Mar 2015
Posts: 10
Location: Southern California
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 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;
      }
   }
}
mjspritzer


Joined: 06 Mar 2015
Posts: 10
Location: Southern California
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?