#include "StdAfx.h"
|
#include "CHCameraControls/CameraBuffer.h"
|
#include "CHImageControls/CHImageData.h"
|
|
CCameraBuffer::CCameraBuffer() : CSharedMemory()
|
{
|
//m_nCameraIndex = nCameraIndex;
|
m_nScanCount = 1;
|
m_nBufferWidth = 0;
|
m_nBufferHeight = 0;
|
m_nBufferChannels = 0;
|
m_nBufferCount = 0;
|
|
m_pBufferInfo = NULL;
|
m_pBufferData = NULL;
|
m_pBufferImage = NULL;
|
|
m_nBufferInfoSize = sizeof(CCameraBufferInfo);
|
m_nBufferDataSize = 0;
|
}
|
|
CCameraBuffer::~CCameraBuffer(void)
|
{
|
DeleteBuffer();
|
}
|
|
void CCameraBuffer::DeleteBuffer()
|
{
|
Reset();
|
|
if (m_pBufferImage)
|
{
|
for (int i=0; i<m_nScanCount; i++)
|
{
|
delete [] m_pBufferImage[i];
|
}
|
delete [] m_pBufferImage;
|
m_pBufferImage = NULL;
|
}
|
|
if (m_pBufferInfo)
|
{
|
delete [] m_pBufferInfo;
|
m_pBufferInfo = NULL;
|
}
|
|
if (m_pBufferData)
|
{
|
delete [] m_pBufferData;
|
m_pBufferData = NULL;
|
}
|
}
|
|
BOOL CCameraBuffer::ClearBuffer(int nScanIndex)
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return FALSE;
|
|
DWORD nTotalImageBuffSize = m_nBufferDataSize * m_nBufferCount;
|
|
memset(m_pBufferData[nScanIndex], 0, nTotalImageBuffSize);
|
|
return TRUE;
|
}
|
|
|
BOOL CCameraBuffer::CreateBuffer(int nWidth, int nHeight, int nChannels, int nCount, const CString& strBufferName, int nScanCount)
|
{
|
DeleteBuffer();
|
|
m_nBufferWidth = nWidth;
|
m_nBufferHeight = nHeight;
|
m_nBufferChannels = nChannels;
|
m_nBufferCount = nCount;
|
m_nBufferDataSize = m_nBufferWidth * m_nBufferHeight * m_nBufferChannels;
|
|
m_nScanCount = nScanCount;
|
|
DWORD nTotalAsignedBuffSize = -1;
|
DWORD64 nTotalImageInfoSize = DWORD64(m_nBufferInfoSize);
|
DWORD64 nTotalImageDataSize = DWORD64(m_nBufferDataSize) * DWORD64(m_nBufferCount);
|
DWORD64 nMaxSize = nTotalImageInfoSize + nTotalImageDataSize;
|
|
if (nMaxSize>=nTotalAsignedBuffSize)
|
{
|
return FALSE;
|
}
|
|
nTotalAsignedBuffSize = DWORD(nMaxSize);
|
|
// alloc semaphore
|
SetMemoryCount(m_nScanCount);
|
|
m_pSemaPhore = new CSemaphore*[m_nScanCount];
|
m_pSharedMemory = new BYTE*[m_nScanCount];
|
m_pAsignedMemory = new HANDLE[m_nScanCount];
|
m_pBufferInfo = new CCameraBufferInfo*[m_nScanCount];
|
m_pBufferData = new BYTE*[m_nScanCount];
|
m_pBufferImage = new CCHImageData*[m_nScanCount];
|
|
/*
|
CString strValue = _T("");
|
strValue.Format(_T("_%02d_"), m_nCameraIndex);
|
strValue = strBufferName + strValue;
|
*/
|
|
CString strValue = strBufferName + _T("_");
|
|
CString strTemp = _T("");
|
for (int i=0; i<m_nScanCount; i++)
|
{
|
m_pSemaPhore[i] = new CSemaphore(1, 1);
|
m_pSharedMemory[i] = NULL;
|
m_pAsignedMemory[i] = NULL;
|
m_pBufferInfo[i] = NULL;
|
m_pBufferData[i] = NULL;
|
m_pBufferImage[i] = new CCHImageData[m_nBufferCount];
|
|
strTemp.Format(_T("SCAN_%03d"), i);
|
strTemp = strValue + strTemp;
|
|
m_pAsignedMemory[i] = (HANDLE) CreateFileMapping(
|
INVALID_HANDLE_VALUE,
|
NULL,
|
PAGE_READWRITE,
|
0,
|
nTotalAsignedBuffSize,
|
strTemp);
|
|
if(m_pAsignedMemory[i]==NULL)
|
{
|
DeleteBuffer();
|
return FALSE;
|
}
|
|
m_pSharedMemory[i] = (BYTE *)MapViewOfFile(m_pAsignedMemory[i], FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
|
|
if(m_pSharedMemory[i]==NULL)
|
{
|
DeleteBuffer();
|
return FALSE;
|
}
|
|
m_pBufferInfo[i] = (CCameraBufferInfo*)( m_pSharedMemory[i] );
|
m_pBufferData[i] = (BYTE *)( m_pSharedMemory[i] + m_nBufferInfoSize );
|
|
// create buffer image header
|
for (int j=0; j<m_nBufferCount; j++)
|
{
|
m_pBufferImage[i][j].CreateImageHeader(m_nBufferWidth, m_nBufferHeight, 8, m_nBufferChannels);
|
}
|
}
|
|
return TRUE;
|
}
|
|
int CCameraBuffer::GetBufferCount() const
|
{
|
return m_nBufferCount;
|
}
|
|
|
int CCameraBuffer::GetScanCount() const
|
{
|
return m_nScanCount;
|
}
|
|
int CCameraBuffer::GetBufferWidth() const
|
{
|
return m_nBufferWidth;
|
}
|
|
int CCameraBuffer::GetBufferHeight() const
|
{
|
return m_nBufferHeight;
|
}
|
|
int CCameraBuffer::GetBufferChannels() const
|
{
|
return m_nBufferChannels;
|
}
|
|
const CCameraBufferInfo* CCameraBuffer::GetBufferInfo(int nScanIndex) const
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
return m_pBufferInfo[nScanIndex];
|
}
|
|
const BYTE* CCameraBuffer::GetBufferData(int nScanIndex) const
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
return m_pBufferData[nScanIndex];
|
}
|
|
const BYTE* CCameraBuffer::GetBufferData(int nScanIndex, int nBufferIndex) const
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
if (nBufferIndex<0 || nBufferIndex>=m_nBufferCount) return NULL;
|
return ( m_pBufferData[nScanIndex] + (m_nBufferDataSize*nBufferIndex) );
|
}
|
|
CCameraBufferInfo* CCameraBuffer::GetBufferInfo(int nScanIndex)
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
return m_pBufferInfo[nScanIndex];
|
}
|
|
BYTE* CCameraBuffer::GetBufferData(int nScanIndex)
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
return m_pBufferData[nScanIndex];
|
}
|
|
BYTE* CCameraBuffer::GetBufferData(int nScanIndex, int nBufferIndex)
|
{
|
if (nScanIndex<0 || nScanIndex>=m_nScanCount) return NULL;
|
if (nBufferIndex<0 || nBufferIndex>=m_nBufferCount) return NULL;
|
return ( m_pBufferData[nScanIndex] + (m_nBufferDataSize*nBufferIndex) );
|
}
|
|
CCameraBufferInfo* CCameraBuffer::GetBufferData(int nScanIndex, BYTE** pBufferData)
|
{
|
if (LockMemory(nScanIndex)==FALSE) return NULL;
|
*pBufferData = pBufferData[nScanIndex];
|
return m_pBufferInfo[nScanIndex];
|
}
|
|
CCameraBufferInfo* CCameraBuffer::GetBufferData(int nScanIndex, int nBufferIndex, BYTE** pBufferData)
|
{
|
if (nBufferIndex<0 || nBufferIndex>=m_nBufferCount) return NULL;
|
if (LockMemory(nScanIndex)==FALSE) return NULL;
|
*pBufferData = ( pBufferData[nScanIndex] + (m_nBufferDataSize*nBufferIndex) );
|
return m_pBufferInfo[nScanIndex];
|
}
|
|
BOOL CCameraBuffer::SetBufferInfo(int nScanIndex, CCameraBufferInfo *pBufferInfo)
|
{
|
if (LockMemory(nScanIndex)==FALSE) return FALSE;
|
memcpy(m_pBufferInfo[nScanIndex], pBufferInfo, m_nBufferInfoSize);
|
return UnlockMemory(nScanIndex);
|
}
|
|
BOOL CCameraBuffer::SetBufferData(int nScanIndex, int nBufferIndex, BYTE* pBufferData, int nBufferSize)
|
{
|
if (nBufferIndex<0 || nBufferIndex>=m_nBufferCount) return NULL;
|
if (nBufferSize>(int)m_nBufferDataSize) return FALSE;
|
if (LockMemory(nScanIndex)==FALSE) return FALSE;
|
|
// À̹ÌÁö ±â·Ï
|
memcpy(m_pBufferData[nScanIndex]+(m_nBufferDataSize*nBufferIndex), pBufferData, m_nBufferDataSize);
|
|
return UnlockMemory(nScanIndex);
|
}
|
|
BOOL CCameraBuffer::SetBufferData(int nScanIndex, int nBufferIndex, CCameraBufferInfo *pBufferInfo, BYTE* pBufferData, int nBufferSize)
|
{
|
if (nBufferIndex<0 || nBufferIndex>=m_nBufferCount) return NULL;
|
if (nBufferSize>(int)m_nBufferDataSize) return FALSE;
|
if (LockMemory(nScanIndex)==FALSE) return FALSE;
|
|
// À̹ÌÁö Á¤º¸ ±â·Ï
|
memcpy(m_pBufferInfo[nScanIndex], pBufferInfo, m_nBufferInfoSize);
|
|
// À̹ÌÁö ±â·Ï
|
memcpy(m_pBufferData[nScanIndex]+(m_nBufferDataSize*nBufferIndex), pBufferData, m_nBufferDataSize);
|
|
return UnlockMemory(nScanIndex);
|
}
|