370 lines
12 KiB
C++
Raw Normal View History

2025-12-10 00:01:32 +08:00
// DeviceEvents.cpp
/* @brief<65><66><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FrameTrigger<65>¼<EFBFBD><C2BC><EFBFBD>FrameTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>LineTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD>
* @note<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>FrameTrigger<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>FrameTriggerIgnored<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>LineTriggerIgnored<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>MessageChannel<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ָù<EFBFBD><EFBFBD>ܣ<EFBFBD>MessageChannel<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>֪ͨģʽ<EFBFBD>򿪡<EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This example shows the user how to register the camera FrameTrigger event, FrameTriggerIgnored event, LineTriggerIgnored event, MessageChannel event.
* @note<EFBFBD><EFBFBD>Only 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<65><66><EFBFBD>жϺ<D0B6><CFBA><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] errc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>Determine whether the function is called successfully.
* @param[in] errc<EFBFBD><EFBFBD>Function return value. */
#define CHECK(errc) \
if (ITKSTATUS_OK != errc) \
printErrorAndExit(errc)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Camera device handle.
ITKDEVICE g_hCamera;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Stream handle.
ITKSTREAM g_hStream;
/* @brief<65><66><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
*
* @brief<EFBFBD><EFBFBD>Users enter Enter to exit the program. */
void pressEnterToExit(void);
/* @brief<65><66><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] errc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>Print error message and exit the program.
* @param[in] errc<EFBFBD><EFBFBD>Function return value. */
void printErrorAndExit(ITKSTATUS errc);
/* @brief<65><66>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD>
* @param[in] hDev<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>register device events callback.
* @param[in] hDev<EFBFBD><EFBFBD>device handle. */
void RegisterDeviceCallback(ITKDEVICE hDev);
/* @brief<65><66>ȡ<EFBFBD><C8A1>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD>
* @param[in] hDev<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>unregister device events callback.
* @param[in] hDev<EFBFBD><EFBFBD>device handle. */
void UnregisterDeviceCallback(ITKDEVICE hDev);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FrameTrigger<65><72><EFBFBD><EFBFBD>ֵ<EFBFBD>ı<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] context<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] eventInfo<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When FrameTrigger feature value is changed, the function will be called.
* @param[in] context<EFBFBD><EFBFBD>Input parameter.
* @param[in] eventInfo<EFBFBD><EFBFBD>Event information handle. */
void __stdcall FrameTriggerCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FrameTriggerIgnored<65><64><EFBFBD><EFBFBD>ֵ<EFBFBD>ı<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] context<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] eventInfo<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When FrameTriggerIgnored feature value is changed, the function will be called.
* @param[in] context<EFBFBD><EFBFBD>Input parameter.
* @param[in] eventInfo<EFBFBD><EFBFBD>Event information handle. */
void __stdcall FrameTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LineTriggerIgnored<65><64><EFBFBD><EFBFBD>ֵ<EFBFBD>ı<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] context<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] eventInfo<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When LineTriggerIgnored feature value is changed, the function will be called.
* @param[in] context<EFBFBD><EFBFBD>Input parameter.
* @param[in] eventInfo<EFBFBD><EFBFBD>Event information handle. */
void __stdcall LineTriggerIgnoredCallback(void* context, ITKEVENTINFO eventInfo);
/* @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2>Ϊһ<CEAA><D2BB><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD>
* @param[in] context<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param[in] eventInfo<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @brief<EFBFBD><EFBFBD>This function is registered as a callback function. When message channel event is triggered, the function will be called.
* @param[in] context<EFBFBD><EFBFBD>Input parameter.
* @param[in] eventInfo<EFBFBD><EFBFBD>Event information handle. */
void __stdcall MessageChannelCallback(void* context, ITKEVENTINFO eventInfo);
int main(void)
{
// IKapC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
//
// Return value of IKapC functions.
ITKSTATUS res;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// The number of available devices.
uint32_t numDevices = 0;
// <20><>Ҫ<EFBFBD>򿪵<EFBFBD><F2BFAAB5><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// The index of device to be opened.
uint32_t devIndex = 0;
printf("Itek Console Camera Features Example(C version)\n");
// <20><>ʼ<EFBFBD><CABC> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
//
// Initialize IKapC runtime environment.
res = ItkManInitialize();
CHECK(res);
// ö<>ٿ<EFBFBD><D9BF><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>豸ǰ<E8B1B8><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ItkManGetDeviceCount() <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Enumerate the number of available devices. Before opening the device, ItkManGetDeviceCount() function must be called.
res = ItkManGetDeviceCount(&numDevices);
CHECK(res);
// <20><>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5>豸ʱ<E8B1B8><CAB1>
//
// 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);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Open the device and get the handle of the device.
res = ItkDevOpen(devIndex, ITKDEV_VAL_ACCESS_MODE_CONTROL, &g_hCamera);
CHECK(res);
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FrameTrigger<65><72>FrameTriggerIgnored<65><64>LineTriggerIgnored<65><64>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD>
//
// register FrameTrigger<65><72>FrameTriggerIgnored<65><64>LineTriggerIgnored<65><64>MessageChannel events.
RegisterDeviceCallback(g_hCamera);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Create stream
res = ItkDevAllocStreamEx(g_hCamera, 0, 3, &g_hStream);
CHECK(res);
// <20><>ʼ<EFBFBD>ɼ<EFBFBD>
//
// Start acquisition
res = ItkStreamStart(g_hStream, 0);
CHECK(res);
getchar();
getchar();
// ֹͣ<CDA3>ɼ<EFBFBD>
//
// Stop acquisition
res = ItkStreamStop(g_hStream);
CHECK(res);
// ȡ<><C8A1>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FrameTrigger<65><72>FrameTriggerIgnored<65><64>LineTriggerIgnored<65><64>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD>
//
// unregister FrameTrigger<65><72>FrameTriggerIgnored<65><64>LineTriggerIgnored<65><64>MessageChannel events.
UnregisterDeviceCallback(g_hCamera);
//<2F>ر<EFBFBD><D8B1><EFBFBD><E8B1B8>
//
// Close the device.
res = ItkDevClose(g_hCamera);
CHECK(res);
// <20>ͷ<EFBFBD> IKapC <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>
//
// Release IKapC runtime environment.
ItkManTerminate();
pressEnterToExit();
return EXIT_SUCCESS;
}
// <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// 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;
// ע<><D7A2>FrameTrigger<65>¼<EFBFBD><C2BC><EFBFBD>
//
// register FrameTrigger event.
res = ItkDevRegisterCallback(g_hCamera, "FrameTrigger", FrameTriggerCallback, g_hCamera);
CHECK(res);
// ע<><D7A2>FrameTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>
//
// register FrameTriggerIgnored event.
res = ItkDevRegisterCallback(g_hCamera, "FrameTriggerIgnored", FrameTriggerIgnoredCallback, g_hCamera);
CHECK(res);
// ע<><D7A2>LineTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>
//
// register LineTriggerIgnored event.
res = ItkDevRegisterCallback(g_hCamera, "LineTriggerIgnored", LineTriggerIgnoredCallback, g_hCamera);
CHECK(res);
// ע<><D7A2>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD>
//
// register MessageChannel event.
res = ItkDevRegisterCallback(g_hCamera, "MessageChannel", MessageChannelCallback, g_hCamera);
CHECK(res);
}
void UnregisterDeviceCallback(ITKDEVICE hDev)
{
ITKSTATUS res = ITKSTATUS_OK;
// ȡ<><C8A1>ע<EFBFBD><D7A2>FrameTrigger<65>¼<EFBFBD><C2BC><EFBFBD>
//
// unregister FrameTrigger event.
res = ItkDevUnregisterCallback(g_hCamera, "FrameTrigger");
CHECK(res);
// ȡ<><C8A1>ע<EFBFBD><D7A2>FrameTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>
//
// unregister FrameTriggerIgored event.
res = ItkDevUnregisterCallback(g_hCamera, "FrameTriggerIgnored");
CHECK(res);
// ȡ<><C8A1>ע<EFBFBD><D7A2>LineTriggerIgnored<65>¼<EFBFBD><C2BC><EFBFBD>
//
// unregister LineTriggerIgnored event.
res = ItkDevUnregisterCallback(g_hCamera, "LineTriggerIgnored");
CHECK(res);
// ȡ<><C8A1>ע<EFBFBD><D7A2>MessageChannel<65>¼<EFBFBD><C2BC><EFBFBD>
//
// unregister MessageChannel event.
res = ItkDevUnregisterCallback(g_hCamera, "MessageChannel");
CHECK(res);
}
void __stdcall FrameTriggerCallback(void* context, ITKEVENTINFO eventInfo)
{
ITKDEVICE hDev = (ITKDEVICE)context;
// <20><>ȡ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣ<EFBFBD><CFA2>
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// <20><>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2>
//
// 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;
// <20><>ȡ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣ<EFBFBD><CFA2>
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// <20><>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2>
//
// 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;
// <20><>ȡ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣ<EFBFBD><CFA2>
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// <20><>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2>
//
// 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;
// <20><>ȡ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>Ϣ<EFBFBD><CFA2>
//
// Get the event info.
ITK_DEVEVENT_INFO devEventInfo;
ITKSTATUS res = ItkEventGetInfo(eventInfo, &devEventInfo);
CHECK(res);
// <20><>ӡ<EFBFBD><D3A1>Ϣ<EFBFBD><CFA2>
//
// 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
}
// <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// Users enter Enter to exit the program.
void pressEnterToExit(void)
{
fprintf(stderr, "\nPress enter to exit.\n");
while (getchar() != '\n')
;
}