165 lines
6.9 KiB
C++
Raw Normal View History

2025-12-10 00:01:32 +08:00
#include "GeneralGrabWithGrabber.h"
void SetSoftTriggerWithGrabber(pItkCamera pCam)
{
ITKSTATUS res = ITKSTATUS_OK;
int ret = IK_RTN_OK;
if (pCam->g_bSoftTriggerUsed) {
if (strcmp(pCam->g_devInfo.DeviceClass, "CoaXPress") == 0) {
res = ItkDevSetDouble(pCam->g_hCamera, "ExposureTime", 80);
res = ItkDevFromString(pCam->g_hCamera, "TriggerMode", "On");
res = ItkDevFromString(pCam->g_hCamera, "ExposureMode", "TriggerPulse");
ret = IKapSetInfo(pCam->g_hBoard, IKP_IMAGE_HEIGHT, 1000);
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_CXP_TRIGGER_OUTPUT_SELECTOR, 1); // Integration Signal1
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_INTEGRATION_TRIGGER_SOURCE, 9); // Software Trigger
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_INTEGRATION_METHOD, 4); // Method5
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_INTEGRATION_PARAM2, 5000);
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_CXP_FRAME_BURST_COUNT, 1050);
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_CXP_FRAME_BURST_PERIOD, 100000);
CHECK_IKAPBOARD(ret);
ret = IKapSetInfo(pCam->g_hBoard, IKP_SOFTWARE_TRIGGER_WIDTH, 5000);
CHECK_IKAPBOARD(ret);
} else if (strcmp(pCam->g_devInfo.DeviceClass, "CameraLink") == 0) {
res = ItkDevFromString(pCam->g_hCamera, "SynchronizationMode", "ExternalPulse");
res = ItkDevFromString(pCam->g_hCamera, "InputLineTriggerSource", "CC1"); // InputLineTriggerSource
res = ItkDevSetDouble(pCam->g_hCamera, "LinePeriodTime", 50);
ret = IKapSetInfo(pCam->g_hBoard, IKP_IMAGE_HEIGHT, 2000);
ret = IKapSetInfo(pCam->g_hBoard, IKP_CC1_SOURCE, 5); // Software Trigger
ret = IKapSetInfo(pCam->g_hBoard, IKP_SOFTWARE_TRIGGER_SYNC_MODE, 0); // Off
ret = IKapSetInfo(pCam->g_hBoard, IKP_SOFTWARE_TRIGGER_PERIOD, 80); // softTriggerPeriod
ret = IKapSetInfo(pCam->g_hBoard, IKP_SOFTWARE_TRIGGER_COUNT, 2050); // softTriggerCount
} else {
res = ItkDevFromString(pCam->g_hCamera, "TriggerSelector", "FrameStart");
res = ItkDevFromString(pCam->g_hCamera, "TriggerMode", "On");
res = ItkDevFromString(pCam->g_hCamera, "TriggerSource", "Software");
}
} else {
if (strcmp(pCam->g_devInfo.DeviceClass, "CoaXPress") == 0) {
res = ItkDevFromString(pCam->g_hCamera, "ExposureMode", "Timed");
} else if (strcmp(pCam->g_devInfo.DeviceClass, "CameraLink") == 0) {
res = ItkDevFromString(pCam->g_hCamera, "SynchronizationMode", "InternalFreeRun");
} else {
res = ItkDevFromString(pCam->g_hCamera, "TriggerSelector", "FrameStart");
res = ItkDevFromString(pCam->g_hCamera, "TriggerMode", "Off");
}
}
}
void ConfigureFrameGrabber(pItkCamera pCam)
{
ITKSTATUS res = ITKSTATUS_OK;
int ret = IK_RTN_OK;
char configFilename[MAX_PATH];
if (pCam->g_bLoadGrabberConfig) {
if (GetOption(configFilename) == false) {
printf("Fail to get configuration, using default setting!\n");
} else {
ret = IKapLoadConfigurationFromFile(pCam->g_hBoard, configFilename);
CHECK_IKAPBOARD(ret);
}
}
ret = IKapSetInfo(pCam->g_hBoard, IKP_FRAME_COUNT, pCam->g_bufferCount);
CHECK_IKAPBOARD(ret);
int timeout = -1;
ret = IKapSetInfo(pCam->g_hBoard, IKP_TIME_OUT, timeout);
CHECK_IKAPBOARD(ret);
int grab_mode = IKP_GRAB_NON_BLOCK;
ret = IKapSetInfo(pCam->g_hBoard, IKP_GRAB_MODE, grab_mode);
CHECK_IKAPBOARD(ret);
int transfer_mode = IKP_FRAME_TRANSFER_SYNCHRONOUS_NEXT_EMPTY_WITH_PROTECT;
ret = IKapSetInfo(pCam->g_hBoard, IKP_FRAME_TRANSFER_MODE, transfer_mode);
CHECK_IKAPBOARD(ret);
/***************************/
/// \~chinese չʾ<D5B9><CABE><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7>ΪBuffer<65><72><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7>ע<EFBFBD>ⲻҪ<E2B2BB><D2AA><EFBFBD><EFBFBD><EFBFBD>ͷŸ<CDB7><C5B8>ڴ<EFBFBD> \~english Show how to using the memory address as the memory address of Buffer,be careful not to forget to release the memory
/// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Buffer<65><72>ַ<EFBFBD><D6B7><EFBFBD>ڴ<EFBFBD> \~english Create the memory that the user requests for setting the Buffer address
/*int64_t nFrameSize = 0;
ret = IKapGetInfo64(pCam->g_hBoard, IKP_FRAME_SIZE, &nFrameSize);
CHECK_IKAPBOARD(ret);
pCam->g_user_buffer = (char*)malloc(nFrameSize);
if (pCam->g_user_buffer == NULL)
{
pressEnterToExit();
exit(EXIT_FAILURE);
}*/
// \~chinese <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>Buffer<65><72><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7>Ϊ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ʵ<EFBFBD><CAB5>ڴ<EFBFBD><DAB4><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1~g_bufferCount-1<><31>Bufferͬ<72><CDAC><EFBFBD><EFBFBD> \~english The memory address of Buffer with index number 0 is changed to the appropriate size memory address applied by the user, just as with Buffer with index number 1~g_bufferCount-1.
/*ret = IKapSetBufferAddress(pCam->g_hBoard, 0, pCam->g_user_buffer);
CHECK_IKAPBOARD(ret);*/
/***************************/
}
void StartGrabImage(pItkCamera pCam)
{
ITKSTATUS res = ITKSTATUS_OK;
int ret = IK_RTN_OK;
if (strcmp(pCam->g_devInfo.DeviceClass, "CameraLink") != 0) {
res = ItkDevExecuteCommand(pCam->g_hCamera, "AcquisitionStop");
CHECK_IKAPC(res);
}
ret = IKapStartGrab(pCam->g_hBoard, 0);
CHECK_IKAPBOARD(ret);
if (strcmp(pCam->g_devInfo.DeviceClass, "CameraLink") != 0) {
res = ItkDevExecuteCommand(pCam->g_hCamera, "AcquisitionStart");
CHECK_IKAPC(res);
}
}
/// \~chinese ѡ<><D1A1><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> \~english Select configuration file
bool GetOption(char* lpConfigFileName)
{
OPENFILENAME iniofn;
wchar_t gcMsgBuf[MAX_PATH] = _T("\0");
wchar_t lpTempFileName[_MAX_PATH] = _T("\0");
GetModuleFileName(NULL, gcMsgBuf, MAX_PATH);
PathRemoveFileSpec(gcMsgBuf);
iniofn.lStructSize = sizeof(OPENFILENAME);
iniofn.hwndOwner = NULL;
iniofn.lpstrFilter = _T("Configuration File(*.vlcf)\0*.vlcf\0");
iniofn.lpstrCustomFilter = NULL;
iniofn.nFilterIndex = 1;
iniofn.lpstrFile = lpTempFileName;
iniofn.nMaxFile = MAX_PATH;
iniofn.lpstrFileTitle = NULL;
iniofn.nMaxFileTitle = MAX_PATH;
iniofn.lpstrInitialDir = gcMsgBuf;
iniofn.lpstrTitle = _T("The 'Configuration File' of the purpose read is chosen.");
iniofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
iniofn.lpstrDefExt = _T("vlcf");
if (GetOpenFileName(&iniofn) == FALSE)
return false;
WideCharToMultiByte(
CP_OEMCP, 0, lpTempFileName, (int)_tcsclen(lpTempFileName) + 1, lpConfigFileName, _MAX_PATH, NULL, NULL);
return true;
}