From 3ce48f6dbeb537e252edb0d62c88a28796e36674 Mon Sep 17 00:00:00 2001
From: SWK <sungwk82@diteam.co.kr>
Date: 월, 26 12월 2022 15:04:42 +0900
Subject: [PATCH] ongoing60 #4403 CF AOI Review TACT 지연 개선 1. 신호 출력 방식 재개선  - 유지 시간이 없는 신호는 바로 출력 진행하도록 변경 2. 불필요 Delay 제거 및 시퀀스 변경  - 얼라인 측정 종료 처리 간 제어 신호 먼저 출력 후 카메라 Stop으로 변경  - 물류 정보 읽기 처리 후 1000ms Delay 삭제  - 얼라인 측정 시작(카메라 Live Start) 후 Delay 300ms -> 100ms(이미지 들어오는 시간 확보 필요)  - ReadRawFile 처리 시작 전 500ms Delay 삭제  - Path Scheduling 완료 후 Review Ready 신호 출력 전 1000ms Delay 삭제 3. 버그 수정  - 이미지 저장 경로 생성 간 예외 처리 부분 버그 수정 4. 로그 시간 출력 불합리 개선  - 로그 시간이 파일 출력 시점으로 작성되어 로그 스래드 지연 시 시간이 맞지 않는 불합리 있음  - 로그 시간은 로그 발생 시점에 시간 저장, 해당 시간 이용하여 파일에 기록하도록 변경

---
 ReviewSystem/ReviewSystem/ReviewInterface.cpp |  831 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 745 insertions(+), 86 deletions(-)

diff --git a/ReviewSystem/ReviewSystem/ReviewInterface.cpp b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
index 9c6774d..944250b 100644
--- a/ReviewSystem/ReviewSystem/ReviewInterface.cpp
+++ b/ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -67,6 +67,8 @@
 #include "akAOISharedSystem.h"
 #include "DlgModuleInfo.h"
 
+#include <Psapi.h>
+
 using namespace CHReviewResult;
 using namespace CHImageControls;
 
@@ -111,6 +113,14 @@
 
 	// single variable
 	m_strProgramVersion			= _T("");		// program version
+	/*< LYW 20220415 - #4086 ADD Start >*/
+	m_nFDCGRMSWVersion = 20220101;
+	m_nFDCFTPUploaderSWVersion = 20220101;
+	m_nFDCSyncSWVersion = 20220101;
+	m_nFDCReviewSWVersion = 20220101;
+	m_nFDCWSISWVersion00 = 20220101;
+	m_nFDCWSISWVersion01 = 20220101;
+	/*< LYW 20220415 - #4086 ADD End >*/
 	m_ProcessTimer.End();						// process timer
 
 	// multi variable	
@@ -123,6 +133,17 @@
 	m_nCurrentWsiMode	= 0;
 	m_bIsOffSetOn = 0;
 	m_bIsSimulation = 0;
+
+	m_bFirstReviewLeft = 0;
+	m_bFirstReviewRight = 0;
+
+	/*< LYW 20211014 - #3671 ADD Start >*/
+	m_daccumulate = 0;
+	/*< LYW 20211014 - #3671 ADD End >*/
+	/*< LYW 20211109 - #3662 ADD Start >*/
+	m_nReview00ImageContrast = 5;
+	m_nReview01ImageContrast = 5;
+	/*< LYW 20211109 - #3662 ADD End >*/
 
 	// cs init
 	InitializeCriticalSection(&m_csReviewResult);
