From c220de6f70051797e9d8b371830d06def9dc9cbd Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 목, 30 6월 2022 11:02:23 +0900
Subject: [PATCH] 검사기 RawMessenger 동기화

---
 ReviewSystem/ReviewSystem/SequenceProcessor.cpp            |    1 
 ReviewHistory/ReveiwHistory/DitGlassRawStruct.h            |    5 
 DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h  |  787 +++++++++++++++++++++++++++++++++++++++++
 ReviewSystem/ReviewSystem/DitGlassRawStruct.h              |    5 
 ReviewSystem/ReviewSystem/SequenceProcessor.h              |    3 
 ReviewSystem/ReviewSystem/ReviewInterface.cpp              |  238 +++++++++--
 ReviewHistory/bin/ReviewHistroy.exe                        |    0 
 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp       |   10 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp |   34 +
 DitGlassRawMessenger/Extern/DitGlassRawStruct.h            |    5 
 10 files changed, 1,027 insertions(+), 61 deletions(-)

diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
index 8a1aa61..2055277 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -587,14 +587,32 @@
 	CString strValue;
 	/*< KJG 20211229 - #3846 MOD Start >*/
 	//strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT";
+/* < KMH 20220613 : #3957 MOD Start > */
 	/* <LJC 20220425 : #3957 MOD Start> */
-	strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea
+	// strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea
+	strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea
+	for (int i = 0; i < RAW_CODE_MAX; i++)
+	{
+		CString strDefectCode = pGlassData->m_strRawDefectCode[i];
+		if (strDefectCode == "") { strDefectCode = "*"; }
+		strValue += " " + strDefectCode;
+	}
 	/* <LJC 20220425 : #3957 MOD End> */
+/* < KMH 20220613 : #3957 MOD End > */
 	/*< KJG 20211229 - #3846 MOD End >*/
 	strLine += strValue; strLine += "\n";
+/* < KMH 20220614 : #3957 MOD Start > */
 	/* <LJC 20220425 : #3957 MOD Start> */
-	strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */
-		/* <LJC 20220425 : #3957 MOD End> */
+	//strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */
+	strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //56ea
+	for (int i = 0; i < RAW_CODE_MAX; i++)
+	{
+		CString strDefectCode = pGlassData->m_strRawDefectCode[i];
+		if (strDefectCode == "") { strDefectCode = "*"; }
+		strValue += " " + strDefectCode;
+	}
+	/* <LJC 20220425 : #3957 MOD End> */
+/* < KMH 20220614 : #3957 MOD End > */
 	strLine += strValue; strLine += "\n";
 	strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea    
 	strLine += strValue;
@@ -1036,7 +1054,10 @@
 	SPRINTRAW(8, "SUBPANEL");
 	// 03 12 SUBPANELID			// Subpanel ID
 	//SPRINTRAW(12, "%d", pCellData->m_nCellID);
-	SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
+	/* < KMH 20220609 : #4183 MOD Start > */
+	//SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
+	SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pCellData->m_strCellName);
+	/* < KMH 20220609 : #4183 MOD End > */
 	
 	// 湲��씪�뒪 �썝�젏 湲곗� Y醫뚰몴 諛섎� 
 	// 肄붾꼫而� 湲곗��쑝濡� 寃곌낵�뙆�씪 醫뚰몴媛� �깮�꽦�릺�뒗�뜲 怨좉컼�궗�뿉 紐낇솗�븳 �솗�씤 �븘�슂
@@ -1191,7 +1212,10 @@
 	// 02   6    DEFECT			// DEFECT
 	SPRINTRAW(6, "DEFECT");
 	// 03   12   ID				// Subpanel ID
-	SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
+	/* < KMH 20220609 : #4183 MOD Start > */
+	//SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
+	SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pDefectData->m_strCellName);
+	/* < KMH 20220609 : #4183 MOD End > */
 	// 04   5    DEF_NO			// Defect Number of Panel
 	// RAW �뙆�씪�슜 Defect Index 
 	//SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx);
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
index d7fc000..58cf38c 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -222,6 +222,10 @@
 	/* < KJG 20220225 - #3850 ADD Start >*/ 
 	char m_strRawMergeStepID[32];
 	/* < KJG 20220225 - #3850 ADD End >*/
