SDC C-Project CF Review 프로그램
KEJ
2024-06-26 0c66940a8e2cf64c9890519901f433b3668216b6
Ongoing80 #4942 CF AOI Review Bin File Loading 실패 개선
1. GlassRawMessenger 동기화
2. BIN파일 FindFile 제거(RawMessenger, Review 공통)
3. Unloading 시 BIN파일 제거
16개 파일 변경됨
718 ■■■■■ 파일 변경됨
DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h 2 ●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp 194 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawClient.cpp 24 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawClient.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawStruct.h 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DisplayMessage.cpp 2 ●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.cpp 61 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.h 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawStruct.h 16 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 331 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.cpp
@@ -16,18 +16,16 @@
{
}
BOOL CAnaResultFile::MakeAnaFile(CgrmGlassRawData* pData)
BOOL CAnaResultFile::MakeAnaFile(CgrmGlassRawData* pData, CString strPath)
{
    //return TRUE;
    /* < KJG 20220225 - #4000 MOD Start >*/
    //CString strFilePathName;
    //strFilePathName.Format("%s\\%sana", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strFileName);
    char* pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    CString strFilePathName;
    CString strFileName = pData->GetGlassData()->m_strFileName;
    strFileName.Replace(".bin", ".csv");
    strFilePathName.Format("%s\\%s", pData->GetGlassData()->m_strPath, strFileName);
    /* < KJG 20220225 - #4000 MOD End >*/
    /* < KJG 20240620 - #4942 MOD Start >*/
    //strFilePathName.Format("%s\\%s", pData->GetGlassData()->m_strPath, strFileName);
    strFilePathName.Format(_T("%s\\%s"), strPath, strFileName);
    /* < KJG 20240620 - #4942 MOD End > */
    FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
    if (pf == NULL)
DitGlassRawMessenger/DitGlassRawMessenger/AnaResultFile.h
@@ -9,7 +9,7 @@
    virtual ~CAnaResultFile(void);
public:
    BOOL MakeAnaFile(CgrmGlassRawData* pData);
    BOOL MakeAnaFile(CgrmGlassRawData* pData, CString strPath);
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -774,6 +774,8 @@
    if(m_pGlassRawMaker) delete m_pGlassRawMaker;
    
    m_pGlassRawMaker = pNewRawMaker;
    m_pGlassRawMaker->SetInterface_IGR2P(this); /* < KJG 20240620 - #4942 ADD Start >*/
    m_ConfigOption.m_nSelectRawType = nIndex;
    WriteConfigFile();
@@ -1676,4 +1678,14 @@
    return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
/* <LJC 20211122 : #3820 ADD End> */
/* <LJC 20211122 : #3820 ADD End> */
/* < KJG 20240620 - #4942 ADD Start >*/
void CDitGlassRawMessengerDlg::IGR2P_ReportBinaryResult(BOOL bSucess)
{
    if(bSucess)
        m_Server.GetGlassRawInfo()->m_ClientResultStep = APS_RES_BinarySuccess;
    else
        m_Server.GetGlassRawInfo()->m_ClientResultStep = APS_RES_BinaryFail;
}
/* < KJG 20240620 - #4942 ADD End >*/
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
@@ -27,6 +27,8 @@
// CDitGlassRawMessengerDlg 대화 상자
class CDitGlassRawMessengerDlg : public CDialog
    , public IGlassRaw2Parent     /* < KJG 20240620 - #4942 ADD >*/
{
// 생성입니다.
public:
@@ -149,4 +151,7 @@
    /* <LJC 20211122 : #3820 ADD Start> */
    afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
    /* <LJC 20211122 : #3820 ADD End> */
    public:
        void    IGR2P_ReportBinaryResult(BOOL bSucess) override; /* < KJG 20240620 - #4942 ADD >*/
};
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.cpp
@@ -4,6 +4,7 @@
#include "akLoggerExt.h"
CGlassRawBase::CGlassRawBase(void)
    : m_pParentInterface(nullptr) /* < KJG 20240620 - #4942 ADD >*/
{    /* <LJC 20211122 : #3820 ADD Start> */
    b_EnableFtpAck = FALSE;
    /* <LJC 20211122 : #3820 ADD End> */
@@ -39,9 +40,11 @@
    }
    else
    {
        m_pParentInterface->IGR2P_ReportBinaryResult(FALSE); /* < KJG 20240620 - #4942 ADD >*/
        AKLOG("WriteBinFile Fail");
        return FALSE;
    }
    m_pParentInterface->IGR2P_ReportBinaryResult(TRUE); /* < KJG 20240620 - #4942 ADD >*/
    AKLOG("WriteBinFile Finish");
    return TRUE;
}
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
@@ -44,6 +44,14 @@
enum CAMTYPE { _eCT_Reflex = 0, _eCT_Transfer };
/* < KJG 20240620 - #4942 ADD Start >*/
interface IGlassRaw2Parent
{
    virtual void IGR2P_ReportBinaryResult(BOOL bSucess) = 0;
};
/* < KJG 20240620 - #4942 ADD  End>*/
class CGlassRawBase
{
public:
@@ -79,4 +87,8 @@
    BOOL b_EnableFtpAck;
    /* <LJC 20211122 : #3820 ADD End> */
    void SetInterface_IGR2P(_In_ IGlassRaw2Parent* pInterface) { m_pParentInterface = pInterface; } /* < KJG 20240620 - #4942 ADD >*/
protected:
    IGlassRaw2Parent* m_pParentInterface; /* < KJG 20240620 - #4942 ADD >*/
};
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -19,10 +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"
#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\\" 
@@ -89,6 +91,7 @@
    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;
