SDC C-Project CF Review 프로그램
LYW
2022-04-15 8ede40e3f7cfe1772ef7db2b1d74e905639cf343
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -21,6 +21,10 @@
#define LOCAL_AOIRAWDFS_PATH      "D:\\DIT_ResultData\\Raw"
#define LOCAL_AOIRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
//TEST
// #define NETWORK_AOIRAWDFS_PATH      "D:\\DIT_ResultData\\Raw"
// #define NETWORK_AOIRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWDFS_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw"
#define NETWORK_AOIRAWBIN_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
@@ -30,6 +34,12 @@
#define NETWORK_MURARAW_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\RAW" //0405nwh
#define NETWORK_MURA_IMAGE_PATH      "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\IMG" //0405nwh
//KYH Stack Local 경로 추가
#define NETWORK_AOISTACKLOCAL_PATH  "\\\\126.100.100.1\\d\\DIT_ResultData\\Stack"
   /* <LJC 20211122 : #3820 ADD Start> */
#define NETWORK_AOIRAWMERGELOCAL_PATH  "D:\\DIT_ResultData\\RawMerge"
   /* <LJC 20211122 : #3820 ADD End> */
char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
void _TimeDelay(int delay)
@@ -37,9 +47,9 @@
   MSG      msg;
   BOOL   fRst = FALSE;
   clock_t lBlockTime = delay + clock();
   ULONGLONG lBlockTime = delay + GetTickCount64();
   while (lBlockTime > clock())
   while (lBlockTime > GetTickCount64())
   {
      fRst = (BOOL)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
      if (fRst)
@@ -70,15 +80,51 @@
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
{
   //스택기능
    SetEnableFtpAck(FALSE);
    m_nRawMergeIdx = 0;
   if(m_StackResult.getStackUse())
   {
      CString strStackFileLocalPath;
      strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
      CFileFind File;
      if (File.FindFile(strStackFileLocalPath))
      {
         File.FindNextFile();
         strStackFileLocalPath = File.GetFilePath();
         DeleteFile(strStackFileLocalPath);
         Sleep(10);
      }
      else
      {
         AKLOG("Delete Stack File Fail [%s]", strStackFileLocalPath);
      }
      //201218 CJH - Stack Download 시도
      SendMessageFTPDownloadStack(pData->GetGlassData());
      m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
   }
   /* <LJC 20211122 : #3820 ADD Start> */
   if (pData->GetGlassData()->m_bRawMergeUse)
   {
      CString strRawFileLocalPath;
      strRawFileLocalPath.Format("%s\\%s", NETWORK_AOIRAWMERGELOCAL_PATH, pData->GetGlassData()->m_strGlassID);
      CFileFind File;
      if (File.FindFile(strRawFileLocalPath))
      {
         File.FindNextFile();
         strRawFileLocalPath = File.GetFilePath();
         DeleteFile(strRawFileLocalPath);
         Sleep(10);
      }
      SetEnableFtpAck(TRUE);
      DownLoadMergeFile(pData);
   }
   /* <LJC 20211122 : #3820 ADD End> */
   /*< KJG 20211024 - #3487 ADD End >*/
   return TRUE;
}
@@ -111,7 +157,7 @@
      return FALSE;
   
   
   if (1) ReadMuraFile(pData);
   //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
   
   if (WriteAOIFile(pData) == FALSE)
@@ -121,7 +167,60 @@
   _TimeDelay(5000); // 이미지 복사 시간 대기
   //210218 CJH - 검사 종료시 결과파일 및 CCD Image 업로드
   SendMessageFTPUploadRaw(pData->GetGlassData());
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
   /* <KYH 211129 : #3806 ADD Start> */
   char pServerPath[256] = {};
   char pServerFile[256] = {};
   CString strGlassID = pData->GetGlassData()->m_strGlassID;
   CString strGlassIDLevel6th = strGlassID.Left(6);
   CString strStepID = pData->GetGlassData()->m_strStepID;
   CString strProcessID = pData->GetGlassData()->m_strProcessID;
   CString strFileName;
   strcpy(pServerFile, "*.*");
   strFileName.Format("%s", strGlassID);
   strFileName.MakeLower();
   sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
   strStepID.MakeLower();
   strGlassID.MakeLower();
   strGlassIDLevel6th.MakeLower();
   strProcessID.MakeLower();
//   if (strGlassID.GetLength() > 6)
//      sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
//   else
      sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
   /* <KYH 211129 : #3806 ADD End> */
   BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
   if (bIsBDI)
   {
      SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
      /* <KYH 211129 : #3806 ADD Start> */
      CString strRawFilePathName = NULL;
      CString strLine = NULL;
      strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
      strRawFilePathName += RAWINFO_FILE_NAME;
      FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
      if (pf != NULL)
      {
         strLine = pServerPath + strFileName;
         fprintf(pf, "[RESULT_PATH]\n");
         fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
         SetRawFilePath(strLine.GetBuffer(0));
         fprintf(pf, "SUMPATH= \n");
         fprintf(pf, "IMGPATH= Z:\%s\n", strLine.GetBuffer(0));
         fprintf(pf, "DISK=FILESERVER\n");
         fclose(pf);
      }
   }
    /* <KYH 211129 : #3806 ADD End> */
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
   return TRUE;
@@ -207,6 +306,8 @@
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   pData->GetGlassData()->m_tmReviewLoading = m_tmReviewStart;
   return TRUE;
}
@@ -216,12 +317,13 @@
   m_bReviewEndCheck = TRUE;
   m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
   m_tmFileCreateTime = CTime::GetCurrentTime();
   pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;
   
   //여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWDFS_PATH);
   if(1) ReadMuraFile(pData);
   //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
     if(WriteAOIFile(pData) == FALSE)
        return FALSE;
