Camera.cs 5.5 KB
using Asa.Camera;
using DeviceLibrary;
using OnlineStore;
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;

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";
    public bool LoadCameraConfig(string CameraID, out string msg)
    {
        Name = CameraID;
        msg = "";
        string path = $".\\Config\\{CameraID}.json";
        if (!File.Exists(path))
        {
            msg = Name + crc.GetString(L.monitor_config_not_exist, "找不到监控相机配置文件");
            LogUtil.error(Name + "找不到监控相机配置文件" + path);
            return false;
        }
        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)
        {
            msg = Name + crc.GetString(L.monitor_config_load_fail, "加载监控相机配置文件失败:") + e.ToString();
            LogUtil.error(Name + "加载监控相机配置文件失败:" + e.ToString());
            return false;
        }
        camera.Open(DeviceName);
        Bitmap bmp = camera.GetImage(DeviceName);
        if (bmp == null)
        {
            msg = Name + crc.GetString(L.monitor_open_fail,"监控相机打开失败");
            LogUtil.error(Name + $"监控相机打开失败");
            return false;
        }
        camerathread = new Thread(new ThreadStart(startCamera));
        camerathread.Start();
        GC.KeepAlive(camerathread);

        return true;
    }
    int errortimes = 0;
    bool camerathreadrun = true;
    public void stopCamera() {
        camerathreadrun = false;
    }
    void startCamera()
    {
        int errorsleeptime = 5000;
        camerathreadrun = true;
        while (camerathreadrun)
        {
            try
            {
                Bitmap bmp = camera.GetImage(DeviceName);
                if (bmp != null)
                {
                    errortimes = 0;
                    errorsleeptime = 5000;
                    camera_event?.Invoke(this, bmp);
                }
                else if (bmp == null && errortimes < 5)
                {
                    errortimes++;
                    LogUtil.error(Name + $"相机获取图像出错,{errortimes}");
                    Thread.Sleep(errorsleeptime);
                }
                else if (errortimes == 5)
                {
                    camera.Close(DeviceName);
                    Thread.Sleep(1000);
                    camera.Open(DeviceName);
                    errortimes=0;
                    errorsleeptime = errorsleeptime * 2;
                    LogUtil.error(Name + $"相机错误次数过多,重新打开,{errortimes}");
                }
                else if (errortimes == 6)
                {
                    LogUtil.error(Name + $"相机连接失败, 相机线程退出,{errortimes}");
                    break;
                }
                Thread.Sleep(1000 / 5);
            }
            catch
            {
                errortimes++;
            }
        }
        try
        {
            camera.Close(DeviceName);
        }
        catch { }
        camera.Dispose();
    }
    public void CameraGrabOne(string filename)
    {
        try
        {
            LogUtil.info(Name + "库位文件名:" + filename);
            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());
        }
    }
    public string GetFixtureStateFilename(string PositionNum, string WareNumber, StoreMoveType storeMoveType, FixtureState fixtureState)
    {
        Path.GetInvalidFileNameChars().ToList().ForEach((ix) => { WareNumber = WareNumber.Replace(ix.ToString(), ""); });
        if (WareNumber.Length > 200) {
            WareNumber = "";
        }

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

}
public enum FixtureState
{
    FromIn,
    FromOut,
    FromInSide,
    FromOutSide,
    ToIn,
    ToOut,
    ToInSide,
    ToOutSide,
    ToFix,
}