@@ -125,9 +128,9 @@
        
        CString strStackFileLocalPath;
        strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
        CFileFind File;
        if (File.FindFile(strStackFileLocalPath))
        {
            File.FindNextFile();
@@ -201,27 +204,30 @@
    //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 데이터 적제 제거 요청
@@ -261,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)
    {
@@ -305,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));
@@ -507,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");
@@ -636,6 +646,7 @@
    /* <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";
/* < KMH 20220614 : #3957 MOD Start > */
    /* <LJC 20220425 : #3957 MOD Start> */
@@ -892,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 결함은 전체개수에서 제외해준다.
@@ -1050,6 +1070,10 @@
        }
    }
    /* <LJC 20220425 : #3957 ADD End> */
    // B_DEFECT(Before T_DEFECT) 필터링 전 결함 수량
    SPRINTRAW(12, "%d", pGlassData->m_nDefectNum); /* < KJG 20240620 - #4942 ADD >*/
    SPRINTRAWEND;   //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
}
DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
@@ -152,6 +152,30 @@
    return TRUE;
}
/* < KJG 20240620 - #4942 ADD Start >*/
void CDitGlassRawClient::ResetClientResultStep()
{
    if (isConnect() == FALSE) return;
    if (m_pGlassRawInfo)
    {
        m_pGlassRawInfo->m_ClientResultStep = APS_RES_None;
    }
}
emClientResult CDitGlassRawClient::GetClientResultStep()
{
    if (isConnect() == FALSE) return APS_RES_None;
    if (m_pGlassRawInfo)
    {
        return m_pGlassRawInfo->m_ClientResultStep;
    }
    return APS_RES_None;
}
/* < KJG 20240620 - #4942 ADD End >*/
emAOIProcStep CDitGlassRawClient::GetProcessStep()
{
    if(isConnect() == FALSE) return APS_None;
DitGlassRawMessenger/Extern/DitGlassRawClient.h
@@ -12,6 +12,8 @@
    BOOL ConnectServer();
    BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
    emClientResult GetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
    void ResetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
    emAOIProcStep GetProcessStep();
    BOOL SetGlassLoading();
DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -27,6 +27,16 @@
        RPT_AOICustom = 1000,
    };
};
/* < KJG 20240620 - #4942 ADD Start >*/
enum emClientResult
{
    APS_RES_None = 0,
    APS_RES_BinarySuccess,
    APS_RES_BinaryFail
};
/* < KJG 20240620 - #4942 ADD End >*/
enum emAOIProcStep
{
    APS_None = 0,
@@ -638,6 +648,8 @@
    size_t m_nGlassLoadingCount;
    emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
    // m_ClientResultStep : Binary File 생성 감지하기 위한 신호로 사용
    emClientResult m_ClientResultStep;  /* < KJG 20240620 - #4942 ADD Start >*/
};
class CgrmGlassRawData
ReviewHistory/ReveiwHistory/ReveiwHistoryDlg.h
@@ -27,6 +27,7 @@
#define    REVIEW_OFFSET_CONFIGFILE_PATH _T("D:\\DIT_Review\\ReviewServerConfig\\") //210805
#define    REVIEW_OFFSET_CONFIGFILE_NAME _T("ReviewOffSet.cfg")
#define REVIEW_OFFSET_CONFIGFILE_FULL_PATHNAME _T("D:\\DIT_Review\\ReviewServerConfig\\ReviewOffSet.cfg")
#define MOTOR_OFFSET_CONFIGFILE_FULL_PATHNAME _T("D:\\DIT_Review\\ReviewServerConfig\\MotorOffSet.cfg")
/*< LYW 20220525 - #4158 ADD Start >*/
#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT    _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
/*< LYW 20220525 - #4158 ADD End >*/
ReviewSystem/ReviewSystem/DisplayMessage.cpp
@@ -34,7 +34,7 @@
{
    m_strLogPath = strPath;
    CString m_GlobalLogPath;
    m_strLogFile.Format(_T("D:\\DIT_LogData\\%04d%02d%02d"), m_strLogPath, m_TimeLogFile.GetYear(), m_TimeLogFile.GetMonth(), m_TimeLogFile.GetDay());
    m_strLogFile.Format(_T("D:\\DIT_LogData\\%04d%02d%02d"), m_TimeLogFile.GetYear(), m_TimeLogFile.GetMonth(), m_TimeLogFile.GetDay());
    CreateDirectory(m_strLogFile, NULL);
    CreateDirectory(m_strLogPath, NULL);
ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
@@ -2,20 +2,15 @@
#include "DitGlassRawClient.h"
CDitGlassRawClient::CDitGlassRawClient(void)
    : m_mxCommandProcess(FALSE, MUTEX_RAWMESSENGER)
: m_mxCommandProcess(FALSE, MUTEX_RAWMESSENGER)
{
    m_hMapBasicInfo = NULL;
    m_hMapGlassData = NULL;
    m_pDitGlassClient =NULL;
    m_pGlassRawInfo = NULL;
    m_pGlassRawData = NULL;
    m_nLastCommandIdx = -1;
    m_pGlassData = NULL;
    m_pBlockData = NULL;
    m_pCellData = NULL;
    m_pDefectData = NULL;
}
CDitGlassRawClient::~CDitGlassRawClient(void)
@@ -77,7 +72,7 @@
}
BOOL CDitGlassRawClient::ConnectGlassRawData()
{
{
    SIZE_T nGlassRawSharedSize = m_pGlassRawInfo->m_nGlassRawDataSize;
    if(m_hMapGlassData == NULL)
@@ -105,7 +100,9 @@
    m_pCellData   = (_grmCellData*)&m_pGlassRawData[m_pGlassRawInfo->m_nCellDataPoint];
    m_pDefectData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nDefectDataPoint];
    m_pStackData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nStackDataPoint];
    /*< KJG 20211024 - #3487 ADD Start >*/
    m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
    /*< KJG 20211024 - #3487 ADD End >*/
    return TRUE;
}
@@ -138,14 +135,14 @@
    int nCmdId = (m_pGlassRawInfo->m_nCommandIdxWrite+1) % COMMAND_MAXCOUNT;
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//둘이 같다는것은 서큘러 버퍼가 한바퀴 돌았다는것!! [김태현 2018/11/12]
    {
        m_pGlassRawInfo->m_nCommandIdxRead++;
        m_pGlassRawInfo->m_nCommandIdxRead++;//가장 오래된 명령 하나를 삭제한다. [김태현 2018/11/12]
    }
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nCommand = (short)nCmd;
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].strParam;
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1;
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1수행전, 0실패, 1성공 [김태현 2018/11/13]
    m_nLastCommandIdx = m_pGlassRawInfo->m_nCommandIdxWrite = nCmdId;
