SDC C-Project CF Review 프로그램
KEJ
2024-06-26 0c66940a8e2cf64c9890519901f433b3668216b6
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -19,14 +19,12 @@
#define LOCAL_RAWPATH_INFO_INI_PATH   "D:\\ResultData\\"
#define RAWINFO_FILE_NAME         "RESULT_INFO.ini"
#define LOCAL_AOI_DEFECT_INFO_FILE_PATH      _T("D:\\DIT_ResultData\\DefectInfo") // 결함 상세 정보 파일 생성 경로
#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"
#define LOCAL_ReviewRAWBIN_PATH      "D:\\DIT_ResultData\\RawBin"
#define NETWORK_AOIRAWFILE_SUB_PATH "\\\\126.100.100.1\\d\\Raw_im\\"
#define NETWORK_AOI_IMAGE_PATH      "\\\\126.100.100.1\\d\\Image\\Defect\\" 
@@ -39,7 +37,9 @@
   /* <LJC 20211122 : #3820 ADD Start> */
#define NETWORK_AOIRAWMERGELOCAL_PATH  "D:\\DIT_ResultData\\RawMerge"
   /* <LJC 20211122 : #3820 ADD End> */
/* <KMH 20220407 : #4053 ADD Start> */
#define  LOCAL_LOGDATA_PATH            "D:\\DIT_LogData"
/* <KMH 20220407 : #4053 ADD End> */
char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
void _TimeDelay(int delay)
@@ -60,6 +60,30 @@
      Sleep(10);
   }
}
/* < KJG 20221110 - #4373 ADD Start >*/
auto CellIDSortFunc = [](const _grmCellData* lhs, const _grmCellData* rhs) {
   // '0A' = 0, '0B' = 1, ..., '0Z' = 25, '00' = 26, ..., '09' = 35, '1A' = 36, ...
   const int nAlphaSet = 'Z' - 'A' + 1;
   const int nNumSet = '9' - '0' + 1;
   const int nAlphaNumSet = nAlphaSet + nNumSet;
   CString str = lhs->m_strCellName;
   char lhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0);
   char lhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0);
   str = rhs->m_strCellName;
   char rhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0);
   char rhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0);
   auto GetCellValueFrom2stCellID = [&](char c) -> int {
      if (c >= 'A' && c < 'Z') // 'A' 는 0부터
         return c - 'A';
      else if (c >= '0' && c <= '9') // '0' 은 26 부터
         return (c - '0') + nAlphaSet;
   };
   return (lhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(lhs_2st) < (rhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(rhs_2st);
};
/* < KJG 20221110 - #4373 ADD End >*/
CGlassRawCPJT::CGlassRawCPJT(void)
{
@@ -67,6 +91,21 @@
   CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
   CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
   CreateDirectory("D:\\Raw_im", NULL);
   CreateDirectory(LOCAL_AOI_DEFECT_INFO_FILE_PATH, NULL); /* < KJG 20240620 - #4942 ADD >*/
   /* <KMH 20220407 : #4053 ADD Start> */
   CFileFind FileFinder;
   SYSTEMTIME st;
   GetLocalTime(&st);
   char strLogFolderPath [256];
   sprintf(strLogFolderPath, "%s\\%02d%02d%02d", LOCAL_LOGDATA_PATH,st.wYear, st.wMonth, st.wDay);
   BOOL bFind = FileFinder.FindFile(strLogFolderPath);
   if (!bFind)
   {
      CreateDirectory(strLogFolderPath, NULL);
   }
   /* <KMH 20220407 : #4053 ADD End> */
   m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
   m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile);
@@ -80,6 +119,8 @@
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
{
   AKLOG("Sequence :  Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */
    SetEnableFtpAck(FALSE);
    m_nRawMergeIdx = 0;
   if(m_StackResult.getStackUse())
@@ -87,21 +128,31 @@
      
      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);
         /* <KMH 20220407 : #4053 MOD Start> */
         if (DeleteFile(strStackFileLocalPath))
            /*< SWK 20220413 - #4053 MOD Start >*/
//          {
//             AKLOG(" Fucntion : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
//          }
//          /* <KMH 20220407 : #4053 MOD End> */
//          Sleep(10);
//      }
//       else
//       {
//          AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);/* <KMH 20220407 : #4053 MOD > */
//       }
            AKLOG(" Function : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
         else
            AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);
      }
      else
      {
         AKLOG("Delete Stack File Fail [%s]", strStackFileLocalPath);
      }
            /*< SWK 20220413 - #4053 MOD End >*/
      //201218 CJH - Stack Download 시도
      SendMessageFTPDownloadStack(pData->GetGlassData());
@@ -117,45 +168,66 @@
      {
         File.FindNextFile();
         strRawFileLocalPath = File.GetFilePath();
         DeleteFile(strRawFileLocalPath);
         Sleep(10);
         /* <KMH 20220407 : #4053 MOD Start> */
         if (DeleteFile(strRawFileLocalPath))
            /*< SWK 20220413 - #4053 MOD Start >*/
//          {
//             AKLOG(" Fucntion : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
//          }
//          /* <KMH 20220407 : #4053 MOD End> */
//          Sleep(10);
//       }
//       else
//       {
//          AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); /* <KMH 20220407 : #4053 ADD > */
//       }
            AKLOG(" Function : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
         else
            AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath);
      }
            /*< SWK 20220413 - #4053 MOD End >*/
      SetEnableFtpAck(TRUE);
      DownLoadMergeFile(pData);
   }
   /* <LJC 20211122 : #3820 ADD End> */
   /*< KJG 20211024 - #3487 ADD End >*/
   AKLOG("Sequence :  Glass Loading Signal End ");
   return TRUE;
}
BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData )
{
   AKLOG(" Sequence : InspectionEnd Signal Start"); /* <KMH 20220407 : #4053 ADD > */
   m_bReviewEndCheck = FALSE;
   //210128
   m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
   pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;      // Insp End 시 Raw 업로드로, E_TIME, LD_TIME 입력 [ 21-03-18 KJG ]
   pData->GetGlassData()->m_tmInspectionEND = m_tmReviewEnd;      // 실제 Insp End 시 Raw 업로드로, E_TIME, LD_TIME 입력   //< KEJ 20240408 - #4808 ADD >
   m_tmFileCreateTime = CTime::GetCurrentTime();
   //여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   {
      _grmGlassData* pGlassData = pData->GetGlassData();
      CTime CurrTime = pGlassData->m_tmGlassLoading;
      CString strTime=_T(""), strFileName=_T("");
      strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
         CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
      strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
      strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
   }
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   //=> 서버에서 써준 그대로 생성하도록 변경
   /* < KJG 20240620 - #4942 DEL Start >*/