@@ -357,7 +459,7 @@
   }
   
   strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
   //strFilePathName.Format("C:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
   //strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
   
   // 글라스 ID만 존재하여 재검사 시 파일 생성 실패. 삭제한다
   DeleteFile(strFilePathName);
@@ -385,7 +487,10 @@
   //////////////////////////////////////////////////////////////////////////
   //GLASSDATA
   {
      makeDataGlass(strLine, pGlass);
      /*< KJG 20211229 - #3846 MOD Start >*/
      //makeDataGlass(strLine, pGlass);
      makeDataGlass(strLine, pData, pGlass);
      /*< KJG 20211229 - #3846 MOD End >*/
      fprintf(pf, "%s\n", strLine.GetBuffer(0));
   }
   
@@ -431,21 +536,24 @@
{
   strLine.Empty();
   CString strValue;
   strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR TB TW RB RW T_STACK MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT BR_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT"; //53ea
   /*< KJG 20211229 - #3846 MOD Start >*/
   //strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT";
   strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea
   /*< KJG 20211229 - #3846 MOD End >*/
   strLine += strValue; strLine += "\n";
   strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT PRO_IMAGE AVG_GRAY_0 PORTION_0 AVG_GRAY_1 PORTION_1 AVG_GRAY_2 PORTION_2 AVG_GRAY_3 PORTION_3"; //30ea 21-05-12 Mura Data 추가
   strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //31ea /* <KYH 211129 : #3796 MOD Start> */
   strLine += strValue; strLine += "\n";
   //210405
   //ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG SCAN_AI REVIEW_AI INS_MODE INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK
   strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE DSC_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK"; //49ea
   strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea
   strLine += strValue;
}
#define SPRINTRAWSTART char strItemValue[1024];int nItemValueLen, nItemValuePos = 0;memset(strItemValue, ' ', sizeof(char)*1024)
#define SPRINTRAW(ITEMSIZE, fmt, ...) nItemValueLen = sprintf(strItemValue+nItemValuePos, fmt,##__VA_ARGS__); strItemValue[nItemValuePos+ nItemValueLen] = ' ';nItemValuePos+=ITEMSIZE+1
#define SPRINTRAWEND strItemValue[nItemValuePos - 1] = 0; strLine = strItemValue
void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
/*< KJG 20211229 - #3846 MOD Start >*/
//void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
void CGlassRawCPJT::makeDataGlass( CString& strLine, CgrmGlassRawData* pData, _grmGlassData* pGlassData )
/*< KJG 20211229 - #3846 MOD End >*/
{
   SPRINTRAWSTART;
@@ -500,7 +608,7 @@
   46   12   PAD_DATA      // PAD Data 불량 수
   47   12   M_DEFECT      // MASK 불량 수
   48   12   C_DEFECT      // COMMON 불량
   49   12   BR_DEFECT      // SCRATCH 불량 수
   49   12   BR_DEFECT      // SCRATCH 불량 수 => LN_DEFECT // 라인성 불량 수
   50   12   CRACK         // Crack 불량 수 - Image 촬상 갯수
   51   12   P_SHIFT         // Pattern Shift 불량 수 - 레시피 이름
   */
@@ -691,26 +799,39 @@
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeTR);
   // 26   6   PR      // Panel 정보 03   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgePR);
   // 27   6   TB      // Panel 정보 04
   // 27   6   NG      // Panel 정보 04
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeNG); /* <KYH 211129 : #3796 ADD Start> */
   // 28   6   TB      // Panel 정보 04
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTB);
   // 28   6   TW      // Panel 정보 05
   // 29   6   TW      // Panel 정보 05
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTW);
   // 29   6   RB      // Panel 정보 06
   // 30   6   RB      // Panel 정보 06
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRB);
   // 30   6   RW      // Panel 정보 07
   // 31   6   RW      // Panel 정보 07
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRW);
   // 31   6   T_STACK      // Panel 정보 08   SD+SP 수 입력
   // 32   6   T_STACK      // Panel 정보 08   SD+SP 수 입력
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD + pGlassData->m_nDefectNumStackSP);
   //32   6   BMDF       // Panel 정보 09 -> 변경 MAX_AVG_GRAY 04/12 nwh
   if (strlen(pGlassData->m_strMaxAvgGray) == 0)
   // 33   6   NO_DEFECT   // Panel 정보 09
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeND); /* <KYH 211129 : #3796 ADD Start> */
   //34   6   BMDF       // Panel 정보 10 -> 변경 MAX_AVG_GRAY 04/12 nwh
   /*< KJG 20211229 - #3846 MOD Start >*/
   //if (strlen(pGlassData->m_strMaxAvgGray) == 0)
   //{
   //   SPRINTRAW(12, "*");
   //}
   //else
   //{
   //   SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
   //}
   int nMaxCellNG = 0;
   for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
   {
      SPRINTRAW(12, "*");
      _grmCellData* pCell = pData->GetCellData(iCell);
      nMaxCellNG = max(nMaxCellNG, pCell->m_nDefectNumJudgeNG);
   }
   else
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
   }
   // 33   6   CJ         // Panel 정보 10 -> 변경 MAX_PORTION  04/12 nwh
   SPRINTRAW(12, "%d", nMaxCellNG);
   /*< KJG 20211229 - #3846 MOD End >*/
   // 35   6   CJ         // Panel 정보 11 -> 변경 MAX_PORTION  04/12 nwh
   if (strlen(pGlassData->m_strMaxPortion) == 0)
   {
      SPRINTRAW(12, "*");
@@ -719,15 +840,15 @@
   {
      SPRINTRAW(12, "%s", pGlassData->m_strMaxPortion);
   }
   // 34   6   OK_CELL      // OK Cell Count
   // 36   6   OK_CELL      // OK Cell Count
   SPRINTRAW(12, "*");
   // 35   6   RJ_CELL      // RJ Cell Count
   // 37   6   RJ_CELL      // RJ Cell Count
   SPRINTRAW(12, "*");
   // 36   6   RW_CELL      // RW Cell Count
   // 38   6   RW_CELL      // RW Cell Count
   SPRINTRAW(12, "*");
   // 37   6   NR_CELL      // NR Cell Count
   // 39   6   NR_CELL      // NR Cell Count
   SPRINTRAW(12, "*");
   // 38   6   MASK_CELL      // MASK Cell Count   //201215 CJH - CSTID로 변경
   // 40   6   MASK_CELL      // MASK Cell Count   //201215 CJH - CSTID로 변경
   if (strlen(pGlassData->m_strCSTID) == 0)
   {
      SPRINTRAW(12, "*");
@@ -757,8 +878,12 @@
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeMD);
   // 48   6   C_DEFECT      // COMMON 불량   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeCD);
   /*< LHS 20211029 - #3783 MOD Start >*/
   // 49   6   S_DEFECT      // SCRATCH 불량 수   
   SPRINTRAW(12, "*");
   //SPRINTRAW(12, "*");
   // 49   6   LN_DEFECT      // Line 불량 수
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeLine);
   /*< LHS 20211029 - #3783 MOD End >*/
   // 50   6   CRACK      // Crack 불량 수   //201217 CJH - Image 촬상 개수로 변경
   //SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
   SPRINTRAW(12, "%d", pGlassData->m_nReviewNum);
