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