@@ -141,6 +162,8 @@
 {	
 	if (m_pDoc==NULL) return FALSE;
 
+	Start3rdPartyProgram();
+
 	CreateDirectory(_REVIEW_SERVER_BASE_PATH_, NULL);
 	CreateDirectory(_REVIEW_SERVER_LOG_PATH_, NULL);
 	CreateDirectory(_REVIEW_SERVER_CONFIG_PATH_, NULL);
@@ -148,10 +171,10 @@
 	//�떆�옉�븷�븣 �떎 吏��슦怨� �떎�떆 蹂듭궗媛� �븘�슂�븷吏�
 	//std::experimental::filesystem::remove_all(_REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT);
 	//std::experimental::filesystem::remove_all(_REVIEW_RECIPE_BACKUP_PATH_CPJT);
-	ISP2P_CopyFolder(_REVIEW_SERVER_CONFIG_PATH_, _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT);
-	ISP2P_CopyFolder(_REVIEW_RECIPE_PATH_, _REVIEW_RECIPE_BACKUP_PATH_CPJT);
+	//ISP2P_CopyFolder(_REVIEW_SERVER_CONFIG_PATH_, _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT);
+	//ISP2P_CopyFolder(_REVIEW_RECIPE_PATH_, _REVIEW_RECIPE_BACKUP_PATH_CPJT);
 	//LYW_#3344_CF AOI Review Config File 諛깆뾽 湲곕뒫 媛쒖꽑 ADD END
-	SetProgramVersion();
+	SetReviewProgramVersion();
 
 	// init review data
 	if (m_pDoc->InitReviewData()==FALSE) 
@@ -176,6 +199,10 @@
 	{
 		m_pView->CreateDialogs(pSystemInfo->m_nLineType, pSystemInfo->m_nMachineType, pSystemInfo->m_bUseVisionAlign);
 	}
+
+	/*< LYW 20220415 - #4086 ADD Start >*/
+	_beginthread(threadSet3rdPartyProgramVersion, NULL, this);
+	/*< LYW 20220415 - #4086 ADD End >*/
 
 	// system type log : SW Version 異붽�
 	g_pLog->DisplayMessage(_T("Starting ReviewSystem Program! (%s)"), m_strProgramVersion);
@@ -359,20 +386,24 @@
 {
 	TRACE(_T("[A2E]DeinitReviewInterface �떆�옉\n"));
 
-	if (m_pView)
-	{
-		m_pView->DeleteDialogs();
-	}
-
-	ClearAllObserverVector();
-	g_pLog->DisplayMessage(_T("Clear all Observer Vectors"));
-	::Sleep(400);
-
 	m_ProcessTimer.Start();
 	DisconnectReviewCamera();
 	DeinitReviewCamera();
 	m_ProcessTimer.End();
+
+	Terminate3rdPartyProgram();
+	
+	if (m_pView)
+	{
+		m_pView->DeleteDialogs();
+	}
 	g_pLog->DisplayMessage(_T("ReviewCamera Deinit Time : %f ms"), m_ProcessTimer.GetDurationMilliSecond());
+
+	g_pLog->DisplayMessage(_T("Program exit by User!"));
+
+	ClearAllObserverVector();
+	g_pLog->DisplayMessage(_T("Clear all Observer Vectors"));
+	::Sleep(400);
 
 	m_ProcessTimer.Start();
 	DeinitAlignCamera();
@@ -465,8 +496,6 @@
 	DeinitSharedImage();
 	g_pLog->DisplayMessage(_T("Deinit Shared Image"));
 
-
-
 	DeinitTotalPitchMeasure();
 	g_pLog->DisplayMessage(_T("Deinit TotalPitch Measure"));
 
@@ -552,32 +581,262 @@
 	AFM_SetAFMZoomLevel(0, 0);
 }
 
-
-void CReviewInterface::SetProgramVersion()
+/*< LYW 20220415 - #4086 ADD Start >*/
+void CReviewInterface::threadSet3rdPartyProgramVersion(void* pArg)
 {
+	CReviewInterface* pThis = (CReviewInterface*)pArg;
+	/*< SWK 20221222 - #4403 MOD Start >*/
+//	//LYW0412
+//	BOOL bReturn, bRetFTPUploader = FALSE, bRetGRM = FALSE, bRetSync = FALSE;
+// 	CFileFind finder;
+// 	CTime timeLastWrite;
+// 	TCHAR currentPath[MAX_PATH];
+// 	DWORD dwPid;
+// 	HWND hWnd;
+// 	HANDLE hHandle;
+// 	CString strTemp;
+// 
+// 	while ((bRetFTPUploader&bRetGRM&bRetSync) != TRUE) 
+// 	{
+// 		bReturn = FALSE;
+// 
+// 		//FTPUploader S/W Version Start
+// 		if (bRetFTPUploader == FALSE)
+// 		{
+// 			dwPid = 0;
+// 			hWnd = ::FindWindow(NULL, _T("FTPUploader"));
+// 			GetWindowThreadProcessId(hWnd, &dwPid);
+// 			hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
+// 			ZeroMemory(currentPath, MAX_PATH);
+// 			GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
+// 
+// 			bReturn = finder.FindFile(currentPath);
+// 		}
+// 
+// 		while (bReturn)
+// 		{
+// 			bReturn = finder.FindNextFile();
+// 
+// 			if (finder.IsDots()) continue;
+// 			if (finder.IsDirectory()) continue;
+// 
+// 			finder.GetLastWriteTime(timeLastWrite);
+// 			strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
+// 			pThis->m_nFDCFTPUploaderSWVersion = atoi(strTemp);
+// 			g_pLog->DisplayMessage(_T("FDCFTPUploaderSWVersion = %d "), pThis->m_nFDCFTPUploaderSWVersion);
+// 			bRetFTPUploader = TRUE;
+// 		}
+// 		//FTPUploader S/W Version End
+// 
+// 		bReturn = FALSE;
+// 
+// 		//Dit Glass Raw Messenger S/W Version Start
+// 		if (bRetGRM == FALSE)
+// 		{
+// 			dwPid = 0;
+// 			hWnd = ::FindWindow(NULL, _T("Dit Glass Raw Messenger"));
+// 			GetWindowThreadProcessId(hWnd, &dwPid);
+// 			hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
+// 			ZeroMemory(currentPath, MAX_PATH);
+// 			GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
+// 
+// 			bReturn = finder.FindFile(currentPath);
+// 		}
+// 
+// 		while (bReturn)
+// 		{
+// 			bReturn = finder.FindNextFile();
+// 
+// 			if (finder.IsDots()) continue;
+// 			if (finder.IsDirectory()) continue;
+// 
+// 			finder.GetLastWriteTime(timeLastWrite);
+// 			strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
+// 			pThis->m_nFDCGRMSWVersion = atoi(strTemp);
+// 			g_pLog->DisplayMessage(_T("FDCGRMSWVersion = %d "), pThis->m_nFDCGRMSWVersion);
+// 			bRetGRM = TRUE;
+// 		}
+// 		//Dit Glass Raw Messenger S/W Version End
+// 
+// 		bReturn = FALSE;
+// 
+// 		//Dit Shared Memory Sync Client S/W Version Start
+// 		if (bRetSync == FALSE)
+// 		{
+// 			dwPid = 0;
+// 			hWnd = ::FindWindow(NULL, _T("Dit Shared Memory Sync Client"));
+// 			GetWindowThreadProcessId(hWnd, &dwPid);
+// 			hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
+// 			ZeroMemory(currentPath, MAX_PATH);
+// 			GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
+// 
+// 			bReturn = finder.FindFile(currentPath);
+// 		}
+// 
+// 		while (bReturn)
+// 		{
+// 			bReturn = finder.FindNextFile();
+// 
+// 			if (finder.IsDots()) continue;
+// 			if (finder.IsDirectory()) continue;
+// 
+// 			finder.GetLastWriteTime(timeLastWrite);
+// 			strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
+// 			pThis->m_nFDCSyncSWVersion = atoi(strTemp);
+// 			g_pLog->DisplayMessage(_T("FDCSyncSWVersion = %d "), pThis->m_nFDCSyncSWVersion);
+// 			bRetSync = TRUE;
+// 		}
+// 		//Dit Shared Memory Sync Client S/W Version End
+// 	}
+//
+//	finder.Close();
+
+	auto GetModuleFileLastTime = [](LPCTSTR strWindowTitle)->long {
+		long nLastTime = 0;
+		DWORD dwPid = 0;
+
+		HWND hWnd = ::FindWindow(NULL, strWindowTitle);
+		if (hWnd == INVALID_HANDLE_VALUE)
+			return nLastTime;
+
+		GetWindowThreadProcessId(hWnd, &dwPid);
+		HANDLE hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
+		TCHAR currentPath[MAX_PATH];
+		ZeroMemory(currentPath, MAX_PATH);
+		GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
+
+		CFileFind finder;
+		if (finder.FindFile(currentPath))
+		{
+			finder.FindNextFile();
+
+			if (finder.IsDirectory() || finder.IsDots())
+				return nLastTime;
+
+			CTime timeLastWrite;
+			finder.GetLastWriteTime(timeLastWrite);
+			nLastTime = atoi(timeLastWrite.Format(_T("%Y%m%d")));
+		}
+		return nLastTime;
+	};
+
+	BOOL bRetFTPUploader = FALSE, bRetGRM = FALSE, bRetSync = FALSE;
+	while ((bRetFTPUploader&bRetGRM&bRetSync) != TRUE)
+	{
+		//FTPUploader S/W Version
+		if (bRetFTPUploader == FALSE)
+		{
+			if (pThis->m_nFDCFTPUploaderSWVersion = GetModuleFileLastTime(_T("FTPUploader")))
+			{
+				g_pLog->DisplayMessage(_T("FDCFTPUploaderSWVersion = %d "), pThis->m_nFDCFTPUploaderSWVersion);
+				bRetFTPUploader = TRUE;
+			}
+		}
+		Sleep(1);
+		//Dit Glass Raw Messenger S/W Version
+		if (bRetGRM == FALSE)
+		{
+			if (pThis->m_nFDCGRMSWVersion = GetModuleFileLastTime(_T("Dit Glass Raw Messenger")))
+			{
+				g_pLog->DisplayMessage(_T("FDCGRMSWVersion = %d "), pThis->m_nFDCGRMSWVersion);
+				bRetGRM = TRUE;
+			}
+		}
+		Sleep(1);
+		//Dit Shared Memory Sync Client S/W Version Start
+		if (bRetSync == FALSE)
+		{
+			if (pThis->m_nFDCSyncSWVersion = GetModuleFileLastTime(_T("Dit Shared Memory Sync Client")))
+			{
+				g_pLog->DisplayMessage(_T("FDCSyncSWVersion = %d "), pThis->m_nFDCSyncSWVersion);
+				bRetSync = TRUE;
+			}
+		}
+		Sleep(1);
+	}
+	/*< SWK 20221222 - #4403 MOD End >*/
+}
+
+void CReviewInterface::SetReviewProgramVersion()
+{
+	//LYW0412
 	BOOL bReturn;
 	CFileFind finder;
 	CTime timeLastWrite;
 	TCHAR currentPath[MAX_PATH];
+	CString strTemp;
 
-	::GetModuleFileName( AfxGetInstanceHandle(), currentPath, MAX_PATH);
+	//Review S/W Version Start
+	::GetModuleFileName(AfxGetInstanceHandle(), currentPath, MAX_PATH);
 
 	bReturn = finder.FindFile(currentPath);
 
-	while(bReturn)
+	while (bReturn)
 	{
 		bReturn = finder.FindNextFile();
 
-		if(finder.IsDots()) continue;
-		if(finder.IsDirectory()) continue;
+		if (finder.IsDots()) continue;
+		if (finder.IsDirectory()) continue;
 
 		finder.GetLastWriteTime(timeLastWrite);
-		m_strProgramVersion.Format(_T("Build[ %04d.%02d.%02d %02d:%02d ]"), 
+		m_strProgramVersion.Format(_T("Build[ %04d.%02d.%02d %02d:%02d ]"),
 			timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay(), timeLastWrite.GetHour(), timeLastWrite.GetMinute());
+		strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
+		m_nFDCReviewSWVersion = atoi(strTemp);
+		g_pLog->DisplayMessage(_T("FDCReviewSWVersion = %d "), m_nFDCReviewSWVersion);
 	}
-
-	finder.Close();
+	//Review S/W Version End
 }
+
+/*< LYW 20220426 - #4086 ADD Start >*/
+void CReviewInterface::Start3rdPartyProgram()
+{
+// 	if(StartWindowIDProgram(_T("FTPUploader"), _T("D:\\DIT_3rdParty\\FTPUpload\\FTPUploader.exe")))
+// 		g_pLog->DisplayMessage(_T("FDCFTPUploader Start Success"));
+// 	else g_pLog->DisplayMessage(_T("FDCFTPUploader Start Fail"));
+
+	if (StartWindowIDProgram(_T("Dit Glass Raw Messenger"), _T("D:\\DIT_3rdParty\\GlassRawMessenger\\DitGlassRawMessenger_x64.exe")))
+		g_pLog->DisplayMessage(_T("DitGlassRawMessenger Start Success"));
+	else g_pLog->DisplayMessage(_T("DitGlassRawMessenger Start Fail"));
+}
+
+int CReviewInterface::StartWindowIDProgram(CString WindowID, CString ProgramPath)
+{
+	HWND hWnd = ::FindWindow(NULL, WindowID);
+	if (hWnd == NULL)
+	{
+		if(ShellExecute(hWnd, NULL, ProgramPath, NULL, NULL, SW_SHOWMINIMIZED))
+			return TRUE;
+		else return FALSE;
+	}
+	return TRUE;
+}
+
+void CReviewInterface::Terminate3rdPartyProgram()
+{
+	/*TerminateWindowIDProgram(_T("FTPUploader"));*/
+	TerminateWindowIDProgram(_T("Dit Glass Raw Messenger"));
+	TerminateWindowIDProgram(_T("gnuplot"));
+	KillProcess("wgnuplot.exe");
+}
+
+void CReviewInterface::TerminateWindowIDProgram(CString WindowID)
+{
+	HWND hWnd = ::FindWindow(NULL, WindowID);
+	if (hWnd != NULL)
+	{
+		DWORD ProcessId;
+		GetWindowThreadProcessId(hWnd, &ProcessId);
+		HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, ProcessId);
+		if (hProcess != NULL)
+		{
+			TerminateProcess(hProcess, 0);
+		}
+
+	}
+}
+/*< LYW 20220426 - #4086 ADD End >*/
+/*< LYW 20220415 - #4086 ADD End >*/
 
 void CReviewInterface::CreateSystemDirectory()
 {
@@ -1172,6 +1431,10 @@
 			BOOL bConnection = pCameraControlReview->GetConnected();
 			pConnectionStatus->m_vecReviewCameraStatus.push_back(bConnection);
 
+			/*< LYW 20211112 - #3708 ADD Start >*/
+			g_pLog->DisplayMessage(_T("[ReviewCamera] %d is connected"), nModuleIndex);
+			/*< LYW 20211112 - #3708 ADD End >*/
+
 			nModuleIndex++; // module status++
 		} // for HeaderIdx
 	} // for nGantryIdx