+
+	/* < KMH 20220614 : #3957 ADD Start > */
+	char m_strRawDefectCode[RAW_CODE_MAX][5];	// 4글자만 표기
+	/* < KMH 20220614 : #3957 ADD End > */
 };
 struct _grmBlockData
 {
@@ -479,6 +483,7 @@
 	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
 	short			m_nModelIdx;				// 몇 번째 모델인가?
 	short			m_nCellIdx;					// 몇번째 셀인가?
+	char			m_strCellName[32];			// 셀 이름							/* < KMH 20220609 : #4183 ADD  > */
 	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
 	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
 	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h
new file mode 100644
index 0000000..d7fc000
--- /dev/null
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h
@@ -0,0 +1,787 @@
+#pragma once
+
+#define SHAREDMEMNAME_BASICINFO _T("DIT.GLASSRAWSYSTEM.SHAREDMEM.BASICINFO")
+#define SHAREDMEMNAME_GLASSDATA	_T("DIT.GLASRAWSYSTEM.SHAREDMEM.GLASSDATA")
+#define MUTEX_RAWMESSENGER		_T("MUTEX_RAWMESSENGER_IPC")
+
+#define COMMAND_MAXCOUNT 8
+
+#define RAWMESSENGER_MAXCAMNUM 30
+#define RAWMESSENGER_MAXSCANNUM 20
+#define RAWMESSENGER_MAXHLINUM 8
+#define RAW_CODE_MAX 10
+
+#define MAX_ZONE_NUM 16
+
+namespace ditRaw
+{
+	enum ReviewPlanType
+	{
+		RPT_Review = 0,
+		RPT_User,
+		RTP_WSI,
+		RTP_PlanMeasure,
+		RTP_Reflow,
+		RTP_WsiReflow,
+		RTP_UserWsi,
+		RPT_AOICustom = 1000,
+	};
+};
+enum emAOIProcStep
+{
+	APS_None = 0,
+
+	//AOI
+	APS_GlassLoading, 
+	APS_InspectEnd,
+	//Review
+	APS_CustomReviewRead,
+	APS_ReviewStart,
+	APS_ReviewEnd,
+
+	RPS_StepNum
+};
+
+struct _grmGlassData
+{
+	void clear()
+	{
+		memset(this, 0, sizeof(_grmGlassData));
+	}
+
+	//Glass 정보
+	char m_strFileName[64];
+	char m_strPath[256];
+
+	int m_nCellNum;
+	int m_nDefectNum;
+
+	int m_nOriginDirection;				//{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
+	int m_nConerCutDirection;
+	int	m_nScanCoordinateY;				//여기가 0이면 일반, 1이면 Scan방향이 y축(즉 scan방향이 단축, offline 설비 같은)
+
+	int m_nGlassSizeWidth;
+	int m_nGlassSizeHeight;
+    /* <KYH 211129 : #3796 ADD Start> */
+	int			m_nDefectNumJudgeND;
+	/* <KYH 211129 : #3796 ADD End> */
+	//DUMY DATA
+	int			Dumy_int[9];
+
+	//설비정보
+	char m_strLine[32];
+	char m_strEquipType[32];			
+	char m_strEquipID[32];				
+	char m_strStepID[32];			
+	char m_strOperID[32];				
+
+	CTime	m_tmGlassLoading;			//3. START_TIME
+	CTime	m_tmInspectionStart;			//3. START_TIME
+	CTime	m_tmInspectionEND;			//4. END_TIME
+	CTime	m_tmReviewLoading;
+	CTime	m_tmReviewEnd;
+
+	//기본 물류정보
+	char m_strGlassID[32];				//Glass ID
+	char m_strPPID[32];					
+	char m_strEPPID[32];				
+	char m_strLotID[32];				//LOT_ID
+	char m_strSLotID[32];				//SLOT_ID
+	char m_strRecipeName[32];			//RECIPE_NAME								
+	char m_strGlassJudge[32];			//GLASS_JUDGE
+	char m_strGlassCode[32];			//Grade or Code
+	char m_strProductID[16];			//4. PRODUCT_ID
+
+	//VCR
+	int m_nVcrResultCode;
+	char m_strVCRResult[32];
+	char m_strVCRGlassID[32];
+
+
+	//결함 갯수 관리 변수
+	int			m_nDefectNumSizeSmall;
+	int			m_nDefectNumSizeMid;
+	int			m_nDefectNumSizeLarge;
+	int			m_nDefectNumSizeHuge;
+	int			m_nDefectNumSizeUltra;
+
+	int			m_nDefectNumLocActive;
+	int			m_nDefectNumLocPad;
+	int			m_nDefectNumLocCrack;
+	int			m_nDefectNumLocBM;
+
+	int			m_nDefectNumTypeTB;
+	int			m_nDefectNumTypeTW;
+	int			m_nDefectNumTypeRB;
+	int			m_nDefectNumTypeRW;
+	int			m_nDefectNumTypeMD;
+	int			m_nDefectNumTypeCD;
+	int			m_nDefectNumTypeMC;
+	/* <LJC 20220422 : #3957 ADD Start> */
+	int			m_nDefectCode[RAW_CODE_MAX];
+	/* <LJC 20220422 : #3957 ADD End> */
+
+	int			m_nDefectNumJudgeOKWhite;
+	int			m_nDefectNumJudgeOKBlack;
+	int			m_nDefectNumJudgeNG;
+	int			m_nDefectNumJudgeRW;
+	int			m_nDefectNumJudgeRP;
+	int			m_nDefectNumJudgeRV;
+	int			m_nDefectNumJudgeTR;
+	int			m_nDefectNumJudgePR;
+	/*< LHS 20211029 - #3783 MOD Start >*/
+	int			m_nDefectNumJudgeLine;
+	/*< LHS 20211029 - #3783 MOD End >*/
+	int			m_nDefectNumStackTD;
+	int			m_nDefectNumStackSD;
+	int			m_nDefectNumStackPD;
+	int			m_nDefectNumStackSP;
+
+
+	//카메라/스캔 정보 [김태현 2018/12/5]
+	short		m_nCameraNum;
+	short		m_nScanNum;
+	unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];		
+	unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
+	unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
+
+	//얼라인 정보 um[김태현 2018/12/10]
+	double	m_nAlignCcdTheta;
+	double	m_nAlignCcdShitftX;
+	double	m_nAlignCcdShitftY;
+	double	m_nAlignPreTheta;
+	double	m_nAlignPreShitftX;
+	double	m_nAlignPreShitftY;
+	double	m_nAlignBasicTheta;
+	double	m_nAlignBasicShitftX;
+	double	m_nAlignBasicShitftY;
+	char	m_strAlignFirst[64];
+	char	m_strAlignSecond[64];
+// 	char	m_strAlignPath[256];
+
+	//CSOT용 물류 정보 [김태현 2018/12/5]
+	char m_strCassetteSequenceNo[16];
+	char m_strOwnerCode[16];			//2. OWNER_CODE
+	char m_strOwnerType[16];			//3. OWNER_TYPE
+
+	char m_strProcessID[21];			//5. PROCESS_ID
+	char m_strProductGroup[16];			//6. PRODUCT_GROUP
+	char m_strCSTID[16];				//8. CST_ID
+	char m_strPreProcessID[16];			//10.PRE_PROCESS_ID
+	char m_strPreEQPID[16];				//11.PRE_EQP_ID
+	char m_strPreChamerID[16];			//12.PRE_CHAMBER_ID
+	char m_strPreRecipeID[32];			//13.PRE_RECIPE_ID
+	char m_strGroupID[16];				//14.GROUP_ID
+	char m_cAutoSampleFlag;				//15.AUTOSAMPLEFLAG
+
+	// CPRJ용 물류 정보
+	char m_strProdType[3];
+	char m_strBatchID[13];
+	char m_strPairHPanelID[13];
+	char m_strGlassThickNess[2];
+	char m_strCompCount[2];
+	char m_strGlassState[2];
+	char m_strInsFlag[2];
+	char m_strPanelPosition[2];
+	char m_strFlowHistory[2];
+	char m_strCount1[2];
+	char m_strCount2[2];
+	char m_StrMergeList[10][12];
+	//Mura Data 0412 nwh
+	char m_strMaxAvgGray[12];
+	char m_strMaxPortion[12];
+
+
+     //1226NWH
+	char m_strReadingFlag[2]; 
+	BYTE m_nUniqueID[4];
+	int m_nSlot_No; 
+
+	BYTE m_nGlassDataBitSignal[4];
+	bool m_bJob_end;  
+
+	//201217 CJH - 찍은 Defect Review 개수
+	int m_nReviewNum;
+	//201221 CJH - 파싱한 Stack 결과
+	int m_nStackNum;
+	BOOL m_bStackRead;
+
+	/*< KJG 20211024 - #3487 ADD Start >*/
+	int m_nRawMergeNum;
+	BOOL m_bRawMergeRead;
+	/*< KJG 20211024 - #3487 ADD End >*/
+	//210203 CJH - CutOff 대상 결함 수
+	int m_nCutOffDefectNum;
+	//210323 CJH - Server/Frame Shrink 정보 추가
+	char m_strShrinked[6];
+	//210326 CJH - RAW 입력 Defect 수량 상한 사용여부
+	BOOL m_bRawCutoff;
+	//210907 KJG - EdgeCrack 검사 사용 유무
+	BOOL m_bEdgeCrackUse;
+	BOOL m_bRawMergeUse;
+	/* < KJG 20220225 - #3850 ADD Start >*/ 
+	char m_strRawMergeStepID[32];
+	/* < KJG 20220225 - #3850 ADD End >*/
+};
+struct _grmBlockData
+{
+	void clear()
+	{
+		memset(this, 0, sizeof(_grmBlockData));
+	}
+	char m_strBlockID[16];				//1. BLOCK_ID
+	char m_cBlockJudgeAOI;				//2. BLOCK_JUDGE_AOI
+	char m_cBlockJudgeATS;				//4. BLOCK_JUDGE_ATS
+	char m_cBlockJudgeTEG;				//5. BLOCK_JUDGE_TEG
+	int m_nGlassIdDCR;					//22. GLASS_ID_DCR
+};
+struct _grmCellData
+{
+	void clear()
+	{
+		memset(this, 0, sizeof(_grmCellData));
+	}
+	int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
+	int						m_nCellID;							//1. PANEL_ID
+	short					m_nModelIdx;				// 몇 번째 모델인가?
+
+	char					m_strCellName[32];
+	int						m_rectCellLeft;
+	int						m_rectCellTop;
+	int						m_rectCellRight;
+	int						m_rectCellBottom;
+
+	int/*Judgement*/		m_nJudgement;
+	int						m_nJudgeFlag;
+	int						m_nJudgeGlade;
+
+
+	//결함 갯수 관리 변수
+	int			m_nDefectNumSizeSmall;
+	int			m_nDefectNumSizeMid;
+	int			m_nDefectNumSizeLarge;
+	int			m_nDefectNumSizeHuge;
+	int			m_nDefectNumSizeUltra;
+
+	int			m_nDefectNumLocActive;
+	int			m_nDefectNumLocPad;
+	int			m_nDefectNumLocCrack;
+	int			m_nDefectNumLocBM;
+
+	int			m_nDefectNumTypeTB;
+	int			m_nDefectNumTypeTW;
+	int			m_nDefectNumTypeRB;
+	int			m_nDefectNumTypeRW;
+	int			m_nDefectNumTypeMD;
+	int			m_nDefectNumTypeCD;
+	int			m_nDefectNumTypeMC;
+	/* <KYH 211129 : #3796 ADD Start> */
+	int			m_nDefectNumJudgeND;
+	/* <KYH 211129 : #3796 ADD End> */
+	/* <LJC 20220422 : #3957 ADD Start> */
+	int			m_nDefectCode[RAW_CODE_MAX];
+	/* <LJC 20220422 : #3957 ADD End> */
+	//DUMY DATA
+	int			Dumy_int[9];
+
+	//Mura Data nwh 0404 
+	char		m_strProImage[32];
+	char		m_strAvgGray_0[12];
+	char		m_strPortion_0[12];
+	//kyh Mura Data 추가 0622
+	char		m_strCorner_Gray_0[12];
+	char		m_strAvgAmp_0[12];
+	char		m_strFFTVar_0[12];
+	char		m_strFFTVah_0[12];
+	char		m_strFFTVaq_0[12];
+	char		m_strFFTPK_0[12];
+
+	char		m_strAvgGray_1[12];
+	char		m_strPortion_1[12];
+	//kyh Mura Data 추가 0622
+	char		m_strCorner_Gray_1[12];
+	char		m_strAvgAmp_1[12];
+	char		m_strFFTVar_1[12];
+	char		m_strFFTVah_1[12];
+	char		m_strFFTVaq_1[12];
+	char		m_strFFTPK_1[12];
+
+	char		m_strAvgGray_2[12];
+	char		m_strPortion_2[12];
+	//kyh Mura Data 추가 0622
+	char		m_strCorner_Gray_2[12];
+	char		m_strAvgAmp_2[12];
+	char		m_strFFTVar_2[12];
+	char		m_strFFTVah_2[12];
+	char		m_strFFTVaq_2[12];
+	char		m_strFFTPK_2[12];
+
+	char		m_strAvgGray_3[12];
+	char		m_strPortion_3[12];
+	//kyh Mura Data 추가 0622
+	char		m_strCorner_Gray_3[12];
+	char		m_strAvgAmp_3[12];
+	char		m_strFFTVar_3[12];
+	char		m_strFFTVah_3[12];
+	char		m_strFFTVaq_3[12];
+	char		m_strFFTPK_3[12];
+
+	int			m_nDefectNumJudgeOKWhite;
+	int			m_nDefectNumJudgeOKBlack;
+	int			m_nDefectNumJudgeNG;
+	int			m_nDefectNumJudgeRW;
+	int			m_nDefectNumJudgeRP;
+	int			m_nDefectNumJudgeRV;
+	int			m_nDefectNumJudgeTR;
+	int			m_nDefectNumJudgePR;
+	/*< LHS 20211029 - #3783 MOD Start >*/
+	int			m_nDefectNumJudgeLine;
+	/*< LHS 20211029 - #3783 MOD End >*/
+	int			m_nReflowResult[8];			// 0: Reflow X 1: Reflow OK 2: Reflow NG
+
+	// Filtering된 Stack별 수
+	int			m_nDefectTDCount;
+	int			m_nDefectSDCount;
+	int			m_nDefectPDCount;
+	int			m_nDefectSPCount;
+
+	// Gate/Data 총 갯수
+	int			m_nGateNum;
+	int			m_nDataNum;
+
+	// 210129 CJH - Cell Origin 방향
+	int			m_nCellXDir;
+	int			m_nCellYDir;
+};
+
+struct _grmDefectReviewData
+{
+	void clear()
+	{
+		memset(this, 0, sizeof(_grmDefectReviewData));
+	}
+
+	//////////////////////////////////////////////////////////////////////////
+	//여기서 부터 리뷰 영역 [김태현 2019/1/19]
+	ditRaw::ReviewPlanType			m_nPlanType	;	
+	int			m_nResultCode;  //0:None, 1:Success
+	int			m_nShotIndex; //리뷰 찍은 순번 [김태현 2018/12/5]
+	int			m_nModuleIndex;
+	int			m_nMagnificIndex;
+	float		m_fManification;
+	float		m_fManificResoultion;
+	char		m_strRevImageName[256];
+	char		m_strRevImagePath[256];
+
+	//////////////////////////////////////////////////////////////////////////
+	// Measure 영역
+	int			m_nMeasure_Index;
+	int			m_nMeasure_ResultCode; //0:None, 1:Success
+	float		m_fMesure_ResultData[8];	// 0:Type, 1:ShiftX, 2:ShiftY
+
+	//////////////////////////////////////////////////////////////////////////
+	// WSI영역
+	int			m_nWsi_ResultCode; //0:None, 1:Success
+	int			m_nWsi_Type;									// 함몰 / 돌기
+	float		m_fWsi_ResultData[8];			// 0:Type, 1:Height(um), 2:Width
+	char		m_strWsi_2DImageFilename[256];
+	char		m_strWsi_3DImageFilename[256]; 
+	int			m_nWsiReflowPositionIndex;					// WsiReflowPositionIndex
+	int			m_nWsi_pReflowResultData[8];
+	double		m_dWsi_DamDistance;
+
+	double		m_dWsiMmMotorX;								// WSI 모터 좌표 20180223 HJH
+	double		m_dWsiMmMotorY;
+	float		m_fWsiManification;							// WSI 배율
+
+	//////////////////////////////////////////////////////////////////////////
+	// Reflow 영역	
+	int			m_nReflow_Index;
+	int			m_nReflow_ResultCode; //0:None, // 검출한 Line의 개수. 3 미만 : DAM2 Reflow 판정, 4~5 : DAM1 Reflow 판정, 6 : no Reflow 판정 / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
+	float		m_fReflow_LinePosData[8];	
+	int			m_nReflow_Side;
+	int			m_nReflow_InspectionMode;
+};
+
+struct _grmDefectData
+{
+	void clear()
+	{
+		memset(this, 0, sizeof(_grmDefectData));
+	}
+
+	short			m_nDefectID;
+	short			m_nCameraID;
+	short			m_nScanIdx;
+	//short			m_nDefectIdx;				// 카메라에서의 결함 인덱스
+	int				m_nDefectIdx;				// 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경
+
+	int				m_nPixelConv;				// pixel 단위 좌표
+	int				m_nPixelScan;				// pixel 단위 좌표
+
+	short							m_nPixelSize;				// 결함크기		---------------------------------PS
+	short/*SERVER_DefectType*/		m_DefectType;				// 결함 타입	---------------------------------DT
+	short/*SERVER_DefectSubType*/	m_DefectSubType;			// 결함의 판정상태.
+	short/*SERVER_DefectBDType*/	m_DefectBDType;				// 결함 타입 - Bright, Dark, Both
+
+	short			m_sPixelWidth;				// 픽셀단위 결함 너비
+	short			m_sPixelHeight;				// 픽셀단위 결함 높이
+	short			m_nLevelSrcMin;				// 결함 밝기 Min	-----------------------------SN
+	short			m_nLevelSrcMax;				// 결함 밝기 Max	-----------------------------SX
+	short			m_nLevelSrcAvg;				// 결함 밝기 Avg	-----------------------------SA
+	short			m_nLevelRefMin;				// 비교대상 밝기 Min	-------------------------RN
+	short			m_nLevelRefMax;				// 비교대상 밝기 Max	-------------------------RX
+	short			m_nLevelRefAvg;				// 비교대상 밝기 Avg	-------------------------RA
+	short			m_nLevelDiffMin;			// 비교차 Min	---------------------------------DN
+	short			m_nLevelDiffMax;			// 비교차 Max	---------------------------------DX
+	short			m_nLevelDiffAvg;			// 비교차 Avg	---------------------------------DA
+
+	int				m_nDefectRScale;			// 픽셀단위 결함 높이	-------------------------RS
+	short			m_sThreshold;				// 결함을 검출할 때의 Threshold
+	short			m_sThresholdAvg;			// 결함을 검출할 때의 Threshold AVG
+	short			m_sDefectPeak;				// 결함의 Peak.
+	short			m_sDefectLevel;				// (DiffAvg - Th) BOE 8G 요청사항
+
+	int				m_nPixelGlassStart;			// Glass 시작 픽셀
+	short			m_sDefectLoc;
+
+	short			m_sZoneClassPixelCount[16];
+	short			m_sZonePixelCount[16];	// Zone별 결함 Pixel 수
+	short			m_sZoneValueMin[16];	// Zone별 결함 Min
+	short			m_sZoneValueMax[16];	// Zone별 결함 Max
+	short			m_sZoneValueAvg[16];	// Zone별 결함 Avg
+	short			m_sZonePixelPercent[16];	// --------------------------------------Z0~ZF
+
+	//210127 CJH - Zone별 Source Gray 입력
+	short			m_sZoneValueSrcMin[16];	// Zone별 Source Min
+	short			m_sZoneValueSrcMax[16];	// Zone별 Source Max
+	short			m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
+
+	int				m_nUMOriginX;				// um단위 x좌표 (원점기준)
+	int				m_nUMOriginY;				// um단위 y조표 (원점기준)
+	int				m_nUMCenterAlignX;			// um단위 X좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterAlignY;			// um단위 Y좌표 (Glass Center 기준, 얼라인보정 후)
+	int				m_nUMCenterX;				// um단위 X좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMCenterY;				// um단위 Y좌표 (Glass Center 기준, 얼라인보정 전)
+	int				m_nUMSizeX;					// um단위 X 크기	-----------------------------UX
+	int				m_nUMSizeY;					// um단위 Y 크기	-----------------------------UY
+	int				m_nUMSize;					// um단위 크기.
+	CRect			m_RectUM;					// 디펙 센터 기준 사각형.
+
+	short/*SERVER_DefectSizeType*/	m_DefectSizeType;			// 결함 크기 종류enum SERVER_DefectSizeType		{ SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
+	short/*SERVER_DefectPeakType*/	m_DefectPeakType;			// Peak의 종류.
+	short/*Judgement*/				m_DefectJudgement;			// 결함 판정.
+	BOOL					m_bDefectCutoff;			// 컷 오프 디펙(TRUE= Cutoff, FALSE)
+	short/*MAP16_DefectClass*/		m_DefectClass;				// BOE Defect Class 16등분 구분
+	int				m_nPadRegionIdx;			// PAD 영역 인덱스
+
+	int				m_nUMCellX;					// 셀 원점 기준 x 좌표
+	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
+	short			m_nModelIdx;				// 몇 번째 모델인가?
+	short			m_nCellIdx;					// 몇번째 셀인가?
+	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
+	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
+	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
+	short			m_nCellDataAlign;			// 셀별 Data라인(얼라인 보정 후)
+
+	int				m_nUMShotX;					// 샷 기준 X좌표
+	int				m_nUMShotY;					// 샷 기준 Y좌표
+	short			m_nMaskDefectIdx;			// 한 Glass에서 발견된 마스크결함 묶음의 인덱스.
+	short			m_nShotIdx;					// 노광샷 번호
+	short			m_nMatchShotCount;			// 동일한 마스크 결함의 수.
+	short			m_nMatchMaxSize;			// 동일한 마스크 중 가장 큰 결함의 크기.
+
+	short			m_nRepeatCount;				// 연속결함발견위한 동일좌표 반복수
+	short			m_nMaskRepeatCount;
+	int				m_StackInfo;				// Stack Flag
+	BOOL			m_bRealStack;				// Stack 머지에 의한 TD(TRUE) 인지, 필터링에 의한 TD(FALSE)구분할 수 있다.
+	short			m_nStackStepCount;			// Stack 수
+	short			m_nStackColorIdx;			// Color를 선택하는 인덱스.
+	//CString			m_strStackStep[CFDEFECT_STACKCOUNT];			// Stack Step.
+	char			m_strStackFirst[60];			// Stack Step. //201221 CJH - 최대 사이즈 60bytes
+	char			m_strUnitID[16];				// 유닛아이디
+
+	int				m_ClassificationType;				// enum ClassificationType			{ ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
+	int				m_nAtomWidth;				// TFE 핵 너비
+	int				m_nAtomHeight;				// TFE 핵 높이
+	short/*ReKind*/			m_DefectKind;				// 결함 종류
+
+	char			m_strDefectCode[32];			// Defect Code
+	BOOL			m_bMergeState;				// Merge Status
+	char			m_strAoiImageName[256];			// Defect Image Name(CCD Image)
+	int				m_nDefectMerge;		// 현재 디펙의 머지 여부
+
+
+	int				m_nPixelSizeOrigin;
+	int				m_nScratchRatio;
+	int				m_nDensity;			// 원형 결함 구분을 위한 밀도 [2017.8.2 bhs]
+
+	char			m_strDefectName[16];
+	char			m_strDefectType[16];
+
+	double			m_dScanResolution;
+	double			m_dConvResolution;
+
+	int				m_nAngle;					// 각도
+	int				m_nMajor;					// 장축 길이(Long)
+	int				m_nMinor;					// 단축 길이(Short)
+	int				m_nCompact;					// Blob 장축을 지름으로 하는 원의 넓이와 Blob 넓이의 비율
+	int				m_nThickness;				// Blob 넓이와 장축의 비율 (Area / Major)
+	
+	short			m_nHliLevelIdx;				// 몇 번째 레벨(채널)인가?
+	int				m_nHliLayers;				// 해당결함에 포함된 레이어 bit처리
+
+	BOOL			m_bShrinked;				//210323 CJH - Frame Shrink 정보 추가
+
+	char			m_strAoiImagePath[255];
+	char			m_strReviewImagePath[255];
+
+	int				m_nAlignRectLeft;
+	int				m_nAlignRectTop;
+	int				m_nAlignRectBottom;
+	int				m_nAlignRectRight;
+	/*< LHS 20211029 - #3783 MOD Start >*/
+	char			m_strLNDefectCode[12];
+	short/*LineDefectType*/ m_LineDefectType;
+	/*< LHS 20211029 - #3783 MOD End >*/
+
+	_grmDefectReviewData m_ReviewDefect;
+};
+
+
+enum emGlassRawCommand
+{
+	grcNone = 0,
+
+	//AOI Sequence
+	grcSequenceGlassLoading = 1,
+	grcSequenceInspectEnd = 2,
+	//Review Sequence
+	grcSequenceReviewStart = 3,
+	grcSequenceReviewEnd = 4,
+
+	grcSequenceCustomReviewDataRead = 10,
+
+	grcWriteRaw = 101,
+	grcReadRaw = 102,
+
+	grcWriteBin = 201,
+	grcReadBin = 202,
+
+	grcReviewWriteBIn = 301,
+
+	grcGlassRawCommand
+};
+
+
+struct _grmDitCommand
+{
+	struct _grmCommand
+	{
+		int nCommand;
+		char strParam[256];
+		short nResult; 
+	};
+	short m_nCommandIdxWrite;
+	short m_nCommandIdxRead;
+	_grmCommand m_nCommandBuffer[COMMAND_MAXCOUNT]; 
+};
+
+struct _grmDitMemInfo
+{
+	//공유 메모리 생성할 공간 결정 [김태현 2018/11/12]
+	size_t m_nGlassRawDataSize;
+	int m_nGlassMaxDataNum;
+	int m_nBlockMaxDataNum;
+	int m_nCellMaxDataNum;
+	int m_nDefectMaxDataNum;
+	int m_nStackMaxDataNum;
+	/*< KJG 20211024 - #3487 ADD Start >*/
+	int m_nRawMergeMaxDataNum;
+	/*< KJG 20211024 - #3487 ADD End >*/
+
+	//Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12]
+	int m_nGlassDataPoint;
+	int m_nBlockDataPoint;
+	int m_nCellDataPoint;
+	int m_nDefectDataPoint;
+	int m_nStackDataPoint;
+	/*< KJG 20211024 - #3487 ADD Start >*/
+	int m_nRawMergeDataPoint;
+	/*< KJG 20211024 - #3487 ADD End >*/
+
+	int m_nSizeOfGlassData;
+	int m_nSizeOfBlockData;
+	int m_nSizeOfCellData;
+	int m_nSizeOfDefectData;
+	int m_nSizeOfStackData;
+	/*< KJG 20211024 - #3487 ADD Start >*/
+	int m_nSizeOfRawMergeData;
+	/*< KJG 20211024 - #3487 ADD End >*/
+};
+struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
+{
+	size_t m_nGlassLoadingCount;
+	emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
+	emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
+};
+
+class CgrmGlassRawData
+{
+public:
+	CgrmGlassRawData()
+	{
+		m_pGlassRawData = NULL;
+		m_bRefAlloc = FALSE;
+	};
+
+	~CgrmGlassRawData()
+	{
+		clear();
+	};
+
+	void clear()
+	{
+		if(m_bRefAlloc) { m_pGlassRawData = NULL; return;}
+
+		if(m_pGlassRawData)
+		{
+			delete [] m_pGlassRawData;
+			m_pGlassRawData = NULL;
+		}
+	};
+	BOOL ImportGlassRaw(_grmDitMemInfo* pInfo, char* pData, bool bRefAlloc = false)
+	{
+		if(pInfo == NULL) return FALSE;
+
+		if(m_pGlassRawData && pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) clear(); 
+
+		if(m_pGlassRawData == NULL) m_pGlassRawData = new char[ pInfo->m_nGlassRawDataSize ];
+
+		m_MemInfo = *pInfo;
+
+		m_nGlassRawDataSize = pInfo->m_nGlassRawDataSize;
+
+		m_nGlassMaxDataNum  = pInfo->m_nGlassMaxDataNum ;
+		m_nBlockMaxDataNum	= pInfo->m_nBlockMaxDataNum	;
+		m_nCellMaxDataNum   = pInfo->m_nCellMaxDataNum  ;
+		m_nDefectMaxDataNum = pInfo->m_nDefectMaxDataNum;
+		m_nStackMaxDataNum	= pInfo->m_nStackMaxDataNum	;
+
+		m_nGlassDataPoint   = pInfo->m_nGlassDataPoint  ;
+		m_nBlockDataPoint	= pInfo->m_nBlockDataPoint	;
+		m_nCellDataPoint    = pInfo->m_nCellDataPoint   ;
+		m_nDefectDataPoint  = pInfo->m_nDefectDataPoint ;
+		m_nStackDataPoint   = pInfo->m_nStackDataPoint	;
+
+		m_nSizeOfGlassData  = pInfo->m_nSizeOfGlassData ;
+		m_nSizeOfBlockData	= pInfo->m_nBlockDataPoint	;
+		m_nSizeOfCellData   = pInfo->m_nSizeOfCellData  ;
+		m_nSizeOfDefectData = pInfo->m_nSizeOfDefectData;
+		m_nSizeOfStackData  = pInfo->m_nSizeOfStackData	;
+
+		if(bRefAlloc)
+		{
+			m_pGlassRawData = pData;
+		}
+		else
+		{
+			if(pData)
+			{
+				memcpy(m_pGlassRawData, pData, sizeof(char)*pInfo->m_nGlassRawDataSize);
+			}
+			else
+			{
+				memset(m_pGlassRawData, 0, sizeof(char)*pInfo->m_nGlassRawDataSize );
+			}
+		}
+
+
+		m_pGlassData  = (_grmGlassData*)&m_pGlassRawData[pInfo->m_nGlassDataPoint];
+		m_pBlockData		= (_grmBlockData*)&m_pGlassRawData[pInfo->m_nBlockDataPoint];
+		m_pCellData   = (_grmCellData*)&m_pGlassRawData[pInfo->m_nCellDataPoint];
+		m_pDefectData = (_grmDefectData*)&m_pGlassRawData[pInfo->m_nDefectDataPoint];
+		m_pStackData = (_grmDefectData*)&m_pGlassRawData[pInfo->m_nStackDataPoint];
+
+		m_bRefAlloc = bRefAlloc;
+		return TRUE;
+	};
+	BOOL ExportGlassRaw(_grmDitMemInfo* pInfo, char* pData)
+	{
+		if(pInfo == NULL || pData == NULL) return FALSE;
+
+		if(1) //new type //메모리 총 공간 크기에 상관없이 
+		{
+			//if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
+
+			if(pInfo->m_nSizeOfGlassData  !=  m_MemInfo.m_nSizeOfGlassData)  return FALSE;
+			if(pInfo->m_nSizeOfBlockData  !=  m_MemInfo.m_nSizeOfBlockData)  return FALSE;
+			if(pInfo->m_nSizeOfCellData   !=  m_MemInfo.m_nSizeOfCellData)   return FALSE;
+			if(pInfo->m_nSizeOfDefectData !=  m_MemInfo.m_nSizeOfDefectData) return FALSE;
+			if(pInfo->m_nSizeOfStackData  !=  m_MemInfo.m_nSizeOfStackData)	 return FALSE;
+
+			if(pInfo->m_nCellMaxDataNum < m_pGlassData->m_nCellNum) return FALSE;
+			if(pInfo->m_nDefectMaxDataNum < m_pGlassData->m_nDefectNum) return FALSE;
+			if(pInfo->m_nStackMaxDataNum < m_pGlassData->m_nDefectNum) return FALSE;
+
+			memcpy(&pData[pInfo->m_nGlassDataPoint], m_pGlassData,	 pInfo->m_nSizeOfGlassData* 1);
+			memcpy(&pData[pInfo->m_nBlockDataPoint], m_pBlockData,	 pInfo->m_nSizeOfBlockData* 1);
+			memcpy(&pData[pInfo->m_nCellDataPoint], m_pCellData,	 pInfo->m_nSizeOfCellData*m_pGlassData->m_nCellNum);
+			memcpy(&pData[pInfo->m_nDefectDataPoint], m_pDefectData, pInfo->m_nSizeOfDefectData*m_pGlassData->m_nDefectNum);
+			memcpy(&pData[pInfo->m_nStackDataPoint], m_pStackData, pInfo->m_nSizeOfStackData*m_pGlassData->m_nDefectNum);
+		}
+		else //if() //type old 
+		{
+			if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
+
+			if(pInfo->m_nSizeOfGlassData  !=  m_MemInfo.m_nSizeOfGlassData)  return FALSE;
+			if(pInfo->m_nSizeOfBlockData  !=  m_MemInfo.m_nSizeOfBlockData)  return FALSE;
+			if(pInfo->m_nSizeOfCellData   !=  m_MemInfo.m_nSizeOfCellData)   return FALSE;
+			if(pInfo->m_nSizeOfDefectData !=  m_MemInfo.m_nSizeOfDefectData) return FALSE;
+
+			memcpy(pData, m_pGlassRawData, sizeof(char)*pInfo->m_nGlassRawDataSize);
+		}
+
+
+		return TRUE;
+	};
+
+	_grmGlassData*	GetGlassData(){return m_pGlassData;};
+	_grmBlockData*	GetBlockData(int nIndex){return &m_pBlockData[nIndex];};
+	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
+	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
+	_grmDitMemInfo* GetMemInfo(){return &m_MemInfo;};
+	_grmDefectData* GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
+protected:
+	_grmDitMemInfo  m_MemInfo;
+	char* m_pGlassRawData;
+
+	_grmGlassData*  m_pGlassData;
+	_grmBlockData*	m_pBlockData;
+	_grmCellData*   m_pCellData;
+	_grmDefectData* m_pDefectData;
+	_grmDefectData*	m_pStackData;
+
+	size_t m_nGlassRawDataSize;
+
+	int m_nGlassMaxDataNum;
+	int m_nBlockMaxDataNum;
+	int m_nCellMaxDataNum;
+	int m_nDefectMaxDataNum;
+	int m_nStackMaxDataNum;
+
+	int m_nGlassDataPoint;
+	int m_nBlockDataPoint;
+	int m_nCellDataPoint;
+	int m_nDefectDataPoint;
+	int m_nStackDataPoint;
+
+	int m_nSizeOfGlassData;
+	int m_nSizeOfBlockData;
+	int m_nSizeOfCellData;
+	int m_nSizeOfDefectData;
+	int m_nSizeOfStackData;
+
+private:
+	bool m_bRefAlloc;
+};
\ No newline at end of file
diff --git a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
index d7fc000..58cf38c 100644
--- a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
+++ b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
@@ -222,6 +222,10 @@
 	/* < KJG 20220225 - #3850 ADD Start >*/ 
 	char m_strRawMergeStepID[32];
 	/* < KJG 20220225 - #3850 ADD End >*/
