SDC C-Project CF Review 프로그램
LYW
2022-03-30 e147f44d605bdce9c395c1fd66a88f6cc8106350
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -51,7 +51,7 @@
#define AOIRAWBIN_NETWORK_DRIVE_PATH   "Y:\\RawBin"
enum CPJT_MeasureMode { CPJT_ModeAuto = 0, CPJT_ModeManual };
// [2017:4:18]-[WEZASW] : WSI Module 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占?PlanType 占쏙옙호 占쏙옙占쏙옙.
// [2017:4:18]-[WEZASW] : WSI Module
enum CPJT_PlanType { CPJT_PlanReview = 0, CPJT_PlanUser, CPJT_PlanWSI, CPJT_PlanMeasure, CPJT_PlanReflow, CPJT_PlanWsiReflow, CPJT_PlanWsiUser,CPJT_PlanWsiMultiShot
};
enum CPJT_InsepectionType{REVIEW_REFLOW = 0, WSI_REFLOW, REV_WSI,WSIUSER, USER,WSIMULTISHOT};
@@ -169,7 +169,7 @@
   CDitGlassRawClient* pDitGlassRaw = CDitGlassRawClient::GetInstance();
   if(pDitGlassRaw->ConnectServer() == FALSE)
   {
      g_pLog->DisplayMessage(_T("�����޸� ���� ����!(Shared memory Access Fail)"));
      g_pLog->DisplayMessage(_T("(Shared memory Access Fail)"));
   }
}
    
@@ -183,17 +183,15 @@
   EnterCriticalSection(&m_csProcessStatus);
   
   BOOL bReturn = FALSE;
   // ���� ���°� ���� ���¿� �ٸ���?
   
   //if (nProcessStatus!=m_nProcessStatus || nProcessStatus==0)
   if (1)//nProcessStatus!=m_nProcessStatus || nProcessStatus==0)
   {
      //if (nProcessStatus==0) // �ʱ�(0) �����̸�..
      //if (nProcessStatus==0)
      //{
      //   bReturn = TRUE;
      //}
      //   else if (nProcessStatus==(m_nProcessStatus+1)) // ���� ���� ����(+1)�̸�..
      //   else if (nProcessStatus==(m_nProcessStatus+1))
      //   {
      //      bReturn = TRUE;
      //   }
@@ -204,9 +202,8 @@
      //   bReturn = FALSE;
      //}
      
      if (bReturn) // �����̸�...
      if (bReturn)
      {
         // Thread ���� �� Thread ����
         CSequenceProcessData* pThreadData = new CSequenceProcessData(this);
         if (pThreadData)
         {
@@ -227,7 +224,6 @@
         }
      }
      else if(nProcessStatus==2){
         // Thread ���� �� Thread ����
         CSequenceProcessData* pThreadData = new CSequenceProcessData(this);
         if (pThreadData)
         {
@@ -277,7 +273,6 @@
   CReviewResult* pWsiResult = pGlassResult->GetWsiResult(nModuleIndex);
   if (pWsiResult==NULL) goto RESULT_FAIL;
   // ������ �ε����� �����´�.
   int nCurResultIdx   = pWsiResult->GetLastSReviewResultIndex() + 1; // last index + 1
   int nStartResultIdx   = pWsiResult->GetStartSReviewResultIndex();
   int nEndResultIdx   = pWsiResult->GetEndSReviewResultIndex();
@@ -291,13 +286,11 @@
   int      nMPosY   = int(pPosition->dMotorPosY * 1000.0);
   double   dTime   = (double) m_ProcessTimer.GetDurationMilliSecond();
   // �ε����� �ٸ��� ��������.
   if (measureResut.nResultIndex != nCurResultIdx) 
   {
      goto RESULT_FAIL;
   }
   // ���� ������ ����.
   // measureResut
   if(pWsiResult->GetSReviewResultCount() == 0) return ;
@@ -324,7 +317,6 @@
   // set last result idx
   pWsiResult->SetLastSReviewResultIndex(nCurResultIdx);
   // 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙트占쏙옙占쏙옙 占쌉곤옙, WSI 占쏙옙占쏙옙占?占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙...
   if(nCurResultIdx==nEndResultIdx && nCurResultIdx<=pWsiResult->GetSReviewResultCount())
   {
      nStartResultIdx = nCurResultIdx + 1;
@@ -335,8 +327,7 @@
      pWsiResult->SetStartSReviewResultIndex(nStartResultIdx);
      pWsiResult->SetEndSReviewResultIndex(nEndResultIdx);
      // ������ ����Ʈ ���� ��������.
      ::Sleep(3000); // 占쏙옙占쏙옙甄占?占십쇽옙占쏙옙. 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙.
      ::Sleep(3000);
//      Process_RemainWsiPoint(nModuleIndex);
   }
@@ -362,7 +353,6 @@
   CReviewResult* pWsiResult = pGlassResult->GetWsiUserResult(nModuleIndex);
   if (pWsiResult==NULL) goto RESULT_FAIL;
   // ������ �ε����� �����´�.
   int nCurResultIdx   = pWsiResult->GetLastSReviewResultIndex() + 1; // last index + 1
   int nStartResultIdx   = pWsiResult->GetStartSReviewResultIndex();
   int nEndResultIdx   = pWsiResult->GetEndSReviewResultIndex();
@@ -376,13 +366,11 @@
   int      nMPosY   = int(pPosition->dMotorPosY * 1000.0);
   double   dTime   = (double) m_ProcessTimer.GetDurationMilliSecond();
   // �ε����� �ٸ��� ��������.
   if (measureResut.nResultIndex != nCurResultIdx) 
   {
      goto RESULT_FAIL;
   }
   // ���� ������ ����.
   // measureResut
   if(pWsiResult->GetSReviewResultCount() == 0) return ;
@@ -407,7 +395,6 @@
   // set last result idx
   pWsiResult->SetLastSReviewResultIndex(nCurResultIdx);
   // 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙트占쏙옙占쏙옙 占쌉곤옙, WSI 占쏙옙占쏙옙占?占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙...
   if(nCurResultIdx==nEndResultIdx && nCurResultIdx<=pWsiResult->GetSReviewResultCount())
   {
      nStartResultIdx = nCurResultIdx + 1;
@@ -418,8 +405,7 @@
      pWsiResult->SetStartSReviewResultIndex(nStartResultIdx);
      pWsiResult->SetEndSReviewResultIndex(nEndResultIdx);
      // ������ ����Ʈ ���� ��������.
      ::Sleep(3000); // 占쏙옙占쏙옙甄占?占십쇽옙占쏙옙. 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙.
      ::Sleep(3000);
      //      Process_RemainWsiPoint(nModuleIndex);
   }
@@ -442,6 +428,8 @@
       g_pLog->DisplayMessage(_T("[AlignResult] Glass Result is NULL!"));
       SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Signal!"));
      AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
       return;
   }
@@ -449,7 +437,6 @@
    CAlignResult *pAlignResult = &pGlassResult->m_AlignResult;
    CAlignRecipe *pAlignRecipe = &pGlassResult->m_AlignRecipe; 
 
    // 占쏙옙占쏙옙占?占쌘듸옙占쏙옙占쏙옙 占쏙옙占?占쏙옙占쏙옙占실울옙 占쏙옙占쏙옙占쏙옙占쏙옙.
    CRsRcpAlignInfo *pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
    if (pRsRcpAlignInfo!=NULL && pRsRcpAlignInfo->m_bAutoProcess)
    {
@@ -463,25 +450,21 @@
          pRsRcpAlignInfo->m_dSecondCamExposure = pCurAlignResult->dExposureTime[1];
       }
 
       // ������ ����Ÿ ����
       //m_pDoc->Recipe_WriteRecipeFile();
    }
 
 
    BOOL bLastAlignResult = FALSE;
    CCoordCalibrator *pCoordCalibrator = m_pSP2P->ISP2P_GetCoordCalibrator();
    // 占쏙옙占쏙옙 占쏙옙占쏙옙占?占쏙옙占?.
    if (pCoordCalibrator && pCurAlignResult->nResultCode==Align_Success)
    {
       g_pLog->DisplayMessage(_T("[AlignResult] Align Find Success!"));
 
       // 占쏙옙占쏙옙占?占쏙옙占?占쌜띰옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙
       *pAlignResult = *pCurAlignResult;
 
       pCoordCalibrator->SetFirstMarkPos(pAlignResult->dFindPositionX[0], pAlignResult->dFindPositionY[0], pAlignRecipe->dGlassPositionX[0], pAlignRecipe->dGlassPositionY[0]);
       pCoordCalibrator->SetSecondMarkPos(pAlignResult->dFindPositionX[1], pAlignResult->dFindPositionY[1], pAlignRecipe->dGlassPositionX[1], pAlignRecipe->dGlassPositionY[1]);
 
       // 占쏙옙占쏙옙 占쏙옙占?
       if(pCoordCalibrator->CalculateAlignResult() == TRUE)
       {
          sAlignResult = pCoordCalibrator->GetAlignResult();
@@ -490,38 +473,35 @@
          bLastAlignResult = !pAlignRecipe->bRotateProcess;
       }
 
       // �۶� ���� ���� ����
       CCameraControlAlign *pAlignCameraControl   = m_pSP2P->ISP2P_GetAlignCameraControl();
       SThetaMotorInfo* pThetaMotorInfo         = m_pSP2P->ISP2P_GetThetaMotorInfo();
       CMotorControl* pMotorControl            = m_pSP2P->ISP2P_GetMotorControl();
 
       if (pAlignRecipe->bRotateProcess && pAlignCameraControl && pMotorControl && pThetaMotorInfo)
       {
          if (fabs(sAlignResult.dDegree) <= pAlignRecipe->dGlassAngleMin) // ���� �۶� ������ �ּҰ����� ������ ����
          if (fabs(sAlignResult.dDegree) <= pAlignRecipe->dGlassAngleMin)
          {
             bLastAlignResult = TRUE;
             g_pLog->DisplayMessage(_T("[AlignResult] Success! Last Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                sAlignResult.dDegree,  pCurAlignResult->nFindCount);
          }
          else if (fabs(sAlignResult.dDegree) > pAlignRecipe->dGlassAngleMax) // ���� �۶� ������ �ִ밢���� ũ�� ����
          else if (fabs(sAlignResult.dDegree) > pAlignRecipe->dGlassAngleMax)
          {
             bLastAlignResult = FALSE;
             g_pLog->DisplayMessage(_T("[AlignResult] FAIL! Last Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                sAlignResult.dDegree,  pCurAlignResult->nFindCount);
          }
          else if (pCurAlignResult->nFindCount < pAlignRecipe->nRetryCount) // �纸�� Ƚ���� ������ Ƚ�� �����̸� �纸�� ����
          else if (pCurAlignResult->nFindCount < pAlignRecipe->nRetryCount)
          {
             g_pLog->DisplayMessage(_T("[AlignResult] Current Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                sAlignResult.dDegree,  pCurAlignResult->nFindCount);
 
             // ���ͷ� ���� ����..
             double dCalAngle = sAlignResult.dDegree;
             dCalAngle = pThetaMotorInfo->dPosition - dCalAngle ;
             g_pLog->DisplayMessage(_T("[AlignResult] Move Rotate Glass Angle : %.8lf degree"), dCalAngle);
             pMotorControl->AxisThetaManualGoEnd(dCalAngle);
             ::Sleep(100);
 
             // 占쏙옙占쏙옙占?ReProcess
             if (pAlignCameraControl->AlignProcess())
             {
                g_pLog->DisplayMessage(_T("[AlignResult] Align Find Process ReStarted!"));
@@ -556,8 +536,7 @@
       //m_pView->SetAlignResult(pAlignResult->nResultCode, sAlignResult.dOriginX, sAlignResult.dOriginY, sAlignResult.dDegree);
    }
 
   // PCControl 占쏙옙占쏙옙占?占쏙옙호 占쏙옙占쏙옙.
   if (bLastAlignResult) // ���� ����ΰ��...
   if (bLastAlignResult)
   {   
      SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Success Data!"));
@@ -567,6 +546,8 @@
      SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Data!"));
   }
   AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence 변경
   SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
@@ -687,15 +668,14 @@
      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!"));
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 4);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_None, nPlanIndex);
       
      //占쏙옙占쏙옙占?
      AFM_SetAFMTracking(FALSE);
      return;
   }
   //190727 chm WSI 占쏙옙占쏙옙占?End 체크 占쏙옙 占쏙옙占쏙옙
   if(nBeforePlanIndex== CPJT_PlanWSI||nBeforePlanIndex== CPJT_PlanWsiReflow||nBeforePlanIndex== CPJT_PlanWsiUser)
   {
      if(pPlanInfo->m_nReviewType == CPJT_PlanWSI ||pPlanInfo->m_nReviewType == CPJT_PlanWsiReflow||pPlanInfo->m_nReviewType== CPJT_PlanWsiUser || pPlanInfo->m_nReviewType == CPJT_PlanWsiMultiShot)
@@ -724,13 +704,12 @@
      }
   }
   //190727 chm WSI type 占쏙옙占쏙옙占쏙옙 Review 占시뤄옙占쏙옙 占쏙옙占쏙옙占?카占쌨띰옙 占쌜띰옙 占쌜울옙 占쏙옙占쏙옙占쏙옙痢?占쏙옙占쏙옙...
   if(nBeforePlanIndex== CPJT_PlanWSI ||nBeforePlanIndex== CPJT_PlanWsiReflow||nBeforePlanIndex== CPJT_PlanWsiUser)
   {
      if(  pPlanInfo->m_nReviewType == CPJT_PlanReview|| pPlanInfo->m_nReviewType == CPJT_PlanUser|| pPlanInfo->m_nReviewType == CPJT_PlanMeasure|| pPlanInfo->m_nReviewType == CPJT_PlanReflow)
      {
         CTotalPitchMeasure* pTotapPithMeasure = m_pSP2P->ISP2P_GetTotalPitchMeasure(); // 占쏙옙占쏙옙占쏙옙占? 20190730 chm 占쏙옙占쌩울옙 占쌉쇽옙占쏙옙 占쏙옙占쏙옙....
         CTotalPitchMeasure* pTotapPithMeasure = m_pSP2P->ISP2P_GetTotalPitchMeasure();
   
         const CMotorControlInfo* pSystemMotorInfo = m_pSP2P->ISP2P_System_GetMotorInfo();
         if(pSystemMotorInfo !=NULL) 
@@ -774,8 +753,6 @@
      if(pPlanInfo == NULL) continue;
      //210325
      //END 占쏙옙 占쏙옙琯占쏙옙占?占실억옙占쏙옙占쏙옙占쏙옙占?占쌔댐옙 占쌉쇽옙占쏙옙 占쏙옙占쏙옙占쏙옙占?占쏙옙占싣곤옙占쏙옙 占쌍억옙 start 占쌉쇽옙占쏙옙 타占쏙옙占쏙옙
      //�װͿ� ���� ����ó��
      if (GetProcessStatus() == ProcessReviewEnd_CPJT || GetProcessStatus() == ProcessReviewUnloding_CPJT)
      {
         g_pLog->DisplayMessage(_T("[ProcessStop] StartProcessing Sequence Stop Status : %d"), GetProcessStatus());
@@ -788,7 +765,7 @@
         if (( nTotalCount += pGlassResult->GetTotalSReviewResultCount()) > 0)
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[Sequence Processor] Review Plan Start!"));
            //LYW DCOLL 임시조치
            //LYW DCOLL �ӽ���ġ
            CDitGlassRawClient *pDitRawClient = CDitGlassRawClient::GetInstance();
            if (pDitRawClient->isConnect() == TRUE)
            {
@@ -801,7 +778,7 @@
               strcpy(pSharedDefectReview->m_strRevImageName, "");
            }
            //LYW DCOLL 임시조치
            //LYW DCOLL �ӽ���ġ
            ::Sleep(nWaitTime);
            m_pSP2P->ISP2P_GetReviewProcessor()->ResetGantryDone();
            bExcute = ReviewStartProcessing(pGlassResult, nPlanIdx);
@@ -830,7 +807,7 @@
            m_pSP2P->ISP2P_DisplayMessage(_T("[Sequence Processor] WSI Plan End!"));
         }
         break;
      //占싱삼옙占?
      case CPJT_PlanMeasure:
         if (( nTotalCount += pGlassResult->GetTotalSMeasureResultCount()) > 0)
         {
@@ -902,19 +879,27 @@
   CSequenceProcessData* pProcessData = static_cast<CSequenceProcessData*>(pParameter);
   m_nProcessStatus = pProcessData->nProcessStatus;
   //LONGREUN
   //SetSimulationMode(TRUE);
   switch(pProcessData->nProcessStatus)
   {
   case ProcessLoading_CPJT:
      Process_Loading();
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 2);
      break;
   case ProcessAlignStart_CPJT:
      Process_AlignStart();
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 3);
      break;
   case ProcessReadRawFile_CPJT:
      Process_ReadRawFile();
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 1);
      break;
@@ -924,12 +909,20 @@
   case ProcessReviewEnd_CPJT:
      Process_ReviewEnd();
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 5);
      break;
   case ProcessReviewUnloding_CPJT:
      Process_ReviewUnloading();
      //LONGREUN
      //RecvSignalToSignalControl(PCControlRecvSignalIndex_Seq, 0);
      break;
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 ADD START
   SetSimulationMode(FALSE);
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 ADD END
   return;
}
@@ -939,20 +932,30 @@
   AllAckSignalOff();
   m_pSP2P->ISP2P_GetReviewProcessor()->ResetGantryDone();
   SetCheckWSIEnd(-1); //190726 wsiendüũ �ʱ�ȭ
   SetWsiType(-1);    //wsi reflow Ÿ�� ���� �ʱ�ȭ
   SetCheckWSIEnd(-1); //190726
   SetWsiType(-1);    //wsi reflow
   SetLastPointCheck(FALSE);
   bFileFind = FALSE;
   m_pSP2P->ISP2P_GetDiagnosisHistory();
   /*< LYW 20211109 - #3662 Delete Start >*/
   //m_pSP2P->ISP2P_GetDiagnosisHistory();
   /*< LYW 20211109 - #3662 Delete End >*/
   m_pSP2P->ISP2P_SetFirstReviewLeft(TRUE);
   m_pSP2P->ISP2P_SetFirstReviewRight(TRUE);
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //Original
//    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
    // read config file
    if(!m_pSP2P->ISP2P_System_ReadConfigFile())
       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor] System Value Loading FAIL!"));   
@@ -970,18 +973,18 @@
    }
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Glass Result Count : %d ea"), nGlassResultCount);
   
   pGlassResult->ResetDefocusCount();//�ε� �κп��� defocus count �ʱ�ȭ 190821 chm
   pGlassResult->ResetDefocusCount();
    CTime time = CTime::GetCurrentTime();
    pGlassResult->m_strResultDate.Format(_T("%04d.%02d.%02d"), time.GetYear(), time.GetMonth(), time.GetDay());
   //if(Revolver_SetGoHome(0)) // ������ HOME ������
   //if(Revolver_SetGoHome(0))
   //{
   //   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Revolver Set GoHome Success!"));
   //}
   //#3357 KYH Align Image �ʱ�ȭ ADD START
   //#3357 KYH Align Image ADD START
   CCameraControlAlign* pAlignCameraControl = m_pSP2P->ISP2P_GetAlignCameraControl();
   if (pAlignCameraControl != NULL)
   {
@@ -989,7 +992,7 @@
      g_pLog->DisplayMessage(_T("[Align] Align Image Clear"));
   }
   //#3357 KYH Align Image �ʱ�ȭ ADD END
   //#3357 KYH Align Image ADD END
    // get transfer data
    int nResultCode = 0;
@@ -1016,13 +1019,20 @@
         if (pDitRawClient->isConnect()==FALSE)
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ���� ���� �翬�� �õ� "));
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] DitRawClient Connect Fail "));
            int nReconnect=0;
            while (1)
            {
               if (nReconnect == 3)
               {
                  SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                  //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
                  if (GetSimulationMode() == FALSE)
                  {
                     SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                  }
                  //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
                  //original
                  /*SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);*/
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
                  break;
@@ -1031,11 +1041,11 @@
               Sleep(1000);
               if (pDitRawClient->isConnect() == FALSE)
               {
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ���� ���� Count[%d]"), nReconnect);
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]DitRawClient Connect Fail Count[%d]"), nReconnect);
               }
               else
               {
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ���� ����"));
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]DitRawClient Connect Success"));
                  break;
               }
               nReconnect += 1;
@@ -1045,9 +1055,9 @@
         }
         // #3381 LYW CF AOI Review ������ FDC TackTime ������ ���� ���� ADD START
         // #3381 LYW CF AOI Review FDC TackTime ADD START
         pDitRawClient->GetGlassData()->m_tmReviewLoading = CTime::GetCurrentTime();
         // #3381 LYW CF AOI Review ������ FDC TackTime ������ ���� ���� ADD END
         // #3381 LYW CF AOI Review FDC TackTime ADD END
         
         CString strGlassIDTemp = NULL;
@@ -1065,11 +1075,20 @@
         strFileName.Format(_T("%s_%s"), strGlassIDTemp, strGlassStepIdTemp);
         //업데이트시
         //������Ʈ��
         //bFileFind = FindRawBinFile(strFileName);
         bFileFind = TRUE;
         //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
         if (GetSimulationMode() == FALSE)
         {
            bFileFind = FindRawBinFile(strFileName);
         }
         else
         {
            bFileFind = TRUE;
         }
         //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
         //original
         /*bFileFind = FindRawBinFile(strFileName);*/
         pDitRawClient->SetReviewStart();
         Sleep(1000);
@@ -1114,7 +1133,7 @@
       }
    }
   //// 190725 占쏙옙占쏙옙占?占쏙옙청占쏙옙占쏙옙 chm ASCEND 占쏙옙 alarm
   //// 190725 chm ASCEND alarm
   const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
   const CRcpSortingInfo *pSortingInfo = pRsRcpReviewInfo->GetRcpReviewSortInfo();
