#include "StdAfx.h"
|
#include "CameraControl_Sapera.h"
|
#include "SapClassBasic.h"
|
#include "SapAcquisition.h"
|
#include "CHCameraControls/CameraBuffer.h"
|
|
CCameraControl_Sapera::CCameraControl_Sapera(int nIndex) : CCameraControl(nIndex)
|
{
|
m_pAcq = NULL;
|
m_pBuffers = NULL;
|
m_pXfer = NULL;
|
m_nSnapFrameCount = 0;
|
|
}
|
|
CCameraControl_Sapera::~CCameraControl_Sapera()
|
{
|
Disconnect();
|
|
DeleteObjects();
|
}
|
|
BOOL CCameraControl_Sapera::GetGrabbing()
|
{
|
if (m_pXfer && *m_pXfer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
return m_bGrabbing;
|
}
|
|
return FALSE;
|
}
|
|
int CCameraControl_Sapera::GetFrameIndex()
|
{
|
if (m_pBuffers && *m_pBuffers)
|
{
|
m_nFrameIndex = m_pBuffers->GetIndex();
|
|
return m_nFrameIndex;
|
}
|
|
return -1;
|
}
|
|
int CCameraControl_Sapera::Connect(const CCameraControlInfo& controlInfo)
|
{
|
if (m_bConnected) return 0;
|
|
m_nTotalIndex = controlInfo.GetIndex();
|
m_nGrabCount = controlInfo.GetGrabCount();
|
m_nFrameCount = controlInfo.GetFrameCount();
|
|
// m_nGantryIndex = controlInfo.nGantryIndex;
|
// m_nHeaderIndex = controlInfo.nHeaderIndex;
|
|
SapLocation loc(controlInfo.GetGrabberIndex(), controlInfo.GetChannelIndex());
|
|
CString strTemp = controlInfo.GetConnectionPort();
|
|
if (!AllocateObjects(loc, strTemp, m_nGrabCount))
|
{
|
m_bConnected = FALSE;
|
return -1;
|
}
|
|
if (!CreateObjects())
|
{
|
m_bConnected = FALSE;
|
return -2;
|
}
|
|
// Get image info
|
m_nWidth = m_pBuffers->GetWidth();
|
m_nWidthStep = m_pBuffers->GetPitch();
|
m_nHeight = m_pBuffers->GetHeight();
|
m_nDepth = m_pBuffers->GetPixelDepth();
|
m_nChannels = m_pBuffers->GetBytesPerPixel();
|
|
// alloc frame buffer
|
CString temp = _T("");
|
temp.Format(_T("Sapera_%02d"), m_nTotalIndex);
|
AllocateFrameBuffer(m_nWidth, m_nHeight, m_nChannels, m_nFrameCount, temp);
|
|
SetTriggerMode(ModeInternal);
|
|
m_bConnected = TRUE;
|
|
return 1;
|
}
|
|
int CCameraControl_Sapera::Grab()
|
{
|
if (m_pXfer && *m_pXfer && m_pCameraFrameBuffer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (m_bGrabbing) return -1;
|
|
m_nFrameIndex = -1;
|
m_nSnapFrameCount = m_nFrameCount;
|
|
// set shared image info
|
int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT;
|
CCameraBufferInfo *pInfo = m_pCameraFrameBuffer->GetBufferInfo(nScanIndex);
|
if (pInfo)
|
{
|
pInfo->sCameraIndex = m_nIndex; // mch 20160823
|
pInfo->sScanIndex = m_nScanIndex;
|
pInfo->nImageCount = 0;
|
}
|
|
m_pXfer->Init(TRUE);
|
m_pBuffers->Clear();
|
m_pBuffers->ResetIndex();
|
|
if (!m_pXfer->Grab())
|
{
|
return -2;
|
}
|
|
m_bGrabbing = TRUE;
|
|
return 1;
|
}
|
|
return 0;
|
}
|
|
int CCameraControl_Sapera::Snap()
|
{
|
if (m_pXfer && *m_pXfer && m_pCameraFrameBuffer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (m_bGrabbing) return -1;
|
|
m_nFrameIndex = -1;
|
m_nSnapFrameCount = m_nFrameCount;
|
|
// set shared image info
|
int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT;
|
CCameraBufferInfo *pInfo = m_pCameraFrameBuffer->GetBufferInfo(nScanIndex);
|
if (pInfo)
|
{
|
pInfo->sCameraIndex = m_nIndex; // mch 20160823
|
pInfo->sScanIndex = m_nScanIndex;
|
pInfo->nImageCount = 0;
|
}
|
|
m_pXfer->Init(TRUE);
|
m_pBuffers->Clear();
|
m_pBuffers->ResetIndex();
|
|
if (!m_pXfer->Snap())
|
{
|
return -2;
|
}
|
|
m_bGrabbing = TRUE;
|
|
return 1;
|
}
|
|
return 0;
|
}
|
|
int CCameraControl_Sapera::Snap(int nCount)
|
{
|
if (m_pXfer && *m_pXfer && m_pCameraFrameBuffer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (m_bGrabbing) return -1;
|
|
m_nFrameIndex = -1;
|
m_nSnapFrameCount = nCount;
|
|
// set shared image info
|
int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT;
|
CCameraBufferInfo *pInfo = m_pCameraFrameBuffer->GetBufferInfo(nScanIndex);
|
if (pInfo)
|
{
|
pInfo->sCameraIndex = m_nIndex; // mch 20160823
|
pInfo->sScanIndex = m_nScanIndex;
|
pInfo->nImageCount = 0;
|
}
|
|
m_pXfer->Init(TRUE);
|
m_pBuffers->Clear();
|
m_pBuffers->ResetIndex();
|
|
if (!m_pXfer->Snap(nCount))
|
{
|
return -2;
|
}
|
|
m_bGrabbing = TRUE;
|
|
return 1;
|
}
|
|
return 0;
|
}
|
|
int CCameraControl_Sapera::Snap(int nCount, UINT nWaitTime)
|
{
|
if (m_pXfer && *m_pXfer && m_pCameraFrameBuffer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (m_bGrabbing) return -1;
|
|
m_nFrameIndex = -1;
|
m_nSnapFrameCount = nCount;
|
|
// set shared image info
|
int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT;
|
CCameraBufferInfo *pInfo = m_pCameraFrameBuffer->GetBufferInfo(nScanIndex);
|
if (pInfo)
|
{
|
pInfo->sCameraIndex = m_nIndex; // mch 20160823
|
pInfo->sScanIndex = m_nScanIndex;
|
pInfo->nImageCount = 0;
|
}
|
|
m_pXfer->Init(TRUE);
|
m_pBuffers->Clear();
|
m_pBuffers->ResetIndex();
|
|
if (!m_pXfer->Snap(nCount))
|
{
|
return -2;
|
}
|
|
m_pXfer->Wait(nWaitTime);
|
|
m_pXfer->Abort();
|
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
return 1;
|
}
|
|
return 0;
|
}
|
|
int CCameraControl_Sapera::Freeze()
|
{
|
int nReturn = 0;
|
|
if (m_pXfer && *m_pXfer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (!m_bGrabbing) return 1;
|
|
nReturn = m_pXfer->Freeze();
|
//#3477_210729_LYW_FrameLost_Çö»ó ÃÊÄ¡_ADD_START
|
m_pXfer->Wait(100);
|
//#3477_210729_LYW_FrameLost_Çö»ó ÃÊÄ¡_ADD_END
|
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
}
|
|
return nReturn;
|
}
|
|
int CCameraControl_Sapera::Abort()
|
{
|
if (m_pXfer && *m_pXfer)
|
{
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
|
if (!m_bGrabbing) return -1;
|
|
m_pXfer->Abort();
|
|
m_bGrabbing = m_pXfer->IsGrabbing();
|
}
|
|
return 1;
|
}
|
|
int CCameraControl_Sapera::Disconnect()
|
{
|
Abort();
|
|
DestoryObjects();
|
|
DeleteObjects();
|
|
return 1;
|
}
|
|
BOOL CCameraControl_Sapera::AllocateObjects(const SapLocation& loc, CString strCamfile, int nSnapCount)
|
{
|
char *str_value = NULL;
|
|
#ifdef _UNICODE
|
int length = WideCharToMultiByte(CP_ACP, 0, strCamfile.GetBuffer(), -1, NULL, 0, NULL,NULL);
|
str_value = new char[length];
|
WideCharToMultiByte(CP_ACP, 0, strCamfile.GetBuffer(), -1, str_value, length, NULL, NULL);
|
#else
|
int length = strCamfile.GetLength();
|
str_value = new char[length+1];
|
memcpy(str_value, strCamfile.GetBuffer(), sizeof(char)*length);
|
str_value[length] = NULL;
|
#endif
|
|
if (str_value==NULL)
|
{
|
return FALSE;
|
}
|
|
m_pAcq = new SapAcquisition(loc, str_value);
|
m_pBuffers = new SapBuffer(nSnapCount, m_pAcq);
|
m_pXfer = new SapAcqToBuf(m_pAcq, m_pBuffers, XferCallbackFunc, this);
|
|
delete [] str_value;
|
|
return TRUE;
|
}
|
|
BOOL CCameraControl_Sapera::CreateObjects()
|
{
|
// Create acquisition object
|
if (m_pAcq && !*m_pAcq && !m_pAcq->Create())
|
{
|
return FALSE;
|
}
|
|
// Create buffer object
|
if (m_pBuffers && !*m_pBuffers && !m_pBuffers->Create())
|
{
|
return FALSE;
|
}
|
|
// Create transfer object
|
if (m_pXfer && !*m_pXfer && !m_pXfer->Create())
|
{
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
void CCameraControl_Sapera::DestoryObjects()
|
{
|
// Stop acquisition
|
if (m_bGrabbing) Abort();
|
|
// Destroy transfer object
|
if (m_pXfer && *m_pXfer)
|
{
|
m_pXfer->Destroy();
|
}
|
|
// Destroy buffer object
|
if (m_pBuffers && *m_pBuffers)
|
{
|
m_pBuffers->Destroy();
|
}
|
|
// Destroy acquisition object
|
if (m_pAcq && *m_pAcq)
|
{
|
m_pAcq->Destroy();
|
}
|
}
|
|
void CCameraControl_Sapera::DeleteObjects()
|
{
|
if (m_pXfer)
|
{
|
delete m_pXfer;
|
m_pXfer = NULL;
|
}
|
|
if (m_pBuffers)
|
{
|
delete m_pBuffers;
|
m_pBuffers = NULL;
|
}
|
|
if (m_pAcq)
|
{
|
delete m_pAcq;
|
m_pAcq = NULL;
|
}
|
|
}
|
|
void CCameraControl_Sapera::XferCallbackFunc(SapXferCallbackInfo *pInfo)
|
{
|
if (pInfo->IsTrash())
|
{
|
return;
|
}
|
|
CCameraControl_Sapera *pThis= (CCameraControl_Sapera *) pInfo->GetContext();
|
pThis->XferCallback(pInfo);
|
}
|
|
|
void CCameraControl_Sapera::XferCallback(SapXferCallbackInfo *pInfo)
|
{
|
if (!m_pBuffers || !m_pCameraFrameBuffer) return;
|
|
// set frame index
|
m_nFrameIndex = (++m_nFrameIndex) % m_nFrameCount;
|
int nScanIndex = m_nScanIndex % MAX_BUFFER_SCAN_COUNT;
|
|
// get buffer ptr
|
CCameraBufferInfo *pFrameBuffInfo = m_pCameraFrameBuffer->GetBufferInfo(nScanIndex);
|
BYTE *pFrameBuffData = m_pCameraFrameBuffer->GetBufferData(nScanIndex, m_nFrameIndex);
|
|
BYTE *pBuffData = NULL;
|
if (pFrameBuffData && pFrameBuffInfo && m_pBuffers->GetAddress((void**)&pBuffData))
|
{
|
if (m_nFlipMode!=FlipNone)
|
{
|
if (ImageFlip(m_nFlipMode, pBuffData, pFrameBuffData, m_nWidth, m_nHeight, m_nChannels)==FALSE)
|
{
|
memcpy(pFrameBuffData, pBuffData, m_curFrameImage.GetImageSize()); // ½ÇÆÐ½Ã, ±×³É º¹»ç
|
}
|
}
|
else
|
{
|
memcpy(pFrameBuffData, pBuffData, m_curFrameImage.GetImageSize());
|
}
|
|
// set image info
|
pFrameBuffInfo->sCameraIndex = m_nIndex; // mch 20160823
|
pFrameBuffInfo->sScanIndex = m_nScanIndex;
|
pFrameBuffInfo->nImageCount = m_nFrameIndex + 1;
|
|
m_pCameraFrameBuffer->UnlockMemory(nScanIndex);
|
m_pBuffers->ReleaseAddress((void*)pBuffData);
|
}
|
|
if (m_pCC2P)
|
{
|
m_pCC2P->ICC2P_FrameCaptured(m_nIndex, m_nFrameIndex, m_nFrameCount);
|
|
if ((m_nSnapFrameCount - 1) == m_nFrameIndex)
|
{
|
m_pCC2P->ICC2P_SnapCompleted(m_nIndex, m_nSnapFrameCount);
|
}
|
}
|
}
|
|
|
void CCameraControl_Sapera::SetTriggerMode(int nMode, int nCount)
|
{
|
m_nTriggerMode = nMode;
|
|
if (m_pAcq && *m_pAcq)
|
{
|
switch(m_nTriggerMode)
|
{
|
case ModeFreeRun:
|
m_pAcq->SetParameter(CORACQ_PRM_INT_FRAME_TRIGGER_ENABLE, 0);
|
m_pAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_ENABLE, CORACQ_VAL_EXT_TRIGGER_OFF);
|
break;
|
|
case ModeInternal:
|
m_pAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_ENABLE, CORACQ_VAL_EXT_TRIGGER_OFF);
|
m_pAcq->SetParameter(CORACQ_PRM_INT_FRAME_TRIGGER_ENABLE, 1);
|
break;
|
|
case ModeExternal:
|
m_pAcq->SetParameter(CORACQ_PRM_INT_FRAME_TRIGGER_ENABLE, 0);
|
m_pAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_ENABLE, CORACQ_VAL_EXT_TRIGGER_ON);
|
// m_pAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_FRAME_COUNT, nCount);
|
break;
|
}
|
}
|
}
|
|
|
void CCameraControl_Sapera::SetTriggerSource(int nSource)
|
{
|
m_nTriggerSource = nSource;
|
|
if (m_pAcq && *m_pAcq)
|
{
|
m_pAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_SOURCE, m_nTriggerSource);
|
}
|
}
|
|
BOOL CCameraControl_Sapera::SetExposureTime(double dValue)
|
{
|
if (m_nTriggerMode==ModeFreeRun) return FALSE;
|
|
if (m_pAcq && *m_pAcq)
|
{
|
return m_pAcq->SetParameter(CORACQ_PRM_TIME_INTEGRATE_DURATION, (UINT32)dValue); // us
|
}
|
|
return FALSE;
|
}
|
|
BOOL CCameraControl_Sapera::SetExposureAuto(BOOL bAuto)
|
{
|
return FALSE;
|
}
|
|
|
BOOL CCameraControl_Sapera::GetExposureTime(double& dValue)
|
{
|
if (m_nTriggerMode==ModeFreeRun) return FALSE;
|
|
if (m_pAcq && *m_pAcq)
|
{
|
UINT nTime = 0;
|
BOOL bResult = m_pAcq->GetParameter(CORACQ_PRM_TIME_INTEGRATE_DURATION, &nTime); // us
|
dValue = (double)nTime;
|
return TRUE;
|
}
|
|
return FALSE;
|
}
|