From 9c13bc5af33d28bb217995597f88fe863db42442 Mon Sep 17 00:00:00 2001
From: LYW <leeyeanwoo@diteam.co.kr>
Date: 금, 01 4월 2022 10:59:55 +0900
Subject: [PATCH] AOI RawMessnger 동기화

---
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp            |    4 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h              |   15 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawRTMS.cpp            |    7 
 DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.h           |    2 
 DitGlassRawMessenger/Extern/DitGlassRawClient.cpp                     |   23 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h   |   14 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCSOT.cpp            |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.cpp         |   24 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp       |   11 
 DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp           |   37 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp |   61 +
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp            |    4 
 DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.h           |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp         |  149 ++++
 DitGlassRawMessenger/Extern/DitGlassRawClient.h                       |    9 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc     |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.cpp         |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/StackResultCSOT.cpp         |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/CustomizeReview.cpp         |    2 
 /dev/null                                                             |  750 -------------------------
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h              |    9 
 DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h           |    7 
 DitGlassRawMessenger/DitGlassRawMessenger/akLoggerExt.cpp             |    2 
 DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h         |    5 
 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp            |  607 +++++++------------
 25 files changed, 563 insertions(+), 1,189 deletions(-)

diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
index 10087f0..a448821 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
@@ -19,9 +19,15 @@
 BOOL CAnaResultFile::MakeAnaFile(CgrmGlassRawData* pData)
 {
 	//return TRUE;
-
+	/* < KJG 20220225 - #4000 MOD Start >*/ 
+	//CString strFilePathName;
+	//strFilePathName.Format("%s\\%sana", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strFileName);
+	char* pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 	CString strFilePathName;
-	strFilePathName.Format("%s\\%sana", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strFileName);
+	CString strFileName = pData->GetGlassData()->m_strFileName;
+	strFileName.Replace(".bin", ".csv");
+	strFilePathName.Format("%s\\%s", pData->GetGlassData()->m_strPath, strFileName);
+	/* < KJG 20220225 - #4000 MOD End >*/
 
 	FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
 	if (pf == NULL)
@@ -29,9 +35,12 @@
 		AKLOG("MakeAOIFile Fail : [%s]", strFilePathName.GetBuffer(0));
 		return FALSE;
 	}
+	/* < KJG 20220225 - #4000 MOD Start >*/ 
+	//fprintf(pf, "%s\n", pData->GetGlassData()->m_strGlassID);
+	//fprintf(pf, "GlassID, m_strImageName, m_strDefectCode, UMCenterAlignX, UMCenterAlignY, m_nLevelSrcMin, m_nLevelSrcMax, m_nLevelSrcAvg, m_nLevelRefMin, m_nLevelRefMax, m_nLevelRefAvg, m_nLevelDiffMin, m_nLevelDiffMax, m_nLevelDiffAvg");
+	fprintf(pf, "GlassID, SubPanelID, m_strImageName, m_strDefectCode, UMCenterAlignX, UMCenterAlignY, m_nLevelSrcMin, m_nLevelSrcMax, m_nLevelSrcAvg, m_nLevelRefMin, m_nLevelRefMax, m_nLevelRefAvg, m_nLevelDiffMin, m_nLevelDiffMax, m_nLevelDiffAvg");
+	/* < KJG 20220225 - #4000 MOD End >*/
 
-	fprintf(pf, "%s\n", pData->GetGlassData()->m_strGlassID);
-	fprintf(pf, "GlassID, m_strImageName, m_strDefectCode, UMCenterAlignX, UMCenterAlignY, m_nLevelSrcMin, m_nLevelSrcMax, m_nLevelSrcAvg, m_nLevelRefMin, m_nLevelRefMax, m_nLevelRefAvg, m_nLevelDiffMin, m_nLevelDiffMax, m_nLevelDiffAvg");
 	for (int i = 0; i < MAX_ZONE_NUM; i++) fprintf(pf, ",Zone%02d", i);
 	//210123 CJH - Zone별 min, max, avg 값 표기
 	for (int i = 0; i < MAX_ZONE_NUM; i++) fprintf(pf, ",ZoneDiffMin%02d", i);
