From c70166f3e86ffd0528884911483c067a6b21ebdd Mon Sep 17 00:00:00 2001
From: kojingeun <diteam.co.kr>
Date: 금, 30 6월 2023 15:48:59 +0900
Subject: [PATCH] Ongoing60 #4517 CF AOI Review 결과 파일 찾기 실패 개선 1. AOIServer RawBin 폴더 연결 TimerThread 추가  - file_dummy 생성 후 Open/Close 반복(10초) 2. 프로젝트 누락 경로 및 설정 추가  - FTPUploader Include Path, Debug모드 psapi.lib

---
 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp |  410 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 359 insertions(+), 51 deletions(-)

diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
index b5f9c71..6f4417f 100644
--- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
+++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -40,6 +40,11 @@
 #include <fstream>
 #include <afxwin.h>
 
+#include <sstream> /* < KJG 20230605 - #4517 ADD >*/ 
+#include <filesystem> /* < KJG 20230605 - #4517 ADD >*/ 
+
+namespace fs = std::experimental::filesystem::v1; /* < KJG 20230605 - #4517 ADD >*/ 
+
 
 #define GLASS_GD_FILE_PATH			_T("GD")
 #define SIGNAL_SEND_RESULT_SUCCESS	_T("OK")
@@ -166,6 +171,9 @@
 {
 	m_bUseAFMHomePosition = TRUE;
 	m_nGlassCount = 0;
+	m_nStackZeroReviewCondition = 0;
+	m_nUploadResultFailCount = 0;
+	m_nStackUploadFailGlassCount = 0;
 	CDitGlassRawClient* pDitGlassRaw = CDitGlassRawClient::GetInstance();
 	if(pDitGlassRaw->ConnectServer() == FALSE)
 	{
@@ -665,8 +673,14 @@
 		//	m_pSP2P->ISP2P_GetWSIControl(1)->SendWsiAfmSafePosMove();
 		//}
 		//Sleep(5000);
-		SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
-		SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
+		//if (GetProcessStatus() != ProcessReviewEnd_CPJT && GetProcessStatus() != ProcessReviewUnloding_CPJT)
+		if (GetReviewComplete() == FALSE)
+		{
+			SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
+			SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
+			SetReviewComplete(TRUE);
+		}
+
 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
 		//LONGREUN
 		//RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 4);
@@ -936,7 +950,14 @@
 	SetWsiType(-1);    //wsi reflow
 	SetLastPointCheck(FALSE);
 
+	SetReviewComplete(FALSE);
+	//SetUploadResultFailCount(0);
+
 	bFileFind = FALSE;
+	
+	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] FileMonitor Thread Stop Ready"));
+	m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStop(); /* < KJG 20230630 - #4517 ADD Start >*/
+	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] FileMonitor Thread Stop Complete"));
 
 	/*< LYW 20211109 - #3662 Delete Start >*/
 	//m_pSP2P->ISP2P_GetDiagnosisHistory();
@@ -1116,6 +1137,10 @@
  			}
  			
 			m_pSP2P->ISP2P_DisplayMessage(_T("[Glass Loading] Current Apply Recipe Name : %s"), strRecipefile);
+
+			/*< LYW 20220610 - #4185 ADD Start >*/
+			CheckGantryMode();
+			/*< LYW 20220610 - #4185 ADD End >*/
  
 			// recipe data apply
 			if(ApplyRecipeDataToGlassResult(pGlassResult)==FALSE)
@@ -1692,6 +1717,8 @@
 			m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
 	}
 
+	SetUploadResultFailCount(0);
+
 	CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
 	if (pGlassResult == NULL) return;
 
@@ -1737,7 +1764,8 @@
 	m_pDitGlassRaw->GetGlassData()->m_nReviewNum = m_pSP2P->ISP2P_GetReviewProcessor()->GetPlanReviewCount();
     //SendDVDataToSignalControl(); 
 
-	if (GetLastPointCheck() == FALSE)
+	//if (GetLastPointCheck() == FALSE)
+	if (GetReviewComplete() == FALSE)
 	{
 		//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD START
 		if (GetSimulationMode() == FALSE)
@@ -1745,6 +1773,7 @@
 			SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
 			SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
 			m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
+			SetReviewComplete(TRUE);
 		}
 		//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD END
 		//original
@@ -1783,6 +1812,24 @@
 		CDlgDefocusList::GetInstance()->SetDefocusData(strTime,pGlassResult->m_strGlassID,pGlassResult->m_nDeFocusCount);
 
 	}
