From 9aa3a8ff940e89bb0b5c75bc8abd0864e4c85874 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 화, 17 8월 2021 10:00:15 +0900
Subject: [PATCH] 이전 머지간 누락된 코드 삽입

---
 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