From 6e0a9dd083fae3138418444eb783e99509bb522b Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 금, 09 7월 2021 12:02:49 +0900 Subject: [PATCH] Merge branch 'feature/#3486_CF_AOI_Review_Review_History_프로그램_테스트_및_적용' into feature/#3495_CF_AOI_Review(QD,_Blue)_GlassLoading_시_다운_현상_조치 --- ReviewHistory/ReveiwHistory/StackResultCPJT.cpp | 337 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 337 insertions(+), 0 deletions(-) diff --git a/ReviewHistory/ReveiwHistory/StackResultCPJT.cpp b/ReviewHistory/ReveiwHistory/StackResultCPJT.cpp new file mode 100644 index 0000000..cc904f5 --- /dev/null +++ b/ReviewHistory/ReveiwHistory/StackResultCPJT.cpp @@ -0,0 +1,337 @@ +#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; +} -- Gitblit v1.9.3