#include "StdAfx.h" #include "StackResultCPJT.h" #include "akLoggerExt.h" #include "akCore/akFileDB.h" #include #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(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; /* */ else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "ND")) pGrmStack->m_DefectJudgement = Judge_ND; /* */ 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 "); } } if(nReadFailCount) 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; }