From 29b057b25d57dab9ed33aa2a1bc22b6dc68e1a4d Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 금, 01 4월 2022 10:31:31 +0900
Subject: [PATCH] Ongoing70 #4006 CF AOI Review Align Fail시 재판정 Off 기능 추가

---
 DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h |  750 ++++++++++++++++++++++++++++++++++++++++++++++++++
 ReviewSystem/ReviewSystem/DitGlassRawStruct.h        |   40 ++
 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp |   21 +
 DitGlassRawMessenger/Extern/DitGlassRawStruct.h      |   40 ++
 4 files changed, 837 insertions(+), 14 deletions(-)

diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
index e5f7a55..5a336e2 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -61,6 +61,11 @@
 
 	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];
@@ -120,7 +125,9 @@
 	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;
@@ -175,7 +182,7 @@
 	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];
@@ -195,15 +202,22 @@
 	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
 {
@@ -257,6 +271,11 @@
 	int			m_nDefectNumTypeMD;
 	int			m_nDefectNumTypeCD;
 	int			m_nDefectNumTypeMC;
+	/* <KYH 211129 : #3796 ADD Start> */
+	int			m_nDefectNumJudgeND;
+	/* <KYH 211129 : #3796 ADD End> */
+	//DUMY DATA
+	int			Dumy_int[9];
 
 	//Mura Data nwh 0404 
 	char		m_strProImage[32];
@@ -308,7 +327,9 @@
 	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별 수
@@ -512,7 +533,10 @@
 	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;
 };
@@ -565,7 +589,9 @@
 	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;
@@ -573,14 +599,18 @@
 	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
 {
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h
new file mode 100644
index 0000000..e5f7a55
--- /dev/null
+++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h
@@ -0,0 +1,750 @@
+#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 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;
+
+	//설비정보
+	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;
+
+	int			m_nDefectNumJudgeOKWhite;
+	int			m_nDefectNumJudgeOKBlack;
+	int			m_nDefectNumJudgeNG;
+	int			m_nDefectNumJudgeRW;
+	int			m_nDefectNumJudgeRP;
+	int			m_nDefectNumJudgeRV;
+	int			m_nDefectNumJudgeTR;
+	int			m_nDefectNumJudgePR;
+
+	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];
+
+	//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;
+
+	int m_nRawMergeNum;
+	BOOL m_bRawMergeRead;
+	//210203 CJH - CutOff 대상 결함 수
+	int m_nCutOffDefectNum;
+	//210323 CJH - Server/Frame Shrink 정보 추가
+	char m_strShrinked[6];
+	//210326 CJH - RAW 입력 Defect 수량 상한 사용여부
+	BOOL m_bRawCutoff;
+
+};
+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;
+
+	//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;
+
+	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;
+
+
+	_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;
+	int m_nRawMergeMaxDataNum;
+
+	//Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12]
+	int m_nGlassDataPoint;
+	int m_nBlockDataPoint;
+	int m_nCellDataPoint;
+	int m_nDefectDataPoint;
+	int m_nStackDataPoint;
+	int m_nRawMergeDataPoint;
+
+	int m_nSizeOfGlassData;
+	int m_nSizeOfBlockData;
+	int m_nSizeOfCellData;
+	int m_nSizeOfDefectData;
+	int m_nSizeOfStackData;
+	int m_nSizeOfRawMergeData;
+};
+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/ReviewSystem/ReviewSystem/DitGlassRawStruct.h b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
index e5f7a55..5a336e2 100644
--- a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
+++ b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -61,6 +61,11 @@
 
 	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];
@@ -120,7 +125,9 @@
 	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;
@@ -175,7 +182,7 @@
 	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];
@@ -195,15 +202,22 @@
 	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
 {
@@ -257,6 +271,11 @@
 	int			m_nDefectNumTypeMD;
 	int			m_nDefectNumTypeCD;
 	int			m_nDefectNumTypeMC;
+	/* <KYH 211129 : #3796 ADD Start> */
+	int			m_nDefectNumJudgeND;
+	/* <KYH 211129 : #3796 ADD End> */
+	//DUMY DATA
+	int			Dumy_int[9];
 
 	//Mura Data nwh 0404 
 	char		m_strProImage[32];
@@ -308,7 +327,9 @@
 	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별 수
@@ -512,7 +533,10 @@
 	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;
 };
@@ -565,7 +589,9 @@
 	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;
@@ -573,14 +599,18 @@
 	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
 {
diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
index de293e5..dccb4d4 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -1691,6 +1691,10 @@
 		if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
 			m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
 	}
+
+	CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
+	if (pGlassResult == NULL) return;
+
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD END
 	//original
 // 	if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
@@ -1710,7 +1714,19 @@
 	{
 		Sleep(1000);
 	}
-	ReJudgeProcessing(m_pDitGlassRaw);
+	/*< LYW 20220401 - ##4006 MOD Start >*/
+	if (pGlassResult->m_AlignResult.GetResultCode() == Align_Success)
+	{
+		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Review ReJudgeProcessing Startl!"));
+		ReJudgeProcessing(m_pDitGlassRaw);
+	}
+	else
+	{
+		m_pSP2P->ISP2P_DisplayMessage(_T("Align Code = %d, ReJudgeProcessing SKIPl!"), pGlassResult->m_AlignResult.GetResultCode());
+	}
+	/*< LYW 20220401 - ##4006 MOD End >*/
+	//Origin
+	//ReJudgeProcessing(m_pDitGlassRaw);
 	m_pDitGlassRaw->GetGlassData()->m_tmReviewEnd = CTime::GetCurrentTime();
 	if (m_pDitGlassRaw->isConnect() != FALSE) 
 	{
@@ -1736,9 +1752,6 @@
 // 		SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
 // 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
 	}
-
-	CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
-	if (pGlassResult==NULL) return;
 	
 	// review camera stop
 	ReviewCamera_CameraControl(CameraControlStop);

--
Gitblit v1.9.3