+
+	/* < KMH 20220614 : #3957 ADD Start > */
+	char m_strRawDefectCode[RAW_CODE_MAX][5];	// 4글자만 표기
+	/* < KMH 20220614 : #3957 ADD End > */
 };
 struct _grmBlockData
 {
@@ -479,6 +483,7 @@
 	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
 	short			m_nModelIdx;				// 몇 번째 모델인가?
 	short			m_nCellIdx;					// 몇번째 셀인가?
+	char			m_strCellName[32];			// 셀 이름							/* < KMH 20220609 : #4183 ADD  > */
 	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
 	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
 	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
diff --git a/ReviewHistory/bin/ReviewHistroy.exe b/ReviewHistory/bin/ReviewHistroy.exe
index a3f69b4..299dc8a 100644
--- a/ReviewHistory/bin/ReviewHistroy.exe
+++ b/ReviewHistory/bin/ReviewHistroy.exe
Binary files differ
diff --git a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
index d7fc000..58cf38c 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -222,6 +222,10 @@
 	/* < KJG 20220225 - #3850 ADD Start >*/ 
 	char m_strRawMergeStepID[32];
 	/* < KJG 20220225 - #3850 ADD End >*/
+
+	/* < KMH 20220614 : #3957 ADD Start > */
+	char m_strRawDefectCode[RAW_CODE_MAX][5];	// 4글자만 표기
+	/* < KMH 20220614 : #3957 ADD End > */
 };
 struct _grmBlockData
 {
@@ -479,6 +483,7 @@
 	int				m_nUMCellY;					// 셀 원점 기준 y 좌표
 	short			m_nModelIdx;				// 몇 번째 모델인가?
 	short			m_nCellIdx;					// 몇번째 셀인가?
+	char			m_strCellName[32];			// 셀 이름							/* < KMH 20220609 : #4183 ADD  > */
 	short			m_nCellGate;				// 셀별 Gate라인(얼라인 보정 전)
 	short			m_nCellData;				// 셀별 Data라인(얼라인 보정 전)
 	short			m_nCellGateAlign;			// 셀별 Gate라인(얼라인 보정 후)
diff --git a/ReviewSystem/ReviewSystem/ReviewInterface.cpp b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
index 73bc99f..4bb293d 100644
--- a/ReviewSystem/ReviewSystem/ReviewInterface.cpp
+++ b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -6626,12 +6626,11 @@
 
 	if (IsManualProcessMode()==FALSE)	{	return;	}
 
-
 	CGlassResult *pGlassResult = m_pDoc->GlassResult_GetCurrentGlassResult();
-	if(pGlassResult == NULL) return;
+	if (pGlassResult == NULL) return;
 
 	const SDefectFilter *pDefectFilter = m_pDoc->Etc_GetDefectFilter();
-	if(pDefectFilter == NULL) return;
+	if (pDefectFilter == NULL) return;
 
 	int nMarginX = nDefectMarginX; //5000; // um
 	int nMarginY = nDefectMarginY; //5000; // um
@@ -6639,6 +6638,9 @@
 
 	MapDefectResult *pMapReviewResult = pGlassResult->GetMapDefectResult();
 
+	BOOL bFind = FALSE;
+
+	//Defect
 	if (pMapReviewResult)
 	{
 		CDefectResult* pDefectResult = NULL;
@@ -6646,28 +6648,28 @@
 		{
 			pDefectResult = static_cast<CDefectResult*>(it->second);
 
-			if(pDefectResult == NULL) continue;
+			if (pDefectResult == NULL) continue;
 
-			if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult)==-1) continue;
+			//if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult) == -1) continue;
 
-			if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX && 
-				pDefectResult->nUMOriginX <= nDefectPosX + nMarginX && 
-				pDefectResult->nUMOriginY >= nDefectPosY - nMarginY && 
+			if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX &&
+				pDefectResult->nUMOriginX <= nDefectPosX + nMarginX &&
+				pDefectResult->nUMOriginY >= nDefectPosY - nMarginY &&
 				pDefectResult->nUMOriginY <= nDefectPosY + nMarginY)
 			{
+				bFind = TRUE;
+
 				m_pView->UpdateSelectDefectList(pDefectResult->nDefectIdx);
 				m_pView->UpdateSelectDefectMap(pDefectResult);
-
-				m_pView->UpdateSelectDefectInfoMap(pDefectResult); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �젙蹂대�� �꽆湲대떎
-				m_pView->UpdateSelectDefectInfo(pDefectResult->nDefectIdx); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �궗吏� �젙蹂대�� �꽆湲대떎.
 
 				nSelectedModuleIndex = Module_GetSelectedModuleIndex();
 
 				// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
-				int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				int nGoModuleIndex = nSelectedModuleIndex;
 
 				// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
-				if(nGoModuleIndex >= 0)
+				if (nGoModuleIndex >= 0)
 				{
 					Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
 				}
@@ -6677,21 +6679,145 @@
 					break;
 				}
 