@@ -1269,7 +1532,7 @@
 		// process status observer
 		AddObserverUpdateProcessStatus(static_cast<IUpdateProcessStatus*>(m_pAlignCameraControl));
 
-		m_pAlignCameraControl->Camera_Control(CameraControlLive);		
+		/*m_pAlignCameraControl->Camera_Control(CameraControlLive);*/	  // 210805 Align Camera Sequence 蹂�寃�
 	}
 	else
 	{
@@ -2747,6 +3010,21 @@
 	return -1;
 }
 
+void CReviewInterface::IWC2P_SetWSIVersion(int nModuleIndex, int nVersion)
+{
+	switch (nModuleIndex)
+	{
+	case 0:
+		m_nFDCWSISWVersion00 = nVersion;
+		break;
+	case 1:
+		m_nFDCWSISWVersion01 = nVersion;
+		break;
+	default:
+		break;
+	}
+}
+
 void CReviewInterface::IWC2P_SetConnectedStatus(int nModuleIndex, int nConnectStatus)
 {
 	CString strMessage = _T("");
@@ -2874,24 +3152,36 @@
 
 			double dAccdata = measureResut.dAccuracy;
 			double dRbtdata = measureResut.dRepeatability;
+			double dDiagnosisHeight[10];
+
+			for (int i = 0; i < 10; i++)
+			{
+				dDiagnosisHeight[i] = measureResut.dDiagnosisHeight[i];
+			}
+
 			if (nModuleIndex == 0)
 			{
 				m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetACC(dAccdata);
 				m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetRTB(dRbtdata);
+				for (int i = 0; i < 10; i++)
+				{
+					m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetDiagnosisHeight(dDiagnosisHeight[i], i);
+				}
 				m_vecWSIControl[0]->SendWsiAfmSafePosMove();
 			}
 			else if (nModuleIndex == 1)
 			{
 				m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetACC(dAccdata);
 				m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetRTB(dRbtdata);
+				for (int i = 0; i < 10; i++)
+				{
+					m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetDiagnosisHeight(dDiagnosisHeight[i], i);
+				}
 				m_vecWSIControl[1]->SendWsiAfmSafePosMove();
 			}
 		
 
 			m_pDlgDiagnosis->m_pDlgWsi->UpdateWSIResult(nModuleIndex,dAccdata, dAccdata, dRbtdata, dRbtdata);
-			
-			
-			
 
 			m_pDlgDiagnosis->m_pDiagnosisManager->setWSIVLSIEnd(true);
 		}
