public void Detach() { stop_polling = true; if (xin != null) { xin.Disconnect(); xin.Dispose(); } if (state > state_.NO_JOYCONS) { HIDapi.hid_set_nonblocking(handle, 0); Subcommand(0x40, new byte[] { 0x0 }, 1); //Subcommand(0x48, new byte[] { 0x0 }, 1); // Would turn off rumble? if (isUSB) { byte[] a = Enumerable.Repeat((byte)0, 64).ToArray(); a[0] = 0x80; a[1] = 0x05; // Allow device to talk to BT again HIDapi.hid_write(handle, a, new UIntPtr(2)); a[0] = 0x80; a[1] = 0x06; // Allow device to talk to BT again HIDapi.hid_write(handle, a, new UIntPtr(2)); } } if (state > state_.DROPPED) { HIDapi.hid_close(handle); } state = state_.NOT_ATTACHED; }
internal void DeActivate() { activated = false; try { emnulatedController.Disconnect(); } catch (Exception ex) { } }
public override void Disconnect() { if (forceFeedbackCall != null) { cont.FeedbackReceived -= forceFeedbackCall; forceFeedbackCall = null; } cont.Disconnect(); cont.Dispose(); cont = null; }
public override void Dispose() { try { myController.Disconnect(); myController.Dispose(); myViGEmClient.Dispose(); } catch { } }
private void Disconnect(object sender, RoutedEventArgs e) { disconnected = true; // Make sure that onclose doesn't try to disconnect again controller.Disconnect(); Globals.wssv.RemoveWebSocketService("/x360_port" + port); Application.Current.Dispatcher.Invoke(() => { btnDisconnect.Click -= Disconnect; lblStatus.Content = "Not connected"; btnDisconnect.IsEnabled = false; }); }
private bool disposedValue = false; // To detect redundant calls protected virtual void Dispose(bool disposing) { if (!disposedValue) { if (disposing) { // Must release the controller if (Initialized) { ctrl.Disconnect(); ctrl.Dispose(); client.Dispose(); } } disposedValue = true; } }
private void connectClientToPort(object sender, Xbox360FeedbackReceivedEventArgs eventArgs) { Xbox360Controller newController = (Xbox360Controller)sender; newController.FeedbackReceived -= connectClientToPort; Console.WriteLine(eventArgs); Console.WriteLine(eventArgs.LedNumber); // ledNumber returns 0 for player 1, 1 for player 2, 2 for player 3, 3 for player 4 // but on other computers, ledNumber returns 1 for player 1, 2 for player 2 and so on // When the first controller connects (thus when portCalculator isn't defined yet), // if the LedNumber is 0, portCalculator = 1 // else, it's 0 if (Globals.portCalculator == null) { if (eventArgs.LedNumber == 0) { Globals.portCalculator = 1; } else { Globals.portCalculator = 0; } } int port = eventArgs.LedNumber + (int)Globals.portCalculator; if (port > 4) { newController.Disconnect(); Send("Disconnect:4 controllers already connected!"); return; } Application.Current.Dispatcher.Invoke(() => { MainWindow mainWindow = (MainWindow)Application.Current.MainWindow; Label statusLabel; Button disconnectButton; switch (port) { case 1: statusLabel = mainWindow.lblController1Connected; disconnectButton = mainWindow.btnController1Disconnect; break; case 2: statusLabel = mainWindow.lblController2Connected; disconnectButton = mainWindow.btnController2Disconnect; break; case 3: statusLabel = mainWindow.lblController3Connected; disconnectButton = mainWindow.btnController3Disconnect; break; case 4: statusLabel = mainWindow.lblController4Connected; disconnectButton = mainWindow.btnController4Disconnect; break; default: return; } Globals.wssv.AddWebSocketService("/x360_port" + port, () => new X360(newController, port, statusLabel, disconnectButton)); // Example: Connected:x360_port1 Send("Connected:x360_port" + port); }); }
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 override void Disconnect() => cont.Disconnect();
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()); }