using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace HidLibrary.Honeywell1902Series { public class Scanner1902 : IDisposable { private const int HidReportId = 0x4; private const int ErrorBeepMessage = 0x20; private const int SuccessBeepMessage = 0x40; private const int StartScanMessage = 0x4; private const int EndScanMessage = 0x1; public event InsertedEventHandler Inserted; public event RemovedEventHandler Removed; public event DataRecievedEventHandler DataRecieved; public delegate void InsertedEventHandler(); public delegate void RemovedEventHandler(); public delegate void DataRecievedEventHandler(byte[] data); private readonly HidDevice _scanner; private int _isReading; public Scanner1902(string devicePath) : this(HidDevices.GetDevice(devicePath)) { } public Scanner1902(HidDevice hidDevice) { _scanner = hidDevice; _scanner.Inserted += ScannerInserted; _scanner.Removed += ScannerRemoved; if (!_scanner.IsOpen) _scanner.OpenDevice(); _scanner.MonitorDeviceEvents = true; BeginReadReport(); } public string DevicePath { get { return _scanner.DevicePath; } } public bool IsListening { get; private set; } public bool IsConnected { get { return _scanner.IsConnected; } } public static IEnumerable Enumerate(int vid, int pid) { return HidDevices.Enumerate(vid, pid).Select(x => new Scanner1902(x)); } public void ErrorBeep() { var report = _scanner.CreateReport(); report.ReportId = HidReportId; report.Data[0] = ErrorBeepMessage; _scanner.WriteReport(report); } public void SuccessBeep() { var report = _scanner.CreateReport(); report.ReportId = HidReportId; report.Data[0] = SuccessBeepMessage; _scanner.WriteReport(report); } public void StartScan() { var report = _scanner.CreateReport(); report.ReportId = HidReportId; report.Data[0] = StartScanMessage; _scanner.WriteReport(report); } public void EndScan() { var report = _scanner.CreateReport(); report.ReportId = HidReportId; report.Data[0] = EndScanMessage; _scanner.WriteReport(report); } public void StartListen() { IsListening = true; } public void StopListen() { IsListening = false; } private void BeginReadReport() { if (Interlocked.CompareExchange(ref _isReading, 1, 0) == 1) return; _scanner.ReadReport(ReadReport); } private void ReadReport(HidReport report) { var scannerReport = new Report1902(report); var data = new byte[] { }; var currentPosition = 0; var readRequired = false; if (scannerReport.Length > 0 & scannerReport.ReadStatus == HidDeviceData.ReadStatus.Success) { do { if (scannerReport.MoreData && readRequired) scannerReport = new Report1902(_scanner.ReadReport()); else readRequired = true; if (!scannerReport.Exists) continue; Array.Resize(ref data, data.GetUpperBound(0) + scannerReport.Data.Length + 1); Array.Copy(scannerReport.Data, 0, data, currentPosition, scannerReport.Data.Length); currentPosition += scannerReport.Data.Length; } while (scannerReport.MoreData && scannerReport.Exists); if (IsListening && data.Length > 0 && DataRecieved != null) DataRecieved(data); } if (scannerReport.ReadStatus != HidDeviceData.ReadStatus.NotConnected) _scanner.ReadReport(ReadReport); else _isReading = 0; } private void ScannerInserted() { BeginReadReport(); if (Inserted != null) Inserted(); } private void ScannerRemoved() { if (Removed != null) Removed(); } public void Dispose() { _scanner.CloseDevice(); GC.SuppressFinalize(this); } ~Scanner1902() { Dispose(); } } }