コード例 #1
0
        private void ReadLoop()
        {
            if (!inputReceiver.IsRunning)
            {
                return;
            }

            Report report;
            Dictionary <Usage, DataValue> changedIndexes = new Dictionary <Usage, DataValue>();

            for (int i = 0; i < limit && inputReceiver.TryRead(inputReportBuffer, 0, out report); i++)
            {
                if (inputParser.TryParseReport(inputReportBuffer, 0, report))
                {
                    while (inputParser.HasChanged)
                    {
                        int changedIndex = inputParser.GetNextChangedIndex();
                        var dataValue    = inputParser.GetValue(changedIndex);
                        if (dataValue.Usages.Count() > 0)
                        {
                            changedIndexes[(Usage)dataValue.Usages.FirstOrDefault()] = dataValue;
                        }
                    }
                }
            }
            var changedSources = sources.Where(s => s.Refresh(changedIndexes)).ToArray();

            inputChangedEventArgs.Refresh(changedSources);
            if (inputChangedEventArgs.ChangedValues.Any())
            {
                InputChanged?.Invoke(this, inputChangedEventArgs);
            }
        }
コード例 #2
0
ファイル: HIDSharp.cs プロジェクト: yy520a/XOutput
        static void WriteDeviceItemInputParserResult(DeviceItemInputParser parser)
        {
            while (parser.HasChanged)
            {
                int changedIndex      = parser.GetNextChangedIndex();
                var previousDataValue = parser.GetPreviousValue(changedIndex);
                var dataValue         = parser.GetValue(changedIndex);

                Console.WriteLine(string.Format("  {0}: {1} -> {2}", (Usage)dataValue.Usages.FirstOrDefault(), previousDataValue.GetPhysicalValue(), dataValue.GetPhysicalValue()));
            }
        }
コード例 #3
0
        private bool Parse(byte[] reportBuffer)
        {
            try {
                byte reportId = reportBuffer[0];
                if (!_reportCache.TryGetValue(reportId, out Report report))
                {
                    _reportCache[reportId] = report = HidDevice.GetReportDescriptor().GetReport(ReportType.Input, reportId);
                }

                // Parse the report if possible.
                if (_inputParser.TryParseReport(reportBuffer, 0, report))
                {
                    while (_inputParser.HasChanged)
                    {
                        int changedIndex = _inputParser.GetNextChangedIndex();
                        var dataValue    = _inputParser.GetValue(changedIndex);

                        Usage usage = (Usage)dataValue.Usages.FirstOrDefault();
                        if (Usage.Button1 <= usage && usage <= Usage.Button31)
                        {
                            int btnIdx = (int)(usage - (int)Usage.Button1);
                            _buttons.EnsureSize(btnIdx + 1);
                            _buttons[btnIdx] = dataValue.GetLogicalValue() != 0;
                            int val = dataValue.GetLogicalValue();
                        }
                        else if (usage == Usage.GenericDesktopHatSwitch)
                        {
                            // can only support 1 hat..
                            _hats.EnsureSize(1);
                            _hats[0] = ExtractHat(dataValue);
                        }
                        else if (Usage.GenericDesktopX <= usage && usage <= Usage.GenericDesktopRz)
                        {
                            int axisIdx = (int)(usage - (int)Usage.GenericDesktopX);
                            _axes.EnsureSize(axisIdx + 1);
                            _axes[axisIdx] = ScaleAxis(dataValue);
                        }
                        else
                        {
                            // unrecognized usage
                            Debug.WriteLine("Unrecognized usage: " + usage);
                        }
                    }

                    // for skinning simplicity sake, map hats also to buttons
                    int btn = _buttons.Count - 4 * _hats.Count;
                    for (int i = 0; i < _hats.Count; i++)
                    {
                        // UP DOWN LEFT RIGHT
                        _buttons[btn++] = _hats[i].HasFlag(Hat.Up);
                        _buttons[btn++] = _hats[i].HasFlag(Hat.Down);
                        _buttons[btn++] = _hats[i].HasFlag(Hat.Left);
                        _buttons[btn++] = _hats[i].HasFlag(Hat.Right);
                    }

                    return(true);
                }
            }
            catch { }
            return(false);
        }