@@ -3100,6 +3390,16 @@
 	return AlignLight_GetLightLevel(nCameraIndex, nValue);
 }
 
+int CReviewInterface::IACC2P_GetAccumaulate()
+{
+	return m_daccumulate;
+}
+
+void CReviewInterface::IACC2P_SetAccumaulate(int dValue)
+{
+	m_daccumulate = dValue;
+}
+
 BOOL CReviewInterface::IRCC2P_GetCurrentFrame(int nModuleIndex, int nCameraIndex, int nFrameWidth, int nFrameHeight, int nFrameChannels, CCHImageData* pImageData)
 {
 	if (m_pVirtualGlassMap==NULL) return FALSE;
@@ -3305,6 +3605,12 @@
 	return m_pDoc->System_GetSystemInfo();
 }
 
+const CSignalControlInfo* CReviewInterface::IRP2P_GetReviewSignalinfo()
+{
+	if (m_pDoc == NULL) return NULL;
+	return m_pDoc->System_GetSignalInfo();
+}
+
 CGlassResult* CReviewInterface::IRP2P_GetCurrentGlassResult()
 {
 	if (m_pDoc==NULL) return NULL;
@@ -3367,6 +3673,46 @@
 	return m_pEdgeRecipeManager;
 }
 
+BOOL CReviewInterface::IRP2P_GetFirstReviewLeft()
+{
+	return m_bFirstReviewLeft;
+}
+
+BOOL CReviewInterface::IRP2P_GetFirstReviewRight()
+{
+	return m_bFirstReviewRight;
+}
+
+void CReviewInterface::IRP2P_SetFirstReviewLeft(BOOL b_Check)
+{
+	m_bFirstReviewLeft = b_Check;
+}
+
+void CReviewInterface::IRP2P_SetFirstReviewRight(BOOL b_Check)
+{
+	m_bFirstReviewRight = b_Check;
+}
+
+BOOL CReviewInterface::IRP2P_GetReview00ImageContrast()
+{
+	return m_nReview00ImageContrast;
+}
+
+BOOL CReviewInterface::IRP2P_GetReview01ImageContrast()
+{
+	return m_nReview01ImageContrast;
+}
+
+void CReviewInterface::IRP2P_SetReview00ImageContrast(int n_Value)
+{
+	m_nReview00ImageContrast = n_Value;
+}
+
+void CReviewInterface::IRP2P_SetReview01ImageContrast(int n_Value)
+{
+	m_nReview01ImageContrast = n_Value;
+}
+
 
 int CReviewInterface::PS2P_GetModuleStatusCount(int nModuleType)
 {
@@ -3422,6 +3768,14 @@
 	CDlgDefectMap* pDefectmap =  m_pView->GetDefectMapDlgHandle();
 	if (pDefectmap == NULL) { return FALSE; }
 	pDefectmap->GetDefectMap()->SetOffsetmodeparma(bMode, nCamidx, nScanidx, nXpos, nYpos);
+	return FALSE;
+}
+
+BOOL CReviewInterface::IDRO2P_SetOffsetPram(int nCamIdx, int nScanIdx, BOOL bUse)
+{
+	CDlgDefectMap* pDefectmap = m_pView->GetDefectMapDlgHandle();
+	if (pDefectmap == NULL) { return FALSE; }
+	pDefectmap->GetDefectMap()->SetOffsetparm(nCamIdx, nScanIdx, bUse);
 	return FALSE;
 }
 
