public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, string path, string serialNum, int id = 0, bool isPro = false) { serial_number = serialNum; activeData = new float[6]; handle = handle_; imu_enabled = imu; do_localize = localize; rumble_obj = new Rumble(160, 320, 0); filterweight = alpha; isLeft = left; PadId = id; LED = (byte)(0x1 << PadId); this.isPro = isPro; isUSB = serialNum == "000000000001"; this.path = path; connection = isUSB ? 0x01 : 0x02; if (showAsXInput) { xin = new Xbox360Controller(Program.emClient); if (toRumble) { xin.FeedbackReceived += ReceiveRumble; } report = new Xbox360Report(); } }
private static void Main(string[] args) { var client = new ViGEmClient(); #if X360 var x360 = new Xbox360Controller(client); x360.FeedbackReceived += (sender, eventArgs) => Console.WriteLine( $"LM: {eventArgs.LargeMotor}, " + $"SM: {eventArgs.SmallMotor}, " + $"LED: {eventArgs.LedNumber}"); x360.Connect(); var report = new Xbox360Report(); report.SetButtons(Xbox360Buttons.A, Xbox360Buttons.B); report.SetAxis(Xbox360Axes.LeftTrigger, 0xFF); report.SetAxis(Xbox360Axes.RightTrigger, 0xFF); x360.SendReport(report); #endif var ds4 = new DualShock4Controller(client); ds4.Connect(); var report = new DualShock4Report(); report.SetButtons(DualShock4Buttons.Cross); ds4.SendReport(report); /* * var x360 = new Xbox360Controller(); * x360.FeedbackReceived += * (sender, eventArgs) => Console.WriteLine( * $"LM: {eventArgs.LargeMotor}, " + * $"SM: {eventArgs.SmallMotor}, " + * $"LED: {eventArgs.LedNumber}"); * x360.PlugIn(); * * var report = new Xbox360Report(); * report.SetButtons(Xbox360Buttons.A, Xbox360Buttons.B); * report.SetAxis(Xbox360Axes.LeftTrigger, 0xFF); * report.SetAxis(Xbox360Axes.RightTrigger, 0xFF); * * x360.SendReport(report); * * Console.ReadKey(); * * var ds4 = new DualShock4Controller(); * ds4.FeedbackReceived += * (sender, eventArgs) => Console.WriteLine( * $"LM: {eventArgs.LargeMotor}, " + * $"SM: {eventArgs.SmallMotor}, "); * ds4.PlugIn(); */ Console.ReadKey(); }
public Joycon(IntPtr handle, bool imu, bool left, string path, int id = 0, bool isPro = false, bool usb = false) { this.handle = handle; imu_enabled = imu; rumble_obj = new Rumble(160, 320, 0); isLeft = left; PadId = id; this.isPro = isPro; isUSB = usb; this.path = path; connection = isUSB ? 0x01 : 0x02; if (showAsXInput) { xin = new Xbox360Controller(Program.emClient); if (_toRumble) { xin.FeedbackReceived += ReceiveRumble; } report = new Xbox360Report(); } }
public Joycon(IntPtr handle_, bool imu, bool localize, float alpha, bool left, int id = 0, bool isPro = false, bool usb = false) { handle = handle_; imu_enabled = imu; do_localize = localize; rumble_obj = new Rumble(160, 320, 0); filterweight = alpha; isLeft = left; PadId = id; this.isPro = isPro; isUSB = usb; connection = isUSB ? 0x01 : 0x02; if (isLeft || isPro) { xin = new Xbox360Controller(Program.emClient); if (toRumble) { xin.FeedbackReceived += ReceiveRumble; } report = new Xbox360Report(); } }
public void OnKeyArray(byte[] buffer, Xbox360Report controllerReport) { _holdKeyCache[0] = 0; _holdKeyCache[1] = 0; _holdKeyCache[2] = 0; _holdKeyCache[3] = 0; for (int i = 0; i < buffer.Length; i++) { int target; if (this.config.Keymap.TryGetValue(buffer[i], out target)) { if (!HoldKeyCache.Contains((Xbox360Buttons)target)) { ParseKey((Xbox360Buttons)target, controllerReport); } _holdKeyCache[i] = (Xbox360Buttons)target; } } foreach (var _hk in HoldKeyCache) { if (!_holdKeyCache.Contains(_hk)) { ParseKey(_hk, controllerReport, 2); } } controllerReport.SetButtons(_holdKeyCache.Where(k => k > 0).ToArray()); HoldKeyCache = _holdKeyCache; }
public void OnRTrigger(byte[] value, Xbox360Report controllerReport) { if (this.config.RTrigger >= 0) { controllerReport.SetAxis((Xbox360Axes)this.config.RTrigger, value[0]); } }
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); }
/// <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 ViGEmClient.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 ViGEmClient.VIGEM_ERROR.VIGEM_ERROR_BUS_NOT_FOUND: throw new VigemBusNotFoundException(); case ViGEmClient.VIGEM_ERROR.VIGEM_ERROR_INVALID_TARGET: throw new VigemInvalidTargetException(); } }
private static void Main(string[] args) { var x360 = new Xbox360Controller(); x360.FeedbackReceived += (sender, eventArgs) => Console.WriteLine( $"LM: {eventArgs.LargeMotor}, " + $"SM: {eventArgs.SmallMotor}, " + $"LED: {eventArgs.LedNumber}"); x360.PlugIn(); var report = new Xbox360Report(); report.SetButtons(Xbox360Buttons.A, Xbox360Buttons.B); report.SetAxis(Xbox360Axes.LeftTrigger, 0xFF); report.SetAxis(Xbox360Axes.RightTrigger, 0xFF); x360.SendReport(report); Console.ReadKey(); var ds4 = new DualShock4Controller(); ds4.FeedbackReceived += (sender, eventArgs) => Console.WriteLine( $"LM: {eventArgs.LargeMotor}, " + $"SM: {eventArgs.SmallMotor}, "); ds4.PlugIn(); Console.ReadKey(); }
///------------------------------------------------------------------------------------------------- /// <summary> Sends a report. </summary> /// /// <remarks> Benjamin "Nefarius" Höglinger, 18.06.2017. </remarks> /// /// <exception cref="VigemBusNotFoundException"> Thrown when a Vigem Bus Not Found error /// condition occurs. /// </exception> /// <exception cref="VigemInvalidTargetException"> Thrown when a Vigem Invalid Target error /// condition occurs. /// </exception> /// /// <param name="report"> The report. </param> ///------------------------------------------------------------------------------------------------- public void SendReport(Xbox360Report report) { var submit = new ViGemUm.XusbReport() { wButtons = report.Buttons, bLeftTrigger = report.LeftTrigger, bRightTrigger = report.RightTrigger, sThumbLX = report.LeftThumbX, sThumbLY = report.LeftThumbY, sThumbRX = report.RightThumbX, sThumbRY = report.RightThumbY }; var error = ViGemUm.vigem_xusb_submit_report(Target, submit); // ReSharper disable once SwitchStatementMissingSomeCases switch (error) { case ViGemUm.VigemError.VigemErrorBusNotFound: throw new VigemBusNotFoundException( StringResource.VigemBusNotFoundException); case ViGemUm.VigemError.VigemErrorInvalidTarget: throw new VigemInvalidTargetException( StringResource.VigemInvalidTargetException); } }
public X360(Xbox360Controller pController, int pPort, Label pLblStatus, Button pBtnDisconnect) { controller = pController; port = pPort; lblStatus = pLblStatus; btnDisconnect = pBtnDisconnect; disconnected = false; report = new Xbox360Report(); }
protected void moveStick(Direction x, Direction y, Xbox360Controller controller) { if (controller != null && (x != Direction.Down || y != Direction.Down)) { for (short i = 0; i < 32767; i++) { Xbox360Report report = new Xbox360Report(); if (x == Direction.Up) { report.LeftThumbX = i; } else if (x == Direction.Down) { report.LeftThumbX = (short)(i * -1); } if (y == Direction.Up) { report.LeftThumbY = i; } else if (y == Direction.Down) { report.LeftThumbY = (short)(i * -1); } controller.SendReport(report); } for (short i = 32767; i > 0; i--) { Xbox360Report report = new Xbox360Report(); if (x == Direction.Up) { report.LeftThumbX = i; } else if (x == Direction.Down) { report.LeftThumbX = (short)(i * -1); } if (y == Direction.Up) { report.LeftThumbY = i; } else if (y == Direction.Down) { report.LeftThumbY = (short)(i * -1); } controller.SendReport(report); } } }
public override void OnBuffer(byte[] keyBuffer, byte[] lTrigger, byte[] rTrigger, byte[] lRemoteX, byte[] lRemoteY, byte[] rRemoteX, byte[] rRemoteY) { Xbox360Report controllerReport = new Xbox360Report(); OnKeyArray(keyBuffer, controllerReport); OnLeftRemote(lRemoteX, lRemoteY, controllerReport); OnRightRemote(rRemoteX, rRemoteY, controllerReport); OnLTrigger(lTrigger, controllerReport); OnRTrigger(rTrigger, controllerReport); myController.SendReport(controllerReport); }
public void OnRightRemote(byte[] x, byte[] y, Xbox360Report controllerReport) { if (this.config.RightRemoteX >= 0) { controllerReport.SetAxis((Xbox360Axes)this.config.RightRemoteX, getShort(x[0])); } if (this.config.RightRemoteY >= 0) { controllerReport.SetAxis((Xbox360Axes)this.config.RightRemoteY, getShort(y[0], true)); } }
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); } }
public MiGamepad(string device, ViGEmClient client) { _Device = HidDevices.GetDevice(device); _Device.MonitorDeviceEvents = false; _Target = new Xbox360Controller(client); _Target.FeedbackReceived += Target_OnFeedbackReceived; // TODO mark the threads as background? _InputThread = new Thread(DeviceWorker); _CTS = new CancellationTokenSource(); _Report = new Xbox360Report(); LedNumber = 0xFF; }
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; } }
/// <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 XboxImpl(Xbox360Controller X360Controller) { this.X360Controller = X360Controller; this.Report = new Xbox360Report(); }
static void Main(string[] args) { var client = new ViGEmClient(); var x360 = new Xbox360Controller(client); IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ConfigurationManager.AppSettings["bindAddr"]), UInt16.Parse(ConfigurationManager.AppSettings["bindPort"])); UdpClient newsock = new UdpClient(ipep); IPEndPoint senderep = new IPEndPoint(IPAddress.Any, 0); x360.FeedbackReceived += (sender, eventArgs) => { }; x360.Connect(); Console.WriteLine("Controller connected."); Console.WriteLine("Listening on {0}", ipep); var report = new Xbox360Report(); var lastRecv = DateTime.Now; float tt = 0; int second_counter = 0; while (true) { var dt_t = DateTime.Now - lastRecv; lastRecv = DateTime.Now; float dt = dt_t.Milliseconds / 1000.0f; InputStatus status; unsafe { fixed(byte *data = &newsock.Receive(ref senderep)[0]) { InputStatus *s = (InputStatus *)data; status = *s; } } report.Buttons = 0; for (int i = 0; i < 32; ++i) { if ((status.kHeld & (1 << i)) != 0) { Xbox360Buttons?button = X3DSMap[i]; if (button != null) { report.SetButtons(button.Value); } } } if (status.touch.px > 0 && status.touch.py > 0) { if (status.touch.px < 320 / 3) { report.SetButtons(Xbox360Buttons.LeftThumb); } else if (status.touch.px > 320 / 3 * 2) { report.SetButtons(Xbox360Buttons.RightThumb); } else { report.SetButtons(Xbox360Buttons.LeftThumb, Xbox360Buttons.RightThumb); } } report.SetAxis(Xbox360Axes.LeftThumbX, (short)((float)status.pad.dx * Int16.MaxValue / 160.0f)); report.SetAxis(Xbox360Axes.LeftThumbY, (short)((float)status.pad.dy * Int16.MaxValue / 160.0f)); report.SetAxis(Xbox360Axes.RightThumbX, (short)((float)status.cstick.dx * Int16.MaxValue / 160.0f)); report.SetAxis(Xbox360Axes.RightThumbY, (short)((float)status.cstick.dy * Int16.MaxValue / 160.0f)); if ((status.kHeld & (1 << 14)) != 0) { report.SetAxis(Xbox360Axes.LeftTrigger, Int16.MaxValue); } else { report.SetAxis(Xbox360Axes.LeftTrigger, Int16.MinValue); } if ((status.kHeld & (1 << 15)) != 0) { report.SetAxis(Xbox360Axes.RightTrigger, Int16.MaxValue); } else { report.SetAxis(Xbox360Axes.RightTrigger, Int16.MinValue); } x360.SendReport(report); second_counter++; tt += dt; if (tt > 1.0f) { Console.WriteLine("{0} packet received", second_counter); tt = 0; second_counter = 0; } } Console.ReadKey(); }
private static void Main(string[] args) { var client = new ViGEmClient(); #if X360 var x360 = new Xbox360Controller(client); x360.FeedbackReceived += (sender, eventArgs) => Console.WriteLine( $"LM: {eventArgs.LargeMotor}, " + $"SM: {eventArgs.SmallMotor}, " + $"LED: {eventArgs.LedNumber}"); x360.Connect(); var report = new Xbox360Report(); report.SetButtons(Xbox360Buttons.A, Xbox360Buttons.B); report.SetAxis(Xbox360Axes.LeftTrigger, 0xFF); report.SetAxis(Xbox360Axes.RightTrigger, 0xFF); x360.SendReport(report); #endif Console.Title = "ViGEm Benchmark - CLOSE THIS WINDOW TO STOP!"; Console.WriteLine(Console.Title); var controllers = new ObservableCollection <DualShock4Controller>(); controllers.CollectionChanged += (sender, eventArgs) => { switch (eventArgs.Action) { case NotifyCollectionChangedAction.Add: Console.WriteLine("Added Controller"); break; case NotifyCollectionChangedAction.Remove: Console.WriteLine("Removed Controller"); if (((ObservableCollection <DualShock4Controller>)sender).Count == 0) { Console.WriteLine(" > Finished! Press any key to exit!"); } break; } }; for (int i = 0; i < 500; i++) { Console.WriteLine($" > Spawning device {i}"); Task.Run(() => { var ds4 = new DualShock4Controller(client); try { lock (controllers) controllers.Add(ds4); ds4.Connect(); var report = new DualShock4Report(); report.SetButtons(DualShock4Buttons.Cross); ds4.SendReport(report); Thread.Sleep(1000); ds4.Disconnect(); } finally { lock (controllers) controllers.Remove(ds4); } }); Thread.Sleep(20); } /* * var x360 = new Xbox360Controller(); * x360.FeedbackReceived += * (sender, eventArgs) => Console.WriteLine( * $"LM: {eventArgs.LargeMotor}, " + * $"SM: {eventArgs.SmallMotor}, " + * $"LED: {eventArgs.LedNumber}"); * x360.PlugIn(); * * var report = new Xbox360Report(); * report.SetButtons(Xbox360Buttons.A, Xbox360Buttons.B); * report.SetAxis(Xbox360Axes.LeftTrigger, 0xFF); * report.SetAxis(Xbox360Axes.RightTrigger, 0xFF); * * x360.SendReport(report); * * Console.ReadKey(); * * var ds4 = new DualShock4Controller(); * ds4.FeedbackReceived += * (sender, eventArgs) => Console.WriteLine( * $"LM: {eventArgs.LargeMotor}, " + * $"SM: {eventArgs.SmallMotor}, "); * ds4.PlugIn(); */ Console.ReadKey(); }
public Xb360() { _controller = new Xbox360Controller(Client.ViGEmClient); _report = new Xbox360Report(); _controller.Connect(); }
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 Xbox360OutDevice(ViGEmClient client) { cont = new Xbox360Controller(client); report = new Xbox360Report(); }
public Controller() { iReport = new Xbox360Report(); Initialized = false; Id = 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(); } 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 void UpdateXInputDevice() { Xbox360Report report = MapToXInputDevice(); emnulatedController.SendReport(report); }
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; } }