コード例 #4
0
        void WriteDeviceItemInputParserResult(DeviceItemInputParser parser)
        {
            while (parser.HasChanged)
            {
                int   changedIndex      = parser.GetNextChangedIndex();
                var   previousDataValue = parser.GetPreviousValue(changedIndex);
                var   dataValue         = parser.GetValue(changedIndex);
                var   value             = dataValue.GetPhysicalValue();
                Usage usage             = (Usage)dataValue.Usages.FirstOrDefault();
                value = value < 0 ? value / 127 : (value - 54) / 200;
                switch (usage)
                {
                case Usage.GenericDesktopX:
                    controllerState.X = value;
                    break;

                case Usage.GenericDesktopY:
                    controllerState.Y = value;
                    break;

                case Usage.GenericDesktopZ:
                    controllerState.Z = value;
                    break;

                case Usage.GenericDesktopRx:
                    controllerState.RX = value;
                    break;

                case Usage.GenericDesktopRy:
                    controllerState.RY = value;
                    break;

                case Usage.GenericDesktopRz:
                    controllerState.RZ = value;
                    break;

                case Usage.GenericDesktopSlider:
                    if (changedIndex == 30)
                    {
                        controllerState.LeftSwitch = value >= 0;
                    }
                    else
                    {
                        controllerState.RightSwitch = value >= 0;
                    }
                    break;

                case Usage.Button1:
                    Console.WriteLine("button 1 :" + value);
                    break;

                case Usage.Button2:
                    Console.WriteLine("button 2 :" + value);
                    break;

                default:
                    Console.WriteLine("unknown usage:" + usage);
                    break;
                }
            }
        }
コード例 #5
0
        static void WriteDeviceItemInputParserResult(DeviceItemInputParser parser)
        {
            while (parser.HasChanged)
            {
                var changedIndex      = parser.GetNextChangedIndex();
                var previousDataValue = parser.GetPreviousValue(changedIndex);
                var dataValue         = parser.GetValue(changedIndex);

                var y     = (Usage)dataValue.Usages.FirstOrDefault();
                var value = (int)dataValue.GetPhysicalValue();

                //Console.WriteLine($"{(Usage) dataValue.Usages.FirstOrDefault()}: {previousDataValue.GetPhysicalValue()} -> {dataValue.GetPhysicalValue()}");

                switch (y)
                {
                case Usage.GenericDesktopY:
                    if (value == 255)
                    {
                        SerialPort.Write(BitConverter.GetBytes(4), 0, 1);
                    }
                    if (value == 0)
                    {
                        SerialPort.Write(BitConverter.GetBytes(3), 0, 1);
                    }
                    break;

                case Usage.GenericDesktopX:
                    if (value == 255)
                    {
                        SerialPort.Write(BitConverter.GetBytes(7), 0, 1);
                    }
                    if (value == 0)
                    {
                        SerialPort.Write(BitConverter.GetBytes(8), 0, 1);
                    }
                    break;

                case Usage.Button1:     //X
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(5), 0, 1);
                    }
                    break;

                case Usage.Button4:     //Y
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(6), 0, 1);
                    }
                    break;

                case Usage.Button2:     //A
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(2), 0, 1);
                    }
                    break;

                case Usage.Button3:     //B
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(1), 0, 1);
                    }
                    break;

                case Usage.Button5:     //L
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(9), 0, 1);
                    }
                    break;

                case Usage.Button6:     //R
                    if (value == 1)
                    {
                        SerialPort.Write(BitConverter.GetBytes(10), 0, 1);
                    }
                    break;

                default:
                    break;
                }
            }
        }