#include "StdAfx.h"
|
#include "RadientControl.h"
|
#include "FrameBufferController.h"
|
|
MIL_ID g_MilApplication_Radient = M_NULL; /* Application identifier. */
|
int g_nGrabberCount_Radient = 0; // grabber count
|
|
// 调试
|
#define GRAB_DEBUG_ENABLE 0 // 置 0 关闭所有调试输出与转存
|
#define GRAB_DUMP_DIR _T("D:\\Dump") // 输出目录
|
|
//==========================================================================================================================================================================
|
// Grabber Radient
|
CGrabberRadient::CGrabberRadient()
|
{
|
m_nEndFrameIdx = m_nStartFrameIdx = 0;
|
m_nSetBufferIdx = 0;
|
m_nScanIndex = 0;
|
m_nAllocatedGrabBufSize = 0;
|
m_isGrabbing = FALSE;
|
m_isLiveGrab = FALSE;
|
m_pFrameBuffer = NULL;
|
|
bUART_Connect[0] = FALSE;
|
bUART_Connect[1] = FALSE;
|
}
|
|
CGrabberRadient::~CGrabberRadient()
|
{
|
if (m_pFrameBuffer != NULL) {
|
delete m_pFrameBuffer;
|
m_pFrameBuffer = NULL;
|
}
|
}
|
|
BOOL CGrabberRadient::Initialize(void *pParam, int *pErrorCode,int iBoard)
|
{
|
_GRABBER_INIT_PARAM_ *pParameter = (_GRABBER_INIT_PARAM_ *)pParam;
|
if(NULL == pParameter) {
|
return FALSE;
|
}
|
m_Param = *pParameter;
|
|
CString strDCF;
|
strDCF = m_Param.cDCFPath;
|
|
if (g_nGrabberCount_Radient == 0) {
|
MappAlloc(M_NULL, M_DEFAULT, &g_MilApplication_Radient);
|
}
|
g_nGrabberCount_Radient++;
|
|
// 分配系统
|
MsysAlloc(M_SYSTEM_RADIENTEVCL, m_Param.nBoardIdx, M_DEFAULT, &m_MilSystem);
|
if (CheckLastError()) {
|
return FALSE;
|
}
|
|
// 分配 digitizer,M_DEV0/M_DEV1 区分 CH0/CH1
|
MIL_INT nDev = m_Param.nBoardCh;
|
MdigAlloc(m_MilSystem, nDev, strDCF, M_DEFAULT, &m_MilDigitizer);
|
if (CheckLastError()) {
|
MIL_INT nErrorCode = 0;
|
MappGetError(M_GLOBAL, &nErrorCode);
|
g_pLog->DisplayMessage(_T("Digitizer Alloc Error | BoardIdx=%d, BoardCh=%d, DCF=\"%s\", MIL_Error=%ld"), m_Param.nBoardIdx, m_Param.nBoardCh, strDCF, nErrorCode);
|
return FALSE;
|
}
|
g_pLog->DisplayMessage(_T("Digitizer Alloc | BoardIdx=%d, BoardCh=%d, DCF=\"%s\""), m_Param.nBoardIdx, m_Param.nBoardCh, strDCF);
|
|
// 查询真实尺寸
|
MIL_INT nSizeX = 0, nSizeY = 0, nBands = 1, nType = 0;
|
MdigInquire(m_MilDigitizer, M_SIZE_X, &nSizeX);
|
MdigInquire(m_MilDigitizer, M_SIZE_Y, &nSizeY);
|
MdigInquire(m_MilDigitizer, M_SIZE_BAND, &nBands);
|
MdigInquire(m_MilDigitizer, M_TYPE, &nType);
|
|
// 用硬件实际值覆盖配置
|
if (m_Param.nFrameWidth != (int)nSizeX || m_Param.nFrameHeight != (int)nSizeY) {
|
g_pLog->DisplayMessage(_T("Digitizer Size sync: cfg %dx%d -> hw %dx%d"), m_Param.nFrameWidth, m_Param.nFrameHeight, (int)nSizeX, (int)nSizeY);
|
m_Param.nFrameWidth = (int)nSizeX;
|
m_Param.nFrameHeight = (int)nSizeY;
|
}
|
|
// 分配缓冲
|
for (int j = 0; j < BUFFERING_SIZE_MAX; j++) {
|
MbufAlloc2d(m_MilSystem, m_Param.nFrameWidth, m_Param.nFrameHeight, (/*nType ? nType : */8 + M_UNSIGNED), M_IMAGE + M_GRAB + M_PROC, &m_Milbufgrab[j]);
|
}
|
|
if (CheckLastError()) {
|
return FALSE;
|
}
|
|
/*
|
INT nExposureTimer = m_Param.nExposure*1000;
|
INT nExposureTimerDelay = m_Param.nExposureDelay*1000;
|
|
MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE_TIME+M_TIMER1, nExposureTimer); //10us
|
MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE_TIME_DELAY+M_TIMER1, nExposureTimerDelay); //10us
|
|
if(m_Param.nImgFlipX == 1)
|
SetImageFlipX(TRUE);
|
else
|
SetImageFlipX(FALSE);
|
*/
|
|
// 抓取控制
|
MdigControl(m_MilDigitizer, M_GRAB_MODE, M_ASYNCHRONOUS);
|
MdigControl(m_MilDigitizer, M_GRAB_TIMEOUT, M_INFINITE);
|
if (CheckLastError()) {
|
return FALSE;
|
}
|
|
m_DigitizerStatus.status = M_STOP;
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::SetImageFlipX(BOOL bOn)
|
{
|
if (bOn == TRUE) {
|
MdigControl(m_MilDigitizer, M_GRAB_DIRECTION_X, M_REVERSE);
|
}
|
else {
|
MdigControl(m_MilDigitizer, M_GRAB_DIRECTION_X, M_FORWARD);
|
}
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::CheckLastError()
|
{
|
MIL_INT nErrorCode;
|
if(MappGetError(M_GLOBAL, &nErrorCode)) {
|
int iCam = m_Param.nCameraIdx;
|
int iScan = m_Param.nCameraScan;
|
int iBoard = m_Param.nBoardIdx;
|
int iBoardCh = m_Param.nBoardCh;
|
|
CString strMsg;
|
strMsg.Format(_T("[Board=%d,ch=%d] [Camera=%d,Scan=%d] MIL Error Code : %d"), iBoard,iBoardCh,iCam,iScan, nErrorCode);
|
g_pLog->DisplayMessage(strMsg);
|
|
return TRUE;
|
}
|
|
return FALSE;
|
}
|
|
BOOL CGrabberRadient::InitializeBuffer(void *pParam)
|
{
|
_GRABBER_INIT_PARAM_ *pParameter = (_GRABBER_INIT_PARAM_ *)pParam;
|
if (NULL == pParameter) {
|
g_pLog->DisplayMessage(_T("InitializeBuffer : pParameter is NULL"));
|
return FALSE;
|
}
|
|
m_Param = *pParameter;
|
return CreateGrabBuffer(m_Param.nScanCount, m_Param.nGrabBufCount, m_Param.nFrameWidth, m_Param.nFrameHeight);
|
}
|
|
BOOL CGrabberRadient::Deinitialize(void)
|
{
|
if (IsGrabbing()) {
|
GrabScanStop();
|
}
|
|
g_nGrabberCount_Radient--;
|
|
for(int i = 0; i < BUFFERING_SIZE_MAX ;i++) {
|
MbufFree(m_Milbufgrab[i]);
|
}
|
|
MdigFree(m_MilDigitizer);
|
MsysFree(m_MilSystem);
|
|
if (g_nGrabberCount_Radient == 0) {
|
MappFree(g_MilApplication_Radient);
|
}
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::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;
|
|
if(m_DigitizerStatus.status == M_STOP) {
|
m_DigitizerStatus.status = M_FREE_START;
|
m_DigitizerStatus.nCount = 0;
|
m_DigitizerStatus.nIndex = m_Param.nCameraScan;
|
|
MdigProcess(m_MilDigitizer,&m_Milbufgrab[0],BUFFERING_SIZE_MAX, M_START, M_DEFAULT, (MIL_BUF_HOOK_FUNCTION_PTR)CallbackFreeRunFunction, this);
|
}
|
|
m_isGrabbing = TRUE;
|
m_isLiveGrab = TRUE;
|
g_pLog->DisplayMessage(_T("Start Live Acq"));
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::GrabScanStart(int iScan, BOOL bFreeRun, int nPeriod, int nExposure, BOOL bAuto)
|
{
|
int nCameraIdx = m_Param.nCameraIdx;
|
g_pLog->DisplayMessage(_T("%d Start Acq : Camera=%d, Scan=%d, GrabFrameCount=%d, FrameHeight=%d"), m_Param.nBoardIdx, nCameraIdx, iScan, g_pStatus->GetGrabFrameCount(nCameraIdx, iScan), m_Param.nFrameHeight);
|
|
if (IsGrabbing()) {
|
g_pLog->DisplayMessage(_T("%d Start Acq : Camera=%d, Scan=%d, IsGrabbing -> Stop Acq %d"), m_Param.nBoardIdx, nCameraIdx, iScan, m_nEndFrameIdx);
|
GrabScanStop();
|
Sleep(100);
|
}
|
|
m_nStartFrameIdx = 0;
|
m_nEndFrameIdx = 0;
|
m_nSetBufferIdx = -1;
|
m_nScanIndex = iScan;
|
|
if (bAuto == TRUE) {
|
int nDigitizer = 0;
|
|
if (bFreeRun == FALSE) {
|
SetTriggerMode(TRUE);
|
|
/* Start the processing. The processing function is called for every frame grabbed. */
|
if (m_DigitizerStatus.status == M_STOP) {
|
m_DigitizerStatus.status = M_START;
|
m_DigitizerStatus.nCount = 0;
|
m_DigitizerStatus.nIndex = iScan;
|
|
MdigProcess(m_MilDigitizer, &m_Milbufgrab[0], BUFFERING_SIZE_MAX, M_START, M_DEFAULT, (MIL_BUF_HOOK_FUNCTION_PTR)CallbackHookFunction, this);
|
}
|
}
|
else {
|
if (m_DigitizerStatus.status == M_STOP) {
|
m_DigitizerStatus.status = M_FREE_START;
|
m_DigitizerStatus.nCount = 0;
|
m_DigitizerStatus.nIndex = iScan;
|
|
MdigProcess(m_MilDigitizer, &m_Milbufgrab[0], BUFFERING_SIZE_MAX, M_START, M_DEFAULT, (MIL_BUF_HOOK_FUNCTION_PTR)CallbackFreeRunFunction, this);
|
}
|
}
|
|
m_isGrabbing = TRUE;
|
m_isLiveGrab = FALSE;
|
}
|
else {
|
SimulationGrab(iScan);
|
}
|
|
return TRUE;
|
}
|
|
void CGrabberRadient::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 CGrabberRadient::GrabScanStop(void)
|
{
|
g_pLog->DisplayMessage(_T("%d StopAcq : Camera %d, Scan %d, Grab %d, End %d"), m_Param.nBoardIdx, m_Param.nCameraIdx, m_nScanIndex, m_nSetBufferIdx, m_nEndFrameIdx);
|
|
CString strMsg;
|
if (m_DigitizerStatus.status == M_START) {
|
MdigProcess(m_MilDigitizer, &m_Milbufgrab[0], BUFFERING_SIZE_MAX, M_STOP, M_DEFAULT, (MIL_BUF_HOOK_FUNCTION_PTR)CallbackHookFunction, this);
|
m_DigitizerStatus.nIndex = m_nScanIndex;
|
m_DigitizerStatus.status = M_STOP;
|
}
|
else if (m_DigitizerStatus.status == M_FREE_START) {
|
MdigProcess(m_MilDigitizer, &m_Milbufgrab[0], BUFFERING_SIZE_MAX, M_STOP, M_DEFAULT, (MIL_BUF_HOOK_FUNCTION_PTR)CallbackFreeRunFunction, this);
|
m_DigitizerStatus.nIndex = m_nScanIndex;
|
m_DigitizerStatus.status = M_STOP;
|
}
|
|
m_isGrabbing = FALSE;
|
m_isLiveGrab = FALSE;
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::IsGrabbing(void)
|
{
|
return m_isGrabbing;
|
}
|
|
int CGrabberRadient::IsAcqFrame(int nFrameNo, int nThreadIdx)
|
{
|
return m_nSetBufferIdx - nFrameNo;
|
}
|
|
LPBYTE CGrabberRadient::GetFrameHeaderLine(int iScan,int nLine, BOOL* bSuccess)
|
{
|
if (m_pFrameBuffer == NULL) {
|
return NULL;
|
}
|
return m_pFrameBuffer->GetFrameHeaderLine(iScan,nLine);
|
}
|
|
LPBYTE CGrabberRadient::GetFrameHeader(int iScan,int nFrameNo, BOOL* bRet)
|
{
|
if (m_pFrameBuffer == NULL) {
|
return NULL;
|
}
|
return m_pFrameBuffer->GetFrameBuferHeader(iScan, nFrameNo);
|
}
|
|
BOOL CGrabberRadient::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 (nXStart < 0 || nYStart < 0) {
|
g_pLog->DisplayMessage(_T("GetSmallImage : Invalid Start Position X=%d, Y=%d"), nXStart, nYStart);
|
return FALSE;
|
}
|
|
if (nXStart + nXSize > nBufSizeX) {
|
g_pLog->DisplayMessage(_T("GetSmallImage : Invalid X Size Start=%d, Size=%d, BufferSizeX=%d"), nXStart, nXSize, nBufSizeX);
|
return FALSE;
|
}
|
|
if (nYStart + nYSize > nBufSizeY * GetEndFrameIdx()) {
|
g_pLog->DisplayMessage(_T("GetSmallImage : Invalid Y Size Start=%d, Size=%d, BufferSizeY=%d"), nYStart, nYSize, nBufSizeY);
|
return FALSE;
|
}
|
|
int nStartFrameNo = nYStart / nBufSizeY;
|
int nEndFrameNo = (nYStart + nYSize) / nBufSizeY;
|
LPBYTE lpHeadAddr = GetFrameHeader(iScan, nStartFrameNo);
|
if (!lpHeadAddr) {
|
g_pLog->DisplayMessage(_T("GetSmallImage : GetFrameHeader Failed for Scan %d, Frame %d"), iScan, nStartFrameNo);
|
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) {
|
lpHeadAddr = GetFrameHeader(iScan, ++nStartFrameNo);
|
lpStart = lpHeadAddr + nXStart;
|
nLine = 0;
|
}
|
else {
|
nLine++;
|
}
|
}
|
|
return TRUE;
|
}
|
|
void CGrabberRadient::SetSimulFrame(int nFrame)
|
{
|
return;
|
}
|
|
BOOL CGrabberRadient::Processing(long HookType, MIL_ID HookId)
|
{
|
if (m_pFrameBuffer == NULL) {
|
return FALSE;
|
}
|
|
m_nEndFrameIdx++; //Count
|
m_nSetBufferIdx++; //index
|
|
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 [Cam:%d][Scan:%d] - EndFrameIdx=%d FrameCount=%d"), m_Param.nBoardIdx, nCameraIdx, m_nScanIndex, m_nEndFrameIdx, g_pStatus->GetGrabFrameCount(nCameraIdx, m_nScanIndex));
|
return TRUE;
|
}
|
|
if (m_nSetBufferIdx > m_pFrameBuffer->GetFrameCount()) {
|
GrabScanStop();
|
g_pStatus->SetGrabEnd(nCameraIdx, m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d BufferIndex Overflow : Stop Grab [Cam:%d][Scan:%d] - FrameIdx=%d BufferCount=%d"), m_Param.nBoardIdx, nCameraIdx, m_nScanIndex, m_nEndFrameIdx, m_pFrameBuffer->GetFrameCount());
|
return TRUE;
|
}
|
|
MIL_ID ModifiedImage = 0;
|
LPBYTE pBuffer = m_pFrameBuffer->GetFrameBuferHeader(m_nScanIndex, m_nSetBufferIdx);
|
if (pBuffer == NULL) {
|
GrabScanStop();
|
g_pStatus->SetGrabEnd(nCameraIdx, m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d BufferPointer NULL : Stop Grab [Cam:%d][Scan:%d] - FrameIdx=%d BufferCount=%d"), m_Param.nBoardIdx, nCameraIdx, m_nScanIndex, m_nEndFrameIdx, m_pFrameBuffer->GetFrameCount());
|
return TRUE;
|
}
|
|
MdigGetHookInfo(HookId, M_MODIFIED_BUFFER + M_BUFFER_ID, &ModifiedImage);
|
MbufControl(ModifiedImage, M_LOCK, M_DEFAULT);
|
MbufGet2d(ModifiedImage, 0, 0, m_Param.nFrameWidth, m_Param.nFrameHeight, pBuffer);
|
MbufControl(ModifiedImage, M_UNLOCK, M_DEFAULT);
|
|
SetInsertFrame(m_nScanIndex, m_nSetBufferIdx);
|
|
#if GRAB_DEBUG_ENABLE
|
// 调试用的详细日志
|
g_pLog->DisplayMessage(
|
_T("[Grab-Processing] FrameAcquired | Board=%d Cam=%d Scan=%d FrameIdx=%d BufIdx=%d Size=%dx%d BufCount=%d"),
|
m_Param.nBoardIdx,
|
m_Param.nCameraIdx,
|
m_nScanIndex,
|
m_nEndFrameIdx,
|
m_nSetBufferIdx,
|
m_Param.nFrameWidth,
|
m_Param.nFrameHeight,
|
m_pFrameBuffer->GetFrameCount()
|
);
|
#endif // GRAB_DEBUG_ENABLE
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::DumpCurrentBuffer(LPBYTE pBuffer, LPCTSTR pszDir)
|
{
|
if (!pszDir || !*pszDir) {
|
g_pLog->DisplayMessage(_T("Dump invalid dir"));
|
return FALSE;
|
}
|
|
const MIL_INT W = m_Param.nFrameWidth;
|
const MIL_INT H = m_Param.nFrameHeight;
|
|
MIL_INT bits = 8;
|
if (m_MilDigitizer) {
|
MdigInquire(m_MilDigitizer, M_SIZE_BIT, &bits);
|
}
|
const MIL_INT milType = (bits > 8) ? (16 + M_UNSIGNED) : (8 + M_UNSIGNED);
|
|
if (CreateDirectory(pszDir, nullptr) == 0) {
|
DWORD e = GetLastError();
|
if (e != ERROR_ALREADY_EXISTS) {
|
g_pLog->DisplayMessage(_T("DumpFB CreateDirectory failed (%lu): %s"), e, pszDir);
|
return FALSE;
|
}
|
}
|
|
MIL_ID img = M_NULL;
|
MbufAlloc2d(m_MilSystem, W, H, milType, M_IMAGE + M_PROC, &img);
|
if (img == M_NULL) {
|
g_pLog->DisplayMessage(_T("DumpFB MbufAlloc2d failed: %dx%dx%dbit"), (int)W, (int)H, (int)bits);
|
return FALSE;
|
}
|
|
static LONG sSeq = 0;
|
LONG seq = InterlockedIncrement(&sSeq);
|
|
MbufPut2d(img, 0, 0, W, H, pBuffer);
|
|
CString path;
|
path.Format(_T("%s\\Cam%d_Scan%d_seq%06ld.tif"), pszDir, m_Param.nCameraIdx, m_nScanIndex, (long)seq);
|
|
MIL_INT dummy = 0;
|
MappGetError(M_GLOBAL, &dummy);
|
|
MbufExport((MIL_CONST_TEXT_PTR)(LPCTSTR)path, M_TIFF, img);
|
|
MIL_INT err = 0;
|
if (MappGetError(M_GLOBAL, &err)) {
|
g_pLog->DisplayMessage(_T("DumpFB export failed (MIL_ERR=%lld): %s"), err, path);
|
}
|
|
MbufFree(img);
|
return TRUE;
|
}
|
|
long MFTYPE CGrabberRadient::CallbackHookFunction(long HookType, MIL_ID HookId, void MPTYPE *HookDataPtr)
|
{
|
if (GetThreadPriority(GetCurrentThread()) != THREAD_PRIORITY_HIGHEST) {
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
g_pLog->DisplayMessage(_T("[Grab] CallbackHookFunction : thread priority set to HIGHEST"));
|
}
|
|
MIL_ID nEventDig = M_NULL;
|
CGrabberRadient *pRadient = (CGrabberRadient*)HookDataPtr;
|
if (nullptr == pRadient){
|
return 0;
|
}
|
|
MdigGetHookInfo(HookId, M_DIGITIZER_ID, &nEventDig);
|
if (nEventDig != pRadient->m_MilDigitizer) {
|
g_pLog->DisplayMessage(_T("CallbackHookFunction : HookId %lld does not match Digitizer %lld"), HookId, pRadient->m_MilDigitizer);
|
return 0;
|
}
|
|
return pRadient->Processing(HookType, HookId) ? 0 : 1;
|
}
|
|
long MFTYPE CGrabberRadient::CallbackFreeRunFunction(long HookType, MIL_ID HookId, void MPTYPE *HookDataPtr)
|
{
|
if (GetThreadPriority(GetCurrentThread()) != THREAD_PRIORITY_HIGHEST) {
|
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
|
g_pLog->DisplayMessage(_T("CallbackFreeRunFunction : thread priority set to HIGHEST"));
|
}
|
|
MIL_ID nEventDig = M_NULL;
|
CGrabberRadient *pRadient = (CGrabberRadient*)HookDataPtr;
|
if (nullptr == pRadient) {
|
return 0;
|
}
|
|
MdigGetHookInfo(HookId, M_DIGITIZER_ID, &nEventDig);
|
if (nEventDig != pRadient->m_MilDigitizer) {
|
g_pLog->DisplayMessage(_T("CallbackFreeRunFunction : HookId %lld does not match Digitizer %lld"), HookId, pRadient->m_MilDigitizer);
|
return 0;
|
}
|
|
if(pRadient->m_isLiveGrab == TRUE) {
|
pRadient->m_nSetBufferIdx = 0;
|
int nCameraIdx = pRadient->m_Param.nCameraIdx;
|
|
LPBYTE pBuffer = pRadient->m_pFrameBuffer->GetFrameBuferHeader(pRadient->m_nScanIndex, pRadient->m_nSetBufferIdx);
|
if(pBuffer == NULL) {
|
pRadient->GrabScanStop();
|
g_pStatus->SetGrabEnd(nCameraIdx, pRadient->m_nScanIndex);
|
g_pLog->DisplayMessage(_T("%d Over Grab Buffer Stop Grab[%d][%d] - %d"), pRadient->m_Param.nBoardIdx, pRadient->m_nScanIndex, pRadient->m_nEndFrameIdx,pRadient->m_pFrameBuffer->GetFrameCount());
|
return TRUE;
|
}
|
|
MIL_ID ModifiedImage = 0;
|
MdigGetHookInfo(HookId, M_MODIFIED_BUFFER + M_BUFFER_ID, &ModifiedImage);
|
MbufControl(ModifiedImage, M_LOCK, M_DEFAULT);
|
MbufGet2d(ModifiedImage, 0, 0, pRadient->m_Param.nFrameWidth, pRadient->m_Param.nFrameHeight, pBuffer);
|
MbufControl(ModifiedImage, M_UNLOCK, M_DEFAULT);
|
|
/*
|
int iGrab = pRadient->m_nSetBufferIdx%pRadient->m_Param.nGrabBufCount;
|
MbufGet(pRadient->m_MilImageChild[iGrab],pBuffer);
|
*/
|
|
#if GRAB_DEBUG_ENABLE
|
// 打印采集详细信息
|
g_pLog->DisplayMessage(
|
_T("[Grab-FreeRun] FrameAcquired | Board=%d Cam=%d Scan=%d FrameIdx=%d BufIdx=%d Size=%dx%d BufCount=%d"),
|
pRadient->m_Param.nBoardIdx,
|
pRadient->m_Param.nCameraIdx,
|
pRadient->m_nScanIndex,
|
pRadient->m_nEndFrameIdx,
|
pRadient->m_nSetBufferIdx,
|
pRadient->m_Param.nFrameWidth,
|
pRadient->m_Param.nFrameHeight,
|
pRadient->m_pFrameBuffer->GetFrameCount()
|
);
|
|
// 调试用的图像转存
|
pRadient->DumpCurrentBuffer(pBuffer, GRAB_DUMP_DIR);
|
#endif // GRAB_DEBUG_ENABLE
|
|
return TRUE;
|
}
|
|
return 0;
|
}
|
|
BOOL CGrabberRadient::CreateGrabBuffer(int nScanCount,int nBufSize, int nBufSizeX, int nBufSizeY)
|
{
|
SIZE_T nTempBufferSize= nBufSize;
|
SIZE_T nTempFrmCX = nBufSizeX;
|
SIZE_T nTempFrmCY = nBufSizeY;
|
SIZE_T nTotalBufferSize= nTempBufferSize * nTempFrmCX * nTempFrmCY;
|
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;
|
}
|
|
void CGrabberRadient::ClearBuffer()
|
{
|
if (m_pFrameBuffer != NULL) {
|
m_pFrameBuffer->ClearBuffer();
|
}
|
}
|
|
void CGrabberRadient::ClearGrabIdx()
|
{
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
|
g_pLog->DisplayMessage(_T("Board : %d Clear.."), m_lBord);
|
|
m_dqCallbackFrame.clear();
|
MyLock.Unlock();
|
}
|
|
BOOL CGrabberRadient::SetInsertFrame(int iScan,int iFrame)
|
{
|
CSingleLock MyLock(&m_csIdxLock);
|
MyLock.Lock();
|
|
stFrameIndex stFrame(iScan,iFrame);
|
m_dqCallbackFrame.push_back(stFrame);
|
MyLock.Unlock();
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::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;
|
}
|
|
int CGrabberRadient::GetGrabFrameCount()
|
{
|
return (int)m_dqCallbackFrame.size();
|
}
|
|
stFrameIndex CGrabberRadient::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 CGrabberRadient::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;
|
}
|
|
BOOL CGrabberRadient::IsHasGrabFrame()
|
{
|
return !m_dqCallbackFrame.empty();
|
}
|
|
BOOL CGrabberRadient::SetTriggerMode( BOOL bExTrigger )
|
{
|
if (m_MilDigitizer == M_NULL) {
|
g_pLog->DisplayMessage(_T("SetTriggerMode failed: digitizer is NULL"));
|
return FALSE;
|
}
|
|
INT nExposureTimer = m_Param.nExposure * 1000;
|
INT nExposureTimerDelay = m_Param.nExposureDelay * 1000;
|
//MdigControl(m_MilDigitizer, M_CAMERALINK_CC1_SOURCE, M_GRAB_EXPOSURE + M_TIMER1);
|
//MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE + M_TIMER1, M_ENABLE);
|
//MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE_SOURCE + M_TIMER1, bExTrigger ? M_HARDWARE : M_CONTINUOUS);
|
//MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE_TIME + M_TIMER1, nExposureTimer);
|
//MdigControl(m_MilDigitizer, M_GRAB_EXPOSURE_TIME_DELAY + M_TIMER1, nExposureTimerDelay);
|
g_pLog->DisplayMessage(_T("TriggerMode=%s, Exp(ns)=%d, Delay(ns)=%d"), bExTrigger ? _T("External") : _T("Live"), nExposureTimer, nExposureTimerDelay);
|
|
return TRUE;
|
}
|
|
BOOL CGrabberRadient::DumpBufferAsOneImage(int iScan, LPCTSTR pszPath)
|
{
|
if (!m_pFrameBuffer) {
|
g_pLog->DisplayMessage(_T("Dump m_pFrameBuffer is NULL"));
|
return FALSE;
|
}
|
|
const int nFramesAlloc = m_pFrameBuffer->GetFrameCount();
|
const int nFramesGrab = GetEndFrameIdx();
|
const int nFrames = (nFramesGrab > 0 && nFramesGrab <= nFramesAlloc) ? nFramesGrab : nFramesAlloc;
|
if (nFrames <= 0) {
|
return FALSE;
|
}
|
|
const MIL_INT W = m_Param.nFrameWidth;
|
const MIL_INT H = m_Param.nFrameHeight;
|
|
// 保持真实位深(8/10/12/16bit -> 8/16bit缓冲)
|
MIL_INT bits = 8;
|
if (m_MilDigitizer) {
|
MdigInquire(m_MilDigitizer, M_SIZE_BIT, &bits);
|
}
|
|
const int bpp = (int)((bits + 7) / 8);
|
const MIL_INT type = (bpp >= 2) ? (16 + M_UNSIGNED) : (8 + M_UNSIGNED);
|
|
// 拼接成一张长图
|
MIL_ID img = M_NULL;
|
MbufAlloc2d(m_MilSystem, W, H * nFrames, type, M_IMAGE + M_PROC, &img);
|
if (img == M_NULL) {
|
return FALSE;
|
}
|
|
for (int f = 0; f < nFrames; ++f) {
|
LPBYTE src = m_pFrameBuffer->GetFrameBuferHeader(iScan, f);
|
if (!src) {
|
break;
|
}
|
|
MbufPut2d(img, 0, (MIL_INT)f * H, W, H, src);
|
}
|
|
MbufExport((MIL_CONST_TEXT_PTR)(LPCTSTR)pszPath, M_TIFF, img);
|
|
MIL_INT err = 0;
|
if (MappGetError(M_GLOBAL, &err)) {
|
g_pLog->DisplayMessage(_T("DumpBufferAsOneImage Error : %d"), err);
|
return FALSE;
|
}
|
|
MbufFree(img);
|
return TRUE;
|
}
|