@@ -767,10 +892,17 @@
   {
      SPRINTRAW(16, "*");
   }
   else
   else if(strlen(pGlassData->m_strRecipeName) <= 16)
   {
      SPRINTRAW(16, "%s", pGlassData->m_strRecipeName);
   }
   else if (strlen(pGlassData->m_strRecipeName) > 16)
   {
      CString temp = pGlassData->m_strRecipeName;  // 레시피 17자리 넘어가면 DCOLL 발생으로 예외처리 [ 21-06-02 KJG ]
      temp = temp.Left(16);
      SPRINTRAW(16, "%s", temp.GetBuffer(0));
   }
   // 52   12   SHRINK      // Server or Frame Shrink 동작 여부
   if (strlen(pGlassData->m_strShrinked) == 0)
   {
@@ -784,6 +916,15 @@
   if (pGlassData->m_bRawCutoff)
   {
      SPRINTRAW(12, "USE");
   }
   else
   {
      SPRINTRAW(12, "UNUSE");
   }
   if (pGlassData->m_bEdgeCrackUse)
   {
      SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
   }
   else
   {
@@ -819,7 +960,7 @@
   19 12  PAD_DATA         // PAD Data Defect Count
   20 12  M_DEFECT         // MASK Defect Count
   21 12  C_DEFECT         // COMMON Defect Count
   22 12  S_DEFECT         // SCRATCH Defect Count
   22 12  S_DEFECT         // SCRATCH Defect Count   ==> LN_DEFECT
   23 12  CRACK            // CRACK Defect Count
   24 12  P_SHIFT         // Pattern Shift Defect Count
   */
@@ -892,90 +1033,29 @@
   // 21 6  C_DEFECT         // COMMON Defect Count
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeCD);
   // 22 6  S_DEFECT  -> 22 6  PRO_IMAGE 변경    nwh0404
   if (strlen(pCellData->m_strProImage))
   {
      SPRINTRAW(12, "%s", pCellData->m_strProImage);
   }
   else
   {
      SPRINTRAW(12,"*");
   }
   /* <KYH 211129 : #3796 MOD Start> */
   // 23 12  AVG_GRAY_0
   if (strlen(pCellData->m_strAvgGray_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 24 12 PORTION_0
   if (strlen(pCellData->m_strPortion_0))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_0);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 25 12  AVG_GRAY_1
   if (strlen(pCellData->m_strAvgGray_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 26 12 PORTION_1
   if (strlen(pCellData->m_strPortion_1))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_1);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 27 12  AVG_GRAY_2
   if (strlen(pCellData->m_strAvgGray_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 28 12 PORTION_2
   if (strlen(pCellData->m_strPortion_2))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_2);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 29 12  AVG_GRAY_3
   if (strlen(pCellData->m_strAvgGray_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strAvgGray_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 30 12 PORTION_3
   if (strlen(pCellData->m_strPortion_3))
   {
      SPRINTRAW(12, "%s", pCellData->m_strPortion_3);
   }
   else
   {
      SPRINTRAW(12, "*");
   }
   // 22 6  PRO_IMAGE  -> LN_DEFECT 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeLine);
   // 23 6  AVG_GRAY  -> TR 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeTR);
   // 24 6  PORTION  -> PR 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgePR);
   // 25 6  CORNER_GRAY  -> NG 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeNG);
   // 26 6  AVG_AMP  -> RB 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRB);
   // 27 6  FFT_VAR  -> RW 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRW);
   // 28 6  TB 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTB); //KYH TB 데이터 추가
   // 29 6  TW 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTW); //KYH TW 데이터 추가
   // 30 6  FFT_VEH  -> T_STACK 변경
   SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount + pCellData->m_nDefectSPCount);
   // 31 6  NO_DEFECT 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND 데이터 추가
   /* <KYH 211129 : #3796 MOD End> */
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
@@ -1003,7 +1083,7 @@
      // 16   2    STACK_COUNT   // Count of Defect detected step
      // 17   60   STACK_STEP      // Flow(Step) of defect detection
      // 18   16   IMAGE_FILE      // Image file Name
      // 19   12   DSC Code
      // 19   12   DSC Code      ==> LINE_CODE
      // 20   12   Image 분류 Code
      // 21   12   불량이 위치한 Zone No 입력
      // 22   12   불량 크기 (L,H,M,S)
@@ -1145,8 +1225,18 @@
   {
      SPRINTRAW(16, "*");
   }
   // 19   12    DSC_CODE      // Common 01 DSC Code
   /*< LHS 20211029 - #3783 MOD Start >*/
   // 19   12    DSC_CODE      // Common 01 DSC Code  ==> LINE_CODE
   if (strlen(pDefectData->m_strLNDefectCode))
   {
      SPRINTRAW(12, "%s", pDefectData->m_strLNDefectCode);
   }
   else
   {
   SPRINTRAW(12, "*");
   }
   //SPRINTRAW(12, "*");
   /*< LHS 20211029 - #3783 MOD End >*/
   // 20   12    VC_CODE      // Common 02 Image 분류 Code
   SPRINTRAW(12, "*");
   // 21   12    ZONE_NO      // Common 03 불량이 위치한 Zone No 입력
@@ -1160,6 +1250,7 @@
         nValue = nValue << 1;
   }
   SPRINTRAW(12, "%04X", nValue);
   // 22   12    DEFECT_SIZE   // Common 04 불량 크기 (L,H,M,S)
   if (pDefectData->m_DefectSizeType == SizeType_Small)
   {
@@ -1263,13 +1354,13 @@
      SPRINTRAW(12, "*");
   }
   // 32 NO USE -> CCD Image 유무
   if (strlen(pDefectData->m_strAoiImageName))
   if (strrchr(pDefectData->m_strAoiImageName, '*') != NULL || strlen(pDefectData->m_strAoiImageName) < 4) // KYH 210826 CCD 이미지 문자열에서 *이 있을경우 X 머지할것
   {
      SPRINTRAW(12, "O");
      SPRINTRAW(12, "X");
   }
   else
   {
      SPRINTRAW(12, "X");
      SPRINTRAW(12, "O");
   }
   // 33   12    CAM_POSITION   // Common 15 Scan 번호
   SPRINTRAW(12, "%d", pDefectData->m_nScanIdx);
@@ -1379,6 +1470,17 @@
   // 49   12    Frame Shrink 정보 추가
   SPRINTRAW(12, "%d", pDefectData->m_bShrinked);
   
   // 50   12    CLASS_NO      // Zone Classification NO
   // Zone Data
   nValue = 0;
   for (int i = 15; i >= 0; i--)
   {
      if (pDefectData->m_sZoneClassPixelCount[i] > 0)
         nValue += 1;
      if (i > 0)
         nValue = nValue << 1;
   }
   SPRINTRAW(12, "%04X", nValue);
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
@@ -1532,23 +1634,18 @@
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
{
   if(pGlassData == NULL) return;
   HWND hWnd = ::FindWindow(NULL, "FTPDownloader");
   HWND hWnd = ::FindWindow(NULL, "FTPUploader");
   if(hWnd == NULL) return;
   char strServerFolder[256] = {};
   char strServerFile[256] = {};
   char strLocalFolder[256] = {};
   char pLocalFile[256] = {};
   //GetFormatDescription(FTPCMD_DATAFILE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, pGlassData);
   {
      CString strGlassIDOrg = pGlassData->m_strGlassID;
      CString strGlassID = strGlassIDOrg.Left(12);
      sprintf(strServerFolder, "%s", pGlassData->m_strCassetteSequenceNo);
      sprintf(strServerFile, "%s.dat", strGlassID.GetBuffer(0));
      sprintf(strLocalFolder,  "D:\\DIT_ResultData\\DownloadData");
      sprintf(pLocalFile,  "%s.dat", strGlassID.GetBuffer(0));
   }
   char pLocalFile[256] = {};
   char strRTMSFile[32] = {};
   char strServerRawFileSubPath[256] = {};
   char strServer_SubFileName[256] = {};
   /*< KJG 20211024 - #3487 ADD Start >*/
   GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
   CFTPCopyDataParam upParam;
   strcpy(upParam.m_strServer_FolderName,         strServerFolder);
@@ -1561,7 +1658,7 @@
   upParam.m_nSendResultCode                     = FALSE;//m_ctrlResultAck.GetCheck();
   upParam.m_nProcessType                        = CFTPCopyDataParam::FTPProcessType_DownFile;
   // [C-PRJ] Image Upload Define - KHT (2020/11/19)
   upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Unknown;
   upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Raw;
   COPYDATASTRUCT cds;
   cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
@@ -1572,6 +1669,7 @@
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   /*< KJG 20211024 - #3487 ADD End >*/
}
void CGlassRawCPJT::SendMessageFTPUploadImage( _grmGlassData* pGlassData, emFTPCommand sort)
@@ -1703,7 +1801,7 @@
         else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s%s", LOCAL_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
         sprintf(pLocalPath, "%s%s", NETWORK_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");
      }
@@ -1861,23 +1959,41 @@
         sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0)); 
      }
      break;
      case FTPCMD_MURA_IMAGE: //0404nwh
      {   //
         /*CTime time = m_tmFileCreateTime;
         sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
            strGlassIDLevel5th.GetBuffer(0),
            strGlassIDLevel8th.GetBuffer(0),
            strGlassID.GetBuffer(0));
                     sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
         strcpy(pServerFile, "*.*");
         strcpy(pLocalFile, "*.*");*/
         if (strGlassID.GetLength() > 6)
            sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
         else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
      /*< KJG 20211024 - #3487 ADD Start >*/
   case FTPCMD_RAWMERGE:
   {
   /* <LJC 20211122 : #3820 ADD Start> */
      char cMergeList[10][12];
      CString strMergeList[10] = {};
      for (int i = 0; i < 10; i++)
   {
         strcpy(cMergeList[i], pGlassData->m_StrMergeList[i]);
         strMergeList[i] = cMergeList[i];
      }
      sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strMergeList[m_nRawMergeIdx],strGlassIDLevel6th.GetBuffer(0)); // 서버 경로 확인후 수정 kjg
      sprintf(pServerFile, "%s",strGlassID);
      /* <LJC 20211122 : #3820 ADD End> */
      sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
      sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
   }
      break;
      /*< KJG 20211024 - #3487 ADD End >*/
   case FTPCMD_MURA_IMAGE: //0404nwh
   {   //
      /*CTime time = m_tmFileCreateTime;
      sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
         strGlassIDLevel5th.GetBuffer(0),
         strGlassIDLevel8th.GetBuffer(0),
         strGlassID.GetBuffer(0));
                  sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
      strcpy(pServerFile, "*.*");
      strcpy(pLocalFile, "*.*");*/
      if (strGlassID.GetLength() > 6)
         sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
      else
         sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
         sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0)); 
         strcpy(pServerFile, "*.*");
