SDC C-Project CF Review 프로그램
LYW
2022-07-26 73f77c34a0d680de9e562a7e572764ffc746fbac
Ongoing90 #4220 CF AOI Review 알람 추가

1. 모터와 15초이상 통신 불가시 알람 발생
2. 현재사용중인 Signal File이 업로드 실패하는 경우도 더러 발생하여 Raw, MicroImage, ReviewImage, Signal 파일 중 2개이상이 실패시 알람 발생
3. 물류데이터내 생산코드가 RW가 아닌글래스 중 리뷰스케쥴링 후 1개이상 좌표를 찍어야 하지만 0개 찍은경우 설정한 n번째 글래스에서 발생
14개 파일 변경됨
412 ■■■■■ 파일 변경됨
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp 25 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawStruct.h 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/FTPThreadPool.cpp 221 ●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/FTPThreadPool.h 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/FTPUploader.rc 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/FTPUploaderDlg.cpp 49 ●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/FTPUploaderDlg.h 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
FTPUploader/FTPUploader/resource.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/bin/ReviewHistroy.exe 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHMotorControls/MotorControl.cpp 42 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawStruct.h 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 12 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -373,7 +373,14 @@
    //if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
    if (1)
      if(WriteAOIFile(pData) == FALSE)
          return FALSE;
    //210126 CJH - Review End에서만 RTMS 결과파일 생성하도록 변경
    if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE)
        return FALSE;
    if(1)
    {
        _grmGlassData* pGlassData = pData->GetGlassData();
@@ -383,15 +390,6 @@
        SendMessageFTPUploadImage(pGlassData, FTPCMD_MURA_IMAGE);//0405nwh
    }
      if(WriteAOIFile(pData) == FALSE)
          return FALSE;
    //210126 CJH - Review End에서만 RTMS 결과파일 생성하도록 변경
    if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE)
        return FALSE;
    
    
@@ -1309,10 +1307,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
    {
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
@@ -182,8 +182,12 @@
                StackDefect.m_StackInfo = Stack_Unknown;
            pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackStepCount);
            pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst
            strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60);
        /* < KMH 20220712 : #4230 MOD Start > */
            //pReadPoint = getParsingData(pReadPoint, 60, &strtemp); // Stack Step m_strStackFirst
            //strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 60);
            pReadPoint = getParsingData(pReadPoint, 400, &strtemp); // Stack Step m_strStackFirst
            strncpy(StackDefect.m_strStackFirst, strtemp.GetBuffer(0), 400);
        /* < KMH 20220712 : #4230 MOD End > */
            pReadPoint = getParsingData(pReadPoint, 16, &strtemp); // ReviewImageName m_strRevImageName
            pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
            pReadPoint = getParsingData(pReadPoint, 12, &temp); // 미사용
DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -423,7 +423,11 @@
    int                m_nPixelConv;                // pixel 단위 좌표
    int                m_nPixelScan;                // pixel 단위 좌표
    short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD Start > */
    // 범위 벗어나서 음수로 표기되면 D_Col Fail
    //short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    int                    m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD End > */
    short/*SERVER_DefectType*/        m_DefectType;                // 결함 타입    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // 결함의 판정상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // 결함 타입 - Bright, Dark, Both
@@ -503,7 +507,10 @@
    short            m_nStackStepCount;            // Stack 수
    short            m_nStackColorIdx;            // Color를 선택하는 인덱스.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
/* < KMH 20220712 : #4230 MOD Start > */
    //    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
    char            m_strStackFirst[400];            // Stack Step. // 400 bytes 확장요청 : SDC 채승석P
/* < KMH 20220712 : #4230 MOD End > */
    char            m_strUnitID[16];                // 유닛아이디
    int                m_ClassificationType;                // enum ClassificationType            { ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
FTPUploader/FTPUploader/FTPThreadPool.cpp
@@ -28,7 +28,7 @@
    m_nConnectionTimeout2    = 5000;
    m_strDefaultFolderPath2    = _T("/Test/");
    //201218 CJH - Download용 IP 추가
    //201218 CJH - Download�� IP �߰�
    m_strIP3                = _T("127.0.0.1");
    m_strID3                = _T("ID_Invalid");
    m_strPassword3            = _T("PW_Invalid");
@@ -216,7 +216,7 @@
        DisplayLogMessage(strMessage);
    }
    // ACK를 해야하나?
    // ACK�� �ؾ��ϳ�?
    Process_UploadAck(nUploadResult, uploadParam);
    
    return TRUE;
@@ -256,7 +256,7 @@
        DisplayLogMessage(strMessage);
    }        
    // ACK를 해야하나?
    // ACK�� �ؾ��ϳ�?
    Process_DownloadAck(TRUE, downloadParam);
    return TRUE;