@@ -3506,6 +3860,16 @@
 
 	return m_pMotorControl->IsGantryMotionEnd(nModuleIdx);
 
+}
+
+BOOL CReviewInterface::IDP2P_CheckManualMode()
+{
+	if (IsManualProcessMode() == TRUE)
+	{
+		return TRUE;
+	}
+	
+	return FALSE;
 }
 
 int CReviewInterface::IDP2P_GetSelectedModuleIndex()
@@ -3776,12 +4140,15 @@
 	if (m_SequenceProcessor == NULL) return;
 	m_SequenceProcessor->SetWsiType(9);
 
-	if (!m_SequenceProcessor->WSIAllReadySignal(1))
+	if (nModuleIdx == 0)
 	{
-		g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
+		if (!m_SequenceProcessor->WSIAllReadySignal(1))
+		{
+			g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
+			return;
+		}
 	}
-	else
-	{
+
 		SetCurrentWsiMode(WsiMeasureType_VLSI);
 
 		CWsiControl* pWsiControl = ISP2P_GetWSIControl(nModuleIdx);
@@ -3795,7 +4162,6 @@
 
 		pWsiControl->SetWsiStart(1, vectorPosX, vectorPosY, 0);
 
-	}
 }
 
 void CReviewInterface::IDP2P_WsiMotorMotionEnd(int nModuleIdx, double dPosX, double dPosY)
