private bool Initialize() { Dispose(); if (string.IsNullOrEmpty(DeviceId)) { throw new WindowsHidException($"{nameof(DeviceId)} must be specified before {nameof(Initialize)} can be called."); } _ReadSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead | APICalls.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); _WriteSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead | APICalls.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); if (_ReadSafeFileHandle.IsInvalid) { throw new Exception("Could not open connection for reading"); } if (_WriteSafeFileHandle.IsInvalid) { throw new Exception("Could not open connection for writing"); } ConnectedDeviceDefinition = WindowsHidDeviceFactory.GetDeviceDefinition(DeviceId, _ReadSafeFileHandle); _ReadFileStream = new FileStream(_ReadSafeFileHandle, FileAccess.ReadWrite, ReadBufferSize, false); _WriteFileStream = new FileStream(_WriteSafeFileHandle, FileAccess.ReadWrite, WriteBufferSize, false); return(true); }
private bool Initialize() { try { Close(); if (string.IsNullOrEmpty(DeviceId)) { throw new WindowsHidException($"{nameof(DeviceId)} must be specified before {nameof(Initialize)} can be called."); } _ReadSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead | APICalls.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); _WriteSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead | APICalls.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); if (_ReadSafeFileHandle.IsInvalid) { throw new Exception("Could not open connection for reading"); } if (_WriteSafeFileHandle.IsInvalid) { throw new Exception("Could not open connection for writing"); } ConnectedDeviceDefinition = WindowsHidDeviceFactory.GetDeviceDefinition(DeviceId, _ReadSafeFileHandle); var readBufferSize = ReadBufferSize; var writeBufferSize = WriteBufferSize; if (readBufferSize == 0) { throw new WindowsHidException($"{nameof(ReadBufferSize)} must be specified. HidD_GetAttributes may have failed or returned an InputReportByteLength of 0. Please specify this argument in the constructor"); } if (writeBufferSize == 0) { throw new WindowsHidException($"{nameof(WriteBufferSize)} must be specified. HidD_GetAttributes may have failed or returned an OutputReportByteLength of 0. Please specify this argument in the constructor. Note: Hid devices are always opened in write mode. If you need to open in read mode, please log an issue here: https://github.com/MelbourneDeveloper/Device.Net/issues"); } _ReadFileStream = new FileStream(_ReadSafeFileHandle, FileAccess.ReadWrite, readBufferSize, false); _WriteFileStream = new FileStream(_WriteSafeFileHandle, FileAccess.ReadWrite, writeBufferSize, false); } catch (Exception ex) { Logger?.Log($"{nameof(Initialize)} error.", nameof(WindowsHidDevice), ex, LogLevel.Error); throw; } return(true); }
private bool Initialize() { try { Close(); if (string.IsNullOrEmpty(DeviceId)) { throw new ValidationException($"{nameof(DeviceId)} must be specified before {nameof(Initialize)} can be called."); } //TODO: Work on getting these correct, and make sure that different values can be passed in here. _ReadSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead, 3, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); _WriteSafeFileHandle = APICalls.CreateFile(DeviceId, APICalls.GenericRead | APICalls.GenericWrite, APICalls.FileShareRead | APICalls.FileShareWrite, IntPtr.Zero, APICalls.OpenExisting, 0, IntPtr.Zero); if (_ReadSafeFileHandle.IsInvalid) { throw new ApiException(Messages.ErrorMessageCantOpenRead); } IsReadOnly = _WriteSafeFileHandle.IsInvalid ? true : false; if (IsReadOnly.Value) { Logger?.Log(Messages.WarningMessageOpeningInReadonlyMode(DeviceId), nameof(WindowsHidDevice), null, LogLevel.Warning); } ConnectedDeviceDefinition = WindowsHidDeviceFactory.GetDeviceDefinition(DeviceId, _ReadSafeFileHandle, Logger); var readBufferSize = ReadBufferSize; var writeBufferSize = WriteBufferSize; if (readBufferSize == 0) { throw new ValidationException($"{nameof(ReadBufferSize)} must be specified. HidD_GetAttributes may have failed or returned an InputReportByteLength of 0. Please specify this argument in the constructor"); } _ReadFileStream = new FileStream(_ReadSafeFileHandle, FileAccess.Read, readBufferSize, false); if (_ReadFileStream.CanRead) { Logger?.Log(Messages.SuccessMessageReadFileStreamOpened, nameof(WindowsHidDevice), null, LogLevel.Information); } else { Logger?.Log(Messages.WarningMessageReadFileStreamCantRead, nameof(WindowsHidDevice), null, LogLevel.Warning); } if (!IsReadOnly.Value) { if (writeBufferSize == 0) { throw new ValidationException($"{nameof(WriteBufferSize)} must be specified. HidD_GetAttributes may have failed or returned an OutputReportByteLength of 0. Please specify this argument in the constructor"); } //Don't open if this is a read only connection _WriteFileStream = new FileStream(_WriteSafeFileHandle, FileAccess.ReadWrite, writeBufferSize, false); if (_WriteFileStream.CanWrite) { Logger?.Log(Messages.SuccessMessageWriteFileStreamOpened, nameof(WindowsHidDevice), null, LogLevel.Information); } else { Logger?.Log(Messages.WarningMessageWriteFileStreamCantWrite, nameof(WindowsHidDevice), null, LogLevel.Warning); } } } catch (Exception ex) { Logger?.Log($"{nameof(Initialize)} error.", nameof(WindowsHidDevice), ex, LogLevel.Error); throw; } return(true); }