|
#include "StdAfx.h"
|
#include "SapLineGrab.h"
|
|
#define TEMP_GRAB_NUM 30
|
|
CSapLineGrab::CSapLineGrab(void)
|
{
|
m_pSapAcq = NULL;
|
m_pSapBuffers = NULL;
|
m_pXfer = NULL;
|
m_nStartFrameIdx = 0;
|
m_nEndFrameIdx = 0;
|
m_nSetBufferIdx = 0;
|
m_nGrabFrameNo = 650;
|
m_bXferCall = FALSE;
|
m_pFrameBuffer = NULL;
|
m_nBoardID = -1;
|
m_nAllocatedGrabBufSize = 0;
|
m_bGrabLive = FALSE;
|
}
|
|
CSapLineGrab::~CSapLineGrab(void)
|
{
|
Deinitialize();
|
}
|
|
BOOL CSapLineGrab::Deinitialize()
|
{
|
DestroyObjects();
|
DeleteObjects();
|
|
if (m_pFrameBuffer != NULL)
|
delete m_pFrameBuffer;
|
m_pFrameBuffer = NULL;
|
|
return TRUE;
|
}
|
|
BOOL CSapLineGrab::CreateAcq(char *camFile)
|
{
|
if (SapManager::Open() == FALSE) {
|
//g_pLog->DisplayMessage(_T("Error: SapManager::Open."));
|
return FALSE;
|
}
|
|
// Get actual server count and ensure m_nBoardID is within range
|
int nCount = SapManager::GetServerCount(SapManager::ResourceAcq);
|
if (m_nBoardID < 0 || m_nBoardID >= nCount) {
|
//g_pLog->DisplayMessage(_T("Error: Invalid Board ID. ServerCount=%d, nBoardID=%d"), nCount, m_nBoardID);
|
return FALSE;
|
}
|
|
char serverName[30];
|
SapManager::GetServerName(m_nBoardID, SapManager::ResourceAcq, serverName);
|
|
// Check resource count for the location
|
SapLocation loc(serverName, 0);
|
nCount = SapManager::GetResourceCount(loc, SapManager::ResourceAcq);
|
if (nCount < 0) {
|
//g_pLog->DisplayMessage(_T("Error: Invalid Resource Count. ResourceCount=%d, nBoardID=%d"), nCount, m_nBoardID);
|
return FALSE;
|
}
|
|
m_pSapAcq = new SapAcquisition(loc, camFile);
|
|
return TRUE;
|
}
|
|
static void XferCallbackGrab(SapXferCallbackInfo *pInfo);
|
|
BOOL CSapLineGrab::Initialize(void *pParam, int *pErrorCode,int iBoard)
|
{
|
_GRABBER_INIT_PARAM_* pParameter = (_GRABBER_INIT_PARAM_*)pParam;
|
|
if (NULL != pParameter) {
|
m_Param = *pParameter;
|
m_nBoardID = iBoard;
|
|
if (CreateAcq(m_Param.cDCFPath) == FALSE) {
|
if (pErrorCode) *pErrorCode = INITX64_FAIL_CREATEACQ;
|
//g_pLog->DisplayMessage(_T("Error: CreateAcq fail."));
|
return FALSE;
|
}
|
|
if (CreateBuffer(0) == FALSE) {
|
if (pErrorCode) *pErrorCode = INITX64_FAIL_CREATEBUFFER;
|
//g_pLog->DisplayMessage(_T("Error: CreateBuffer fail."));
|
return FALSE;
|
}
|
|
if (ActivateObjects() == FALSE) {
|
if (pErrorCode) *pErrorCode = INITX64_FAIL_CREATEXFER;
|
//g_pLog->DisplayMessage(_T("Error: ActivateObjects fail."));
|
return FALSE;
|
}
|
|
if (m_pXfer->Connect() == FALSE) {
|
//g_pLog->DisplayMessage(_T("Error: m_pXfer->Connect fail."));
|
return FALSE;
|
}
|
|
m_pXfer->SetAutoConnect(TRUE);
|
ClearBuffer();
|
}
|
else {
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
BOOL CSapLineGrab::InitializeBuffer(void *pParam)
|
{
|
_GRABBER_INIT_PARAM_ *pParameter = (_GRABBER_INIT_PARAM_ *)pParam;
|
|
BOOL bRet = TRUE;
|
if(NULL != pParameter)
|
{
|
m_Param = *pParameter;
|
|
bRet = CreateGrabBuffer(m_Param.nScanCount,m_Param.nGrabBufCount,m_Param.nFrameWidth,m_Param.nFrameHeight);
|
}
|
|
return bRet;
|
}
|
|
BOOL CSapLineGrab::CreateGrabBuffer(int nScanCount,int nBufSize, int nBufSizeX, int nBufSizeY)
|
{
|
SIZE_T tempBufferSize= nBufSize;
|
SIZE_T tempFrmCX = nBufSizeX;
|
SIZE_T tempFrmCY = nBufSizeY;
|
SIZE_T TotalBufferSize= tempBufferSize*tempFrmCX*tempFrmCY;
|
m_nAllocatedGrabBufSize = nBufSize;
|
|
if(m_pFrameBuffer != NULL)
|
delete m_pFrameBuffer;
|
m_pFrameBuffer = NULL;
|
|
m_pFrameBuffer = new CFrameBufferController;
|
|
if(TRUE == m_pFrameBuffer->CreateBuffer(m_Param.nCameraIdx,nBufSizeX ,nBufSizeY,nBufSize, nScanCount)) {
|
//g_pLog->DisplayMessage(_T("Create Buffer success!:Id[%d],Frame[%d,%d],Cnt[%d]"),m_Param.nCameraIdx,nBufSizeX,nBufSizeY,nBufSize);
|
}
|
else {
|
//g_pLog->DisplayMessage(_T("Create Buffer Fail!:Id[%d],Frame[%d,%d],Cnt[%d]"),m_Param.nCameraIdx,nBufSizeX,nBufSizeY,nBufSize);
|
return FALSE;
|
}
|
|
return TRUE;
|
}
|
|
BOOL CSapLineGrab::CreateBuffer(UINT32 uiType)
|
{
|
UINT32 nBuffFormat= 0;
|
CORHANDLE hAcq= m_pSapAcq->GetHandle();
|
|
// CorAcqGetPrm(hAcq, CORACQ_PRM_OUTPUT_FORMAT, &nBuffFormat);
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
// Process¿ë ¹öÆÛ »ý¼º
|
|
// 1. Memory Virtual Alloc
|
m_pSapBuffers = new SapBuffer(TEMP_GRAB_NUM, m_pSapAcq);
|
|
// 2. Create Transfer
|
m_pXfer = new SapAcqToBuf(m_pSapAcq, m_pSapBuffers, XferCallbackGrab, this);
|
m_pXfer->SetAutoConnect(FALSE);// ???
|
m_pXfer->GetPair(0)->SetEventType(SapXferPair::EventEndOfFrame);// ???
|
|
|
return TRUE;
|
}
|
|
BOOL CSapLineGrab::ActivateObjects()
|
{
|
// Error checks for SapAcq, SapBuffers, and Xfer creation
|
if (m_pSapAcq && !*m_pSapAcq) {
|
if (!m_pSapAcq->Create()) {
|
DestroyObjects();
|
//g_pLog->DisplayMessage(_T("Error: m_pSapAcq->Create fail."));
|
return FALSE;
|
}
|
}
|
|
if (m_pSapBuffers && !*m_pSapBuffers) {
|
if (!m_pSapBuffers->Create()) {
|
DestroyObjects();
|
//g_pLog->DisplayMessage(_T("Error: m_pSapBuffers->Create fail."));
|
return FALSE;
|
}
|
m_pSapBuffers->Clear();
|
}
|
|
if (m_pXfer && !*m_pXfer) {
|
m_pXfer->SetAutoEmpty(TRUE);
|
if (!m_pXfer->Create()) {
|
DestroyObjects();
|
//g_pLog->DisplayMessage(_T("Error: m_pXfer->Create fail."));
|
return FALSE;
|
}
|
}
|
|
return TRUE;
|
}
|
|
void CSapLineGrab::DeleteObjects()
|
{
|
if(m_pXfer) {delete m_pXfer; m_pXfer= NULL;}
|
if(m_pSapBuffers) {delete m_pSapBuffers; m_pSapBuffers= NULL;}
|
if(m_pSapAcq) {delete m_pSapAcq; m_pSapAcq= NULL;}
|
}
|
|
void CSapLineGrab::DestroyObjects()
|
{
|
GrabScanStop();
|
|
// Destroy transfer object
|
if (m_pXfer && *m_pXfer) m_pXfer->Destroy();
|
|
// Destroy buffer object
|
if (m_pSapBuffers && *m_pSapBuffers) m_pSapBuffers->Destroy();
|
|
// Destroy acquisition object
|
if (m_pSapAcq && *m_pSapAcq) m_pSapAcq->Destroy();
|
}
|
|
BOOL CSapLineGrab::ClearBuffer()
|
{
|
return TRUE;
|
}
|
|
void CSapLineGrab::My_XferCallback(SapXferCallbackInfo *pInfo)
|
{
|
SapXferPair::EventType eventType = pInfo->GetEventType();
|
m_bXferCall = TRUE;
|
|
m_cxferCall++;
|
|
if((eventType & SapXferPair::EventEndOfFrame) == SapXferPair::EventEndOfFrame)
|
{
|
m_nSetBufferIdx++; //index
|
|
if(m_bGrabLive == TRUE)
|
m_nSetBufferIdx = 0;
|
|
if (m_nEndFrameIdx > g_pStatus->GetGrabFrameCount(m_nScanIndex))
|
{
|
GrabScanStop();
|
g_pStatus->SetGrabEnd(m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d Over Grab Count : Stop Grab[%d][%d] - %d"), m_Param.nBoardIdx, m_nScanIndex, m_nEndFrameIdx,g_pStatus->GetGrabFrameCount(m_nScanIndex));
|
return;
|
}
|
|
if (m_nSetBufferIdx > m_pFrameBuffer->GetFrameCount())
|
{
|
GrabScanStop();
|
g_pStatus->SetGrabEnd(m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d Over Grab Buffer Stop Grab[%d][%d] - %d"), m_Param.nBoardIdx, m_nScanIndex, m_nEndFrameIdx,m_pFrameBuffer->GetFrameCount());
|
return;
|
}
|
|
LPBYTE pBuffer = m_pFrameBuffer->GetFrameBuferHeader(m_nScanIndex,m_nSetBufferIdx);
|
if(pBuffer == NULL)
|
{
|
GrabScanStop();
|
g_pStatus->SetGrabEnd(m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d Over Grab Buffer Stop Grab[%d][%d] - %d"), m_Param.nBoardIdx, m_nScanIndex, m_nEndFrameIdx,m_pFrameBuffer->GetFrameCount());
|
return;
|
}
|
|
LPBYTE lpBuffer = GetGrabFrameHeader(m_nSetBufferIdx);
|
if(lpBuffer == NULL)
|
return;
|
|
memcpy(pBuffer, lpBuffer, m_Param.nFrameWidth * m_Param.nFrameHeight);
|
|
SetInsertFrame(m_nScanIndex,m_nSetBufferIdx);
|
|
if(m_bGrabLive == FALSE)
|
m_nEndFrameIdx++; //Count
|
}
|
}
|
|
BOOL CSapLineGrab::IsGrabbing()
|
{
|
if(m_pXfer)
|
return m_pXfer->IsGrabbing();
|
|
return FALSE;
|
}
|
|
void XferCallbackGrab(SapXferCallbackInfo *pInfo)
|
{
|
CSapLineGrab *pGrab= (CSapLineGrab*) pInfo->GetContext();
|
pGrab->My_XferCallback(pInfo);
|
}
|
|
|
LPBYTE CSapLineGrab::GetGrabFrameHeader(int nFrameNo, BOOL* bRet)
|
{
|
// À̹ÌÁö¸¦ ÂïÀº ÀûÀÌ ¾ø´Â °æ¿ì´Â ¹öÆÛ¸¦ ¸®ÅÏÇÑ´Ù.
|
LPBYTE pBuff= NULL;
|
if(nFrameNo > m_nSetBufferIdx) return NULL;
|
|
nFrameNo= nFrameNo%TEMP_GRAB_NUM;
|
m_pSapBuffers->GetAddress(nFrameNo, (void**)&pBuff);
|
|
return pBuff;
|
|
/*
|
LPBYTE lpBuffer = NULL;
|
if (m_nStartFrameIdx == 0 && m_nEndFrameIdx == 0)
|
{
|
if (bRet)
|
*bRet = FALSE;
|
if (nFrameNo >= 0 && nFrameNo < GetFrameCount())
|
{
|
//lpBuffer= m_pData+ GetFrameSize()*nFrameNo;
|
m_pSapBuffers->GetAddress(nFrameNo, (void**)&lpBuffer);
|
//lpBuffer= m_pData;
|
}
|
else
|
lpBuffer = NULL;
|
}
|
else // À̹ÌÁö¸¦ ÂïÀº °æ¿ì´Â Frame No¸¦ È®ÀÎÇÏ¿© ¹öÆÛ¸¦ ¸®ÅÏÇÑ´Ù.
|
{
|
if (bRet)
|
*bRet = TRUE;
|
//if (nFrameNo >= m_nStartFrameIdx && nFrameNo < m_nEndFrameIdx)
|
if (nFrameNo >= 0 && nFrameNo < GetFrameCount())
|
{
|
//nFrameNo= nFrameNo%GetFrameCount();
|
nFrameNo= nFrameNo%TEMP_GRAB_NUM;
|
|
//lpBuffer= m_pData+ GetFrameSize()*nFrameNo;
|
m_pSapBuffers->GetAddress(nFrameNo, (void**)&lpBuffer);
|
//lpBuffer= m_pData+ nFrameNo*GetFrameWidth()*GetFrameHeight();
|
}
|
else
|
lpBuffer = NULL;
|
}
|
|
return lpBuffer;
|
*/
|
}
|
|
void CSapLineGrab::SimulationGrab(int iScan)
|
{
|
if(m_pFrameBuffer == NULL)
|
return;
|
|
int nFrameCnt = m_pFrameBuffer->GetFrameCount();
|
|
m_nEndFrameIdx = nFrameCnt;
|
m_nSetBufferIdx = nFrameCnt -1;
|
|
for(int i=0;i<nFrameCnt;i++)
|
{
|
SetInsertFrame(iScan,i);
|
}
|
}
|
|
BOOL CSapLineGrab::SetInsertFrame(int iScan,int iFrame)
|
{
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
|
stFrameIndex stFrame(iScan,iFrame);
|
m_dqCallbackFrame.push_back(stFrame);
|
MyLock.Unlock();
|
|
return TRUE;
|
}
|
|
int CSapLineGrab::GetGrabFrameCount()
|
{
|
return (int)m_dqCallbackFrame.size();
|
}
|
|
void CSapLineGrab::ClearGrabIdx()
|
{
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
m_dqCallbackFrame.clear();
|
MyLock.Unlock();
|
}
|
|
BOOL CSapLineGrab::IsHasGrabFrame()
|
{
|
return !m_dqCallbackFrame.empty();
|
}
|
|
BOOL CSapLineGrab::FindGrabIdx(int iScan,int iFrame)
|
{
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
|
BOOL bRet = FALSE;
|
stFrameIndex stFrame;
|
for(dqGrabIdxIt it=m_dqCallbackFrame.begin();it!=m_dqCallbackFrame.end();it++)
|
{
|
stFrame = *it;
|
|
if(stFrame.nScanIdx == iScan)
|
{
|
if(stFrame.nFrameIdx < iFrame)
|
bRet = TRUE;
|
}
|
}
|
MyLock.Unlock();
|
|
return bRet;
|
}
|
|
stFrameIndex CSapLineGrab::GetGrabFrameNoRemove()
|
{
|
stFrameIndex stPop(-1, -1);
|
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
if(IsHasGrabFrame() == FALSE)
|
{
|
MyLock.Unlock();
|
return stPop;
|
}
|
|
stPop = m_dqCallbackFrame.front();
|
|
TRACE("Pop Frame Lock[%d]\r\n", stPop.nFrameIdx);
|
MyLock.Unlock();
|
return stPop;
|
}
|
|
stFrameIndex CSapLineGrab::GetGrabFrame()
|
{
|
stFrameIndex stPop(-1, -1);
|
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
if(IsHasGrabFrame() == FALSE)
|
{
|
MyLock.Unlock();
|
return stPop;
|
}
|
|
stPop = m_dqCallbackFrame.front();
|
m_dqCallbackFrame.pop_front();
|
|
TRACE("Pop Frame Lock[%d]\r\n", stPop.nFrameIdx);
|
MyLock.Unlock();
|
return stPop;
|
}
|
|
////////////// Acquisition..
|
|
BOOL CSapLineGrab::GrabScanStop()
|
{
|
BOOL bRet = TRUE;
|
|
BOOL bGrabbing = FALSE;
|
if (m_pXfer==NULL) return FALSE;
|
|
bGrabbing = m_pXfer->IsGrabbing();
|
|
if (bGrabbing == FALSE)
|
{
|
// Snap ¸í·ÉÀÌ ¿ÔÀ¸³ª Callback ÇÔ¼ö°¡ È£ÃâµÇÁö ¾ÊÀº °æ¿ì Abort() È£Ãâ -> Callback ÇÔ¼ö°¡ È£ÃâµÇÁö ¾ÊÀ¸¸é Freeze()·Î´Â Snap Á¾·á°¡ ¾ÈµÈ´Ù.
|
g_pLog->DisplayMessage(_T("Stop Acq Case 1-1 Not Grabbing"));
|
if(m_bSnapStart == TRUE && m_bXferCall == FALSE)
|
{
|
//g_pLog->DisplayMessage(TRUE, "Stop Acq Case 1-2");
|
bRet= m_pXfer->Abort();
|
}
|
else
|
{
|
bRet = FALSE;
|
//g_pLog->DisplayMessage(TRUE, "Stop Acq Case 1-3");
|
}
|
}
|
else
|
{
|
// Callback ÇÔ¼ö°¡ È£ÃâµÈ °æ¿ì´Â Freeze() È£Ãâ
|
//g_pLog->DisplayMessage(TRUE, "Stop Acq Case 2-1");
|
if(m_bXferCall)
|
{
|
//g_pLog->DisplayMessage(TRUE, "Stop Acq Case 2-2");
|
bRet = m_pXfer->Freeze();
|
if(! m_pXfer->Wait(10))
|
{
|
g_pLog->DisplayMessage(_T("WAIT FAIL"));
|
|
bRet= m_pXfer->Abort();
|
|
if(bRet)
|
{
|
g_pLog->DisplayMessage(_T("Abort SUC"));
|
}else
|
g_pLog->DisplayMessage(_T("Abort Fail"));
|
}else
|
{
|
g_pLog->DisplayMessage(_T("WAIT SUCC"));
|
}
|
//bRet = m_pXfer->Abort();
|
//Sleep(200);
|
}
|
else
|
{
|
//g_pLog->DisplayMessage(TRUE, "Stop Acq Case 2-3");
|
bRet= m_pXfer->Abort();
|
}
|
}
|
|
m_bSnapStart = FALSE;
|
|
return bRet;
|
}
|
|
BOOL CSapLineGrab::GrabLiveStart(int nExposure)
|
{
|
if (IsGrabbing())
|
{
|
g_pLog->DisplayMessage(_T("Start Live Acq : IsGrabbing -> Stop Acq %d"), m_nEndFrameIdx);
|
GrabScanStop();
|
Sleep(100);
|
}
|
|
m_nStartFrameIdx = 0;
|
m_nEndFrameIdx = 0;
|
m_nSetBufferIdx = -1;
|
m_nScanIndex = 0;
|
m_bGrabLive = TRUE;
|
|
int nFrameCount = m_Param.nGrabBufCount / m_Param.nGrabBufSize;
|
if (m_Param.nGrabBufCount % m_Param.nGrabBufSize > 0)
|
nFrameCount++;
|
nFrameCount += 4;
|
|
m_pSapAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_FRAME_COUNT, nFrameCount);
|
BOOL b= m_pXfer->Grab();
|
|
g_pLog->DisplayMessage(_T("Start Live Acq - %d,%d"),b,nFrameCount);
|
|
return TRUE;
|
}
|
|
BOOL CSapLineGrab::GrabScanStart(int iScan, BOOL bFreeRun, int nPeriod, int nExposure, BOOL bAuto)
|
{
|
if (m_pXfer->IsGrabbing())
|
{
|
g_pLog->DisplayMessage(_T("Start Acq : IsGrabbing -> Stop Acq %d"), m_nEndFrameIdx);
|
GrabScanStop();
|
Sleep(100);
|
}
|
ClearBuffer();
|
|
m_pSapBuffers->ResetIndex();
|
|
m_nStartFrameIdx = 0;
|
m_nEndFrameIdx = 0;
|
g_pLog->DisplayMessage(_T("Start Acq : %d"), iScan);
|
|
m_bGrabLive = FALSE;
|
m_cxferCall= 0;
|
m_nSetBufferIdx = -1;
|
m_bXferCall = FALSE;
|
m_nScanIndex = iScan;
|
|
int nFrameCount = m_pFrameBuffer->GetFrameCount()+ 4;
|
|
if(bAuto == TRUE)
|
{
|
if (bFreeRun == FALSE)
|
{
|
m_pSapAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, FALSE);
|
m_pSapAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_FRAME_COUNT, nFrameCount);
|
}
|
else
|
{
|
m_pSapAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, FALSE);
|
m_pSapAcq->SetParameter(CORACQ_PRM_EXT_TRIGGER_FRAME_COUNT, nFrameCount);
|
}
|
|
BOOL b= m_pXfer->Grab();
|
}
|
else
|
{
|
SimulationGrab(iScan);
|
}
|
|
return TRUE;
|
}
|
|
int CSapLineGrab::IsAcqFrame(int nFrameNo, int nThreadIdx)
|
{
|
return m_nSetBufferIdx - nFrameNo;
|
}
|
|
LPBYTE CSapLineGrab::GetFrameHeader(int iScan,int nFrameNo, BOOL* bRet)
|
{
|
if(m_pFrameBuffer == NULL)
|
return NULL;
|
|
return m_pFrameBuffer->GetFrameBuferHeader(iScan,nFrameNo);
|
}
|
|
LPBYTE CSapLineGrab::GetFrameHeaderLine(int iScan,int nLine, BOOL* bSuccess)
|
{
|
if(m_pFrameBuffer == NULL)
|
return NULL;
|
|
return m_pFrameBuffer->GetFrameHeaderLine(iScan,nLine);
|
}
|
|
BOOL CSapLineGrab::GetSmallImage(int iScan,LPBYTE lpIn, int nXStart, int nYStart, int nXSize, int nYSize, BOOL bMustMapping)
|
{
|
int nBufSizeX = m_Param.nFrameWidth;
|
int nBufSizeY = m_Param.nFrameHeight;
|
|
if(lpIn == NULL)
|
return FALSE;
|
if (nXStart < 0 || nYStart < 0)
|
return FALSE;
|
if (nXStart + nXSize > nBufSizeX)
|
return FALSE;
|
if (nYStart + nYSize > nBufSizeY* GetEndFrameIdx())
|
return FALSE;
|
|
LPBYTE lpHeadAddr = GetFrameHeaderLine(iScan,nYStart);
|
if (!lpHeadAddr)
|
{
|
return FALSE;
|
}
|
|
for (int i = 0; i < nYSize; i++)
|
{
|
memcpy(lpIn + i * nXSize, lpHeadAddr + i * nBufSizeX + nXStart, nXSize);
|
}
|
|
/*
|
// ½ÃÀÛ ÇÁ·¹ÀÓ ¹øÈ£¿Í ³¡ ÇÁ·¹ÀÓ ¹øÈ£.
|
int nStartFrameNo = nYStart / nBufSizeY;
|
int nEndFrameNo = (nYStart + nYSize) / nBufSizeY;
|
LPBYTE lpHeadAddr = GetFrameHeader(iScan,nStartFrameNo);
|
if (!lpHeadAddr)
|
{
|
return FALSE;
|
}
|
LPBYTE lpStart = lpHeadAddr + (nYStart % nBufSizeY) * nBufSizeX + nXStart;
|
|
int nLine = 0;
|
for (int i = 0; i < nYSize; i++)
|
{
|
memcpy(lpIn + i * nXSize, lpStart + nLine * nBufSizeX, nXSize);
|
if (nStartFrameNo <= nEndFrameNo && (nYStart + i + 1) % nBufSizeY == 0)
|
{
|
// À̹ÌÁö¸¦ µû³»¾ßÇÏ´Â ¿µ¿ªÀÌ MemFrameNo °æ°è¿¡ °ÉÃÄÀÖ´Â °æ¿ì ó¸®.
|
lpHeadAddr = GetFrameHeader(iScan,++nStartFrameNo);
|
lpStart = lpHeadAddr + nXStart;
|
nLine = 0;
|
}
|
else
|
nLine++;
|
}
|
*/
|
|
return TRUE;
|
}
|
|
CORSTATUS CSapLineGrab::DisplayStatus( char *functionName, CORSTATUS status)
|
{
|
char statusMsg[ 256];
|
CORSTATUS msgStatus = CORSTATUS_OK;
|
|
if( status != CORSTATUS_OK)
|
{
|
msgStatus = CorManGetStatusText( status, statusMsg, 256, NULL, 0);
|
if( msgStatus == CORSTATUS_OK)
|
{
|
g_pLog->DisplayMessage(_T("1Error: Function [%s] (module= 0x%lX status= 0x%lX info= 0x%lX) <%s>"),functionName, CORSTATUS_MODULE( status), CORSTATUS_ID( status), CORSTATUS_INFO( status), statusMsg);
|
}
|
else
|
{
|
g_pLog->DisplayMessage(_T("2Error: Function [%s] (module= 0x%lX status= 0x%lX info= 0x%lX)"),functionName, CORSTATUS_MODULE( status), CORSTATUS_ID( status), CORSTATUS_INFO( status));
|
}
|
|
return status;
|
}
|
|
return( status);
|
}
|
BOOL CSapLineGrab::SetScanDirection(unsigned int nDirection)
|
{
|
// unsigned int dir;
|
// CorAcqGetCamIoControl(m_pSapAcq->GetHandle(), "CC3", &dir);
|
// if(dir != nDirection)
|
{
|
DisplayStatus("CorAcqSetCamIoControl", CorAcqSetCamIoControl(m_pSapAcq->GetHandle(), "CC3", nDirection));
|
// return FALSE;
|
}
|
|
//DisplayStatus("CorBufferFree", CorBufferFree(m_hBuffer[i]))
|
return TRUE;
|
}
|
|
void CSapLineGrab::WiatXfer(int tMS)
|
{
|
m_pXfer->Wait(tMS);
|
}
|