#include "StdAfx.h"
|
#include "AutoLightControl.h"
|
#include "CHImageControls/CHImageProcess.h"
|
|
CAutoLightControl::CAutoLightControl(int nIndex) : m_nIndex(nIndex), CWorkThreadPools(1)
|
{
|
}
|
|
CAutoLightControl::~CAutoLightControl(void)
|
{
|
}
|
|
BOOL CAutoLightControl::ProcessAutoLight(const SAutoLightParam& controlParam)
|
{
|
CAutoLightThreadData *pData = new CAutoLightThreadData(this);
|
if (pData==NULL) return FALSE;
|
pData->controlParam = controlParam;
|
return CreateWorkThread(pData);
|
}
|
|
double CAutoLightControl::GetAverageValue(BYTE* pImage, int nWidth, int nHeight, int nWidthStep)
|
{
|
if (pImage==NULL || nWidth<=0 || nHeight<=0) return 0.0;
|
|
CCHImageData dataImage;
|
dataImage.CreateImage(nWidth, nHeight);
|
char* pProcessImage = dataImage.GetImageBuffer();
|
CopyMemory(pProcessImage, pImage, nWidth*nHeight);
|
|
double dAvgValue = 0.0;
|
CCHImageProcess::ImageAverage(&dataImage, dAvgValue);
|
|
return dAvgValue;
|
}
|
|
void CAutoLightControl::WorkThreadProcess(PVOID pParameter)
|
{
|
if (m_pALC2P==NULL) return;
|
|
CAutoLightThreadData *pData = static_cast<CAutoLightThreadData*>(pParameter);
|
if (pData==NULL) return;
|
|
if (pData->controlParam.bAutoProcess==FALSE)
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightNoProcess, 0.0, 0);
|
return;
|
}
|
|
BOOL bFirstIter = TRUE;
|
|
int nProcessCount = 0;
|
|
|
double dPrevLightLevel = 1;
|
double dCurLightLevel = 1;
|
double dControlLightLevel = 1;
|
double dCurLight = -1.0;
|
double dPrevLight = -1.0;
|
double dTargetLight = pData->controlParam.dTargetMin + (pData->controlParam.dTargetMax-pData->controlParam.dTargetMin) / 2.0;
|
|
int nResultCode = LightChangeLevel;
|
|
do
|
{
|
if (m_pALC2P->IALC2P_GetCurrentLightLevel(m_nIndex, dCurLight, dCurLightLevel)==FALSE) // ÇöÀç Á¶¸íÀÇ °ª°ú ÇöÀç ¹à±â¸¦ ¾Ë¾Æ¿È.
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightProcessFail, 0.0, 0);
|
return;
|
}
|
|
if ((++nProcessCount) > pData->controlParam.nProcessMax) // ÃÖ´ë Ä«¿îÅ͸¦ ³Ñ¾î°¬³ª?
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightProcessFail, dCurLight, dCurLightLevel);
|
return;
|
}
|
|
if (dCurLight < pData->controlParam.dTargetMin) // Ÿ°Ù º¸´Ù ¾îµÎ¿î°¡?
|
{
|
if (dCurLightLevel >= pData->controlParam.dLightLevelMax) // ÇöÀç Á¶¸íÀÇ °ªÀÌ ÃÖ´ë °ªº¸´Ù Å©°Å³ª °°Àº°¡?
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightLevelDark, dCurLight, dCurLightLevel); // ³Ê¹« ¾îµÎ¿ö¼ ½ÇÆÐ!
|
return;
|
}
|
else
|
{
|
if (bFirstIter)
|
{
|
dControlLightLevel = int (dCurLightLevel * 2.0);
|
bFirstIter = FALSE;
|
}
|
else
|
{
|
double dLineA = (dCurLight - dPrevLight) / (dCurLightLevel - dPrevLightLevel);
|
double dLineB = dCurLight - (dLineA * dCurLightLevel);
|
dControlLightLevel = int( (dTargetLight - dLineB) / dLineA );
|
|
dPrevLightLevel = dCurLightLevel;
|
dPrevLight = dCurLight;
|
}
|
|
if (dControlLightLevel >= pData->controlParam.dLightLevelMax)
|
{
|
dControlLightLevel = int( pData->controlParam.dLightLevelMax );
|
}
|
nResultCode = LightChangeLevel;
|
}
|
}
|
else if (dCurLight > pData->controlParam.dTargetMax) // Ÿ°Ù º¸´Ù ¹àÀº°¡?
|
{
|
if (dCurLightLevel <= pData->controlParam.dLightLevelMin) // ÇöÀç Á¶¸íÀÇ °ªÀÌ ÃÖ¼Ò °ªº¸´Ù À۰ųª °°Àº°¡?
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightLevelBright, dCurLight, dCurLightLevel); // ³Ê¹« ¹à¾Æ¼ ½ÇÆÐ
|
return;
|
}
|
else
|
{
|
if (bFirstIter)
|
{
|
dControlLightLevel = int (dCurLightLevel / 2.0);
|
bFirstIter = FALSE;
|
}
|
else
|
{
|
double dLineA = (dCurLight - dPrevLight) / (dCurLightLevel - dPrevLightLevel);
|
double dLineB = dCurLight - (dLineA * dCurLightLevel);
|
dControlLightLevel = int( (dTargetLight - dLineB) / dLineA );
|
|
dPrevLightLevel = dCurLightLevel;
|
dPrevLight = dCurLight;
|
}
|
|
if (dControlLightLevel <= pData->controlParam.dLightLevelMin)
|
{
|
dControlLightLevel = int( pData->controlParam.dLightLevelMin );
|
}
|
nResultCode = LightChangeLevel;
|
}
|
}
|
else // ŸÄÏ °ª »çÀ̸é Á¶Àý ¼º°ø!
|
{
|
m_pALC2P->IALC2P_ProcessEnd(m_nIndex, LightProcessComplete, dCurLight, dCurLightLevel);
|
|
m_pALC2P->IALC2P_CurrentResult(m_nIndex, nProcessCount++, 100, dCurLight, dCurLightLevel);
|
|
return;
|
}
|
|
// Á¶Àý °¡´ÉÇÑ ¹üÀ§¸é Á¶Àý ¼öÇà
|
if (dControlLightLevel>=pData->controlParam.dLightLevelMin && dControlLightLevel<=pData->controlParam.dLightLevelMax)
|
{
|
m_pALC2P->IALC2P_ChangeLightLevel(m_nIndex, dControlLightLevel);
|
}
|
|
// ÇöÀç ·çÇÁÀÇ °á°ú Àü¼Û.
|
m_pALC2P->IALC2P_CurrentResult(m_nIndex, nProcessCount, nResultCode, dCurLight, dCurLightLevel);
|
|
// ±â´Ù¸².
|
::Sleep(pData->controlParam.nControlDealy);
|
|
} while (TRUE);
|
|
}
|