@@ -1131,7 +1150,7 @@
   
   
   ////������ �������� �ȱ� 190618
   ////190618
   if(GetUseAfmHomePosition())
   {
   g_pLog->DisplayMessage(_T("[AFM] AFM Home Position Start!!!"));
@@ -1140,7 +1159,6 @@
   }
   //占쏙옙占쏙옙占쌨몌옙 커占쏙옙占?占쏙옙占쏙옙 占쏙옙타트(占쌜띰옙 占싸듸옙)
   CDitGlassRawClient* pDitSharedGlassRaw = CDitGlassRawClient::GetInstance();
   if (pDitSharedGlassRaw->isConnect() == FALSE) {
      m_pSP2P->ISP2P_DisplayMessage(_T("[DitGlassRawClient] Shared Memory Connect Fail"));
@@ -1175,25 +1193,42 @@
    // review camera stop
   ReviewCamera_CameraControl(CameraControlStop);   
   //AlignCamera_CameraControl(CameraControlLive);
   AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
    // send signal to plc
    if (nResultCode==0)
    {
       SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
    }
    else
    {
       SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
    }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      // send signal to plc
   if (GetSimulationMode() == FALSE)
   {
      if (nResultCode == 0)
      {
         SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
      }
      else
      {
         SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
      }
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //original
//     send signal to plc
//         if (nResultCode==0)
//         {
//            SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
//         }
//         else
//         {
//            SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
//         }
 
    // send cell data to review processorm_pDitGlass
    CReviewProcessor* pReviewProcessor = m_pSP2P->ISP2P_GetReviewProcessor();
    if(pReviewProcessor == NULL) return ;   
    pReviewProcessor->SetCellData(pGlassResult);
    pReviewProcessor->SetReviewCount(0);         // ���� Sequence No �ʱ�ȭ.
    pReviewProcessor->SetReviewCount(0);
   pReviewProcessor->SetPlanReviewCount(0);
   pReviewProcessor->SetPlanWSICount(0);
    // Process Status Update
@@ -1215,8 +1250,16 @@
       m_pSP2P->ISP2P_UpdateDefectFilter(pDefectFilter);
    }   
   
   SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //original
//    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
//    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::OUT] Loading!"));
@@ -1232,17 +1275,57 @@
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] AlignStart!"));
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
   //Sleep(400);//占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占?占쌍깍옙 chm190602
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //#3561 210908 LYW ADD Start
    int nAlignReconnectRetryMaxCount = 3;
    for (int i = 0; i < nAlignReconnectRetryMaxCount; i++)
   {
      if (AlignCamera_CameraControl(CameraControlLive) == FALSE)
      {
         m_pSP2P->ISP2P_DisplayMessage(_T("[AlignStart] AlignConnect Fail! Reconect Start! ReconnectRetry count = %d"), nAlignReconnectRetryMaxCount + 1);
         system("netsh interface set interface name = \"Align #1\" admin = disable&& netsh interface set interface name = \"Align #1\" admin = enable&& netsh interface set interface name = \"Align #2\" admin = disable&& netsh interface set interface name = \"Align #2\" admin = enable");
         Sleep(10000);
         m_pSP2P->ISP2P_InitAlignCamera();
      }
      else
      {
         m_pSP2P->ISP2P_DisplayMessage(_T("[AlignStart] AlignConnect Success! "));
         break;
      }
   }
   //#3561 210908 LYW ADD End
   Sleep(300);
   //original
//    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
    // 1. get current glass result
    CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
    if (pGlassResult==NULL) {   return;   }
    if (pGlassResult==NULL)
   {
      Sleep(350);
      AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
      return;
   }
 
   const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
   if(pRsRcpAlignInfo == NULL)   return;
   if (pRsRcpAlignInfo == NULL)
   {
      Sleep(350);
      AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
      return;
   }
    // 2. get align camera control   
    CCameraControlAlign* pAlignCameraControl = m_pSP2P->ISP2P_GetAlignCameraControl();
 
@@ -1250,23 +1333,48 @@
   if(pRsRcpAlignInfo->m_bAlignSkipMode)
   {
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Align Skip Mode !!!!!!!"));
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      if (GetSimulationMode() == FALSE)
      {
         SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
         //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
      }
      //original
//       SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
//       SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
      SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
      SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
      Sleep(350);
      AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
   }
   else
   {
      // 190710 SJB Align Camera Disconnect Check, Align Step ���� ���� Ȯ���Ѵ�.
      // 190710 SJB Align Camera Disconnect Check, Align Step
      if(pAlignCameraControl)
      {
         if(pAlignCameraControl->AlignCameraDisconnectCheck() == FALSE)
         {
            SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
            //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
            if (GetSimulationMode() == FALSE)
            {
               SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
            }
            //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
            //original
//             SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//             m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
         }
      }      
      else
      {
         Sleep(350);
         AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
      }
      if (pGlassResult && pAlignCameraControl && pAlignCameraControl->AlignProcess())
      {
@@ -1274,16 +1382,26 @@
      }
      else
      {
         //�����ߵ�
         Sleep(1000);
         //TEST 占쏙옙占?
         {
            SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
      }
            //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
            if (GetSimulationMode() == FALSE)
            {
               SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
               SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
            }
            //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
            //original
//             SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//             m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
//             SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
//             m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
         }
         Sleep(350);
         AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ����
         //�ּ� Ǯ��
         // 4. send align fail signal to plc
@@ -1291,7 +1409,7 @@
         //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Data!"));
         //SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
         //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
   }
      }
   }
@@ -1313,21 +1431,36 @@
   m_pSP2P->ISP2P_GetSignalControl()->WriteData(_T("17110"), sizeof(pDitRawClient->GetGlassData()->m_strGlassJudge), pDitRawClient->GetGlassData()->m_strGlassJudge);
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] ReadRawFile!"));
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //original
//    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
    if (bFileFind == FALSE)
   {
      SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] 占쏙옙占쏙옙占쏙옙占?찾占쏙옙 占쏙옙占쏙옙"));
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      if (GetSimulationMode() == FALSE)
      {
         SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Find Raw File Fail"));
      }
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
      //original
