From 46431fb658701489f8d5de4475b02df728c51f36 Mon Sep 17 00:00:00 2001
From: chunxiaqiu <1057644574@qq.com>
Date: 星期三, 18 三月 2026 15:48:26 +0800
Subject: [PATCH] 新增:读码器功能模块,集成华睿读码器并初步实现读码功能
---
LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 216 insertions(+), 0 deletions(-)
diff --git a/LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs b/LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs
new file mode 100644
index 0000000..872c066
--- /dev/null
+++ b/LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs
@@ -0,0 +1,216 @@
+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
+{
+ /// <summary>
+ /// 鍗庣澘璇荤爜鍣ㄥ疄鐜扮被
+ /// </summary>
+ 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;
+ }
+
+ /// <summary>
+ /// 鑾峰彇鍦ㄧ嚎鐨勫崕鐫胯鐮佸櫒鍒楄〃
+ /// </summary>
+ public override List<string> GetDeviceList()
+ {
+ List<string> snList = new List<string>();
+ 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;
+ }
+
+ /// <summary>
+ /// SDK甯у洖璋冨鐞�
+ /// </summary>
+ private void OnFrameReceived(ref EidCamera.EidFrameInfo frameInfo, IntPtr userData)
+ {
+ try
+ {
+ List<string> barcodes = new List<string>();
+ // 瑙f瀽鏉$爜
+ 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)
+ {
+ // 杩欓噷绠�鍖栧鐞嗭紝濡傛灉鏄疛peg鍒欑洿鎺ヤ粠鍐呭瓨鍔犺浇锛屽鏋滄槸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();
+ }
+ }
+}
--
Gitblit v1.9.3