370 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DeviceEvents.cpp
/* @brief本示例向用户演示如何注册相机FrameTrigger事件、FrameTriggerIgnored事件、LineTriggerIgnored事件、MessageChannel事件。
* @note仅有部分相机支持FrameTrigger事件、FrameTriggerIgnored事件、LineTriggerIgnored事件、MessageChannel事件请查阅相机说明书确保相机支持该功能MessageChannel事件首先需要在事件选择器处选择需要监控的事件并将事件通知模式打开。
*
* @briefThis example shows the user how to register the camera FrameTrigger event, FrameTriggerIgnored event, LineTriggerIgnored event, MessageChannel event.
* @noteOnly some cameras support FrameTrigger, FrameTriggerIgnored, LineTriggerIgnored, and MessageChannel events. Please consult the camera instructions to ensure that the camera supports this function, For MessageChannel Events, please select the event to be monitored at the event selector and turn the event notification mode on.
*/
#include <Windows.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include "IKapC.h"
#pragma comment(lib, "IKapC.lib")
/* @brief判断函数是否成功调用。
* @param[in] errc函数返回值。
*
* @briefDetermine whether the function is called successfully.
* @param[in] errcFunction return value. */
#define CHECK(errc) \
if (ITKSTATUS_OK != errc) \
printErrorAndExit(errc)
// 相机设备句柄。
//
// Camera device handle.
ITKDEVICE g_hCamera;
// 数据流句柄。
//
// Stream handle.
ITKSTREAM g_hStream;
/* @brief用户输入回车键后退出程序。
*
*
* @briefUsers enter Enter to exit the program. */
void pressEnterToExit(void);
/* @brief打印错误信息后退出程序。
* @param[in] errc函数返回值。
*
* @briefPrint error message and exit the program.
* @param[in] errcFunction return value. */
void printErrorAndExit(ITKSTATUS errc);
/* @brief注册设备事件回调。
* @param[in] hDev设备句柄。
*
* @briefregister device events callback.
* @param[in] hDevdevice handle. */
void RegisterDeviceCallback(ITKDEVICE hDev);
/* @brief取消注册设备事件回调。
* @param[in] hDev设备句柄。
*
* @briefunregister device events callback.
* @param[in] hDevdevice handle. */
void UnregisterDeviceCallback(ITKDEVICE hDev);
/* @brief本函数被注册为一个回调函数。当FrameTrigger特征值改变时函数被调用。
* @param[in] context输入参数。
* @param[in] eventInfo事件信息句柄。
*
* @briefThis function is registered as a callback function. When FrameTrigger feature value is changed, the function will be called.
* @param[in] contextInput parameter.
* @param[in] eventInfoEvent information handle. */
void __stdcall FrameTriggerCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief本函数被注册为一个回调函数。当FrameTriggerIgnored特征值改变时函数被调用。
* @param[in] context输入参数。
* @param[in] eventInfo事件信息句柄。
*
* @briefThis function is registered as a callback function. When FrameTriggerIgnored feature value is changed, the function will be called.
* @param[in] contextInput parameter.
* @param[in] eventInfoEvent information handle. */
void __stdcall FrameTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief本函数被注册为一个回调函数。当LineTriggerIgnored特征值改变时函数被调用。
* @param[in] context输入参数。
* @param[in] eventInfo事件信息句柄。
*
* @briefThis function is registered as a callback function. When LineTriggerIgnored feature value is changed, the function will be called.
* @param[in] contextInput parameter.
* @param[in] eventInfoEvent information handle. */
void __stdcall LineTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief本函数被注册为一个回调函数。当MessageChannel事件被触发时函数被调用。
* @param[in] context输入参数。
* @param[in] eventInfo事件信息句柄。
*
* @briefThis function is registered as a callback function. When message channel event is triggered, the function will be called.
* @param[in] contextInput parameter.
* @param[in] eventInfoEvent information handle. */
void __stdcall MessageChannelCallback(void* context, ITKEVENTINFO eventInfo);
int main(void)
{
// IKapC 函数返回值。
//
// Return value of IKapC functions.
ITKSTATUS res;
// 可用设备的数量。
//
// The number of available devices.
uint32_t numDevices = 0;
// 需要打开的设备的索引。
//
// The index of device to be opened.
uint32_t devIndex = 0;
printf("Itek Console Camera Features Example(C version)\n");
// 初始化 IKapC 运行环境。
//
// Initialize IKapC runtime environment.
res = ItkManInitialize();
CHECK(res);
// 枚举可用设备的数量。在打开设备前,必须调用 ItkManGetDeviceCount() 函数。
//
// Enumerate the number of available devices. Before opening the device, ItkManGetDeviceCount() function must be called.
res = ItkManGetDeviceCount(&numDevices);
CHECK(res);
// 当没有连接的设备时。
//
// When there is no connected devices.
if (numDevices == 0) {
fprintf(stderr, "No device.\n");
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
fprintf(stderr, "total device count: %d, the index of which you want to open is:", numDevices);
fflush(stderr);
int scanTmp = scanf_s("%u", &devIndex);
if (scanTmp != 1) {
fprintf(stderr, "Invalid input. Expect an integer.\n");
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
if (devIndex >= numDevices)
{
fprintf(stderr, "index: %d is more than %d.\n", devIndex, numDevices - 1);
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
// 打开设备,获取设备句柄。
//
// Open the device and get the handle of the device.
res = ItkDevOpen(devIndex, ITKDEV_VAL_ACCESS_MODE_CONTROL, &g_hCamera);
CHECK(res);
// 注册相机FrameTrigger、FrameTriggerIgnored、LineTriggerIgnored、MessageChannel事件。
//
// register FrameTrigger、FrameTriggerIgnored、LineTriggerIgnored、MessageChannel events.
RegisterDeviceCallback(g_hCamera);
// 创建数据流
//
// Create stream
res = ItkDevAllocStreamEx(g_hCamera, 0, 3, &g_hStream);
CHECK(res);
// 开始采集
//
// Start acquisition
res = ItkStreamStart(g_hStream, 0);
CHECK(res);
getchar();
getchar();
// 停止采集
//
// Stop acquisition
res = ItkStreamStop(g_hStream);
CHECK(res);
// 取消注册相机FrameTrigger、FrameTriggerIgnored、LineTriggerIgnored、MessageChannel事件。
//
// unregister FrameTrigger、FrameTriggerIgnored、LineTriggerIgnored、MessageChannel events.
UnregisterDeviceCallback(g_hCamera);
//关闭设备。
//
// Close the device.
res = ItkDevClose(g_hCamera);
CHECK(res);
// 释放 IKapC 运行环境。
//
// Release IKapC runtime environment.
ItkManTerminate();
pressEnterToExit();
return EXIT_SUCCESS;
}
// 打印错误信息后退出程序。
//
// Print error message and exit the program.
void printErrorAndExit(ITKSTATUS errc)
{
fprintf(stderr, "Error Code:%08X\n", errc);
ItkManTerminate();
pressEnterToExit();
exit(EXIT_FAILURE);
}
void RegisterDeviceCallback(ITKDEVICE hDev)
{
ITKSTATUS res = ITKSTATUS_OK;
// 注册FrameTrigger事件。
//
// register FrameTrigger event.
res = ItkDevRegisterCallback(g_hCamera, "FrameTrigger", FrameTriggerCallback, g_hCamera);
CHECK(res);
// 注册FrameTriggerIgnored事件。
//
// register FrameTriggerIgnored event.
res = ItkDevRegisterCallback(g_hCamera, "FrameTriggerIgnored", FrameTriggerIgnoredCallback, g_hCamera);
CHECK(res);
// 注册LineTriggerIgnored事件。
//
// register LineTriggerIgnored event.
res = ItkDevRegisterCallback(g_hCamera, "LineTriggerIgnored", LineTriggerIgnoredCallback, g_hCamera);
CHECK(res);
// 注册MessageChannel事件。
//
// register MessageChannel event.
res = ItkDevRegisterCallback(g_hCamera, "MessageChannel", MessageChannelCallback, g_hCamera);
CHECK(res);
}
void UnregisterDeviceCallback(ITKDEVICE hDev)
{
ITKSTATUS res = ITKSTATUS_OK;
// 取消注册FrameTrigger事件。
//
// unregister FrameTrigger event.
res = ItkDevUnregisterCallback(g_hCamera, "FrameTrigger");
CHECK(res);
// 取消注册FrameTriggerIgnored事件。
//
// unregister FrameTriggerIgored event.
res = ItkDevUnregisterCallback(g_hCamera, "FrameTriggerIgnored");
CHECK(res);
// 取消注册LineTriggerIgnored事件。
//
// unregister LineTriggerIgnored event.
res = ItkDevUnregisterCallback(g_hCamera, "LineTriggerIgnored");
CHECK(res);
// 取消注册MessageChannel事件。
//
// unregister MessageChannel event.
res = ItkDevUnregisterCallback(g_hCamera, "MessageChannel");
CHECK(res);
}
void __stdcall FrameTriggerCallback(void* context, ITKEVENTINFO eventInfo)
{
ITKDEVICE hDev = (ITKDEVICE)context;
// 获取事件信息。
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// 打印信息。
//
// Print information.
#if __STDC_VERSION__ >= 199901L
printf("%s, time: %lld.\n", devEventInfo.eventName, devEventInfo.timestamp);
#else
printf("\n%s, time: %I64d.\n", devEventInfo.eventName, devEventInfo.timestamp);
#endif
}
void __stdcall FrameTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo)
{
ITKDEVICE hDev = (ITKDEVICE)context;
// 获取事件信息。
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// 打印信息。
//
// Print information.
#if __STDC_VERSION__ >= 199901L
printf("%s, time: %lld.\n", devEventInfo.eventName, devEventInfo.timestamp);
#else
printf("\n%s, time: %I64d.\n", devEventInfo.eventName, devEventInfo.timestamp);
#endif
}
void __stdcall LineTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo)
{
ITKDEVICE hDev = (ITKDEVICE)context;
// 获取事件信息。
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// 打印信息。
//
// Print information.
#if __STDC_VERSION__ >= 199901L
printf("%s, time: %lld.\n", devEventInfo.eventName, devEventInfo.timestamp);
#else
printf("\n%s, time: %I64d.\n", devEventInfo.eventName, devEventInfo.timestamp);
#endif
}
void __stdcall MessageChannelCallback(void* context, ITKEVENTINFO eventInfo)
{
ITKDEVICE hDev = (ITKDEVICE)context;
// 获取事件信息。
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// 打印信息。
//
// Print information.
#if __STDC_VERSION__ >= 199901L
printf("%s, event source: %s, time: %lld.\n", devEventInfo.eventName, devEventInfo.eventSource, devEventInfo.timestamp);
#else
printf("\n%s, event source: %s, time: %I64d.\n", devEventInfo.eventName, devEventInfo.eventSource, devEventInfo.timestamp);
#endif
}
// 用户输入回车键后退出程序。
//
// Users enter Enter to exit the program.
void pressEnterToExit(void)
{
fprintf(stderr, "\nPress enter to exit.\n");
while (getchar() != '\n')
;
}