Exemplo n.º 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);
            }
        }
Exemplo n.º 2
0
        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()));
            }
        }
Exemplo n.º 3
0
        private void GetSensorReadout(DeviceItemInputParser parser)
        {
            const int exponentMask = 0b1111_0000_0000_0000;
            const int mantissaMask = 0b0000_1111_1111_1111;

            var dataValue = parser.GetValue(0).GetLogicalValue();

            var exp      = (dataValue & exponentMask) >> 12;
            var mantissa = dataValue & mantissaMask;
            var lux      = 0.01 * Math.Pow(2, exp) * mantissa;

            _sensorModel.SetValue(lux);

            if (!_sensorModel.ManualMode)
            {
                _displayController.ChangeDisplayBrightness(TransferFunction(lux));
            }
        }
Exemplo n.º 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;
                }
            }
        }
        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);
        }
Exemplo n.º 6
0
        private void ProcessEvent()
        {
            if (_hiddeviceInputParser.HasChanged)
            {
                int           j = -1;
                TouchReport[] currentReports = new TouchReport[11];

                for (int i = 0; i < _hiddeviceInputParser.ValueCount; i++)
                {
                    var data = _hiddeviceInputParser.GetValue(i);
                    if (data.Usages.FirstOrDefault() == VendorUsage.FingerIdentifier)
                    {
                        j++;
                    }
                    else
                    {
                        continue;
                    }

                    // Only 11 slots are statically allocated
                    if (j >= 11)
                    {
                        break;
                    }

                    // This is defined by the descriptor, we just take the assumption
                    var fingerTapData1 = _hiddeviceInputParser.GetValue(i + 1);
                    var fingerTapData2 = _hiddeviceInputParser.GetValue(i + 2);
                    var xData          = _hiddeviceInputParser.GetValue(i + 3);
                    // Y is discarded but being read anyway
                    var yData = _hiddeviceInputParser.GetValue(i + 4);

                    // Register this
                    currentReports[j] = new TouchReport(xData.GetPhysicalValue(),
                                                        xData.DataItem.PhysicalMaximum, fingerTapData1.GetPhysicalValue() != 0);
                }

                // Check if need to raise touch leave event for prev slot
                if (_prevTappedSlotIndex >= 0)
                {
                    var scaledX = currentReports[_prevTappedSlotIndex].GetXInPercentage() * _width;

                    if (!currentReports[_prevTappedSlotIndex].FingerStatus)
                    {
                        Event?.Invoke(new RawMouseEventArgs(
                                          BridgeFrameBufferPlatform.MouseDevice,
                                          BridgeFrameBufferPlatform.Timestamp,
                                          BridgeFrameBufferPlatform.TopLevel.InputRoot,
                                          RawMouseEventType.LeftButtonUp,
                                          new Point(scaledX, _height / 2),
                                          default));

                        _prevTappedSlotIndex = -1;
                    }
                    else
                    {
                        // Update cache, raise move event and complete routine
                        if (BridgeFrameBufferPlatform.MouseDevice.Captured != null)
                        {
                            Event?.Invoke(new RawMouseEventArgs(
                                              BridgeFrameBufferPlatform.MouseDevice,
                                              BridgeFrameBufferPlatform.Timestamp,
                                              BridgeFrameBufferPlatform.TopLevel.InputRoot,
                                              RawMouseEventType.Move,
                                              new Point(scaledX, _height / 2),
                                              InputModifiers.LeftMouseButton));
                        }
                    }
                }

                // Can raise new tap event
                if (_prevTappedSlotIndex == -1)
                {
                    for (int i = 0; i < 11; i++)
                    {
                        if (currentReports[i].FingerStatus)
                        {
                            var scaledX = currentReports[i].GetXInPercentage() * _width;
                            Event?.Invoke(new RawMouseEventArgs(
                                              BridgeFrameBufferPlatform.MouseDevice,
                                              BridgeFrameBufferPlatform.Timestamp,
                                              BridgeFrameBufferPlatform.TopLevel.InputRoot,
                                              RawMouseEventType.LeftButtonDown,
                                              new Point(scaledX, _height / 2),
                                              default));

                            _prevTappedSlotIndex = i;
                            break;
                        }
                    }
                }

                // Update cache
                _prevReports = currentReports;
            }
        }
Exemplo n.º 7
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;
                }
            }
        }