protected override void SetButtonState(BindingDescriptor bindingDescriptor, int state) { var inputId = bindingDescriptor.Index; report.SetButtonState(buttonIndexes[inputId], state != 0); SendReport(); }
private void ParseKey(Xbox360Buttons target, Xbox360Report controllerReport, uint dwFlags = 0) { if ((int)target < 0) { return; } if (dwFlags == 0) { controllerReport.SetButtonState(target, true); } else { controllerReport.SetButtonState(target, false); } }
/// <summary> /// Implements <see cref="IXOutputInterface.Report(int, Dictionary{XInputTypes, double})"/> /// </summary> /// <param name="controllerCount">Number of controller</param> /// <param name="values">values for each XInput</param> /// <returns>If it was successful</returns> public bool Report(int controllerCount, Dictionary <XInputTypes, double> values) { if (controllers.ContainsKey(controllerCount)) { var report = new Xbox360Report(); foreach (var value in values) { if (value.Key.IsAxis()) { var mapping = axisMappings[value.Key]; report.SetAxis(mapping.Type, mapping.GetValue(value.Value)); } else { var mapping = buttonMappings[value.Key]; report.SetButtonState(mapping.Type, mapping.GetValue(value.Value)); } } controllers[controllerCount].SendReport(report); return(true); } return(false); }
public void FeedDevice(uint i) { // Get old and new game pad values. var n = CombinedXInputStates[i - 1].Gamepad; var report = new Xbox360Report(); // Update only when change. report.SetButtonState(Xbox360Buttons.A, n.Buttons.HasFlag(GamepadButtonFlags.A)); report.SetButtonState(Xbox360Buttons.B, n.Buttons.HasFlag(GamepadButtonFlags.B)); report.SetButtonState(Xbox360Buttons.X, n.Buttons.HasFlag(GamepadButtonFlags.X)); report.SetButtonState(Xbox360Buttons.Y, n.Buttons.HasFlag(GamepadButtonFlags.Y)); report.SetButtonState(Xbox360Buttons.Start, n.Buttons.HasFlag(GamepadButtonFlags.Start)); report.SetButtonState(Xbox360Buttons.Back, n.Buttons.HasFlag(GamepadButtonFlags.Back)); report.SetButtonState(Xbox360Buttons.LeftThumb, n.Buttons.HasFlag(GamepadButtonFlags.LeftThumb)); report.SetButtonState(Xbox360Buttons.RightThumb, n.Buttons.HasFlag(GamepadButtonFlags.RightThumb)); report.SetButtonState(Xbox360Buttons.LeftShoulder, n.Buttons.HasFlag(GamepadButtonFlags.LeftShoulder)); report.SetButtonState(Xbox360Buttons.LeftShoulder, n.Buttons.HasFlag(GamepadButtonFlags.RightShoulder)); report.SetButtonState(Xbox360Buttons.Up, n.Buttons.HasFlag(GamepadButtonFlags.DPadUp)); report.SetButtonState(Xbox360Buttons.Right, n.Buttons.HasFlag(GamepadButtonFlags.DPadRight)); report.SetButtonState(Xbox360Buttons.Down, n.Buttons.HasFlag(GamepadButtonFlags.DPadDown)); report.SetButtonState(Xbox360Buttons.Left, n.Buttons.HasFlag(GamepadButtonFlags.DPadLeft)); report.SetAxis(Xbox360Axes.LeftTrigger, n.LeftTrigger); report.SetAxis(Xbox360Axes.RightTrigger, n.RightTrigger); report.SetAxis(Xbox360Axes.LeftThumbX, n.LeftThumbX); report.SetAxis(Xbox360Axes.LeftThumbY, n.LeftThumbY); report.SetAxis(Xbox360Axes.RightThumbX, n.RightThumbX); report.SetAxis(Xbox360Axes.RightThumbY, n.RightThumbY); // Compare with old state. var o = oldGamepadStates[i - 1]; var changed = n.Buttons != o.Buttons || n.LeftThumbX != o.LeftThumbX || n.LeftThumbY != o.LeftThumbY || n.LeftTrigger != o.LeftTrigger || n.RightThumbX != o.RightThumbX || n.RightThumbY != o.RightThumbY || n.RightTrigger != o.RightTrigger; // If state changed then... if (changed) { // Update controller. ViGEmClient.Targets[i - 1].SendReport(report); // Update old state. oldGamepadStates[i - 1] = n; } }
private int ProcessButtonsAndStick(byte[] report_buf) { if (report_buf[0] == 0x00) { return(-1); } stick_raw[0] = report_buf[6 + (isLeft ? 0 : 3)]; stick_raw[1] = report_buf[7 + (isLeft ? 0 : 3)]; stick_raw[2] = report_buf[8 + (isLeft ? 0 : 3)]; if (isPro) { stick2_raw[0] = report_buf[6 + (!isLeft ? 0 : 3)]; stick2_raw[1] = report_buf[7 + (!isLeft ? 0 : 3)]; stick2_raw[2] = report_buf[8 + (!isLeft ? 0 : 3)]; } stick_precal[0] = (UInt16)(stick_raw[0] | ((stick_raw[1] & 0xf) << 8)); stick_precal[1] = (UInt16)((stick_raw[1] >> 4) | (stick_raw[2] << 4)); stick = CenterSticks(stick_precal, stick_cal, deadzone); if (isPro) { stick2_precal[0] = (UInt16)(stick2_raw[0] | ((stick2_raw[1] & 0xf) << 8)); stick2_precal[1] = (UInt16)((stick2_raw[1] >> 4) | (stick2_raw[2] << 4)); stick2 = CenterSticks(stick2_precal, stick2_cal, deadzone2); } // Read other Joycon's sticks if (isLeft && other != null) { stick2 = otherStick; other.otherStick = stick; } if (!isLeft && other != null) { Array.Copy(stick, stick2, 2); stick = otherStick; other.otherStick = stick2; } // lock (buttons) { lock (down_) { for (int i = 0; i < buttons.Length; ++i) { down_[i] = buttons[i]; } } buttons[(int)Button.DPAD_DOWN] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x01 : 0x04)) != 0; buttons[(int)Button.DPAD_RIGHT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x04 : 0x08)) != 0; buttons[(int)Button.DPAD_UP] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x02 : 0x02)) != 0; buttons[(int)Button.DPAD_LEFT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x08 : 0x01)) != 0; buttons[(int)Button.HOME] = ((report_buf[4] & 0x10) != 0); buttons[(int)Button.MINUS] = ((report_buf[4] & 0x01) != 0); buttons[(int)Button.PLUS] = ((report_buf[4] & 0x02) != 0); buttons[(int)Button.STICK] = ((report_buf[4] & (isLeft ? 0x08 : 0x04)) != 0); buttons[(int)Button.SHOULDER_1] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x40) != 0; buttons[(int)Button.SHOULDER_2] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x80) != 0; buttons[(int)Button.SR] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x10) != 0; buttons[(int)Button.SL] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x20) != 0; if (isPro) { buttons[(int)Button.B] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x01 : 0x04)) != 0; buttons[(int)Button.A] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x04 : 0x08)) != 0; buttons[(int)Button.X] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x02 : 0x02)) != 0; buttons[(int)Button.Y] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x08 : 0x01)) != 0; buttons[(int)Button.STICK2] = ((report_buf[4] & (!isLeft ? 0x08 : 0x04)) != 0); buttons[(int)Button.SHOULDER2_1] = (report_buf[3 + (!isLeft ? 2 : 0)] & 0x40) != 0; buttons[(int)Button.SHOULDER2_2] = (report_buf[3 + (!isLeft ? 2 : 0)] & 0x80) != 0; report.SetButtonState(Xbox360Buttons.A, buttons[(int)(!swapButtons ? Button.B : Button.A)]); report.SetButtonState(Xbox360Buttons.B, buttons[(int)(!swapButtons ? Button.A : Button.B)]); report.SetButtonState(Xbox360Buttons.Y, buttons[(int)(!swapButtons ? Button.X : Button.Y)]); report.SetButtonState(Xbox360Buttons.X, buttons[(int)(!swapButtons ? Button.Y : Button.X)]); report.SetButtonState(Xbox360Buttons.Up, buttons[(int)Button.DPAD_UP]); report.SetButtonState(Xbox360Buttons.Down, buttons[(int)Button.DPAD_DOWN]); report.SetButtonState(Xbox360Buttons.Left, buttons[(int)Button.DPAD_LEFT]); report.SetButtonState(Xbox360Buttons.Right, buttons[(int)Button.DPAD_RIGHT]); report.SetButtonState(Xbox360Buttons.Back, buttons[(int)Button.MINUS]); report.SetButtonState(Xbox360Buttons.Start, buttons[(int)Button.PLUS]); report.SetButtonState(Xbox360Buttons.Guide, buttons[(int)Button.HOME]); report.SetButtonState(Xbox360Buttons.LeftShoulder, buttons[(int)Button.SHOULDER_1]); report.SetButtonState(Xbox360Buttons.RightShoulder, buttons[(int)Button.SHOULDER2_1]); report.SetButtonState(Xbox360Buttons.LeftThumb, buttons[(int)Button.STICK]); report.SetButtonState(Xbox360Buttons.RightThumb, buttons[(int)Button.STICK2]); } if (other != null) { buttons[(int)(Button.B)] = other.buttons[(int)Button.DPAD_DOWN]; buttons[(int)(Button.A)] = other.buttons[(int)Button.DPAD_RIGHT]; buttons[(int)(Button.X)] = other.buttons[(int)Button.DPAD_UP]; buttons[(int)(Button.Y)] = other.buttons[(int)Button.DPAD_LEFT]; buttons[(int)Button.STICK2] = other.buttons[(int)Button.STICK]; buttons[(int)Button.SHOULDER2_1] = other.buttons[(int)Button.SHOULDER_1]; buttons[(int)Button.SHOULDER2_2] = other.buttons[(int)Button.SHOULDER_2]; } if (isLeft && other != null) { buttons[(int)Button.HOME] = other.buttons[(int)Button.HOME]; buttons[(int)Button.PLUS] = other.buttons[(int)Button.PLUS]; } if (!isLeft && other != null) { buttons[(int)Button.MINUS] = other.buttons[(int)Button.MINUS]; } if (!isPro && other != null && xin != null) { report.SetButtonState(!swapButtons ? Xbox360Buttons.A : Xbox360Buttons.B, buttons[(int)(isLeft ? Button.B : Button.DPAD_DOWN)]); report.SetButtonState(!swapButtons ? Xbox360Buttons.B : Xbox360Buttons.A, buttons[(int)(isLeft ? Button.A : Button.DPAD_RIGHT)]); report.SetButtonState(!swapButtons ? Xbox360Buttons.Y : Xbox360Buttons.X, buttons[(int)(isLeft ? Button.X : Button.DPAD_UP)]); report.SetButtonState(!swapButtons ? Xbox360Buttons.X : Xbox360Buttons.Y, buttons[(int)(isLeft ? Button.Y : Button.DPAD_LEFT)]); report.SetButtonState(Xbox360Buttons.Up, buttons[(int)(isLeft ? Button.DPAD_UP : Button.X)]); report.SetButtonState(Xbox360Buttons.Down, buttons[(int)(isLeft ? Button.DPAD_DOWN : Button.B)]); report.SetButtonState(Xbox360Buttons.Left, buttons[(int)(isLeft ? Button.DPAD_LEFT : Button.Y)]); report.SetButtonState(Xbox360Buttons.Right, buttons[(int)(isLeft ? Button.DPAD_RIGHT : Button.A)]); report.SetButtonState(Xbox360Buttons.Back, buttons[(int)Button.MINUS]); report.SetButtonState(Xbox360Buttons.Start, buttons[(int)Button.PLUS]); report.SetButtonState(Xbox360Buttons.Guide, buttons[(int)Button.HOME]); report.SetButtonState(Xbox360Buttons.LeftShoulder, buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER2_1)]); report.SetButtonState(Xbox360Buttons.RightShoulder, buttons[(int)(isLeft ? Button.SHOULDER2_1 : Button.SHOULDER_1)]); report.SetButtonState(Xbox360Buttons.LeftThumb, buttons[(int)(isLeft ? Button.STICK : Button.STICK2)]); report.SetButtonState(Xbox360Buttons.RightThumb, buttons[(int)(isLeft ? Button.STICK2 : Button.STICK)]); } lock (buttons_up) { lock (buttons_down) { for (int i = 0; i < buttons.Length; ++i) { buttons_up[i] = (down_[i] & !buttons[i]); buttons_down[i] = (!down_[i] & buttons[i]); } } } } if (xin != null) { report.SetAxis(Xbox360Axes.LeftThumbX, (short)Math.Max(Int16.MinValue, Math.Min(Int16.MaxValue, stick[0] * (stick[0] > 0 ? Int16.MaxValue : -Int16.MinValue)))); report.SetAxis(Xbox360Axes.LeftThumbY, (short)Math.Max(Int16.MinValue, Math.Min(Int16.MaxValue, stick[1] * (stick[0] > 0 ? Int16.MaxValue : -Int16.MinValue)))); report.SetAxis(Xbox360Axes.RightThumbX, (short)Math.Max(Int16.MinValue, Math.Min(Int16.MaxValue, stick2[0] * (stick[0] > 0 ? Int16.MaxValue : -Int16.MinValue)))); report.SetAxis(Xbox360Axes.RightThumbY, (short)Math.Max(Int16.MinValue, Math.Min(Int16.MaxValue, stick2[1] * (stick[0] > 0 ? Int16.MaxValue : -Int16.MinValue)))); report.SetAxis(Xbox360Axes.LeftTrigger, (short)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? Int16.MaxValue : 0)); report.SetAxis(Xbox360Axes.RightTrigger, (short)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? Int16.MaxValue : 0)); } return(0); }
private void DeviceWorker() { Console.WriteLine("Starting worker thread for {0}", _Device.ToString()); // Open HID device to read input from the gamepad _Device.OpenDevice(DeviceMode.Overlapped, DeviceMode.Overlapped, ShareMode.ShareRead | ShareMode.ShareWrite); // Init Xiaomi Gamepad vibration _Device.WriteFeatureData(new byte[] { 0x20, 0x00, 0x00 }); // Connect the virtual Xbox360 gamepad try { _Target.Connect(); } catch (VigemAlreadyConnectedException e) { _Target.Disconnect(); _Target.Connect(); } Started?.Invoke(this, EventArgs.Empty); HidReport hidReport; while (!_CTS.Token.IsCancellationRequested) { // Is device has been closed, exit the loop if (!_Device.IsOpen) { break; } // Otherwise read a report hidReport = _Device.ReadReport(1000); if (hidReport.ReadStatus == HidDeviceData.ReadStatus.WaitTimedOut) { continue; } else if (hidReport.ReadStatus != HidDeviceData.ReadStatus.Success) { Console.WriteLine("Device {0}: error while reading HID report, {1}", _Device.ToString(), hidReport.ReadStatus.ToString()); break; } var data = hidReport.Data; /* * [0] Buttons state, 1 bit per button * [1] Buttons state, 1 bit per button * [2] 0x00 * [3] D-Pad * [4] Left thumb, X axis * [5] Left thumb, Y axis * [6] Right thumb, X axis * [7] Right thumb, Y axis * [8] 0x00 * [9] 0x00 * [10] L trigger * [11] R trigger * [12] Accelerometer axis 1 * [13] Accelerometer axis 1 * [14] Accelerometer axis 2 * [15] Accelerometer axis 2 * [16] Accelerometer axis 3 * [17] Accelerometer axis 3 * [18] Battery level * [19] MI button */ lock (_Report) { _Report.SetButtonState(Xbox360Buttons.A, GetBit(data[0], 0)); _Report.SetButtonState(Xbox360Buttons.B, GetBit(data[0], 1)); _Report.SetButtonState(Xbox360Buttons.X, GetBit(data[0], 3)); _Report.SetButtonState(Xbox360Buttons.Y, GetBit(data[0], 4)); _Report.SetButtonState(Xbox360Buttons.LeftShoulder, GetBit(data[0], 6)); _Report.SetButtonState(Xbox360Buttons.RightShoulder, GetBit(data[0], 7)); _Report.SetButtonState(Xbox360Buttons.Back, GetBit(data[1], 2)); _Report.SetButtonState(Xbox360Buttons.Start, GetBit(data[1], 3)); _Report.SetButtonState(Xbox360Buttons.LeftThumb, GetBit(data[1], 5)); _Report.SetButtonState(Xbox360Buttons.RightThumb, GetBit(data[1], 6)); // Reset Hat switch status, as is set to 15 (all directions set, impossible state) _Report.SetButtonState(Xbox360Buttons.Up, false); _Report.SetButtonState(Xbox360Buttons.Left, false); _Report.SetButtonState(Xbox360Buttons.Down, false); _Report.SetButtonState(Xbox360Buttons.Right, false); if (data[3] < 8) { var btns = HatSwitches[data[3]]; // Hat Switch is a number from 0 to 7, where 0 is Up, 1 is Up-Left, etc. _Report.SetButtons(btns); } // Analog axis _Report.SetAxis(Xbox360Axes.LeftThumbX, MapAnalog(data[4])); _Report.SetAxis(Xbox360Axes.LeftThumbY, MapAnalog(data[5], true)); _Report.SetAxis(Xbox360Axes.RightThumbX, MapAnalog(data[6])); _Report.SetAxis(Xbox360Axes.RightThumbY, MapAnalog(data[7], true)); // Triggers _Report.SetAxis(Xbox360Axes.LeftTrigger, data[10]); _Report.SetAxis(Xbox360Axes.RightTrigger, data[11]); // Logo ("home") button if (GetBit(data[19], 0)) { _Report.SetButtonState((Xbox360Buttons)0x0400, true); Task.Delay(200).ContinueWith(DelayedReleaseGuideButton); } // Update battery level BatteryLevel = data[18]; _Target.SendReport(_Report); } } // Disconnect the virtual Xbox360 gamepad // Let Dispose handle that, otherwise it will rise a NotPluggedIn exception //_Target.Disconnect(); // Close the HID device _Device.CloseDevice(); Console.WriteLine("Exiting worker thread for {0}", _Device.ToString()); Ended?.Invoke(this, EventArgs.Empty); }
public void DoProcessing(IProgress <string> message, IProgress <string> xUpdate, IProgress <string> rawXUpdate, IProgress <string> yUpdate, IProgress <string> rawYUpdate, Joystick joystick, Keyboard keyboard, CancellationToken cancellationToken) { ViGEmClient client = new ViGEmClient(); Xbox360Controller controller = new Xbox360Controller(client); ControllerBindingsStorage bindingStorage = new ControllerBindingsStorage(); Dictionary <int, int> bindings = bindingStorage.load(); Xbox360Axes? analogStickAxisX = null; Xbox360Axes? analogStickAxisY = null; Xbox360Axes? digitalStickAxisX = null; Xbox360Axes? digitalStickAxisY = null; Xbox360Buttons? joystickButton0 = null; bool leftTriggerLastPressed = false; bool leftTriggerPressed = false; bool rightTriggerLastPressed = false; bool rightTriggerPressed = false; bool digitalStickUpLastPressed = false; bool digitalStickUpPressed = false; bool digitalStickDownLastPressed = false; bool digitalStickDownPressed = false; bool digitalStickLeftLastPressed = false; bool digitalStickLeftPressed = false; bool digitalStickRightLastPressed = false; bool digitalStickRightPressed = false; foreach (KeyValuePair <int, int> binding in bindings) { if (binding.Key == (int)Xbox360StorageButtons.AnalogStick) { AnalogStickBinding analogStickBinding = (AnalogStickBinding)Enum.Parse(typeof(AnalogStickBinding), binding.Value.ToString()); switch (analogStickBinding) { case AnalogStickBinding.LeftStick: analogStickAxisX = Xbox360Axes.LeftThumbX; analogStickAxisY = Xbox360Axes.LeftThumbY; digitalStickAxisX = Xbox360Axes.RightThumbX; digitalStickAxisY = Xbox360Axes.RightThumbY; break; case AnalogStickBinding.RightStick: analogStickAxisX = Xbox360Axes.RightThumbX; analogStickAxisY = Xbox360Axes.RightThumbY; digitalStickAxisX = Xbox360Axes.LeftThumbX; digitalStickAxisY = Xbox360Axes.LeftThumbY; break; } } if (binding.Value == (int)Key.JoystickButton) { joystickButton0 = (Xbox360Buttons)Enum.Parse(typeof(Xbox360Buttons), binding.Key.ToString()); } } controller.Connect(); message.Report("Virtual Xbox 360 controller created!"); Xbox360Report report = new Xbox360Report(); while (true) { if (cancellationToken.IsCancellationRequested) { controller.Disconnect(); return; } joystick.Poll(); JoystickUpdate[] updates = joystick.GetBufferedData(); foreach (JoystickUpdate update in updates) { int value = (update.Value - 32767); if (update.Offset == JoystickOffset.X || update.Offset == JoystickOffset.Y || update.Offset == JoystickOffset.Buttons0) { if (analogStickAxisX != null && analogStickAxisX.HasValue && analogStickAxisY != null && analogStickAxisY.HasValue) { if (update.Offset == JoystickOffset.X) { short x = getConstrainedValue(value); report.SetAxis(analogStickAxisX.Value, x); xUpdate.Report(x.ToString()); rawXUpdate.Report((update.Value - 32767).ToString()); } if (update.Offset == JoystickOffset.Y) { short y = getConstrainedValue(value * -1); report.SetAxis(analogStickAxisY.Value, y); yUpdate.Report(y.ToString()); rawYUpdate.Report(((update.Value - 32767) * -1).ToString()); } } if (update.Offset == JoystickOffset.Buttons0 && joystickButton0 != null && joystickButton0.HasValue) { bool buttonValue = update.Value > 0 ? true : false; report.SetButtonState(joystickButton0.Value, buttonValue); } } message.Report(update.Offset.ToString() + ": " + value.ToString()); } keyboard.Poll(); KeyboardUpdate[] keyboardUpdates = keyboard.GetBufferedData(); foreach (KeyboardUpdate keyboardUpdate in keyboardUpdates) { foreach (KeyValuePair <int, int> binding in bindings) { if ((int)keyboardUpdate.Key == binding.Value) { Xbox360Buttons?button = null; switch (binding.Key) { case (int)Xbox360StorageButtons.Guide: button = Xbox360Buttons.Guide; break; case (int)Xbox360StorageButtons.Start: button = Xbox360Buttons.Start; break; case (int)Xbox360StorageButtons.Back: button = Xbox360Buttons.Back; break; case (int)Xbox360StorageButtons.LeftShoulder: button = Xbox360Buttons.LeftShoulder; break; case (int)Xbox360StorageButtons.RightShoulder: button = Xbox360Buttons.RightShoulder; break; case (int)Xbox360StorageButtons.LeftTrigger: leftTriggerPressed = keyboardUpdate.Value == 128 ? true : false; break; case (int)Xbox360StorageButtons.RightTrigger: rightTriggerPressed = keyboardUpdate.Value == 128 ? true : false; break; case (int)Xbox360StorageButtons.A: button = Xbox360Buttons.A; break; case (int)Xbox360StorageButtons.B: button = Xbox360Buttons.B; break; case (int)Xbox360StorageButtons.X: button = Xbox360Buttons.X; break; case (int)Xbox360StorageButtons.Y: button = Xbox360Buttons.Y; break; case (int)Xbox360StorageButtons.Up: button = Xbox360Buttons.Up; break; case (int)Xbox360StorageButtons.Down: button = Xbox360Buttons.Down; break; case (int)Xbox360StorageButtons.Left: button = Xbox360Buttons.Left; break; case (int)Xbox360StorageButtons.Right: button = Xbox360Buttons.Right; break; case (int)Xbox360StorageButtons.LeftThumb: button = Xbox360Buttons.LeftThumb; break; case (int)Xbox360StorageButtons.RightThumb: button = Xbox360Buttons.RightThumb; break; case (int)Xbox360StorageButtons.DigitalStickUp: digitalStickUpPressed = keyboardUpdate.Value == 128 ? true : false; break; case (int)Xbox360StorageButtons.DigitalStickDown: digitalStickDownPressed = keyboardUpdate.Value == 128 ? true : false; break; case (int)Xbox360StorageButtons.DigitalStickLeft: digitalStickLeftPressed = keyboardUpdate.Value == 128 ? true : false; break; case (int)Xbox360StorageButtons.DigitalStickRight: digitalStickRightPressed = keyboardUpdate.Value == 128 ? true : false; break; } if (button != null && button.HasValue) { bool pressed = keyboardUpdate.Value == 128 ? true : false; report.SetButtonState(button.Value, pressed); } message.Report("Keyboard - Key: " + keyboardUpdate.Key + " Value: " + keyboardUpdate.Value); } } } if (leftTriggerPressed != leftTriggerLastPressed) { if (leftTriggerPressed) { report.LeftTrigger = 255; } else { report.LeftTrigger = 0; } leftTriggerLastPressed = leftTriggerPressed; } if (rightTriggerPressed != rightTriggerLastPressed) { if (rightTriggerPressed) { report.RightTrigger = 255; } else { report.RightTrigger = 0; } rightTriggerLastPressed = rightTriggerPressed; } if (digitalStickUpPressed != digitalStickUpLastPressed) { if (digitalStickUpPressed) { report.SetAxis(digitalStickAxisY.Value, 32767); } else { report.SetAxis(digitalStickAxisY.Value, 0); } digitalStickUpLastPressed = digitalStickUpPressed; } if (digitalStickDownPressed != digitalStickDownLastPressed) { if (digitalStickDownPressed) { report.SetAxis(digitalStickAxisY.Value, -32768); } else { report.SetAxis(digitalStickAxisY.Value, 0); } digitalStickDownLastPressed = digitalStickDownPressed; } if (digitalStickLeftPressed != digitalStickLeftLastPressed) { if (digitalStickLeftPressed) { report.SetAxis(digitalStickAxisX.Value, -32768); } else { report.SetAxis(digitalStickAxisX.Value, 0); } digitalStickLeftLastPressed = digitalStickLeftPressed; } if (digitalStickRightPressed != digitalStickRightLastPressed) { if (digitalStickRightPressed) { report.SetAxis(digitalStickAxisX.Value, 32767); } else { report.SetAxis(digitalStickAxisX.Value, 0); } digitalStickRightLastPressed = digitalStickRightPressed; } controller.SendReport(report); Thread.Sleep(1); } }
public void Update(short lX, short lY, short rX, short rY, ControllerButtons buttons) { // Axes iReport.LeftThumbX = lX; iReport.LeftThumbY = lY; iReport.RightThumbX = rX; iReport.RightThumbY = rY; // Face buttons iReport.SetButtonState(Xbox360Buttons.Y, (buttons & ControllerButtons.BTN_Button1) != 0); iReport.SetButtonState(Xbox360Buttons.B, (buttons & ControllerButtons.BTN_Button2) != 0); iReport.SetButtonState(Xbox360Buttons.A, (buttons & ControllerButtons.BTN_Button3) != 0); iReport.SetButtonState(Xbox360Buttons.X, (buttons & ControllerButtons.BTN_Button4) != 0); // POV buttons iReport.SetButtonState(Xbox360Buttons.Up, (buttons & ControllerButtons.BTN_POV_Up) != 0); iReport.SetButtonState(Xbox360Buttons.Down, (buttons & ControllerButtons.BTN_POV_Down) != 0); iReport.SetButtonState(Xbox360Buttons.Left, (buttons & ControllerButtons.BTN_POV_Left) != 0); iReport.SetButtonState(Xbox360Buttons.Right, (buttons & ControllerButtons.BTN_POV_Right) != 0); // L buttons iReport.SetButtonState(Xbox360Buttons.LeftShoulder, (buttons & ControllerButtons.BTN_L1) != 0); iReport.LeftTrigger = ((buttons & ControllerButtons.BTN_L2) == ControllerButtons.BTN_L2) ? byte.MaxValue : byte.MinValue; iReport.SetButtonState(Xbox360Buttons.LeftThumb, (buttons & ControllerButtons.BTN_L3) != 0); // R buttons iReport.SetButtonState(Xbox360Buttons.RightShoulder, (buttons & ControllerButtons.BTN_R1) != 0); iReport.RightTrigger = ((buttons & ControllerButtons.BTN_R2) == ControllerButtons.BTN_R2) ? byte.MaxValue : byte.MinValue; iReport.SetButtonState(Xbox360Buttons.RightThumb, (buttons & ControllerButtons.BTN_R3) != 0); // Start/Select iReport.SetButtonState(Xbox360Buttons.Start, (buttons & ControllerButtons.BTN_Start) != 0); iReport.SetButtonState(Xbox360Buttons.Back, (buttons & ControllerButtons.BTN_Select) != 0); ctrl.SendReport(iReport); }
private void DeviceWorker() { Console.WriteLine("Starting worker thread for {0}", _Device.ToString()); // Open HID device to read input from the gamepad _Device.OpenDevice(DeviceMode.Overlapped, DeviceMode.Overlapped, ShareMode.ShareRead | ShareMode.ShareWrite); // Init Xiaomi Gamepad vibration _Device.WriteFeatureData(new byte[] { 0x20, 0x00, 0x00 }); // Connect the virtual Xbox360 gamepad try { _Target.Connect(); } catch (VigemAlreadyConnectedException e) { _Target.Disconnect(); _Target.Connect(); } HidReport hidReport; Xbox360Report xInputReport = new Xbox360Report(); while (!_CTS.Token.IsCancellationRequested) { // Is device has been closed, exit the loop if (!_Device.IsOpen) { break; } // Otherwise read a report hidReport = _Device.ReadReport(1000); if (hidReport.ReadStatus == HidDeviceData.ReadStatus.WaitTimedOut) { continue; } else if (hidReport.ReadStatus != HidDeviceData.ReadStatus.Success) { Console.WriteLine("Device {0}: error while reading HID report, {1}", _Device.ToString(), hidReport.ReadStatus.ToString()); break; } var data = hidReport.Data; xInputReport.SetButtonState(Xbox360Buttons.A, GetBit(data[0], 0)); xInputReport.SetButtonState(Xbox360Buttons.B, GetBit(data[0], 1)); xInputReport.SetButtonState(Xbox360Buttons.X, GetBit(data[0], 3)); xInputReport.SetButtonState(Xbox360Buttons.Y, GetBit(data[0], 4)); xInputReport.SetButtonState(Xbox360Buttons.LeftShoulder, GetBit(data[0], 6)); xInputReport.SetButtonState(Xbox360Buttons.RightShoulder, GetBit(data[0], 7)); xInputReport.SetButtonState(Xbox360Buttons.Back, GetBit(data[1], 2)); xInputReport.SetButtonState(Xbox360Buttons.Start, GetBit(data[1], 3)); xInputReport.SetButtonState(Xbox360Buttons.LeftThumb, GetBit(data[1], 5)); xInputReport.SetButtonState(Xbox360Buttons.RightThumb, GetBit(data[1], 6)); // Reset Hat switch status, as is set to 15 (all directions set, impossible state) xInputReport.SetButtonState(Xbox360Buttons.Up, false); xInputReport.SetButtonState(Xbox360Buttons.Left, false); xInputReport.SetButtonState(Xbox360Buttons.Down, false); xInputReport.SetButtonState(Xbox360Buttons.Right, false); if (data[3] < 8) { var btns = HatSwitches[data[3]]; // Hat Switch is a number from 0 to 7, where 0 is Up, 1 is Up-Left, etc. xInputReport.SetButtons(btns); } // Analog axis xInputReport.SetAxis(Xbox360Axes.LeftThumbX, MapAnalog(data[4])); xInputReport.SetAxis(Xbox360Axes.LeftThumbY, MapAnalog(data[5], true)); xInputReport.SetAxis(Xbox360Axes.RightThumbX, MapAnalog(data[6])); xInputReport.SetAxis(Xbox360Axes.RightThumbY, MapAnalog(data[7], true)); // Triggers xInputReport.SetAxis(Xbox360Axes.LeftTrigger, data[10]); xInputReport.SetAxis(Xbox360Axes.RightTrigger, data[11]); // Logo ("home") button if (GetBit(data[19], 0)) { _LogoButtonActive = true; _LogoButtonTimer = _LogoButtonTimer ?? new Timer(DeactivateLogoButton, null, Timeout.Infinite, Timeout.Infinite); _LogoButtonTimer.Change(200, Timeout.Infinite); } xInputReport.SetButtonState((Xbox360Buttons)0x0400, _LogoButtonActive); XInputReport = xInputReport; _Target.SendReport(xInputReport); } // Disconnect the virtual Xbox360 gamepad // Let Dispose handle that, otherwise it will rise a NotPluggedIn exception //_Target.Disconnect(); // Close the HID device _Device.CloseDevice(); Console.WriteLine("Exiting worker thread for {0}", _Device.ToString()); }
private int ProcessButtonsAndStick(byte[] report_buf) { if (report_buf[0] == 0x00) { return(-1); } stick_raw[0] = report_buf[6 + (isLeft ? 0 : 3)]; stick_raw[1] = report_buf[7 + (isLeft ? 0 : 3)]; stick_raw[2] = report_buf[8 + (isLeft ? 0 : 3)]; if (isPro) { stick2_raw[0] = report_buf[6 + (!isLeft ? 0 : 3)]; stick2_raw[1] = report_buf[7 + (!isLeft ? 0 : 3)]; stick2_raw[2] = report_buf[8 + (!isLeft ? 0 : 3)]; } stick_precal[0] = (UInt16)(stick_raw[0] | ((stick_raw[1] & 0xf) << 8)); stick_precal[1] = (UInt16)((stick_raw[1] >> 4) | (stick_raw[2] << 4)); ushort[] cal = form.nonOriginal ? new ushort[6] { 2048, 2048, 2048, 2048, 2048, 2048 } : stick_cal; ushort dz = form.nonOriginal ? (ushort)200 : deadzone; stick = CenterSticks(stick_precal, cal, dz); if (isPro) { stick2_precal[0] = (UInt16)(stick2_raw[0] | ((stick2_raw[1] & 0xf) << 8)); stick2_precal[1] = (UInt16)((stick2_raw[1] >> 4) | (stick2_raw[2] << 4)); stick2 = CenterSticks(stick2_precal, form.nonOriginal ? cal : stick2_cal, deadzone2); } // Read other Joycon's sticks if (isLeft && other != null && other != this) { stick2 = otherStick; other.otherStick = stick; } if (!isLeft && other != null && other != this) { Array.Copy(stick, stick2, 2); stick = otherStick; other.otherStick = stick2; } // // Set button states both for server and ViGEm lock (buttons) { lock (down_) { for (int i = 0; i < buttons.Length; ++i) { down_[i] = buttons[i]; } } buttons[(int)Button.DPAD_DOWN] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x01 : 0x04)) != 0; buttons[(int)Button.DPAD_RIGHT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x04 : 0x08)) != 0; buttons[(int)Button.DPAD_UP] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x02 : 0x02)) != 0; buttons[(int)Button.DPAD_LEFT] = (report_buf[3 + (isLeft ? 2 : 0)] & (isLeft ? 0x08 : 0x01)) != 0; buttons[(int)Button.HOME] = ((report_buf[4] & 0x10) != 0); buttons[(int)Button.CAPTURE] = ((report_buf[4] & 0x20) != 0); buttons[(int)Button.MINUS] = ((report_buf[4] & 0x01) != 0); buttons[(int)Button.PLUS] = ((report_buf[4] & 0x02) != 0); buttons[(int)Button.STICK] = ((report_buf[4] & (isLeft ? 0x08 : 0x04)) != 0); buttons[(int)Button.SHOULDER_1] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x40) != 0; buttons[(int)Button.SHOULDER_2] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x80) != 0; buttons[(int)Button.SR] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x10) != 0; buttons[(int)Button.SL] = (report_buf[3 + (isLeft ? 2 : 0)] & 0x20) != 0; if (isPro && xin != null) { buttons[(int)Button.B] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x01 : 0x04)) != 0; buttons[(int)Button.A] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x04 : 0x08)) != 0; buttons[(int)Button.X] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x02 : 0x02)) != 0; buttons[(int)Button.Y] = (report_buf[3 + (!isLeft ? 2 : 0)] & (!isLeft ? 0x08 : 0x01)) != 0; buttons[(int)Button.STICK2] = ((report_buf[4] & (!isLeft ? 0x08 : 0x04)) != 0); buttons[(int)Button.SHOULDER2_1] = (report_buf[3 + (!isLeft ? 2 : 0)] & 0x40) != 0; buttons[(int)Button.SHOULDER2_2] = (report_buf[3 + (!isLeft ? 2 : 0)] & 0x80) != 0; report.SetButtonState(Xbox360Buttons.A, buttons[(int)(!swapAB ? Button.B : Button.A)]); report.SetButtonState(Xbox360Buttons.B, buttons[(int)(!swapAB ? Button.A : Button.B)]); report.SetButtonState(Xbox360Buttons.Y, buttons[(int)(!swapXY ? Button.X : Button.Y)]); report.SetButtonState(Xbox360Buttons.X, buttons[(int)(!swapXY ? Button.Y : Button.X)]); report.SetButtonState(Xbox360Buttons.Up, buttons[(int)Button.DPAD_UP]); report.SetButtonState(Xbox360Buttons.Down, buttons[(int)Button.DPAD_DOWN]); report.SetButtonState(Xbox360Buttons.Left, buttons[(int)Button.DPAD_LEFT]); report.SetButtonState(Xbox360Buttons.Right, buttons[(int)Button.DPAD_RIGHT]); report.SetButtonState(Xbox360Buttons.Back, buttons[(int)Button.MINUS]); report.SetButtonState(Xbox360Buttons.Start, buttons[(int)Button.PLUS]); report.SetButtonState(Xbox360Buttons.Guide, buttons[(int)Button.HOME]); report.SetButtonState(Xbox360Buttons.LeftShoulder, buttons[(int)Button.SHOULDER_1]); report.SetButtonState(Xbox360Buttons.RightShoulder, buttons[(int)Button.SHOULDER2_1]); report.SetButtonState(Xbox360Buttons.LeftThumb, buttons[(int)Button.STICK]); report.SetButtonState(Xbox360Buttons.RightThumb, buttons[(int)Button.STICK2]); } if (other != null && other != this) { buttons[(int)(Button.B)] = other.buttons[(int)Button.DPAD_DOWN]; buttons[(int)(Button.A)] = other.buttons[(int)Button.DPAD_RIGHT]; buttons[(int)(Button.X)] = other.buttons[(int)Button.DPAD_UP]; buttons[(int)(Button.Y)] = other.buttons[(int)Button.DPAD_LEFT]; buttons[(int)Button.STICK2] = other.buttons[(int)Button.STICK]; buttons[(int)Button.SHOULDER2_1] = other.buttons[(int)Button.SHOULDER_1]; buttons[(int)Button.SHOULDER2_2] = other.buttons[(int)Button.SHOULDER_2]; } if (isLeft && other != null && other != this) { buttons[(int)Button.HOME] = other.buttons[(int)Button.HOME]; buttons[(int)Button.PLUS] = other.buttons[(int)Button.PLUS]; } if (!isLeft && other != null && other != this) { buttons[(int)Button.MINUS] = other.buttons[(int)Button.MINUS]; } if (!isPro && xin != null) { if (other != null) // no need for && other != this { report.SetButtonState(!swapAB ? Xbox360Buttons.A : Xbox360Buttons.B, buttons[(int)(isLeft ? Button.B : Button.DPAD_DOWN)]); report.SetButtonState(!swapAB ? Xbox360Buttons.B : Xbox360Buttons.A, buttons[(int)(isLeft ? Button.A : Button.DPAD_RIGHT)]); report.SetButtonState(!swapXY ? Xbox360Buttons.Y : Xbox360Buttons.X, buttons[(int)(isLeft ? Button.X : Button.DPAD_UP)]); report.SetButtonState(!swapXY ? Xbox360Buttons.X : Xbox360Buttons.Y, buttons[(int)(isLeft ? Button.Y : Button.DPAD_LEFT)]); report.SetButtonState(Xbox360Buttons.Up, buttons[(int)(isLeft ? Button.DPAD_UP : Button.X)]); report.SetButtonState(Xbox360Buttons.Down, buttons[(int)(isLeft ? Button.DPAD_DOWN : Button.B)]); report.SetButtonState(Xbox360Buttons.Left, buttons[(int)(isLeft ? Button.DPAD_LEFT : Button.Y)]); report.SetButtonState(Xbox360Buttons.Right, buttons[(int)(isLeft ? Button.DPAD_RIGHT : Button.A)]); report.SetButtonState(Xbox360Buttons.Back, buttons[(int)Button.MINUS]); report.SetButtonState(Xbox360Buttons.Start, buttons[(int)Button.PLUS]); report.SetButtonState(Xbox360Buttons.Guide, buttons[(int)Button.HOME]); report.SetButtonState(Xbox360Buttons.LeftShoulder, buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER2_1)]); report.SetButtonState(Xbox360Buttons.RightShoulder, buttons[(int)(isLeft ? Button.SHOULDER2_1 : Button.SHOULDER_1)]); report.SetButtonState(Xbox360Buttons.LeftThumb, buttons[(int)(isLeft ? Button.STICK : Button.STICK2)]); report.SetButtonState(Xbox360Buttons.RightThumb, buttons[(int)(isLeft ? Button.STICK2 : Button.STICK)]); } else // single joycon mode { report.SetButtonState(!swapAB ? Xbox360Buttons.A : Xbox360Buttons.B, buttons[(int)(isLeft ? Button.DPAD_LEFT : Button.DPAD_RIGHT)]); report.SetButtonState(!swapAB ? Xbox360Buttons.B : Xbox360Buttons.A, buttons[(int)(isLeft ? Button.DPAD_DOWN : Button.DPAD_UP)]); report.SetButtonState(!swapXY ? Xbox360Buttons.Y : Xbox360Buttons.X, buttons[(int)(isLeft ? Button.DPAD_RIGHT : Button.DPAD_LEFT)]); report.SetButtonState(!swapXY ? Xbox360Buttons.X : Xbox360Buttons.Y, buttons[(int)(isLeft ? Button.DPAD_UP : Button.DPAD_DOWN)]); report.SetButtonState(Xbox360Buttons.Back, buttons[(int)Button.MINUS] | buttons[(int)Button.HOME]); report.SetButtonState(Xbox360Buttons.Start, buttons[(int)Button.PLUS] | buttons[(int)Button.CAPTURE]); report.SetButtonState(Xbox360Buttons.LeftShoulder, buttons[(int)Button.SL]); report.SetButtonState(Xbox360Buttons.RightShoulder, buttons[(int)Button.SR]); report.SetButtonState(Xbox360Buttons.LeftThumb, buttons[(int)Button.STICK]); } } lock (buttons_up) { lock (buttons_down) { for (int i = 0; i < buttons.Length; ++i) { buttons_up[i] = (down_[i] & !buttons[i]); buttons_down[i] = (!down_[i] & buttons[i]); } } } } if (xin != null) { if (other != null || isPro) // no need for && other != this { report.SetAxis(Xbox360Axes.LeftThumbX, CastStickValue((other == this && !isLeft) ? stick2[0] : stick[0])); report.SetAxis(Xbox360Axes.LeftThumbY, CastStickValue((other == this && !isLeft) ? stick2[1] : stick[1])); report.SetAxis(Xbox360Axes.RightThumbX, CastStickValue((other == this && !isLeft) ? stick[0] : stick2[0])); report.SetAxis(Xbox360Axes.RightThumbY, CastStickValue((other == this && !isLeft) ? stick[1] : stick2[1])); } else // single joycon mode { report.SetAxis(Xbox360Axes.LeftThumbY, CastStickValue((isLeft ? 1 : -1) * stick[0])); report.SetAxis(Xbox360Axes.LeftThumbX, CastStickValue((isLeft ? -1 : 1) * stick[1])); } report.SetAxis(Xbox360Axes.LeftTrigger, (short)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? Int16.MaxValue : 0)); report.SetAxis(Xbox360Axes.RightTrigger, (short)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? Int16.MaxValue : 0)); } return(0); }
public void FeedDevice(uint i) { // Get old and new game pad values. var n = CombinedXiStates[i - 1].Gamepad; var report = new Xbox360Report(); // Update only when change. report.SetButtonState(Xbox360Buttons.A, n.Buttons.HasFlag(GamepadButtonFlags.A)); report.SetButtonState(Xbox360Buttons.B, n.Buttons.HasFlag(GamepadButtonFlags.B)); report.SetButtonState(Xbox360Buttons.X, n.Buttons.HasFlag(GamepadButtonFlags.X)); report.SetButtonState(Xbox360Buttons.Y, n.Buttons.HasFlag(GamepadButtonFlags.Y)); report.SetButtonState(Xbox360Buttons.Start, n.Buttons.HasFlag(GamepadButtonFlags.Start)); report.SetButtonState(Xbox360Buttons.Back, n.Buttons.HasFlag(GamepadButtonFlags.Back)); report.SetButtonState(Xbox360Buttons.LeftThumb, n.Buttons.HasFlag(GamepadButtonFlags.LeftThumb)); report.SetButtonState(Xbox360Buttons.RightThumb, n.Buttons.HasFlag(GamepadButtonFlags.RightThumb)); report.SetButtonState(Xbox360Buttons.LeftShoulder, n.Buttons.HasFlag(GamepadButtonFlags.LeftShoulder)); report.SetButtonState(Xbox360Buttons.RightShoulder, n.Buttons.HasFlag(GamepadButtonFlags.RightShoulder)); report.SetButtonState(Xbox360Buttons.Up, n.Buttons.HasFlag(GamepadButtonFlags.DPadUp)); report.SetButtonState(Xbox360Buttons.Right, n.Buttons.HasFlag(GamepadButtonFlags.DPadRight)); report.SetButtonState(Xbox360Buttons.Down, n.Buttons.HasFlag(GamepadButtonFlags.DPadDown)); report.SetButtonState(Xbox360Buttons.Left, n.Buttons.HasFlag(GamepadButtonFlags.DPadLeft)); report.SetAxis(Xbox360Axes.LeftTrigger, n.LeftTrigger); report.SetAxis(Xbox360Axes.RightTrigger, n.RightTrigger); report.SetAxis(Xbox360Axes.LeftThumbX, n.LeftThumbX); report.SetAxis(Xbox360Axes.LeftThumbY, n.LeftThumbY); report.SetAxis(Xbox360Axes.RightThumbX, n.RightThumbX); report.SetAxis(Xbox360Axes.RightThumbY, n.RightThumbY); // Compare with old state. var o = oldGamepadStates[i - 1]; var changed = n.Buttons != o.Buttons || n.LeftThumbX != o.LeftThumbX || n.LeftThumbY != o.LeftThumbY || n.LeftTrigger != o.LeftTrigger || n.RightThumbX != o.RightThumbX || n.RightThumbY != o.RightThumbY || n.RightTrigger != o.RightTrigger; // If state changed then... if (changed) { // Update controller. ViGEmClient.Current.Targets[i - 1].SendReport(report); lock (guideLock) { var isGuidePressed = n.Buttons.HasFlag(GamepadButtonFlags.Guide); if (isGuidePressed && !IsGuideDown) { var keys = GetGuideKeys(); if (keys.Count() > 0) { JocysCom.ClassLibrary.Processes.KeyboardHelper.SendDown(keys); } IsGuideDown = true; } if (!isGuidePressed && IsGuideDown) { var keys = GetGuideKeys(); if (keys.Count() > 0) { JocysCom.ClassLibrary.Processes.KeyboardHelper.SendUp(keys); } IsGuideDown = false; } } // Update old state. oldGamepadStates[i - 1] = n; } }
public void SetButtonState(Xbox360Buttons btn, bool state) { _report.SetButtonState(btn, state); }
protected override void OnMessage(MessageEventArgs e) { string button = e.Data.Split('/')[0]; string value = e.Data.Split('/')[1]; // Joysticks if (button == "0" || button == "1") { string[] percentages = value.Split(';'); switch (button) { case "0": report.SetAxis(Xbox360Axes.LeftThumbX, (short)(32767 * int.Parse(percentages[0]) / 100)); report.SetAxis(Xbox360Axes.LeftThumbY, (short)(32767 * int.Parse(percentages[1]) / 100)); break; case "1": report.SetAxis(Xbox360Axes.RightThumbX, (short)(32767 * int.Parse(percentages[0]) / 100)); report.SetAxis(Xbox360Axes.RightThumbY, (short)(32767 * int.Parse(percentages[1]) / 100)); break; } } // LT/RT else if (button == "6" || button == "7") { // If pressed, max value. Else, 0 short pressed = (value == "1") ? short.MaxValue : (short)0; switch (button) { case "8": report.SetAxis(Xbox360Axes.LeftTrigger, short.MaxValue); break; case "9": report.SetAxis(Xbox360Axes.RightTrigger, short.MaxValue); break; } } // Buttons else { // If value is 1, button is pressed bool pressed = (value == "1") ? true : false; switch (button) { case "2": report.SetButtonState(Xbox360Buttons.A, pressed); break; case "3": report.SetButtonState(Xbox360Buttons.X, pressed); break; case "4": report.SetButtonState(Xbox360Buttons.B, pressed); break; case "5": report.SetButtonState(Xbox360Buttons.Y, pressed); break; case "8": report.SetButtonState(Xbox360Buttons.LeftShoulder, pressed); break; case "9": report.SetButtonState(Xbox360Buttons.RightShoulder, pressed); break; case "10": report.SetButtonState(Xbox360Buttons.Left, pressed); break; case "11": report.SetButtonState(Xbox360Buttons.Up, pressed); break; case "12": report.SetButtonState(Xbox360Buttons.Right, pressed); break; case "13": report.SetButtonState(Xbox360Buttons.Down, pressed); break; case "14": report.SetButtonState(Xbox360Buttons.LeftThumb, pressed); break; case "15": report.SetButtonState(Xbox360Buttons.RightThumb, pressed); break; case "16": report.SetButtonState(Xbox360Buttons.Start, pressed); break; case "17": report.SetButtonState(Xbox360Buttons.Guide, pressed); break; } } controller.SendReport(report); }
protected override Xbox360Report MapToXInputDevice(JoystickState directInputState) { Xbox360Report report = new Xbox360Report(); report.SetButtonState(Xbox360Buttons.A, directInputState.Buttons[4]); report.SetButtonState(Xbox360Buttons.B, directInputState.Buttons[3]); report.SetButtonState(Xbox360Buttons.X, directInputState.Buttons[2]); report.SetButtonState(Xbox360Buttons.Y, directInputState.Buttons[1]); report.SetButtonState(Xbox360Buttons.Back, directInputState.Buttons[13]); report.SetButtonState(Xbox360Buttons.Guide, false); report.SetButtonState(Xbox360Buttons.Start, directInputState.Buttons[0]); report.SetButtonState(Xbox360Buttons.Up, directInputState.Buttons[8]); report.SetButtonState(Xbox360Buttons.Down, directInputState.Buttons[9]); report.SetButtonState(Xbox360Buttons.Left, directInputState.Buttons[11]); report.SetButtonState(Xbox360Buttons.Right, directInputState.Buttons[10]); report.SetButtonState(Xbox360Buttons.LeftShoulder, directInputState.Buttons[12]); report.SetButtonState(Xbox360Buttons.RightShoulder, directInputState.Buttons[7]); report.SetButtonState(Xbox360Buttons.LeftThumb, false); report.SetButtonState(Xbox360Buttons.RightThumb, false); report.LeftTrigger = (byte)(directInputState.Buttons[5] ? 0xFF : 0x00); report.RightTrigger = (byte)(directInputState.Buttons[6] ? 0xFF : 0x00); report.LeftThumbX = ClampToShort(directInputState.X - 32768); report.LeftThumbY = ClampToShort(-1 * (directInputState.Y - 32768)); report.RightThumbX = ClampToShort(directInputState.RotationX - 32768); report.RightThumbY = ClampToShort(-1 * (directInputState.RotationY - 32768)); return(report); }