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