//Update and prepare XInput byte data void PrepareXInputDataEmpty(ControllerStatus Controller) { try { //Set report structure XUSB_REPORT usbReport = new XUSB_REPORT(); //Set submit structure Controller.XInputData = new XUSB_INPUT_REPORT(); Controller.XInputData.Size = Marshal.SizeOf(Controller.XInputData); Controller.XInputData.SerialNo = Controller.NumberId + 1; Controller.XInputData.Report = usbReport; } catch { } }
/// <summary> /// Submits an <see cref="Xbox360Report"/> to this device which will update its state. /// </summary> /// <param name="report">The <see cref="Xbox360Report"/> to submit.</param> public void SendReport(Xbox360Report report) { // Convert managed to unmanaged structure var submit = new XUSB_REPORT { wButtons = report.Buttons, bLeftTrigger = report.LeftTrigger, bRightTrigger = report.RightTrigger, sThumbLX = report.LeftThumbX, sThumbLY = report.LeftThumbY, sThumbRX = report.RightThumbX, sThumbRY = report.RightThumbY }; var error = ViGEmClient.vigem_target_x360_update(Client.NativeHandle, NativeHandle, submit); switch (error) { case VIGEM_ERROR.VIGEM_ERROR_BUS_NOT_FOUND: case VIGEM_ERROR.VIGEM_ERROR_INVALID_TARGET: throw new ViGEmException(error); } }
//Update and prepare XInput byte data void PrepareXInputDataCurrent(ControllerStatus Controller) { try { //Set report structure XUSB_REPORT usbReport = new XUSB_REPORT(); //Set current input //Thumbs usbReport.sThumbLX = (short)Controller.InputCurrent.ThumbLeftX; usbReport.sThumbLY = (short)Controller.InputCurrent.ThumbLeftY; usbReport.sThumbRX = (short)Controller.InputCurrent.ThumbRightX; usbReport.sThumbRY = (short)Controller.InputCurrent.ThumbRightY; //Triggers if (!Controller.Details.Profile.UseButtonTriggers) { usbReport.bLeftTrigger = Controller.InputCurrent.TriggerLeft; usbReport.bRightTrigger = Controller.InputCurrent.TriggerRight; } else { if (Controller.InputCurrent.ButtonTriggerLeft.PressedRaw) { usbReport.bLeftTrigger = 255; } if (Controller.InputCurrent.ButtonTriggerRight.PressedRaw) { usbReport.bRightTrigger = 255; } } //D-Pad if (Controller.InputCurrent.DPadLeft.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT; } if (Controller.InputCurrent.DPadUp.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_DPAD_UP; } if (Controller.InputCurrent.DPadRight.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_DPAD_RIGHT; } if (Controller.InputCurrent.DPadDown.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_DPAD_DOWN; } //Buttons if (Controller.InputCurrent.ButtonA.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_A; } if (Controller.InputCurrent.ButtonB.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_B; } if (Controller.InputCurrent.ButtonX.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_X; } if (Controller.InputCurrent.ButtonY.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_Y; } if (Controller.InputCurrent.ButtonBack.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_BACK; } if (Controller.InputCurrent.ButtonStart.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_START; } if (Controller.InputCurrent.ButtonGuide.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_GUIDE; } if (Controller.InputCurrent.ButtonShoulderLeft.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_LEFT_SHOULDER; } if (Controller.InputCurrent.ButtonShoulderRight.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_SHOULDER; } if (Controller.InputCurrent.ButtonThumbLeft.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_LEFT_THUMB; } if (Controller.InputCurrent.ButtonThumbRight.PressedRaw) { usbReport.wButtons |= XUSB_BUTTON.XUSB_GAMEPAD_RIGHT_THUMB; } //Set submit structure Controller.XInputData = new XUSB_INPUT_REPORT(); Controller.XInputData.Size = Marshal.SizeOf(Controller.XInputData); Controller.XInputData.SerialNo = Controller.NumberId + 1; Controller.XInputData.Report = usbReport; } catch { } }