+
+	if (CheckZeroReviewAlarm() == FALSE && m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nZeroReviewAlarm != 0)
+	{
+		STransferData* pTransferData = m_pSP2P->ISP2P_GetCurrentTransferData();
+		if (pTransferData->strProdType != m_pSP2P->ISP2P_System_GetNetworkInfo()->m_strZeroReviewAlarmExcept)
+		{
+			m_nStackZeroReviewCondition++;
+			m_pSP2P->ISP2P_DisplayMessage(_T("Zero Review Condition ProdType = %s, ConditionStack = %d, AlarmExcept = %s, AlarmCondition = %d"), pTransferData->strProdType, m_nStackZeroReviewCondition, m_pSP2P->ISP2P_System_GetNetworkInfo()->m_strZeroReviewAlarmExcept, m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nZeroReviewAlarm);
+			if (m_nStackZeroReviewCondition >= m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nZeroReviewAlarm)
+			{
+				m_pSP2P->ISP2P_DisplayMessage(_T("Zero Review Alarm! %d ea Glass Is Zero Review!"), m_nStackZeroReviewCondition);
+				SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_Review_0Count_Alarm, 1000);
+				m_nStackZeroReviewCondition = 0;
+			}
+		}
+		else m_nStackZeroReviewCondition = 0;
+	}
+	else m_nStackZeroReviewCondition = 0;
 
 	/*< LYW 20211109 - #3662 Delete Start >*/
 	// 	g_pLog->DisplayMessage(_T("History map Start"));
@@ -1841,7 +1888,10 @@
 	//#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD END
 // 	if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
 // 		m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
-	
+
+	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Ready"));
+	m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStart(); /* < KJG 20230630 - #4517 ADD Start >*/
+	m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Complete"));
 }
 
 
@@ -2848,6 +2898,18 @@
 
 BOOL CSequenceProcessor_CPJT::FindRawBinFile(CString strFileName)
 {
+	/* < KJG 20230605 - #4517 ADD Start >*/
+	auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec)
+	{
+		stringstream ss(Sentence);
+		string tmp;
+
+		while (getline(ss, tmp, Separator)) {
+			vec.push_back(tmp);
+		}
+	};
+	/* < KJG 20230605 - #4517 ADD End >*/
+
 	//210128
 	CString strFilePath = _T("");
 	//pData->GetGlassData()->m_strFileName;
@@ -2869,60 +2931,121 @@
 			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
 			if (nReTryTime%2 == 0)
 			{
-				strFilePath = AOIRAWBIN_PATH;
+				strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
 			}
-			else strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
+			else strFilePath = AOIRAWBIN_PATH;
 
-			strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
-			 akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
-			//LYW LOG
-			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find Path = %s, RetryCount = %d, ResultCode = [%d]"), strFilePath, 30-nReTryTime, GetLastError());
-			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
-			VECFINDDATA* pFindData = akFileFinder.getFindData();
-			int nFileNamePos = strlen(akFileFinder.getProcessPath());
-			std::map<LONGLONG, CString> mapSpanFileName;
-			for (int i = 0; i < pFindData->size(); i++)
+			//strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/
+			//akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/
+
+			/* < KJG 20230605 - #4517 ADD Start >*/
+			auto timeStart = chrono::steady_clock::now();
+			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime);
+
+			std::error_code err;
+			vector<std::string> vtFileList;
+			fs::path pathBinFile(strFilePath.GetBuffer(0));
+			int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' �룷留� �솗�씤
+			for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++)
 			{
-				char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
+				fs::path p = iter->path();
+				if (p.filename().stem().string().find(strFileName) != string::npos)
 				{
-					CakParser parser;
-					parser.process(pFileName, "_.");
-					if (parser.getTokNum() < 4) continue;
-					
-					if (parser.getTokNum() >= 6) continue; // 0401
-
-					int nDataTime[8] = {};
+					std::string strSearchFile = p.filename().stem().string();
+					if (p.extension().string() == _T(".bin"))
 					{
-						int nTokIndex = 0;
-						const char* pGlassId = parser.getTokStr(nTokIndex++);
-						const char* pStepId = parser.getTokStr(nTokIndex++);
-						char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
-						char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
-
-						nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
-						nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
-						nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
-						nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
-						nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
-						nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
+						vtFileList.push_back(p.filename().stem().string());
 					}
-
-					CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
-					CTimeSpan tmSpan = tmReviewLoading - tmTemp;
-					mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
 				}
 			}
 
