CodeManager.cs 7.4 KB
using CodeLibrary;
using HalconDotNet;
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;

namespace OnlineStore.DeviceLibrary
{
   public class CodeManager
    {
        
        public static List<string> cameraNameList = new List<string>();
        public static List<string> codeTypeList = new List<string>();

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

        private static char spiltChar = '#';
        /// <summary>
        /// 初始化摄像机名称和二维码类型
        /// </summary>
        /// <param name="nameStr">摄像机名称,多个用#分割</param>
        /// <param name="codeStr">二维码类型,多个用#分割</param>
        public static void LoadConfig(string nameStr, string codeStr)
        {
            cameraNameList = new List<string>();
            codeTypeList = new List<string>();
            HDLogUtil.LogName = "RollingLogFileAppender";
            try
            { 
                string[] nameArray = nameStr.Split(spiltChar);
                foreach (string str in nameArray)
                {
                    LogUtil.info("加载到配置摄像机名称:" + str.Trim());
                    cameraNameList.Add(str.Trim());
                }
                string[] codeArray = codeStr.Split(spiltChar);
                foreach (string str in codeArray)
                {
                    LogUtil.info("加载到配置二维码类型:" + str.Trim());
                    codeTypeList.Add(str.Trim());
                }

                string[] names = CodeLibrary.HIKCamera.Instance.CameraName;
                hikNameList.AddRange(names);
                foreach(string str in names)
                { 
                    LogUtil.info("加载到HIK相机:" + str.Trim());
                }
                names = CodeLibrary.BaslerCamera.Instance.CameraName;
                balserNameList.AddRange(names);
                foreach (string str in names)
                {
                    LogUtil.info("加载到Balser相机:" + str.Trim());
                }
                CodeLibrary.HDCodeLearnHelper.LoadConfig(nameStr, codeStr);
             
            }
            catch (Exception ex)
            {
                LogUtil.error("解析摄像机配置出错:" + ex.ToString());
            } 
        }

        public static Bitmap GetCamerImage(string cameraName)
        {
            Bitmap bitm = null;
            if (balserNameList.Contains(cameraName))
            {
                BaslerCamera.Instance.Open(cameraName);
                BaslerCamera.Instance.GrabOne();
                bitm = BaslerCamera.Instance.Image;
                BaslerCamera.Instance.Close();
            }
            else if(hikNameList.Contains(cameraName))
            {
                HIKCamera.Instance.Open(cameraName);
                HIKCamera.Instance.GrabOne();
                bitm = HIKCamera.Instance.Image;
                HIKCamera.Instance.Close();
            }
            else
            {
                LogUtil.info("未找到摄像机【"+cameraName+"】无法获取图片");
            }
            return bitm;
        }
        [HandleProcessCorruptedStateExceptions]
        public static List<string> CameraScan()
        {
            List<string> codeList = new List<string>();
            List<CodeInfo> allCodeList = new List<CodeInfo>();

            try
            {
                foreach (string cameraName in cameraNameList)
                {
                    Bitmap bitmap = GetCamerImage(cameraName);
                    if (bitmap == null)
                    {
                        LogUtil.info(" 摄像机【" + cameraName + "】获取图片失败");
                    }
                    else
                    {
                        HObject ho_Image = HDCodeHelper.Bitmap2HObjectBpp24(bitmap);
                        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, 1, GetCodeParamFilePath(codeType), codeType);
                            }
                        }
                        allCodeList.AddRange(cc);
                    }
                    bitmap.Dispose();
                }
            }
            catch (AccessViolationException e)
            {
                LogUtil.error("扫码出现AccessViolationException异常:" + e.ToString());
                GC.Collect();
            }
            catch (Exception ex)
            {
                LogUtil.error("扫码出错:" + ex.ToString());
            }
            foreach (CodeInfo info in allCodeList)
            {
                codeList.Add(info.CodeStr);
            }
            return codeList;
        }
        

        public static 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 static string ProcessBarcode(List<string> codeList,int height)
        {
            //       条码前面字母去掉之后用分号分割,最后不加分号
            //P; H; Q
            //code = "=1+0x0-7x" + height + "=" + code;
            string split = ";"; 
            string result = "";
            try
            {
                List<string> rCodes = new List<string>();
                rCodes.Add(GetCodeByStart(codeList, "P"));
                rCodes.Add(GetCodeByStart(codeList, "H"));
                rCodes.Add(GetCodeByStart(codeList, "Q"));

                foreach (string s in rCodes)
                {
                    if (!s.Equals(""))
                    {
                        if (result.Equals(""))
                        {
                            result = s;
                        }
                        else
                        {
                            result =result + split + s;
                        }
                    }
                }
                if (!result.Equals(""))
                {
                    return "=1+0x0-13x" + height + "=" + result;
                }
            }catch(Exception ex)
            {
                LogUtil.error("处理二维码出错:"+ex.ToString());
            }
            return result;
        }

        private static  string GetCodeByStart(List<string> codeList, string start)
        {
            List<string> pCode = (from m in codeList where m.StartsWith(start) select m).ToList<string>();
            if (pCode.Count > 0)
            {
                return pCode[0].Substring(1, pCode[0].Length - 1);
            }
            return "";
        }
    }
}