@@ -46,13 +55,21 @@
 	for (int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++)
 	{
 		_grmDefectData* pDefect = pData->GetDefectData(iDefect);
+		/* < KJG 20220225 - #4000 ADD Start >*/ 
+		CString strDefectCellID;
+		strDefectCellID.Format("%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefect->m_nCellIdx / 36, pCellCode[pDefect->m_nCellIdx % 36]);
+		/* < KJG 20220225 - #4000 ADD End >*/
 		if (pData->GetGlassData()->m_nScanCoordinateY == 1) //분판설비의 경우 XY반전
 		{
-			fprintf(pf, "%s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
-				pData->GetGlassData()->m_strGlassID, pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignY / 1000.0, (double)pDefect->m_nUMCenterAlignX / 1000.0,
+			/* < KJG 20220225 - #4000 MOD Start >*/ 
+			//fprintf(pf, "%s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
+			//	pData->GetGlassData()->m_strGlassID, pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignY / 1000.0, (double)pDefect->m_nUMCenterAlignX / 1000.0,
+			fprintf(pf, "%s, %s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
+				pData->GetGlassData()->m_strGlassID, strDefectCellID.GetBuffer(0), pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignY / 1000.0, (double)pDefect->m_nUMCenterAlignX / 1000.0,
 				pDefect->m_nLevelSrcMin, pDefect->m_nLevelSrcMax, pDefect->m_nLevelSrcAvg,
 				pDefect->m_nLevelRefMin, pDefect->m_nLevelRefMax, pDefect->m_nLevelRefAvg,
 				pDefect->m_nLevelDiffMin, pDefect->m_nLevelDiffMax, pDefect->m_nLevelDiffAvg);
+			/* < KJG 20220225 - #4000 MOD End >*/
 			for (int iz = 0; iz < MAX_ZONE_NUM; iz++)
 			{
 				fprintf(pf, ",%d", pDefect->m_sZonePixelCount[iz]);
@@ -91,11 +108,15 @@
 		}
 		else
 		{
-			fprintf(pf, "%s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
-				pData->GetGlassData()->m_strGlassID, pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignX / 1000.0, (double)pDefect->m_nUMCenterAlignY / 1000.0,
+			/* < KJG 20220225 - #4000 MOD Start >*/ 
+			//fprintf(pf, "%s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
+			//	pData->GetGlassData()->m_strGlassID, pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignX / 1000.0, (double)pDefect->m_nUMCenterAlignY / 1000.0,
+			fprintf(pf, "%s, %s, %s, %s, %.3lf, %.3lf, %d, %d, %d, %d, %d, %d, %d, %d, %d",
+				pData->GetGlassData()->m_strGlassID, strDefectCellID.GetBuffer(0), pDefect->m_strAoiImageName, pDefect->m_strDefectCode, (double)pDefect->m_nUMCenterAlignX / 1000.0, (double)pDefect->m_nUMCenterAlignY / 1000.0,
 				pDefect->m_nLevelSrcMin, pDefect->m_nLevelSrcMax, pDefect->m_nLevelSrcAvg,
 				pDefect->m_nLevelRefMin, pDefect->m_nLevelRefMax, pDefect->m_nLevelRefAvg,
 				pDefect->m_nLevelDiffMin, pDefect->m_nLevelDiffMax, pDefect->m_nLevelDiffAvg);
+			/* < KJG 20220225 - #4000 MOD End >*/
 			for (int iz = 0; iz < MAX_ZONE_NUM; iz++)
 			{
 				fprintf(pf, ",%d", pDefect->m_sZonePixelCount[iz]);
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/CustomizeReview.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/CustomizeReview.cpp
index 8eb3b22..4981ac7 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/CustomizeReview.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/CustomizeReview.cpp
@@ -9,7 +9,7 @@
 #define new DEBUG_NEW
 #endif
 
-#define CUSTOMIZE_RECIPE_PATH "C:\\DIT_Review\\Recipe"
+#define CUSTOMIZE_RECIPE_PATH "D:\\DIT_Review\\Recipe"
 
 CCustomizeReview::CCustomizeReview(void)
 {
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
index f723721..a8d4cf8 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
@@ -146,7 +146,7 @@
     PUSHBUTTON      "Manual\nFTP Upload",IDC_BTN_FTP_MANUALUPLOAD,418,20,39,31,BS_MULTILINE | WS_DISABLED
     LTEXT           "Stack File",IDC_STATIC,16,100,30,8
     LTEXT           "RawMerge File",IDC_STATIC,15,115,46,8
-    CONTROL         "",IDC_CHECK_RAWMERGEFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,115,16,10
+    CONTROL         "",IDC_CHECK_RAWMERGEFILEREAD,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,72,115,16,10
     EDITTEXT        IDC_EDIT_RAWMERGE_LOCALSAVEPATH,94,112,121,14,ES_AUTOHSCROLL
 END
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
index e2290d6..056f20b 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -166,6 +166,9 @@
 	ON_BN_CLICKED(IDC_BTN_STACKAPPLY, &CDitGlassRawMessengerDlg::OnBnClickedBtnStackapply)
 	ON_BN_CLICKED(IDC_TEST_CMD, &CDitGlassRawMessengerDlg::OnBnClickedTestCmd)
 	ON_BN_CLICKED(IDC_BTN_FTP_MANUALUPLOAD, &CDitGlassRawMessengerDlg::OnBnClickedBtnFtpManualupload)
+	/* <LJC 20211122 : #3820 ADD Start> */
+	ON_WM_COPYDATA()
+	/* <LJC 20211122 : #3820 ADD End> */
 END_MESSAGE_MAP()
 
 void GetCompileTime(tm& timestruct)
@@ -251,11 +254,13 @@
 		akFileDB.getItem("DataMaxNumCell", &m_ConfigOption.m_nMaxDataNumCell, 200);
 		akFileDB.getItem("DataMaxNumDefect", &m_ConfigOption.m_nMaxDataNumDefect, 50000);
 		akFileDB.getItem("SelectRawType", &m_ConfigOption.m_nSelectRawType, 0);
-		akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "c:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
+		akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "D:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
 		akFileDB.getItem("Stack_Use", &m_ConfigOption.m_bUseStack, 0);
 		akFileDB.getItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath, "D:\\DIT_ResultData\\Stack");
+		/*< KJG 20211024 - #3487 ADD Start >*/
 		akFileDB.getItem("RawMerge_Use", &m_ConfigOption.m_bUseRawMerge, 0);
 		akFileDB.getItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath, "D:\\DIT_ResultData\\RawMerge");
+		/*< KJG 20211024 - #3487 ADD End >*/
 		akFileDB.getItem("Stack_EquipID",m_ConfigOption.m_strStackEquipID, "AAAAA");
 		akFileDB.getItem("Stack_Param1",m_ConfigOption.m_strStackParam1, "");
 		akFileDB.getItem("Stack_Param2",m_ConfigOption.m_strStackParam2, "");
@@ -280,7 +285,7 @@
 
 		CreateDirectory(strPath, NULL);
 		//CakLoggerExt::getInstance()->setWriteFileMode(m_ConfigOption.m_strLogFilePath);
-		CakLoggerExt::getInstance()->setWriteFileMode2("C:\\DIT_LogData\\", "logGlassRawMessenger");
+		CakLoggerExt::getInstance()->setWriteFileMode2("D:\\DIT_LogData\\", "logGlassRawMessenger");
 		CakLoggerExt::getInstance()->m_hParent = GetSafeHwnd();
 
 		m_ctrlLoggerList;
@@ -1349,8 +1354,10 @@
 
 	akFileDB.setItem("Stack_Use", m_ConfigOption.m_bUseStack);
 	akFileDB.setItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath);
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	akFileDB.setItem("RawMerge_Use", m_ConfigOption.m_bUseRawMerge);
 	akFileDB.setItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath);
+	/*< KJG 20211024 - #3487 ADD End >*/
 	akFileDB.setItem("Stack_EquipID", m_ConfigOption.m_strStackEquipID);
 	akFileDB.setItem("Stack_Param1",m_ConfigOption.m_strStackParam1);
 	akFileDB.setItem("Stack_Param2",m_ConfigOption.m_strStackParam2);
@@ -1530,8 +1537,10 @@
 {
 	m_ConfigOption.m_bUseStack = ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->GetCheck();
 	GetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH,m_ConfigOption.m_strStackLocalPath, 256);
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_ConfigOption.m_bUseRawMerge = ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->GetCheck();
 	GetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath, 256);
+	/*< KJG 20211024 - #3487 ADD End >*/
 	GetDlgItemText(IDC_EDIT_STACK_EQUIPID,m_ConfigOption.m_strStackEquipID, 32);
 	GetDlgItemText(IDC_EDIT_STACK_PARAM1,m_ConfigOption.m_strStackParam1, 32);
 	GetDlgItemText(IDC_EDIT_STACK_PARAM2,m_ConfigOption.m_strStackParam2, 32);
@@ -1613,3 +1622,51 @@
 
 	
 }
+
+/* <LJC 20211122 : #3820 ADD Start> */
+BOOL CDitGlassRawMessengerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
+{
+	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
+	CDitGlassRawServer* pServer = (CDitGlassRawServer*)&m_Server;
+	CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
+	pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData(), true);
+	CFTPCopyDataParam* FTPCopyDataParam = ((CFTPCopyDataParam*)pCopyDataStruct->lpData);
+	switch (pCopyDataStruct->dwData)
+	{
+	case COPYDATA_RAW_DOWNLOAD_ACK:
+		{
+		if (FTPCopyDataParam->m_nProcessType == CFTPCopyDataParam::FTPProcessType_DownFile && pServer->GetGlassRawInfo()->m_ServerProcStep == APS_GlassLoading && m_pGlassRawMaker->GetEnableFtpAck() == TRUE)
+		{
+			if (FTPCopyDataParam->m_nSendResultCode == TRUE)
+			{
+				m_pGlassRawMaker->SetEnableFtpAck(FALSE);
+				m_pGlassRawMaker->SearchFIle(pRawDataBuffer);
+				break;
+			}
+			else
+			{
+				m_nMaxMergeList++;
+				m_pGlassRawMaker->DownLoadMergeFile(pRawDataBuffer);
+				if (m_nMaxMergeList > 10)
+				{
+					m_nMaxMergeList = 0;
+					break;
+				}
+
+			}
+		}
+		else
+		{
+			break;
+		}
+		
+		}
+		break;
+
+	default:
+		break;
+	}
+
+	return CDialog::OnCopyData(pWnd, pCopyDataStruct);
+}
+/* <LJC 20211122 : #3820 ADD End> */
\ No newline at end of file
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
index 6d2ff03..7465412 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
@@ -21,6 +21,10 @@
 #define UM_GLASSRAW_CLIENTMESSAGE WM_USER+0x1231
 #define UM_TRAYICON_MSG WM_USER + 0x1230
 
+	/* <LJC 20211122 : #3820 ADD Start> */
+#define	COPYDATA_RAW_DOWNLOAD_ACK	11
+	/* <LJC 20211122 : #3820 ADD End> */
+
 // CDitGlassRawMessengerDlg 대화 상자
 class CDitGlassRawMessengerDlg : public CDialog
 {
@@ -55,8 +59,10 @@
 		char m_strStackParam1[32];
 		char m_strStackParam2[32];
 
+		/*< KJG 20211024 - #3487 ADD Start >*/
 		int  m_bUseRawMerge;
 		char m_strRawMergeLocalPath[256];
+		/*< KJG 20211024 - #3487 ADD End >*/
 	}m_ConfigOption;
 	void WriteConfigFile();
 
@@ -72,6 +78,10 @@
 public:
 	static void threadMain(void* arg);
 	int m_nThreadMainFlag;
+
+	/* <LJC 20211122 : #3820 ADD Start> */
+	int m_nMaxMergeList=0;
+	/* <LJC 20211122 : #3820 ADD End> */
 
 public:
 	CString m_strGlassID;
@@ -135,4 +145,8 @@
 	afx_msg void OnBnClickedBtnStackapply();
 	afx_msg void OnBnClickedTestCmd();
 	afx_msg void OnBnClickedBtnFtpManualupload();
+
+	/* <LJC 20211122 : #3820 ADD Start> */
+	afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
+	/* <LJC 20211122 : #3820 ADD End> */
 };
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
index e88e79b..333f58c 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
@@ -42,7 +42,9 @@
 		|| sizeof(_grmCellData) != m_pGlassRawInfo->m_nSizeOfCellData
 		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfDefectData
 		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData
+		/*< KJG 20211024 - #3487 ADD Start >*/
 		|| sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfRawMergeData)
+		/*< KJG 20211024 - #3487 ADD End >*/
 	{
 		return FALSE;
 	}
@@ -52,7 +54,9 @@
 	m_pGlassRawInfo->m_nCellMaxDataNum = nCellNum;
 	m_pGlassRawInfo->m_nDefectMaxDataNum = nDefectNum;
 	m_pGlassRawInfo->m_nStackMaxDataNum = nDefectNum;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pGlassRawInfo->m_nRawMergeMaxDataNum = nDefectNum;
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 	m_pGlassRawInfo->m_nGlassRawDataSize;
 	{
@@ -73,8 +77,10 @@
 		m_pGlassRawInfo->m_nStackDataPoint = nDataNum;
 		nDataNum += (m_pGlassRawInfo->m_nSizeOfStackData + m_pGlassRawInfo->m_nSizeOfStackData % 4)*nDefectNum;
 		
+		/*< KJG 20211024 - #3487 ADD Start >*/
 		m_pGlassRawInfo->m_nRawMergeDataPoint = nDataNum;
 		nDataNum += (m_pGlassRawInfo->m_nSizeOfRawMergeData + m_pGlassRawInfo->m_nSizeOfRawMergeData % 4)*nDefectNum;
+		/*< KJG 20211024 - #3487 ADD End >*/
 
 		m_pGlassRawInfo->m_nGlassRawDataSize = nDataNum;
 	}
