Newer
Older
IRIS_REFACTOR / irisRefactor / IrisCamera / CameraController.cs
yanxiaowei on 11 Aug 2020 9 KB first commit
using irisDataBase;
using irisHelper;
using irisRefactor.FrmService;
using irisRefactor.IrisScoket;
using irisRefactor.IrisThread;
using MvCamCtrl.NET;
using System;
using System.Data;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;

namespace irisRefactor.IrisCamera
{
    public class CameraController
    {
        CameraOperator m_pOperator = new CameraOperator();

        private static CameraController _cameraController = null;
        private CameraController()
        {
        }
        public static CameraController GetInstance()
        {
            if (_cameraController == null)
                _cameraController = new CameraController();

            return _cameraController;
        }

        public void timerCamera_Tick(Object sender, EventArgs myEventArgs)
        {
            LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "CameraTickBegin");
            //准备相机列表
            uint numDevices = 0;
            numDevices = DeviceListAcq();

            if (numDevices == 0)
            {
                if (ProMemory.appConfig.Language == 1)
                    MessageBox.Show("没有检测到相机!", "提示");
                else
                    MessageBox.Show("No Device!", "提示");
                return;
            }
            
            if (DatabaseLocal.mySqlConnect.State != ConnectionState.Closed)
            {
                DatabaseLocal.CloseDB();
            }
            
            //打开设备,开始采集
            if (numDevices > 0)
            {
                ProMemory.timerCamera.Dispose();

                ProMemory.IoControllService.GreenOff();
                ProMemory.IoControllService.RedOff();
                ProMemory.IoControllService.YellowOn();

                ConnectCamera();
            }
        }

        //搜索相机列表
        private uint DeviceListAcq()
        {
            int nRet;

            //创建设备列表MyCamera.MV_GIGE_DEVICE | 
            nRet = CameraOperator.EnumDevices(MyCamera.MV_USB_DEVICE, ref ProMemory.m_pDeviceList);
            if (0 != nRet)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "DeviceListAcq :enum failed");
                return 0;
            }

            return ProMemory.m_pDeviceList.nDeviceNum;
        }

        //连接相机
        private void ConnectCamera()
        {
            try
            {
                if (ProMemory.m_pDeviceList.nDeviceNum == 0)
                {
                    if (ProMemory.appConfig.Language == 1)
                        MessageBox.Show("无设备!", "提示");
                    else
                        MessageBox.Show("No Device!", "Meaasge");

                    return;
                }
                int nRet = -1;

                //获取选择的设备信息
                MyCamera.MV_CC_DEVICE_INFO device =
                    (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(ProMemory.m_pDeviceList.pDeviceInfo[0],
                                                                  typeof(MyCamera.MV_CC_DEVICE_INFO));

                //打开设备
                nRet = m_pOperator.Open(ref device);
                if (MyCamera.MV_OK != nRet)
                {
                    if (ProMemory.appConfig.Language == 1)
                        MessageBox.Show("相机打开失败!","提示");
                    else
                        MessageBox.Show("No Device!", "Message");
                    return;
                }

                //设置连续采集模式
                m_pOperator.SetEnumValue("AcquisitionMode", 2);
                m_pOperator.SetEnumValue("TriggerMode", 0);

                //注册回调函数
                ProMemory.ImageCallback = new MyCamera.cbOutputdelegate(SaveImageTh.GetInstance().SaveImage);
                nRet = m_pOperator.RegisterImageCallBack(ProMemory.ImageCallback, IntPtr.Zero);
                if (CameraOperator.CO_OK != nRet)
                {
                    if (ProMemory.appConfig.Language == 1)
                        MessageBox.Show("注册回调失败!", "提示");
                    else
                        MessageBox.Show("regist failed", "message");
                }

                ProMemory.CallBackFunc = new MyCamera.cbExceptiondelegate(getException);
                int exNet = m_pOperator.RegisterExceptionCallBack(ProMemory.CallBackFunc, IntPtr.Zero);

                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "CAMERA,START");
                ContinuousShot_TriggerOff();
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "connect camera failed:" + e.Message);
                MessageBox.Show("ConnectCamera:" + e.Message);
            }
        }

        private void getException(uint nMsgType, IntPtr pUser)
        {
            LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "Exception callback:" + nMsgType);
            try
            {
                ConnectCamera();
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "camera save success!");
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "camera save failed");
            }
        }

        public void ContinuousShot_TriggerOn()
        {
            try
            {
                ProMemory.isWait = true;

                int nRet = m_pOperator.StopGrabbing();
                ProMemory.m_bGrabbing = false;

                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "触发待机线程:" + Thread.CurrentThread.Name);
                while (ProMemory.isWait)
                {
                    if (ProMemory.IoControllService.getSensorVal() == 1&&!ProMemory.isSyning) //通过检测嵌入式板子输入端口0电平状态判断外触发是否到来
                    {
                        //外触发到来,开始采集
                        LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "外触发到来");
                        ProMemory.IoControllService.YellowOn();
                        Grabbing();
                        ProMemory.isWait = false;
                        //ProMemory.isSleeping = false;
                    }
                }
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "外触发采集错误 :" + e);
                MessageBox.Show("ContinuousShot_TriggerOn:" + e.Message);
            }
        }

        //普通模式开始采集
        public void ContinuousShot_TriggerOff()
        {
            if (ProMemory.isSyning) return;
            try
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "外触发到来当前线程:" + Thread.CurrentThread.Name);
                //重置界面
                if (ProMemory.formType == "1") Form1.GetInstance().ReInitialize();
                else if (ProMemory.formType == "2") Form2.GetInstance().ReInitialize();

                ProMemory.IoControllService.YellowOn();
                Grabbing();
                //ProMemory.isSleeping = false;

            }
            catch (Exception e)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "普通采集错误 :" + e);
            }
        }
       
        //断开相机
        public void CloseCamera()
        {
            try
            {
                //关闭设备
                m_pOperator.Close();

                //取流标志位清零
                ProMemory.m_bGrabbing = false;
            }
            catch (Exception e)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "断开相机错误:" + e);
                MessageBox.Show("CloseCamera:" + e.Message);
            }
        }

        public void Grabbing()
        {
            try
            {
                int nRet;
                string msg = "";

                lock (this)
                {
                    if (ProMemory.m_bGrabbing)
                    {
                        nRet = m_pOperator.StopGrabbing();
                        if (MyCamera.MV_OK != nRet)
                            msg += "停止取流失败;";
                        else
                        {
                            msg += "停止取流成功;";
                            ProMemory.m_bGrabbing = !ProMemory.m_bGrabbing;
                        }
                        //LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, msg);
                    }

                    nRet = m_pOperator.StartGrabbing();
                    if (MyCamera.MV_OK != nRet)
                        msg += "开始取流失败;";
                    else
                    {
                        msg += "开始取流成功;";
                        ProMemory.m_bGrabbing = !ProMemory.m_bGrabbing;
                        Thread.Sleep(1000);
                    }
                }
                
                int playRet = 0;
                if (ProMemory.formType == "1") m_pOperator.Display(Form1.GetInstance().picLive.Handle);
                else if (ProMemory.formType == "2") m_pOperator.Display(Form2.GetInstance().picLive.Handle);

                if (MyCamera.MV_OK != playRet)
                    LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "DISPLAY:" + "FAIEL");

                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, msg);

                ProMemory.findingEyes = true;
            }
            catch (Exception ex)
            {
                LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "StartGrabbingError");
            }
            finally
            {
            }

        }
     

    }
}