From eda17eddf88e6108cadbf8dcef5c2195c1a7b708 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期三, 01 四月 2026 10:55:05 +0800
Subject: [PATCH] 提交VS生成临时文件

---
 LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs |  278 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 278 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..e807e53
--- /dev/null
+++ b/LB_VisionProcesses/BarcodeReaders/Huayray/HRBarcodeReader.cs
@@ -0,0 +1,278 @@
+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
+            {
+                // 鍏堣繘琛屼竴娆℃灇涓撅紝纭繚 SDK 鑳藉鍙戠幇璁惧锛堥儴鍒� SDK 瑕佹眰鍦ㄦ墦寮�鍓嶅繀椤绘墽琛屾灇涓撅級
+                GetDeviceList();
+
+                // 濡傛灉涔嬪墠澶辫触杩囷紝閲嶆柊鍒涘缓鐩告満瀵硅薄纭繚骞插噣鐘舵��
+                if (_camera == null)
+                {
+                    _camera = new EidCamera();
+                }
+
+                // 纭繚涔嬪墠鐨勫彞鏌勫凡閲婃斁
+                try { _camera.eidReleaseHandle_Net(); } catch { }
+
+                // 鍒涘缓鍙ユ焺
+                int nRet = _camera.eidCreateDevice_Net(sn, EidCamera.EidDeviceDataType.eidDeviceDataTypeSN);
+                if (nRet != EidCamera.eidErrorOK) return false;
+                if (nRet != EidCamera.eidErrorOK)
+                {
+                    _camera = null;
+                    return false;
+                }
+
+                // 鍒嗛厤鍥哄畾鍙ユ焺缁欏鎵橈紝闃叉琚� GC 鍥炴敹
+                if (!_callbackHandle.IsAllocated)
+                {
+                    _callbackHandle = GCHandle.Alloc(_frameCallback);
+                }
+
+                // 鎵撳紑璁惧
+                nRet = _camera.eidOpenDevice_Net();
+                if (nRet != EidCamera.eidErrorOK)
+                {
+                    _camera.eidReleaseHandle_Net();
+                    if (_callbackHandle.IsAllocated) _callbackHandle.Free();
+                    _camera = null;
+                    return false;
+                }
+
+                // 娉ㄥ唽鍥炶皟
+                nRet = _camera.eidRegisterFrameCallback_Net(_frameCallback, IntPtr.Zero);
+                if (nRet != EidCamera.eidErrorOK)
+                {
+                    _camera.eidCloseDevice_Net();
+                    _camera.eidReleaseHandle_Net();
+                    if (_callbackHandle.IsAllocated) _callbackHandle.Free();
+                    _camera = null;
+                    return false;
+                }
+
+                this.SN = sn;
+                this.IsConnected = true;
+                return true;
+            }
+            catch
+            {
+                // 鍙戠敓寮傚父鏃剁‘淇濋噴鏀捐祫婧�
+                try { _camera?.eidCloseDevice_Net(); } catch { }
+                try { _camera?.eidReleaseHandle_Net(); } catch { }
+                if (_callbackHandle.IsAllocated) _callbackHandle.Free();
+                // 鍙戠敓寮傚父鏃堕噴鏀剧浉鏈哄璞★紝纭繚涓嬫鍒涘缓鏂板疄渚�
+                _camera = null;
+                return false;
+            }
+        }
+
+        public override bool Close()
+        {
+            if (!IsConnected) return true;
+
+            try
+            {
+                if (IsConnected)
+                {
+                    StopGrabbing();
+                _camera.eidCloseDevice_Net();
+                _camera.eidReleaseHandle_Net();
+                    _camera?.eidCloseDevice_Net();
+                }
+                // 鏃犺鏄惁杩炴帴锛岄兘灏濊瘯閲婃斁鍙ユ焺
+                _camera?.eidReleaseHandle_Net();
+
+                // 閲婃斁鍥炶皟鍙ユ焺
+                if (_callbackHandle.IsAllocated)
+                {
+                    _callbackHandle.Free();
+                }
+
+                // 閲婃斁鐩告満瀵硅薄寮曠敤锛岀‘淇漇DK璧勬簮瀹屽叏閲婃斁
+                _camera = null;
+
+                this.IsConnected = false;
+                this.SN = string.Empty;
+                this.IsGrabbing = false;
+                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<BarcodeInfo> barcodeInfos = new List<BarcodeInfo>();
+                // 瑙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))
+                    {
+                        BarcodeInfo info = new BarcodeInfo
+                        {
+                            Text = data,
+                            Points = new Point[]
+                            {
+                                new Point((int)codeInfo.position[0].x, (int)codeInfo.position[0].y),
+                                new Point((int)codeInfo.position[1].x, (int)codeInfo.position[1].y),
+                                new Point((int)codeInfo.position[2].x, (int)codeInfo.position[2].y),
+                                new Point((int)codeInfo.position[3].x, (int)codeInfo.position[3].y)
+                            }
+                        };
+                        barcodeInfos.Add(info);
+                    }
+                }
+
+                // 杞崲鍥惧儚 (濡傛灉闇�瑕�)
+                // 杞崲鍥惧儚
+                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, barcodeInfos, bitmap));
+            }
+            catch (Exception ex)
+            {
+                // TODO: Log error
+            }
+        }
+
+        public override void Dispose()
+        {
+            Close();
+            base.Dispose();
+        }
+    }
+}

--
Gitblit v1.9.3