#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(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); }