-			if (mapSpanFileName.empty() == FALSE)
+			for (auto iter = vtFileList.begin(); iter != vtFileList.end(); ) 
 			{
-				if (mapSpanFileName.begin()->first < nCloseTime)
+				vector<string> vtSplit;
+				FuncStringSplit(*iter, _T('_'), vtSplit);
+
+				if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize)
 				{
-					strFindFile = mapSpanFileName.begin()->second;
+					iter++;
+				}
+				else
+				{
+					vtFileList.erase(iter);
+				}
+			}
+
+			sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 理쒖떊�닚�쑝濡� �젙�젹
+
+			string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front();
+			g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str());
+
+			if (vtFileList.empty() == FALSE)
+			{
+				vector<string> vtSplit;
+				FuncStringSplit(strPickFileName, _T('_'), vtSplit);
+				
+				CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2)));
+				CTimeSpan tmSpan = tmReviewLoading - tmTemp;
+				
+				if (tmSpan < nCloseTime)
+				{
+					strFindFile = strPickFileName.c_str();
+					g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success"));
 					break;
 				}
 			}
+			/* < KJG 20230605 - #4517 ADD End >*/
 
-			akFileFinder.clear();
+			/* < KJG 20230605 - #4517 DEL Start >*/ 
+			//#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
+			//VECFINDDATA* pFindData = akFileFinder.getFindData();
+			//int nFileNamePos = strlen(akFileFinder.getProcessPath());
+			//std::map<LONGLONG, CString> mapSpanFileName;
+			//for (int i = 0; i < pFindData->size(); i++)
+			//{
+			//	char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
+			//	{
+			//		CakParser parser;
+			//		parser.process(pFileName, "_.");
+			//		if (parser.getTokNum() < 4) continue;
+			//		
+			//		if (parser.getTokNum() >= 6) continue; // 0401
+			//
+			//		int nDataTime[8] = {};
+			//		{
+			//			int nTokIndex = 0;
+			//			const char* pGlassId = parser.getTokStr(nTokIndex++);
+			//			const char* pStepId = parser.getTokStr(nTokIndex++);
+			//			char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
+			//			char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
+			//
+			//			nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
+			//			nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
+			//			nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
+			//			nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
+			//			nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
+			//			nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
+			//		}
+			//
+			//		CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
+			//		CTimeSpan tmSpan = tmReviewLoading - tmTemp;
+			//		mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
+			//	}
+			//}
+			//
+			//if (mapSpanFileName.empty() == FALSE)
+			//{
+			//	if (mapSpanFileName.begin()->first < nCloseTime)
+			//	{
+			//		strFindFile = mapSpanFileName.begin()->second;
+			//		break;
+			//	}
+			//}
+			//
+			//akFileFinder.clear();
+			/* < KJG 20230605 - #4517 DEL End >*/
+
+
 			Sleep(100);
 		}
 	}
@@ -4285,7 +4408,9 @@
 		{
 			int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 			g_pLog->DisplayMessage(_T("[Collision Position Set Fail] %d Module, Addr: %d, PosX: %.3lfmm"), nModuleIdx, XAddr, dCollisionPosX);
-			return 0;
+			/*< LYW 20220610 - #4185 Delete Start >*/
+			//return 0;
+			/*< LYW 20220610 - #4185 Delete End >*/
 		}
 
 		}
@@ -4583,7 +4708,9 @@
 			{
 				int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 				g_pLog->DisplayMessage(_T("[Collision Position Set Fail] %d Module, Addr: %d, PosX: %.3lfmm"), nModuleIdx, XAddr, dCollisionPosX);
-				return 0;
+				/*< LYW 20220610 - #4185 Delete Start >*/
+				//return 0;
+				/*< LYW 20220610 - #4185 Delete End >*/
 			}
 
 		}
@@ -4836,7 +4963,9 @@
 			{
 				int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 				g_pLog->DisplayMessage(_T("[Collision Position Set Fail] %d Module, Addr: %d, PosX: %.3lfmm"), nModuleIdx, XAddr, dCollisionPosX);
-				return 0;
+				/*< LYW 20220610 - #4185 Delete Start >*/
+				//return 0;
+				/*< LYW 20220610 - #4185 Delete End >*/
 			}
 		}
 
@@ -8237,6 +8366,147 @@
 
 	return;
 }
