SDC C-Project CF Review 프로그램
ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -585,110 +585,174 @@
void CReviewInterface::threadSet3rdPartyProgramVersion(void* pArg)
{
   CReviewInterface* pThis = (CReviewInterface*)pArg;
   //LYW0412
   BOOL bReturn, bRetFTPUploader = FALSE, bRetGRM = FALSE, bRetSync = FALSE;
   CFileFind finder;
   CTime timeLastWrite;
   TCHAR currentPath[MAX_PATH];
   DWORD dwPid;
   HWND hWnd;
   HANDLE hHandle;
   CString strTemp;
   /*< SWK 20221222 - #4403 MOD Start >*/
//   //LYW0412
//   BOOL bReturn, bRetFTPUploader = FALSE, bRetGRM = FALSE, bRetSync = FALSE;
//    CFileFind finder;
//    CTime timeLastWrite;
//    TCHAR currentPath[MAX_PATH];
//    DWORD dwPid;
//    HWND hWnd;
//    HANDLE hHandle;
//    CString strTemp;
//
//    while ((bRetFTPUploader&bRetGRM&bRetSync) != TRUE)
//    {
//       bReturn = FALSE;
//
//       //FTPUploader S/W Version Start
//       if (bRetFTPUploader == FALSE)
//       {
//          dwPid = 0;
//          hWnd = ::FindWindow(NULL, _T("FTPUploader"));
//          GetWindowThreadProcessId(hWnd, &dwPid);
//          hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
//          ZeroMemory(currentPath, MAX_PATH);
//          GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
//
//          bReturn = finder.FindFile(currentPath);
//       }
//
//       while (bReturn)
//       {
//          bReturn = finder.FindNextFile();
//
//          if (finder.IsDots()) continue;
//          if (finder.IsDirectory()) continue;
//
//          finder.GetLastWriteTime(timeLastWrite);
//          strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
//          pThis->m_nFDCFTPUploaderSWVersion = atoi(strTemp);
//          g_pLog->DisplayMessage(_T("FDCFTPUploaderSWVersion = %d "), pThis->m_nFDCFTPUploaderSWVersion);
//          bRetFTPUploader = TRUE;
//       }
//       //FTPUploader S/W Version End
//
//       bReturn = FALSE;
//
//       //Dit Glass Raw Messenger S/W Version Start
//       if (bRetGRM == FALSE)
//       {
//          dwPid = 0;
//          hWnd = ::FindWindow(NULL, _T("Dit Glass Raw Messenger"));
//          GetWindowThreadProcessId(hWnd, &dwPid);
//          hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
//          ZeroMemory(currentPath, MAX_PATH);
//          GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
//
//          bReturn = finder.FindFile(currentPath);
//       }
//
//       while (bReturn)
//       {
//          bReturn = finder.FindNextFile();
//
//          if (finder.IsDots()) continue;
//          if (finder.IsDirectory()) continue;
//
//          finder.GetLastWriteTime(timeLastWrite);
//          strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
//          pThis->m_nFDCGRMSWVersion = atoi(strTemp);
//          g_pLog->DisplayMessage(_T("FDCGRMSWVersion = %d "), pThis->m_nFDCGRMSWVersion);
//          bRetGRM = TRUE;
//       }
//       //Dit Glass Raw Messenger S/W Version End
//
//       bReturn = FALSE;
//
//       //Dit Shared Memory Sync Client S/W Version Start
//       if (bRetSync == FALSE)
//       {
//          dwPid = 0;
//          hWnd = ::FindWindow(NULL, _T("Dit Shared Memory Sync Client"));
//          GetWindowThreadProcessId(hWnd, &dwPid);
//          hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
//          ZeroMemory(currentPath, MAX_PATH);
//          GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
//
//          bReturn = finder.FindFile(currentPath);
//       }
//
//       while (bReturn)
//       {
//          bReturn = finder.FindNextFile();
//
//          if (finder.IsDots()) continue;
//          if (finder.IsDirectory()) continue;
//
//          finder.GetLastWriteTime(timeLastWrite);
//          strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
//          pThis->m_nFDCSyncSWVersion = atoi(strTemp);
//          g_pLog->DisplayMessage(_T("FDCSyncSWVersion = %d "), pThis->m_nFDCSyncSWVersion);
//          bRetSync = TRUE;
//       }
//       //Dit Shared Memory Sync Client S/W Version End
//    }
//
//   finder.Close();
   while ((bRetFTPUploader&bRetGRM&bRetSync) != TRUE)
   auto GetModuleFileLastTime = [](LPCTSTR strWindowTitle)->long {
      long nLastTime = 0;
      DWORD dwPid = 0;
      HWND hWnd = ::FindWindow(NULL, strWindowTitle);
      if (hWnd == INVALID_HANDLE_VALUE)
         return nLastTime;
      GetWindowThreadProcessId(hWnd, &dwPid);
      HANDLE hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
      TCHAR currentPath[MAX_PATH];
      ZeroMemory(currentPath, MAX_PATH);
      GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
      CFileFind finder;
      if (finder.FindFile(currentPath))
      {
         finder.FindNextFile();
         if (finder.IsDirectory() || finder.IsDots())
            return nLastTime;
         CTime timeLastWrite;
         finder.GetLastWriteTime(timeLastWrite);
         nLastTime = atoi(timeLastWrite.Format(_T("%Y%m%d")));
      }
      return nLastTime;
   };
   BOOL bRetFTPUploader = FALSE, bRetGRM = FALSE, bRetSync = FALSE;
   while ((bRetFTPUploader&bRetGRM&bRetSync) != TRUE)
   {
      bReturn = FALSE;
      //FTPUploader S/W Version Start
      //FTPUploader S/W Version
      if (bRetFTPUploader == FALSE)
      {
         dwPid = 0;
         hWnd = ::FindWindow(NULL, _T("FTPUploader"));
         GetWindowThreadProcessId(hWnd, &dwPid);
         hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
         ZeroMemory(currentPath, MAX_PATH);
         GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
         bReturn = finder.FindFile(currentPath);
         if (pThis->m_nFDCFTPUploaderSWVersion = GetModuleFileLastTime(_T("FTPUploader")))
         {
            g_pLog->DisplayMessage(_T("FDCFTPUploaderSWVersion = %d "), pThis->m_nFDCFTPUploaderSWVersion);
            bRetFTPUploader = TRUE;
         }
      }
      while (bReturn)
      {
         bReturn = finder.FindNextFile();
         if (finder.IsDots()) continue;
         if (finder.IsDirectory()) continue;
         finder.GetLastWriteTime(timeLastWrite);
         strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
         pThis->m_nFDCFTPUploaderSWVersion = atoi(strTemp);
         g_pLog->DisplayMessage(_T("FDCFTPUploaderSWVersion = %d "), pThis->m_nFDCFTPUploaderSWVersion);
         bRetFTPUploader = TRUE;
      }
      //FTPUploader S/W Version End
      bReturn = FALSE;
      //Dit Glass Raw Messenger S/W Version Start
      //Dit Glass Raw Messenger S/W Version
      if (bRetGRM == FALSE)
      {
         dwPid = 0;
         hWnd = ::FindWindow(NULL, _T("Dit Glass Raw Messenger"));
         GetWindowThreadProcessId(hWnd, &dwPid);
         hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
         ZeroMemory(currentPath, MAX_PATH);
         GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
         bReturn = finder.FindFile(currentPath);
         if (pThis->m_nFDCGRMSWVersion = GetModuleFileLastTime(_T("Dit Glass Raw Messenger")))
         {
            g_pLog->DisplayMessage(_T("FDCGRMSWVersion = %d "), pThis->m_nFDCGRMSWVersion);
            bRetGRM = TRUE;
         }
      }
      while (bReturn)
      {
         bReturn = finder.FindNextFile();
         if (finder.IsDots()) continue;
         if (finder.IsDirectory()) continue;
         finder.GetLastWriteTime(timeLastWrite);
         strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
         pThis->m_nFDCGRMSWVersion = atoi(strTemp);
         g_pLog->DisplayMessage(_T("FDCGRMSWVersion = %d "), pThis->m_nFDCGRMSWVersion);
         bRetGRM = TRUE;
      }
      //Dit Glass Raw Messenger S/W Version End
      bReturn = FALSE;
      //Dit Shared Memory Sync Client S/W Version Start
      if (bRetSync == FALSE)
      {
         dwPid = 0;
         hWnd = ::FindWindow(NULL, _T("Dit Shared Memory Sync Client"));
         GetWindowThreadProcessId(hWnd, &dwPid);
         hHandle = OpenProcess(MAXIMUM_ALLOWED, FALSE, dwPid);
         ZeroMemory(currentPath, MAX_PATH);
         GetModuleFileNameEx(hHandle, NULL, currentPath, MAX_PATH);
         bReturn = finder.FindFile(currentPath);
         if (pThis->m_nFDCSyncSWVersion = GetModuleFileLastTime(_T("Dit Shared Memory Sync Client")))
         {
            g_pLog->DisplayMessage(_T("FDCSyncSWVersion = %d "), pThis->m_nFDCSyncSWVersion);
            bRetSync = TRUE;
         }
      }
      while (bReturn)
      {
         bReturn = finder.FindNextFile();
         if (finder.IsDots()) continue;
         if (finder.IsDirectory()) continue;
         finder.GetLastWriteTime(timeLastWrite);
         strTemp.Format(_T("%04d%02d%02d"), timeLastWrite.GetYear(), timeLastWrite.GetMonth(), timeLastWrite.GetDay());
         pThis->m_nFDCSyncSWVersion = atoi(strTemp);
         g_pLog->DisplayMessage(_T("FDCSyncSWVersion = %d "), pThis->m_nFDCSyncSWVersion);
         bRetSync = TRUE;
      }
      //Dit Shared Memory Sync Client S/W Version End
      Sleep(1);
   }
   finder.Close();
   /*< SWK 20221222 - #4403 MOD End >*/
}
void CReviewInterface::SetReviewProgramVersion()
@@ -6626,12 +6690,11 @@
   if (IsManualProcessMode()==FALSE)   {   return;   }
   CGlassResult *pGlassResult = m_pDoc->GlassResult_GetCurrentGlassResult();
   if(pGlassResult == NULL) return;
   if (pGlassResult == NULL) return;
   const SDefectFilter *pDefectFilter = m_pDoc->Etc_GetDefectFilter();
   if(pDefectFilter == NULL) return;
   if (pDefectFilter == NULL) return;
   int nMarginX = nDefectMarginX; //5000; // um
   int nMarginY = nDefectMarginY; //5000; // um