@@ -5719,6 +6085,12 @@
 		pGlassResult->m_AlignRecipe.dMatchingRate		= pRsRcpAlignInfo->m_dMatchingRate;
 		pGlassResult->m_AlignRecipe.strFirstImageFile	= pRsRcpAlignInfo->m_strFirstImageFile;
 		pGlassResult->m_AlignRecipe.strSecondImageFile	= pRsRcpAlignInfo->m_strSecondImageFile;
+		/*< LYW 20211012 - #3671 ADD Start >*/
+		pGlassResult->m_AlignRecipe.strFirstAssistantImageFile = pRsRcpAlignInfo->m_strFirstAssistantImageFile;
+		pGlassResult->m_AlignRecipe.strSecondAssistantImageFile = pRsRcpAlignInfo->m_strSecondAssistantImageFile;
+		pGlassResult->m_AlignRecipe.strMatchingPixelStandard = pRsRcpAlignInfo->m_strMatchingPixelStandard;
+		pGlassResult->m_AlignRecipe.strMatchingAlarmCondition = pRsRcpAlignInfo->m_strMatchingAlarmCondition;
+		/*< LYW 20211012 - #3671 ADD End >*/
 		pGlassResult->m_AlignRecipe.strTotalPitchImageFile = pRsRcpAlignInfo->m_strTotalPitchImageFile;
 
 		// edge find param
@@ -6320,12 +6692,11 @@
 
 	if (IsManualProcessMode()==FALSE)	{	return;	}
 
-
 	CGlassResult *pGlassResult = m_pDoc->GlassResult_GetCurrentGlassResult();
-	if(pGlassResult == NULL) return;
+	if (pGlassResult == NULL) return;
 
 	const SDefectFilter *pDefectFilter = m_pDoc->Etc_GetDefectFilter();
-	if(pDefectFilter == NULL) return;
+	if (pDefectFilter == NULL) return;
 
 	int nMarginX = nDefectMarginX; //5000; // um
 	int nMarginY = nDefectMarginY; //5000; // um
@@ -6333,6 +6704,9 @@
 
 	MapDefectResult *pMapReviewResult = pGlassResult->GetMapDefectResult();
 
+	BOOL bFind = FALSE;
+
+	//Defect
 	if (pMapReviewResult)
 	{
 		CDefectResult* pDefectResult = NULL;
@@ -6340,28 +6714,28 @@
 		{
 			pDefectResult = static_cast<CDefectResult*>(it->second);
 
-			if(pDefectResult == NULL) continue;
+			if (pDefectResult == NULL) continue;
 
-			if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult)==-1) continue;
+			//if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult) == -1) continue;
 
-			if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX && 
-				pDefectResult->nUMOriginX <= nDefectPosX + nMarginX && 
-				pDefectResult->nUMOriginY >= nDefectPosY - nMarginY && 
+			if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX &&
+				pDefectResult->nUMOriginX <= nDefectPosX + nMarginX &&
+				pDefectResult->nUMOriginY >= nDefectPosY - nMarginY &&
 				pDefectResult->nUMOriginY <= nDefectPosY + nMarginY)
 			{
+				bFind = TRUE;
+
 				m_pView->UpdateSelectDefectList(pDefectResult->nDefectIdx);
 				m_pView->UpdateSelectDefectMap(pDefectResult);
-
-				m_pView->UpdateSelectDefectInfoMap(pDefectResult); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �젙蹂대�� �꽆湲대떎
-				m_pView->UpdateSelectDefectInfo(pDefectResult->nDefectIdx); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �궗吏� �젙蹂대�� �꽆湲대떎.
 
 				nSelectedModuleIndex = Module_GetSelectedModuleIndex();
 
 				// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
-				int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				int nGoModuleIndex = nSelectedModuleIndex;
 
 				// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
-				if(nGoModuleIndex >= 0)
+				if (nGoModuleIndex >= 0)
 				{
 					Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
 				}
@@ -6371,21 +6745,145 @@
 					break;
 				}
 
-				if(IsManualProcessMode() != FALSE){
+				if (IsManualProcessMode() != FALSE) {
 
-				Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera,pDefectResult );
+					Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, pDefectResult);
+					return;
 				}
-			//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+				//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
 
-				// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
 				if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
 				{
-					WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, (int)pDefectResult->dUMCenterOriginX, (int)pDefectResult->dUMCenterOriginY, TRUE);
 				}
 				break;
 			}
 		}
 	}