+
+BOOL CSequenceProcessor_CPJT::CheckZeroReviewAlarm()
+{
+	CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
+	if (pGlassResult == NULL) return FALSE;
+
+	int TotalCount = 0;
+
+	//Defect
+	const VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorReviewResult();
+	if (pVecReviewResult != NULL) 
+	{
+		for (constVectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
+		{
+			const CReviewResult *pReviewResult = static_cast<const CReviewResult*>(&(*it));
+
+			TotalCount += pReviewResult->m_vecSReviewResult.size();
+
+			for (constVectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
+			{
+				if (its->nResultCode > ReviewResult_None)
+				{
+					return TRUE;
+				}
+				else
+				{
+					continue;
+				}
+			}
+		}
+	}
+
+	//DefectWSI
+	const VectorReviewResult *pVecWsiResult = pGlassResult->GetVectorWsiResult();
+	if (pVecWsiResult != NULL)
+	{
+		for (constVectorReviewResultIt it = pVecWsiResult->begin(); it != pVecWsiResult->end(); it++)
+		{
+			const CReviewResult *pWsiResult = static_cast<const CReviewResult*>(&(*it));
+
+			TotalCount += pWsiResult->m_vecSReviewResult.size();
+
+			for (constVectorSReviewResultIt its = pWsiResult->m_vecSReviewResult.begin(); its != pWsiResult->m_vecSReviewResult.end(); its++)
+			{
+				if (its->nResultCode > WsiResult_None)
+				{
+					return TRUE;
+				}
+				else
+				{
+					continue;
+				}
+			}
+		}
+	}
+
+	//User Review
+	const VectorReviewResult *pVecUserReviewResult = pGlassResult->GetVectorUserResult();
+	if (pVecUserReviewResult != NULL)
+	{
+		for (constVectorReviewResultIt it = pVecUserReviewResult->begin(); it != pVecUserReviewResult->end(); it++)
+		{
+			const CReviewResult *pUserReviewResult = static_cast<const CReviewResult*>(&(*it));
+
+			TotalCount += pUserReviewResult->m_vecSReviewResult.size();
+
+			for (constVectorSReviewResultIt its = pUserReviewResult->m_vecSReviewResult.begin(); its != pUserReviewResult->m_vecSReviewResult.end(); its++)
+			{
+				if (its->nResultCode > ReviewResult_None)
+				{
+					return TRUE;
+				}
+				else
+				{
+					continue;
+				}
+			}
+		}
+	}
+
+	//User WSI
+	const VectorReviewResult *pVecUserWsiResult = pGlassResult->GetVectorUserWsiResult();
+	if (pVecUserWsiResult != NULL)
+	{
+		for (constVectorReviewResultIt it = pVecUserWsiResult->begin(); it != pVecUserWsiResult->end(); it++)
+		{
+			const CReviewResult *pUserWsiResult = static_cast<const CReviewResult*>(&(*it));
+
+			TotalCount += pUserWsiResult->m_vecSReviewResult.size();
+
+			for (constVectorSReviewResultIt its = pUserWsiResult->m_vecSReviewResult.begin(); its != pUserWsiResult->m_vecSReviewResult.end(); its++)
+			{
+				if (its->nResultCode > WsiResult_None)
+				{
+					return TRUE;
+				}
+				else
+				{
+					continue;
+				}
+			}
+		}
+	}
+
+	if (TotalCount == 0) return TRUE;
+
+	return FALSE;
+}
+
+void CSequenceProcessor_CPJT::sendUploadResult2SequenceProcessor(int UploadResult)
+{
+	int UploadResultFailCount = GetUploadResultFailCount();
+	if (UploadResult == FALSE)
+	{
+		UploadResultFailCount++;
+		m_pSP2P->ISP2P_DisplayMessage(_T("Upload Ack is False"));
+		if (UploadResultFailCount >= 3)
+		{
+			//SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_ResultData_Upload_Fail, 1000);
+			m_nStackUploadFailGlassCount++;
+			m_pSP2P->ISP2P_DisplayMessage(_T("ResultFile Upload Fail Glass Count = %d"),m_nStackUploadFailGlassCount);
+			if (m_nStackUploadFailGlassCount >= m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nResultFileUploadFailAlarmCondition)
+			{
+				SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_ResultData_Upload_Fail, 1000);
+				m_nStackUploadFailGlassCount = 0;
+				m_pSP2P->ISP2P_DisplayMessage(_T("ResultFile Upload Fail Alarm!"));
+			}
+			SetUploadResultFailCount(-1);
+		}
+		else
+		{
+			SetUploadResultFailCount(UploadResultFailCount);
+		}
+	}
+	else
+	{
+		m_pSP2P->ISP2P_DisplayMessage(_T("Upload Ack is True"));
+		m_nStackUploadFailGlassCount = 0;
+	}
+}
+
 //#3358 KYH FDC  ADD END
 
 DWORD CSequenceProcessor_CPJT::GetDiskUsage()
@@ -9286,7 +9556,7 @@
 	AFM_SetAFMTracking(FALSE);
 
 	SetWsiType(0);
-	WSIAllReadySignal(0);
+	WSIAllReadySignal(1);
 	
 	// send wsi start
 	if(!WSIUserAllStartSignal())
@@ -9517,7 +9787,8 @@
 	VectorDouble vectorCollisionPosX;
 	vectorCollisionPosX.clear();
 
-
+	//WSI
+	pMotorControl->GantrySetTwoGantrySyncModeSend(1);
 
 	// WSI result count
 	for (int nModuleIdx=0; nModuleIdx<Module_GetModuleStatusCount(); nModuleIdx++)
@@ -9561,7 +9832,9 @@
 			{
 				int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 				g_pLog->DisplayMessage(_T("[Collision Position Set Fail] %d Module, Addr: %d, PosX: %.3lfmm"), nModuleIdx, XAddr, dCollisionPosX);
-				return 0;
+				/*< LYW 20220610 - #4185 Delete Start >*/
+				//return 0;
+				/*< LYW 20220610 - #4185 Delete End >*/
 			}
 
 		}
