public void Press(XINPUT_GAMEPAD_BUTTONS btn, int ticks = 0) { lock (_outputlock) { _nextButtons[btn] = ticks; // Zero opposite shoulder button if (btn == XINPUT_GAMEPAD_BUTTONS.RIGHT_SHOULDER) { _nextButtons[XINPUT_GAMEPAD_BUTTONS.LEFT_SHOULDER] = 0; } else if (btn == XINPUT_GAMEPAD_BUTTONS.LEFT_SHOULDER) { _nextButtons[XINPUT_GAMEPAD_BUTTONS.RIGHT_SHOULDER] = 0; } } }
private void Controler_ButtonPressed(object sender, XINPUT_GAMEPAD_BUTTONS e) { switch (e) { case XINPUT_GAMEPAD_BUTTONS.DPAD_UP: Timeline.ResetGameFromSavePointByMenu(); break; case XINPUT_GAMEPAD_BUTTONS.DPAD_DOWN: Timeline.UpdateLocationFromMenu(); break; case XINPUT_GAMEPAD_BUTTONS.START: MCP.BankHold = false; MCP.HeadingHold = false; MCP.VSHold = false; MCP.AltitudeHold = false; MCP.IASHold = false; MCP.LNAV = false; break; case XINPUT_GAMEPAD_BUTTONS.BACK: if (MCP.BankHold || MCP.HeadingHold || MCP.VSHold || MCP.AltitudeHold || MCP.IASHold | MCP.LNAV) { MCP.BankHold = false; MCP.HeadingHold = false; MCP.VSHold = false; MCP.AltitudeHold = false; MCP.IASHold = false; MCP.LNAV = false; } else { MCP.AltitudeHold = true; MCP.LNAV = true; MCP.IASHold = true; } break; } Trace.WriteLine($"Button Pressed: {e}"); }
private bool UpdateState(int controller) { XINPUT_STATE pState = new XINPUT_STATE(); UInt32 err = XInputGetState((UInt32)controller, ref pState); if (err != ERROR_SUCCESS) { return(false); } if (pState.dwPacketNumber == lastPacketNumber[controller]) { // Controller state hasn't changed since last time return(true); } lastPacketNumber[controller] = pState.dwPacketNumber; XINPUT_GAMEPAD_BUTTONS buttons = pState.Gamepad.wButtons; // Face buttons buttonStates[controller, (int)XInputElement.BTN_A] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_A); buttonStates[controller, (int)XInputElement.BTN_B] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_B); buttonStates[controller, (int)XInputElement.BTN_X] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_X); buttonStates[controller, (int)XInputElement.BTN_Y] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_Y); buttonStates[controller, (int)XInputElement.BTN_BACK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_BACK); buttonStates[controller, (int)XInputElement.BTN_START] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_START); // D-pad buttonStates[controller, (int)XInputElement.BTN_DPAD_UP] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_UP); buttonStates[controller, (int)XInputElement.BTN_DPAD_DOWN] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_DOWN); buttonStates[controller, (int)XInputElement.BTN_DPAD_LEFT] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_LEFT); buttonStates[controller, (int)XInputElement.BTN_DPAD_RIGHT] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT); // Thumb buttons buttonStates[controller, (int)XInputElement.BTN_LSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_LEFT_THUMB); buttonStates[controller, (int)XInputElement.BTN_RSTICK] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_RIGHT_THUMB); // Shoulder buttons buttonStates[controller, (int)XInputElement.BTN_LSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT); buttonStates[controller, (int)XInputElement.BTN_RSHOULDER] = buttons.HasFlag(XINPUT_GAMEPAD_BUTTONS.XINPUT_GAMEPAD_DPAD_RIGHT); // Translate analog triggers to buttons buttonStates[controller, (int)XInputElement.BTN_LTRIGGER] = pState.Gamepad.bLeftTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD; buttonStates[controller, (int)XInputElement.BTN_RTRIGGER] = pState.Gamepad.bRightTrigger > XINPUT_GAMEPAD_TRIGGER_THRESHOLD; // Translate analog sticks to buttons Int16 lStickX = pState.Gamepad.sThumbLX; Int16 lStickY = pState.Gamepad.sThumbLY; if (Math.Sqrt(lStickX * lStickX + lStickY * lStickY) > XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) { double angle = Math.Atan2(lStickY, lStickX) + Math.PI; buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP] = (angle >= 3.53429174 && angle <= 5.89048623); buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN] = (angle >= 0.39269908 && angle <= 2.74889357); buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT] = (angle >= 5.10508806 || angle <= 1.17809725); buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899); } else { buttonStates[controller, (int)XInputElement.BTN_LSTICK_UP] = false; buttonStates[controller, (int)XInputElement.BTN_LSTICK_DOWN] = false; buttonStates[controller, (int)XInputElement.BTN_LSTICK_LEFT] = false; buttonStates[controller, (int)XInputElement.BTN_LSTICK_RIGHT] = false; } Int16 rStickX = pState.Gamepad.sThumbLX; Int16 rStickY = pState.Gamepad.sThumbLY; if (Math.Sqrt(rStickX * rStickX + rStickY * rStickY) > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) { double angle = Math.Atan2(lStickY, lStickX) + Math.PI; buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP] = (angle >= 3.53429174 && angle <= 5.89048623); buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN] = (angle >= 0.39269908 && angle <= 2.74889357); buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT] = (angle >= 5.10508806 || angle <= 1.17809725); buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = (angle >= 1.96349541 && angle <= 4.3196899); } else { buttonStates[controller, (int)XInputElement.BTN_RSTICK_UP] = false; buttonStates[controller, (int)XInputElement.BTN_RSTICK_DOWN] = false; buttonStates[controller, (int)XInputElement.BTN_RSTICK_LEFT] = false; buttonStates[controller, (int)XInputElement.BTN_RSTICK_RIGHT] = false; } return(true); }