+
+	//User
+	if (bFind == FALSE)
+	{
+		CDefectResult* pDefectResult = NULL;
+
+		VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserResult();
+		if (pVecReviewResult == NULL) return;
+
+		for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
+		{
+			CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
+
+			for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
+			{
+
+				if (its->nUMOriginX >= nDefectPosX - nMarginX &&
+					its->nUMOriginX <= nDefectPosX + nMarginX &&
+					its->nUMOriginY >= nDefectPosY - nMarginY &&
+					its->nUMOriginY <= nDefectPosY + nMarginY)
+				{
+					bFind = TRUE;
+
+					pDefectResult = &(*its);
+
+					m_pView->UpdateSelectDefectMap(pDefectResult);
+
+					nSelectedModuleIndex = Module_GetSelectedModuleIndex();
+
+					// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
+					//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+					int nGoModuleIndex = nSelectedModuleIndex;
+
+					// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
+					if (nGoModuleIndex >= 0)
+					{
+						Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
+					}
+					else
+					{
+						g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
+						break;
+					}
+
+					if (IsManualProcessMode() != FALSE) {
+
+						Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
+						return;
+					}
+					//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+
+						// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
+					{
+						WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	//UserWSI
+	if (bFind == FALSE)
+	{
+		CDefectResult* pDefectResult = NULL;
+
+		VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserWsiResult();
+		if (pVecReviewResult == NULL) return;
+
+		for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
+		{
+			CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
+
+			for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
+			{
+
+				if (its->nUMOriginX >= nDefectPosX - nMarginX &&
+					its->nUMOriginX <= nDefectPosX + nMarginX &&
+					its->nUMOriginY >= nDefectPosY - nMarginY &&
+					its->nUMOriginY <= nDefectPosY + nMarginY)
+				{
+					bFind = TRUE;
+
+					pDefectResult = &(*its);
+
+					m_pView->UpdateSelectDefectMap(pDefectResult);
+
+					nSelectedModuleIndex = Module_GetSelectedModuleIndex();
+
+					// �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜)
+					//int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+					int nGoModuleIndex = nSelectedModuleIndex;
+
+					// �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞
+					if (nGoModuleIndex >= 0)
+					{
+						Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
+					}
+					else
+					{
+						g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
+						break;
+					}
+
+					if (IsManualProcessMode() != FALSE) {
+
+						Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
+						return;
+					}
+					//	Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
+
+						// [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽�
+					if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
+					{
+						WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
+					}
+					break;
+				}
+			}
+		}
+	}
+
 }
 
 
@@ -6480,6 +6978,7 @@
 
 		
 		m_pDlgDiagnosis->ShowWindow(SW_SHOW);
+		return;
 		/*
 		if (m_pSignalControl)
 		{
@@ -6497,6 +6996,14 @@
 	{
 		g_pLog->DisplayMessage(_T("Machine Mode is not Manual or Review Mode!"));
 		return;
+	}
+
+	else
+	{
+		//#3584 210923 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD START
+		m_pSequenceProcessor->SetSimulationMode(TRUE);
+		g_pLog->DisplayMessage(_T("Set User Command = %d"),nCommand);
+		//#3584 210923 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD END
 	}
 
 	m_pSequenceProcessor->RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, nCommand);
@@ -6982,12 +7489,12 @@
 
 	
 
-	if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
-	{
-		IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION);
-		g_pLog->DisplayMessage(_T("Limit 珥덇낵"));
-		return FALSE;
-	}
+// 	if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
+// 	{
+// 		IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION);
+// 		g_pLog->DisplayMessage(_T("Limit 珥덇낵"));
+// 		return FALSE;
+// 	}
 
 	double n1stGantryXpos, n1stGantryYpos, n2ndGantryXpos, n2ndGantryYpos;
 	double dDistance,dCameraDistance;
@@ -7274,44 +7781,48 @@
 
 		dPosX += MagOffsetX * 1000;//GlassOffsetX*1000+MagOffsetX*1000;
 		dPosY+= MagOffsetY * 1000;//GlassOffsetY*1000+MagOffsetY*1000;
-		double xpostemp = 0;
-		double ypostemp = 0;
 
-
-		GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX/1000, xpostemp, ypostemp);
-		xpostemp = floor(xpostemp * 1000);
-		ypostemp = floor(ypostemp * 1000);
-		//210127
-		if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
+		if (pDefectResult != NULL)
 		{
-			if (nModuleIndex == 0)
+			double xpostemp = 0;
+			double ypostemp = 0;
+
+			GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX / 1000, xpostemp, ypostemp);
+			xpostemp = floor(xpostemp * 1000);
+			ypostemp = floor(ypostemp * 1000);
+			//210127
+			if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
 			{
-				dPosX += xpostemp;
-				dPosY += ypostemp;
+				if (nModuleIndex == 0)
+				{
+					dPosX += xpostemp;
+					dPosY += ypostemp;
+				}
+				else
+				{
+					dPosX += xpostemp * -1;
+					dPosY += ypostemp;
+				}
 			}
 			else
 			{
-				dPosX += xpostemp * -1;
-				dPosY += ypostemp;
+				if (nModuleIndex == 0)
+				{
+					dPosX += xpostemp;
+					dPosY += ypostemp * -1;
+				}
+				else
+				{
+					dPosX += xpostemp * -1;
+					dPosY += ypostemp * -1;
+				}
 			}
-		}
-		else
-		{
-			if (nModuleIndex == 0)
-			{
-				dPosX += xpostemp;
-				dPosY += ypostemp * -1;
-			}
-			else
-			{
-				dPosX += xpostemp * -1;
-				dPosY += ypostemp * -1;
-			}
-		}
 
-		g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX,MagOffsetY,dPosX/1000.0,dPosY/1000.0);
-	 //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
-	 //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
+			g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX, MagOffsetY, dPosX / 1000.0, dPosY / 1000.0);
+			//dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
+			//dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
+		}
+		
 	}
 
 	return Motor_CameraGo(nModuleIndex, dPosX/1000.0, dPosY/1000.0, bAutoSelectCamera, bGoEnd);
@@ -8156,6 +8667,62 @@
 	return m_pDoc->Etc_GetTransferData();
 }
 
+BOOL CReviewInterface::ISP2P_GetReview00ImageContrast()
+{
+	return m_nReview00ImageContrast;
+}
+
+BOOL CReviewInterface::ISP2P_GetReview01ImageContrast()
+{
+	return m_nReview01ImageContrast;
+}
+
+void CReviewInterface::ISP2P_SetReview00ImageContrast(int n_Value)
+{
+	m_nReview00ImageContrast = n_Value;
+}
+
+void CReviewInterface::ISP2P_SetReview01ImageContrast(int n_Value)
+{
+	m_nReview01ImageContrast = n_Value;
+}
+
+int CReviewInterface::ISP2P_GetReviewSWVersion()
+{
+	return m_nFDCReviewSWVersion;
+}
+
+int CReviewInterface::ISP2P_GetSyncSWVersion()
+{
+	return m_nFDCSyncSWVersion;
+}
+
+int CReviewInterface::ISP2P_GetGRMSWVersion()
+{
+	return m_nFDCGRMSWVersion;
+}
+
+int CReviewInterface::ISP2P_GetFTPUploaderSWVersion()
+{
+	return m_nFDCFTPUploaderSWVersion;
+}
+
+int CReviewInterface::ISP2P_GetWSISWVersion(int nModuleIndex)
+{
+	switch (nModuleIndex)
+	{
+	case 0:
+		return m_nFDCWSISWVersion00;
+		break;
+	case 1:
+		return m_nFDCWSISWVersion01;
+		break;
+	default:
+		return m_nFDCWSISWVersion00;
+		break;
+	}
+}
+
 SDefectFilter* CReviewInterface::ISP2P_GetDefectFilter()
 {
 	if (m_pDoc==NULL) return NULL;
@@ -8357,6 +8924,26 @@
 	return m_pDlgHistoryTool;
 }
 
+BOOL CReviewInterface::ISP2P_GetFirstReviewLeft()
+{
+	return m_bFirstReviewLeft;
+}
+
+BOOL CReviewInterface::ISP2P_GetFirstReviewRight()
+{
+	return m_bFirstReviewRight;
+}
+
+void CReviewInterface::ISP2P_SetFirstReviewLeft(BOOL b_Check)
+{
+	m_bFirstReviewLeft = b_Check;
+}
+
+void CReviewInterface::ISP2P_SetFirstReviewRight(BOOL b_Check)
+{
+	m_bFirstReviewRight = b_Check;
+}
+
 void CReviewInterface::ILCC2P_DisplayMessage( int nIndex, const TCHAR* lpstrFormat, ... )
 {
 
@@ -8467,6 +9054,66 @@
 void CReviewInterface::IDL2P_OpenHistoryTool()
 {
 	m_pView->ShowHistoryTool();
+}
+
+void CReviewInterface::IDL2P_OpenHWSettingTool()
+{
+	m_pView->ShowHWSettingMode();
+}
+
+BOOL CReviewInterface::IDL2P_IsManualProcessMode()
+{
+	return IsManualProcessMode();
+}
+
+int CReviewInterface::IDHM2P_InitReviewCamera()
+{
+	return InitReviewCamera();
+}
+
+void CReviewInterface::IDHM2P_DeinitReviewCamera()
+{
+	DeinitReviewCamera();
+}
+
+int CReviewInterface::IDHM2P_ConnectReviewCamera()
+{
+	return ConnectReviewCamera();
+}
+
+void CReviewInterface::IDHM2P_DisconnectReviewCamera()
+{
+	DisconnectReviewCamera();
+}
+
+void CReviewInterface::IDHM2P_ClearCameraControlObserverVector()
+{
+	ClearCameraControlObserverVector();
+}
+
+int CReviewInterface::IDHM2P_InitAFMControl()
+{
+	return InitAFMControl();
+}
+
+void CReviewInterface::IDHM2P_DeinitAFMControl()
+{
+	DeinitAFMControl();
+}
+
+int CReviewInterface::IDHM2P_InitAlignCamera()
+{
+	return InitAlignCamera();
+}
+
+void CReviewInterface::IDHM2P_DeinitAlignCamera()
+{
+	DeinitAlignCamera();
+}
+
+BOOL CReviewInterface::IDHM2P_IsManualProcessMode()
+{
+	return IsManualProcessMode();
 }
 
 //181203
@@ -8788,6 +9435,13 @@
 		g_pLog->DisplayMessage(_T("[WSI_%d] Send Motion End to WSI SUCCESS! [%02d][%02d]"), nWsiIndex, nModuleIndex, nWsiIndex);
 }
 
+void CReviewInterface::IMC2P_SendMotorAliveErrorAlram()
+{
+	IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_Review_Motor_Communication_Fail, 1000);
+
+	return;
+}
+
 void CReviewInterface::IWC2P_SetScanEnd( int nIndex, int nPointIndex, int nPositionX, int nPositionY )
 {
 	int nModuleIndex=-1, nWsiIndex=-1;
@@ -8857,6 +9511,11 @@
 	SetCurrentWsiMode(nMode);
 }
 
+void CReviewInterface::ISP2P_InitAlignCamera()
+{
+	InitAlignCamera();
+}
+
 int CReviewInterface::IWC2P_GetWsiType()
 {
 	return GetCurrentWsiMode();

--
Gitblit v1.9.3