#include "StdAfx.h" #include "CameraControl_Jai.h" #include #include "CHCameraControls/CameraBuffer.h" #define NODE_NAME_WIDTH (int8_t*)"Width" #define NODE_NAME_HEIGHT (int8_t*)"Height" #define NODE_NAME_PIXELFORMAT (int8_t*)"PixelFormat" #define NODE_NAME_GAIN (int8_t*)"GainRaw" #define NODE_NAME_ACQSTART (int8_t*)"AcquisitionStart" #define NODE_NAME_ACQSTOP (int8_t*)"AcquisitionStop" #define MAX_CAMERA_COUNT 20 static FACTORY_HANDLE g_hFactory = NULL ; // Factory Handle static uint32_t g_nCameraCount = 0; static uint32_t g_nTotalCameraCount = 0; int8_t g_pCameraID[MAX_CAMERA_COUNT][J_CAMERA_ID_SIZE]; CCameraControl_Jai::CCameraControl_Jai(int nViewIndex) : CCameraControl(nViewIndex) { //g_hFactory = NULL; // Factory Handle m_hCam = NULL; // Cam Handle m_hThread = NULL; m_pBayerBufferInfo = NULL; } CCameraControl_Jai::~CCameraControl_Jai(void) { Disconnect(); if (m_pBayerBufferInfo) { J_Image_Free(m_pBayerBufferInfo); m_pBayerBufferInfo = NULL; } } int CCameraControl_Jai::Connect(const CCameraControlInfo& controlInfo) { if (m_bConnected) return 0; m_nTotalIndex = controlInfo.GetIndex(); J_STATUS_TYPE retval; bool8_t bHasChanged; uint32_t nCameras; int8_t sCameraInfo[J_CAMERA_INFO_SIZE]; uint32_t size; // Open the Factory int8_t strString[10]; if (g_hFactory==NULL) { retval = J_Factory_Open(strString , &g_hFactory); if (retval!=J_ST_SUCCESS) { return 0; } // Search for cameras on all the networks retval = J_Factory_UpdateCameraList(g_hFactory, &bHasChanged); //if (retval!=J_ST_SUCCESS || bHasChanged==0) if (retval!=J_ST_SUCCESS) { return 0; } retval = J_Factory_GetNumOfCameras(g_hFactory, &nCameras); if (retval!=J_ST_SUCCESS || nCameras < 1) { return 0; } g_nTotalCameraCount = nCameras = min(nCameras, MAX_CAMERA_COUNT); // Run through the list of found cameras for (uint32_t index = 0; index < nCameras; ++index) { // Get CameraID size = sizeof(g_pCameraID[index]); retval = J_Factory_GetCameraIDByIndex(g_hFactory, index, g_pCameraID[index], &size); if (retval==J_ST_SUCCESS) { TRACE("Camera ID: %s\n", g_pCameraID[index]); } } } if (g_nTotalCameraCount<1) return 0; CString strTemp = controlInfo.GetConnectionPort(); char * str_camerafile = NULL; #ifdef X int length = WideCharToMultiByte(CP_ACP, 0, strTemp.GetBuffer(), -1, NULL, 0, NULL,NULL); str_camerafile = new char[length]; WideCharToMultiByte(CP_ACP, 0, strTemp.GetBuffer(), -1, str_camerafile, length, NULL, NULL); #else int length = strTemp.GetLength(); str_camerafile = new char[length+1]; memcpy(str_camerafile, strTemp.GetBuffer(), sizeof(char)*length); str_camerafile[length] = NULL; #endif if (str_camerafile==NULL) return FALSE; // Run through the list of found cameras for (uint32_t index = 0; index < g_nTotalCameraCount; ++index) { // Get Camera Info size = sizeof(sCameraInfo); retval = J_Factory_GetCameraInfo(g_hFactory, g_pCameraID[index], CAM_INFO_SERIALNUMBER, sCameraInfo, &size); if (retval==J_ST_SUCCESS && strcmp((char*)sCameraInfo, str_camerafile)==0) { // Open the camera retval = J_Camera_Open(g_hFactory, g_pCameraID[index], &m_hCam); if (retval!=J_ST_SUCCESS ) { retval = J_Factory_Close(g_hFactory); m_hCam = NULL; } else { break; } } } delete [] str_camerafile; if(g_hFactory==NULL || m_hCam==NULL) return 0; int64_t int64Val; // int64_t pixelFormat; // Get Width from the camera retval = J_Camera_GetValueInt64(m_hCam, NODE_NAME_WIDTH, &int64Val); if (retval != J_ST_SUCCESS) return 0; m_nWidth = (int)int64Val; // Get Height from the camera retval = J_Camera_GetValueInt64(m_hCam, NODE_NAME_HEIGHT, &int64Val); if (retval != J_ST_SUCCESS) return 0; m_nHeight = (int)int64Val; // Get pixelformat from the camera //retval = J_Camera_GetValueInt64(m_hCam, NODE_NAME_PIXELFORMAT, &pixelFormat); //if (retval != J_ST_SUCCESS) return 0; //m_nWidth = controlInfo. // open stream if (m_hThread==NULL) { retval = J_Image_OpenStream(m_hCam, 0, reinterpret_cast(this), reinterpret_cast(&CCameraControl_Jai::OnImageGrabbed), &m_hThread, (m_nWidth*m_nHeight*8)/8); if (retval != J_ST_SUCCESS) { return 0; } } // Calculate number of bits (not bytes) per pixel using macro m_nChannels = 3; m_nFrameCount = controlInfo.GetFrameCount(); m_nTotalIndex = controlInfo.GetIndex(); // set rgb gain m_nGainR = UINT(4096 * controlInfo.GetGainRed()); m_nGainG = UINT(4096 * controlInfo.GetGainGreen()); m_nGainB = UINT(4096 * controlInfo.GetGainBlue()); m_bConnected = TRUE; // alloc frame buffer CString temp; temp.Format(_T("JAI_%02d"), m_nTotalIndex); AllocateFrameBuffer(m_nWidth, m_nHeight, m_nChannels, m_nFrameCount, temp); SetTriggerMode(ModeInternal); g_nCameraCount++; return 1; } void CCameraControl_Jai::OnImageGrabbed(J_tIMAGE_INFO * pAqImageInfo) { if (pAqImageInfo==NULL || m_pCameraFrameBuffer==NULL) return; m_nFrameIndex = (++m_nFrameIndex) % m_nFrameCount; int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT; BYTE *pFrameBuffData = m_pCameraFrameBuffer->GetBufferData(nScanIndex, m_nFrameIndex); if (pFrameBuffData==NULL) return; if (m_pBayerBufferInfo==NULL) { m_pBayerBufferInfo = new J_tIMAGE_INFO; J_Image_Malloc(pAqImageInfo, m_pBayerBufferInfo); } switch(m_nFlipMode) { case FlipVertical: if (J_ST_SUCCESS !=J_Image_Flip(pAqImageInfo, J_FLIP_VERTICAL)) { return; } break; case FlipHorizontal: if (J_ST_SUCCESS != J_Image_Flip(pAqImageInfo, J_FLIP_HORIZONTAL)) { return; } break; } //J_Image_Malloc(pAqImageInfo, &bayerBufferInfo); if(J_ST_SUCCESS != J_Image_FromRawToImageEx(pAqImageInfo, m_pBayerBufferInfo, BAYER_STANDARD_MULTI, m_nGainR, m_nGainG, m_nGainB )) { return; } memcpy(pFrameBuffData, (void*)m_pBayerBufferInfo->pImageBuffer, m_curFrameImage.GetImageSize()); if (m_pCC2P) { m_pCC2P->ICC2P_FrameCaptured(m_nIndex, m_nFrameIndex, m_nFrameCount);// 2014.6.21 m_pCameraFrameBuffer Ãß°¡ } } int CCameraControl_Jai::Snap() { return 0; } int CCameraControl_Jai::Snap(int nCount) { return 0; } int CCameraControl_Jai::Snap(int nCount, UINT nWaitTime) { return 0; } int CCameraControl_Jai::Freeze() { Abort(); return 1; } int CCameraControl_Jai::Grab() { if (m_bGrabbing) return 1; // Open stream if (m_hThread==NULL) { return 0; } // Start Acquisition J_STATUS_TYPE retval = J_Camera_ExecuteCommand(m_hCam, NODE_NAME_ACQSTART); if (retval != J_ST_SUCCESS) { return 0; } m_bGrabbing = TRUE; return 1; } int CCameraControl_Jai::Abort() { if (m_bGrabbing==FALSE) return -1; J_STATUS_TYPE retval; // Stop Acquisition if (m_hCam) { retval = J_Camera_ExecuteCommand(m_hCam, NODE_NAME_ACQSTOP); if (retval != J_ST_SUCCESS) { TRACE("Could not Stop Acquisition! [%d]\n", retval); } } m_bGrabbing = FALSE; return 1; } int CCameraControl_Jai::Disconnect() { if (m_hCam==NULL) return -1; J_STATUS_TYPE retval; if (m_hCam) { // Close stream if(m_hThread) { retval = J_Image_CloseStream(m_hThread); if (retval != J_ST_SUCCESS) { TRACE("Could not close Stream! [%d]\n", retval); } m_hThread = NULL; TRACE("Closed stream\n"); } // Close camera retval = J_Camera_Close(m_hCam); if (retval != J_ST_SUCCESS) { TRACE("Could not close the camera! [%d]\n", retval); } m_hCam = NULL; TRACE("Closed camera\n"); } g_nCameraCount--; if (g_nCameraCount == 0 && g_hFactory) { // Close factory retval = J_Factory_Close(g_hFactory); if (retval != J_ST_SUCCESS) { TRACE("Could not close the factory! [%d]\n", retval); } g_hFactory = NULL; TRACE("Closed factory\n"); } return 1; } BOOL CCameraControl_Jai::SetExposureTime(double dValue) { return FALSE; } BOOL CCameraControl_Jai::GetExposureTime(double& dValue) { return FALSE; } BOOL CCameraControl_Jai::SetExposureAuto(BOOL bAuto) { return FALSE; } void CCameraControl_Jai::SetTriggerMode(int nMode, int nCount) { // same mode? if (m_nTriggerMode==nMode) return; m_nTriggerMode = nMode; J_STATUS_TYPE status; // set trigger mode NODE_HANDLE hNode =NULL; status = J_Camera_GetNodeByName(m_hCam, (int8_t*)"TriggerSelector", &hNode); if(status != J_ST_SUCCESS) { TRACE("Could not set TriggerSelector! [%d]\n", status); AfxMessageBox(_T("TriggerSelector error!")); return; } switch(m_nTriggerMode) { case ModeFreeRun: case ModeInternal: // status = J_Camera_SetValueString(m_hCam, (int8_t*)"TriggerSelector", (int8_t*)"FrameStart"); // if(status != J_ST_SUCCESS) // { // TRACE("Could not set TriggerSelector! [%d]\n", status); // return; // } // Set TriggerMode="Off" status = J_Camera_SetValueString(m_hCam, (int8_t*)"TriggerMode", (int8_t*)"Off"); if(status != J_ST_SUCCESS) { TRACE("Could not set TriggerMode! [%d]\n", status); AfxMessageBox(_T("TriggerMode error!")); return; } break; case ModeExternal: // status = J_Camera_SetValueString(m_hCam, (int8_t*)"TriggerSelector", (int8_t*)"FrameStart"); // if(status != J_ST_SUCCESS) // { // TRACE("Could not set TriggerSelector! [%d]\n", status); // return; // } // Set TriggerMode="On" status = J_Camera_SetValueString(m_hCam, (int8_t*)"TriggerMode", (int8_t*)"On"); if(status != J_ST_SUCCESS) { TRACE("Could not set TriggerMode! [%d]\n", status); AfxMessageBox(_T("TriggerMode error!")); return; } // // Set TriggerSource="Line 5" status = J_Camera_SetValueString(m_hCam, (int8_t*)"TriggerSource", (int8_t*)"Line5"); if(status != J_ST_SUCCESS) { TRACE("Could not set TriggerSource! [%d]\n", status); return; } break; } } BOOL CCameraControl_Jai::GetConnected() { return m_bConnected; } BOOL CCameraControl_Jai::GetGrabbing() { return m_bGrabbing; }