Camera.cs 5.6 KB
using Asa.Camera;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;

namespace OnlineStore
{
    public class HIKCamera
    {
        Thread camerathread;
        static HIKCamera _camera;
        Asa.Camera.VisionLib camera;
        public static HIKCamera Current { get {
                if (_camera == null)
                    _camera = new HIKCamera();
                return _camera;
            } }
        
        public string Name = "";
        public event EventHandler<Bitmap> camera_event;
        public string DeviceName= "monitor1";
        bool loop=true;
        public void LoadCameraConfig()
        {
            string path = @".\StoreConfig\Camera.json";
            if (!File.Exists(path))
            {
                LogUtil.error(Name + "找不到监控相机配置文件" + path);
                return;
            }
            try
            {
                var configtxt = File.ReadAllText(path);
                if (configtxt.IndexOf("Pwd") > 0) {
                    configtxt = configtxt.Replace("Pwd", "Password");
                    configtxt = configtxt.Replace("\"8000\"", "8000");
                    File.WriteAllText(path, configtxt);
                }
                var m = Regex.Match(configtxt, "name\".*?\"(.+)\"", RegexOptions.IgnoreCase);
                DeviceName = m.Groups[1].Value;
                camera = new VisionLib(path,true, "HIK.IPCamera");
            }
            catch (Exception e){
                LogUtil.error(Name + "加载监控相机配置文件失败:"+ e.ToString());
                return;
            }
            PictureBox p1 = new PictureBox();
            camera.PreviewImage(DeviceName, p1.Handle);
            camera.Open(DeviceName);
            Bitmap bmp = camera.GetImage(DeviceName);
            if (bmp == null)
            {
                LogUtil.error(Name + $"监控相机打开失败");
            }
            loop = true;
            camerathread = new Thread(new ThreadStart(startCamera));
            camerathread.Start();
            GC.KeepAlive(camerathread);

        }
        int errortimes = 0;
        void startCamera()
        {
            while (loop)
            {
                try
                {
                    Bitmap bmp = camera.GetImage(DeviceName);
                    if (bmp != null)
                    {
                        errortimes = 0;
                        camera_event?.Invoke(this, bmp);
                    }
                    else if (bmp == null && errortimes < 5)
                    {
                        errortimes++;
                        LogUtil.error(Name + $"相机获取图像出错,{errortimes}");
                    }
                    else if (errortimes == 5)
                    {
                        camera.Close(DeviceName);
                        Thread.Sleep(1000);
                        camera.Open(DeviceName);
                        errortimes=0;
                        LogUtil.error(Name + $"相机错误次数过多,重新打开,{errortimes}");
                        Thread.Sleep(5000);
                    }
                    
                    Thread.Sleep(1000 / 7);
                }
                catch {
                    errortimes++;
                }
            }
            camera.Close(DeviceName);
            camera.Dispose();
        }
        public void Close() {
            LogUtil.info(Name + "线程退出");
            loop = false;
        }
        public void CameraGrabOne(string filename)
        {
            try
            {
                if (camera == null)
                    return;
                LogUtil.info(Name + "库位文件名:" + filename);

                if (filename.IndexOf("oldreel@") > 0)
                    return;

                Bitmap bmp = camera.GetImage(DeviceName);
                if (bmp != null)
                {
                    if (File.Exists(filename))
                        File.Delete(filename);

                    bmp.Save(filename, ImageFormat.Jpeg);
                    bmp.Dispose();
                }
            }
            catch (Exception e)
            {
                LogUtil.error(Name + e.ToString());
            }
            LogUtil.info(Name + " 保存完毕:" + filename);
        }
        public string GetFixtureStateFilename(InOutStoreParam inOutParam,StoreMoveType storeMoveType, FixtureState fixtureState)
        {
            var WareNumber = inOutParam.WareNumber;
            Path.GetInvalidFileNameChars().ToList().ForEach((ix) => { WareNumber = WareNumber.Replace(ix.ToString(), ""); });
            if (WareNumber.Length > 200)
            {
                WareNumber = "";
            }
            if (string.IsNullOrEmpty(WareNumber))
                WareNumber = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");

            string dir = $"\\image\\Fixture\\{storeMoveType}\\{inOutParam.PositionNum}\\";
            Directory.CreateDirectory(dir);
            string filename = $"{inOutParam.WareNumber}@@{fixtureState}.jpg";
            foreach (var x in Path.GetInvalidFileNameChars())
            {
                filename = filename.Replace(x.ToString(), "");
            }
            return dir + filename;
        }

    }
    public enum FixtureState
    {
        In,
        Up,
        Down,
        Out,
        DoorIn,
        DoorOut,
    }
}