#include "StdAfx.h"
|
#include "StackResultCPJT.h"
|
#include "akLoggerExt.h"
|
#include "akCore/akFileDB.h"
|
#include <process.h>
|
#include "DitGlassRawClient.h"
|
#include "GlassRawBase.h"
|
|
#ifdef _DEBUG
|
#undef THIS_FILE
|
static char THIS_FILE[]=__FILE__;
|
#define new DEBUG_NEW
|
#endif
|
|
CStackResultCPJT::CStackResultCPJT(void)
|
{
|
m_nThreadStackFileReadFlag = 0;
|
m_strConfigFile;
|
{
|
GetModuleFileName(NULL, m_strConfigFile, MAX_PATH);
|
char* ext = CakFileUtil::getFileExt(m_strConfigFile);
|
strcpy(ext, "ini");
|
}
|
|
m_nProcessState = SPS_StateIdle;
|
readOptionFile();
|
}
|
|
CStackResultCPJT::~CStackResultCPJT(void)
|
{
|
if(m_nThreadStackFileReadFlag == 1)
|
{
|
m_nThreadStackFileReadFlag = 2;
|
while(m_nThreadStackFileReadFlag != 0)
|
{
|
Sleep(1);
|
}
|
}
|
|
m_vecStackDefect.clear();
|
}
|
|
//201218 CJH - Stack File open
|
BOOL CStackResultCPJT::openFile( char* pGlassID )
|
{
|
CString strFileName;
|
|
/*< KJG 20211208 : #3696 DEL Start >*/
|
//CDitGlassRawClient GlassRawClient;
|
//GlassRawClient.ConnectServer();
|
//CDitGlassRawClient* pShared = &GlassRawClient;
|
//
|
//_grmDefectData* pGrmStack;
|
/*< KJG 20211208 : #3696 DEL End >*/
|
|
strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
|
|
FILE* pf = fopen(strFileName.GetBuffer(0), "r");
|
|
if(pf == NULL)
|
return FALSE;
|
|
/*< KJG 20211208 : #3696 ADD Start >*/
|
CDitGlassRawClient GlassRawClient;
|
GlassRawClient.ConnectServer();
|
CDitGlassRawClient* pShared = &GlassRawClient;
|
_grmDefectData* pGrmStack;
|
/*< KJG 20211208 : #3696 ADD End >*/
|
|
std::vector<_StackDefectCPJT> vecStackDefect;
|
_StackDefectCPJT StackDefect;
|
char buffer[2048];
|
|
char* pReadPoint = NULL;
|
char *pStr;
|
CString tempStr, strRight;
|
|
while(!feof(pf)) //Data ½ÃÀÛ
|
{
|
pStr = fgets(buffer, 2048, pf);
|
|
if(strncmp(buffer, "DATA", 4)) continue; //Data ½ÃÀÛ
|
|
if(strlen(buffer) <= 0 || pStr == NULL)
|
break;
|
|
if(strncmp(buffer, "DATA DEFECT", 10)) continue; //Defect ã¾Æ
|
|
//Defect Stack Start
|
{
|
pReadPoint = buffer;
|
int temp;
|
|
pReadPoint = getParsingData(pReadPoint, 11, &temp);
|
pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_strCellName);
|
pReadPoint = getParsingData(pReadPoint, 5, &StackDefect.m_nDefectID);
|
pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nPosX);
|
pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nPosY);
|
|
pReadPoint = getParsingData(pReadPoint, 13, &temp);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nSize);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUmSizeX);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUmSizeY);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nDefectRScale);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_strDefectGrade);
|
pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_strDefectType);
|
|
//pReadPoint = getParsingData(pReadPoint, 47, &temp);
|
pReadPoint = getParsingData(pReadPoint, 2, &temp);
|
pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackCnt);
|
pReadPoint = getParsingData(pReadPoint, 60, &StackDefect.m_strStackStep);
|
|
vecStackDefect.push_back(StackDefect);
|
}
|
}
|
|
//For Test
|
AKLOG("Read Stack Size : %d", vecStackDefect.size());
|
|
fclose(pf);
|
|
m_vecStackDefect = vecStackDefect;
|
|
for (int i = 0; i < m_vecStackDefect.size(); i++)
|
{
|
pGrmStack = pShared->GetStackData(i);
|
pGrmStack->clear();
|
|
//Cell ID·Î idx ã±â
|
{
|
//char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
//'0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]
|
tempStr = m_vecStackDefect[i].m_strCellName.Right(2);
|
int nUpper = atoi(tempStr.Left(1));
|
nUpper *= 36;
|
|
char ctemp[2];
|
strRight = tempStr.Right(1);
|
strcpy(ctemp, strRight);
|
int nLower = static_cast<int>(ctemp[0]);
|
if (48 <= nLower && nLower <= 57)
|
nLower = 43 /* 65+26+17 */ + nLower;
|
nLower -= 65;
|
|
pGrmStack->m_nCellIdx = nUpper + nLower;
|
}
|
|
pGrmStack->m_nDefectID = m_vecStackDefect[i].m_nDefectID;
|
pGrmStack->m_nUMCenterAlignX = m_vecStackDefect[i].m_nPosX;
|
pGrmStack->m_nUMCenterAlignY = (-1)*m_vecStackDefect[i].m_nPosY;
|
pGrmStack->m_nPixelSize = m_vecStackDefect[i].m_nSize;
|
pGrmStack->m_nUMSizeX = m_vecStackDefect[i].m_nUmSizeX;
|
pGrmStack->m_nUMSizeY = m_vecStackDefect[i].m_nUmSizeY;
|
pGrmStack->m_nDefectRScale = m_vecStackDefect[i].m_nDefectRScale;
|
//Judgement
|
{
|
m_vecStackDefect[i].m_strDefectGrade.TrimLeft(" ");
|
m_vecStackDefect[i].m_strDefectGrade.TrimRight(" ");
|
if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "OK")) pGrmStack->m_DefectJudgement = Judge_OK;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RP")) pGrmStack->m_DefectJudgement = Judge_RP;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "NG")) pGrmStack->m_DefectJudgement = Judge_NG;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "TR")) pGrmStack->m_DefectJudgement = Judge_TR;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "PR")) pGrmStack->m_DefectJudgement = Judge_PR;
|
/* <KYH 211129 : #3796 ADD Start> */
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "ND")) pGrmStack->m_DefectJudgement = Judge_ND;
|
/* <KYH 211129 : #3796 ADD End> */
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "PT")) pGrmStack->m_DefectJudgement = Judge_PT;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RV")) pGrmStack->m_DefectJudgement = Judge_Review;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RC")) pGrmStack->m_DefectJudgement = Judge_RC;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "SZ")) pGrmStack->m_DefectJudgement = Judge_Size;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "VI")) pGrmStack->m_DefectJudgement = Judge_VI;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RW")) pGrmStack->m_DefectJudgement = Judge_Rework;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "UK")) pGrmStack->m_DefectJudgement = Judge_Unknown;
|
else /*if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "±×¿Ü"))*/ pGrmStack->m_DefectJudgement = Judge_OK;
|
}
|
m_vecStackDefect[i].m_strDefectType.TrimLeft(" ");
|
m_vecStackDefect[i].m_strDefectType.TrimRight(" ");
|
//Defect Type
|
{
|
if (!strcmp(m_vecStackDefect[i].m_strDefectType, "RB")) pGrmStack->m_DefectType = DefectType_RBlack;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "RW")) pGrmStack->m_DefectType = DefectType_RWhite;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "TB")) pGrmStack->m_DefectType = DefectType_TBlack;
|
else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "TW")) pGrmStack->m_DefectType = DefectType_TWhite;
|
else pGrmStack->m_DefectType = DefectType_Unknown;
|
}
|
pGrmStack->m_nStackStepCount = m_vecStackDefect[i].m_nStackCnt;
|
m_vecStackDefect[i].m_strStackStep.TrimLeft(" ");
|
m_vecStackDefect[i].m_strStackStep.TrimRight(" ");
|
strcpy(pGrmStack->m_strStackFirst, m_vecStackDefect[i].m_strStackStep.GetBuffer(0));
|
}
|
|
pShared->GetGlassData()->m_nStackNum = m_vecStackDefect.size();
|
pShared->GetGlassData()->m_bStackRead = TRUE;
|
|
AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
|
|
return TRUE;
|
}
|
|
char* CStackResultCPJT::getParsingData( char* pBuf, int nLen, CString* pOutData )
|
{
|
for(int i=nLen-1; i>=0; i--)
|
{
|
if(pBuf[i] != ' ')
|
{
|
pBuf[i+1] = 0;
|
break;
|
}
|
}
|
*pOutData = pBuf;
|
|
return &pBuf[nLen+1]; //±¸ºÐÀÚ °Ç³Ê ¶Ù¾î¼ ´ÙÀ½ ÀÐÀ» Æ÷ÀÎÆ® ³Ñ°ÜÁØ´Ù ÅÂÇö[2017/3/29]
|
}
|
|
char* CStackResultCPJT::getParsingData( char* pBuf, int nLen, int* pOutData )
|
{
|
pBuf[nLen] = 0;
|
|
*pOutData = atoi(pBuf);
|
|
return &pBuf[nLen+1]; //±¸ºÐÀÚ °Ç³Ê ¶Ù¾î¼ ´ÙÀ½ ÀÐÀ» Æ÷ÀÎÆ® ³Ñ°ÜÁØ´Ù ÅÂÇö[2017/3/29]
|
}
|
|
BOOL CStackResultCPJT::readOptionFile( char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
|
{
|
if(pFileName == NULL) pFileName = m_strConfigFile;
|
|
CakFileDB akFileDB;
|
akFileDB.openfile(pFileName);
|
|
akFileDB.getItem("Stack_Use", &m_bStackUse, 0);
|
akFileDB.getItem("Stack_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\Stack");
|
akFileDB.getItem("Stack_EquipID", m_strEquipID, "qa6500f0r03");
|
akFileDB.getItem("Stack_Param1", m_strParam1, "");
|
|
|
if(m_bStackUse && m_nThreadStackFileReadFlag == 0)//¾²·¹µå »ý¼º [±èÅÂÇö 2019/1/12]
|
{
|
_beginthread(threadStackFileRead, NULL, this);
|
}
|
return TRUE;
|
}
|
|
void CStackResultCPJT::threadStackFileRead( void* pArg )
|
{
|
CStackResultCPJT* pThis = (CStackResultCPJT*)pArg;
|
|
pThis->m_nThreadStackFileReadFlag = 1;
|
int nSleepTime = 1000;
|
int nReadFailCount = 0;
|
int nThreadCount=0;
|
CString strGlassID;
|
|
// CDitGlassRawClient GlassRawClient;
|
// if(!GlassRawClient.ConnectServer()) return;
|
// CDitGlassRawClient* pShared = &GlassRawClient;
|
|
// pShared->GetGlassData()->m_bStackRead = FALSE;
|
// pShared->GetGlassData()->m_nStackNum = 0;
|
|
while(pThis->m_nThreadStackFileReadFlag==1)
|
{
|
if(pThis->m_nProcessState == SPS_CmdFileRead) //½ºÅÃÆÄÀÏ Àб⠼öÇà [±èÅÂÇö 2019/1/12]
|
{
|
strGlassID = pThis->m_strGlassID;
|
//For test
|
//strGlassID = "HPANELID";
|
pThis->m_nProcessState = SPS_StateFileRead;
|
nThreadCount = 0;
|
nReadFailCount = 0;
|
|
AKLOG("Stack File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
|
|
//210111 CJH - Stack Read Sleep
|
Sleep(3000);
|
|
while(pThis->m_nProcessState == SPS_StateFileRead && pThis->m_nThreadStackFileReadFlag==1)
|
{
|
if((nThreadCount++ % 20) != 0) //¸í·É ¼öÇàÀ» ºü¸£°Ô °¨Áö À§ÇÑ Á¶Ä¡ [±èÅÂÇö 2019/1/12]
|
{
|
Sleep(50);
|
continue;
|
}
|
|
if(pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
|
{
|
pThis->m_nProcessState = SPS_ResultReadOK;
|
AKLOG("Stack File Read Complete ");
|
break;
|
}
|
|
nReadFailCount++;
|
AKLOG("Stack File Read Try : %d", nReadFailCount);
|
|
if(nReadFailCount>100)
|
{
|
pThis->m_nProcessState = SPS_ResultReadFail;
|
AKLOG("Stack File Read Fail ");
|
break;
|
}
|
|
Sleep(50);
|
}
|
if(pThis->m_nProcessState != SPS_ResultReadOK)
|
{
|
pThis->m_nProcessState = SPS_ResultReadFail;
|
AKLOG("Stack File Read Stop ");
|
}
|
|
|
}
|
/* < KMH 20220825 : #4278 DEL Start > */
|
// ºÒÇÊ¿ä
|
//if(nReadFailCount)
|
/* < KMH 20220825 : #4278 DEL End > */
|
|
|
Sleep(500);
|
}
|
|
pThis->m_nThreadStackFileReadFlag = 0;
|
}
|
|
BOOL CStackResultCPJT::StackFileReadStart( char* pGlassID )
|
{
|
if(m_nThreadStackFileReadFlag == 0)//¾²·¹µå »ý¼º [±èÅÂÇö 2019/1/12]
|
{
|
_beginthread(threadStackFileRead, NULL, this);
|
}
|
|
if(m_nProcessState == SPS_StateFileRead)
|
{
|
m_nProcessState = SPS_CmdFileStop;
|
while(m_nProcessState == SPS_CmdFileStop) Sleep(0);
|
}
|
|
m_strGlassID = pGlassID;
|
m_nProcessState = SPS_CmdFileRead;
|
|
return TRUE;
|
}
|
|
BOOL CStackResultCPJT::StackFileReadStop( BOOL bWait/*=TRUE*/ )
|
{
|
if(bWait == TRUE && m_nProcessState == SPS_StateFileRead)
|
{
|
m_nProcessState = SPS_CmdFileStop;
|
while(m_nProcessState == SPS_CmdFileStop) Sleep(0);
|
}
|
|
return TRUE;
|
}
|