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 { } } } }