using irisDataBase; using irisHelper; using irisRefactor.FrmService; 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.WriteDebugLog(MethodBase.GetCurrentMethod().DeclaringType, "CameraTickBegin"); //准备相机列表 uint numDevices = 0; numDevices = DeviceListAcq(); if (numDevices == 0) { if (ProMemory.appConfig.Language == 1) MessageBox.Show("[timerCamera_Tick]没有检测到相机!", "提示"); else MessageBox.Show("[timerCamera_Tick]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.WriteErrorLog(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("[ConnectCamera]连接相机时无设备!", "提示"); else MessageBox.Show("[ConnectCamera]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("[ConnectCamera]相机打开失败!", "提示"); else MessageBox.Show("[ConnectCamera]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("[ConnectCamera]注册回调失败!", "提示"); else MessageBox.Show("[ConnectCamera]regist failed", "message"); } ProMemory.CallBackFunc = new MyCamera.cbExceptiondelegate(GetException); int exNet = m_pOperator.RegisterExceptionCallBack(ProMemory.CallBackFunc, IntPtr.Zero); LogHelper.WriteDebugLog(MethodBase.GetCurrentMethod().DeclaringType, "CAMERA,START"); ContinuousShot_TriggerOff(); } catch (Exception e) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "connect camera failed:" + e.Message); MessageBox.Show("ConnectCamera:" + e.Message); } } private void GetException(uint nMsgType, IntPtr pUser) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "Exception callback:" + nMsgType); try { LogHelper.WriteDebugLog(MethodBase.GetCurrentMethod().DeclaringType, "restart"); ShutdownHelper.Restart(); //LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "camera save success!"); } catch (Exception ex) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "camera save failed" + ex.Message); } } /** * 待机 * 持续监测感应模块,有外触发到来则重新开始工作 */ public void ContinuousShot_TriggerOn() { try { ProMemory.isWait = true; ProMemory.jobRuning = false; // 先停止取流 StopGrabbing(); //GC.Collect(); LogHelper.WriteDebugLog(MethodBase.GetCurrentMethod().DeclaringType, "触发待机线程:" + Thread.CurrentThread.Name); // 循环检测是否有外触发,重新开始工作 while (ProMemory.isWait) { // 通过检测嵌入式板子输入端口0电平状态判断外触发是否到来 if (ProMemory.IoControllService.getSensorVal() == 1) { // 外触发到来,开始采集 LogHelper.WriteDebugLog(MethodBase.GetCurrentMethod().DeclaringType, "外触发到来"); ProMemory.IoControllService.YellowOn(); ProMemory.isWait = false; Grabbing(); } } } catch (Exception e) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "外触发采集错误 :" + e); MessageBox.Show("ContinuousShot_TriggerOn:" + e.Message); } } /** * 正常工作 */ public void ContinuousShot_TriggerOff() { try { LogHelper.WriteDebugLog(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(); } catch (Exception e) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "普通采集错误 :" + e); } } //断开相机 public void CloseCamera() { try { //关闭设备 m_pOperator.Close(); //取流标志位清零 ProMemory.m_bGrabbing = false; } catch (Exception e) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "断开相机错误:" + e); MessageBox.Show("CloseCamera:" + e.Message); } } // 开始取流 public void Grabbing() { if (ProMemory.isSyning) { LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, "数据更新过程中,暂停取流"); return; } //ProMemory.jobRuning = true; 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; } } 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.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "DISPLAY:" + "FAIEL"); } LogHelper.WriteInfoLog(MethodBase.GetCurrentMethod().DeclaringType, msg); // 最重要的操作,将findingEyes的变量设置为true,表示可以开始找眼 ProMemory.findingEyes = true; ProMemory.identifyConfig.FlagWorking = true; } catch (Exception ex) { LogHelper.WriteErrorLog(MethodBase.GetCurrentMethod().DeclaringType, "StartGrabbingError"+ex.Message); } finally { } } private void StopGrabbing() { m_pOperator.StopGrabbing(); if (ProMemory.formType == "1") { Form1.GetInstance().picLive.Image = null; } else if (ProMemory.formType == "2") { Form2.GetInstance().picLive.Image = null; } ProMemory.m_bGrabbing = false; } } }