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); } }
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())); } }
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)); } }
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); }
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; } }
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; } } }