|
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Runtime.InteropServices;
- using IKapC.NET;
- using IKapBoardClassLibrary;
- using System.Threading;
- namespace LeatherApp.Device.CamerUtil
- {
- class IKDeviceCL : IKDevice
- {
- [DllImport("kernel32.dll")]
- public static extern void CopyMemory(IntPtr Destination, IntPtr Source, int Length);
- // 回调函数
- #region Callback
- delegate void IKapCallBackProc(IntPtr pParam);
- private IKapCallBackProc OnGrabStartProc;
- private IKapCallBackProc OnFrameLostProc;
- private IKapCallBackProc OnTimeoutProc;
- private IKapCallBackProc OnFrameReadyProc;
- private IKapCallBackProc OnGrabStopProc;
- #endregion
-
- public IKDeviceCL()
- {
- m_nType = 1;
- }
-
- public override bool openDevice(int nDevIndex, int nBoardIndex)
- {
- closeDevice();
- uint res = IKapCLib.ItkDevOpen((uint)nDevIndex
- , (int)(ItkDeviceAccessMode.ITKDEV_VAL_ACCESS_MODE_CONTROL)
- , ref m_pDev);
- if (!Check(res))
- {
- System.Diagnostics.Debug.WriteLine("Camera error:Open camera failed");
- return false;
- }
- m_nDevIndex = nDevIndex;
- //打开采集卡
- m_pBoard = IKapBoard.IKapOpen((uint)BoardType.IKBoardPCIE, (uint)nBoardIndex);
- m_nBoardIndex = nBoardIndex;
- if (m_pBoard == new IntPtr(-1))
- return false;
- return true;
- }
-
- public override bool isOpen()
- {
- return m_pDev != new IntPtr(-1) && m_pBoard != new IntPtr(-1);
- }
-
- public override bool closeDevice()
- {
- if (isOpen())
- {
- IKapBoard.IKapClose(m_pBoard);
- IKapCLib.ItkDevClose(m_pDev);
- }
- return true;
- }
-
- public override bool loadConfiguration(string sFilePath)
- {
- int ret = IKapBoard.IKapLoadConfigurationFromFile(m_pBoard, sFilePath);
- return ret == (int)ErrorCode.IK_RTN_OK;
- }
-
- public override bool createBuffer()
- {
- int ret = (int)ErrorCode.IK_RTN_OK;
- int nImageType = 0;
- ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_WIDTH, ref m_nWidth);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_HEIGHT, ref m_nHeight);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_IMAGE_TYPE, ref nImageType);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_DATA_FORMAT, ref m_nDepth);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- ret = IKapBoard.IKapGetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_SIZE, ref m_nBufferSize);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- switch (nImageType)
- {
- case 0:
- m_nChannels = 1;
- break;
- case 1:
- case 3:
- m_nChannels = 3;
- break;
- case 2:
- case 4:
- m_nChannels = 4;
- break;
- }
- m_pUserBuffer = Marshal.AllocHGlobal(m_nBufferSize);
- return true;
- }
-
- public override void clearBuffer()
- {
- if (m_pUserBuffer == new IntPtr(-1))
- return;
- Marshal.FreeHGlobal(m_pUserBuffer);
- m_pUserBuffer = new IntPtr(-1);
- }
-
- public override bool startGrab(int nCount)
- {
- int ret;
- // 设置抓取模式,IKP_GRAB_NON_BLOCK为非阻塞模式
- //int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
- //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- //// 设置帧传输模式,IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT为同步保存模式
- //int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
- //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- // 设置缓冲区格式
- //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_COUNT, m_nFrameCount);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- //// 设置帧超时时间
- //int timeout = -1;
- // ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_TIME_OUT, timeout);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- //// 设置采集模式。
- ////
- //// Set grab mode.
- //int grab_mode = (int)GrabMode.IKP_GRAB_NON_BLOCK;
- //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_GRAB_MODE, grab_mode);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- //// 设置传输模式。
- ////
- //// Set transfer mode.
- //int transfer_mode = (int)FrameTransferMode.IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
- //ret = IKapBoard.IKapSetInfo(m_pBoard, (uint)INFO_ID.IKP_FRAME_TRANSFER_MODE, transfer_mode);
- //if (ret != (int)ErrorCode.IK_RTN_OK)
- // return false;
-
- // 注册回调函数
- IntPtr hPtr = new IntPtr(-1);
- OnGrabStartProc = new IKapCallBackProc(OnGrabStartFunc);
- ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStart, Marshal.GetFunctionPointerForDelegate(OnGrabStartProc), hPtr);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
-
- OnFrameReadyProc = new IKapCallBackProc(OnFrameReadyFunc);
- ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameReady, Marshal.GetFunctionPointerForDelegate(OnFrameReadyProc), hPtr);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
-
- OnFrameLostProc = new IKapCallBackProc(OnFrameLostFunc);
- ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_FrameLost, Marshal.GetFunctionPointerForDelegate(OnFrameLostProc), hPtr);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
-
- OnTimeoutProc = new IKapCallBackProc(OnTimeoutFunc);
- ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_TimeOut, Marshal.GetFunctionPointerForDelegate(OnTimeoutProc), hPtr);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
-
- OnGrabStopProc = new IKapCallBackProc(OnGrabStopFunc);
- ret = IKapBoard.IKapRegisterCallback(m_pBoard, (uint)CallBackEvents.IKEvent_GrabStop, Marshal.GetFunctionPointerForDelegate(OnGrabStopProc), hPtr);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
-
- m_bUpdateImage = false;
- m_nCurFrameIndex = 0;
- ret = IKapBoard.IKapStartGrab(m_pBoard, nCount);
- if (ret != (int)ErrorCode.IK_RTN_OK)
- return false;
- m_bGrabingImage = true;
- return true;
- }
-
- public override bool stopGrab()
- {
- IKapBoard.IKapStopGrab(m_pBoard);
- do
- {
- } while (m_bGrabingImage);
- return true;
- }
-
- #region Callback
- // 开始抓帧回调
- public void OnGrabStartFunc(IntPtr pParam)
- {
- Console.WriteLine("Start grabbing image");
- }
- // 丢帧回调
- public void OnFrameLostFunc(IntPtr pParam)
- {
- Console.WriteLine("Frame lost");
- }
- // 帧超时回调
- public void OnTimeoutFunc(IntPtr pParam)
- {
- Console.WriteLine("Grab image timeout");
- }
- // 一帧图像完成回调
- public void OnFrameReadyFunc(IntPtr pParam)
- {
- IntPtr hPtr = new IntPtr(-1);
- // 获取当前帧状态
- IKapBoard.IKAPBUFFERSTATUS status = new IKapBoard.IKAPBUFFERSTATUS();
- IKapBoard.IKapGetBufferStatus(m_pBoard, m_nCurFrameIndex, ref status);
- if (status.uFull == 1)
- {
- IKapBoard.IKapGetBufferAddress(m_pBoard, m_nCurFrameIndex, ref hPtr);
- lock (m_mutexImage)
- {
- CopyMemory(m_pUserBuffer, hPtr, m_nBufferSize);
- m_bUpdateImage = true;
- }
- }
- m_nCurFrameIndex++;
- m_nCurFrameIndex = m_nCurFrameIndex % m_nFrameCount;
- }
- // 停止抓取图像回调
- public void OnGrabStopFunc(IntPtr pParam)
- {
- Console.WriteLine("Stop grabbing image");
- m_bGrabingImage = false;
- }
- #endregion
- }
- }
|