Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }