public bool Open(HidInfo hidInfo) { Close(); SafeFileHandle shandle; // Open HID device file handle = Native.CreateFile(hidInfo.Path, Native.GENERIC_READ | Native.GENERIC_WRITE, Native.FILE_SHARE_READ | Native.FILE_SHARE_WRITE, IntPtr.Zero, Native.OPEN_EXISTING, Native.FILE_FLAG_OVERLAPPED, IntPtr.Zero); // Return failure if handle is invalid if (handle == Native.INVALID_HANDLE_VALUE) { return(false); } // Open safe file handle shandle = new SafeFileHandle(handle, false); // Prepare stream - async fileStream = new FileStream(shandle, FileAccess.ReadWrite, 32, true); // Start asyncronous receive task receiveQueue = new BlockingCollection <byte[]>(1000); if (receiveTask != null) { if (!receiveTask.IsCompleted) { throw new Exception("Task already running"); } } receiveTask = new Task(() => ReceiveTask(receiveQueue), TaskCreationOptions.LongRunning); receiveTask.Start(); hidDeviceState = HidDeviceState.Open; // Return success return(true); }
public void Close() { if (hidDeviceState == HidDeviceState.Open) { // Stop Receive Task if (!receiveQueue.IsCompleted) { receiveQueue.CompleteAdding(); } // Handle filestream if (fileStream != null) { fileStream.Close(); fileStream = null; } // Close native HID handle Native.CloseHandle(handle); hidDeviceState = HidDeviceState.Closed; } }