1、何谓事件
事件是一种消息传递机制,在事件机制中,有三种最重要的东西:
事件生产者、事件本身、事件消费者。
以上就是事件机制的最基本结构,事件从事件生产者流向事件消费者,整个过程传递的是事件这一信息载体。一般用作于某种情况发生时的即时响应。
2、如何理解事件机制
对于工业相机而言,事件机制在很多方面均有体现:图像回调、异常回调、事件回调等等。其中最常见的就是图像回调,当相机发送一张图像到达底层驱动,此时在底层驱动(事件生产者)处发生了“驱动端收到一张图像”这一事件,那么对应的图像回调函数(事件消费者)就会响应这一事件,进而执行该函数并返回图像数据指针。
3、如何理解Event Control功能
对于Event Control功能,其中包括Acquisition Start/End、Frame Start/End、Exposure Start/End等多种事件,开启对某种事件的响应功能后,当相机内出现这一事件动作,我们便可以在控制端获取到这一信息,以便后续针对性处理。
实际使用效果如下图所示:
Event Control功能常用于监测相机状态,一般用于获取相机在产生某种动作时的相机时间戳,常用于判断相机触发/采集动作等方面。
4、Event Control功能基础使用
参考示例:
MVS\Development\Samples路径下的Events示例
流程框图:
使用接口(以C接口为例):
选择事件:MV_CC_SetEnumValueByString()
nRet = MV_CC_SetEnumValueByString(handle,"EventSelector","ExposureEnd");
if (MV_OK != nRet)
{
printf("Set Event Selector fail! nRet [0x%x]\n", nRet);
break;
}
其中:“ExposureEnd”位置需填入所需使用的事件名称,需注意大小写。待写入的事件名称可通过MVS中的Event Control节点进行查看:
配置事件响应:MV_CC_SetEnumValueByString()
nRet = MV_CC_SetEnumValueByString(handle,"EventNotification","On");
if (MV_OK != nRet)
{
printf("Set Event Notification fail! nRet [0x%x]\n", nRet);
break;
}
其中:“On”位置需填入对该事件的响应配置,可选“On”/“Off”
注册事件回调:MV_CC_RegisterEventCallBackEx()
nRet = MV_CC_RegisterEventCallBackEx(handle, "ExposureEnd", EventCallBack, handle);
if (MV_OK != nRet)
{
printf("Register Event CallBack fail! nRet [0x%x]\n", nRet);
break;
}
注意:该函数注册的回调函数只会响应指定相机产生的指定事件,若需使回调函数响应所有事件可使用MV_CC_RegisterAllEventCallBack()接口
注意:函数名应与注册事件回调中的名称相同
void __stdcall EventCallBack(MV_EVENT_OUT_INFO * pEventInfo, void* pUser)
{
if (pEventInfo)
{
__int64 nBlockId = pEventInfo->nBlockIdHigh;
nBlockId = (nBlockId << 32) + pEventInfo->nBlockIdLow;
__int64 nTimestamp = pEventInfo->nTimestampHigh;
nTimestamp = (nTimestamp << 32) + pEventInfo->nTimestampLow;
printf("EventName[%s], EventID[%u], BlockId[%I64d], Timestamp[%I64d]\n",
pEventInfo->EventName, pEventInfo->nEventID,nBlockId,nTimestamp);
}
}
打印结果: