Esempio n. 1
0
            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);
     }
 }
Esempio n. 3
0
 /// <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;
            }
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 9
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());
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
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;
            }
        }
Esempio n. 12
0
 public void SetButtonState(Xbox360Buttons btn, bool state)
 {
     _report.SetButtonState(btn, state);
 }
Esempio n. 13
0
        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);
        }
Esempio n. 14
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);
        }