//    pData->GetGlassData()->m_strFileName;
//    {
//       _grmGlassData* pGlassData = pData->GetGlassData();
//       CTime CurrTime = pGlassData->m_tmGlassLoading;
//       CString strTime=_T(""), strFileName=_T("");
//       strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
//
//          CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
//       strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
//
//       strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
//    }
//   strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   /* < KJG 20240620 - #4942 DEL End >*/
   
   if(!WriteBinFile(pData))
      return FALSE;
   
   //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
@@ -195,8 +267,6 @@
//   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)
   {
@@ -220,9 +290,15 @@
         fclose(pf);
      }
   }
   else
   {
      SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);/* <KMH 20220407 : #4053 ADD > */
   }
    /* <KYH 211129 : #3806 ADD End> */
   SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
   AKLOG(" Sequence : InspectionEnd Signal End"); /* <KMH 20220407 : #4053 ADD > */
   return TRUE;
}
@@ -233,69 +309,72 @@
   //여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
   pData->GetGlassData()->m_strFileName;
   strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
   //strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
   strcpy(pData->GetGlassData()->m_strPath, LOCAL_ReviewRAWBIN_PATH);      //< KEJ 20240621 - #4942 MOD >
   
   //strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
   /* < KEJ 20240621 - #4942 MOD Start > */
