#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) { SapManager::Open(); int nCount = SapManager::GetServerCount(SapManager::ResourceAcq); char serverName[30]; SapManager::GetServerName(m_nBoardID, SapManager::ResourceAcq, serverName); g_pLog->DisplayMessage(_T("CreateAcq!:Id[%d], m_nBoardID[%d], nCount[%d], serverName[%s]."), m_Param.nCameraIdx, m_nBoardID, nCount, serverName); SapLocation loc(serverName, 0); if (SapManager::GetResourceCount(loc, SapManager::ResourceAcq) <= 0 || nCount <= 0) { g_pLog->DisplayMessage(_T("CreateAcq!:Id[%d], m_nBoardID[%d], Failed to get ResourceAcq."), m_Param.nCameraIdx, 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; g_pLog->DisplayMessage(_T("CSapLineGrab::Initialize! Id[%d], m_nBoardID[%d], _GRABBER_INIT_PARAM_[%d]."), m_Param.nCameraIdx, m_nBoardID, pParameter); if(NULL != pParameter) { m_Param = *pParameter; m_nBoardID = iBoard; if(CreateAcq(m_Param.cDCFPath) == FALSE) return INITX64_FAIL_CREATEACQ; if(CreateBuffer(0) == FALSE) return INITX64_FAIL_CREATEBUFFER; if(ActivateObjects() == FALSE) return INITX64_FAIL_CREATEXFER;// ??? 货肺款 define 急攫 鞘夸 m_pXfer->Connect(); 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() { if(m_pSapAcq && !*m_pSapAcq)// && !m_pSapAcq->Create()) { if(!m_pSapAcq->Create()) {DestroyObjects(); return FALSE;} } if(m_pSapBuffers && !* m_pSapBuffers) { if(!m_pSapBuffers->Create()) { DestroyObjects(); return FALSE; } m_pSapBuffers->Clear();// ??? } if(m_pXfer && !*m_pXfer) { m_pXfer->SetAutoEmpty(TRUE);// ??? if(!m_pXfer->Create()) { DestroyObjects(); 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; int nCameraIdx = m_Param.nCameraIdx; if (m_nEndFrameIdx > g_pStatus->GetGrabFrameCount(nCameraIdx, m_nScanIndex)) { GrabScanStop(); g_pStatus->SetGrabEnd(nCameraIdx, 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(nCameraIdx, m_nScanIndex)); return; } if (m_nSetBufferIdx > m_pFrameBuffer->GetFrameCount()) { GrabScanStop(); g_pStatus->SetGrabEnd(nCameraIdx, 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(nCameraIdx, 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;iIsGrabbing(); 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); }