-				if(IsManualProcessMode() != FALSE){
+				if (IsManualProcessMode() != FALSE) {
 
-				Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera,pDefectResult );
+					Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, pDefectResult);
+					return;
 				}
-			//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
 
-				// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
 				if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
 				{
-					WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, (int)pDefectResult->dUMCenterOriginX, (int)pDefectResult->dUMCenterOriginY, TRUE);
 				}
 				break;
 			}
 		}
 	}
+
+	//User
+	if (bFind == FALSE)
+	{
+		CDefectResult* pDefectResult = NULL;
+
+		VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserResult();
+		if (pVecReviewResult == NULL) return;
+
+		for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
+		{
+			CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
+
+			for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
+			{
+
+				if (its->nUMOriginX >= nDefectPosX - nMarginX &&
+					its->nUMOriginX <= nDefectPosX + nMarginX &&
+					its->nUMOriginY >= nDefectPosY - nMarginY &&
+					its->nUMOriginY <= nDefectPosY + nMarginY)
+				{
+					bFind = TRUE;
+
+					pDefectResult = &(*its);
+
+					m_pView->UpdateSelectDefectMap(pDefectResult);
+
+					nSelectedModuleIndex = Module_GetSelectedModuleIndex();
+
+					// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
+					//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+					int nGoModuleIndex = nSelectedModuleIndex;
+
+					// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
+					if (nGoModuleIndex >= 0)
+					{
+						Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
+					}
+					else
+					{
+						g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
+						break;
+					}
+
+					if (IsManualProcessMode() != FALSE) {
+
+						Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
+						return;
+					}
+					//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+
+						// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
+					{
+						WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	//UserWSI
+	if (bFind == FALSE)
+	{
+		CDefectResult* pDefectResult = NULL;
+
+		VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserWsiResult();
+		if (pVecReviewResult == NULL) return;
+
+		for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
+		{
+			CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
+
+			for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
+			{
+
+				if (its->nUMOriginX >= nDefectPosX - nMarginX &&
+					its->nUMOriginX <= nDefectPosX + nMarginX &&
+					its->nUMOriginY >= nDefectPosY - nMarginY &&
+					its->nUMOriginY <= nDefectPosY + nMarginY)
+				{
+					bFind = TRUE;
+
+					pDefectResult = &(*its);
+
+					m_pView->UpdateSelectDefectMap(pDefectResult);
+
+					nSelectedModuleIndex = Module_GetSelectedModuleIndex();
+
+					// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
+					//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+					int nGoModuleIndex = nSelectedModuleIndex;
+
+					// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
+					if (nGoModuleIndex >= 0)
+					{
+						Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
+					}
+					else
+					{
+						g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
+						break;
+					}
+
+					if (IsManualProcessMode() != FALSE) {
+
+						Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
+						return;
+					}
+					//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+
+						// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
+					{
+						WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					}
+					break;
+				}
+			}
+		}
+	}
+
 }
 
 
@@ -7297,12 +7423,12 @@
 
 	
 
-	if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
-	{
-		IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION);
-		g_pLog->DisplayMessage(_T("Limit 珥덇낵"));
-		return FALSE;
-	}
+// 	if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
+// 	{
+// 		IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION);
+// 		g_pLog->DisplayMessage(_T("Limit 珥덇낵"));
+// 		return FALSE;
+// 	}
 
 	double n1stGantryXpos, n1stGantryYpos, n2ndGantryXpos, n2ndGantryYpos;
 	double dDistance,dCameraDistance;
@@ -7589,44 +7715,48 @@
 
 		dPosX += MagOffsetX * 1000;//GlassOffsetX*1000+MagOffsetX*1000;
 		dPosY+= MagOffsetY * 1000;//GlassOffsetY*1000+MagOffsetY*1000;
-		double xpostemp = 0;
-		double ypostemp = 0;
 
-
-		GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX/1000, xpostemp, ypostemp);
-		xpostemp = floor(xpostemp * 1000);
-		ypostemp = floor(ypostemp * 1000);
-		//210127
-		if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
+		if (pDefectResult != NULL)
 		{
-			if (nModuleIndex == 0)
+			double xpostemp = 0;
+			double ypostemp = 0;
+
+			GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX / 1000, xpostemp, ypostemp);
+			xpostemp = floor(xpostemp * 1000);
+			ypostemp = floor(ypostemp * 1000);
+			//210127
+			if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
 			{
-				dPosX += xpostemp;
-				dPosY += ypostemp;
+				if (nModuleIndex == 0)
+				{
+					dPosX += xpostemp;
+					dPosY += ypostemp;
+				}
+				else
+				{
+					dPosX += xpostemp * -1;
+					dPosY += ypostemp;
+				}
 			}
 			else
 			{
-				dPosX += xpostemp * -1;
-				dPosY += ypostemp;
+				if (nModuleIndex == 0)
+				{
+					dPosX += xpostemp;
+					dPosY += ypostemp * -1;
+				}
+				else
+				{
+					dPosX += xpostemp * -1;
+					dPosY += ypostemp * -1;
+				}
 			}
-		}
-		else
-		{
-			if (nModuleIndex == 0)
-			{
-				dPosX += xpostemp;
-				dPosY += ypostemp * -1;
-			}
-			else
-			{
-				dPosX += xpostemp * -1;
-				dPosY += ypostemp * -1;
-			}
-		}
 
-		g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX,MagOffsetY,dPosX/1000.0,dPosY/1000.0);
-	 //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
-	 //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
+			g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX, MagOffsetY, dPosX / 1000.0, dPosY / 1000.0);
+			//dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
+			//dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
+		}
+		
 	}
 
 	return Motor_CameraGo(nModuleIndex, dPosX/1000.0, dPosY/1000.0, bAutoSelectCamera, bGoEnd);
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
index d0f3204..bb8d7f2 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp
@@ -86,6 +86,7 @@
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD START
 	m_bSimulationMode = FALSE;
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD END
+	m_bReviewComplete = FALSE;
 	InitializeCriticalSection(&m_csProcessStatus);
 }
 
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.h b/ReviewSystem/ReviewSystem/SequenceProcessor.h
index a81eb75..7bcd1d5 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor.h
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor.h
@@ -748,6 +748,8 @@
 	//WSI END 泥댄겕瑜� �쐞�븳 �븿�닔 190725 chm
 	int     GetCheckWSIEnd(){return m_nCheckWSIEnd;}; // wsi end �뿬遺� 
     void    SetCheckWSIEnd(int nCheck){ m_nCheckWSIEnd=nCheck;};  //wsi end �뿬遺� 