//    CString strFindFile;
//    int nCloseTime = 600*100000;//sec
//    int nReTryTime = 30;
//    {
//       CTime tmReviewLoading = CTime::GetCurrentTime();
//       CString strWild;
//
//       strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
//       CakFileUtil akFileFinder;
//       while(nReTryTime--)
//       {
//          akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
//          VECFINDDATA* pFindData = akFileFinder.getFindData();
//          int nFileNamePos = strlen(akFileFinder.getProcessPath());
//          std::map<LONGLONG, CString> mapSpanFileName;
//          for(int i=0; i<pFindData->size(); i++)
//          {
//             char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
//             {
//                CakParser parser;
//                parser.process(pFileName, "_.");
//                if(parser.getTokNum() < 4) continue;
//
//                int nDataTime[8]={};
//                {
//                   int nTokIndex=0;
//                   const char* pGlassId = parser.getTokStr(nTokIndex++);
//                   const char* pStepId = parser.getTokStr(nTokIndex++);
//                   char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
//                   char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
//
//                   nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
//                   nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
//                   nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
//                   nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
//                   nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
//                   nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
//                }
//
//                CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
//                CTimeSpan tmSpan = tmReviewLoading-tmTemp;
//                mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
//             }
//          }
//
//          if(mapSpanFileName.empty() == FALSE)
//          {
//             if(mapSpanFileName.begin()->first < nCloseTime)
//             {
//                //가장 최근 결과파일 찾기 성공 [김태현 2019/7/17]
//                strFindFile = mapSpanFileName.begin()->second;
//                break;
//             }
//          }
//          akFileFinder.clear();
//          Sleep(100);
//       }
//    }
   CString strFindFile;
   int nCloseTime = 600*100000;//sec
   int nReTryTime = 30;
   {
      CTime tmReviewLoading = CTime::GetCurrentTime();
      CString strWild;
      strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
      CakFileUtil akFileFinder;
      while(nReTryTime--)
      {
         akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
         VECFINDDATA* pFindData = akFileFinder.getFindData();
         int nFileNamePos = strlen(akFileFinder.getProcessPath());
         std::map<LONGLONG, CString> mapSpanFileName;
         for(int i=0; i<pFindData->size(); i++)
         {
            char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
            {
               CakParser parser;
               parser.process(pFileName, "_.");
               if(parser.getTokNum() < 4) continue;
               int nDataTime[8]={};
               {
                  int nTokIndex=0;
                  const char* pGlassId = parser.getTokStr(nTokIndex++);
                  const char* pStepId = parser.getTokStr(nTokIndex++);
                  char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
                  char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
                  nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
                  nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
                  nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
                  nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
                  nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
                  nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
               }
               CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
               CTimeSpan tmSpan = tmReviewLoading-tmTemp;
               mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
            }
         }
         if(mapSpanFileName.empty() == FALSE)
         {
            if(mapSpanFileName.begin()->first < nCloseTime)
            {
               //가장 최근 결과파일 찾기 성공 [김태현 2019/7/17]
               strFindFile = mapSpanFileName.begin()->second;
               break;
            }
         }
         akFileFinder.clear();
         Sleep(100);
      }
   }
   strFindFile.Format("%s_%s.bin", pData->GetGlassData()->m_strGlassID, pData->GetGlassData()->m_strStepID);
   /* < KEJ 20240621 - #4942 MOD End > */
   if(strFindFile.IsEmpty()) return FALSE;
   strcpy(pData->GetGlassData()->m_strFileName, strFindFile.GetBuffer(0));
@@ -351,6 +430,7 @@
BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName)
{
   AKLOG(" Sequence : FTP Upload Signal Start ");
   // Manual Upload 기능 [21-02-05 KJG]
   CTime tmFileCreate;
   _grmGlassData GlassData;
@@ -423,7 +503,7 @@
   
   fclose(pf);
   AKLOG(" Sequence : FTP Upload Signal End ");
   return TRUE;
}
@@ -434,7 +514,10 @@
   
   bResult &= MakeAOIFile(pData);
   
   m_GlassRawAna.MakeAnaFile(pData);
   /* < KJG 20240620 - #4942 MOD Start >*/
   //m_GlassRawAna.MakeAnaFile(pData);
   m_GlassRawAna.MakeAnaFile(pData, LOCAL_AOI_DEFECT_INFO_FILE_PATH);
   /* < KJG 20240620 - #4942 MOD End > */
   //m_GlassRawRTMS.WriteAOIFile(pData);
   AKLOG("WriteAOIFile Complete");
