From 4f526ffc4f2de1d019556b6e81fafeff5291a38b Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 목, 29 7월 2021 13:35:07 +0900 Subject: [PATCH] Ongoing70 #3477 CF AOI Review [BANK, OC, QD, Blue] FrameLost 현상 조치 --- DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp | 396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 396 insertions(+), 0 deletions(-) diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp new file mode 100644 index 0000000..ea5f9c5 --- /dev/null +++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp @@ -0,0 +1,396 @@ +#include "StdAfx.h" +#include "RawResultReader.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 + +CRawResultReader::CRawResultReader(void) +{ + m_nThreadStackFileReadFlag = 0; + m_nProcessState = RPS_StateIdle; + + m_strConfigFile; + { + GetModuleFileName(NULL, m_strConfigFile, MAX_PATH); + char* ext = CakFileUtil::getFileExt(m_strConfigFile); + strcpy(ext, "ini"); + } + CreateDirectory("D:\\DIT_ResultData\\RawMerge", NULL); + m_nProcessState = RPS_StateIdle; + readOptionFile(); +} + +CRawResultReader::~CRawResultReader(void) +{ + + if (m_nThreadStackFileReadFlag == 1) + { + m_nThreadStackFileReadFlag = 2; + while (m_nThreadStackFileReadFlag != 0) + { + Sleep(1); + } + } + + m_vecStackDefect.clear(); + +} + +BOOL CRawResultReader::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<_grmDefectData> vecStackDefect; + _grmDefectData 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; + + if (strlen(buffer) <= 0 || pStr == NULL) + break; + + if (strncmp(buffer, "DATA DEFECT", 10)) continue; + + //Defect Stack Start + { + pReadPoint = buffer; + int temp; + CString strtemp; + + pReadPoint = getParsingData(pReadPoint, 4, &temp); + pReadPoint = getParsingData(pReadPoint, 6, &temp); + pReadPoint = getParsingData(pReadPoint, 12, &strtemp); + + + //Cell ID로 idx 찾기 + { + tempStr = strtemp.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; + + StackDefect.m_nCellIdx = nUpper + nLower; + } + + + pReadPoint = getParsingData(pReadPoint, 5, &temp); + pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignX); + pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignY); + StackDefect.m_nUMCenterAlignY = StackDefect.m_nUMCenterAlignY*-1; + pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellGate); + pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellData); + pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nPixelSize); + 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, &strtemp); //StackDefect.m_DefectJudgement + if (strtemp == "OK") + StackDefect.m_DefectJudgement = Judge_OK; + else if (strtemp == "TR") + StackDefect.m_DefectJudgement = Judge_TR; + else if (strtemp == "PR") + StackDefect.m_DefectJudgement = Judge_PR; + else + StackDefect.m_StackInfo = Stack_Unknown; + + pReadPoint = getParsingData(pReadPoint, 4, &strtemp); + strncpy(StackDefect.m_strDefectCode, strtemp.GetBuffer(0), 4+1); // Null 문자 떄문에 +1 + pReadPoint = getParsingData(pReadPoint, 2, &strtemp); + if (strtemp == "UK") + StackDefect.m_StackInfo = Stack_Unknown; + else if (strtemp == "TD") + StackDefect.m_StackInfo = Stack_TD; + else if (strtemp == "SD") + StackDefect.m_StackInfo = Stack_SD; + else if (strtemp == "PD") + StackDefect.m_StackInfo = Stack_PD; + else if (strtemp == "SP") + StackDefect.m_StackInfo = Stack_SP; + else + StackDefect.m_StackInfo = Stack_Unknown; + + pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackStepCount); + pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst + strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60); + pReadPoint = getParsingData(pReadPoint, 16, &strtemp); // ReviewImageName m_strRevImageName + pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용 + pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용 + pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneNum m_sZonePixelCount[i] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSizeType + if (strtemp == "S") + StackDefect.m_DefectSizeType = SizeType_Small; + else if (strtemp == "M") + StackDefect.m_DefectSizeType = SizeType_Mid; + else if (strtemp == "L") + StackDefect.m_DefectSizeType = SizeType_Large; + else if (strtemp == "H") + StackDefect.m_DefectSizeType = SizeType_Huge; + else if (strtemp == "U") + StackDefect.m_DefectSizeType = SizeType_Ultra; + else + StackDefect.m_DefectSizeType = SizeType_Small; + + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSubType + if (strtemp == "MC") + StackDefect.m_DefectSubType = DefectSubType_MC; + else if (strtemp == "MD") + StackDefect.m_DefectSubType = DefectSubType_Mask; + else if (strtemp == "CD") + StackDefect.m_DefectSubType = DefectSubType_Common; + else if (strtemp == "NO") + StackDefect.m_DefectSubType = DefectSubType_NoDefect; + else if (strtemp == "N") + StackDefect.m_DefectSubType = DefectSubType_Normal; + else + StackDefect.m_DefectSubType = DefectSubType_Normal; + + pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[1] + pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[3] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//미사용 + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMin);//m_nLevelSrcMin + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMax);//m_nLevelSrcMax + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcAvg);//m_nLevelSrcAvg + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_sDefectPeak);//m_sDefectPeak + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_strWsi_3DImageFilename + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_strAoiImageName + strncpy(StackDefect.m_strAoiImageName, strtemp.GetBuffer(0), 12); + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nScanIdx);//m_nScanIdx + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCameraID);//m_nCameraID + pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_nDefectIdx + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMin);//m_nLevelRefMin + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMax);//m_nLevelRefMax + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefAvg);//m_nLevelRefAvg + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[4] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[5] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[6] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_nHliLayers + StackDefect.m_nHliLayers = 0; + { + CString resToken; + int curPos = 0, idx = 0; + resToken = strtemp.Tokenize(_T(","), curPos); + while (resToken != "") + { + int nShiftCnt = atoi(resToken); + StackDefect.m_nHliLayers = StackDefect.m_nHliLayers +( 1 << nShiftCnt ); + resToken = strtemp.Tokenize(_T(","), curPos); + } + } + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCompact);//m_nCompact + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nThickness);//m_nThickness + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMajor);//m_nMajor + pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMinor);//m_nMinor + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[0] + pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectType + if (strtemp == "RB") + StackDefect.m_DefectType = DefectType_RBlack; + else if (strtemp == "RW") + StackDefect.m_DefectType = DefectType_RWhite; + else if (strtemp == "TB") + StackDefect.m_DefectType = DefectType_TBlack; + else if (strtemp == "TW") + StackDefect.m_DefectType = DefectType_TWhite; + else if (strtemp == "UN") + StackDefect.m_DefectType = DefectType_Unknown; + else + StackDefect.m_DefectType = DefectType_Unknown; + + vecStackDefect.push_back(StackDefect); + } + } + + AKLOG("Read RawMerge Size : %d", vecStackDefect.size()); + + fclose(pf); + + m_vecStackDefect = vecStackDefect; + + for (int i = 0; i < m_vecStackDefect.size(); i++) + { + pGrmStack = pShared->GetRawMergeData(i); + pGrmStack->clear(); + memcpy(pGrmStack, &m_vecStackDefect[i], sizeof(_grmDefectData)); + } + + pShared->GetGlassData()->m_nRawMergeNum = m_vecStackDefect.size(); // RawMerge + pShared->GetGlassData()->m_bRawMergeRead = TRUE; + + AKLOG("Import Vector Size : %d", m_vecStackDefect.size()); + return TRUE; +} + +char* CRawResultReader::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]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 + +} + +char* CRawResultReader::getParsingData(char* pBuf, int nLen, short* pOutData) +{ + + pBuf[nLen] = 0; + *pOutData = atoi(pBuf); + + return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 +} + +char* CRawResultReader::getParsingData(char* pBuf, int nLen, int* pOutData) +{ + + pBuf[nLen] = 0; + *pOutData = atoi(pBuf); + + return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 +} + +BOOL CRawResultReader::readOptionFile(char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/) +{ + if (pFileName == NULL) pFileName = m_strConfigFile; + + CakFileDB akFileDB; + akFileDB.openfile(pFileName); + + akFileDB.getItem("RawMerge_Use", &m_bStackUse, 0); + akFileDB.getItem("RawMerge_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\RawMerge"); + + if (m_bStackUse && m_nThreadStackFileReadFlag == 0) + { + _beginthread(threadResultFileRead, NULL, this); + } + return TRUE; +} + +void CRawResultReader::threadResultFileRead(void* pArg) +{ + CRawResultReader* pThis = (CRawResultReader*)pArg; + + pThis->m_nThreadStackFileReadFlag = 1; + int nReadFailCount = 0; + int nThreadCount = 0; + CString strGlassID; + + while (pThis->m_nThreadStackFileReadFlag == 1) + { + if (pThis->m_nProcessState == RPS_CmdFileRead) //스택파일 읽기 수행 [김태현 2019/1/12] + { + strGlassID = pThis->m_strGlassID; + + pThis->m_nProcessState = RPS_StateFileRead; + nThreadCount = 0; + nReadFailCount = 0; + + AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID); + Sleep(3000); + while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1) + { + if ((nThreadCount++ % 20) != 0) //명령 수행을 빠르게 감지 위한 조치 + { + Sleep(50); + continue; + } + if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE) + { + pThis->m_nProcessState = RPS_ResultReadOK; + AKLOG("RawMerge File Read Complete "); + break; + } + + nReadFailCount++; + AKLOG("RawMerge File Read Try : %d", nReadFailCount); + + if (nReadFailCount > 10) + { + pThis->m_nProcessState = RPS_ResultReadFail; + break; + } + + Sleep(50); + } + if (pThis->m_nProcessState != RPS_ResultReadOK) + { + pThis->m_nProcessState = RPS_ResultReadFail; + } + } + if (nReadFailCount) + Sleep(500); + } + + pThis->m_nThreadStackFileReadFlag = 0; +} + +BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID) +{ + if (m_nThreadStackFileReadFlag == 0) + { + _beginthread(threadResultFileRead, NULL, this); + } + + if (m_nProcessState == RPS_StateFileRead) + { + m_nProcessState = RPS_CmdFileStop; + while (m_nProcessState == RPS_CmdFileStop) Sleep(0); + } + + m_strGlassID = pGlassID; + m_nProcessState = RPS_CmdFileRead; + + return TRUE; +} + +BOOL CRawResultReader::RawMergeFileReadStop(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