public void StartReading() { lock (readingLock) { if (DeviceReport == null) { reading = false; } if (reading) { return; } reading = true; CreateSendingQueue(); Stopwatch InputTimer = new Stopwatch(); readingThread = new Thread(() => { while (reading) { if (DeviceReport == null) { break; } try { InputTimer.Restart(); //XInputNative.XInputCapabilitiesEx data = new XInputNative.XInputCapabilitiesEx(); //if (XInputNative.XInputGetCapabilitiesEx(1, (int)internalDevice.UserIndex, 0, ref data) == 0) XInputNative.XInputState data = new XInputNative.XInputState(); if (XInputNative.XInputGetStateEx(UserIndex + 1, ref data) == 0) { //if (!IsConnected) //{ // // TODO notify of unplug event // IsConnected = true; //} sendingQueue.EnqueueTask(new XInputReport() { //Connected = IsConnected, wButtons = (UInt16)data.Gamepad.wButtons, bLeftTrigger = data.Gamepad.bLeftTrigger, bRightTrigger = data.Gamepad.bRightTrigger, sThumbLX = data.Gamepad.sThumbLX, sThumbLY = data.Gamepad.sThumbLY, sThumbRX = data.Gamepad.sThumbRX, sThumbRY = data.Gamepad.sThumbRY, }); } /*else if (IsConnected) * { * IsConnected = false; * sendingQueue.EnqueueTask(new XInputReport() * { * Connected = IsConnected, * }); * } * else * { * // poll every 1 second if the device's state is disconnected * // might need to move polling rate out, which would require a temporary polling rate for an unpopulated node * int PollingRate = 1000; * if (PollingRate > 0) * { * int SleepTime = 0; * while (SleepTime < (PollingRate / 1000)) * { * Thread.Sleep(1000); * SleepTime++; * } * Thread.Sleep(PollingRate % 1000); * } * }*/ /*var State = internalDevice.GetState(); * * sendingQueue.EnqueueTask(new XInputReport() * { * Connected = internalDevice.IsConnected, * wButtons = (UInt16)State.Gamepad.Buttons, * bLeftTrigger = State.Gamepad.LeftTrigger, * bRightTrigger = State.Gamepad.RightTrigger, * sThumbLX = State.Gamepad.LeftThumbX, * sThumbLY = State.Gamepad.LeftThumbY, * sThumbRX = State.Gamepad.RightThumbX, * sThumbRY = State.Gamepad.RightThumbY, * });*/ InputTimer.Stop(); if (InputTimer.ElapsedMilliseconds < 10) { Thread.Sleep((int)(10 - InputTimer.ElapsedMilliseconds)); } } catch { reading = false; } } reading = false; }); readingThread.Start(); } }
public void StartReading() { lock (readingLock) { if (DeviceReport == null) { reading = false; } if (reading) { return; } reading = true; sendingQueue = new QueueWorker <Wrapper <HidReport> >(5, (report) => { if (report != null) { DeviceReportEvent threadSafeEvent = DeviceReport; threadSafeEvent?.Invoke(report.Value); } }, $"ReportThread {GetUniqueKey(DevicePath)}"); readingThread = new Thread(() => { while (reading) { if (DeviceReport == null) { break; } try { HidSharp.HidStream _stream = GetStream(); lock (_stream) { byte[] data = _stream.Read(); //DeviceReportEvent threadSafeEvent = DeviceReport; ////new Thread(() => ////{ //// threadSafeEvent?.Invoke(new HidReport() { ReportId = data[0], ReportType = HidReportType.Input, ReportBytes = data.Skip(1).ToArray() }); ////}).Start(); // //ThreadPool.QueueUserWorkItem((stateInfo) => //{ // threadSafeEvent?.Invoke(new HidReport() { ReportId = data[0], ReportType = HidReportType.Input, ReportBytes = data.Skip(1).ToArray() }); //}); sendingQueue.EnqueueTask(new HidReport() { ReportId = data[0], ReportType = HidReportType.Input, ReportBytes = data.Skip(1).ToArray() }); } if (PollingRate > 0) { int SleepTime = 0; while (SleepTime < (PollingRate / 1000)) { Thread.Sleep(1000); SleepTime++; } Thread.Sleep(PollingRate % 1000); } } catch (System.TimeoutException) { } catch (Exception) // for example System.IO.IOException: 'Operation failed after some time.' { reading = false; } } reading = false; }); readingThread.Start(); } }