using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using EasyIDSDK_Net; namespace LB_VisionProcesses.BarcodeReaders.Huayray { /// /// 华睿读码器实现类 /// public class HRBarcodeReader : BarcodeReaderBase { private EidCamera _camera; private EidCamera.EidFrameCallback _frameCallback; private GCHandle _callbackHandle; public override BarcodeReaderBrand Brand => BarcodeReaderBrand.Huayray; public HRBarcodeReader() { _camera = new EidCamera(); _frameCallback = OnFrameReceived; } /// /// 获取在线的华睿读码器列表 /// public override List GetDeviceList() { List snList = new List(); try { EidCamera.EidDeviceList devList = new EidCamera.EidDeviceList(); int nRet = EidCamera.eidEnumDevices_Net(ref devList, 0); if (nRet == EidCamera.eidErrorOK && devList.num > 0) { for (int i = 0; i < devList.num; i++) { EidCamera.EidDeviceInfo deviceInfo = (EidCamera.EidDeviceInfo)Marshal.PtrToStructure( devList.infos + Marshal.SizeOf(typeof(EidCamera.EidDeviceInfo)) * i, typeof(EidCamera.EidDeviceInfo)); snList.Add(deviceInfo.serialNumber); } } } catch (Exception ex) { // TODO: Log error } return snList; } public override bool Open(string sn) { if (IsConnected) Close(); try { // 创建句柄 int nRet = _camera.eidCreateDevice_Net(sn, EidCamera.EidDeviceDataType.eidDeviceDataTypeSN); if (nRet != EidCamera.eidErrorOK) return false; // 打开设备 nRet = _camera.eidOpenDevice_Net(); if (nRet != EidCamera.eidErrorOK) { _camera.eidReleaseHandle_Net(); return false; } // 注册回调 nRet = _camera.eidRegisterFrameCallback_Net(_frameCallback, IntPtr.Zero); if (nRet != EidCamera.eidErrorOK) { _camera.eidCloseDevice_Net(); _camera.eidReleaseHandle_Net(); return false; } this.SN = sn; this.IsConnected = true; return true; } catch { return false; } } public override bool Close() { if (!IsConnected) return true; try { StopGrabbing(); _camera.eidCloseDevice_Net(); _camera.eidReleaseHandle_Net(); this.IsConnected = false; this.SN = string.Empty; return true; } catch { return false; } } public override bool StartGrabbing() { if (!IsConnected) return false; if (IsGrabbing) return true; int nRet = _camera.eidStartGrabbing_Net(0); if (nRet == EidCamera.eidErrorOK) { this.IsGrabbing = true; return true; } return false; } public override bool StopGrabbing() { if (!IsGrabbing) return true; int nRet = _camera.eidStopGrabbing_Net(); this.IsGrabbing = false; return nRet == EidCamera.eidErrorOK; } public override bool SoftTrigger() { if (!IsConnected || !IsGrabbing) return false; int nRet = _camera.eidExecCommandFeature_Net("TriggerSoftware"); return nRet == EidCamera.eidErrorOK; } public override bool SetTriggerMode(bool isSoftware) { if (!IsConnected) return false; int nRet; if (isSoftware) { // 软触发模式 nRet = _camera.eidSetEnumFeatureSymbol_Net("TriggerType", "SingleFrame"); if (nRet != EidCamera.eidErrorOK) return false; nRet = _camera.eidSetEnumFeatureSymbol_Net("TriggerSource", "Software"); } else { // 自由运行或硬触发 (此处默认设为自由运行,可根据需要扩展) nRet = _camera.eidSetEnumFeatureSymbol_Net("TriggerType", "FreeRun"); } return nRet == EidCamera.eidErrorOK; } /// /// SDK帧回调处理 /// private void OnFrameReceived(ref EidCamera.EidFrameInfo frameInfo, IntPtr userData) { try { List barcodes = new List(); // 解析条码 for (int i = 0; i < frameInfo.codeNum; i++) { EidCamera.EidCodeInfo codeInfo = (EidCamera.EidCodeInfo)Marshal.PtrToStructure( frameInfo.codeList + Marshal.SizeOf(typeof(EidCamera.EidCodeInfo)) * i, typeof(EidCamera.EidCodeInfo)); string data = Marshal.PtrToStringAnsi(codeInfo.data); if (!string.IsNullOrEmpty(data)) { barcodes.Add(data); } } // 转换图像 (如果需要) Bitmap bitmap = null; if (frameInfo.imageDataLen > 0 && frameInfo.imageData != IntPtr.Zero) { // 这里简化处理,如果是Jpeg则直接从内存加载,如果是Raw则需转换 // 实际项目中可根据 frameInfo.format 进行处理 if (frameInfo.isJpeg) { byte[] managedArray = new byte[frameInfo.imageDataLen]; Marshal.Copy(frameInfo.imageData, managedArray, 0, (int)frameInfo.imageDataLen); using (var ms = new System.IO.MemoryStream(managedArray)) { bitmap = new Bitmap(ms); } } } // 触发事件 OnBarcodeRead(new BarcodeEventArgs(this.SN, barcodes, bitmap)); } catch (Exception ex) { // TODO: Log error } } public override void Dispose() { Close(); base.Dispose(); } } }