@@ -268,7 +268,7 @@
    m_nConnectionTimeout = nTimeout;
}
void CFTPThreadPool::SetConnectionInfo( CString strIP, CString strUserID, CString strPassword, int nPort, int nTimeout, CString strHomePath, CString strIP2, CString strUserID2, CString strPassword2, int nPort2, int nTimeout2, CString strHomePath2, CString strIP3, CString strUserID3, CString strPassword3, int nPort3, int nTimeout3, CString strHomePath3, BOOL bPassive ,BOOL bWSIChk)
void CFTPThreadPool::SetConnectionInfo( CString strIP, CString strUserID, CString strPassword, int nPort, int nTimeout, CString strHomePath, CString strIP2, CString strUserID2, CString strPassword2, int nPort2, int nTimeout2, CString strHomePath2, CString strIP3, CString strUserID3, CString strPassword3, int nPort3, int nTimeout3, CString strHomePath3, BOOL bPassive ,BOOL bWSIChk, BOOL bBDIStackDown)
{
    m_strIP                    = strIP;
    m_strID                    = strUserID;
@@ -286,7 +286,7 @@
    m_nConnectionTimeout2    = nTimeout2;
    m_strDefaultFolderPath2    = strHomePath2;
    //201218 CJH - Download용 IP 추가
    //201218 CJH - Download�� IP �߰�
    m_strIP3                = strIP3;
    m_strID3                = strUserID3;
    m_strPassword3            = strPassword3;
@@ -295,6 +295,7 @@
    m_strDefaultFolderPath3    = strHomePath3;
    m_bWSIChk                = bWSIChk;
    m_bBDIStackDown            = bBDIStackDown;
    if(m_strDefaultFolderPath.Right(1) != _T("\\"))
    {
@@ -311,11 +312,11 @@
{
    Sleep(10);
    // Main 서버 접속
    // Main ���� ����
    if(m_bConnect = Connect())
    {
        //NotifyMessageToParent(eFTPConnection,m_strIP,m_strDefaultFolderPath);
        // 기본 폴더 이동
        // �⺻ ���� �̵�
        if(m_bSharedFolder == FALSE && ChangeDirectory(m_strDefaultFolderPath) == FALSE)
        {
            CString strError = _T("CFTPThread::OnStartUploadProcess ChangeDirectory Process Error");
@@ -353,7 +354,7 @@
    }
    m_pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,m_nConnectionTimeout);    
    m_pSession->SetOption(INTERNET_OPTION_SEND_TIMEOUT,m_nConnectionTimeout);        // GetLastError 시에 ERROR_INTERNET_TIMEOUT 에러를 리턴한다.
    m_pSession->SetOption(INTERNET_OPTION_SEND_TIMEOUT,m_nConnectionTimeout);        // GetLastError �ÿ� ERROR_INTERNET_TIMEOUT ������ �����Ѵ�.
    
    try
    {
@@ -451,7 +452,7 @@
        return bReturn;
    }
    // 마지막 폴더로 이동이 실패 한다면 For문 돌면서 폴더를 생성한다.
    // ������ ������ �̵��� ���� �Ѵٸ� For�� ���鼭 ������ �����Ѵ�.
    CString strFinalPath = strPath;
    int nStartIdx = 1;
    while(TRUE)
@@ -487,11 +488,11 @@
    CString strMessage = _T("");
    BOOL bUploadResult = FALSE;
    // 최종 서버 경로 만들기
    // ���� ���� ��� �����
    CString strServer_FinalPath = m_strDefaultFolderPath + Param.m_strServer_SignalFolderName;
    strServer_FinalPath += _T("/");
    // 서버 경로 변경 없으면 만들어서 변경
    // ���� ��� ���� ������ ���� ����
    if(m_bSharedFolder)
    {
        CString strCreatePath;
@@ -503,21 +504,21 @@
        ChangeDirectory(strServer_FinalPath, TRUE);
    }
    // 로컬 시그널 파일 경로
    // ���� �ñ׳� ���� ���
    CString strLocalSignalPath = LOCAL_SIGNAL_FILE_PATH;
    strLocalSignalPath += _T("\\");
    strLocalSignalPath += Param.m_strServer_SignalFileName;
    // 로컬에 시그널 파일 만들기
    // ���ÿ� �ñ׳� ���� �����
    CFile SignalFile;
    if (SignalFile.Open((LPCTSTR)strLocalSignalPath, CFile::modeCreate))
    {
        SignalFile.Close();
        // 리모트 시크널 파일 경로
        // ����Ʈ ��ũ�� ���� ���
        strServer_FinalPath = strServer_FinalPath + Param.m_strServer_SignalFileName;
        // 시그널 파일 업로드
        // �ñ׳� ���� ���ε�
        if(m_bSharedFolder)
        {
            bUploadResult =  CopyFile(strLocalSignalPath, strServer_FinalPath, FALSE);
@@ -527,10 +528,10 @@
            bUploadResult = m_pConnection->PutFile(strLocalSignalPath, strServer_FinalPath);
        }
        // 로컬 시그널 파일 삭제
        // ���� �ñ׳� ���� ����
        DeleteFile(strLocalSignalPath);
        // 결과 로그 출력
        // ��� �α� ���
        DisplayResultMessage(bUploadResult, strServer_FinalPath, strLocalSignalPath);
    }
@@ -548,9 +549,9 @@
    CString strMessage = _T("");
    BOOL bUploadResult = TRUE;
    CString strConfigBackUpIp = _T("12.96.66.96");                // RTMS PC IP [ 21-03-03 KJG ] // RTMS PC ID/PW : administrator / dit1234!@
    CString strConfigBackUpPath =_T("DIT_AutoConfigBackUp\\");     // RTMS PC로 Config 파일 업로드 경로 [ 21-03-03 KJG ]
    CString strConfigBackUpPath =_T("DIT_AutoConfigBackUp\\");     // RTMS PC�� Config ���� ���ε� ��� [ 21-03-03 KJG ]
    // [C-PRJ] Image Upload Define - KHT (2020/11/19)
    // 최종 서버 경로 만들기
    // ���� ���� ��� �����
    CString strServer_FinalPath, strServer_WSIFinalPath = _T("");
    if(Param.m_nDataType == FTPDataType_Image)
@@ -566,14 +567,14 @@
    {
        strServer_FinalPath = m_strDefaultFolderPath + Param.m_strServer_FolderName;
    }
    if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC로 Config 파일 업로드 경로 [ 21-03-03 KJG ]
    if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC�� Config ���� ���ε� ��� [ 21-03-03 KJG ]
    {
        strServer_FinalPath.Format("%s%s", strConfigBackUpPath, Param.m_strServer_FolderName);
    }
    //strServer_FinalPath += _T("\\");
    // 서버 경로 변경 없으면 만들어서 변경
    // ���� ��� ���� ������ ���� ����
    if(m_bSharedFolder)
    {
        CString strCreatePath;
@@ -594,7 +595,7 @@
        {
            strCreatePath = "\\\\"+m_strIP+ "\\" + strServer_FinalPath;
        }
        if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC로 Config 파일 업로드 경로 [ 21-03-03 KJG ]
        if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC�� Config ���� ���ε� ��� [ 21-03-03 KJG ]
        {
            strCreatePath.Format("\\\\%s\\%s", strConfigBackUpIp, strServer_FinalPath);
        }
@@ -607,7 +608,7 @@
    }
    //Raw 파일 경로 추가
    //Raw ���� ��� �߰�
    CString strServerSubRawFileFullPathName=NULL;
    if(Param.m_nDataType == FTPDataType_Raw)
    {
@@ -618,12 +619,12 @@
    
    // 로컬 풀 경로명 만들기
    // ���� Ǯ ��θ� �����
    CString strLocal_FullPathName = Param.m_strLocal_FolderName;
    strLocal_FullPathName += _T("\\");
    strLocal_FullPathName += Param.m_strLocal_FileName;
    // 로컬 경로에서 올릴 파일 찾기
    // ���� ��ο��� �ø� ���� ã��
    CFileFind finder;
    CString strServer_FullPathName =_T("");
    BOOL bFind = finder.FindFile(strLocal_FullPathName);
@@ -635,13 +636,13 @@
        if (finder.IsDots()) continue;
        if (finder.IsDirectory()) continue;
        // 서버 풀 경로명 만들기
        // ���� Ǯ ��θ� �����
        strServer_FullPathName = strServer_FinalPath + finder.GetFileName();
        
        // 로컬 풀 경로명 만들기
        // ���� Ǯ ��θ� �����
        strLocal_FullPathName = finder.GetFilePath();
        
        // 업로드
        // ���ε�
        if(m_bSharedFolder)
        {
            // [C-PRJ] Image Upload Define - KHT (2020/11/19)
@@ -653,13 +654,33 @@
            {
                strServer_FullPathName = "\\\\"+m_strIP+ "\\" + strServer_FinalPath + finder.GetFileName();
            }
            if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC로 Config 파일 업로드 경로 [ 21-03-03 KJG ]
            if(Param.m_nDataType == FTPDataType_AutoBackUp) // RTMS PC�� Config ���� ���ε� ��� [ 21-03-03 KJG ]
            {
                strServer_FullPathName = "\\\\"+ strConfigBackUpIp + "\\" + strServer_FinalPath + finder.GetFileName();
            }
            strServer_FullPathName.MakeLower();
            strServer_FullPathName.Replace("/", "\\");
//LYW
            // ���� ��ο� �ش� Raw������ �ִٸ� �ð��� �ٿ��� ���(Rename) [ 21-04-16 KJG ]
            if(Param.m_nDataType ==FTPDataType_Raw && m_bBDIStackDown)
            {
                CFileFind cfinder;
                BOOL bFileExist = cfinder.FindFile(strServer_FullPathName);
                if(bFileExist)
                {
                    CString strCreationTime;
                    CTime tmFileCreation;
                    cfinder.FindNextFile();
                    cfinder.GetLastWriteTime(tmFileCreation);
                    strCreationTime.Format(_T("_%04d%02d%02d%02d%02d%02d"),
                        tmFileCreation.GetYear(), tmFileCreation.GetMonth(), tmFileCreation.GetDay(), tmFileCreation.GetHour(), tmFileCreation.GetMinute(), tmFileCreation.GetSecond());
                    CFile::Rename(strServer_FullPathName, strServer_FullPathName + strCreationTime);
                    DisplayResultMessage(bUploadResult, "Exist RawFile Change RawFile Name %s",strServer_FullPathName + strCreationTime);
                    Sleep(30); // Rename ���ð�
                }
            }
//LYW
            bUploadResult =  CopyFile(strLocal_FullPathName, strServer_FullPathName, FALSE);
            CopyFile(strLocal_FullPathName,strServerSubRawFileFullPathName, FALSE);
        }
@@ -674,19 +695,19 @@
            int a = 0;
        }
        // 결과 로그 출력
        // ��� �α� ���
        DisplayResultMessage(bUploadResult, strServer_FullPathName, strLocal_FullPathName);
    }
    finder.Close();
    if(Param.m_nDataType == FTPDataType_Image && m_bWSIChk)
    {            
        // WSI 로컬 풀 경로명 만들기
        // WSI ���� Ǯ ��θ� �����
        CString strWSILocal_FullPathName = Param.m_strLocal_FolderName;
        strWSILocal_FullPathName += _T("\\WSI\\");
        strWSILocal_FullPathName += Param.m_strLocal_FileName;
        
        // WSI 로컬 경로에서 올릴 파일 찾기
        // WSI ���� ��ο��� �ø� ���� ã��
        CFileFind finder;
        CString strServer_WSIFullPathName =_T("");
        BOOL bFind = finder.FindFile(strWSILocal_FullPathName);
@@ -698,13 +719,13 @@
            if (finder.IsDots()) continue;
            if (finder.IsDirectory()) continue;
            // 서버 풀 경로명 만들기
            // ���� Ǯ ��θ� �����
            strServer_WSIFullPathName = strServer_WSIFinalPath + finder.GetFileName();
        
            // 로컬 풀 경로명 만들기
            // ���� Ǯ ��θ� �����
            strWSILocal_FullPathName = finder.GetFilePath();
        
            // 업로드
            // ���ε�
            if(m_bSharedFolder)
            {
                strServer_WSIFullPathName = "\\\\"+m_strIP2+ "\\" + strServer_WSIFinalPath + finder.GetFileName();
@@ -725,7 +746,7 @@
                int a = 0;
            }
            // 결과 로그 출력
            // ��� �α� ���
            DisplayResultMessage(bUploadResult, strServer_WSIFullPathName, strWSILocal_FullPathName);
        }
        finder.Close();
@@ -747,14 +768,14 @@
        RTMSFile.Format(RTMSFile + "%04d%02d%02d%02d%02d%02d.Signal",time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
        //파일 이동
        bCopy = ::CopyFile(Param.m_strRTMS_FileName, RTMSFile,FALSE);
        //���� �̵�
        bUploadResult = ::CopyFile(Param.m_strRTMS_FileName, RTMSFile,FALSE);
        DisplayResultMessage(bCopy,Param.m_strRTMS_FileName,RTMSFile);
        DisplayResultMessage(bUploadResult,Param.m_strRTMS_FileName,RTMSFile);
    }
    // 시그널 파일을 업로드해야하면.
    // �ñ׳� ������ ���ε��ؾ��ϸ�.
    if( Param.m_nCreateSignalFile == 1)
    {
        Upload_Signal(Param);
@@ -768,10 +789,10 @@
    if(m_bSharedFolder == FALSE && m_pConnection == NULL)
        return FALSE;
    // 서버 최종 경로
    // ���� ���� ���
    CString strServer_FinalPath = m_strDefaultFolderPath3 + Param.m_strServer_FolderName + "/";
    //201208 CJH - Stack 용 추가
    //201208 CJH - Stack �� �߰�
    if(m_bSharedFolder)
    {
        CString strCreatePath;
@@ -783,14 +804,14 @@
        ChangeDirectory(strServer_FinalPath, TRUE);
    }
    // 로컬 최종 경로
    // ���� ���� ���
    BOOL bDownResult = TRUE;
    CString strLocal_FullPathName = Param.m_strLocal_FolderName;
    strLocal_FullPathName += _T("\\");
    try
    {
        // 서버 최종 파일
        // ���� ���� ����
        if(m_bSharedFolder)
        {
            strServer_FinalPath = "\\\\"+m_strIP3+ m_strDefaultFolderPath3 + Param.m_strServer_FolderName + "/" ;
@@ -818,14 +839,14 @@
                CString strValue = finder.GetFileName();
                // 로컬 풀 경로 만들기
                // ���� Ǯ ��� �����
                strLocal_FullFileName = strLocal_FullPathName + Param.m_strLocal_FileName;
                CString strServerFileName = strServer_FinalPath + finder.GetFileName();
                // 다운로드
                // �ٿ�ε�
                bDownResult = bDownResult &  CopyFile(strServerFileName, strLocal_FullFileName, FALSE);
                // 결과 로그 출력
                // ��� �α� ���
                DisplayResultMessage(bDownResult, strServerFileName, strLocal_FullFileName);
            }
@@ -847,16 +868,16 @@
                CString strValue = finder.GetFileName();
                // 로컬 풀 경로 만들기
                // ���� Ǯ ��� �����
                strLocal_FullFileName = strLocal_FullPathName + Param.m_strServer_FileName;//finder.GetFileName();
                // 서버 풀 경로 가져오기
                // ���� Ǯ ��� ��������
                strServer_FinalPath = strServer_FinalPath;//finder.GetFilePath();
                // 다운로드
                // �ٿ�ε�
                bDownResult = bDownResult &  m_pConnection->GetFile(strServer_FinalPath, strLocal_FullFileName, FALSE);
                // 결과 로그 출력
                // ��� �α� ���
                DisplayResultMessage(bDownResult, strServer_FinalPath, strLocal_FullFileName);
            }
            finder.Close();
@@ -888,56 +909,56 @@
    switch(dwErrorCode)
    {
    case    ERROR_INTERNET_OUT_OF_HANDLES           :    strRet = _T("ERROR_INTERNET_OUT_OF_HANDLES                할당할 수 있는 인터넷 핸들이 없습니다.                        "); break;
    case    ERROR_INTERNET_TIMEOUT                  :    strRet = _T("ERROR_INTERNET_TIMEOUT                        작업 시간을 초과했습니다.                        "); break;
    case    ERROR_INTERNET_EXTENDED_ERROR           :    strRet = _T("ERROR_INTERNET_EXTENDED_ERROR                서버에서 확장 정보를 반환했습니다.                        "); break;
    case    ERROR_INTERNET_INTERNAL_ERROR           :    strRet = _T("ERROR_INTERNET_INTERNAL_ERROR                Microsoft 인터넷 확장에서 내부 오류가 발생했습니다.                        "); break;
    case    ERROR_INTERNET_INVALID_URL              :    strRet = _T("ERROR_INTERNET_INVALID_URL                    잘못된 URL입니다.                        "); break;
    case    ERROR_INTERNET_UNRECOGNIZED_SCHEME      :    strRet = _T("ERROR_INTERNET_UNRECOGNIZED_SCHEME            URL에서 인식된 프로토콜을 사용하지 않습니다.                        "); break;
    case    ERROR_INTERNET_NAME_NOT_RESOLVED        :    strRet = _T("ERROR_INTERNET_NAME_NOT_RESOLVED            서버 이름이나 주소를 확인할 수 없습니다.                        "); break;
    case    ERROR_INTERNET_PROTOCOL_NOT_FOUND       :    strRet = _T("ERROR_INTERNET_PROTOCOL_NOT_FOUND            필요한 기능이 포함된 프로토콜을 찾을 수 없습니다.                        "); break;
    case    ERROR_INTERNET_INVALID_OPTION           :    strRet = _T("ERROR_INTERNET_INVALID_OPTION                잘못된 옵션입니다.                        "); break;
    case    ERROR_INTERNET_BAD_OPTION_LENGTH        :    strRet = _T("ERROR_INTERNET_BAD_OPTION_LENGTH            옵션 종류에 대해 길이가 맞지 않습니다.                        "); break;
    case    ERROR_INTERNET_OPTION_NOT_SETTABLE      :    strRet = _T("ERROR_INTERNET_OPTION_NOT_SETTABLE            옵션 값을 설정할 수 없습니다.                        "); break;
    case    ERROR_INTERNET_SHUTDOWN                 :    strRet = _T("ERROR_INTERNET_SHUTDOWN                    Microsoft 인터넷 확장 지원이 종료되었습니다.                        "); break;
    case    ERROR_INTERNET_INCORRECT_USER_NAME      :    strRet = _T("ERROR_INTERNET_INCORRECT_USER_NAME            사용할 수 없는 사용자 이름입니다.                        "); break;
    case    ERROR_INTERNET_INCORRECT_PASSWORD       :    strRet = _T("ERROR_INTERNET_INCORRECT_PASSWORD            사용할 수 없는 암호입니다.                        "); break;
    case    ERROR_INTERNET_LOGIN_FAILURE            :    strRet = _T("ERROR_INTERNET_LOGIN_FAILURE                로그인 요청이 거부되었습니다.                        "); break;
    case    ERROR_INTERNET_OUT_OF_HANDLES           :    strRet = _T("ERROR_INTERNET_OUT_OF_HANDLES                �Ҵ��� �� �ִ� ���ͳ� �ڵ��� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_TIMEOUT                  :    strRet = _T("ERROR_INTERNET_TIMEOUT                        �۾� �ð��� �ʰ��߽��ϴ�.                        "); break;
    case    ERROR_INTERNET_EXTENDED_ERROR           :    strRet = _T("ERROR_INTERNET_EXTENDED_ERROR                �������� Ȯ�� ������ ��ȯ�߽��ϴ�.                        "); break;
    case    ERROR_INTERNET_INTERNAL_ERROR           :    strRet = _T("ERROR_INTERNET_INTERNAL_ERROR                Microsoft ���ͳ� Ȯ�忡�� ���� ������ �߻��߽��ϴ�.                        "); break;
    case    ERROR_INTERNET_INVALID_URL              :    strRet = _T("ERROR_INTERNET_INVALID_URL                    �߸��� URL�Դϴ�.                        "); break;
    case    ERROR_INTERNET_UNRECOGNIZED_SCHEME      :    strRet = _T("ERROR_INTERNET_UNRECOGNIZED_SCHEME            URL���� �νĵ� ���������� ������� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_NAME_NOT_RESOLVED        :    strRet = _T("ERROR_INTERNET_NAME_NOT_RESOLVED            ���� �̸��̳� �ּҸ� Ȯ���� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_PROTOCOL_NOT_FOUND       :    strRet = _T("ERROR_INTERNET_PROTOCOL_NOT_FOUND            �ʿ��� ����� ���Ե� ���������� ã�� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_INVALID_OPTION           :    strRet = _T("ERROR_INTERNET_INVALID_OPTION                �߸��� �ɼ��Դϴ�.                        "); break;
    case    ERROR_INTERNET_BAD_OPTION_LENGTH        :    strRet = _T("ERROR_INTERNET_BAD_OPTION_LENGTH            �ɼ� ������ ���� ���̰� ���� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_OPTION_NOT_SETTABLE      :    strRet = _T("ERROR_INTERNET_OPTION_NOT_SETTABLE            �ɼ� ���� ������ �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_SHUTDOWN                 :    strRet = _T("ERROR_INTERNET_SHUTDOWN                    Microsoft ���ͳ� Ȯ�� ������ ����Ǿ����ϴ�.                        "); break;
    case    ERROR_INTERNET_INCORRECT_USER_NAME      :    strRet = _T("ERROR_INTERNET_INCORRECT_USER_NAME            ����� �� ���� ����� �̸��Դϴ�.                        "); break;
    case    ERROR_INTERNET_INCORRECT_PASSWORD       :    strRet = _T("ERROR_INTERNET_INCORRECT_PASSWORD            ����� �� ���� ��ȣ�Դϴ�.                        "); break;
    case    ERROR_INTERNET_LOGIN_FAILURE            :    strRet = _T("ERROR_INTERNET_LOGIN_FAILURE                �α��� ��û�� �źεǾ����ϴ�.                        "); break;
    case    ERROR_INTERNET_INVALID_OPERATION        :    strRet = _T("ERROR_INTERNET_INVALID_OPERATION                                    "); break;
    case    ERROR_INTERNET_OPERATION_CANCELLED      :    strRet = _T("ERROR_INTERNET_OPERATION_CANCELLED            작업이 취소되었습니다.                        "); break;
    case    ERROR_INTERNET_INCORRECT_HANDLE_TYPE    :    strRet = _T("ERROR_INTERNET_INCORRECT_HANDLE_TYPE        제공된 핸들은 요청한 작업에 사용할 수 없는 종류입니다.                        "); break;
    case    ERROR_INTERNET_INCORRECT_HANDLE_STATE   :    strRet = _T("ERROR_INTERNET_INCORRECT_HANDLE_STATE        요청한 작업에 사용할 수 없는 상태의 핸들입니다.                        "); break;
    case    ERROR_INTERNET_NOT_PROXY_REQUEST        :    strRet = _T("ERROR_INTERNET_NOT_PROXY_REQUEST            프록시 세션에서 요청할 수 없습니다.                        "); break;
    case    ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND :    strRet = _T("ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND    레지스트리 값을 찾을 수 없습니다.                        "); break;
    case    ERROR_INTERNET_BAD_REGISTRY_PARAMETER   :    strRet = _T("ERROR_INTERNET_BAD_REGISTRY_PARAMETER        레지스트리 매개 변수가 맞지 않습니다.                        "); break;
    case    ERROR_INTERNET_NO_DIRECT_ACCESS         :    strRet = _T("ERROR_INTERNET_NO_DIRECT_ACCESS            직접 인터넷에 액세스할 수 없습니다.                        "); break;
    case    ERROR_INTERNET_NO_CONTEXT               :    strRet = _T("ERROR_INTERNET_NO_CONTEXT                    컨텍스트 값을 제공하지 않았습니다.                        "); break;
    case    ERROR_INTERNET_NO_CALLBACK              :    strRet = _T("ERROR_INTERNET_NO_CALLBACK                    상태 콜백이 제공되지 않았습니다.                        "); break;
    case    ERROR_INTERNET_REQUEST_PENDING          :    strRet = _T("ERROR_INTERNET_REQUEST_PENDING                아직 해결되지 않은 요청이 있습니다.                        "); break;
    case    ERROR_INTERNET_INCORRECT_FORMAT         :    strRet = _T("ERROR_INTERNET_INCORRECT_FORMAT            정보 형식이 맞지 않습니다.                        "); break;
    case    ERROR_INTERNET_ITEM_NOT_FOUND           :    strRet = _T("ERROR_INTERNET_ITEM_NOT_FOUND                요청한 항목을 찾을 수 없습니다.                        "); break;
    case    ERROR_INTERNET_CANNOT_CONNECT           :    strRet = _T("ERROR_INTERNET_CANNOT_CONNECT                서버에 연결할 수 없습니다.                        "); break;
    case    ERROR_INTERNET_CONNECTION_ABORTED       :    strRet = _T("ERROR_INTERNET_CONNECTION_ABORTED            서버와의 연결이 비정상적으로 종료되었습니다.                        "); break;
    case    ERROR_INTERNET_CONNECTION_RESET         :    strRet = _T("ERROR_INTERNET_CONNECTION_RESET            서버와의 연결을 다시 설정했습니다.                        "); break;
    case    ERROR_INTERNET_FORCE_RETRY              :    strRet = _T("ERROR_INTERNET_FORCE_RETRY                    작업을 다시 시도해야 합니다.                        "); break;
    case    ERROR_INTERNET_INVALID_PROXY_REQUEST    :    strRet = _T("ERROR_INTERNET_INVALID_PROXY_REQUEST        잘못된 프록시 요청입니다.                        "); break;
    case    ERROR_INTERNET_NEED_UI                  :    strRet = _T("ERROR_INTERNET_NEED_UI                        작업을 완료하려면 사용자의 조작이 필요합니다.                        "); break;
    case    ERROR_INTERNET_HANDLE_EXISTS            :    strRet = _T("ERROR_INTERNET_HANDLE_EXISTS                핸들이 이미 있습니다.                        "); break;
    case    ERROR_INTERNET_SEC_CERT_DATE_INVALID    :    strRet = _T("ERROR_INTERNET_SEC_CERT_DATE_INVALID        인증서 날짜가 잘못되었거나 만료되었습니다.                        "); break;
    case    ERROR_INTERNET_SEC_CERT_CN_INVALID      :    strRet = _T("ERROR_INTERNET_SEC_CERT_CN_INVALID            인증서 호스트 이름이 잘못되었거나 일치하지 않습니다.                        "); break;
    case    ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR   :    strRet = _T("ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR        리디렉션 요청으로 비보안 연결을 보안 연결로 변경합니다.                        "); break;
    case    ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR   :    strRet = _T("ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR        리디렉션 요청으로 보안 연결을 비보안 연결로 변경합니다.                        "); break;
    case    ERROR_INTERNET_MIXED_SECURITY           :    strRet = _T("ERROR_INTERNET_MIXED_SECURITY                보안 및 비보안 연결이 혼합되어 있습니다.                        "); break;
    case    ERROR_INTERNET_CHG_POST_IS_NON_SECURE   :    strRet = _T("ERROR_INTERNET_CHG_POST_IS_NON_SECURE        비보안 게시로 변경하고 있습니다.                        "); break;
    case    ERROR_INTERNET_POST_IS_NON_SECURE       :    strRet = _T("ERROR_INTERNET_POST_IS_NON_SECURE            비보안 연결 상태에서 데이터를 게시하고 있습니다.                        "); break;
    case    ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED  :    strRet = _T("ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED        클라이언트 인증을 완료하려면 인증서가 필요합니다.                        "); break;
    case    ERROR_INTERNET_INVALID_CA               :    strRet = _T("ERROR_INTERNET_INVALID_CA                    인증 기관이 잘못되었거나 맞지 않습니다.                        "); break;
    case    ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP    :    strRet = _T("ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP        클라이언트 인증이 올바르게 설치되지 않았습니다.                        "); break;
    case    ERROR_INTERNET_ASYNC_THREAD_FAILED      :    strRet = _T("ERROR_INTERNET_ASYNC_THREAD_FAILED            Wininet 비동기 스레드에서 오류가 발생했습니다.다시 시작해야 합니다.                        "); break;
    case    ERROR_INTERNET_REDIRECT_SCHEME_CHANGE   :    strRet = _T("ERROR_INTERNET_REDIRECT_SCHEME_CHANGE        리디렉션 작업 중 프로토콜 스키마가 변경되었습니다.                        "); break;
    case    ERROR_INTERNET_DIALOG_PENDING           :    strRet = _T("ERROR_INTERNET_DIALOG_PENDING                다시 시도할 때까지 대기 중인 작업이 있습니다.                        "); break;
    case    ERROR_INTERNET_RETRY_DIALOG             :    strRet = _T("ERROR_INTERNET_RETRY_DIALOG                작업을 다시 시도해야 합니다.                        "); break;
    case    ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR  :    strRet = _T("ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR        보안 영역 점검에 따라 이 작업은 다시 시도해야 합니다.                        "); break;
    case    ERROR_INTERNET_OPERATION_CANCELLED      :    strRet = _T("ERROR_INTERNET_OPERATION_CANCELLED            �۾��� ��ҵǾ����ϴ�.                        "); break;
    case    ERROR_INTERNET_INCORRECT_HANDLE_TYPE    :    strRet = _T("ERROR_INTERNET_INCORRECT_HANDLE_TYPE        ������ �ڵ��� ��û�� �۾��� ����� �� ���� �����Դϴ�.                        "); break;
    case    ERROR_INTERNET_INCORRECT_HANDLE_STATE   :    strRet = _T("ERROR_INTERNET_INCORRECT_HANDLE_STATE        ��û�� �۾��� ����� �� ���� ������ �ڵ��Դϴ�.                        "); break;
    case    ERROR_INTERNET_NOT_PROXY_REQUEST        :    strRet = _T("ERROR_INTERNET_NOT_PROXY_REQUEST            ���Ͻ� ���ǿ��� ��û�� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND :    strRet = _T("ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND    ������Ʈ�� ���� ã�� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_BAD_REGISTRY_PARAMETER   :    strRet = _T("ERROR_INTERNET_BAD_REGISTRY_PARAMETER        ������Ʈ�� �Ű� ������ ���� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_NO_DIRECT_ACCESS         :    strRet = _T("ERROR_INTERNET_NO_DIRECT_ACCESS            ���� ���ͳݿ� �׼����� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_NO_CONTEXT               :    strRet = _T("ERROR_INTERNET_NO_CONTEXT                    ���ؽ�Ʈ ���� �������� �ʾҽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_NO_CALLBACK              :    strRet = _T("ERROR_INTERNET_NO_CALLBACK                    ���� �ݹ��� �������� �ʾҽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_REQUEST_PENDING          :    strRet = _T("ERROR_INTERNET_REQUEST_PENDING                ���� �ذ���� ���� ��û�� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_INCORRECT_FORMAT         :    strRet = _T("ERROR_INTERNET_INCORRECT_FORMAT            ���� ������ ���� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_ITEM_NOT_FOUND           :    strRet = _T("ERROR_INTERNET_ITEM_NOT_FOUND                ��û�� �׸��� ã�� �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_CANNOT_CONNECT           :    strRet = _T("ERROR_INTERNET_CANNOT_CONNECT                ������ ������ �� �����ϴ�.                        "); break;
    case    ERROR_INTERNET_CONNECTION_ABORTED       :    strRet = _T("ERROR_INTERNET_CONNECTION_ABORTED            �������� ������ ������������ ����Ǿ����ϴ�.                        "); break;
    case    ERROR_INTERNET_CONNECTION_RESET         :    strRet = _T("ERROR_INTERNET_CONNECTION_RESET            �������� ������ �ٽ� �����߽��ϴ�.                        "); break;
    case    ERROR_INTERNET_FORCE_RETRY              :    strRet = _T("ERROR_INTERNET_FORCE_RETRY                    �۾��� �ٽ� �õ��ؾ� �մϴ�.                        "); break;
    case    ERROR_INTERNET_INVALID_PROXY_REQUEST    :    strRet = _T("ERROR_INTERNET_INVALID_PROXY_REQUEST        �߸��� ���Ͻ� ��û�Դϴ�.                        "); break;
    case    ERROR_INTERNET_NEED_UI                  :    strRet = _T("ERROR_INTERNET_NEED_UI                        �۾��� �Ϸ��Ϸ��� ������� ������ �ʿ��մϴ�.                        "); break;
    case    ERROR_INTERNET_HANDLE_EXISTS            :    strRet = _T("ERROR_INTERNET_HANDLE_EXISTS                �ڵ��� �̹� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_SEC_CERT_DATE_INVALID    :    strRet = _T("ERROR_INTERNET_SEC_CERT_DATE_INVALID        ������ ��¥�� �߸��Ǿ��ų� ����Ǿ����ϴ�.                        "); break;
    case    ERROR_INTERNET_SEC_CERT_CN_INVALID      :    strRet = _T("ERROR_INTERNET_SEC_CERT_CN_INVALID            ������ ȣ��Ʈ �̸��� �߸��Ǿ��ų� ��ġ���� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR   :    strRet = _T("ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR        ���𷺼� ��û���� �񺸾� ������ ���� ����� �����մϴ�.                        "); break;
    case    ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR   :    strRet = _T("ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR        ���𷺼� ��û���� ���� ������ �񺸾� ����� �����մϴ�.                        "); break;
    case    ERROR_INTERNET_MIXED_SECURITY           :    strRet = _T("ERROR_INTERNET_MIXED_SECURITY                ���� �� �񺸾� ������ ȥ�յǾ� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_CHG_POST_IS_NON_SECURE   :    strRet = _T("ERROR_INTERNET_CHG_POST_IS_NON_SECURE        �񺸾� �Խ÷� �����ϰ� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_POST_IS_NON_SECURE       :    strRet = _T("ERROR_INTERNET_POST_IS_NON_SECURE            �񺸾� ���� ���¿��� �����͸� �Խ��ϰ� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED  :    strRet = _T("ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED        Ŭ���̾�Ʈ ������ �Ϸ��Ϸ��� �������� �ʿ��մϴ�.                        "); break;
    case    ERROR_INTERNET_INVALID_CA               :    strRet = _T("ERROR_INTERNET_INVALID_CA                    ���� ����� �߸��Ǿ��ų� ���� �ʽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP    :    strRet = _T("ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP        Ŭ���̾�Ʈ ������ �ùٸ��� ��ġ���� �ʾҽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_ASYNC_THREAD_FAILED      :    strRet = _T("ERROR_INTERNET_ASYNC_THREAD_FAILED            Wininet �񵿱� �����忡�� ������ �߻��߽��ϴ�.�ٽ� �����ؾ� �մϴ�.                        "); break;
    case    ERROR_INTERNET_REDIRECT_SCHEME_CHANGE   :    strRet = _T("ERROR_INTERNET_REDIRECT_SCHEME_CHANGE        ���𷺼� �۾� �� �������� ��Ű���� ����Ǿ����ϴ�.                        "); break;
    case    ERROR_INTERNET_DIALOG_PENDING           :    strRet = _T("ERROR_INTERNET_DIALOG_PENDING                �ٽ� �õ��� ������ ��� ���� �۾��� �ֽ��ϴ�.                        "); break;
    case    ERROR_INTERNET_RETRY_DIALOG             :    strRet = _T("ERROR_INTERNET_RETRY_DIALOG                �۾��� �ٽ� �õ��ؾ� �մϴ�.                        "); break;
    case    ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR  :    strRet = _T("ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR        ���� ���� ���˿� ���� �� �۾��� �ٽ� �õ��ؾ� �մϴ�.                        "); break;
    case    ERROR_INTERNET_INSERT_CDROM             :    strRet = _T("ERROR_INTERNET_INSERT_CDROM                                        "); break;
    case    ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED    :    strRet = _T("ERROR_INTERNET_FORTEZZA_LOGIN_NEEDED                                "); break;
    case    ERROR_INTERNET_SEC_CERT_ERRORS          :    strRet = _T("ERROR_INTERNET_SEC_CERT_ERRORS                                        "); break;
FTPUploader/FTPUploader/FTPThreadPool.h
@@ -45,7 +45,7 @@
    // setter
    void    SetConnectionTimeout(int nTimeout);
    void    SetConnectionInfo(CString strIP, CString strUserID, CString strPassword, int nPort, int nTimeout, CString strHomePath, CString strIP2, CString strUserID2, CString strPassword2, int nPort2, int nTimeout2, CString strHomePath2, CString strIP3, CString strUserID3, CString strPassword3, int nPort3, int nTimeout3, CString strHomePath3, BOOL bPassive, BOOL WSIChk);
    void    SetConnectionInfo(CString strIP, CString strUserID, CString strPassword, int nPort, int nTimeout, CString strHomePath, CString strIP2, CString strUserID2, CString strPassword2, int nPort2, int nTimeout2, CString strHomePath2, CString strIP3, CString strUserID3, CString strPassword3, int nPort3, int nTimeout3, CString strHomePath3, BOOL bPassive, BOOL WSIChk, BOOL bBDIStackDown);
    void    SetIFTP2P(IFTPThreadPool2Parent *pIFTP2P)        { m_pIFTP2P = pIFTP2P; }
    // getter
@@ -150,5 +150,6 @@
    BOOL                    m_bSharedFolder;
    BOOL                    m_bWSIChk;
    BOOL                    m_bBDIStackDown;
};
FTPUploader/FTPUploader/FTPUploader.rc
@@ -112,7 +112,7 @@
    LTEXT           "IP(2) :",IDC_STATIC,9,402,22,8
    EDITTEXT        IDC_EDIT_PORT2,278,400,24,14,ES_AUTOHSCROLL
    LTEXT           "Port :",IDC_STATIC,258,402,19,8
    CONTROL         "Passive Mode",IDC_CHECK_PASSIVE_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129,457,59,15
    CONTROL         "Passive Mode",IDC_CHECK_PASSIVE_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129,457,56,15
    GROUPBOX        "업로드 로그",IDC_STATIC,7,219,457,148
    LISTBOX         IDC_LIST_LOG,13,79,444,134,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
    LISTBOX         IDC_LIST_LOG_UP,13,229,444,134,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
@@ -147,7 +147,8 @@
    LTEXT           "IP(3) :",IDC_STATIC,10,421,22,8
    EDITTEXT        IDC_EDIT_PORT3,278,420,24,14,ES_AUTOHSCROLL
    LTEXT           "Port :",IDC_STATIC,258,421,19,8
    CONTROL         "WSI Use",IDC_CHECK_WSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,192,458,59,15
    CONTROL         "WSI Use",IDC_CHECK_WSI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,192,458,39,15
    CONTROL         "BDI Stack DownLoad",IDC_CHECK_BDI_STACK_DOWNLOAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,235,458,82,15
END
IDD_DLG_UPLOAD_LIST DIALOGEX 0, 0, 407, 266
FTPUploader/FTPUploader/FTPUploaderDlg.cpp
@@ -63,6 +63,7 @@
    , m_strHomePath2(_T("/"))
    , m_nPort2(21)
    , m_bPassiveMode(FALSE)
    , m_bCheckBDIStackDown(FALSE)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
@@ -107,6 +108,7 @@
    DDX_Text(pDX, IDC_EDIT_TIMEOUT3, m_nTimeOut3);
    DDX_Text(pDX, IDC_EDIT_HOMEPATH3, m_strHomePath3);
    DDX_Control(pDX, IDC_CHECK_WSI, m_chkWSI);
    DDX_Check(pDX, IDC_CHECK_BDI_STACK_DOWNLOAD, m_bCheckBDIStackDown);
}
BEGIN_MESSAGE_MAP(CFTPUploaderDlg, CDialog)
@@ -131,6 +133,9 @@
    ON_COMMAND(ID_FILE_CLOSE, &CFTPUploaderDlg::OnFileClose)
    ON_BN_CLICKED(IDC_BUTTON_DOWNLOAD_LIST, &CFTPUploaderDlg::OnBnClickedButtonDownloadList)
    ON_BN_CLICKED(IDC_BUTTON_UPLOAD_LIST, &CFTPUploaderDlg::OnBnClickedButtonUploadList)
    ON_BN_CLICKED(IDC_CHECK_BDI_STACK_DOWNLOAD, &CFTPUploaderDlg::OnBnClickedCheckBdiStackDownload)
    ON_BN_CLICKED(IDC_CHECK_WSI, &CFTPUploaderDlg::OnBnClickedCheckWsi)
    ON_BN_CLICKED(IDC_CHECK_PASSIVE_MODE, &CFTPUploaderDlg::OnBnClickedCheckPassiveMode)
END_MESSAGE_MAP()
@@ -195,7 +200,7 @@
    if (m_pFTPThreadPool_Down)
    {
        m_pFTPThreadPool_Down->SetIFTP2P(this);
        m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk);
        m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
        m_pFTPThreadPool_Down->StartThread();
    }
    
@@ -204,7 +209,7 @@
    if (m_pFTPThreadPool_Up)
    {
        m_pFTPThreadPool_Up->SetIFTP2P(this);
        m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk);
        m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
        m_pFTPThreadPool_Up->StartThread();
    }
    
@@ -629,8 +634,8 @@
    m_bWSIChk = m_chkWSI.GetCheck();
    m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3, m_strID3, m_strPW3, m_nPort3, m_nTimeOut3, m_strHomePath3, m_bPassiveMode, m_bWSIChk);
    m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3, m_strID3, m_strPW3, m_nPort3, m_nTimeOut3, m_strHomePath3, m_bPassiveMode, m_bWSIChk);
    m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2, strIP3, m_strID3, m_strPW3, m_nPort3, m_nTimeOut3, m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
    m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3, m_strID3, m_strPW3, m_nPort3, m_nTimeOut3, m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
    CString strTestFile = _T("");
    CString strSubFolder = _T("LotHistory");
@@ -988,6 +993,15 @@
    m_bWSIChk = _tstoi( (CString)(CStringA)strRegBuf );
    //BDI Stack Down
    memset(strRegBuf,0,sizeof(char)*255);
    if(ReadString(SHCU,KEY_FTP,_T("BDI_STACK_DOWN"),(LPBYTE)strRegBuf,255) == FALSE)
    {
        strcpy_s(strRegBuf,sizeof(char)*255,"1");
    }
    m_bCheckBDIStackDown = _tstoi( (CString)(CStringA)strRegBuf );
    UpdateData(FALSE);
    return TRUE;
}
@@ -1123,6 +1137,10 @@
    sprintf_s(strRegBuf, sizeof(char)*255, "%d",m_bWSIChk);
    WriteString(SHCU,KEY_FTP,_T("WSI_USE"),strRegBuf);
    // BDI Stack DownLoad
    sprintf_s(strRegBuf, sizeof(char)*255, "%d",(int)m_bCheckBDIStackDown);
    WriteString(SHCU,KEY_FTP,_T("BDI_STACK_DOWN"),strRegBuf);;
    m_ctlIPAddress.GetAddress(chIP[0],chIP[1],chIP[2],chIP[3]);
    CString strIP = _T("");
@@ -1138,8 +1156,8 @@
    CString strIP3 = _T("");
    strIP3.Format(_T("%d.%d.%d.%d"),chIP[0],chIP[1],chIP[2],chIP[3]);
    m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk);
    m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk);
    m_pFTPThreadPool_Down->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
    m_pFTPThreadPool_Up->SetConnectionInfo(strIP,m_strID,m_strPW,m_nPort,m_nTimeOut,m_strHomePath,strIP2,m_strID2,m_strPW2,m_nPort2,m_nTimeOut2,m_strHomePath2,strIP3,m_strID3,m_strPW3,m_nPort3,m_nTimeOut3,m_strHomePath3, m_bPassiveMode, m_bWSIChk, m_bCheckBDIStackDown);
    if(m_nConfigMode == CM_File)
    {
@@ -1489,4 +1507,21 @@
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    return __super::DestroyWindow();
}
}
void CFTPUploaderDlg::OnBnClickedCheckBdiStackDownload()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
void CFTPUploaderDlg::OnBnClickedCheckWsi()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
void CFTPUploaderDlg::OnBnClickedCheckPassiveMode()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
FTPUploader/FTPUploader/FTPUploaderDlg.h
@@ -26,12 +26,12 @@
#define TIMER_FTP_UPLOAD_INFO    (WM_USER + 112)
#define SHCU                    HKEY_CURRENT_USER
#define    KEY_FTP                    _T("Software\\DIT\\FTP\\")        // 레지스트리 접근 경로설정
#define    KEY_FTP                    _T("Software\\DIT\\FTP\\")        // ������Ʈ�� ���� ��μ���
#define CONFIGFILENAME            _T("FTPUploader.cfg")
#define FTP_LOG_FILE_PATH        _T("C:\\DIT_LogData\\")
#define FTP_LOG_FILE_PATH        _T("D:\\DIT_LogData\\")
#define FTP_LOG_FILE_NAME        _T("logFTPUploader")
#define BLANK_UPDOWNLOAD_PATH    _T("c:\\Temp")
#define BLANK_UPDOWNLOAD_PATH    _T("D:\\Temp")
#define BLANK_DOWNLOAD_FILE        _T("!!!H_GLASS_ID_DOWN.IDX")
#define BLANK_UPLOAD_FILE        _T("!!!H_GLASS_ID_UP.IDX")
@@ -105,6 +105,7 @@
    BOOL                m_bPassiveMode;
    BOOL                m_bWSIChk;
    BOOL                m_bCheckBDIStackDown;
    CIPAddressCtrl        m_ctlIPAddress2;
    CString                m_strID2;
@@ -113,7 +114,7 @@
    CString                m_strHomePath2;
    int                    m_nPort2;
    //201218 CJH - IP 추가
    //201218 CJH - IP �߰�
    CIPAddressCtrl        m_ctlIPAddress3;
    CString                m_strID3;
    CString                m_strPW3;
@@ -166,4 +167,7 @@
    afx_msg void OnBnClickedButtonUploadList();
    virtual BOOL DestroyWindow();
    CButton m_chkWSI;
    afx_msg void OnBnClickedCheckBdiStackDownload();
    afx_msg void OnBnClickedCheckWsi();
    afx_msg void OnBnClickedCheckPassiveMode();
};
FTPUploader/FTPUploader/resource.h
@@ -19,6 +19,8 @@
#define IDC_EDIT_ID2                    1006
#define IDC_CHECK_AUTO_UPLOAD           1007
#define IDC_LIST_UPLOAD_READY_LIST      1008
#define IDC_CHECK_AUTO_UPLOAD3          1008
#define IDC_CHECK_BDI_STACK_DOWNLOAD    1008
#define IDC_BUTTON_MANUAL_UPLOAD        1009
#define IDC_LIST_LOG                    1010
#define IDC_BUTTON_TEST                 1011
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
@@ -423,7 +423,11 @@
    int                m_nPixelConv;                // pixel 단위 좌표
    int                m_nPixelScan;                // pixel 단위 좌표
    short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD Start > */
    // 범위 벗어나서 음수로 표기되면 D_Col Fail
    //short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    int                    m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD End > */
    short/*SERVER_DefectType*/        m_DefectType;                // 결함 타입    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // 결함의 판정상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // 결함 타입 - Bright, Dark, Both
@@ -503,7 +507,10 @@
    short            m_nStackStepCount;            // Stack 수
    short            m_nStackColorIdx;            // Color를 선택하는 인덱스.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
/* < KMH 20220712 : #4230 MOD Start > */
    //    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
    char            m_strStackFirst[400];            // Stack Step. // 400 bytes 확장요청 : SDC 채승석P
/* < KMH 20220712 : #4230 MOD End > */
    char            m_strUnitID[16];                // 유닛아이디
    int                m_ClassificationType;                // enum ClassificationType            { ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
ReviewHistory/bin/ReviewHistroy.exe
Binary files differ
ReviewSystem/CHMotorControls/MotorControl.cpp
@@ -103,27 +103,27 @@
    if (m_nAxisCount<1) return;
    //Alive
    if (ReadAddressValue(50, m_nMotorAlive))
    {
        if (m_nMotorAlivePrev != m_nMotorAlive)
        {
            dwLastAliveTick = GetTickCount();
        }
        m_nAutoEnablePrev = m_nAutoEnable;
        if (GetTickCount() - dwLastAliveTick >15000 && dwLastAliveTick != 0)
        {
            m_pMC2P->IMC2P_SendMotorAliveErrorAlram();
            m_pMC2P->IMC2P_DisplayMessage(m_nIndex, _T("Motor Alive Error!"));
            dwLastAliveTick = GetTickCount();
        }
    }
    else
    {
        m_pMC2P->IMC2P_SendMotorAliveErrorAlram();
        m_pMC2P->IMC2P_DisplayMessage(m_nIndex, _T("Motor Alive Read Fail!"));
        dwLastAliveTick = GetTickCount();
    }
//     if (ReadAddressValue(50, m_nMotorAlive))
//     {
//         if (m_nMotorAlivePrev != m_nMotorAlive)
//         {
//             dwLastAliveTick = GetTickCount();
//         }
//         m_nAutoEnablePrev = m_nAutoEnable;
//
//         if (GetTickCount() - dwLastAliveTick >15000 && dwLastAliveTick != 0)
//         {
//             m_pMC2P->IMC2P_SendMotorAliveErrorAlram();
//             m_pMC2P->IMC2P_DisplayMessage(m_nIndex, _T("Motor Alive Error!"));
//             dwLastAliveTick = GetTickCount();
//         }
//     }
//     else
//     {
//         m_pMC2P->IMC2P_SendMotorAliveErrorAlram();
//         m_pMC2P->IMC2P_DisplayMessage(m_nIndex, _T("Motor Alive Read Fail!"));
//         dwLastAliveTick = GetTickCount();
//     }
    // auto enable
    const CMotorCommonAddr *pAddr = m_ControlInfo.GetMotorCommonAddr();
ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -423,7 +423,11 @@
    int                m_nPixelConv;                // pixel 단위 좌표
    int                m_nPixelScan;                // pixel 단위 좌표
    short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD Start > */
    // 범위 벗어나서 음수로 표기되면 D_Col Fail
    //short                            m_nPixelSize;                // 결함크기        ---------------------------------PS
    int                    m_nPixelSize;                // 결함크기        ---------------------------------PS
    /* < KMH 20220707 : #4230 MOD End > */
    short/*SERVER_DefectType*/        m_DefectType;                // 결함 타입    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // 결함의 판정상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // 결함 타입 - Bright, Dark, Both
@@ -503,7 +507,10 @@
    short            m_nStackStepCount;            // Stack 수
    short            m_nStackColorIdx;            // Color를 선택하는 인덱스.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
/* < KMH 20220712 : #4230 MOD Start > */
    //    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - 최대 사이즈 60bytes
    char            m_strStackFirst[400];            // Stack Step. // 400 bytes 확장요청 : SDC 채승석P
/* < KMH 20220712 : #4230 MOD End > */
    char            m_strUnitID[16];                // 유닛아이디
    int                m_ClassificationType;                // enum ClassificationType            { ClassType_None= 0, ClassType_PI_Over= 1, ClassType_PI_Under= 2, ClassType_TFE_Circle= 3, ClassType_Bubble, ClassType_Scratch, ClassType_Particle}; Classification Type, PI나 TFE등 추가 분류  알고리즘 적용 결과.
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -945,7 +945,7 @@
    SetLastPointCheck(FALSE);
    SetReviewComplete(FALSE);
    SetUploadResultFailCount(0);
    //SetUploadResultFailCount(0);
    bFileFind = FALSE;
@@ -1707,6 +1707,8 @@
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
    }
    SetUploadResultFailCount(0);
    CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
    if (pGlassResult == NULL) return;
@@ -1807,6 +1809,7 @@
        if (pTransferData->strProdType != m_pSP2P->ISP2P_System_GetNetworkInfo()->m_strZeroReviewAlarmExcept)
        {
            m_nStackZeroReviewCondition++;
            m_pSP2P->ISP2P_DisplayMessage(_T("Zero Review Condition ProdType = %s, ConditionStack = %d, AlarmExcept = %s, AlarmCondition = %d"), pTransferData->strProdType, m_nStackZeroReviewCondition, m_pSP2P->ISP2P_System_GetNetworkInfo()->m_strZeroReviewAlarmExcept, m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nZeroReviewAlarm);
            if (m_nStackZeroReviewCondition >= m_pSP2P->ISP2P_System_GetNetworkInfo()->m_nZeroReviewAlarm)
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("Zero Review Alarm! %d ea Glass Is Zero Review!"), m_nStackZeroReviewCondition);
@@ -8392,13 +8395,16 @@
    if (UploadResult == FALSE)
    {
        UploadResultFailCount++;
        if (UploadResultFailCount >= 2)
        if (UploadResultFailCount >= 3)
        {
            m_pSP2P->ISP2P_DisplayMessage(_T("ResultFile Upload Fail!"));
            SendSignalToSignalControl(PCControlSendSignalIndex_State, PCControlSend_ResultData_Upload_Fail, 1000);
            SetUploadResultFailCount(-1);
        }
        SetUploadResultFailCount(UploadResultFailCount);
        else
        {
            SetUploadResultFailCount(UploadResultFailCount);
        }
    }
}