@@ -496,20 +579,32 @@
   
   //////////////////////////////////////////////////////////////////////////
   //CELL & DEFECT DATA
   /* < KJG 20221110 - #4373 ADD Start >*/
   vector<_grmCellData*> vtSortCellData;
   for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
      vtSortCellData.push_back(pData->GetCellData(iCell));
   sort(vtSortCellData.begin(), vtSortCellData.end(), CellIDSortFunc);
   /* < KJG 20221110 - #4373 ADD End >*/
   {
      //make
      {
         for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
         {
            _grmCellData* pCell = pData->GetCellData(iCell);
            /* < KJG 20221110 - #4373 MOD Start >*/
            //_grmCellData* pCell = pData->GetCellData(iCell);
            _grmCellData* pCell = vtSortCellData[iCell];
            /* < KJG 20221110 - #4373 MOD End >*/
            makeDataCell(strLine, pData, pCell);
            fprintf(pf, "%s\n", strLine);
            for (int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++)
            {
               _grmDefectData* pDefect = pData->GetDefectData(iDefect);
               if (pDefect->m_nCellIdx != iCell) continue;
               /* < KJG 20221110 - #4373 MOD Start >*/
               //if (pDefect->m_nCellIdx != iCell) continue;
               if (pDefect->m_nCellIdx != pCell->m_nCellID) continue;
               /* < KJG 20221110 - #4373 MOD End >*/
               //210203 CJH - CutOff 대상 결과파일 작성 제외
               if (pDefect->m_bDefectCutoff == TRUE) continue;
@@ -538,10 +633,33 @@
   CString strValue;
   /*< 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";
/* < KMH 20220613 : #3957 MOD Start > */
   /* <LJC 20220425 : #3957 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_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 CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea
   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
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      CString strDefectCode = pGlassData->m_strRawDefectCode[i];
      if (strDefectCode == "") { strDefectCode = "*"; }
      strValue += " " + strDefectCode;
   }
   /* <LJC 20220425 : #3957 MOD End> */
/* < KMH 20220613 : #3957 MOD End > */
   /*< KJG 20211229 - #3846 MOD End >*/
   strValue += _T(" B_DEFECT"); /* < KJG 20240620 - #4942 ADD >*/
   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 LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //31ea /* <KYH 211129 : #3796 MOD Start> */
/* < KMH 20220614 : #3957 MOD Start > */
   /* <LJC 20220425 : #3957 MOD Start> */
   //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 CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */
   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"; //56ea
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      CString strDefectCode = pGlassData->m_strRawDefectCode[i];
      if (strDefectCode == "") { strDefectCode = "*"; }
      strValue += " " + strDefectCode;
   }
   /* <LJC 20220425 : #3957 MOD End> */
/* < KMH 20220614 : #3957 MOD End > */
   strLine += strValue; strLine += "\n";
   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;
@@ -785,13 +903,22 @@
      , pGlassData->m_tmInspectionStart.GetSecond());
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 23   14  E_TIME      // Stage에서 검사/계측 종료된 시각
   /* < KEJ 20240408 - #4808 MOD Start > */
//    strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
//       , pGlassData->m_tmReviewEnd.GetYear()
//       , pGlassData->m_tmReviewEnd.GetMonth()
//       , pGlassData->m_tmReviewEnd.GetDay()
//       , pGlassData->m_tmReviewEnd.GetHour()
//       , pGlassData->m_tmReviewEnd.GetMinute()
//       , pGlassData->m_tmReviewEnd.GetSecond());
   strValue.Format("%04d%02d%02d%02d%02d%02d"         // E_TIME
      , pGlassData->m_tmReviewEnd.GetYear()
      , pGlassData->m_tmReviewEnd.GetMonth()
      , pGlassData->m_tmReviewEnd.GetDay()
      , pGlassData->m_tmReviewEnd.GetHour()
      , pGlassData->m_tmReviewEnd.GetMinute()
      , pGlassData->m_tmReviewEnd.GetSecond());
      , pGlassData->m_tmInspectionEND.GetYear()
      , pGlassData->m_tmInspectionEND.GetMonth()
      , pGlassData->m_tmInspectionEND.GetDay()
      , pGlassData->m_tmInspectionEND.GetHour()
      , pGlassData->m_tmInspectionEND.GetMinute()
      , pGlassData->m_tmInspectionEND.GetSecond());
   /* < KEJ 20240408 - #4808 MOD End > */
   SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
   // 24   6   T_DEFECT      // Common Item 1 - Total Defect Count   
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNum - pGlassData->m_nCutOffDefectNum); //210203 CJH - Cutoff 결함은 전체개수에서 제외해준다.
@@ -930,6 +1057,22 @@
   {
      SPRINTRAW(12, "UNUSE");
   }
   /* <LJC 20220425 : #3957 ADD Start> */
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      if (pGlassData->m_nDefectCode[i] >= 0)
      {
         SPRINTRAW(12, "%d", pGlassData->m_nDefectCode[i]);
      }
      else
      {
         SPRINTRAW(12, "*");
      }
   }
   /* <LJC 20220425 : #3957 ADD End> */
   // B_DEFECT(Before T_DEFECT) 필터링 전 결함 수량
   SPRINTRAW(12, "%d", pGlassData->m_nDefectNum); /* < KJG 20240620 - #4942 ADD >*/
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
@@ -971,7 +1114,10 @@
   SPRINTRAW(8, "SUBPANEL");
   // 03 12 SUBPANELID         // Subpanel ID
   //SPRINTRAW(12, "%d", pCellData->m_nCellID);
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
   /* < KMH 20220609 : #4183 MOD Start > */
   //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]);
   SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pCellData->m_strCellName);
   /* < KMH 20220609 : #4183 MOD End > */
   
   // 글라스 원점 기준 Y좌표 반대 
   // 코너컷 기준으로 결과파일 좌표가 생성되는데 고객사에 명확한 확인 필요