@@ -1945,6 +2061,10 @@
            break;
         case Judge_PR:         sStr.Format("PR");
            break;
         /* <KYH 220117 : #3796 ADD Start>*/
         case Judge_ND:         sStr.Format("ND");
            break;
         /* <KYH 220117 : #3796 ADD End>*/
         case Judge_PT:         sStr.Format("PT");
            break;
         case Judge_Review:      sStr.Format("RV");
@@ -1957,6 +2077,10 @@
            break;
         case Judge_Rework:      sStr.Format("RW");
            break;
      /* < KMH 20220311 : #3954 ADD Start > */
         case Judge_LN:         sStr.Format("LN");
            break;
      /* < KMH 20220311 : #3954 ADD End > */
         case Judge_Unknown:      sStr.Format("OK");//sStr.Format("Unknown");   //Unknown도 일단 OK
            break;
         default:            sStr.Format("OK");//sStr.Format("Ets");      
@@ -1989,6 +2113,20 @@
   }
   return sStr;
}
/* <LJC 20211122 : #3820 ADD Start> */
void CGlassRawCPJT::DownLoadMergeFile(CgrmGlassRawData * pData)
{
      SendMessageFTPDownloadDataFile(pData->GetGlassData());
      m_nRawMergeIdx++;
   return;
}
void CGlassRawCPJT::SearchFIle(CgrmGlassRawData * pData)
{
   m_RawMergeResult.ProcessRawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
}
/* <LJC 20211122 : #3820 ADD End> */
CString CGlassRawCPJT::GetWsiDefectType(int nType)
{