@@ -9604,6 +9877,15 @@
 				vectorPosX.push_back(dDefectPosX);
 				vectorPosY.push_back(dDefectPosY);				
 			}
+		}
+
+		if (vectorPosX.empty() == TRUE)
+		{
+			//3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error START
+			g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point,TwoGantrySyncMode OFF!"), vectorPosX.size());
+			g_pLog->DisplayMessage(_T("[GantryAutoGo] (%d)Gantry Path Send Fail"), pModuleStatus->GetGantryIndex()); //taek 210128
+			pMotorControl->GantrySetTwoGantrySyncModeSend(0);
+			//3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error END
 		}
 
 		if (m_pSP2P->ISP2P_GetReviewProcessor()->CheckMotionComplete() == FALSE)
@@ -9963,13 +10245,15 @@
 				int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 				g_pLog->DisplayMessage(_T("[Review_CollisionPos] %d Module, Addr: %d, PosX: %.3lf mm"), nModuleIdx, XAddr, dCollisionPosX);
 
-				///pGlassResult->SetCollisionXPos(nModuleIdx, dCollisionPosX);
+				//pGlassResult->SetCollisionXPos(nModuleIdx, dCollisionPosX);
 			}
 			else
 			{
 				int XAddr = pMotorControl->GetGantryCollisionXAddr(pModuleStatus->GetGantryIndex());
 				g_pLog->DisplayMessage(_T("[Collision Position Set Fail] %d Module, Addr: %d, PosX: %.3lfmm"), nModuleIdx, XAddr, dCollisionPosX);
-				return 0;
+				/*< LYW 20220610 - #4185 Delete Start >*/
+				//return 0;
+				/*< LYW 20220610 - #4185 Delete End >*/
 			}
 			// get result index
 			int nStartIdx = pWsiMultiShotResult->GetStartSReviewResultIndex();
@@ -10468,6 +10752,30 @@
 	}	
 }
 
+/*< LYW 20220610 - #4185 ADD Start >*/
+void CSequenceProcessor_CPJT::CheckGantryMode()
+{
+	CSignalControl* pSignalControl = m_pSP2P->ISP2P_GetSignalControl();
+	if (pSignalControl == NULL) m_pSP2P->ISP2P_DisplayMessage(_T("[CheckGantryMode] SignalControl is NULL"));
+	if (pSignalControl->IsConnected() == FALSE) m_pSP2P->ISP2P_DisplayMessage(_T("[CheckGantryMode] SignalControl is Not Connect"));
+
+	int LeftGantryUse = 0;
+	int RightGantryUse = 0;
+
+	pSignalControl->ReadData(_T("10003"), 1, 1, LeftGantryUse);
+	pSignalControl->ReadData(_T("10003"), 2, 1, RightGantryUse);
+
+	if (LeftGantryUse == 1 && RightGantryUse == 0) 
+		m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo()->GetRcpSchedulingInfo()->SetSingleGantryPath(1);
+	else if (LeftGantryUse == 0 && RightGantryUse == 1)
+		m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo()->GetRcpSchedulingInfo()->SetSingleGantryPath(2);
+	else
+		m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo()->GetRcpSchedulingInfo()->SetSingleGantryPath(0);
+
+	m_pSP2P->ISP2P_DisplayMessage(_T("[CheckGantryMode] GantryMode LeftBit = %d, RightBit = %d"), LeftGantryUse, RightGantryUse);
+}
+/*< LYW 20220610 - #4185 ADD End >*/
+
 BOOL CSequenceProcessor_CPJT::UpdateMemoryUserReflowPlanInfo(CDitGlassRawClient* pDitSharedGlassRaw)
 {
 	CRsRcpReviewInfo* pRecipeinfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();

--
Gitblit v1.9.3