@@ -130,7 +136,9 @@
 			m_pGlassRawInfo->m_nSizeOfCellData = sizeof(_grmCellData);
 			m_pGlassRawInfo->m_nSizeOfDefectData = sizeof(_grmDefectData);
 			m_pGlassRawInfo->m_nSizeOfStackData = sizeof(_grmDefectData);
+			/*< KJG 20211024 - #3487 ADD Start >*/
 			m_pGlassRawInfo->m_nSizeOfRawMergeData = sizeof(_grmDefectData);
+			/*< KJG 20211024 - #3487 ADD End >*/
 
 			int bytealign = m_pGlassRawInfo->m_nSizeOfGlassData%4;
 		}
@@ -184,7 +192,8 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
-
+	/*< KJG 20211024 - #3487 ADD End >*/
 	return TRUE;
 }
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
index a3dc3f5..491c465 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
@@ -18,8 +18,9 @@
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
-
+	/*< KJG 20211024 - #3487 ADD End >*/
 	_grmDitGlassRawInfo* GetGlassRawInfo(){return m_pGlassRawInfo;};
 
 protected:
@@ -32,7 +33,9 @@
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	_grmDefectData* m_pRawMergeData;
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 protected:
 	HANDLE		m_hMapBasicInfo;
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
index b8c7ebe..cd1ae2b 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
@@ -4,7 +4,9 @@
 #include "akLoggerExt.h"
 
 CGlassRawBase::CGlassRawBase(void)
-{
+{	/* <LJC 20211122 : #3820 ADD Start> */
+	b_EnableFtpAck = FALSE;
+	/* <LJC 20211122 : #3820 ADD End> */
 }
 
 CGlassRawBase::~CGlassRawBase(void)
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
index ea973a0..9228f32 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
@@ -34,7 +34,7 @@
 enum ReKind { Re_Other, Re_TFE_CIRCLE, Re_PI_CONVEX, Re_PI_CONCAVE, Re_PI_1, Re_PI_2, Re_PI_3 };
 
 //choigudal jude fix 2012.03.07
-enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size 추가
+enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_ND, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_LN/*KMH 220318 : #3954 ADD */, Judge_Unknown };/* <KYH 211129 : #3796 ADD Start> */
 enum MAP16_DefectClass { CLASS_C1 = 1, CLASS_C2, CLASS_C3, CLASS_C4, CLASS_C5, CLASS_C6, CLASS_C7, CLASS_C8, CLASS_C9, CLASS_C10, CLASS_C11, CLASS_C12, CLASS_C13, CLASS_C14, CLASS_C15, CLASS_C16 };
 enum MAP16_SizeType { SIZE_SS = 0, SIZE_SM, SIZE_SL, SIZE_SOH, SIZE_IDX_MAX };
 enum MAP16_PeakType { PEEK_PS = 0, PEEK_PL, PEEK_PH, PEEK_POH, PEAK_IDX_MAX };
@@ -69,7 +69,14 @@
 	virtual BOOL SequenceFtpUpload(char* pRawFileName){return TRUE;};
 
 	virtual void NotifyUpdateOptionInfo(){};
+	/* <LJC 20211122 : #3820 ADD Start> */
+	virtual void DownLoadMergeFile(CgrmGlassRawData* pData) { return; };
+	virtual void SearchFIle(CgrmGlassRawData* pData) { return; };
 
+	BOOL GetEnableFtpAck() { return b_EnableFtpAck; };
+	void SetEnableFtpAck(BOOL b_value) { b_EnableFtpAck = b_value; };
 
+	BOOL b_EnableFtpAck;
 
+	/* <LJC 20211122 : #3820 ADD End> */
 };
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
index 5033f78..fc064a2 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -30,6 +30,12 @@
 #define NETWORK_MURARAW_PATH		"\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\RAW" //0405nwh
 #define NETWORK_MURA_IMAGE_PATH		"\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\IMG" //0405nwh
 
+//KYH Stack Local 寃쎈줈 異붽�
+#define NETWORK_AOISTACKLOCAL_PATH  "\\\\126.100.100.1\\d\\DIT_ResultData\\Stack"
+	/* <LJC 20211122 : #3820 ADD Start> */
+#define NETWORK_AOIRAWMERGELOCAL_PATH  "D:\\DIT_ResultData\\RawMerge"
+	/* <LJC 20211122 : #3820 ADD End> */
+
 char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 
 void _TimeDelay(int delay)
@@ -37,9 +43,9 @@
 	MSG		msg;
 	BOOL	fRst = FALSE;
 
-	clock_t lBlockTime = delay + clock();
+	ULONGLONG lBlockTime = delay + GetTickCount64();
 
-	while (lBlockTime > clock())
+	while (lBlockTime > GetTickCount64())
 	{
 		fRst = (BOOL)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
 		if (fRst)
@@ -70,19 +76,51 @@
 
 BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
 {
-	//�뒪�깮湲곕뒫
+ 	SetEnableFtpAck(FALSE);
+ 	m_nRawMergeIdx = 0;
 	if(m_StackResult.getStackUse())
 	{
+		
+		CString strStackFileLocalPath;
+		strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
+
+		CFileFind File;
+
+		if (File.FindFile(strStackFileLocalPath))
+		{
+			File.FindNextFile();
+			strStackFileLocalPath = File.GetFilePath();
+			DeleteFile(strStackFileLocalPath);
+			Sleep(10);
+		}
+		else
+		{
+			AKLOG("Delete Stack File Fail [%s]", strStackFileLocalPath);
+		}
+
+
 		//201218 CJH - Stack Download �떆�룄
 		SendMessageFTPDownloadStack(pData->GetGlassData());
-
 		m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
 	}
-	if (m_RawMergeResult.getRawMergeUse())
+	/* <LJC 20211122 : #3820 ADD Start> */
+	if (pData->GetGlassData()->m_bRawMergeUse)
 	{
-		SendMessageFTPDownloadDataFile(pData->GetGlassData());
-		m_RawMergeResult.RawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
+		CString strRawFileLocalPath;
+		strRawFileLocalPath.Format("%s\\%s", NETWORK_AOIRAWMERGELOCAL_PATH, pData->GetGlassData()->m_strGlassID);
+		CFileFind File;
+		if (File.FindFile(strRawFileLocalPath))
+		{
+			File.FindNextFile();
+			strRawFileLocalPath = File.GetFilePath();
+			DeleteFile(strRawFileLocalPath);
+			Sleep(10);
+		}
+		SetEnableFtpAck(TRUE);
+		DownLoadMergeFile(pData);
 	}
+	/* <LJC 20211122 : #3820 ADD End> */
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 	return TRUE;
 }
@@ -115,7 +153,7 @@
 		return FALSE;
 	
 	
-	if (1) ReadMuraFile(pData);
+	//if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 媛쒕퀎 �뾽濡쒕뱶 �븯誘�濡� Macro �뜲�씠�꽣 �쟻�젣 �젣嫄� �슂泥�
 
 	
 	if (WriteAOIFile(pData) == FALSE)
@@ -126,12 +164,59 @@
 	//210218 CJH - 寃��궗 醫낅즺�떆 寃곌낵�뙆�씪 諛� CCD Image �뾽濡쒕뱶
 	SendMessageFTPUploadRaw(pData->GetGlassData());
 
+	/* <KYH 211129 : #3806 ADD Start> */
+	char pServerPath[256] = {};
+	char pServerFile[256] = {};
+
+	CString strGlassID = pData->GetGlassData()->m_strGlassID;
+	CString strGlassIDLevel6th = strGlassID.Left(6);
+	CString strStepID = pData->GetGlassData()->m_strStepID;
+	CString strProcessID = pData->GetGlassData()->m_strProcessID;
+	CString strFileName;
+
+	strcpy(pServerFile, "*.*");
+
+	strFileName.Format("%s", strGlassID);
+	strFileName.MakeLower();
+
+	sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
+
+	strStepID.MakeLower();
+	strGlassID.MakeLower();
+	strGlassIDLevel6th.MakeLower();
+	strProcessID.MakeLower();
+
+//	if (strGlassID.GetLength() > 6)
+//		sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
+//	else
+		sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
+	/* <KYH 211129 : #3806 ADD End> */
+
+
 	BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
 	if (bIsBDI)
 	{
 		SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
+
+		/* <KYH 211129 : #3806 ADD Start> */
+		CString strRawFilePathName = NULL;
+		CString strLine = NULL;
+		strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
+		strRawFilePathName += RAWINFO_FILE_NAME;
+		FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
+		if (pf != NULL)
+		{
+			strLine = pServerPath + strFileName;
+			fprintf(pf, "[RESULT_PATH]\n");
+			fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
+			SetRawFilePath(strLine.GetBuffer(0));
+			fprintf(pf, "SUMPATH= \n");
+			fprintf(pf, "IMGPATH= Z:\%s\n", strLine.GetBuffer(0));
+			fprintf(pf, "DISK=FILESERVER\n");
+			fclose(pf);
+		}
 	}
-	
+    /* <KYH 211129 : #3806 ADD End> */
 	SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
 
 	return TRUE;
@@ -234,7 +319,7 @@
 	pData->GetGlassData()->m_strFileName;
 	strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWDFS_PATH);
 