@@ -1056,7 +1202,19 @@
   // 31 6  NO_DEFECT 추가
   SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND 데이터 추가
   /* <KYH 211129 : #3796 MOD End> */
   /* <LJC 20220425 : #3957 ADD Start> */
   for (int i = 0; i < RAW_CODE_MAX; i++)
   {
      if (pCellData->m_nDefectCode[i] >= 0)
      {
         SPRINTRAW(12, "%d", pCellData->m_nDefectCode[i]);
      }
      else
      {
         SPRINTRAW(12, "*");
      }
   }
   /* <LJC 20220425 : #3957 ADD End> */
   SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
@@ -1114,7 +1272,10 @@
   // 02   6    DEFECT         // DEFECT
   SPRINTRAW(6, "DEFECT");
   // 03   12   ID            // Subpanel ID
   SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
   /* < KMH 20220609 : #4183 MOD Start > */
   //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]);
   SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pDefectData->m_strCellName);
   /* < KMH 20220609 : #4183 MOD End > */
   // 04   5    DEF_NO         // Defect Number of Panel
   // RAW 파일용 Defect Index 
   //SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx);
@@ -1206,10 +1367,13 @@
   }
   // 16   2    STACK_COUNT   // Count of Defect detected step
   SPRINTRAW(2, "%2d", pDefectData->m_nStackStepCount);
   // 17   60   STACK_STEP      // Flow(Step) of defect detection
   // 17   60 -> 400   STACK_STEP      // Flow(Step) of defect detection
   if (strlen(pDefectData->m_strStackFirst))
   {
      SPRINTRAW(60, "%s", pDefectData->m_strStackFirst);
      /* < KMH 20220712 : #4230 MOD Start > */
      //SPRINTRAW(60, "%s", pDefectData->m_strStackFirst);
      SPRINTRAW(400, "%s", pDefectData->m_strStackFirst);
      /* < KMH 20220712 : #4230 MOD End > */
   }
   else
   {
@@ -1584,10 +1748,10 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 30000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      AKLOG(" FunCtion FTP :  RAW File Upload Signal Fail[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
   else
      AKLOG(" FunCtion FTP :  RAW File Upload Signal Sucess[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
}
void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData )
@@ -1626,9 +1790,19 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP :  Stack File Download Signal Fail[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP :  Stack File Download Signal Sucess[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP :  Stack File Download Signal Fail[%d]", FTPCMD_STACK);
   else
      AKLOG(" Function FTP :  Stack File Download Signal Success[%d]", FTPCMD_STACK);
      /*< SWK 20220413 - #4053 MOD End >*/
}
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
@@ -1666,9 +1840,19 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP :  RawMerge File Download Signal Sucess[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP :  RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP :  RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);
   else
      AKLOG(" Function FTP :  RawMerge File Download Signal Success[%d]", FTPCMD_RAWMERGE);
      /*< SWK 20220413 - #4053 MOD End >*/
   /*< KJG 20211024 - #3487 ADD End >*/
}
@@ -1708,9 +1892,19 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP : Image Upload Signla Sucess[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP : Image Upload Signla Fail[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP : Image Upload Signal Fail[%d]", sort);
   else
      AKLOG(" Function FTP : Image Upload Signal Success[%d]", sort);
      /*< SWK 20220413 - #4053 MOD End >*/
}
  
@@ -1764,9 +1958,20 @@
   cds.lpData = &upParam;
   DWORD dwReturn = 0;
   if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE)
   {
   }
   if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
      /*< SWK 20220413 - #4053 MOD Start >*/
//    {
//       AKLOG(" Fucntion FTP : Index File Upload Signla Sucess[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
//    }
//    else
//    {
//       AKLOG(" Fucntion FTP : Index File Upload Signla Fail[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
//    }
      AKLOG(" Function FTP : Index File Upload Signal Fail[%d]", FTPCMD_INDEX);
   else
      AKLOG(" Function FTP : Index File Upload Signal Success[%d]", FTPCMD_INDEX);
      /*< SWK 20220413 - #4053 MOD End >*/
   return TRUE;
}
@@ -1902,12 +2107,13 @@
         sprintf(pServerFile, "%s", strFileName.GetBuffer(0)); 
         sprintf(pLocalFile, "%s", strFileName.GetBuffer(0)); 
         CString strTime;
         CString strServerSubRawFilePath= NULL;
         CString strServerSubRawFileName = NULL;
         {
            strServerSubRawFilePath += NETWORK_AOIRAWFILE_SUB_PATH;
            CString strTime;
            CTime CurrTime = m_tmFileCreateTime;
            strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
               CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
@@ -1943,6 +2149,16 @@
            fprintf(pf, "SUMPATH= \n");
            fclose(pf);
         } 
         /* < KJG 20230220 - #4403 ADD Start >*/
         // BLUE 설비 D_COLL 미보고 원인 분석을 위한 Result_info.ini 파일 백업 생성
         CString strPathBackUpDir, strPathBackUpFile;
         strPathBackUpDir.Format(_T("%s%s"), LOCAL_RAWPATH_INFO_INI_PATH, _T("ResultInfoBackUpFile"));
         strPathBackUpFile.Format(_T("%s_%s.ini"), strGlassID, strTime);
         CreateDirectory(strPathBackUpDir, NULL);
         strPathBackUpFile.Format("%s\\%s", strPathBackUpDir, strPathBackUpFile);
         CopyFile(strRawFilePathName, strPathBackUpFile, FALSE);
         /* < KJG 20230220 - #4403 ADD End >*/
      }
      break;
   case FTPCMD_STACK:
@@ -2083,6 +2299,8 @@
      /* < KMH 20220311 : #3954 ADD End > */
         case Judge_Unknown:      sStr.Format("OK");//sStr.Format("Unknown");   //Unknown도 일단 OK
            break;
         case Judge_SR:         sStr.Format("SR"); /* < KJG 20221107 - #4360 ADD >*/
            break;
         default:            sStr.Format("OK");//sStr.Format("Ets");      
            break;
         }