@@ -6639,6 +6702,9 @@
   MapDefectResult *pMapReviewResult = pGlassResult->GetMapDefectResult();
   BOOL bFind = FALSE;
   //Defect
   if (pMapReviewResult)
   {
      CDefectResult* pDefectResult = NULL;
@@ -6646,28 +6712,28 @@
      {
         pDefectResult = static_cast<CDefectResult*>(it->second);
         if(pDefectResult == NULL) continue;
         if (pDefectResult == NULL) continue;
         if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult)==-1) continue;
         //if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult) == -1) continue;
         if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX &&
            pDefectResult->nUMOriginX <= nDefectPosX + nMarginX &&
            pDefectResult->nUMOriginY >= nDefectPosY - nMarginY &&
         if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX &&
            pDefectResult->nUMOriginX <= nDefectPosX + nMarginX &&
            pDefectResult->nUMOriginY >= nDefectPosY - nMarginY &&
            pDefectResult->nUMOriginY <= nDefectPosY + nMarginY)
         {
            bFind = TRUE;
            m_pView->UpdateSelectDefectList(pDefectResult->nDefectIdx);
            m_pView->UpdateSelectDefectMap(pDefectResult);
            m_pView->UpdateSelectDefectInfoMap(pDefectResult); //taek 201214 선택한 디펙의 정보를 넘긴다
            m_pView->UpdateSelectDefectInfo(pDefectResult->nDefectIdx); //taek 201214 선택한 디펙의 사진 정보를 넘긴다.
            nSelectedModuleIndex = Module_GetSelectedModuleIndex();
            // 이동할 모듈 인덱스 알아내기 (모듈별 limit 데이터 사용)
            int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
            //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
            int nGoModuleIndex = nSelectedModuleIndex;
            // 선택 모듈을 제외한 나머지 홈동작 작동
            if(nGoModuleIndex >= 0)
            if (nGoModuleIndex >= 0)
            {
               Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
            }
@@ -6677,21 +6743,145 @@
               break;
            }
            if(IsManualProcessMode() != FALSE){
            if (IsManualProcessMode() != FALSE) {
            Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera,pDefectResult );
               Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, pDefectResult);
               return;
            }
         //   Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
            //   Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
            // [2017:1:19]-[WEZASW] : WSI Manual Measurement 기능 추가
               // [2017:1:19]-[WEZASW] : WSI Manual Measurement 기능 추가
            if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
            {
               WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
               WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, (int)pDefectResult->dUMCenterOriginX, (int)pDefectResult->dUMCenterOriginY, TRUE);
            }
            break;
         }
      }
   }
   //User
   if (bFind == FALSE)
   {
      CDefectResult* pDefectResult = NULL;
      VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserResult();
      if (pVecReviewResult == NULL) return;
      for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
      {
         CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
         for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
         {
            if (its->nUMOriginX >= nDefectPosX - nMarginX &&
               its->nUMOriginX <= nDefectPosX + nMarginX &&
               its->nUMOriginY >= nDefectPosY - nMarginY &&
               its->nUMOriginY <= nDefectPosY + nMarginY)
            {
               bFind = TRUE;
               pDefectResult = &(*its);
               m_pView->UpdateSelectDefectMap(pDefectResult);
               nSelectedModuleIndex = Module_GetSelectedModuleIndex();
               // 이동할 모듈 인덱스 알아내기 (모듈별 limit 데이터 사용)
               //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
               int nGoModuleIndex = nSelectedModuleIndex;
               // 선택 모듈을 제외한 나머지 홈동작 작동
               if (nGoModuleIndex >= 0)
               {
                  Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
               }
               else
               {
                  g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
                  break;
               }
               if (IsManualProcessMode() != FALSE) {
                  Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
                  return;
               }
               //   Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
                  // [2017:1:19]-[WEZASW] : WSI Manual Measurement 기능 추가
               if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
               {
                  WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
               }
               break;
            }
         }
      }
   }
   //UserWSI
   if (bFind == FALSE)
   {
      CDefectResult* pDefectResult = NULL;
      VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserWsiResult();
      if (pVecReviewResult == NULL) return;
      for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++)
      {
         CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it));
         for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++)
         {
            if (its->nUMOriginX >= nDefectPosX - nMarginX &&
               its->nUMOriginX <= nDefectPosX + nMarginX &&
               its->nUMOriginY >= nDefectPosY - nMarginY &&
               its->nUMOriginY <= nDefectPosY + nMarginY)
            {
               bFind = TRUE;
               pDefectResult = &(*its);
               m_pView->UpdateSelectDefectMap(pDefectResult);
               nSelectedModuleIndex = Module_GetSelectedModuleIndex();
               // 이동할 모듈 인덱스 알아내기 (모듈별 limit 데이터 사용)
               //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
               int nGoModuleIndex = nSelectedModuleIndex;
               // 선택 모듈을 제외한 나머지 홈동작 작동
               if (nGoModuleIndex >= 0)
               {
                  Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE);
               }
               else
               {
                  g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home"));
                  break;
               }
               if (IsManualProcessMode() != FALSE) {
                  Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0);
                  return;
               }
               //   Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera);
                  // [2017:1:19]-[WEZASW] : WSI Manual Measurement 기능 추가
               if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE)
               {
                  WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE);
               }
               break;
            }
         }
      }
   }
}
@@ -7297,12 +7487,12 @@
   
   if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
   {
      IDNO == AfxMessageBox(_T("Limit을 초과 하여 갈수 없습니다."), MB_YESNO | MB_ICONQUESTION);
      g_pLog->DisplayMessage(_T("Limit 초과"));
      return FALSE;
   }
