Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
        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();
            }
        }
Esempio n. 4
0
        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]);
     }
 }
Esempio n. 7
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);
        }
Esempio n. 8
0
        /// <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();
            }
        }
Esempio n. 9
0
        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();
        }
Esempio n. 10
0
        ///-------------------------------------------------------------------------------------------------
        /// <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);
            }
        }
Esempio n. 11
0
 public X360(Xbox360Controller pController, int pPort, Label pLblStatus, Button pBtnDisconnect)
 {
     controller    = pController;
     port          = pPort;
     lblStatus     = pLblStatus;
     btnDisconnect = pBtnDisconnect;
     disconnected  = false;
     report        = new Xbox360Report();
 }
Esempio n. 12
0
        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);
     }
 }
Esempio n. 16
0
        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;
            }
        }
Esempio n. 18
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);
 }
Esempio n. 19
0
 public XboxImpl(Xbox360Controller X360Controller)
 {
     this.X360Controller = X360Controller;
     this.Report         = new Xbox360Report();
 }
Esempio n. 20
0
        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();
        }
Esempio n. 21
0
        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();
        }
Esempio n. 22
0
 public Xb360()
 {
     _controller = new Xbox360Controller(Client.ViGEmClient);
     _report     = new Xbox360Report();
     _controller.Connect();
 }
Esempio n. 23
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);
            }
        }
Esempio n. 24
0
 public Xbox360OutDevice(ViGEmClient client)
 {
     cont   = new Xbox360Controller(client);
     report = new Xbox360Report();
 }
 public Controller()
 {
     iReport     = new Xbox360Report();
     Initialized = false;
     Id          = 0;
 }
Esempio n. 26
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);
        }
Esempio n. 28
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;
            }
        }