-	if(1) ReadMuraFile(pData);
+	//if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 媛쒕퀎 �뾽濡쒕뱶 �븯誘�濡� Macro �뜲�씠�꽣 �쟻�젣 �젣嫄� �슂泥�
 
   	if(WriteAOIFile(pData) == FALSE)
   		return FALSE;
@@ -370,7 +455,7 @@
 	}
 	
 	strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
-	//strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
+	//strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
 	
 	// 湲��씪�뒪 ID留� 議댁옱�븯�뿬 �옱寃��궗 �떆 �뙆�씪 �깮�꽦 �떎�뙣. �궘�젣�븳�떎
 	DeleteFile(strFilePathName);
@@ -398,7 +483,10 @@
 	//////////////////////////////////////////////////////////////////////////
 	//GLASSDATA
 	{
-		makeDataGlass(strLine, pGlass);
+		/*< KJG 20211229 - #3846 MOD Start >*/
+		//makeDataGlass(strLine, pGlass);
+		makeDataGlass(strLine, pData, pGlass);
+		/*< KJG 20211229 - #3846 MOD End >*/
 		fprintf(pf, "%s\n", strLine.GetBuffer(0));
 	}
 	
@@ -444,21 +532,24 @@
 {
 	strLine.Empty();
 	CString strValue;
-	
-	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 TB TW RB RW T_STACK 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 BR_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT"; //53ea
+	/*< 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";
+	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
+	/*< KJG 20211229 - #3846 MOD End >*/
 	strLine += strValue; strLine += "\n";
-	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 PRO_IMAGE AVG_GRAY_0 PORTION_0 CORNER_GRAY_0 AVG_AMP_0 FFT_VAR_0 FFT_VAH_0 FFT_VAQ_0 FFT_PK_0 AVG_GRAY_1 PORTION_1 CORNER_GRAY_1 AVG_AMP_1 FFT_VAR_1 FFT_VAH_1 FFT_VAQ_1 FFT_PK_1 AVG_GRAY_2 PORTION_2 CORNER_GRAY_2 AVG_AMP_2 FFT_VAR_2 FFT_VAH_2 FFT_VAQ_2 FFT_PK_2 AVG_GRAY_3 PORTION_3 CORNER_GRAY_3 AVG_AMP_3 FFT_VAR_3 FFT_VAH_3 FFT_VAQ_3 FFT_PK_3"; //54ea 21-06-21 Mura Data 異붽�
+	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"; //31ea /* <KYH 211129 : #3796 MOD Start> */
 	strLine += strValue; strLine += "\n";
-	//210405
-	//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 DSC_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 SCAN_AI REVIEW_AI INS_MODE INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK
-	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 DSC_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    
+	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;
 
 }
 #define SPRINTRAWSTART char strItemValue[1024];int nItemValueLen, nItemValuePos = 0;memset(strItemValue, ' ', sizeof(char)*1024)
 #define SPRINTRAW(ITEMSIZE, fmt, ...) nItemValueLen = sprintf(strItemValue+nItemValuePos, fmt,##__VA_ARGS__); strItemValue[nItemValuePos+ nItemValueLen] = ' ';nItemValuePos+=ITEMSIZE+1
 #define SPRINTRAWEND strItemValue[nItemValuePos - 1] = 0; strLine = strItemValue
-void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
+/*< KJG 20211229 - #3846 MOD Start >*/
+//void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
+void CGlassRawCPJT::makeDataGlass( CString& strLine, CgrmGlassRawData* pData, _grmGlassData* pGlassData )
+/*< KJG 20211229 - #3846 MOD End >*/
 {
 	SPRINTRAWSTART;
 
@@ -513,7 +604,7 @@
 	46   12   PAD_DATA		// PAD Data 遺덈웾 �닔
 	47   12   M_DEFECT		// MASK 遺덈웾 �닔
 	48   12   C_DEFECT		// COMMON 遺덈웾
-	49   12   BR_DEFECT		// SCRATCH 遺덈웾 �닔
+	49   12   BR_DEFECT		// SCRATCH 遺덈웾 �닔 => LN_DEFECT // �씪�씤�꽦 遺덈웾 �닔
 	50   12   CRACK			// Crack 遺덈웾 �닔 - Image 珥ъ긽 媛��닔
 	51   12   P_SHIFT			// Pattern Shift 遺덈웾 �닔 - �젅�떆�뵾 �씠由�
 	*/
@@ -704,26 +795,39 @@
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeTR);
 	// 26   6   PR		// Panel �젙蹂� 03	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgePR);
-	// 27   6   TB		// Panel �젙蹂� 04	
+	// 27	6	NG		// Panel �젙蹂� 04
+	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeNG); /* <KYH 211129 : #3796 ADD Start> */
+	// 28   6   TB		// Panel �젙蹂� 04	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTB);
-	// 28   6   TW		// Panel �젙蹂� 05	
+	// 29   6   TW		// Panel �젙蹂� 05	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTW);
-	// 29   6   RB		// Panel �젙蹂� 06	
+	// 30   6   RB		// Panel �젙蹂� 06	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRB);
-	// 30   6   RW		// Panel �젙蹂� 07	
+	// 31   6   RW		// Panel �젙蹂� 07	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRW);
-	// 31   6   T_STACK		// Panel �젙蹂� 08	SD+SP �닔 �엯�젰
+	// 32   6   T_STACK		// Panel �젙蹂� 08	SD+SP �닔 �엯�젰
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD + pGlassData->m_nDefectNumStackSP);
-	//32   6   BMDF	    // Panel �젙蹂� 09 -> 蹂�寃� MAX_AVG_GRAY 04/12 nwh
-	if (strlen(pGlassData->m_strMaxAvgGray) == 0)
+	// 33   6   NO_DEFECT   // Panel �젙蹂� 09
+	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeND); /* <KYH 211129 : #3796 ADD Start> */
+	//34   6   BMDF	    // Panel �젙蹂� 10 -> 蹂�寃� MAX_AVG_GRAY 04/12 nwh
+	/*< KJG 20211229 - #3846 MOD Start >*/
+	//if (strlen(pGlassData->m_strMaxAvgGray) == 0)
+	//{
+	//	SPRINTRAW(12, "*");
+	//}
+	//else
+	//{
+	//	SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
+	//}	
+	int nMaxCellNG = 0;
+	for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
 	{
-		SPRINTRAW(12, "*");
+		_grmCellData* pCell = pData->GetCellData(iCell);
+		nMaxCellNG = max(nMaxCellNG, pCell->m_nDefectNumJudgeNG);
 	}
-	else
-	{
-		SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
-	}	
-	// 33   6   CJ			// Panel �젙蹂� 10 -> 蹂�寃� MAX_PORTION  04/12 nwh
+	SPRINTRAW(12, "%d", nMaxCellNG);
+	/*< KJG 20211229 - #3846 MOD End >*/
+	// 35   6   CJ			// Panel �젙蹂� 11 -> 蹂�寃� MAX_PORTION  04/12 nwh
 	if (strlen(pGlassData->m_strMaxPortion) == 0)
 	{
 		SPRINTRAW(12, "*");
@@ -732,15 +836,15 @@
 	{
 		SPRINTRAW(12, "%s", pGlassData->m_strMaxPortion);
 	}
-	// 34   6   OK_CELL		// OK Cell Count	
+	// 36   6   OK_CELL		// OK Cell Count	
 	SPRINTRAW(12, "*");
-	// 35   6   RJ_CELL		// RJ Cell Count	
+	// 37   6   RJ_CELL		// RJ Cell Count	
 	SPRINTRAW(12, "*");
-	// 36   6   RW_CELL		// RW Cell Count	
+	// 38   6   RW_CELL		// RW Cell Count	
 	SPRINTRAW(12, "*");
-	// 37   6   NR_CELL		// NR Cell Count	
+	// 39   6   NR_CELL		// NR Cell Count	
 	SPRINTRAW(12, "*");
-	// 38   6   MASK_CELL		// MASK Cell Count	//201215 CJH - CSTID濡� 蹂�寃�
+	// 40   6   MASK_CELL		// MASK Cell Count	//201215 CJH - CSTID濡� 蹂�寃�
 	if (strlen(pGlassData->m_strCSTID) == 0)
 	{
 		SPRINTRAW(12, "*");
@@ -770,8 +874,12 @@
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeMD);
 	// 48   6   C_DEFECT		// COMMON 遺덈웾	
 	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeCD);
