»õ ÆÄÀÏ |
| | |
| | | #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; |
| | | |
| | | CDitGlassRawClient GlassRawClient; |
| | | GlassRawClient.ConnectServer(); |
| | | CDitGlassRawClient* pShared = &GlassRawClient; |
| | | |
| | | _grmDefectData* pGrmStack; |
| | | |
| | | strFileName.Format("%s\\%s", m_strLocalPath, pGlassID); |
| | | |
| | | FILE* pf = fopen(strFileName.GetBuffer(0), "r"); |
| | | |
| | | if(pf == NULL) |
| | | return FALSE; |
| | | |
| | | 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; |
| | | 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 /*= "C:\\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; |
| | | } |