//       SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Find Raw File Fail"));
      return;
   }   
   // get current glass result
   CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
   if (pGlassResult==NULL) return;
   //占쏙옙占쏙옙占쌨몌옙 커占쏙옙占?占쏙옙占쏙옙 占쏙옙타트(占쌜띰옙 占싸듸옙)
   CDitGlassRawClient* pDitSharedGlassRaw = CDitGlassRawClient::GetInstance();
   if(pDitSharedGlassRaw->isConnect() == FALSE)            m_pSP2P->ISP2P_DisplayMessage(_T("[DitGlassRawClient] Shared Memory Connect Fail"));
@@ -1354,20 +1487,26 @@
      int nTotalPlanCount = CalculatePlanData(pGlassResult);
      m_pSP2P->ISP2P_DisplayMessage(_T("[Read Raw File] Review All Plan Total Count : %d"), nTotalPlanCount);
      //�����ߵ�
      Sleep(1000);
      // send review ready
      SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      if (GetSimulationMode() == FALSE)
      {
         SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
      }
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
      //original
//       SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//       SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
   }
   else
   {
      processTimer.End();
      m_pSP2P->ISP2P_DisplayMessage(_T("[ReadRawFile] AOI Result File Read Fail![%.3f ms]"), processTimer.GetDurationMilliSecond());
      //占쌓쏙옙트 占쏙옙占?
      //{
      //         // send review ready
      //   SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
@@ -1375,7 +1514,6 @@
      //         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
      //}
      //�ּ� ����
      int nCurPlanIndex = 0;
      CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
      if(pRsRcpReviewInfo)
@@ -1390,15 +1528,21 @@
               m_pSP2P->ISP2P_DisplayMessage(_T("[Read Raw File] Review All Plan Total Count : %d"), nTotalPlanCount);
               // send review ready
               SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
               //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
               if (GetSimulationMode() == FALSE)
               {
                  SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
                  m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
               }
               //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
               //original
//                SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
//                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
            }
         }
      }
   }
   //// [2017:5:24]-[WEZASW] : Review Image Upload Dir 占쏙옙占쏙옙.(FTPUploader占쏙옙占쏙옙 占쌘듸옙 占쏙옙占쏙옙 占실댐옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占?占쏙옙占쏙옙)
   //// '占쌥븝옙占싯삼옙'占쏙옙 FTPUploader占쏙옙占쏙옙 占쏙옙占싸듸옙 占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 PCControl Glass Unloading 占쏙옙 占쏙옙占?Loading占쏙옙 Review占쏙옙占쏙옙占쏙옙 占쏙옙占싸듸옙 占쏙옙占?GlassID) 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
   const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
   CString strPath = _T("");
   //if(pNetworkInfo && pNetworkInfo->m_strUploadImagePath.IsEmpty() == FALSE)
@@ -1412,8 +1556,6 @@
   CFileFind Uploadfile, RTMSUploadPath;
   if (CDitGlassRawClient::GetInstance()->GetGlassData() == NULL) return;
   //占쏙옙占싸듸옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쌕쏙옙 占쏙옙占싸듸옙 占쏙옙占?Set 20190917chm
   if(Uploadfile.FindFile(strPath)==FALSE)
   {
      CTime tmServerLoadingTime = CDitGlassRawClient::GetInstance()->GetGlassData()->m_tmGlassLoading;
@@ -1421,10 +1563,6 @@
      CreateDirectory(strPath, NULL);
      pReviewProcessor->SetUploadImagePath(strPath);
      //taek 210126 rtms 占쏙옙占쏙옙占?占싱뱄옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
      CreateDirectory(pReviewProcessor->GetRTMSUploadImagePath(),NULL);
   }
@@ -1441,9 +1579,16 @@
   SetLastPointCheck(FALSE);
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] %d Tick Count"), dwTime);
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //original
//    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
   const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
   if(pRsRcpAlignInfo == NULL)   return;
@@ -1470,10 +1615,10 @@
   //         _grmCellData* pCellData = pDitRawClient->GetCellData(0);
   //         if(pCellData) 
   //         {
   //         //   pCellData->m_nTotalPitchData[0] = int(pTotapPithMeasure->GetTotalPitchBD() * 1000); // ����, �۾��� ���� ����
   //         //   pCellData->m_nTotalPitchData[1] = int(pTotapPithMeasure->GetTotalPitchAC() * 1000); // ����, �۾��� ���� �Ʒ���
   //         //   pCellData->m_nTotalPitchData[2] = int(pTotapPithMeasure->GetTotalPitchAB() * 1000); // ����, �۾��� ���� ����
   //         //   pCellData->m_nTotalPitchData[3] = int(pTotapPithMeasure->GetTotalPitchCD() * 1000); // ����, �۾��� ���� ������
   //         //   pCellData->m_nTotalPitchData[0] = int(pTotapPithMeasure->GetTotalPitchBD() * 1000);
   //         //   pCellData->m_nTotalPitchData[1] = int(pTotapPithMeasure->GetTotalPitchAC() * 1000);
   //         //   pCellData->m_nTotalPitchData[2] = int(pTotapPithMeasure->GetTotalPitchAB() * 1000);
   //         //   pCellData->m_nTotalPitchData[3] = int(pTotapPithMeasure->GetTotalPitchCD() * 1000);
   //         }
   //      }
   //   }
@@ -1481,7 +1626,6 @@
   //   {
   //      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor] TotalPitchMeasure Result Fail!"));
   //      // 190711 SJB, TotalPitchMeasure Fail占시울옙 占쌕뤄옙 Motor占쏙옙 占쏙옙占쏙옙占?占쏙옙占쏙옙占쏙옙 占쏙옙占쌕댐옙 Motion Enable 占쏙옙호占쏙옙 확占쏙옙占쏙옙占쏙옙
   //      
   //      if(!pTotapPithMeasure->GetMotorEnable())
   //      {
@@ -1507,15 +1651,23 @@
   if(FirstReviewPlanStart() <= 0)
   {
      //Sleep(1000);
      SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      if (GetSimulationMode() == FALSE)
      {
         SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
      }
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
      //original
//       SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//       SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
   }
   else
   {
      //�����ߵ�
      //Sleep(1000);
      //Test占쏙옙占?
      //SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      //SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
      //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
@@ -1533,14 +1685,26 @@
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] ReviewEnd!"));
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
   //original
//    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
//       m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
   CDitGlassRawClient* m_pDitGlassRaw = CDitGlassRawClient::GetInstance();
   if (m_pSP2P->ISP2P_GetWSIControl(0)!=NULL)
   if (GetSimulationMode() == FALSE && m_pSP2P->ISP2P_GetWSIControl(0)!=NULL)
   {
      m_pSP2P->ISP2P_GetWSIControl(0)->SetWsiTimeOver();
      m_pSP2P->ISP2P_GetWSIControl(1)->SetWsiTimeOver();
      /*< LYW 20211015 - #3662 ADD Start >*/
//       m_pSP2P->ISP2P_GetWSIControl(0)->SetWsiEnd();
//       m_pSP2P->ISP2P_GetWSIControl(1)->SetWsiEnd();
      /*< LYW 20211015 - #3662 ADD End >*/
   }
   if (GetLastPointCheck() == FALSE)
   {
@@ -1555,16 +1719,22 @@
   }
   
   m_pDitGlassRaw->GetGlassData()->m_nReviewNum = m_pSP2P->ISP2P_GetReviewProcessor()->GetPlanReviewCount();
    //SendDVDataToSignalControl();// �Ⱦ���
   //OverTime 占쌩삼옙占쏙옙 占쏙옙占쏘에占쏙옙 END ACK占쏙옙 占쏙옙摸占쏙옙째占?占싣니띰옙 占쏙옙 Conplete占쏙옙 占쏙옙摸占쏙옙占?
   //�� ... ����  �����ε��ϴ� �߰�
    //SendDVDataToSignalControl();
   if (GetLastPointCheck() == FALSE)
   {
      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!"));
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
      if (GetSimulationMode() == FALSE)
      {
         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!"));
      }
      //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
      //original
//       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!"));
   }
   CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
@@ -1585,10 +1755,8 @@
      m_pSP2P->ISP2P_GetWSIControl(0)->SendWsiAfmSafePosMove();
      m_pSP2P->ISP2P_GetWSIControl(1)->SendWsiAfmSafePosMove();
   }
   // 占쏙옙占쏙옙占쏙옙占?占쏙옙占쏙옙占쏙옙 Review占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙
   if(m_pDitGlassRaw->isConnect()==FALSE)      WriteRawData(pGlassResult);
   
   //����Ŀ�� �˶� send 20190819chm
   if(pGlassResult->m_nDeFocusCount >0) 
   {
      SendSignalToSignalControl(PCControlSendSignalIndex_State,PCControlSend_Defoucs,1000);
@@ -1598,41 +1766,51 @@
      CString strTime = _T("");
      strTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
      CDlgDefocusList::GetInstance()->SetDefocusTotalCount(pGlassResult->m_nDeFocusCount);//��Ż ī��Ʈ Add
      CDlgDefocusList::GetInstance()->SetDefocusData(strTime,pGlassResult->m_strGlassID,pGlassResult->m_nDeFocusCount);//ui �߰��� ����
      CDlgDefocusList::GetInstance()->SetDefocusTotalCount(pGlassResult->m_nDeFocusCount);
      CDlgDefocusList::GetInstance()->SetDefocusData(strTime,pGlassResult->m_strGlassID,pGlassResult->m_nDeFocusCount);
   }
   g_pLog->DisplayMessage(_T("History map Start"));
   int nGlassResultCount = 0;
   CGlassResult*  pHistoryResult = m_pSP2P->ISP2P_GetNewHistoryResult(nGlassResultCount); //taek 210201
   g_pLog->DisplayMessage(_T("History map Copy"));
   ReadAOIMemory2(pHistoryResult);
   g_pLog->DisplayMessage(_T("History map TransferData"));
   UpdateHistoryResultFromTransferData(pHistoryResult, pGlassResult);
   g_pLog->DisplayMessage(_T("History Button Enable"));
   m_pSP2P->ISP2P_GetDiagnosisHistory2();
   /*< LYW 20211109 - #3662 Delete Start >*/
   //    g_pLog->DisplayMessage(_T("History map Start"));
   //    int nGlassResultCount = 0;
   //    CGlassResult*  pHistoryResult = m_pSP2P->ISP2P_GetNewHistoryResult(nGlassResultCount); //taek 210201
   //    g_pLog->DisplayMessage(_T("History map Copy"));
   //    ReadAOIMemory2(pHistoryResult);
   //    g_pLog->DisplayMessage(_T("History map TransferData"));
   //    UpdateHistoryResultFromTransferData(pHistoryResult, pGlassResult);
   //    g_pLog->DisplayMessage(_T("History Button Enable"));
   //    m_pSP2P->ISP2P_GetDiagnosisHistory2();
   /*< LYW 20211109 - #3662 Delete End >*/
   /*int nModuleCount = m_pSP2P->ISP2P_GetModuleStatusCount(); //0503 占쏙옙占쏙옙 End占쏙옙 占쏙옙占쏙옙占?0占쏙옙占쏙옙 占십깍옙화
   /*int nModuleCount = m_pSP2P->ISP2P_GetModuleStatusCount();
   for (int nModuleIdx = 0; nModuleIdx < nModuleCount; nModuleIdx++)
   {
      {
         ReviewLight_SetLightLevel(nModuleIdx, 0);
         g_pLog->DisplayMessage(_T("Module[%d] LightLevel �ʱ�ȭ"), nModuleIdx);
         g_pLog->DisplayMessage(_T("Module[%d] LightLevel"), nModuleIdx);
      }
   }*/
   //5. PCControl ��ȣ ������Ʈ
   //5. PCControl
   if (pGlassResult)
   {
      m_pSP2P->ISP2P_UpdateProcessStatus(GetProcessStatus(), pGlassResult);
      g_pLog->DisplayMessage(_T("PCControl Update Signal"));
   }
   SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
   SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
      SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
   }
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END
//    SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
//    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::OUT] ReviewEnd!"));
}
@@ -1640,9 +1818,16 @@
void CSequenceProcessor_CPJT::Process_ReviewUnloading()
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] Review Unloading!"));
   if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
   //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD START
   if (GetSimulationMode() == FALSE)
   {
      if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
   }
   //original
   //#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!"));
   
}
@@ -1665,8 +1850,8 @@
   CString strCode = _T("");
   int nDefectCount = pRawData->GetGlassData()->m_nDefectNum; // ���尹��
   int nJudgeCount = pRcpReviewInfo->GetRcpZoneFilterInfoCount();// ���� ����
   int nDefectCount = pRawData->GetGlassData()->m_nDefectNum;
   int nJudgeCount = pRcpReviewInfo->GetRcpZoneFilterInfoCount();
   int nFilterType = 0;
   int nJudgeType = 0;
   int nZoneNumber = 0;
@@ -1680,7 +1865,7 @@
   int nJudgeCellOKCount = 0;
   int nPixelSize = 0;
   int nPixelFilterSize = 0;
   //���� ������
   //1 wsi, 3 CS, 4 R, 5 G, 6 B
   //pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_fWsi_ResultData[1];//Defect
   //pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_fWsi_ResultData[3];//cs
@@ -1694,10 +1879,10 @@
      {
#pragma region 占쏙옙占쏙옙占?fail
#pragma region Align fail
         if (m_pSP2P->ISP2P_GetCurrentGlassResult()->GetAlignResult()->nResultCode != Align_Success)
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] 占쏙옙占쏙옙占?占쏙옙占쏙옙 WSI 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙"));
            m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] Align Fail WSI Rejudge Cancel"));
            break;
         }
#pragma endregion
@@ -1735,7 +1920,7 @@
         
         if (nPixelFilterSize <= nPixelSize && nPixelFilterSize != 0)
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[ReviewEnd] ������ ���͸� Pixel Size[%d] nPixelFilterSize [%d]"), nPixelSize,nPixelFilterSize);
            m_pSP2P->ISP2P_DisplayMessage(_T("[ReviewEnd] Size filtering Pixel Size[%d] nPixelFilterSize [%d]"), nPixelSize,nPixelFilterSize);
            continue;   
         }