+	/*< LHS 20211029 - #3783 MOD Start >*/
 	// 49   6   S_DEFECT		// SCRATCH 遺덈웾 �닔	
-	SPRINTRAW(12, "*");
+	//SPRINTRAW(12, "*");
+	// 49   6   LN_DEFECT		// Line 遺덈웾 �닔	
+	SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeLine);
+	/*< LHS 20211029 - #3783 MOD End >*/
 	// 50   6   CRACK		// Crack 遺덈웾 �닔	//201217 CJH - Image 珥ъ긽 媛쒖닔濡� 蹂�寃�
 	//SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
 	SPRINTRAW(12, "%d", pGlassData->m_nReviewNum);
@@ -810,6 +918,15 @@
 		SPRINTRAW(12, "UNUSE");
 	}
 
+	if (pGlassData->m_bEdgeCrackUse)
+	{
+		SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
+	}
+	else
+	{
+		SPRINTRAW(12, "UNUSE");
+	}
+
 	SPRINTRAWEND;   //以묒슂!!! �젮 留덉�留됱뿉 瑗� �엳�뼱�빞�븿!!!(�궘�젣湲덉�) [源��깭�쁽2020/9/23]
 }
 
@@ -839,7 +956,7 @@
 	19 12  PAD_DATA			// PAD Data Defect Count
 	20 12  M_DEFECT			// MASK Defect Count
 	21 12  C_DEFECT			// COMMON Defect Count
-	22 12  S_DEFECT			// SCRATCH Defect Count
+	22 12  S_DEFECT			// SCRATCH Defect Count	==> LN_DEFECT
 	23 12  CRACK				// CRACK Defect Count
 	24 12  P_SHIFT			// Pattern Shift Defect Count
 	*/
@@ -912,336 +1029,29 @@
 	// 21 6  C_DEFECT			// COMMON Defect Count
 	SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeCD);
 
-	// 22 6  S_DEFECT  -> 22 6  PRO_IMAGE 蹂�寃�	 nwh0404	
-	if (strlen(pCellData->m_strProImage))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strProImage);
-	}
-	else
-	{
-		SPRINTRAW(12,"*");
-	}
+	/* <KYH 211129 : #3796 MOD Start> */
 