@@ -154,6 +151,30 @@
    return TRUE;
}
/* < KJG 20240620 - #4942 ADD Start >*/
void CDitGlassRawClient::ResetClientResultStep()
{
    if (isConnect() == FALSE) return;
    if (m_pGlassRawInfo)
    {
        m_pGlassRawInfo->m_ClientResultStep = APS_RES_None;
    }
}
emClientResult CDitGlassRawClient::GetClientResultStep()
{
    if (isConnect() == FALSE) return APS_RES_None;
    if (m_pGlassRawInfo)
    {
        return m_pGlassRawInfo->m_ClientResultStep;
    }
    return APS_RES_None;
}
/* < KJG 20240620 - #4942 ADD End >*/
emAOIProcStep CDitGlassRawClient::GetProcessStep()
{
@@ -172,7 +193,9 @@
    if(isConnect() == FALSE) return FALSE;
    m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
    m_pGlassData->m_bStackRead = FALSE;
    /*< KJG 20211024 - #3487 ADD Start >*/
    m_pGlassData->m_bRawMergeRead = FALSE;
    /*< KJG 20211024 - #3487 ADD End >*/
    return SetCommand(grcSequenceGlassLoading);
}
@@ -192,7 +215,7 @@
BOOL CDitGlassRawClient::SetReviewEnd()
{
    if(isConnect() == FALSE) return FALSE;
    if(isConnect() == FALSE) return FALSE;
    m_pGlassRawInfo->m_ClientProcStep = APS_ReviewEnd;
    return SetCommand(grcSequenceReviewEnd);
}
@@ -204,20 +227,10 @@
    return SetCommand(grcSequenceCustomReviewDataRead);
}
CDitGlassRawClient* CDitGlassRawClient::GetInstance()
{
    if(m_pDitGlassClient == NULL)
    {
        m_pDitGlassClient = new CDitGlassRawClient;
    }
    return m_pDitGlassClient;
}
void CDitGlassRawClient::RemoveReviewDefects()
{
    int nDefectNum = m_pGlassData->m_nDefectNum;
    int nRightDefectNum = 0;
    int nRightDefectNum = 0;//기준점 오른쪽에 위치한 결함 갯수
    int nDefectDeleteNum = 0;
    for(int i=nDefectNum-1; i>=0; i--)
    {
@@ -238,5 +251,3 @@
    m_pGlassData->m_nDefectNum = nDefectNum-nDefectDeleteNum;
}
CDitGlassRawClient* CDitGlassRawClient::m_pDitGlassClient;
ReviewSystem/ReviewSystem/DitGlassRawClient.h
@@ -1,20 +1,19 @@
#pragma once
#include "DitGlassRawStruct.h"
#include <afxmt.h>
class CDitGlassRawClient
{
public:
    CDitGlassRawClient(void);
    ~CDitGlassRawClient(void);
public:
    static CDitGlassRawClient* GetInstance(); //cmark
public:
    BOOL ConnectServer();
    BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
    emClientResult GetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
    void ResetClientResultStep(); /* < KJG 20240620 - #4942 ADD >*/
    emAOIProcStep GetProcessStep();
    BOOL SetGlassLoading();
@@ -25,22 +24,25 @@
    BOOL SetReviewComtomize();
    void RemoveReviewDefects();//AOI���� ������ ���� ������ �����ϰ�, ���信�� ������ User Ȥ�� Reflow ������ �����Ѵ�.
    void RemoveReviewDefects();//AOI에서 생성한 디펙 정보를 제외하고, 리뷰에서 생성한 User 혹은 Reflow 결함을 제외한다.
    _grmDitMemInfo*    GetGlassMeminfo(){return (_grmDitMemInfo*)m_pGlassRawInfo;};
    _grmGlassData*    GetGlassData(){return m_pGlassData;};
    _grmBlockData*    GetBlockData(){return m_pBlockData;};
    _grmBlockData*        GetBlockData(){return m_pBlockData;};
    _grmCellData*    GetCellData(int nIndex){return &m_pCellData[nIndex];};
    _grmDefectData*    GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
    _grmDefectData*    GetStackData(int nIndex) { return &m_pStackData[nIndex];};
    /*< KJG 20211024 - #3487 ADD Start >*/
    _grmDefectData*    GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
    /*< KJG 20211024 - #3487 ADD End >*/
    //��� ���� ���� ���� ��� [������ 2018/11/12]
    //결과 파일 강제 쓰기 명령 [김태현 2018/11/12]
    BOOL WriteAOIRawFile();
    //������� ���� ���̳ʸ� ���·� ���� [������ 2018/11/12]
    //결과파일 강제 바이너리 형태로 쓰기 [김태현 2018/11/12]
    BOOL WriteAOIRawBinFile(); 
    //������� ���� ���̳ʸ� �б�
    //결과파일 강제 바이너리 읽기
    BOOL ReadAOIRawBinFile();
    BOOL WriteReviewRawBinFile();
@@ -49,15 +51,16 @@
    BOOL ConnectGlassRawInfo();
    BOOL ConnectGlassRawData();
    BOOL SetCommand(emGlassRawCommand nCmd);
    static CDitGlassRawClient* m_pDitGlassClient; //cmark
protected:
    _grmGlassData*  m_pGlassData;
    _grmBlockData*    m_pBlockData;
    _grmBlockData*        m_pBlockData;
    _grmCellData*   m_pCellData;
    _grmDefectData* m_pDefectData;
    _grmDefectData* m_pStackData;
    /*< KJG 20211024 - #3487 ADD Start >*/
    _grmDefectData* m_pRawMergeData;
    /*< KJG 20211024 - #3487 ADD End >*/
protected:
    HANDLE        m_hMapBasicInfo;
    HANDLE        m_hMapGlassData;
ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -27,6 +27,16 @@
        RPT_AOICustom = 1000,
    };
};
/* < KJG 20240620 - #4942 ADD Start >*/
enum emClientResult
{
    APS_RES_None = 0,
    APS_RES_BinarySuccess,
    APS_RES_BinaryFail
};
/* < KJG 20240620 - #4942 ADD End >*/
enum emAOIProcStep
{
    APS_None = 0,
@@ -129,7 +139,7 @@
    int            m_nDefectNumJudgeRV;
    int            m_nDefectNumJudgeTR;
    int            m_nDefectNumJudgePR;
    int            m_nDefectNumJudgePT;        //< KEJ 20231123 - #4669 ADD >
    int            m_nDefectNumJudgePT; /* < KJG 20231124 - #4627 ADD >*/
    /*< LHS 20211029 - #3783 MOD Start >*/
    int            m_nDefectNumJudgeLine;
    /*< LHS 20211029 - #3783 MOD End >*/
@@ -339,7 +349,7 @@
    int            m_nDefectNumJudgeRV;
    int            m_nDefectNumJudgeTR;
    int            m_nDefectNumJudgePR;
    int            m_nDefectNumJudgePT;        //< KEJ 20231123 - #4669 ADD >
    int            m_nDefectNumJudgePT; /* < KJG 20231124 - #4627 ADD >*/
    /*< LHS 20211029 - #3783 MOD Start >*/
    int            m_nDefectNumJudgeLine;
    /*< LHS 20211029 - #3783 MOD End >*/
@@ -638,6 +648,8 @@
    size_t m_nGlassLoadingCount;
    emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령
    // m_ClientResultStep : Binary File 생성 감지하기 위한 신호로 사용
    emClientResult m_ClientResultStep;  /* < KJG 20240620 - #4942 ADD Start >*/
};
class CgrmGlassRawData
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -53,6 +53,7 @@
#define AOIRAWBIN_PATH        "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
#define AOIRAWBIN_TEST_PATH        "d:\\DIT_ResultData\\RawBin"
#define AOIRAWBIN_LOCAL_PATH            "D:\\DIT_ResultData\\RawBin"
#define AOIRAWBIN_NETWORK_DRIVE_PATH    "Y:\\RawBin"
enum CPJT_MeasureMode { CPJT_ModeAuto = 0, CPJT_ModeManual };
@@ -1899,6 +1900,24 @@
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
    /* < KEJ 20240621 - #4942 ADD Start > */
    STransferData* pTransferData = m_pSP2P->ISP2P_GetCurrentTransferData();
    CString strGlassStepIdTemp = pTransferData->strStepID;
    CString strGlassIDTemp = pTransferData->strGlassID;
    CString strFileName;
    strFileName.Format(_T("%s\\%s_%s.bin"), AOIRAWBIN_LOCAL_PATH, strGlassIDTemp, strGlassStepIdTemp);
    CFile file;
    if (file.Open(strFileName, CFile::modeRead))
    {
        file.Close();
        DeleteFile(strFileName);
        g_pLog->DisplayMessage(_T("[SequenceProcessor] Delete RAW BIN File [%s]"), strFileName);
    }
    file.Close();
    /* < KEJ 20240621 - #4942 ADD  End > */
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Ready"));
    m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStart(); /* < KJG 20230630 - #4517 ADD Start >*/
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Complete"));
@@ -3083,159 +3102,175 @@
BOOL CSequenceProcessor_CPJT::FindRawBinFile(CString strFileName)
{
    /* < KJG 20230605 - #4517 ADD Start >*/
    auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec)
    {
        stringstream ss(Sentence);
        string tmp;
    /* < KEJ 20240621 - #4942 MOD Start > */
//     /* < KJG 20230605 - #4517 ADD Start >*/
//     auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec)
//     {
//         stringstream ss(Sentence);
//         string tmp;
//
//         while (getline(ss, tmp, Separator)) {
//             vec.push_back(tmp);
//         }
//     };
//     /* < KJG 20230605 - #4517 ADD End >*/
//
//     //210128
//     CString strFilePath = _T("");
//     //pData->GetGlassData()->m_strFileName;
//     //strcpy(pData->GetGlassData()->m_strPath, AOIRAWBIN_PATH);
//     //strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
//
//     strFilePath = AOIRAWBIN_PATH;
//
//     CString strFindFile;
//     int nCloseTime = 600 * 100000;//sec
//     int nReTryTime = 30;
//     {
//         CTime tmReviewLoading = CTime::GetCurrentTime();
//         CString strWild;
//         //strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
//         CakFileUtil akFileFinder;
//         while (nReTryTime--)
//         {
//             //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
//             if (nReTryTime%2 == 0)
//             {
//                 strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
//             }
//             else strFilePath = AOIRAWBIN_PATH;
//
//             //strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/
//             //akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/
//
//             /* < KJG 20230605 - #4517 ADD Start >*/
//             auto timeStart = chrono::steady_clock::now();
//             g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime);
//
//             std::error_code err;
//             vector<std::string> vtFileList;
//             fs::path pathBinFile(strFilePath.GetBuffer(0));
//             int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' 포맷 확인
//             for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++)
//             {
//                 fs::path p = iter->path();
//                 if (p.filename().stem().string().find(strFileName) != string::npos)
//                 {
//                     std::string strSearchFile = p.filename().stem().string();
//                     if (p.extension().string() == _T(".bin"))
//                     {
//                         vtFileList.push_back(p.filename().stem().string());
//                     }
//                 }
//             }
//
//             for (auto iter = vtFileList.begin(); iter != vtFileList.end(); )
//             {
//                 vector<string> vtSplit;
//                 FuncStringSplit(*iter, _T('_'), vtSplit);
//
//                 if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize)
//                 {
//                     iter++;
//                 }
//                 else
//                 {
//                     vtFileList.erase(iter);
//                 }
//             }
//
//             sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 최신순으로 정렬
//
//             string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front();
//             g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str());
//
//             if (vtFileList.empty() == FALSE)
//             {
//                 vector<string> vtSplit;
//                 FuncStringSplit(strPickFileName, _T('_'), vtSplit);
//
//                 CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2)));
//                 CTimeSpan tmSpan = tmReviewLoading - tmTemp;
//
//                 if (tmSpan < nCloseTime)
//                 {
//                     strFindFile = strPickFileName.c_str();
//                     g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success"));
//                     break;
//                 }
//             }
//             /* < KJG 20230605 - #4517 ADD End >*/
//
//             /* < KJG 20230605 - #4517 DEL Start >*/
//             //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
//             //VECFINDDATA* pFindData = akFileFinder.getFindData();
//             //int nFileNamePos = strlen(akFileFinder.getProcessPath());
//             //std::map<LONGLONG, CString> mapSpanFileName;
//             //for (int i = 0; i < pFindData->size(); i++)
//             //{
//             //    char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
//             //    {
//             //        CakParser parser;
//             //        parser.process(pFileName, "_.");
//             //        if (parser.getTokNum() < 4) continue;
//             //
//             //        if (parser.getTokNum() >= 6) continue; // 0401
//             //
//             //        int nDataTime[8] = {};
//             //        {
//             //            int nTokIndex = 0;
//             //            const char* pGlassId = parser.getTokStr(nTokIndex++);
//             //            const char* pStepId = parser.getTokStr(nTokIndex++);
//             //            char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
//             //            char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
//             //
//             //            nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
//             //            nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
//             //            nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
//             //            nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
//             //            nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
//             //            nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
//             //        }
//             //
//             //        CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
//             //        CTimeSpan tmSpan = tmReviewLoading - tmTemp;
//             //        mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
//             //    }
//             //}
//             //
//             //if (mapSpanFileName.empty() == FALSE)
//             //{
//             //    if (mapSpanFileName.begin()->first < nCloseTime)
//             //    {
//             //        strFindFile = mapSpanFileName.begin()->second;
//             //        break;
//             //    }
//             //}
//             //
//             //akFileFinder.clear();
//             /* < KJG 20230605 - #4517 DEL End >*/
//
//
//             Sleep(100);
//         }
//     }
//    if (strFindFile.IsEmpty()) return FALSE;
        while (getline(ss, tmp, Separator)) {
            vec.push_back(tmp);
        }
    };
    /* < KJG 20230605 - #4517 ADD End >*/
    //210128
    CString strFilePath = _T("");
    //pData->GetGlassData()->m_strFileName;
    //strcpy(pData->GetGlassData()->m_strPath, AOIRAWBIN_PATH);
    //strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
    strFilePath = AOIRAWBIN_PATH;
     CString strFilePath = _T("");
     strFilePath = AOIRAWBIN_LOCAL_PATH;
    CString strFindFile;
    int nCloseTime = 600 * 100000;//sec
    int nReTryTime = 30;
    strFindFile.Format(_T("%s\\%s.bin"), strFilePath, strFileName);
    CFile file;
    if (!file.Open(strFindFile, CFile::modeRead))
    {
        CTime tmReviewLoading = CTime::GetCurrentTime();
        CString strWild;
        //strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
        CakFileUtil akFileFinder;
        while (nReTryTime--)
        {
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
            if (nReTryTime%2 == 0)
            {
                strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH;
            }
            else strFilePath = AOIRAWBIN_PATH;
            //strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/
            //akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/
            /* < KJG 20230605 - #4517 ADD Start >*/
            auto timeStart = chrono::steady_clock::now();
            g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime);
            std::error_code err;
            vector<std::string> vtFileList;
            fs::path pathBinFile(strFilePath.GetBuffer(0));
            int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' 포맷 확인
            for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++)
            {
                fs::path p = iter->path();
                if (p.filename().stem().string().find(strFileName) != string::npos)
                {
                    std::string strSearchFile = p.filename().stem().string();
                    if (p.extension().string() == _T(".bin"))
                    {
                        vtFileList.push_back(p.filename().stem().string());
                    }
                }
            }
            for (auto iter = vtFileList.begin(); iter != vtFileList.end(); )
            {
                vector<string> vtSplit;
                FuncStringSplit(*iter, _T('_'), vtSplit);
                if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize)
                {
                    iter++;
                }
                else
                {
                    vtFileList.erase(iter);
                }
            }
            sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 최신순으로 정렬
            string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front();
            g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str());
            if (vtFileList.empty() == FALSE)
            {
                vector<string> vtSplit;
                FuncStringSplit(strPickFileName, _T('_'), vtSplit);
                CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2)));
                CTimeSpan tmSpan = tmReviewLoading - tmTemp;
                if (tmSpan < nCloseTime)
                {
                    strFindFile = strPickFileName.c_str();
                    g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success"));
                    break;
                }
            }
            /* < KJG 20230605 - #4517 ADD End >*/
            /* < KJG 20230605 - #4517 DEL Start >*/
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
            //VECFINDDATA* pFindData = akFileFinder.getFindData();
            //int nFileNamePos = strlen(akFileFinder.getProcessPath());
            //std::map<LONGLONG, CString> mapSpanFileName;
            //for (int i = 0; i < pFindData->size(); i++)
            //{
            //    char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
            //    {
            //        CakParser parser;
            //        parser.process(pFileName, "_.");
            //        if (parser.getTokNum() < 4) continue;
            //
            //        if (parser.getTokNum() >= 6) continue; // 0401
            //
            //        int nDataTime[8] = {};
            //        {
            //            int nTokIndex = 0;
            //            const char* pGlassId = parser.getTokStr(nTokIndex++);
            //            const char* pStepId = parser.getTokStr(nTokIndex++);
            //            char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
            //            char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
            //
            //            nDataTime[0] = (pDate[0] - '0') * 1000 + (pDate[1] - '0') * 100 + (pDate[2] - '0') * 10 + (pDate[3] - '0') * 1;
            //            nDataTime[1] = (pDate[4] - '0') * 10 + (pDate[5] - '0') * 1;
            //            nDataTime[2] = (pDate[6] - '0') * 10 + (pDate[7] - '0') * 1;
            //            nDataTime[3] = (pTime[0] - '0') * 10 + (pTime[1] - '0') * 1;
            //            nDataTime[4] = (pTime[2] - '0') * 10 + (pTime[3] - '0') * 1;
            //            nDataTime[5] = (pTime[4] - '0') * 10 + (pTime[5] - '0') * 1;
            //        }
            //
            //        CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5]);
            //        CTimeSpan tmSpan = tmReviewLoading - tmTemp;
            //        mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
            //    }
            //}
            //
            //if (mapSpanFileName.empty() == FALSE)
            //{
            //    if (mapSpanFileName.begin()->first < nCloseTime)
            //    {
            //        strFindFile = mapSpanFileName.begin()->second;
            //        break;
            //    }
            //}
            //
            //akFileFinder.clear();
            /* < KJG 20230605 - #4517 DEL End >*/
            Sleep(100);
        }
        g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Bin File Is Not Collect [%s]"), strFindFile);
        return FALSE;
    }
    file.Close();
    if (strFindFile.IsEmpty()) return FALSE;
    /* < KEJ 20240621 - #4942 MOD  End > */
    return TRUE;
}