#pragma endregion
@@ -1745,13 +1930,13 @@
         for (int nJudgeindex = 0; nJudgeindex < nJudgeCount; nJudgeindex++)
         {
            //nZoneType = GetZoneType();
            dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->GetJudgeHeight(); //����
            dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->GetJudgeHeight();
            nFilterType = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->m_nFilterType; //ZONE
            nJudge = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->m_nFilterJudge; //OK TR
            //nZoneNumber = pRcpReviewInfo->GetRcpZoneInfo(nFilterType)->m_vecZoneNumber[0];
            
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh
            {
               BOOL isZoneValue = FALSE;
@@ -1764,7 +1949,7 @@
                  }
                  else
                  {
                     m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh �α� �߰�
                     m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                     isZoneValue = TRUE;
                     //break;
@@ -1773,7 +1958,7 @@
               if (isZoneValue == FALSE)
               {
                  m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh �α� �߰�
                  m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                  continue;
               }
@@ -1823,13 +2008,13 @@
                  }
               }
               else if (fWsiData<=0) // 0���� ���� ������ ������ ���Ѵ�.
               else if (fWsiData<=0)
               {
                  m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] WSI TYPE[%d] WSI ����[%0.3lf] <= 0 ���� ���� ����"), nJudgeType, fWsiData);
                  m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] WSI TYPE[%d] WSI Height[%0.3lf] <= 0 Cancel Rejudge"), nJudgeType, fWsiData);
               }
               else
               {
                  //20210419 TR 占쏙옙占쏙옙占쏙옙占쏙옙 Judge 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占?OK 占쏙옙占쏙옙
                  //20210419 TR
                  //if (nJudge == 1)//TR -> OK
                  //{
                     if (pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_OK || pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_Unknown)
@@ -1880,7 +2065,7 @@
            }
            else //WSI TYPE �� �ƴϸ�
            else //WSI TYPE
            {
               continue;
            }
@@ -1894,13 +2079,13 @@
         for (int nJudgeindex = 0; nJudgeindex < nJudgeCount; nJudgeindex++)
         {
            //nZoneType = GetZoneType();
            dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->GetJudgeHeight(); //����
            dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->GetJudgeHeight();
            nFilterType = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->m_nFilterType; //ZONE
            nJudge = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->m_nFilterJudge; //OK TR
            //nZoneNumber = pRcpReviewInfo->GetRcpZoneInfo(nFilterType)->m_vecZoneNumber[0];
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330
            {
               BOOL isZoneValue = FALSE;
@@ -1913,7 +2098,7 @@
                  }
                  else
                  {
                     m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh �α� �߰�
                     m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                     isZoneValue = TRUE;
                     //break;
@@ -1922,7 +2107,7 @@
               if (isZoneValue == FALSE)
               {
                  m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh �α� �߰�
                  m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                  continue;
               }
@@ -1976,7 +2161,6 @@
               }
               else
               {
                  //20210419 TR 占쏙옙占쏙옙占쏙옙占쏙옙 Judge 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占?OK 占쏙옙占쏙옙
                  //if (nJudge == 1)//TR -> OK
                  //{
                  if (pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_OK || pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_Unknown)
@@ -2028,7 +2212,7 @@
            }
            else //WSI TYPE �� �ƴϸ�
            else //WSI TYPE
            {
               continue;
            }
@@ -2043,7 +2227,7 @@
            
            strCode =pRcpReviewInfo->GetRcpZoneFilteringInfo_CODE(nJudgeindex)->m_FilterCode;
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
            if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330
            {
               nJudgeType = ReJugdeWSIType(nFilterType);
@@ -2096,7 +2280,7 @@
                  m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] CODE JUDGE WSI TYPE[%d] Defect CODE [%s] != [%s]"), nJudgeType, strCode, pRawData->GetDefectData(nDefectIdx)->m_strDefectCode);
               }
            }
            else //WSI TYPE �� �ƴϸ�
            else //WSI TYPE
            {
               continue;
            }
@@ -2107,7 +2291,6 @@
      }
      
#pragma region CELLJUDGE
   //CELL ������////////////////////////////////////////////////////////////////
   int nCellCount = pRawData->GetGlassData()->m_nCellNum;
@@ -2126,7 +2309,7 @@
      else if (pRawData->GetCellData(nCellIndex)->m_nJudgement == Judge_OK_CPJT)
      {
         nCelllOKJuge = nCelllOKJuge + 1;
      } //taek 21.01.25 Juge ���ϴ� ���� ���Ӱ� �ٲ���...
      } //taek 21.01.25
      else if (pRawData->GetCellData(nCellIndex)->m_nJudgement == Judge_PR_CPJT)
      {
         nCelllPRJuge = nCelllPRJuge + 1;
@@ -2170,7 +2353,7 @@
            }
            else
            {
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] ī��Ʈ ������ ������ [%02d]Cell DefectTRCount[%d] >= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Count Number is minus! [%02d]Cell DefectTRCount[%d] >= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
            }
            break;
         case JudgeType_T8_PR:
@@ -2220,7 +2403,7 @@
            }
            else
            {
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] ī��Ʈ ������ ������ [%02d]Cell DefectTRCount[%d] <= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Count Number is minus! [%02d]Cell DefectTRCount[%d] <= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
            }
            break;
         case JudgeType_T8_PR:
@@ -2384,7 +2567,7 @@
   }
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] CELL COUNT OK:[%d] TR[%d] PR[%d]"), nCelllOKJuge, nCellTRJudge, nCelllPRJuge);
#pragma endregion
   //GLASS ������////////////////////////////////////////////////////////////////
#pragma region GLASSJUDGE
   CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
   if (pRsRcpReviewInfo == NULL) return FALSE;
@@ -2432,7 +2615,7 @@
         }
         else
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] TR ī��Ʈ�� ������ [%02d]GLASS Defect TR Count[%d] >= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] TR Count is minus [%02d]GLASS Defect TR Count[%d] >= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
         }
         break;
      case JudgeType_T8_PR:
@@ -2482,7 +2665,7 @@
         }
         else
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd]TRī��Ʈ�� ������ [%02d]GLASS Defect TR Count[%d] <= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd]TR Count is minus [%02d]GLASS Defect TR Count[%d] <= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
         }
         break;
      case JudgeType_T8_PR:
@@ -2670,7 +2853,7 @@
      CakFileUtil akFileFinder;
      while (nReTryTime--)
      {
         //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER �˶� �߻� ���� �м� START
         //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
         if (nReTryTime%2 == 0)
         {
            strFilePath = AOIRAWBIN_PATH;
@@ -2679,9 +2862,9 @@
         strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
          akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
         //LYW LOG�߰�
         //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
         //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
         VECFINDDATA* pFindData = akFileFinder.getFindData();
         int nFileNamePos = strlen(akFileFinder.getProcessPath());
         std::map<LONGLONG, CString> mapSpanFileName;
@@ -2693,7 +2876,7 @@
               parser.process(pFileName, "_.");
               if (parser.getTokNum() < 4) continue;
               
               if (parser.getTokNum() >= 6) continue; // 0401 �߰�
               if (parser.getTokNum() >= 6) continue; // 0401
               int nDataTime[8] = {};
               {
@@ -2721,7 +2904,6 @@
         {
            if (mapSpanFileName.begin()->first < nCloseTime)
            {
               //占쏙옙占쏙옙 占쌍깍옙 占쏙옙占쏙옙占쏙옙占?찾占쏙옙 占쏙옙占쏙옙 [占쏙옙占쏙옙占쏙옙 2019/7/17]
               strFindFile = mapSpanFileName.begin()->second;
               break;
            }
@@ -2781,7 +2963,7 @@
   int nPCControlReadDataCount = pSignalInfo->GetReadDataAddressCount();
   // [2017:1:9]-[WEZASW] : PCControl GlassData �׸� ������.
   // [2017:1:9]-[WEZASW] : PCControl GlassData
   if(pSignalInfo->GetUseContinuousReadAddress())
   {
      CString strReadAddress = _T("");
@@ -3160,11 +3342,11 @@
void CSequenceProcessor_CPJT::UpdateGlassResultFromTransferData(CGlassResult *pGlassResult, STransferData* pTransferData)
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data �б�!"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data Read!"));
   if (pGlassResult==NULL || pTransferData==NULL) return;
   // [2017:1:9]-[WEZASW] : PCControl GlassData �׸� ������
   // [2017:1:9]-[WEZASW] : PCControl GlassData
   // transfer data is not exist
   if (pTransferData->strLotID.GetLength()<1)
   {
@@ -3233,80 +3415,89 @@
   pGlassResult->m_strPairFlag = pTransferData->strPairFlag;
   pGlassResult->m_strOptionValue = pTransferData->strOptionValue;
   pGlassResult->m_strReserved = pTransferData->strReserved;
   pGlassResult->strGlassScanSchedule = pTransferData->strGlassScanSchedule;//���� ���� cmark
   pGlassResult->strGlassScanSchedule = pTransferData->strGlassScanSchedule;//cmark
   pGlassResult->m_strRTMSStepID = pTransferData->strStepID; //taek 210126
   
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data ��!"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data END!"));
}
void CSequenceProcessor_CPJT::UpdateHistoryResultFromTransferData(CGlassResult *pHistoryResult, CGlassResult* pGlassResult)
{
   if (pHistoryResult == NULL || pGlassResult == NULL) return;
   try
   {
      if (pHistoryResult == NULL || pGlassResult == NULL) return;
   CTime time = CTime::GetCurrentTime();
      CTime time = CTime::GetCurrentTime();
   CString strTime = _T("");
   strTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
      CString strTime = _T("");
      strTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
   // update transfer data to glass result
   pHistoryResult->m_nGlassSizeX = pGlassResult->m_nGlassSizeX;
   pHistoryResult->m_nGlassSizeY = pGlassResult->m_nGlassSizeY;
   pHistoryResult->m_nCollisionDistanceX = pGlassResult->m_nCollisionDistanceX;
   pHistoryResult->m_nCollisionDistanceY = pGlassResult->m_nCollisionDistanceY;
   pHistoryResult->m_nCollisionXPos1 = pGlassResult->m_nCollisionXPos1;
   pHistoryResult->m_nCollisionXPos2 = pGlassResult->m_nCollisionXPos2;
   pHistoryResult->m_nOriginDir = pGlassResult->m_nOriginDir;
   pHistoryResult->m_strResultDate = pGlassResult->m_strResultDate;
   pHistoryResult->m_vecReviewScheduleResult = pGlassResult->m_vecReviewScheduleResult;
   pHistoryResult->m_nCornerCutDir = pGlassResult->m_nCornerCutDir;
   pHistoryResult->m_bReadRawFile = pGlassResult->m_bReadRawFile;
   pHistoryResult->m_vecReviewResult = pGlassResult->m_vecReviewResult;
   pHistoryResult->m_strGlassLastName = pGlassResult->m_strGlassLastName;
   pHistoryResult->m_strGlassID = pGlassResult->m_strGlassID;
   pHistoryResult->m_strGlassCode = pGlassResult->m_strGlassCode;
   pHistoryResult->m_strMode = pGlassResult->m_strMode;
   pHistoryResult->m_strGlassType = pGlassResult->m_strGlassType;
   pHistoryResult->m_strDummyType = pGlassResult->m_strDummyType;
   pHistoryResult->m_strProdID = pGlassResult->m_strProdID;
   pHistoryResult->m_strOperID = pGlassResult->m_strOperID;
   pHistoryResult->m_strLotID = pGlassResult->m_strLotID;
   pHistoryResult->m_strPPID = pGlassResult->m_strPPID;
   pHistoryResult->m_strPPID_RC = pGlassResult->m_strPPID_RC;
   pHistoryResult->m_strJobType = pGlassResult->m_strJobType;
   pHistoryResult->m_strJobID = pGlassResult->m_strJobID;
   pHistoryResult->m_strLotSeqNum = pGlassResult->m_strLotSeqNum;
   pHistoryResult->m_strSlotSeqNum = pGlassResult->m_strSlotSeqNum;
   pHistoryResult->m_strPropertyCode = pGlassResult->m_strPropertyCode;
   pHistoryResult->m_strJobJudgeCode = pGlassResult->m_strJobJudgeCode;
   pHistoryResult->m_strJobGradeCode = pGlassResult->m_strJobGradeCode;
   pHistoryResult->m_strSubstrateType = pGlassResult->m_strSubstrateType;
   pHistoryResult->m_strProcessingFlag = pGlassResult->m_strProcessingFlag;
   pHistoryResult->m_strInspectionFlag = pGlassResult->m_strInspectionFlag;
   pHistoryResult->m_strSkipFlag = pGlassResult->m_strSkipFlag;
   pHistoryResult->m_strJobSize = pGlassResult->m_strJobSize;
   pHistoryResult->m_strGlassThickness = pGlassResult->m_strGlassThickness;
   pHistoryResult->m_strJobAngle = pGlassResult->m_strJobAngle;
   pHistoryResult->m_strJobFlip = pGlassResult->m_strJobFlip;
   pHistoryResult->m_strCuttingGlassType = pGlassResult->m_strCuttingGlassType;
   pHistoryResult->m_strProcessingCount = pGlassResult->m_strProcessingCount;
   pHistoryResult->m_strInspectionJudgeData = pGlassResult->m_strInspectionJudgeData;
   pHistoryResult->m_strPairJobID = pGlassResult->m_strPairJobID;
   pHistoryResult->m_strPairFlag = pGlassResult->m_strPairFlag;
   pHistoryResult->m_strOptionValue = pGlassResult->m_strOptionValue;
   pHistoryResult->m_strReserved = pGlassResult->m_strReserved;
   pHistoryResult->strGlassScanSchedule = pGlassResult->strGlassScanSchedule;//���� ���� cmark
   pHistoryResult->m_strStepID = pGlassResult->m_strRTMSStepID; //taek 210126
   pHistoryResult->m_strEquipID = pGlassResult->m_strEquipID;
   pHistoryResult->m_strProcessID = pGlassResult->m_strProcessID;
   pHistoryResult->m_strUploadImgFileName = pGlassResult->m_strUploadImgFileName;
   pHistoryResult->m_strUnLoadingTime = strTime;
   pHistoryResult->m_mapDefectResult = pGlassResult->m_mapDefectResult;
   pHistoryResult->m_AlignResult = pGlassResult->m_AlignResult;
      // update transfer data to glass result
      pHistoryResult->m_nGlassSizeX = pGlassResult->m_nGlassSizeX;
      pHistoryResult->m_nGlassSizeY = pGlassResult->m_nGlassSizeY;
      pHistoryResult->m_nCollisionDistanceX = pGlassResult->m_nCollisionDistanceX;
      pHistoryResult->m_nCollisionDistanceY = pGlassResult->m_nCollisionDistanceY;
      pHistoryResult->m_nCollisionXPos1 = pGlassResult->m_nCollisionXPos1;
      pHistoryResult->m_nCollisionXPos2 = pGlassResult->m_nCollisionXPos2;
      pHistoryResult->m_nOriginDir = pGlassResult->m_nOriginDir;
      pHistoryResult->m_strResultDate = pGlassResult->m_strResultDate;
      pHistoryResult->m_vecReviewScheduleResult = pGlassResult->m_vecReviewScheduleResult;
      pHistoryResult->m_nCornerCutDir = pGlassResult->m_nCornerCutDir;
      pHistoryResult->m_bReadRawFile = pGlassResult->m_bReadRawFile;
      pHistoryResult->m_vecReviewResult = pGlassResult->m_vecReviewResult;
      pHistoryResult->m_strGlassLastName = pGlassResult->m_strGlassLastName;
      pHistoryResult->m_strGlassID = pGlassResult->m_strGlassID;
      pHistoryResult->m_strGlassCode = pGlassResult->m_strGlassCode;
      pHistoryResult->m_strMode = pGlassResult->m_strMode;
      pHistoryResult->m_strGlassType = pGlassResult->m_strGlassType;
      pHistoryResult->m_strDummyType = pGlassResult->m_strDummyType;
      pHistoryResult->m_strProdID = pGlassResult->m_strProdID;
      pHistoryResult->m_strOperID = pGlassResult->m_strOperID;
      pHistoryResult->m_strLotID = pGlassResult->m_strLotID;
      pHistoryResult->m_strPPID = pGlassResult->m_strPPID;
      pHistoryResult->m_strPPID_RC = pGlassResult->m_strPPID_RC;
      pHistoryResult->m_strJobType = pGlassResult->m_strJobType;
      pHistoryResult->m_strJobID = pGlassResult->m_strJobID;
      pHistoryResult->m_strLotSeqNum = pGlassResult->m_strLotSeqNum;
      pHistoryResult->m_strSlotSeqNum = pGlassResult->m_strSlotSeqNum;
      pHistoryResult->m_strPropertyCode = pGlassResult->m_strPropertyCode;
      pHistoryResult->m_strJobJudgeCode = pGlassResult->m_strJobJudgeCode;
      pHistoryResult->m_strJobGradeCode = pGlassResult->m_strJobGradeCode;
      pHistoryResult->m_strSubstrateType = pGlassResult->m_strSubstrateType;
      pHistoryResult->m_strProcessingFlag = pGlassResult->m_strProcessingFlag;
      pHistoryResult->m_strInspectionFlag = pGlassResult->m_strInspectionFlag;
      pHistoryResult->m_strSkipFlag = pGlassResult->m_strSkipFlag;
      pHistoryResult->m_strJobSize = pGlassResult->m_strJobSize;
      pHistoryResult->m_strGlassThickness = pGlassResult->m_strGlassThickness;
      pHistoryResult->m_strJobAngle = pGlassResult->m_strJobAngle;
      pHistoryResult->m_strJobFlip = pGlassResult->m_strJobFlip;
      pHistoryResult->m_strCuttingGlassType = pGlassResult->m_strCuttingGlassType;
      pHistoryResult->m_strProcessingCount = pGlassResult->m_strProcessingCount;
      pHistoryResult->m_strInspectionJudgeData = pGlassResult->m_strInspectionJudgeData;
      pHistoryResult->m_strPairJobID = pGlassResult->m_strPairJobID;
      pHistoryResult->m_strPairFlag = pGlassResult->m_strPairFlag;
      pHistoryResult->m_strOptionValue = pGlassResult->m_strOptionValue;
      pHistoryResult->m_strReserved = pGlassResult->m_strReserved;
      pHistoryResult->strGlassScanSchedule = pGlassResult->strGlassScanSchedule;// cmark
      pHistoryResult->m_strStepID = pGlassResult->m_strRTMSStepID; //taek 210126
      pHistoryResult->m_strEquipID = pGlassResult->m_strEquipID;
      pHistoryResult->m_strProcessID = pGlassResult->m_strProcessID;
      pHistoryResult->m_strUploadImgFileName = pGlassResult->m_strUploadImgFileName;
      pHistoryResult->m_strUnLoadingTime = strTime;
      pHistoryResult->m_mapDefectResult = pGlassResult->m_mapDefectResult;
      pHistoryResult->m_AlignResult = pGlassResult->m_AlignResult;
   }
   catch (...)
   {
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Review End] UpdateHistoryResultFromTransferData Error"));
      return;
   }
}
void CSequenceProcessor_CPJT::CreateResultDirectory(const CString& strGlassID, const CString& strDate)
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占쏙옙占썰리 占쏙옙占쏙옙占?占쏙옙占쏙옙"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make Directory Start"));
   if (m_pSP2P==NULL) return;
   const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
