HalconScan.cs 8.6 KB
 
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.ExceptionServices;
using System.Text;
using System.Windows.Forms;
using CodeLibrary;
namespace OnlineStore.DeviceLibrary
{
    public class HalconScan : ScanManager
    {
        public int DeCodeType = ConfigAppSettings.GetIntValue(Setting_Init.DeCodeType);

        public List<string> cameraNameList = new List<string>();
        public List<string> codeTypeList = new List<string>();

        public List<string> balserNameList = new List<string>();
        public List<string> hikNameList = new List<string>();

        public event OnCodeRevice CodeReviceEvent;
        /// <summary>
        /// 初始化摄像机名称和二维码类型
        /// </summary> 
        public HalconScan(string nameStr, string codeStr, OnCodeRevice revicePro)
        {
            char spiltChar = '#';
            CodeReviceEvent += revicePro;
            cameraNameList = new List<string>();
            codeTypeList = new List<string>();
            HDLogUtil.LogName = "RollingLogFileAppender";
            try
            {
                string[] nameArray = nameStr.Split(spiltChar);
                foreach (string str in nameArray)
                {
                    if (str.Trim().Equals(""))
                    {
                        continue;
                    }
                    //LogUtil.info("加载到配置摄像机名称:" + str.Trim());
                    cameraNameList.Add(str.Trim());
                }
                string[] codeArray = codeStr.Split(spiltChar);
                foreach (string str in codeArray)
                {
                    if (str.Trim().Equals(""))
                    {
                        continue;
                    }
                    LogUtil.info("加载到配置二维码类型:" + str.Trim());
                    codeTypeList.Add(str.Trim());
                }

                LoadCamera(false);
                CodeLibrary.HDCodeLearnHelper.LoadConfig(nameStr, codeStr);
            }
            catch (Exception ex)
            {
                LogUtil.error("解析摄像机配置出错:" + ex.StackTrace);
            }
        }
        private void LoadCamera(bool isReLoad)
        {
            if (isReLoad || Camera._cam == null)
            {
                try
                {
                    if (Camera._cam != null)
                    {
                        Camera._cam.CloseAll();
                    }
                    Camera.Type = CameraType.HIK;
                    Camera._cam.Load();
                }
                catch (Exception ex)
                {
                    LogUtil.error("加载HIK相机出错:" + ex.ToString());
                }
            }
            string[] names = Camera._cam.Name;

            hikNameList = new List<string>();
            if (names != null)
            {
                foreach (string n in names)
                {
                    if (!hikNameList.Contains(n))
                    {
                        hikNameList.Add(n);
                    }
                }
                // hikNameList.AddRange(names);
                foreach (string name in hikNameList)
                {
                    LogUtil.info("加载到HIK相机:" + name);
                }
            }
        }

        public void CloseCamera(string cameraName)
        {
            Camera._cam.Close(cameraName);
        }
        public void CloseAllCamera()
        {
            if (Camera._cam != null)
            {
                Camera._cam.CloseAll();
            }
        }


        [HandleProcessCorruptedStateExceptions]
        public List<string> CameraScan()
        {
            List<string> codeList = new List<string>();
            if (cameraNameList == null || cameraNameList.Count <= 0)
            {
                return codeList;
            }
            if (hikNameList.Count <= 0)
            {
                LogUtil.info("CameraScan 发现未加载到相机,重新加载相机");
                LoadCamera(true);
            }
            try
            {
                foreach (string cameraName in cameraNameList)
                {
                    if (cameraName.Trim().Equals(""))
                    {
                        continue;
                    }
                    DateTime startTime = DateTime.Now;
                    LogUtil.info(" 【" + cameraName + "】开始取图片");
                    if (DeCodeType.Equals(1))
                    {
                        Bitmap bitmap = Camera._cam.GrabOneImage(cameraName);
                        List<string> result = CodeLibrary.ZXingCodeHelper.DecodeQRCodes(bitmap);
                        return result;
                    }
                    else
                    {
                        HalconDotNet.HObject ho_Image = null;
                        try
                        {
                            ho_Image = Camera._cam.CaptureOnImage(cameraName);
                            if (ho_Image == null)
                            {
                                LogUtil.error("  【" + cameraName + "】取图片失败[" + Camera._cam.ErrInfo + "],关闭相机");
                                CloseCamera(cameraName);
                                continue;
                            }
                            LogUtil.info("  【" + cameraName + "】取图片完成,开始扫码");
                            List<CodeInfo> cc = new List<CodeInfo>();
                            foreach (string codeType in codeTypeList)
                            {
                                //判断是否是一维码
                                if (codeType.ToLower().Equals("barcode"))
                                {
                                    cc = HDCodeHelper.DecodeBarCode(ho_Image);
                                }
                                else
                                {
                                    cc = HDCodeHelper.DecodeCode(ho_Image, 0, GetCodeParamFilePath(codeType), codeType);
                                }
                                if (cc.Count > 0)
                                {
                                    string r = "";
                                    foreach (CodeInfo c in cc)
                                    {
                                        codeList.Add(c.CodeStr);
                                        r = r + "##" + c.CodeStr;
                                    }
                                    LogUtil.info(" 【" + cameraName + "】【" + codeType + "】扫码完成:" + r);
                                }
                            }

                        }
                        catch (AccessViolationException e)
                        {
                            LogUtil.error(" 扫码出现AccessViolationException异常,关闭相机【" + cameraName + "】:" + e.ToString());
                            Camera._cam.Close(cameraName);
                        }
                        catch (Exception ex)
                        {
                            LogUtil.error(" 扫码出错:" + ex.ToString());
                        }
                        finally
                        {
                            if (ho_Image != null)
                            {
                                ho_Image.Dispose();
                            }
                        }
                    }
                }
            }
            catch (AccessViolationException e)
            {
                LogUtil.error("扫码出现AccessViolationException异常:" + e.ToString());
                GC.Collect();
            }
            catch (Exception ex)
            {
                LogUtil.error("扫码出错:" + ex.ToString());
            }
            return codeList;
        } 

        public string GetCodeParamFilePath(string codePath)
        {
            string appPath = Application.StartupPath;
            string path = appPath + ConfigAppSettings.GetValue(Setting_Init.CodeParamPath);
            string filePath = path + codePath + ".dcm";
            if (File.Exists(filePath))
            {
                return filePath;
            }
            else
            {
                return "";
            }
        }
 
        public override bool StartConnect(bool isMustCon = false)
        {
            return true;
        }

        public override void Close()
        {
            CloseAllCamera();
        }

        public override void BeginScan()
        {
            List<string> list = CameraScan();
            this.CodeReviceEvent?.Invoke(list.ToArray());
        }
    }
}