Camera.cs 5.7 KB
using Asa.Camera;
using DeviceLibrary;
using OnlineStore;
using OnlineStore.Common; 
using System; 
using System.Drawing;
using System.Drawing.Imaging;
using System.IO; 
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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 = Application.StartupPath + $"Config\\{CameraID}.json";
        if (!File.Exists(path))
        {
            msg = Name + crc.GetString("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("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("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)
    {
        return;
        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)
    //{
    //    if (string.IsNullOrWhiteSpace(WareNumber))
    //        return "";

    //    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}\\{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,
}