@@ -3352,7 +3543,7 @@
      strPath.Format(_T("%s\\%s"),pNetworkInfo->m_strAlignImagePath, strGlassID);
      CreateDirectory(strPath, NULL);
   }
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占쏙옙占썰리 占쏙옙占쏙옙占?占쏙옙"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make directory End"));
}
@@ -3360,7 +3551,7 @@
void CSequenceProcessor_CPJT::SetSaveImageBasePathToReviewProcessor(const CString& strGlassID, const CString& strResultDate)
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占싱뱄옙占쏙옙 占싻쏙옙 占쏙옙占쏙옙占?占쏙옙占쏙옙"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make image path start"));
   const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
   if(pNetworkInfo == NULL) return;
@@ -3405,11 +3596,11 @@
            Sleep(1000);
            if (CDitGlassRawClient::GetInstance()->isConnect() == FALSE)
            {
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ���� ���� Count[%d]"), nReconnect);
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]access Shared Memory Fail!! Count[%d]"), nReconnect);
            }
            else
            {
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ���� ����"));
               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]access Shared Memory Success"));
               break;
            }
            nReconnect += 1;
@@ -3432,7 +3623,7 @@
      else
      {
         tmServerLoadingTime = CTime::GetCurrentTime();
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] �����޸� �����̻�"));
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] access Shared Memory Fail"));
         strPath.Format(_T("%s\\%s_%04d%02d%02d%02d%02d%02d"), pNetworkInfo->m_strUploadImagePath, strGlassID, tmServerLoadingTime.GetYear(), tmServerLoadingTime.GetMonth(), tmServerLoadingTime.GetDay(), tmServerLoadingTime.GetHour(), tmServerLoadingTime.GetMinute(), tmServerLoadingTime.GetSecond());
         strImagePath.Format(_T("%s\\%s_%04d%02d%02d%02d%02d%02d"), strGlassID, tmServerLoadingTime.GetYear(), tmServerLoadingTime.GetMonth(), tmServerLoadingTime.GetDay(), tmServerLoadingTime.GetHour(), tmServerLoadingTime.GetMinute(), tmServerLoadingTime.GetSecond());
         CreateDirectory(strPath, NULL);
@@ -3441,12 +3632,12 @@
      }
   }
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占싱뱄옙占쏙옙 占싻쏙옙 占쏙옙占쏙옙占?占쏙옙"));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make image path End"));
}
void CSequenceProcessor_CPJT::SetSaveImageBasePathToAlignCameraControl(const CString& strGlassID)
{
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占쏙옙占쏙옙占?占싱뱄옙占쏙옙 占싻쏙옙 占쏙옙占쏙옙 "));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading]  Make Align image path Start"));
   const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
   if(pNetworkInfo == NULL) return;
@@ -3458,8 +3649,12 @@
   {
      strPath.Format(_T("%s\\%s"), pNetworkInfo->m_strAlignImagePath, strGlassID);
      pAlignCameraControl->SetSaveImageBasePath(strPath);
      strPath.Format(_T("D:\\ResultData\\AlignOK\\%s"), strGlassID);
      pAlignCameraControl->SetSaveImageOKPath(strPath);
      strPath.Format(_T("D:\\ResultData\\AlignNG\\%s"), strGlassID);
      pAlignCameraControl->SetSaveImageNGPath(strPath);
   }
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] 占쏙옙占쏙옙占?占싱뱄옙占쏙옙 占싻쏙옙 占쏙옙 "));
   m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make Align image path End "));
}
BOOL CSequenceProcessor_CPJT::ReadRecipeDataFromRecipeFile(const CString& strPPID_RC, CString& strRecipeName)// const CString& strPPID, CString& strRecipeName
@@ -3526,14 +3721,12 @@
{
   if(pGlassResult == NULL) return FALSE;
   // ������ ����
   const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
   if (pRsRcpReviewInfo==NULL) return FALSE;
   // system info
   const CSystemInfo* pSystemInfo = m_pSP2P->ISP2P_System_GetSystemInfo();
   // �۶� ����
   STransferData* pTransferData = m_pSP2P->ISP2P_GetCurrentTransferData();
   if (pTransferData==NULL) return FALSE;
   int nGlassTypeInfoIndex = 0;
@@ -3549,20 +3742,16 @@
   if (pGlassTypeInfo == NULL) return FALSE;
   m_pSP2P->ISP2P_DisplayMessage(_T("GlassTypeName : %s,GlassTypeIdx : %s"),pGlassTypeInfo->m_strGlassTypeName,pTransferData->strGlassScanSchedule);
   
   // ���� ����
   const CMotorControlInfo *pMotorInfo = m_pSP2P->ISP2P_System_GetMotorInfo();
   // ��ǥ ��ȯ��
   CCoordCalibrator* pCoordCalibrator = m_pSP2P->ISP2P_GetCoordCalibrator();
   // ��ǥ�� ����
   if (pSystemInfo && pGlassTypeInfo && pMotorInfo && pCoordCalibrator)
   {
      // Get Direction      
      int nDirectionX = GetDirectionX(pGlassTypeInfo->m_nOriginDirection, pMotorInfo->GetOriginDirection());
      int nDirectionY = GetDirectionY(pGlassTypeInfo->m_nOriginDirection, pMotorInfo->GetOriginDirection());
      // ��ǥ�� ����
      pCoordCalibrator->SetTransDirection(nDirectionX, nDirectionY);
      pCoordCalibrator->SetOriginMotorPosition(pGlassTypeInfo->m_dOriginMotorX, pGlassTypeInfo->m_dOriginMotorY);
      if (fabs(pGlassTypeInfo->m_dAlignAngle) > 0.0000001)
@@ -3571,7 +3760,6 @@
            pGlassTypeInfo->m_dFirstAlignGlassX, pGlassTypeInfo->m_dFirstAlignGlassY, pGlassTypeInfo->m_dAlignAngle);
      }
      // �۶� ���� ����
      pGlassResult->SetGlassSize(pGlassTypeInfo->m_nGlassSizeX * 1000, pGlassTypeInfo->m_nGlassSizeY * 1000);
      pGlassResult->SetGlassOriginDirection(pGlassTypeInfo->m_nOriginDirection);
      pGlassResult->SetCornerCutDirection(pGlassTypeInfo->m_nCornerCutDirection);