//    if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos)
//    {
//       IDNO == AfxMessageBox(_T("Limit을 초과 하여 갈수 없습니다."), MB_YESNO | MB_ICONQUESTION);
//       g_pLog->DisplayMessage(_T("Limit 초과"));
//       return FALSE;
//    }
   double n1stGantryXpos, n1stGantryYpos, n2ndGantryXpos, n2ndGantryYpos;
   double dDistance,dCameraDistance;
@@ -7589,44 +7779,48 @@
      dPosX += MagOffsetX * 1000;//GlassOffsetX*1000+MagOffsetX*1000;
      dPosY+= MagOffsetY * 1000;//GlassOffsetY*1000+MagOffsetY*1000;
      double xpostemp = 0;
      double ypostemp = 0;
      GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX/1000, xpostemp, ypostemp);
      xpostemp = floor(xpostemp * 1000);
      ypostemp = floor(ypostemp * 1000);
      //210127
      if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
      if (pDefectResult != NULL)
      {
         if (nModuleIndex == 0)
         double xpostemp = 0;
         double ypostemp = 0;
         GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX / 1000, xpostemp, ypostemp);
         xpostemp = floor(xpostemp * 1000);
         ypostemp = floor(ypostemp * 1000);
         //210127
         if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2)
         {
            dPosX += xpostemp;
            dPosY += ypostemp;
            if (nModuleIndex == 0)
            {
               dPosX += xpostemp;
               dPosY += ypostemp;
            }
            else
            {
               dPosX += xpostemp * -1;
               dPosY += ypostemp;
            }
         }
         else
         {
            dPosX += xpostemp * -1;
            dPosY += ypostemp;
            if (nModuleIndex == 0)
            {
               dPosX += xpostemp;
               dPosY += ypostemp * -1;
            }
            else
            {
               dPosX += xpostemp * -1;
               dPosY += ypostemp * -1;
            }
         }
      }
      else
      {
         if (nModuleIndex == 0)
         {
            dPosX += xpostemp;
            dPosY += ypostemp * -1;
         }
         else
         {
            dPosX += xpostemp * -1;
            dPosY += ypostemp * -1;
         }
      }
      g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX,MagOffsetY,dPosX/1000.0,dPosY/1000.0);
    //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
    //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
         g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX, MagOffsetY, dPosX / 1000.0, dPosY / 1000.0);
         //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY);
         //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY);
      }
   }
   return Motor_CameraGo(nModuleIndex, dPosX/1000.0, dPosY/1000.0, bAutoSelectCamera, bGoEnd);
@@ -9239,6 +9433,13 @@
      g_pLog->DisplayMessage(_T("[WSI_%d] Send Motion End to WSI SUCCESS! [%02d][%02d]"), nWsiIndex, nModuleIndex, nWsiIndex);
}
void CReviewInterface::IMC2P_SendMotorAliveErrorAlram()
{
   IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_Review_Motor_Communication_Fail, 1000);
   return;
}
void CReviewInterface::IWC2P_SetScanEnd( int nIndex, int nPointIndex, int nPositionX, int nPositionY )
{
   int nModuleIndex=-1, nWsiIndex=-1;