+	int		GetReviewComplete() { return m_bReviewComplete; }
+	void	SetReviewComplete(BOOL bValue) { m_bReviewComplete = bValue; }
 	int	    GetWsiType(){return m_nWsiTyep;};
 	void	SetWsiType(int i){ m_nWsiTyep=i;};
 	void    SendWsiErrorAlarm();
@@ -808,4 +810,5 @@
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD START
 	BOOL				m_bSimulationMode;
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD END
+	BOOL				m_bReviewComplete;
 };
\ No newline at end of file
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
index 736acff..9cbdfb2 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -665,10 +665,12 @@
 		//	m_pSP2P->ISP2P_GetWSIControl(1)->SendWsiAfmSafePosMove();
 		//}
 		//Sleep(5000);
-		if (GetProcessStatus() != ProcessReviewEnd_CPJT && GetProcessStatus() != ProcessReviewUnloding_CPJT)
+		//if (GetProcessStatus() != ProcessReviewEnd_CPJT && GetProcessStatus() != ProcessReviewUnloding_CPJT)
+		if (GetReviewComplete() == FALSE)
 		{
 			SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
 			SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
+			SetReviewComplete(TRUE);
 		}
 
 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
@@ -939,6 +941,8 @@
 	SetCheckWSIEnd(-1); //190726
 	SetWsiType(-1);    //wsi reflow
 	SetLastPointCheck(FALSE);
+
+	SetReviewComplete(FALSE);
 
 	bFileFind = FALSE;
 
@@ -1745,7 +1749,8 @@
 	m_pDitGlassRaw->GetGlassData()->m_nReviewNum = m_pSP2P->ISP2P_GetReviewProcessor()->GetPlanReviewCount();
     //SendDVDataToSignalControl(); 
 
-	if (GetLastPointCheck() == FALSE)
+	//if (GetLastPointCheck() == FALSE)
+	if (GetReviewComplete() == FALSE)
 	{
 		//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD START
 		if (GetSimulationMode() == FALSE)
@@ -1753,6 +1758,7 @@
 			SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
 			SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
 			m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
+			SetReviewComplete(TRUE);
 		}
 		//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD END
 		//original

--
Gitblit v1.9.3