@@ -3580,34 +3768,28 @@
      pGlassResult->SetCollisionDistanceX(int(pSystemInfo->m_dCollisionDistance*1000.));
   }
   // Align ����
   const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
   // Align ���� ����
   if (pGlassTypeInfo && pRsRcpAlignInfo)
   {
      // Align ��ũ ���� ���� (�ȼ�, ����, �۶� ��ġ)
      pGlassResult->m_AlignRecipe.m_nUseAlignPosMove      = pGlassTypeInfo->m_nUseAlignPosMove;
      // �ȼ� ��ġ
      pGlassResult->m_AlignRecipe.dOriginPixelX[0]      = pGlassTypeInfo->m_nFirstAlignFindPixelX;
      pGlassResult->m_AlignRecipe.dOriginPixelY[0]      = pGlassTypeInfo->m_nFirstAlignFindPixelY;
      pGlassResult->m_AlignRecipe.dOriginPixelX[1]      = pGlassTypeInfo->m_nSecondAlignFindPixelX;
      pGlassResult->m_AlignRecipe.dOriginPixelY[1]      = pGlassTypeInfo->m_nSecondAlignFindPixelY;
      // ���� ��ġ
      pGlassResult->m_AlignRecipe.dOriginPositionX[0]      = pGlassTypeInfo->m_dFirstAlignMotorX;
      pGlassResult->m_AlignRecipe.dOriginPositionY[0]      = pGlassTypeInfo->m_dFirstAlignMotorY;
      pGlassResult->m_AlignRecipe.dOriginPositionX[1]      = pGlassTypeInfo->m_dSecondAlignMotorX;
      pGlassResult->m_AlignRecipe.dOriginPositionY[1]      = pGlassTypeInfo->m_dSecondAlignMotorY;
      // �۶� ��ġ
      pGlassResult->m_AlignRecipe.dGlassPositionX[0]      = pGlassTypeInfo->m_dFirstAlignGlassX;
      pGlassResult->m_AlignRecipe.dGlassPositionY[0]      = pGlassTypeInfo->m_dFirstAlignGlassY;
      pGlassResult->m_AlignRecipe.dGlassPositionX[1]      = pGlassTypeInfo->m_dSecondAlignGlassX;
      pGlassResult->m_AlignRecipe.dGlassPositionY[1]      = pGlassTypeInfo->m_dSecondAlignGlassY;
      // Align Recipe 占쏙옙占쏙옙 占쏙옙占쏙옙 占쌘듸옙占쏙옙占쏙옙 찾占쏙옙 占식띰옙占쏙옙占?
      // Align Recipe
      // Align Skip Mode
      pGlassResult->m_AlignRecipe.bAlignSkipMode      = pRsRcpAlignInfo->m_bAlignSkipMode;
      pGlassResult->m_AlignRecipe.bUseTotalPitchMeasure = pRsRcpAlignInfo->m_bTotalPitchMeasure;
@@ -3617,6 +3799,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
@@ -3627,29 +3815,24 @@
      pGlassResult->m_AlignRecipe.nMergeRange         = pRsRcpAlignInfo->m_nMergeRange;
      pGlassResult->m_AlignRecipe.dEdgeRate         = pRsRcpAlignInfo->m_dEdgeRate;
      
      // 占쏙옙占쏙옙챨占?
      pGlassResult->m_AlignRecipe.bManualProcess         = pRsRcpAlignInfo->m_bManualProcess;
      pGlassResult->m_AlignRecipe.dFirstCamExposure      = pRsRcpAlignInfo->m_dFirstCamExposure;
      pGlassResult->m_AlignRecipe.dSecondCamExposure      = pRsRcpAlignInfo->m_dSecondCamExposure;
      // �ڵ����� ����
      pGlassResult->m_AlignRecipe.bAutoProcess         = pRsRcpAlignInfo->m_bAutoProcess;
      pGlassResult->m_AlignRecipe.dTargetMin            = pRsRcpAlignInfo->m_dTargetMin;
      pGlassResult->m_AlignRecipe.dTargetMax            = pRsRcpAlignInfo->m_dTargetMax;
      pGlassResult->m_AlignRecipe.dExposureMin         = pRsRcpAlignInfo->m_dExposureMin;
      pGlassResult->m_AlignRecipe.dExposureMax         = pRsRcpAlignInfo->m_dExposureMax;
      // Align Recipe ���� ���� rotate info
      pGlassResult->m_AlignRecipe.bRotateProcess         = pRsRcpAlignInfo->m_bRotateProcess;
      pGlassResult->m_AlignRecipe.nRetryCount            = pRsRcpAlignInfo->m_nRetryCount;
      pGlassResult->m_AlignRecipe.dGlassAngleMin         = pRsRcpAlignInfo->m_dGlassAngleMin;
      pGlassResult->m_AlignRecipe.dGlassAngleMax         = pRsRcpAlignInfo->m_dGlassAngleMax;
      // Align ī�޶� ���� �� �ػ� ����
      int nAlignCameraInfoCount = 2;
      for(int nAlignCameraIdx = 0; nAlignCameraIdx < nAlignCameraInfoCount; nAlignCameraIdx++)
      {
         // Align ���� �� ��������.
         int nLightValue = 0;
         
         
@@ -3657,10 +3840,8 @@
         {
            nLightValue = (nAlignCameraIdx==0) ? (int)pRsRcpAlignInfo->m_dFirstCamExposure: (int)pRsRcpAlignInfo->m_dSecondCamExposure;
            // 占쏙옙占쏙옙占?카占쌨띰옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙
            const CAlignCameraInfo *pCameraInfo = m_pSP2P->ISP2P_System_GetAlignCameraInfo(nAlignCameraIdx);
             //占쏙옙占쏙옙占?占쏙옙占쏙옙.
            CLightControl *pLightControl = NULL;
            const CLightControlInfo *AlignLightinfo = pCameraInfo->GetLightContorlInfo();
@@ -3669,8 +3850,6 @@
            {
               if (AlignLightinfo->GetMaster()==1&& nAlignCameraIdx==1)
               {
                  //占쏙옙占쏙옙占?占쏙옙틀占싼뤄옙占쏙옙 占싹놂옙占쏙옙 占쏙옙占쏙옙퓸占?占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占싸뤄옙 확占쏙옙
                  //������ �̰� �´��� �𸣰ٴ� �ƹ��� �Ⱦ˷���
                  pLightControl = m_pSP2P->ISP2P_GetAlignLightControl(0);
               }
@@ -3704,8 +3883,6 @@
            }
         }
         
         // 占쏙옙占쏙옙占?카占쌨띰옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙
         const CAlignCameraInfo *pCameraInfo   = m_pSP2P->ISP2P_System_GetAlignCameraInfo(nAlignCameraIdx);
         if (pCameraInfo)
         {
@@ -3733,7 +3910,6 @@
            }
         }
         // 占쏙옙占쏙옙占?占쏙옙占시몌옙 占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙占쏙옙
         if((int)pGlassTypeInfo->m_vecTemplateImagePath.size() == nAlignCameraInfoCount)
         {
            pGlassResult->m_AlignRecipe.strTemplateName[nAlignCameraIdx] = pGlassTypeInfo->m_vecTemplateImagePath[nAlignCameraIdx];
@@ -3762,14 +3938,13 @@
         if (pRcpReviewAFMInfo)
         {
            int nRealAFMIndex = pRcpReviewAFMInfo->m_nRecipeIndex;
            if(nRealAFMIndex == -1)// �����ǿ� ���õ� ������ ���� MagnificInfo Index�� �˾ƿ�
            if(nRealAFMIndex == -1)
            {
               //-1占쏙옙 占쏙옙占?占쏙옙占쏙옙 占싸듸옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙.
               nRealAFMIndex = GetRealMagnification(nModuleIdx, pRcpReviewAFMInfo->m_nZoomIndex);
            }
            AFM_SetAFMRecipeName(nModuleIdx, strRecipeName, nRealAFMIndex);
            if(pRcpReviewAFMInfo->m_bAFMHomeOffMode==TRUE) //190618AFMȨ ������ ���� X
            if(pRcpReviewAFMInfo->m_bAFMHomeOffMode==TRUE) //190618AFM
            {
               SetUseAfmHomePosition(FALSE);
            }
@@ -3781,7 +3956,6 @@
      }
   }
   // ���� ã�� ������ ����
   CReviewProcessor* pReviewProcessor = m_pSP2P->ISP2P_GetReviewProcessor();
   const CRsRcpDefectFindInfo* pRsRcpDefectFindInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpDefectFindInfo();
   if(pReviewProcessor && pRsRcpDefectFindInfo)
@@ -3832,7 +4006,6 @@
   CString strRawTDPath=_T(""), strRawCDPath=_T(""), strRawSDPath=_T("");
   // 占쏙옙占쏙옙占쏙옙占?占싱몌옙 찾占쏙옙
   FindAOIRawFilePath(pGlassResult, &strRawTDPath, &strRawCDPath, &strRawSDPath);
   bRet = m_pSP2P->ISP2P_ReadAOIRawFileToGlassResult(strRawTDPath);
@@ -3886,7 +4059,7 @@
      if(finder.IsDots()) continue;
      if(finder.IsDirectory()) continue;
      // [2017:5:16]-[WEZASW] : AOI Server占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙치占쏙옙 占쏙옙占쌉몌옙 占싱뱄옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙占?占쏙옙占쏙옙 占쏙옙占싹몌옙 占쏙옙占쏙옙
      // [2017:5:16]-[WEZASW] : AOI Server
      sRawFile.strFileName = finder.GetFileName();
      strExtTemp = sRawFile.strFileName;
      int nIdx = strExtTemp.Remove('.');      
@@ -4064,7 +4237,6 @@
      CModuleStatus*               pModuleStatus   = Module_GetModuleStatus(nModuleIdx);      
      if (pModuleStatus == NULL) continue;
      //�浹�Ÿ� �ֱ�
      {
      double dCollisionPosX = pReviewResult->GetCollisionPositionX() / 1000.0;
@@ -4105,13 +4277,12 @@
      }
      //�¿� ��Ʈ�� �����̵�
      pMotorControl->GantrySetTwoGantrySyncModeSend(0);
      // set result index
      int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
      int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;      // End Index �ٽü���
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;      // End Index
      double xpostemp, ypostemp;
      // get review pos
@@ -4121,7 +4292,7 @@
         SReviewResult* pReview = pReviewResult->GetSReviewResult(nResultIdx);
         if (pReview==NULL) continue;
         //200占쏙옙 占쏙옙藥뱄옙占쏙옙占?占쏙옙占쏙옙占쏙옙 占싹뤄옙占쏙옙占쏙옙占쏙옙占?占쌩븝옙체크
         //200
         if (pReview->bCheckSendToMotor == FALSE)
         {
            pReview->bCheckSendToMotor = TRUE;
@@ -4168,7 +4339,6 @@
         }
      }
      //���� ����Ʈ�� �ִ��� ������ üũ
      if (vectorPosX.empty() ==TRUE)
      {
         g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point "), vectorPosX.size());
@@ -4200,13 +4370,11 @@
         int nTickCount = GetTickCount();
         while (1)
         {
            //5�� ����Ÿ��
            if ((GetTickCount() - nTickCount) > 5000)
            {
               bOverTime = TRUE;
               break;
            }
            //占쏙옙占쏙옙 占쏙옙占?End 체크
            if (pMotorControl->IsGantryMotionEnd(pModuleStatus->GetGantryIndex()) == TRUE)
            {
               if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
@@ -4225,15 +4393,12 @@
         }
         //5占쏙옙占식울옙占쏙옙 占싫울옙占쏙옙占싸댐옙? 占쌓뤄옙 3占쏙옙 占쏙옙천占?占쏙옙占쏙옙
         //���End �� �߸� ���ü��� ������
         if (bOverTime == TRUE)
         {
            for (int i = 0; i < 3; i++)
            {
               Sleep(1000);
               //���Ͱ� �����ϼ� ���»����϶� Send ��ȣ�� Fail �߻� ���� Retry 3�� ����
               if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
               {
                  nTotalCount += (int)vectorPosX.size();
@@ -4307,7 +4472,7 @@
   if(pGlassResult && pReviewProcessor)
   {
      // UserStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   //pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   //pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_UserStart, nPlanIndex);
@@ -4370,7 +4535,6 @@
      CModuleStatus*               pModuleStatus = Module_GetModuleStatus(nModuleIdx);
      if (pModuleStatus == NULL) continue;
      //�浹�Ÿ� �ֱ�
      {
         double dCollisionPosX = pReviewResult->GetCollisionPositionX() / 1000.0;
@@ -4413,9 +4577,9 @@
      // set result index
      int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
      int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount() - 1)) + 1;      // End Index �ٽü���
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount() - 1)) + 1;      // End Index
      // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
      // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
      double m_dMinOffset = -5.0;
      double m_dMaxOffset = 5.0;
      double xpostemp, ypostemp;
@@ -4426,7 +4590,7 @@
         SReviewResult* pReview = pReviewResult->GetSReviewResult(nResultIdx);
         if (pReview == NULL) continue;
         //200占쏙옙 占쏙옙藥뱄옙占쏙옙占?占쏙옙占쏙옙占쏙옙 占싹뤄옙占쏙옙占쏙옙占쏙옙占?占쌩븝옙체크
         //200
         if (pReview->bCheckSendToMotor == FALSE)
         {
            pReview->bCheckSendToMotor = TRUE;
@@ -4474,7 +4638,6 @@
         }
      }
      //���� ����Ʈ�� �ִ��� ������ üũ
      if (vectorPosX.empty() == TRUE)
      {
         g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point "), vectorPosX.size());
@@ -4530,6 +4693,16 @@
   SetWsiType(0);
   WSIAllReadySignal(1);
   Sleep(1000);
   /*< LYW 20211028 - #3718 ADD Start >*/
   // WSI Redeay 송신후 Review TimeOver 1회 추가 체크
   if (GetProcessStatus() == ProcessReviewEnd_CPJT || GetProcessStatus() == ProcessReviewUnloding_CPJT)
   {
      g_pLog->DisplayMessage(_T("[ProcessStop] WSI StartProcessing Sequence Stop Status : %d"), GetProcessStatus());
      return TRUE;
   }
   /*< LYW 20211028 - #3718 ADD End >*/
   if(!WSIAllStartSignal())
   {
      g_pLog->DisplayMessage(_T("[WSI] WSI Start Fail!!"));
@@ -4539,7 +4712,7 @@
   if(pGlassResult && pReviewProcessor)
   {
      // WsiStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIStart, nPlanIndex);
@@ -4552,7 +4725,7 @@
      MakeWSIUpLoadDirectory(pReviewProcessor->GetUploadImagePath());
      //20190219 chm 
      pReviewProcessor->SetReviewCount(0);         // ���� Sequence No �ʱ�ȭ.
      pReviewProcessor->SetReviewCount(0);
      return TRUE;
   }   
@@ -4565,7 +4738,7 @@
   strPath  = strPath + _T("\\WSI");
   if(CreateDirectory(strPath,NULL)==FALSE)
   {
      //LYW LOG�߰�
      //LYW LOG
      g_pLog->DisplayMessage(_T("[MakeWSIUpLoadDirectory]Directory Create Fail %s, ERROR CODE = %d "),strPath, GetLastError());
   }
   
@@ -4606,7 +4779,7 @@
   VectorDouble vectorCollisionPosX;
   vectorCollisionPosX.clear();
   //WSI �¿� ��Ʈ�� �����̵�
   //WSI
   pMotorControl->GantrySetTwoGantrySyncModeSend(1);
   
   // WSI result count
@@ -4619,7 +4792,6 @@
      CModuleStatus*               pModuleStatus = Module_GetModuleStatus(nModuleIdx);
      if (pModuleStatus == NULL) continue;
      //�浹�Ÿ� �ֱ�
      {
         double dCollisionPosX = pWsiResult->GetCollisionPositionX() / 1000.0;
         double dCollisionPosY = 0.0;
@@ -4660,7 +4832,7 @@
      int nEndIdx = pWsiResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pWsiResult->GetSReviewResultCount() - 1)) + 1;      // set End Index 
      // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
      // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
      double m_dMinOffset = -5.0;
      double m_dMaxOffset = 5.0;
@@ -4672,7 +4844,7 @@
         SReviewResult* pWsi = pWsiResult->GetSReviewResult(nResultIdx);
         if (pWsi == NULL) continue;
         //200占쏙옙 占쏙옙藥뱄옙占쏙옙占?占쏙옙占쏙옙占쏙옙 占싹뤄옙占쏙옙占쏙옙占쏙옙占?占쌩븝옙체크
         //200
         if (pWsi->bCheckWSISendToMotor == FALSE)
         {
            pWsi->bCheckWSISendToMotor = TRUE;
@@ -4719,14 +4891,13 @@
         }
      }
      //���� ����Ʈ�� �ִ��� ������ üũ
      if (vectorPosX.empty() == TRUE)
      {
         //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error �˶� �߻� ���� �м� �� ��ġ START
         //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
         //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error END
      }
      else
      {
@@ -4750,13 +4921,12 @@
            int nTickCount = GetTickCount();
            while (1)
            {
               //5�� ����Ÿ��
               if ((GetTickCount() - nTickCount) > 5000)
               {
                  bOverTime = TRUE;
                  break;
               }
               //占쏙옙占쏙옙 占쏙옙占?End 체크
               //End üũ
               if (pMotorControl->IsGantryMotionEnd(pModuleStatus->GetGantryIndex()) == TRUE)
               {
                  if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
@@ -4775,15 +4945,12 @@
            }
            //5占쏙옙占식울옙占쏙옙 占싫울옙占쏙옙占싸댐옙? 占쌓뤄옙 3占쏙옙 占쏙옙천占?占쏙옙占쏙옙
            //���End �� �߸� ���ü��� ������
            if (bOverTime == TRUE)
            {
               for (int i = 0; i < 3; i++)
               {
                  Sleep(1000);
                  //���Ͱ� �����ϼ� ���»����϶� Send ��ȣ�� Fail �߻� ���� Retry 3�� ����
                  if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
                  {
                     nTotalCount += (int)vectorPosX.size();
@@ -4918,9 +5085,9 @@
      // get result index
      int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
      int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;      // End Index �ٽü���
      nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;      // End Index
      // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
      // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
      double m_dMinOffset = -5.0; 
      double m_dMaxOffset = 5.0;
@@ -5022,7 +5189,7 @@
   if(pGlassResult && pReviewProcessor)
   {
      // MeasureStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_MeasureStart, nPlanIndex);
@@ -5097,7 +5264,7 @@
            const SCoordInfo* pCoordInfo = Module_GetCoordInfo(nModuleIdx);
            if(pCoordInfo == NULL) continue;   
            // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
            // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
            double m_dMinOffset = -5.0; 
            double m_dMaxOffset = 5.0;
@@ -5203,7 +5370,6 @@
   int nTotalCount = 0;
   double dDefectPosX, dDefectPosY;
   // Module�� ��ġ�� ���� ModuleStatus sorting
   std::vector<CModuleStatus*> SortedModuleStatus;
   for(int nModuleIdx = 0; nModuleIdx < m_pSP2P->ISP2P_GetModuleStatusCount(); nModuleIdx++)
   {
@@ -5257,7 +5423,7 @@
            const SCoordInfo* pCoordInfo = Module_GetCoordInfo(pReviewResult->GetModuleIndex());
            if(pCoordInfo == NULL) continue;            
            // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
            // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
            double m_dMinOffset = -5.0; 
            double m_dMaxOffset = 5.0;
@@ -5278,7 +5444,6 @@
            if(nHeaderIdx == 0)
            {
               // �̵��� ������ǥ �߰�
               if((int)vectorPos.size() < MAX_MOTOR_ADDRESS_SIZE)
               {
                  pSReviewResult->dTargetMotorX = dDefectPosX;
@@ -6545,8 +6710,6 @@
         // add user schedule result
         
         //占쏙옙占쏙옙占쌨모리울옙 채占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙표占쏙옙 占쏙옙占쏙옙체占쏙옙 채占쏙옙占쌍댐옙 占쏙옙占?
         {
@@ -7261,7 +7424,6 @@
            break;
         }
         break;
      // 占싱삼옙占?
      case CPJT_PlanMeasure:
         {
            const CRcpMeasureInfo *pRcpMeasureInfo = pRsRcpMeasureInfo->GetRcpMeasureInfo(0);
@@ -7394,7 +7556,7 @@
}
//CIM DV Data
BOOL CSequenceProcessor_CPJT::SendDVDataToSignalControl() // ����
BOOL CSequenceProcessor_CPJT::SendDVDataToSignalControl()
{
   CGlassResult *pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
   if (pGlassResult==NULL) return FALSE;
@@ -7419,7 +7581,7 @@
}
int CSequenceProcessor_CPJT::MakeDVData(CGlassResult *pGlassResult, char* pDVData, int nIndex) // ����
int CSequenceProcessor_CPJT::MakeDVData(CGlassResult *pGlassResult, char* pDVData, int nIndex)
{
   g_pLog->DisplayMessage(_T("[SequenceProcessor] SendDVDataToSignalControl->MakeDVData IN."));
@@ -7428,16 +7590,16 @@
   const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
   if (pRsRcpReviewInfo == NULL) return FALSE;
   // Review ���� ����
   // Review
   const CRcpLightInfo *pReviewLightInfo = pRsRcpReviewInfo->GetRcpLightInfo(nIndex);
   // Review AFM ����
   // Review AFM
   const CRcpAFMRecipeInfo *pReviewAFMInfo = pRsRcpReviewInfo->GetRcpAFMRecipeInfo(nIndex);
   // Review Align Info
   const CAlignResult*   pAlignResult = pGlassResult->GetAlignResult();
   // Review Defect Info
   const CReviewResult* pReviewResult = pGlassResult->GetReviewResult(nIndex);
   // Review ���� ����
   // Review
   const CModuleStatus* pModuleStatus = Module_GetModuleStatus(nIndex);
   const SMagnificInfo* pSMagnificInfo = pModuleStatus->GetMagnificInfo(pReviewAFMInfo->GetZoomIndex());
   CSignalControl* pSignalControl = m_pSP2P->ISP2P_GetSignalControl();
@@ -7459,12 +7621,12 @@
   // Write DVData Packet
   //_DVDataPack_B7_8ver DVDataPack;
   //**Review
   //INLINE  : 10��
   //TFE-OFF : 20��
   //Hcut : 50��
   //LAMI : 5��
   //INLINE  : 10
   //TFE-OFF : 20
   //Hcut : 50
   //LAMI : 5
   //**WSI
   //10�� ����
   //10
   ///////////////////////////////////////////////////////////////////////////
@@ -7502,8 +7664,13 @@
   int nReviewAliveCamera01 = 0;
   //foucs 
   nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast * 1000;
   nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview01ImageContrast * 1000;
   /*< LYW 20211109 - #3662 MOD Start >*/
   nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetReview00ImageContrast() * 1000;
   nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetReview01ImageContrast() * 1000;
   /*< LYW 20211109 - #3662 MOD End >*/
   /*< Origin Code >*/
//    nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast * 1000;
//    nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview01ImageContrast * 1000;
   //nRev_PC_HDD_CHECK = GetDiskUsage() * 1000;
   //nWSI1_PC_HDD_CHECK = nRev_PC_HDD_CHECK;//GetDiskUsage() * 1000;
@@ -7511,8 +7678,8 @@
   //nAlignResult = 1;
   
   //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;//����
   //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;//����
   //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;
   //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;
   //nAlignResult00 = pAlignResult->dFindScore[0];
   //nAlignResult01 = pAlignResult->dFindScore[1];
@@ -7530,7 +7697,6 @@
      nAlignResult01 = 0;
   }
   //�Ŀ�?
   nReviewAliveCamera00 = ReviewCamera_GetReviewCameraControl(0)->GetConnected() * 1000;
   nReviewAliveCamera01 = ReviewCamera_GetReviewCameraControl(1)->GetConnected() * 1000;
@@ -7547,8 +7713,7 @@
   {
      wsprintf(DriveText, TEXT("%C:"), Drive);
      UINT type = GetDriveType(DriveText);
      if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
         // 占싹듸옙酉?
      if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
         ULARGE_INTEGER i64FreeBytesToCaller = { 0 }, i64TotalBytes = { 0 }, i64FreeBytes = { 0 };
         BOOL bRsult = GetDiskFreeSpaceEx(DriveText, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes);
         if (bRsult) {
@@ -7762,7 +7927,7 @@
   pSignalControl->WritePacketData(_T("15100"), sizeof(DVDataPack_CPJT), (short*)&DVData);*/
}
//#3358 KYH FDC ������ ���� ���� ���� ADD START
//#3358 KYH FDC ADD START
void CSequenceProcessor_CPJT::MakeDVData2()
{
@@ -7775,9 +7940,9 @@
   }
   else
   {
   // Review ���� ����
   // Review
      pReviewLightInfo = pRsRcpReviewInfo->GetRcpLightInfo(0);
   // Review AFM ����
   // Review AFM
      pReviewAFMInfo = pRsRcpReviewInfo->GetRcpAFMRecipeInfo(0);
   }
@@ -7801,7 +7966,7 @@
   // Review ���� ����
   // Review
   const CModuleStatus* pModuleStatus = Module_GetModuleStatus(0);
   const SMagnificInfo* pSMagnificInfo = NULL;
   if (pModuleStatus == NULL)
@@ -7871,29 +8036,37 @@
   int nReviewAliveCamera01 = 1000;
   //foucs 
   /*< LYW 20211109 - #3662 MOD Start >*/
   if (m_pSP2P != NULL)
   {
      if (m_pSP2P->ISP2P_GetCurrentGlassResult() != NULL)
      {
         nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast * 1000;
         nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview01ImageContrast * 1000;
         if (m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast <=-2 || m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast >=999)
         {
            nRev_Cam1_Image_Contrast = 0 * 1000;
         }
         if (m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast <=-2|| m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast >=999)
         {
            nRev_Cam2_Image_Contrast = 0 * 1000;
         }
      }
      else
      {
         nRev_Cam1_Image_Contrast = 0;
         nRev_Cam2_Image_Contrast = 0;
      }
      nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetReview00ImageContrast() * 1000;
      nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetReview01ImageContrast() * 1000;
   }
   /*< LYW 20211109 - #3662 MOD End >*/
   /*< Origin Code >*/
//    if (m_pSP2P != NULL)
//    {
//       if (m_pSP2P->ISP2P_GetCurrentGlassResult() != NULL)
//       {
//
//          nRev_Cam1_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast * 1000;
//          nRev_Cam2_Image_Contrast = m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview01ImageContrast * 1000;
//
//          if (m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast <=-2 || m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast >=999)
//          {
//             nRev_Cam1_Image_Contrast = 0 * 1000;
//          }
//          if (m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast <=-2|| m_pSP2P->ISP2P_GetCurrentGlassResult()->nReview00ImageContrast >=999)
//          {
//             nRev_Cam2_Image_Contrast = 0 * 1000;
//          }
//       }
//       else
//       {
//          nRev_Cam1_Image_Contrast = 0;
//          nRev_Cam2_Image_Contrast = 0;
//       }
//    }
@@ -7903,8 +8076,8 @@
   //nAlignResult = 1;
   //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;//����
   //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;//����
   //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;
   //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;
   //nAlignResult00 = pAlignResult->dFindScore[0];
   //nAlignResult01 = pAlignResult->dFindScore[1];
@@ -7944,7 +8117,6 @@
      nAlignResult01 = 1000;
   }
   //�Ŀ�?
   if (ReviewCamera_GetReviewCameraControl(0) != NULL)
   {
      nReviewAliveCamera00 = ReviewCamera_GetReviewCameraControl(0)->GetConnected() * 1000;
@@ -7976,8 +8148,7 @@
   {
      wsprintf(DriveText, TEXT("%C:"), Drive);
      UINT type = GetDriveType(DriveText);
      if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
         // 占싹듸옙酉?
      if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
         ULARGE_INTEGER i64FreeBytesToCaller = { 0 }, i64TotalBytes = { 0 }, i64FreeBytes = { 0 };
         BOOL bRsult = GetDiskFreeSpaceEx(DriveText, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes);
         if (bRsult) {
@@ -8024,7 +8195,7 @@
   return;
}
//#3358 KYH FDC ������ ���� ���� ���� ADD END
//#3358 KYH FDC  ADD END
DWORD CSequenceProcessor_CPJT::GetDiskUsage()
{
@@ -8062,7 +8233,7 @@
   BOOL bResult = FALSE;
   // PCControl D2300 (�˻� ����)
   // PCControl D2300
   switch(nSignalIndex)
   {
   case PCControlRecv_TimeChange:
@@ -8128,7 +8299,7 @@
       g_pLog->DisplayMessage(_T("[SequenceProcessor] Success! SetLocalTime(), Current: %04d-%02d-%02d %02d-%02d-%02d, Changed: %04d-%02d-%02d %02d-%02d-%02d"), 
         CurrentTime.wYear, CurrentTime.wMonth, CurrentTime.wDay, CurrentTime.wHour, CurrentTime.wMinute, CurrentTime.wSecond,
         ChangedTime.wYear, ChangedTime.wMonth, ChangedTime.wDay, ChangedTime.wHour, ChangedTime.wMinute, ChangedTime.wSecond);
      // AFM & WSI TIME ����ȭ
      // AFM & WSI TIME
      SendSystemTime(ChangedTime);
   } else {
       g_pLog->DisplayMessage(_T("[SequenceProcessor] Fail! SetLocalTime()"));
@@ -8155,7 +8326,7 @@
   return TRUE;
}
// Local System ���� �ð��� ���� ��û ��Ʈ�ѷ��� �ð��� ó�� ����
// Local System
BOOL CSequenceProcessor_CPJT::SendSystemTime(SYSTEMTIME sysTime)
{
   SYSTEMTIME CurrentTime;
@@ -8302,7 +8473,7 @@
         case PCControlSend_Defoucs:
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Defoucs! => %d"),0);
            break;
         case PCControlSend_Diagnosis: // 0412 �ڰ����� ��ȣ �߰�
         case PCControlSend_Diagnosis: // 0412
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Diagnosis! => %d"), 0);
            break;
         }
@@ -8354,8 +8525,8 @@
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Review Start Ack! => %d"), 1);
            break;
         case PCControlSend_ResultDataComplete_CPJT:
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Result Data Complete! => %d"), 1);
         case PCControlSend_ReviewEndAck_CPJT:
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Review End Ack! => %d"), 1);
            break;
         }
      }
@@ -8413,7 +8584,7 @@
         case PCControlSend_Defoucs:
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Defoucs! => %d"),0);
            break;
         case PCControlSend_Diagnosis: // 0412 �ڰ����� ��ȣ �߰�
         case PCControlSend_Diagnosis: // 0412
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Diagnosis! => %d"), 0);
            break;
         }
@@ -8513,6 +8684,7 @@
   case PCControlRecv_AutoMode_CPJT:      // auto mode on
      {
         m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Mode] Auto Mode"));
         SetSimulationMode(FALSE);
         bResult = SetProcessMode(ProcessAutoMode_CPJT);
         if (bResult==FALSE) m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Mode] Auto Mode Error!"));
      }
@@ -8520,14 +8692,16 @@
   case PCControlRecv_ManualMode_CPJT:   // manual mode on
      {
         m_pSP2P->ISP2P_GetDiagnosisHistory2();
      /*< LYW 20211109 - #3662 Delete Start >*/
      //m_pSP2P->ISP2P_GetDiagnosisHistory2();
      /*< LYW 20211109 - #3662 Delete End >*/
         m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Mode] Manual Mode"));
         bResult = SetProcessMode(ProcessManualMode_CPJT);
         if (bResult==FALSE) m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Mode] Manual Mode Error!"));
         // lmk simul manual camera,motor stop
         //ReviewCamera_CameraControl(CameraControlStop);   // ���� ���߸� ī�޶� �ڵ� ��ž
         //ReviewCamera_CameraControl(CameraControlStop);
         CMotorControl*  pMotorControl = m_pSP2P->ISP2P_GetMotorControl();
         if(pMotorControl)
            pMotorControl->CommonSetAutoStop();
@@ -8698,10 +8872,10 @@
         if (SetLocalTime(&sTime))
         {
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] �ð�����ȭ���� %s"), strtime);
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] TymeSync Success %s"), strtime);
         }
         else
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] �ð�����ȭ���� %s"), strtime);
            m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] TymeSync Fail %s"), strtime);
         //memcpy(&time, strTime, 2);
@@ -8716,12 +8890,11 @@
   break;
   case PCControlRecv_Autodiagnosis:
   {
      //#3514_LYW_CF AOI Review 자가진단 기능 개선_START
      /*< LYW 20210719 : #3517 ADD Start >*/
      CSignalControl* pSignalControl = m_pSP2P->ISP2P_GetSignalControl();
      CString strDiagnosisMode;
      pSignalControl->ReadData(_T("11160"), 2, strDiagnosisMode);
      int nDiagnosisMode = atoi(strDiagnosisMode);
      //#3514_LYW_CF AOI Review 자가진단 기능 개선_END
      m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] Diagno start => %d, DiagnosisMode => %d"), bSignalOn, nDiagnosisMode);
      if (bSignalOn) {
@@ -8731,7 +8904,7 @@
         
         m_pSP2P->ISP2P_GetDiagnosisManager()->RecvSignalToSignalControl(0, nDiagnosisMode);
      }
      //#3514_LYW_CF AOI Review 자가진단 기능 개선_END
      /*< LYW 20210719 : #3517 ADD End >*/
      else
         bResult = SendSignalOffToSignalControl(PCControlSendSignalIndex_DiagnoAck, 0);
@@ -8930,7 +9103,6 @@
   CReviewResult* pWsiMultiShotResult = pGlassResult->GetWsiMultiShotResult(nModuleIndex);
   if (pWsiMultiShotResult == NULL) goto RESULT_FAIL;
   // ������ �ε����� �����´�.
   int nCurResultIdx = pWsiMultiShotResult->GetLastSReviewResultIndex() + 1; // last index + 1
   int nStartResultIdx = pWsiMultiShotResult->GetStartSReviewResultIndex();
   int nEndResultIdx = pWsiMultiShotResult->GetEndSReviewResultIndex();
@@ -8944,13 +9116,11 @@
   int      nMPosY = int(pPosition->dMotorPosY * 1000.0);
   double   dTime = (double)m_ProcessTimer.GetDurationMilliSecond();
   // �ε����� �ٸ��� ��������.
   if (measureResut.nResultIndex != nCurResultIdx)
   {
      goto RESULT_FAIL;
   }
   // ���� ������ ����.
   // measureResut
   if (pWsiMultiShotResult->GetSReviewResultCount() == 0) return;
@@ -8975,7 +9145,6 @@
   // set last result idx
   pWsiMultiShotResult->SetLastSReviewResultIndex(nCurResultIdx);
   // 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙트占쏙옙占쏙옙 占쌉곤옙, WSI 占쏙옙占쏙옙占?占쏙옙占쏙옙 占쏙옙占쏙옙占쏙옙...
   if (nCurResultIdx == nEndResultIdx && nCurResultIdx <= pWsiMultiShotResult->GetSReviewResultCount())
   {
      nStartResultIdx = nCurResultIdx + 1;
@@ -8986,8 +9155,7 @@
      pWsiMultiShotResult->SetStartSReviewResultIndex(nStartResultIdx);
      pWsiMultiShotResult->SetEndSReviewResultIndex(nEndResultIdx);
      // ������ ����Ʈ ���� ��������.
      ::Sleep(3000); // 占쏙옙占쏙옙甄占?占십쇽옙占쏙옙. 占쏙옙占쏙옙占쏙옙 占쏙옙占쏙옙 占쏙옙占쏙옙.
      ::Sleep(3000);
   //   Process_RemainWsiPoint(nModuleIndex);
   }
@@ -9053,7 +9221,7 @@
   if(pGlassResult && pReviewProcessor)
   {
      // WsiStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIReflowStart, nPlanIndex);
@@ -9089,7 +9257,7 @@
   if(pGlassResult && pReviewProcessor)
   {
      // WsiStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIStart, nPlanIndex);
@@ -9116,7 +9284,6 @@
   WSIAllReadySignal(1);
   // send wsi start
   // ���� ����
   if (!WSIMultiShotAllStartSignal())
   {
      g_pLog->DisplayMessage(_T("[WSI] WSI MultiShot Start Fail!!"));
@@ -9127,7 +9294,7 @@
   if (pGlassResult && pReviewProcessor)
   {
      // WsiStart
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ����
      pReviewProcessor->SetJobID(pGlassResult->m_strJobID);   // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
      pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
      m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIMultiShotStart, nPlanIndex);
@@ -9190,7 +9357,7 @@
      int nEndIdx = pWsiResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pWsiResult->GetSReviewResultCount()-1)) + 1;      // set End Index 
      // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
      // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
      double m_dMinOffset = -5.0; 
      double m_dMaxOffset = 5.0;
@@ -9320,7 +9487,6 @@
      CModuleStatus*               pModuleStatus   = Module_GetModuleStatus(nModuleIdx);      
      if (pModuleStatus == NULL) continue;
      //�浹�Ÿ� �ֱ�
      {
         double dCollisionPosX = pWsiUserResult->GetCollisionPositionX() / 1000.0;
         double dCollisionPosY = 0.0;
@@ -9363,7 +9529,7 @@
      int nEndIdx = pWsiUserResult->GetEndSReviewResultIndex();
      nEndIdx = min(nEndIdx, (pWsiUserResult->GetSReviewResultCount()-1)) + 1;      // set End Index 
      // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
      // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
      double m_dMinOffset = -5.0; 
      double m_dMaxOffset = 5.0;
@@ -9466,17 +9632,13 @@
         }
      
      }
      //������ ����
      pWsiMultiShotResult->GetVectorSReviewResult()->clear();
      int nResultCount = 0;
      if (m_vecSReviewResult.size()>0)
      {   
         //占쏙옙占쏙옙占쌕몌옙 占쏙옙占쏙옙 占쏙옙占?占쏙옙占쏙옙占쏙옙占쏙옙킷占?占쏙옙 占쏙옙占쏙옙殮占?占쏙옙占쏙옙
         for(int i=0; i< m_vecSReviewResult.size(); i++)
         {
            //������ ���ÿ� ���� ���� �Է��ؾߵ� �װ͸�ŭ ������!
            //������ WSI FOV 4���� ���ؿ��� ����
         {
            double dOringinX = m_vecSReviewResult[i].nUMOriginX;
            double dOringinY = m_vecSReviewResult[i].nUMOriginY;
@@ -9745,8 +9907,6 @@
      CModuleStatus*               pModuleStatus = Module_GetModuleStatus(nModuleIdx);
      if (pModuleStatus == NULL) continue;
      //�浹�Ÿ� �ֱ�
      {
         double dCollisionPosX = pWsiMultiShotResult->GetCollisionPositionX() / 1000.0;
@@ -9774,7 +9934,7 @@
         int nEndIdx = pWsiMultiShotResult->GetEndSReviewResultIndex();
         nEndIdx = min(nEndIdx, (pWsiMultiShotResult->GetSReviewResultCount() - 1)) + 1;      // set End Index 
         // [2017:3:8]-[WEZASW] : CameraOffset ���� ���� (-1~1 => -5~5)
         // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
         double m_dMinOffset = -5.0;
         double m_dMaxOffset = 5.0;
@@ -10215,7 +10375,7 @@
   CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
   if(pRsRcpReviewInfo == NULL)   return FALSE;
   if(pRsRcpReviewInfo->GetRcpUserDefectInfoCount() < 1)   return TRUE;      // �������� ī��Ʈ�� ���ٸ� �Ѿ��
   if(pRsRcpReviewInfo->GetRcpUserDefectInfoCount() < 1)   return TRUE;
   double dCenterPosX, dCenterPosY;
   
@@ -10274,18 +10434,18 @@
   _grmGlassData* pSharedGlassData = pDitSharedGlassRaw->GetGlassData();
   if(pSharedGlassData == NULL) return FALSE;
   //pSharedGlassData->m_nUserReviewNum = 0; //���� �޸� User plan
   //pSharedGlassData->m_nUserReviewNum = 0; // User plan
   _grmDefectData* pSharedDefect;
   int nPointCount = pRecipeinfo->GetRcpUserDefectInfoCount(); // User ��ǥ �� ī��Ʈ
   int nPointCount = pRecipeinfo->GetRcpUserDefectInfoCount();
   int nSharedDefectNum = pSharedGlassData->m_nDefectNum; // ���� �Ѱ��� User Idx �� ù��° Index �� �ȴ�
   int nStartIdx=nSharedDefectNum;// USER ���� ���� IDX �ο��ϱ� ���� ������
   int nSharedDefectNum = pSharedGlassData->m_nDefectNum;
   int nStartIdx=nSharedDefectNum;
   CRcpPlanInfo* pRcpPlanInfo; // ������ ����
   CRcpUserDefectInfo *pDefectInfo;// ������ defect ����
   CRcpPlanInfo* pRcpPlanInfo;
   CRcpUserDefectInfo *pDefectInfo;
   
   int nInsepectionType;// User Ÿ�� Reviewreflow = 0 wsiReflow =1; REV&WSI =2; WSIUSEr =3; USER =4;
   int nInsepectionType;// User Reviewreflow = 0 wsiReflow =1; REV&WSI =2; WSIUSEr =3; USER =4;
   int nCount = 0;
@@ -10349,7 +10509,7 @@
BOOL CSequenceProcessor_CPJT::CompareRevType(int nInsType,int nRevType)
{
   //Plan Ÿ�԰� InspectionMode ��
   //Plan InspectionMode
   if(nRevType == CPJT_PlanUser)
   {
     if(nInsType == USER) return TRUE;
@@ -10407,7 +10567,7 @@
   CString strMessage, strResultFilePath, strUploadResultFilePath, strLocalRawPath;
   CString   strUploadRawPath, strUploadImagePath, strAOIRawFileName, strAOIRawFilePath;
   //3-1. 占쏙옙占쏙옙 占쏙옙占?占쏙옙占쏙옙 占쏙옙占쏙옙
   //3-1.
   m_pSP2P->ISP2P_SetReviewResultData(pGlassResult);
   strLocalRawPath      = pNetworkInfo->m_strLocalRawPath;
@@ -10434,7 +10594,7 @@
         if(strUploadRawPath.IsEmpty() == FALSE && strAOIRawFilePath.IsEmpty() == FALSE)
         {
            // [2017:5:16]-[WEZASW] : ���� PASS���� ���� ��� ��Ȳ�� ���� AOI Server�� RAW ���� ���� ���ε� ����.
            // [2017:5:16]-[WEZASW] :
            strUploadResultFilePath.Format(_T("%s\\%s"), strUploadRawPath, strAOIRawFileName);
            if(CopyFile(strResultFilePath, strUploadResultFilePath, FALSE))
@@ -10455,9 +10615,9 @@
   }
   // delete file of Glass direction
   DeleteFile(pNetworkInfo->m_strAOIRawPath + _T("\\") + pGlassResult->m_strJobID + _T("TD"));//pGlassResult->m_strGlassID -> m_StrJobID ����
   DeleteFile(pNetworkInfo->m_strAOIRawPath + _T("\\") + pGlassResult->m_strJobID + _T("TD"));//pGlassResult->m_strGlassID -> m_StrJobID
   // [2017:4:11]-[WEZASW] :CIM(DV Data) ���� �׸� �߰�.
   // [2017:4:11]-[WEZASW] :CIM(DV Data)
   if (SendDVDataToSignalControl()==FALSE) 
   {
      m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] DV Data Send FAIL!"));         
@@ -10477,8 +10637,6 @@
BOOL CSequenceProcessor_CPJT::MoveReviewStartMotorPosition(CGlassResult* pGlassResult,int nReviewType)
{
   //혹占시놂옙 占쏙옙占싹깍옙占?占쏙옙占쌤듸옙
   //���� �÷��� ù��° ��ġ�� �̵�
   
   double dDefectPosX,dDefectPosY = 0;
   
@@ -10542,7 +10700,7 @@
void CSequenceProcessor_CPJT::SendWsiErrorAlarm_CPJT(int Index) //190801 chm
{   
   //wsi ���� �˶�
   //wsi
   if(Index==1)
   {
      g_pLog->DisplayMessage(_T("[SequenceProcessor_CPJT] WSI Alive Error!!!"));
@@ -10556,7 +10714,7 @@
void CSequenceProcessor_CPJT::SendWsiAlive_CPJT()//190801 chm
{
   //WSI Alive ��ȣ ����
   //WSI Alive
   SetWSIAliveCheck(TRUE);
}
@@ -10582,7 +10740,7 @@
         if(bWsiAliveCheck ==FALSE){
            m_pCSPC->SendWsiErrorAlarm_CPJT(1);
         }
         bWsiAliveCheck=FALSE; //30�ʿ� �ѹ��� 0���� �ʱ�ȭ
         bWsiAliveCheck=FALSE;
      }
   }