-	// 23 12  AVG_GRAY_0
-	if (strlen(pCellData->m_strAvgGray_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgGray_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 24 12 PORTION_0
-	if (strlen(pCellData->m_strPortion_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strPortion_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-	
-	//kyh 0622
-	// 25 12 CORNER_GRAY_0
-	if (strlen(pCellData->m_strCorner_Gray_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 26 12 AVG_AMP_0
-	if (strlen(pCellData->m_strAvgAmp_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 27 12 FFT_VAR_0
-	if (strlen(pCellData->m_strFFTVar_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVar_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 28 12 FFT_VAH_0
-	if (strlen(pCellData->m_strFFTVah_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVah_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 29 12 FFT_VAQ_0
-	if (strlen(pCellData->m_strFFTVaq_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 30 12 FFT_PK_0
-	if (strlen(pCellData->m_strFFTPK_0))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTPK_0);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 31 12  AVG_GRAY_1
-	if (strlen(pCellData->m_strAvgGray_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgGray_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-	// 32 12 PORTION_1
-	if (strlen(pCellData->m_strPortion_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strPortion_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	//kyh 0622
-	// 33 12 CORNER_GRAY_1
-	if (strlen(pCellData->m_strCorner_Gray_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 34 12 AVG_AMP_1
-	if (strlen(pCellData->m_strAvgAmp_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 35 12 FFT_VAR_1
-	if (strlen(pCellData->m_strFFTVar_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVar_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 36 12 FFT_VAH_1
-	if (strlen(pCellData->m_strFFTVah_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVah_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 37 12 FFT_VAQ_1
-	if (strlen(pCellData->m_strFFTVaq_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 38 12 FFT_PK_1
-	if (strlen(pCellData->m_strFFTPK_1))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTPK_1);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 39 12  AVG_GRAY_2
-	if (strlen(pCellData->m_strAvgGray_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgGray_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-	// 40 12 PORTION_2
-	if (strlen(pCellData->m_strPortion_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strPortion_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	//kyh 0622
-	// 41 12 CORNER_GRAY_2
-	if (strlen(pCellData->m_strCorner_Gray_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 42 12 AVG_AMP_2
-	if (strlen(pCellData->m_strAvgAmp_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 43 12 FFT_VAR_2
-	if (strlen(pCellData->m_strFFTVar_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVar_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 44 12 FFT_VAH_2
-	if (strlen(pCellData->m_strFFTVah_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVah_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 45 12 FFT_VAQ_2
-	if (strlen(pCellData->m_strFFTVaq_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 46 12 FFT_PK_2
-	if (strlen(pCellData->m_strFFTPK_2))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTPK_2);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 47 12  AVG_GRAY_3
-	if (strlen(pCellData->m_strAvgGray_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgGray_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-	// 48 12 PORTION_3
-	if (strlen(pCellData->m_strPortion_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strPortion_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	//kyh 0622
-	// 49 12 CORNER_GRAY_3
-	if (strlen(pCellData->m_strCorner_Gray_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strCorner_Gray_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 50 12 AVG_AMP_3
-	if (strlen(pCellData->m_strAvgAmp_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strAvgAmp_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 51 12 FFT_VAR_3
-	if (strlen(pCellData->m_strFFTVar_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVar_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 52 12 FFT_VAH_3
-	if (strlen(pCellData->m_strFFTVah_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVah_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 53 12 FFT_VAQ_3
-	if (strlen(pCellData->m_strFFTVaq_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTVaq_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
-
-	// 54 12 FFT_PK_3
-	if (strlen(pCellData->m_strFFTPK_3))
-	{
-		SPRINTRAW(12, "%s", pCellData->m_strFFTPK_3);
-	}
-	else
-	{
-		SPRINTRAW(12, "*");
-	}
+	// 22 6  PRO_IMAGE  -> LN_DEFECT 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeLine);
+	// 23 6  AVG_GRAY  -> TR 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeTR);
+	// 24 6  PORTION  -> PR 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgePR);
+	// 25 6  CORNER_GRAY  -> NG 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeNG);
+	// 26 6  AVG_AMP  -> RB 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRB);
+	// 27 6  FFT_VAR  -> RW 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRW);
+	// 28 6  TB 異붽�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTB); //KYH TB �뜲�씠�꽣 異붽�
+	// 29 6  TW 異붽�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTW); //KYH TW �뜲�씠�꽣 異붽�
+	// 30 6  FFT_VEH  -> T_STACK 蹂�寃�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount + pCellData->m_nDefectSPCount);
+	// 31 6  NO_DEFECT 異붽�
+	SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND �뜲�씠�꽣 異붽�
+	/* <KYH 211129 : #3796 MOD End> */
 
 	SPRINTRAWEND;   //以묒슂!!! �젮 留덉�留됱뿉 瑗� �엳�뼱�빞�븿!!!(�궘�젣湲덉�) [源��깭�쁽2020/9/23]
 }
@@ -1269,7 +1079,7 @@
 		// 16   2    STACK_COUNT	// Count of Defect detected step
 		// 17   60   STACK_STEP		// Flow(Step) of defect detection
 		// 18   16   IMAGE_FILE		// Image file Name
-		// 19   12   DSC Code
+		// 19   12   DSC Code		==> LINE_CODE
 		// 20   12   Image 遺꾨쪟 Code
 		// 21   12   遺덈웾�씠 �쐞移섑븳 Zone No �엯�젰
 		// 22   12   遺덈웾 �겕湲� (L,H,M,S)
@@ -1411,8 +1221,18 @@
 	{
 		SPRINTRAW(16, "*");
 	}
-	// 19   12    DSC_CODE		// Common 01 DSC Code
+	/*< LHS 20211029 - #3783 MOD Start >*/
+	// 19   12    DSC_CODE		// Common 01 DSC Code  ==> LINE_CODE
+	if (strlen(pDefectData->m_strLNDefectCode))
+	{
+		SPRINTRAW(12, "%s", pDefectData->m_strLNDefectCode);
+	}
+	else
+	{
 	SPRINTRAW(12, "*");
+	}
+	//SPRINTRAW(12, "*");
+	/*< LHS 20211029 - #3783 MOD End >*/
 	// 20   12    VC_CODE		// Common 02 Image 遺꾨쪟 Code
 	SPRINTRAW(12, "*");
 	// 21   12    ZONE_NO		// Common 03 遺덈웾�씠 �쐞移섑븳 Zone No �엯�젰
@@ -1530,13 +1350,13 @@
 		SPRINTRAW(12, "*");
 	}
 	// 32 NO USE -> CCD Image �쑀臾�
-	if (strlen(pDefectData->m_strAoiImageName))
+	if (strrchr(pDefectData->m_strAoiImageName, '*') != NULL || strlen(pDefectData->m_strAoiImageName) < 4) // KYH 210826 CCD �씠誘몄� 臾몄옄�뿴�뿉�꽌 *�씠 �엳�쓣寃쎌슦 X 癒몄��븷寃�
 	{
-		SPRINTRAW(12, "O");
+		SPRINTRAW(12, "X");
 	}
 	else
 	{
-		SPRINTRAW(12, "X");
+		SPRINTRAW(12, "O");
 	}
 	// 33   12    CAM_POSITION	// Common 15 Scan 踰덊샇
 	SPRINTRAW(12, "%d", pDefectData->m_nScanIdx);
@@ -1820,7 +1640,7 @@
 	char strRTMSFile[32] = {};
 	char strServerRawFileSubPath[256] = {};
 	char strServer_SubFileName[256] = {};
-
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
 
 	CFTPCopyDataParam upParam;
@@ -1845,6 +1665,7 @@
 	if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
 	{
 	}
+	/*< KJG 20211024 - #3487 ADD End >*/
 }
 
 void CGlassRawCPJT::SendMessageFTPUploadImage( _grmGlassData* pGlassData, emFTPCommand sort)
@@ -2134,15 +1955,25 @@
 			sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0)); 
 		}
 		break;
+		/*< KJG 20211024 - #3487 ADD Start >*/
 	case FTPCMD_RAWMERGE:
 	{
-		sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strStepID,strGlassIDLevel6th.GetBuffer(0)); // �꽌踰� 寃쎈줈 �솗�씤�썑 �닔�젙 kjg
+	/* <LJC 20211122 : #3820 ADD Start> */
+		char cMergeList[10][12];
+		CString strMergeList[10] = {};
+		for (int i = 0; i < 10; i++)
+	{
+			strcpy(cMergeList[i], pGlassData->m_StrMergeList[i]);
+			strMergeList[i] = cMergeList[i];
+		}
+		sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strMergeList[m_nRawMergeIdx],strGlassIDLevel6th.GetBuffer(0)); // �꽌踰� 寃쎈줈 �솗�씤�썑 �닔�젙 kjg
 		sprintf(pServerFile, "%s",strGlassID);
-
+		/* <LJC 20211122 : #3820 ADD End> */
 		sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
 		sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
 	}
 		break;	
+		/*< KJG 20211024 - #3487 ADD End >*/
 	case FTPCMD_MURA_IMAGE: //0404nwh
 	{	//
 		/*CTime time = m_tmFileCreateTime;
@@ -2226,6 +2057,10 @@
 				break;
 			case Judge_PR:			sStr.Format("PR");
 				break;
+			/* <KYH 220117 : #3796 ADD Start>*/
+			case Judge_ND:			sStr.Format("ND");
+				break;
+			/* <KYH 220117 : #3796 ADD End>*/
 			case Judge_PT:			sStr.Format("PT");
 				break;
 			case Judge_Review:		sStr.Format("RV");
@@ -2238,6 +2073,10 @@
 				break;
 			case Judge_Rework:		sStr.Format("RW");
 				break;
+		/* < KMH 20220311 : #3954 ADD Start > */
+			case Judge_LN:			sStr.Format("LN");
+				break;
+		/* < KMH 20220311 : #3954 ADD End > */
 			case Judge_Unknown:		sStr.Format("OK");//sStr.Format("Unknown");	//Unknown�룄 �씪�떒 OK
 				break;
 			default:				sStr.Format("OK");//sStr.Format("Ets");		
@@ -2270,6 +2109,20 @@
 	}
 	return sStr;
 }
+/* <LJC 20211122 : #3820 ADD Start> */
+void CGlassRawCPJT::DownLoadMergeFile(CgrmGlassRawData * pData)
+{
+		SendMessageFTPDownloadDataFile(pData->GetGlassData());
+		m_nRawMergeIdx++;
+	return;
+}
+
+void CGlassRawCPJT::SearchFIle(CgrmGlassRawData * pData)
+{
+	m_RawMergeResult.ProcessRawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
+}
+/* <LJC 20211122 : #3820 ADD End> */
+
 
 CString CGlassRawCPJT::GetWsiDefectType(int nType)
 {
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
index a43c626..766afaf 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
@@ -36,7 +36,11 @@
 	virtual BOOL SequenceFtpUpload(char* pRawFileName);
 
 	virtual void NotifyUpdateOptionInfo(){/*m_StackResult.readOptionFile();*/};
-
+	/* <LJC 20211122 : #3820 ADD Start> */
+	virtual void DownLoadMergeFile(CgrmGlassRawData* pData);
+	virtual void SearchFIle(CgrmGlassRawData* pData);
+	/* <LJC 20211122 : #3820 ADD End> */
+\
 
 protected:
 	
@@ -55,7 +59,10 @@
 	CString GetRawFilePath() { return m_strRawFilePath; }
 
 	void makeDataHeader(CString& strLine, _grmGlassData* pGlassData);
-	void makeDataGlass(CString& strLine, _grmGlassData* pGlassData);
+	/*< KJG 20211229 - #3846 MOD Start >*/
+	//void makeDataGlass(CString& strLine, _grmGlassData* pGlassData);
+	void makeDataGlass(CString& strLine, CgrmGlassRawData* pData, _grmGlassData* pGlassData);
+	/*< KJG 20211229 - #3846 MOD End >*/
 	void makeDataCell(CString& strLine, CgrmGlassRawData* pData, _grmCellData* pCellData);
 	BOOL makeDataDefect(CString& strLine, CgrmGlassRawData* pData, _grmDefectData* pDefectData);
  
@@ -80,8 +87,10 @@
 	BOOL	m_bReviewEndCheck;    // InspectEnd 시에 Raw_im 폴더에 SubFile 생성 안하기 위해 사용 [ 21-03-18 KJG ]
 	CTime	m_tmReviewStart;		
 	CTime	m_tmReviewEnd;		
-
+	/* <LJC 20211122 : #3820 ADD Start> */
+	int	m_nRawMergeIdx=0;
 	int m_nWriteRawDefectIdx;
+	/* <LJC 20211122 : #3820 ADD End> */
 };
 
 struct stCellData
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCSOT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCSOT.cpp
index c10d4fe..7045daf 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCSOT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCSOT.cpp
@@ -320,7 +320,7 @@
 	}
 	
 	strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
-	//strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
+	//strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
 	
 	
 	//FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp
index d7e5708..46308eb 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp
@@ -25,7 +25,7 @@
 {
 	CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
 	CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
-	m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
+	m_MuraResultFile.readOptionFile("D:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
 
 	m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile);
 }
@@ -292,7 +292,7 @@
 	}
 	
 	strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
-	//strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
+	//strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
 	
 	
 	//FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawRTMS.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawRTMS.cpp
index f286af8..634e037 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawRTMS.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawRTMS.cpp
@@ -320,6 +320,9 @@
 		else if(pCellData->m_nJudgement == Judge_Size) strValue = "Judge_Size";	//skip
 		else if (pCellData->m_nJudgement == Judge_TR) strValue = "Judge_TR";
 		else if (pCellData->m_nJudgement == Judge_PR) strValue = "Judge_PR";
+		/* <KYH 211129 : #3796 ADD Start> */
+		else if (pCellData->m_nJudgement == Judge_ND) strValue = "Judge_ND";
+		/* <KYH 211129 : #3796 ADD End> */
 		else strValue = "Judge_OK";										
 	}
 	strLine += strValue+strDiv;
@@ -803,6 +806,10 @@
 			break;
 		case Judge_PR:			sStr.Format("PR");
 			break;
+		/* <KYH 211129 : #3796 ADD Start> */
+		case Judge_ND:			sStr.Format("ND");
+			break;
+		/* <KYH 211129 : #3796 ADD Start> */
 		case Judge_PT:			sStr.Format("PT");
 			break;
 		case Judge_Review:		sStr.Format("RV");
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.cpp
index a7caac2..4c493ae 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.cpp
@@ -130,7 +130,7 @@
 	return &pBuf[nLen+1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 태현[2017/3/29]
 }
 
-BOOL CMacroResultFile::readOptionFile( char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
+BOOL CMacroResultFile::readOptionFile( char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
 {
 	CakFileDB fileDB;
 	fileDB.openfile(pFileName);
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.h b/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.h
index f746014..bd162a4 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/MacroResultFile.h
@@ -179,7 +179,7 @@
 	int GetSubPanelNum(int iCell);
 	_MacroSubPanel* GetSubPanel(int i) { return &m_vecMacroSubPanel[i]; }
 	/////////////////////////////////////0404nwh
-	BOOL readOptionFile(char* pFileName = "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg");
+	BOOL readOptionFile(char* pFileName = "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg");
 
 	_MacroDefect* FindDefect(int nX, int nY, int nFindRange = 2000/*um*/);
 public:
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
index ea5f9c5..d5d79d1 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
@@ -5,6 +5,7 @@
 #include <process.h>
 #include "DitGlassRawClient.h"
 #include "GlassRawBase.h"
+#include <sstream>
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -47,11 +48,14 @@
 BOOL CRawResultReader::openFile(char* pGlassID)
 {
 	CString strFileName;
-	CDitGlassRawClient	GlassRawClient;
-	GlassRawClient.ConnectServer();
-	CDitGlassRawClient* pShared = &GlassRawClient;
+	
+	/*< KJG 20211208 : #3696 DEL Start >*/
+	//CDitGlassRawClient	GlassRawClient;
+	//GlassRawClient.ConnectServer();
+	//CDitGlassRawClient* pShared = &GlassRawClient;
 
-	_grmDefectData* pGrmStack;
+	//_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 DEL End >*/
 
 	strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
 
@@ -59,6 +63,14 @@
 
 	if (pf == NULL)
 		return FALSE;
+		
+	/*< KJG 20211208 : #3696 ADD Start >*/
+	CDitGlassRawClient	GlassRawClient;
+	GlassRawClient.ConnectServer();
+	CDitGlassRawClient* pShared = &GlassRawClient;
+
+	_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 ADD End >*/
 
 	std::vector<_grmDefectData> vecStackDefect;
 	_grmDefectData StackDefect;
@@ -77,6 +89,21 @@
 		if (strlen(buffer) <= 0 || pStr == NULL)
 			break;
 
+		/* < KJG 20220225 - #3850 ADD Start >*/ 
+		if (strncmp(buffer, "DATA PANEL", 10) == 0)
+		{
+			pReadPoint = buffer;
+			CString strtemp;
+			pReadPoint = getParsingData(pReadPoint, 4, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 5, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 5, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 27, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 20, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 20, &strtemp);
+			pReadPoint = getParsingData(pReadPoint, 10, &strtemp);
+			strncpy(pShared->GetGlassData()->m_strRawMergeStepID, strtemp.GetBuffer(0), 10 + 1); // Null 문자 떄문에 +1
+		}
+		/* < KJG 20220225 - #3850 ADD End >*/
 		if (strncmp(buffer, "DATA DEFECT", 10)) continue; 
 
 		//Defect Stack Start
@@ -125,6 +152,12 @@
 				StackDefect.m_DefectJudgement = Judge_TR;
 			else if (strtemp == "PR")
 				StackDefect.m_DefectJudgement = Judge_PR;
+			/* < KJG 20220225 - #Index ADD Start >*/ 			
+			else if (strtemp == "NG")
+				StackDefect.m_DefectJudgement = Judge_NG;
+			else if (strtemp == "ND")
+				StackDefect.m_DefectJudgement = Judge_ND;
+			/* < KJG 20220225 - #Index ADD End >*/
 			else
 				StackDefect.m_StackInfo = Stack_Unknown;
 
@@ -151,6 +184,21 @@
 			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
 			pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
 			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneNum m_sZonePixelCount[i]
+			
+			stringstream ConvertZone(strtemp.GetBuffer(0));
+			unsigned int nZoneHexValue;
+			short sZonePixelCount[16] = { 0 };
+			ConvertZone >> std::hex >> nZoneHexValue;
+			for (int i = 0; i < 16; i++)
+			{
+				if (nZoneHexValue & 1)
+				{
+					sZonePixelCount[i] = 1;
+				}
+				nZoneHexValue = nZoneHexValue >> 1;
+			}
+			memcpy_s(StackDefect.m_sZonePixelCount, sizeof(StackDefect.m_sZonePixelCount), sZonePixelCount, sizeof(sZonePixelCount));
+
 			pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSizeType
 			if (strtemp == "S")
 				StackDefect.m_DefectSizeType = SizeType_Small;
@@ -230,6 +278,24 @@
 			else
 				StackDefect.m_DefectType = DefectType_Unknown;
 	
+
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // Shrink
+			pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneClassNum m_sZoneClassPixelCount[i]
+			stringstream ConvertClass(strtemp.GetBuffer(0));
+			unsigned int nClassHexValue;
+			short sZoneClassPixelCount[16] = { 0 };
+			ConvertClass >> std::hex >> nClassHexValue;
+			for (int i = 0; i < 16; i++)
+			{
+				if (nClassHexValue & 1)
+				{
+					sZoneClassPixelCount[i] = 1;
+				}
+				nClassHexValue = nClassHexValue >> 1;
+			}
+			memcpy_s(StackDefect.m_sZoneClassPixelCount, sizeof(StackDefect.m_sZoneClassPixelCount), sZoneClassPixelCount, sizeof(sZoneClassPixelCount));
+
+
 			vecStackDefect.push_back(StackDefect);
 		}
 	}
@@ -250,7 +316,10 @@
 	pShared->GetGlassData()->m_nRawMergeNum = m_vecStackDefect.size(); // RawMerge
 	pShared->GetGlassData()->m_bRawMergeRead = TRUE;
 
-	AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
+	/* < KJG 20220225 - #3850 MOD Start >*/ 
+	//AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
+	AKLOG("Import Vector Size : [%s]%d", pShared->GetGlassData()->m_strRawMergeStepID, m_vecStackDefect.size());
+	/* < KJG 20220225 - #3850 MOD End >*/
 	return TRUE;
 }
 
@@ -289,7 +358,7 @@
 	return &pBuf[nLen + 1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다
 }
 
-BOOL CRawResultReader::readOptionFile(char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
+BOOL CRawResultReader::readOptionFile(char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
 {
 	if (pFileName == NULL) pFileName = m_strConfigFile;
 
@@ -363,7 +432,56 @@
 
 	pThis->m_nThreadStackFileReadFlag = 0;
 }
+/* <LJC 20211122 : #3820 ADD Start> */
+void CRawResultReader::ProcessResultFileRead(void * pArg)
+{
+	CRawResultReader* pThis = (CRawResultReader*)pArg;
 
+	pThis->m_nThreadStackFileReadFlag = 1;
+	int nReadFailCount = 0;
+	int nThreadCount = 0;
+	CString strGlassID;
+
+	while (pThis->m_nThreadStackFileReadFlag == 1)
+	{
+		if (pThis->m_nProcessState == RPS_CmdFileRead) //스택파일 읽기 수행 [김태현 2019/1/12]
+		{
+			strGlassID = pThis->m_strGlassID;
+
+			pThis->m_nProcessState = RPS_StateFileRead;
+			nThreadCount = 0;
+			nReadFailCount = 0;
+
+			AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
+			Sleep(3000);
+			while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1)
+			{
+				if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
+				{
+					pThis->m_nProcessState = RPS_ResultReadOK;
+					AKLOG("RawMerge File Read Complete ");
+					break;
+				}
+				nReadFailCount++;
+				AKLOG("RawMerge File Read Try : %d", nReadFailCount);
+				if (nReadFailCount > 10)
+				{
+					pThis->m_nProcessState = RPS_ResultReadFail;
+					break;
+				}
+				Sleep(50);
+			}
+			if (pThis->m_nProcessState != RPS_ResultReadOK)
+			{
+				pThis->m_nProcessState = RPS_ResultReadFail;
+			}
+		}
+		if (nReadFailCount)
+			Sleep(500);
+	}
+	pThis->m_nThreadStackFileReadFlag = 0;
+}
+/* <LJC 20211122 : #3820 ADD End> */
 BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID)
 {
 	if (m_nThreadStackFileReadFlag == 0)
@@ -382,7 +500,26 @@
 	
 	return TRUE;
 }
+/* <LJC 20211122 : #3820 ADD Start> */
+BOOL CRawResultReader::ProcessRawMergeFileReadStart(char * pGlassID)
+{
 
+	if (m_nThreadStackFileReadFlag == 0)
+	{
+		ProcessResultFileRead(this);
+	}
+	if (m_nProcessState == RPS_StateFileRead)
+	{
+		m_nProcessState = RPS_CmdFileStop;
+		while (m_nProcessState == RPS_CmdFileStop) Sleep(0);
+	}
+
+	m_strGlassID = pGlassID;
+	m_nProcessState = RPS_CmdFileRead;
+
+	return TRUE;
+}
+/* <LJC 20211122 : #3820 ADD End> */
 BOOL CRawResultReader::RawMergeFileReadStop(BOOL bWait/*=TRUE*/)
 {
 	/*
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
index d72e199..ccffbe9 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
@@ -29,6 +29,9 @@
 	}
 
 	BOOL RawMergeFileReadStart(char* pGlassID);
+	/* <LJC 20211122 : #3820 ADD Start> */
+	BOOL ProcessRawMergeFileReadStart(char* pGlassID);
+	/* <LJC 20211122 : #3820 ADD End> */
 	BOOL RawMergeFileReadStop(BOOL bWait = TRUE);
 	BOOL IsRead() { return m_nProcessState == RPS_ResultReadOK ? TRUE : FALSE; }
 
@@ -42,7 +45,9 @@
 protected:
 	BOOL openFile(char* pGlassID);
 	static void threadResultFileRead(void* pArg);
-
+	/* <LJC 20211122 : #3820 ADD Start> */
+	static void ProcessResultFileRead(void* pArg);
+	/* <LJC 20211122 : #3820 ADD End> */
 	int	m_nThreadStackFileReadFlag;
 
 protected:
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.cpp
index cc904f5..662f92f 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.cpp
@@ -45,11 +45,13 @@
 {
 	CString strFileName;
 
-	CDitGlassRawClient	GlassRawClient;
-	GlassRawClient.ConnectServer();
-	CDitGlassRawClient* pShared = &GlassRawClient;
-	
-	_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 DEL Start >*/
+	//CDitGlassRawClient	GlassRawClient;
+	//GlassRawClient.ConnectServer();
+	//CDitGlassRawClient* pShared = &GlassRawClient;
+	//
+	//_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 DEL End >*/
 
 	strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
 
@@ -57,6 +59,13 @@
 
 	if(pf == NULL)
 		return FALSE;
+		
+	/*< KJG 20211208 : #3696 ADD Start >*/
+	CDitGlassRawClient	GlassRawClient;
+	GlassRawClient.ConnectServer();
+	CDitGlassRawClient* pShared = &GlassRawClient;
+	_grmDefectData* pGrmStack;
+	/*< KJG 20211208 : #3696 ADD End >*/
 
 	std::vector<_StackDefectCPJT> vecStackDefect;
 	_StackDefectCPJT StackDefect;
@@ -152,6 +161,9 @@
 			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;
+			/* <KYH 211129 : #3796 ADD Start> */
+			else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "ND")) pGrmStack->m_DefectJudgement = Judge_ND;
+			/* <KYH 211129 : #3796 ADD End> */
 			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;
@@ -209,7 +221,7 @@
 	return &pBuf[nLen+1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 태현[2017/3/29]
 }
 
-BOOL CStackResultCPJT::readOptionFile( char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
+BOOL CStackResultCPJT::readOptionFile( char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
 {
 	if(pFileName == NULL) pFileName = m_strConfigFile;
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.h b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.h
index 80da903..b36265e 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.h
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCPJT.h
@@ -4,7 +4,7 @@
 #include "akCore/akFileUtil.h"
 
 
-//enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size 추가
+//enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_LN, Judge_Unknown };//2016.07.13 LHS Judge_Size 추가
 
 struct _StackDefectCPJT
 {
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCSOT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCSOT.cpp
index 0a26a55..21ff96f 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCSOT.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/StackResultCSOT.cpp
@@ -110,7 +110,7 @@
 	return &pBuf[nLen+1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 태현[2017/3/29]
 }
 
-BOOL CStackResultCSOT::readOptionFile( char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
+BOOL CStackResultCSOT::readOptionFile( char* pFileName /*= "D:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
 {
 	if(pFileName == NULL) pFileName = m_strConfigFile;
 
diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/akLoggerExt.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/akLoggerExt.cpp
index 0bdce69..140eaf1 100644
--- a/DitGlassRawMessenger/DitGlassRawMessenger/akLoggerExt.cpp
+++ b/DitGlassRawMessenger/DitGlassRawMessenger/akLoggerExt.cpp
@@ -37,7 +37,7 @@
 // 		st.wDay);
 
 	sprintf(strFileName, "%s\\%02d%02d%02d\\%s_%02d%02d%02d.log", 
-		"C:\\DIT_LogData\\", st.wYear, st.wMonth, st.wDay, 
+		"D:\\DIT_LogData\\", st.wYear, st.wMonth, st.wDay, 
 		"logGlassRawMessenger", st.wYear, st.wMonth, st.wDay);
 
 	ShellExecute(NULL, "Open", "NotePad.exe", strFileName, "", SW_SHOW);
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
index e6a5eb9..e86109c 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
@@ -6,16 +6,11 @@
 {
 	m_hMapBasicInfo = NULL;
 	m_hMapGlassData = NULL;
-	m_pDitGlassClient =NULL;
+
 	m_pGlassRawInfo = NULL;
 	m_pGlassRawData = NULL;
 
 	m_nLastCommandIdx = -1;
-
-	m_pGlassData = NULL;
-	m_pBlockData = NULL;
-	m_pCellData = NULL;
-	m_pDefectData = NULL;
 }
 
 CDitGlassRawClient::~CDitGlassRawClient(void)
@@ -105,7 +100,9 @@
 	m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
 	m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
 	m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 	return TRUE;
 }
@@ -172,7 +169,9 @@
 	if(isConnect() == FALSE) return FALSE;
 	m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
 	m_pGlassData->m_bStackRead = FALSE;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	m_pGlassData->m_bRawMergeRead = FALSE;
+	/*< KJG 20211024 - #3487 ADD End >*/
 	return SetCommand(grcSequenceGlassLoading);
 }
 
@@ -204,16 +203,6 @@
 	return SetCommand(grcSequenceCustomReviewDataRead);
 }
 
-CDitGlassRawClient* CDitGlassRawClient::GetInstance()
-{
-	if(m_pDitGlassClient == NULL)
-	{
-		m_pDitGlassClient = new CDitGlassRawClient;
-	}
-
-	return m_pDitGlassClient;
-}
-
 void CDitGlassRawClient::RemoveReviewDefects()
 {
 	int nDefectNum = m_pGlassData->m_nDefectNum;
@@ -238,5 +227,3 @@
 
 	m_pGlassData->m_nDefectNum = nDefectNum-nDefectDeleteNum;
 }
-
-CDitGlassRawClient* CDitGlassRawClient::m_pDitGlassClient;
\ No newline at end of file
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawClient.h b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
index df54a2e..dfdfb4b 100644
--- a/DitGlassRawMessenger/Extern/DitGlassRawClient.h
+++ b/DitGlassRawMessenger/Extern/DitGlassRawClient.h
@@ -1,7 +1,6 @@
 #pragma once
 
 #include "DitGlassRawStruct.h"
-#include <afxmt.h>
 
 class CDitGlassRawClient
 {
@@ -10,8 +9,6 @@
 	~CDitGlassRawClient(void);
 
 public:
-	static CDitGlassRawClient* GetInstance(); //cmark
-
 	BOOL ConnectServer();
 	BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
 
@@ -33,7 +30,9 @@
 	_grmCellData*	GetCellData(int nIndex){return &m_pCellData[nIndex];};
 	_grmDefectData*	GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
 	_grmDefectData*	GetStackData(int nIndex) { return &m_pStackData[nIndex];};
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	_grmDefectData*	GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
+	/*< KJG 20211024 - #3487 ADD End >*/
 
 	//결과 파일 강제 쓰기 명령 [김태현 2018/11/12]
 	BOOL WriteAOIRawFile();
@@ -50,14 +49,16 @@
 	BOOL ConnectGlassRawInfo();
 	BOOL ConnectGlassRawData();
 	BOOL SetCommand(emGlassRawCommand nCmd);
-	static CDitGlassRawClient* m_pDitGlassClient; //cmark
+
 protected:
 	_grmGlassData*  m_pGlassData;
 	_grmBlockData*		m_pBlockData;
 	_grmCellData*   m_pCellData;
 	_grmDefectData* m_pDefectData;
 	_grmDefectData* m_pStackData;
+	/*< KJG 20211024 - #3487 ADD Start >*/
 	_grmDefectData* m_pRawMergeData;
+	/*< KJG 20211024 - #3487 ADD End >*/
 protected:
 	HANDLE		m_hMapBasicInfo;
 	HANDLE		m_hMapGlassData;
diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h
deleted file mode 100644
index e5f7a55..0000000
--- a/DitGlassRawMessenger/Extern/DitGlassRawStruct_0331.h
+++ /dev/null
@@ -1,750 +0,0 @@
-#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

--
Gitblit v1.9.3