SDC C-Project CF Review 프로그램
9cbd9e554f9956b3b945b51602f1d4a3fa0353e1..f9623afb8161f603b14493bea20f6c640152d1ea
2021-08-23 LYW
머지간 오류 수정
f9623a 비교 | 트리
2021-08-18 LYW
Merge branch 'feature/#3561_CF_AOI_Review_Align_카메라_끊김_현상_조치' into feature/...
6c4831 비교 | 트리
2021-08-17 LYW
Ongoing100 #3561 CF AOI Review Align 카메라 끊김 현상 조치
572aeb 비교 | 트리
2021-08-17 LYW
Ongoing50 #3584 CF AOI Review 시뮬레이션 기능 정상화
67bcde 비교 | 트리
2021-08-17 LYW
이전 머지간 누락된 코드 삽입
9aa3a8 비교 | 트리
2021-08-10 LYW
Ongoing50 #3562 CF AOI Review 실행 프로그램 경로 변경
8ac735 비교 | 트리
2021-08-10 LYW
1. Defect Picking 기능 OFF
ebfd7a 비교 | 트리
2021-08-09 LYW
Ongoing90 #3563 CF AOI Review Offset 파라미터 저장시 완료 팝업 추가
2ecc61 비교 | 트리
2021-08-09 LYW
Merge branch 'feature/#3477_CF_AOI_Review_FrameLost_현상_조치' into develop
5c62f2 비교 | 트리
2021-08-09 LYW
Ongoing70 #3477 CF AOI Review [BANK, OC, QD, Blue] FrameL...
a559b5 비교 | 트리
2021-08-09 LYW
Ongoing50 #3561 CF AOI Review Align 카메라 끊김 현상 조치
b354c1 비교 | 트리
2021-07-29 LYW
Ongoing70 #3477 CF AOI Review [BANK, OC, QD, Blue] FrameL...
4f526f 비교 | 트리
2021-07-29 LYW
Ongoing90 #3524 CF AOI Review 디포커스 알람 추가 및 FDC 보고 방식 개선
bd13fa 비교 | 트리
2021-07-27 LYW
주석 변경
281a73 비교 | 트리
2021-07-23 LYW
Ongoing60 #3524 CF AOI Review 디포커스 알람 추가 및 FDC 보고 방식 개선
55615e 비교 | 트리
2021-07-23 LYW
Ongoing90 #3517 CF AOI Review 자가진단 기능 개선
a65523 비교 | 트리
2021-07-19 LYW
Ongoing60 #3517 CF AOI Review 자가진단 기능 개선
2bd50e 비교 | 트리
2021-07-09 LYW
Merge branch 'feature/#3495_CF_AOI_Review(QD,_Blue)_Glass...
834d74 비교 | 트리
2021-07-09 LYW
merge 오류 수정
527c18 비교 | 트리
2021-07-09 LYW
Merge branch 'feature/#3486_CF_AOI_Review_Review_History_프로그램_테스트_및_적용' int...
6e0a9d 비교 | 트리
2021-07-09 LYW
Merge branch 'feature/#3486_CF_AOI_Review_Review_History_프로그램_테스트_및_적용' int...
6e6728 비교 | 트리
2021-07-09 LYW
Ongoing100 #3495 CF AOI Review[QD, Blue] GlassLoading 시 다운 현상 조치
6bb39b 비교 | 트리
2개 파일 추가됨
81개 파일 변경됨
4564 ■■■■■ 파일 변경됨
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc 21 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp 122 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h 14 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp 77 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp 396 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h 65 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/resource.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawClient.cpp 29 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawClient.h 16 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawStruct.h 253 ●●●● 패치 | 보기 | raw | blame | 히스토리
Internal_Library/CHCameraControl_Pylon/CHCameraControlPylon.vcxproj 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
Internal_Library/CHCameraControl_Pylon/CameraControl_Pylon.cpp 8 ●●●●● 패치 | 보기 | raw | blame | 히스토리
Internal_Library/CHCameraControl_Sapera/CameraControl_Sapera.cpp 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
Internal_Library/CHWsiControls/WsiControl_Dit.cpp 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
Internal_Library/Include/CHWsiControls/WsiControlInfo.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp 11 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/DitGlassRawServer.h 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h 253 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/bin/Config/PathSetting.ini 2 ●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/bin/ReviewHistroy.exe 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHAlignFinder/AlignFinder.cpp 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHDefectPicker/DefectPicker.cpp 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHReviewResult/GlassResult.cpp 12 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/CHReviewSetting/Sys_SignalManager.cpp 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/DiagnosisInfo.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/DiagnosisManager.cpp 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp 282 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/M_AutoDiagnosisManager.vcxproj 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/DlgReview.cpp 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/ReviewRecipeEditorDlg.cpp 156 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewRecipeEditor/stdafx.h 49 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/CameraControlAlign.cpp 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/CameraControlReview.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DisplayMessage.cpp 17 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.cpp 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawStruct.h 253 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgControl.cpp 28 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgControl.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgReviewOffSetTool.cpp 11 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgReviewOffSetTool.h 6 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Flatness.cpp 27 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Setting.cpp 53 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Setting.h 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Squareness.cpp 207 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Squareness.h 17 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp 103 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h 5 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/FileUploadControl.cpp 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/MainFrm.cpp 17 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/MainFrm.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewInterface.cpp 116 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewInterface.h 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor.h 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp 404 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewSystem.cpp 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewSystem.rc 202 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewSystem.vcxproj 5 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor.cpp 10 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor.h 22 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 813 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/resource.h 44 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/stdafx.h 63 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/DlgSignal.cpp 13 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/DlgSignal.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/ReviewSystemSetting.rc 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/ReviewSystemSettingDlg.cpp 77 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/resource.h 10 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystemSetting/stdafx.h 39 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/CHReviewRecipe/RsRcpAlignInfo.h 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/CHSignalControls/SignalControlInfo.h 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisInfo.h 49 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisManager.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.rc
@@ -131,20 +131,23 @@
    LTEXT           "-",IDC_STATIC_SERVERCMD,451,61,102,8
    PUSHBUTTON      "Test1",IDC_TEST1,136,45,43,14,NOT WS_VISIBLE
    PUSHBUTTON      "Test2",IDC_TEST2,136,60,43,14,NOT WS_VISIBLE
    GROUPBOX        "Stack File",IDC_STATIC,7,82,216,75
    CONTROL         "Use Stack File Read",IDC_CHECK_STACKFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,19,97,77,10
    EDITTEXT        IDC_EDIT_STACK_LOCALSAVEPATH,57,115,163,14,ES_AUTOHSCROLL
    LTEXT           "Local Path :",IDC_STATIC,14,117,40,8
    GROUPBOX        "DownLoad File",IDC_STATIC,7,82,216,75
    CONTROL         "",IDC_CHECK_STACKFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,99,16,10
    EDITTEXT        IDC_EDIT_STACK_LOCALSAVEPATH,94,96,121,14,ES_AUTOHSCROLL
    PUSHBUTTON      "Apply",IDC_BTN_STACKAPPLY,180,139,39,14
    PUSHBUTTON      "Send",IDC_TEST_CMD,110,60,20,14,WS_DISABLED
    LTEXT           "Command : ",IDC_STATIC,17,63,39,8
    COMBOBOX        IDC_CMB_COMMAND,61,61,48,128,CBS_DROPDOWNLIST | WS_DISABLED | WS_VSCROLL | WS_TABSTOP
    EDITTEXT        IDC_EDIT_STACK_EQUIPID,45,133,32,14,ES_AUTOHSCROLL
    LTEXT           "Equip ID :",IDC_STATIC,11,136,32,8
    EDITTEXT        IDC_EDIT_STACK_PARAM1,113,134,24,14,ES_AUTOHSCROLL
    LTEXT           "Param :",IDC_STATIC,85,137,28,8
    EDITTEXT        IDC_EDIT_STACK_PARAM2,139,134,24,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_STACK_EQUIPID,45,133,32,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
    LTEXT           "Equip ID :",IDC_STATIC,11,136,32,8,NOT WS_VISIBLE
    EDITTEXT        IDC_EDIT_STACK_PARAM1,113,134,24,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
    LTEXT           "Param :",IDC_STATIC,85,137,28,8,NOT WS_VISIBLE
    EDITTEXT        IDC_EDIT_STACK_PARAM2,139,134,24,14,ES_AUTOHSCROLL | NOT WS_VISIBLE
    PUSHBUTTON      "Manual\nFTP Upload",IDC_BTN_FTP_MANUALUPLOAD,418,20,39,31,BS_MULTILINE | WS_DISABLED
    LTEXT           "Stack File",IDC_STATIC,16,100,30,8
    LTEXT           "RawMerge File",IDC_STATIC,15,115,46,8
    CONTROL         "",IDC_CHECK_RAWMERGEFILEREAD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,115,16,10
    EDITTEXT        IDC_EDIT_RAWMERGE_LOCALSAVEPATH,94,112,121,14,ES_AUTOHSCROLL
END
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj
@@ -234,6 +234,7 @@
    <ClCompile Include="GlassRawRTMS.cpp" />
    <ClCompile Include="InterfaceFTP.cpp" />
    <ClCompile Include="MacroResultFile.cpp" />
    <ClCompile Include="RawResultReader.cpp" />
    <ClCompile Include="StackResultCPJT.cpp" />
    <ClCompile Include="StackResultCSOT.cpp" />
    <ClCompile Include="stdafx.cpp">
@@ -261,6 +262,7 @@
    <ClInclude Include="GlassRawRTMS.h" />
    <ClInclude Include="InterfaceFTP.h" />
    <ClInclude Include="MacroResultFile.h" />
    <ClInclude Include="RawResultReader.h" />
    <ClInclude Include="Resource.h" />
    <ClInclude Include="StackResultCPJT.h" />
    <ClInclude Include="StackResultCSOT.h" />
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters
@@ -93,6 +93,9 @@
    <ClCompile Include="StackResultCPJT.cpp">
      <Filter>RawInterface\Stack</Filter>
    </ClCompile>
    <ClCompile Include="RawResultReader.cpp">
      <Filter>RawInterface\Stack</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="akLoggerExt.h">
@@ -161,6 +164,9 @@
    <ClInclude Include="StackResultCPJT.h">
      <Filter>RawInterface\Stack</Filter>
    </ClInclude>
    <ClInclude Include="RawResultReader.h">
      <Filter>RawInterface\Stack</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <None Include="res\DitGlassRawMessenger.ico">
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -1,5 +1,5 @@
// DitGlassRawMessengerDlg.cpp : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
// DitGlassRawMessengerDlg.cpp : êµ¬í˜„ íŒŒì¼
//
#include "stdafx.h"
@@ -23,20 +23,20 @@
#define GRID_TEXT_COLOR            RGB(255,255,255)
#define GRID_ALARM_TEXT_COLOR    RGB(255,0,0)
#define GRID_LINE_COLOR            GRID_FIX_COLOR
// ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ç´ï¿½ CAboutDlg ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
// ì‘ìš© í”„로그램 ì •보에 ì‚¬ìš©ë˜ëŠ” CAboutDlg ëŒ€í™” ìƒìžìž…니다.
class CAboutDlg : public CDialog
{
public:
    CAboutDlg();
// ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
// ëŒ€í™” ìƒìž ë°ì´í„°ìž…니다.
    enum { IDD = IDD_ABOUTBOX };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ì§€ì›ìž…니다.
// ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
// êµ¬í˜„입니다.
protected:
    DECLARE_MESSAGE_MAP()
};
@@ -54,7 +54,7 @@
END_MESSAGE_MAP()
// CDitGlassRawMessengerDlg ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½
// CDitGlassRawMessengerDlg ëŒ€í™” ìƒìž
@@ -127,7 +127,7 @@
    m_vecStrGridDefectHeader.push_back("CellY(mm)");
    m_vecStrGridDefectHeader.push_back("ScrtRatio");
    m_vecStrGridDefectHeader.push_back("Density");
    //201207 CJH - Merge ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½
    //201207 CJH - Merge ì—¬ë¶€ í™•인
    m_vecStrGridDefectHeader.push_back("MergeState");
}
@@ -192,16 +192,16 @@
    if (timestruct.tm_mon>11 || timestruct.tm_mon<0 )
        ASSERT(FALSE);
}
// CDitGlassRawMessengerDlg ï¿½Þ½ï¿½ï¿½ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½
// CDitGlassRawMessengerDlg ë©”시지 ì²˜ë¦¬ê¸°
BOOL CDitGlassRawMessengerDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    DragAcceptFiles(TRUE);
    // ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½Þ´ï¿½ï¿½ï¿½ "����..." ï¿½Þ´ï¿½ ï¿½×¸ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    // ì‹œìŠ¤í…œ ë©”뉴에 "정보..." ë©”뉴 í•­ëª©ì„ ì¶”가합니다.
    // IDM_ABOUTBOX�� ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö¾ï¿½ï¿½ ï¿½Õ´Ï´ï¿½.
    // IDM_ABOUTBOX는 ì‹œìŠ¤í…œ ëª…ë ¹ ë²”위에 ìžˆì–´ì•¼ í•©ë‹ˆë‹¤.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
@@ -219,16 +219,16 @@
        }
    }
    // ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Æ´ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
    //  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, TRUE);            // Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, FALSE);        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    // ì´ ëŒ€í™” ìƒìžì˜ ì•„이콘을 ì„¤ì •합니다. ì‘ìš© í”„로그램의 ì£¼ ì°½ì´ ëŒ€í™” ìƒìžê°€ ì•„닐 ê²½ìš°ì—ëŠ”
    //  í”„레임워크가 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
    SetIcon(m_hIcon, TRUE);            // í° ì•„이콘을 ì„¤ì •합니다.
    SetIcon(m_hIcon, FALSE);        // ìž‘은 ì•„이콘을 ì„¤ì •합니다.
    //Ʈ���̾����� ï¿½ï¿½ï¿½ï¿½
    //트레이아이콘 êµ¬ì„±
    m_TrayIcon = FALSE;
    ResTrayIcon();
    //��� ï¿½ï¿½ï¿½ï¿½
    //빌드 ì •ë³´
    {
        CString strBuild;
        tm tmBuild;
@@ -237,7 +237,7 @@
        SetDlgItemText(IDC_BUILDDATE, strBuild);
    }
    //�������� ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¾ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/20]
    //설정파일 ì •ë³´ ì½ì–´ ì˜¤ê¸° [김태현 2018/11/20]
    {
        m_strConfigFile;
        {
@@ -254,6 +254,8 @@
        akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "c:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
        akFileDB.getItem("Stack_Use", &m_ConfigOption.m_bUseStack, 0);
        akFileDB.getItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath, "D:\\DIT_ResultData\\Stack");
        akFileDB.getItem("RawMerge_Use", &m_ConfigOption.m_bUseRawMerge, 0);
        akFileDB.getItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath, "D:\\DIT_ResultData\\RawMerge");
        akFileDB.getItem("Stack_EquipID",m_ConfigOption.m_strStackEquipID, "AAAAA");
        akFileDB.getItem("Stack_Param1",m_ConfigOption.m_strStackParam1, "");
        akFileDB.getItem("Stack_Param2",m_ConfigOption.m_strStackParam2, "");
@@ -263,12 +265,14 @@
        ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->SetCheck(m_ConfigOption.m_bUseStack);
        SetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH, m_ConfigOption.m_strStackLocalPath);
        ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->SetCheck(m_ConfigOption.m_bUseRawMerge);
        SetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath);
        SetDlgItemText(IDC_EDIT_STACK_EQUIPID, m_ConfigOption.m_strStackEquipID);
        SetDlgItemText(IDC_EDIT_STACK_PARAM1, m_ConfigOption.m_strStackParam1);
        SetDlgItemText(IDC_EDIT_STACK_PARAM2, m_ConfigOption.m_strStackParam2);
    }
    //�α� ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/20]
    //로그 ê´€ë ¨ [김태현 2018/11/20]
    {
        CakFileUtil fileutil;
        char strPath[256];
@@ -371,30 +375,30 @@
    if(m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE)
    {
        AfxMessageBox("���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Õ´Ï´ï¿½.");
        AfxMessageBox("서버 ìƒì„± ì‹¤íŒ¨ ì¢…료 í•©ë‹ˆë‹¤.");
        exit(0);
    }
    //���簪 ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/12]
    //현재값 ì ìš© [김태현 2019/1/12]
    {
        CDitGlassRawServer* pServer = (CDitGlassRawServer*) &m_Server;
        CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
        pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
    }
    
    //�۾� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/13]
    //작업 ì“°ë ˆë“œ ìƒì„± [김태현 2018/11/13]
    {
        _beginthread(threadMain, NULL, this);
    }
    
    PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
    return TRUE;  // ï¿½ï¿½Ä¿ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ TRUE�� ï¿½ï¿½È¯ï¿½Õ´Ï´ï¿½.
    return TRUE;  // í¬ì»¤ìŠ¤ë¥¼ ì»¨íŠ¸ë¡¤ì— ì„¤ì •하지 ì•Šìœ¼ë©´ TRUE를 ë°˜í™˜í•©ë‹ˆë‹¤.
}
void CDitGlassRawMessengerDlg::OnBnClickedOk()
{
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    OnOK();
}
@@ -403,14 +407,14 @@
{
    NOTIFYICONDATA nid;
    nid.cbSize = sizeof(nid);
    nid.hWnd = m_hWnd; // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Úµï¿½
    nid.uID = IDR_MAINFRAME; // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ò½ï¿½ ID
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // ï¿½Ã·ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    nid.uCallbackMessage = UM_TRAYICON_MSG; // ï¿½Ý¹ï¿½Þ½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½
    nid.hWnd = m_hWnd; // ë©”인 ìœˆë„ìš° í•¸ë“¤
    nid.uID = IDR_MAINFRAME; // ì•„이콘 ë¦¬ì†ŒìФ ID
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // í”Œëž˜ê·¸ ì„¤ì •
    nid.uCallbackMessage = UM_TRAYICON_MSG; // ì½œë°±ë©”시지 ì„¤ì •
    nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // ì•„이콘 ë¡œë“œ
    char strTitle[256];
    GetWindowText(strTitle, sizeof(strTitle)); // Ä¸ï¿½Ç¹Ù¿ï¿½ ï¿½ï¿½Âµï¿½ ï¿½ï¿½ï¿½Ú¿ï¿½ ï¿½ï¿½ï¿½ï¿½
    GetWindowText(strTitle, sizeof(strTitle)); // ìº¡ì…˜ë°”에 ì¶œë ¥ëœ ë¬¸ìžì—´ ì–»ìŒ
    lstrcpy(nid.szTip, strTitle);
    Shell_NotifyIcon(NIM_ADD, &nid);
    SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon);
@@ -433,7 +437,7 @@
        GetCursorPos(&pos);
        {
            HMENU hMenu = CreatePopupMenu();
            AppendMenu(hMenu, MF_STRING, 0, "������2��Ʈ��ǰ");
            AppendMenu(hMenu, MF_STRING, 0, "연구소2파트작품");
            AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit");
            TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL);
        }
@@ -461,19 +465,19 @@
    }
}
// ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú¿ï¿½ ï¿½Ö¼ï¿½È­ ï¿½ï¿½ï¿½ß¸ï¿½ ï¿½ß°ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½ï¿½ï¿½ï¿½
//  ï¿½Æ·ï¿½ ï¿½Úµå°¡ ï¿½Ê¿ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½/�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
//  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
// ëŒ€í™” ìƒìžì— ìµœì†Œí™” ë‹¨ì¶”를 ì¶”가할 ê²½ìš° ì•„이콘을 ê·¸ë¦¬ë ¤ë©´
//  ì•„래 ì½”드가 í•„요합니다. ë¬¸ì„œ/ë·° ëª¨ë¸ì„ ì‚¬ìš©í•˜ëŠ” MFC ì‘ìš© í”„로그램의 ê²½ìš°ì—ëŠ”
//  í”„레임워크에서 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
void CDitGlassRawMessengerDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // ï¿½×¸ï¿½ï¿½â¸¦ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ì½ï¿½ ï¿½ï¿½ï¿½Ø½ï¿½Æ®
        CPaintDC dc(this); // ê·¸ë¦¬ê¸°ë¥¼ ìœ„한 ë””바이스 ì»¨í…ìŠ¤íŠ¸
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
        // Å¬ï¿½ï¿½ï¿½Ì¾ï¿½Æ® ï¿½ç°¢ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½îµ¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½.
        // í´ë¼ì´ì–¸íЏ ì‚¬ê°í˜•에서 ì•„이콘을 ê°€ìš´ë°ì— ë§žì¶¥ë‹ˆë‹¤.
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
@@ -481,7 +485,7 @@
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½Ï´ï¿½.
        // ì•„이콘을 ê·¸ë¦½ë‹ˆë‹¤.
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
@@ -490,8 +494,8 @@
    }
}
// ï¿½ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Ö¼ï¿½È­ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½È¿ï¿½ Ä¿ï¿½ï¿½ï¿½ï¿½ Ç¥ï¿½ÃµÇµï¿½ï¿½ï¿½ ï¿½Ã½ï¿½ï¿½Û¿ï¿½ï¿½ï¿½
//  ï¿½ï¿½ ï¿½Ô¼ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
// ì‚¬ìš©ìžê°€ ìµœì†Œí™”된 ì°½ì„ ë„는 ë™ì•ˆì— ì»¤ì„œê°€ í‘œì‹œë˜ë„록 ì‹œìŠ¤í…œì—ì„œ
//  ì´ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
HCURSOR CDitGlassRawMessengerDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
@@ -501,15 +505,15 @@
void CDitGlassRawMessengerDlg::OnDropFiles(HDROP hDropInfo)
{
    int nFiles;
    char szPathName[MAX_PATH];  // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Î¸ï¿½ï¿½ï¿½ ï¿½ï¿½î°£ï¿½ï¿½.
    char szPathName[MAX_PATH];  // íŒŒì¼ ê²½ë¡œë©´ì´ ë“¤ì–´ê°„다.
    CString strFileName;
    // ï¿½ï¿½Óµï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // ë“œë¡­ëœ íŒŒì¼ì˜ ê°¯ìˆ˜
    nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH );
    for(int i = nFiles-1 ; i >= 0; i--)  //��ӵ� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Å­ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½é¼­ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Î¸ï¿½ ï¿½Þ¼ï¿½ï¿½ï¿½ ï¿½Ú½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    for(int i = nFiles-1 ; i >= 0; i--)  //드롭된 íŒŒì¼ ê°¯ìˆ˜ë§Œí¼ ë£¨í”„를 ëŒë©´ì„œ íŒŒì¼ ê²½ë¡œë¥¼ ë©”세지 ë°•스로 ì¶œë ¥
    {
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        // íŒŒì¼ì˜ ê²½ë¡œ ì–»ì–´ì˜´
        ::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
        SetDlgItemText(IDC_EDIT_RAWFILENAME, szPathName);
@@ -601,18 +605,18 @@
    if(pRawInfo->m_nCommandIdxWrite != pRawInfo->m_nCommandIdxRead)
    {
        int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï³ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¼ï¿½ ï¿½Ð´Â´ï¿½. [������ 2018/11/13]
        int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //현재는 ì½ì€ ë§ˆì§€ë§‰ í¬ì¸íŠ¸ìž„ìœ¼ë¡œ í•˜ë‚˜ ì¦ê°€ì‹œì¼œì„œ ì½ëŠ”ë‹¤. [김태현 2018/11/13]
        _grmDitCommand::_grmCommand* pCommand = &pRawInfo->m_nCommandBuffer[nReadIdx];
        AKLOG("Recv Command ID:%d(r%d/w%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite);
        pRawInfo->m_nCommandIdxRead = nReadIdx;
        if(pCommand->nResult == -1) //��� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ [������ 2018/11/13]
        if(pCommand->nResult == -1) //명령 ìˆ˜í–‰ ì „ [김태현 2018/11/13]
        {
            pCommand->nResult = ProcessCommand( (emGlassRawCommand)pCommand->nCommand, pCommand->strParam );
        }
        else
        {
            //�̹� Ã³ï¿½ï¿½ ï¿½È°ï¿½ [������ 2018/11/13]
            //이미 ì²˜ë¦¬ ëœê±° [김태현 2018/11/13]
        }
        AKLOG("Recv Command ID:%d(r%d/w%d) Process End(Result:%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite, pCommand->nResult);
@@ -658,7 +662,7 @@
        {
            nResult = m_pGlassRawMaker->SequenceInspectEnd(pRawDataBuffer);
            pServer->GetGlassRawInfo()->m_ServerProcStep = APS_InspectEnd;
            //Stack ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Þ¸ð¸®¿ï¿½ ï¿½Ý¿ï¿½ ï¿½Ï±ï¿½ ï¿½ï¿½ï¿½ï¿½ Export
            //Stack ì •보를 ê³µìœ ë©”모리에 ë°˜ì˜ í•˜ê¸° ìœ„한 Export
            //pRawDataBuffer->ExportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
            break;
        }
@@ -677,7 +681,7 @@
    case grcSequenceCustomReviewDataRead:
        {
            nResult = m_pGlassRawMaker->SequenceCustomizeReview(pRawDataBuffer);
            ////Customize Review�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ®
            ////Customize Review를 ìœ„한 ì—…데이트
            //{
            //    memcpy(pServer->GetDefectData(0), pRawDataBuffer->GetDefectData(0), sizeof(_grmDefectData)*pServer->GetGlassRawInfo()->m_nDefectMaxDataNum);
            //    memcpy(pServer->GetCellData(0), pRawDataBuffer->GetCellData(0), sizeof(_grmCellData)*pServer->GetGlassRawInfo()->m_nCellMaxDataNum);
@@ -777,14 +781,14 @@
    
    if(m_pGlassRawMaker) delete m_pGlassRawMaker;
    
    if(m_TrayIcon) // ï¿½ï¿½ï¿½ï¿½ Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ç¾ï¿½ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½
    if(m_TrayIcon) // í˜„재 íŠ¸ë ˆì´ ì•„이콘으로 ì„¤ì •되었는지 í™•인
    {
        NOTIFYICONDATA nid;
        nid.cbSize = sizeof(nid);
        nid.hWnd = m_hWnd; // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Úµï¿½
        nid.hWnd = m_hWnd; // ë©”인 ìœˆë„ìš° í•¸ë“¤
        nid.uID = IDR_MAINFRAME;
        // ï¿½Û¾ï¿½ Ç¥ï¿½ï¿½ï¿½ï¿½(TaskBar)�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½.
        // ìž‘ì—… í‘œì‹œì¤„(TaskBar)의 ìƒíƒœ ì˜ì—­ì— ì•„이콘을 ì‚­ì œí•œë‹¤.
        Shell_NotifyIcon(NIM_DELETE, &nid);
    }
@@ -942,7 +946,7 @@
BOOL CDitGlassRawMessengerDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    // TODO: ï¿½ï¿½ï¿½â¿¡ Æ¯ï¿½ï¿½È­ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ ï¿½ï¿½/�Ǵ� ï¿½âº» Å¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    // TODO: ì—¬ê¸°ì— íŠ¹ìˆ˜í™”ëœ ì½”드를 ì¶”ê°€ ë°/또는 ê¸°ë³¸ í´ëž˜ìŠ¤ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
    if (m_gridCellInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridCellInfo.GetDlgCtrlID())
    {
        *pResult = 1;
@@ -1264,7 +1268,7 @@
                    CString        str;
                    strItem = _T("          ");
                    // Panel x��, y���� ï¿½Û¶ó½º¿ï¿½ ï¿½Ý´ï¿½ [6/9/2017 bhs]
                    // Panel x축, y축은 ê¸€ë¼ìŠ¤ì™€ ë°˜ëŒ€ [6/9/2017 bhs]
                    if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                        str.Format("% 5.3f", (double)pDefect->m_nUMCellX / 1000.0);
                    else
@@ -1287,7 +1291,7 @@
                    CString        str;
                    strItem = _T("          ");
                    // Panel x��, y���� ï¿½Û¶ó½º¿ï¿½ ï¿½Ý´ï¿½ [6/9/2017 bhs]
                    // Panel x축, y축은 ê¸€ë¼ìŠ¤ì™€ ë°˜ëŒ€ [6/9/2017 bhs]
                    if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                        str.Format("% 5.3f", (double)pDefect->m_nUMCellY / 1000.0);
                    else
@@ -1345,6 +1349,8 @@
    akFileDB.setItem("Stack_Use", m_ConfigOption.m_bUseStack);
    akFileDB.setItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath);
    akFileDB.setItem("RawMerge_Use", m_ConfigOption.m_bUseRawMerge);
    akFileDB.setItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath);
    akFileDB.setItem("Stack_EquipID", m_ConfigOption.m_strStackEquipID);
    akFileDB.setItem("Stack_Param1",m_ConfigOption.m_strStackParam1);
    akFileDB.setItem("Stack_Param2",m_ConfigOption.m_strStackParam2);
@@ -1439,7 +1445,7 @@
void CDitGlassRawMessengerDlg::OnBnClickedBtnImportRaw()
{
    AKLOG("�̱���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ê¿ä°¡ ï¿½Ö°Ú³ï¿½.. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½...");
    AKLOG("이기능은 ê°€ê¸‰ì  í•„요가 ìžˆê² ë‚˜.. ì‹¶ìœ¼ë„¤...");
    PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
}
@@ -1524,6 +1530,8 @@
{
    m_ConfigOption.m_bUseStack = ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->GetCheck();
    GetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH,m_ConfigOption.m_strStackLocalPath, 256);
    m_ConfigOption.m_bUseRawMerge = ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->GetCheck();
    GetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath, 256);
    GetDlgItemText(IDC_EDIT_STACK_EQUIPID,m_ConfigOption.m_strStackEquipID, 32);
    GetDlgItemText(IDC_EDIT_STACK_PARAM1,m_ConfigOption.m_strStackParam1, 32);
    GetDlgItemText(IDC_EDIT_STACK_PARAM2,m_ConfigOption.m_strStackParam2, 32);
@@ -1574,13 +1582,13 @@
    
    
        CString str = _T("All(*.*)|*.*|");    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        CString str = _T("All(*.*)|*.*|");    // ì„ íƒí•  íŒŒì¼ ì¢…류
        CString File;
        CString strFileList; 
        CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this);
        const int c_cMaxFiles = 400 /*������ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½*/ ;    // ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ö¸ï¿½ ï¿½î°³ ï¿½ï¿½ï¿½ï¿½
        const int c_cMaxFiles = 400 /*선택할 íŒŒì¼ ìˆ«ìž*/ ;    // ë©”모리 ë¶€ì¡±í˜„상으로 í™•장 ì•ˆí•´ì£¼ë©´ ëª‡ê°œ ëª»ì”€
        const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
        dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize);
        dlg.GetOFN().nMaxFile = c_cbBuffSize;
@@ -1591,7 +1599,7 @@
        {
            for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
            {
                // ï¿½ï¿½Ã¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ResetContent
                // ì „체삭제는 ResetContent
                File = dlg.GetNextPathName(pos);
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.h
@@ -54,6 +54,9 @@
        char m_strStackEquipID[32];
        char m_strStackParam1[32];
        char m_strStackParam2[32];
        int  m_bUseRawMerge;
        char m_strRawMergeLocalPath[256];
    }m_ConfigOption;
    void WriteConfigFile();
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.cpp
@@ -41,7 +41,8 @@
        || sizeof(_grmBlockData) != m_pGlassRawInfo->m_nSizeOfBlockData
        || sizeof(_grmCellData) != m_pGlassRawInfo->m_nSizeOfCellData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfDefectData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData)
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfRawMergeData)
    {
        return FALSE;
    }
@@ -51,7 +52,8 @@
    m_pGlassRawInfo->m_nCellMaxDataNum = nCellNum;
    m_pGlassRawInfo->m_nDefectMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nStackMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nRawMergeMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nGlassRawDataSize;
    {
        int nDataNum = 0;
@@ -71,6 +73,9 @@
        m_pGlassRawInfo->m_nStackDataPoint = nDataNum;
        nDataNum += (m_pGlassRawInfo->m_nSizeOfStackData + m_pGlassRawInfo->m_nSizeOfStackData % 4)*nDefectNum;
        
        m_pGlassRawInfo->m_nRawMergeDataPoint = nDataNum;
        nDataNum += (m_pGlassRawInfo->m_nSizeOfRawMergeData + m_pGlassRawInfo->m_nSizeOfRawMergeData % 4)*nDefectNum;
        m_pGlassRawInfo->m_nGlassRawDataSize = nDataNum;
    }
    
@@ -125,6 +130,7 @@
            m_pGlassRawInfo->m_nSizeOfCellData = sizeof(_grmCellData);
            m_pGlassRawInfo->m_nSizeOfDefectData = sizeof(_grmDefectData);
            m_pGlassRawInfo->m_nSizeOfStackData = sizeof(_grmDefectData);
            m_pGlassRawInfo->m_nSizeOfRawMergeData = sizeof(_grmDefectData);
            int bytealign = m_pGlassRawInfo->m_nSizeOfGlassData%4;
        }
@@ -178,6 +184,7 @@
    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];
    m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
    return TRUE;
}
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawServer.h
@@ -18,6 +18,7 @@
    _grmCellData*    GetCellData(int nIndex){return &m_pCellData[nIndex];};
    _grmDefectData*    GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
    _grmDefectData*    GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
    _grmDefectData*    GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
    _grmDitGlassRawInfo* GetGlassRawInfo(){return m_pGlassRawInfo;};
@@ -31,7 +32,7 @@
    _grmCellData*   m_pCellData;
    _grmDefectData* m_pDefectData;
    _grmDefectData* m_pStackData;
    _grmDefectData* m_pRawMergeData;
protected:
    HANDLE        m_hMapBasicInfo;
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawBase.h
@@ -3,13 +3,13 @@
#include "DitGlassRawStruct.h"
//////////////////////////////////////////////////////////////////////////
// Recipe���� Server�� Inspector�� ï¿½ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
// Recipe에서 Server와 Inspector가 ê³µìœ í•˜ëŠ” ì„¤ì •ì •ë³´.
enum ThreadCount { Thread_1 = 0, Thread_2, Thread_4, Thread_6, Thread_8, Thread_11, Thread_12, Thread_22, Thread_24 };
enum CameraType { CamType_Unknown = 0, CamType_Transfer, CamType_Reflex };
enum ScanCoordinate { SC_XCoord = 0, SC_YCoord };                    // ï¿½ï¿½Äµï¿½ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ß¿ï¿½.
enum ScanDirectionEng { SD_Right2Left = 0, SD_Left2Right };            // ï¿½Û¾ï¿½ï¿½Ú°ï¿½ ï¿½ï¿½ ï¿½ï¿½Äµ ï¿½ï¿½ï¿½ï¿½.
enum ScanDirectionIns { SD_Forward = 0, SD_Backward, SD_Unknown };    // Glass ï¿½ï¿½ï¿½ï¿½ Scan ï¿½ï¿½ï¿½ï¿½.
enum ScanType { ST_SingleScan = 0, ST_DualScan };                // SingleScan - ï¿½Ü¹ï¿½ï¿½ï¿½, DualScan - ï¿½ï¿½ï¿½ï¿½ï¿½
enum ScanCoordinate { SC_XCoord = 0, SC_YCoord };                    // ìŠ¤ìº”ë°©í–¥. ê²°í•¨ ì¢Œí‘œ ì—°ì‚°ì‹œ ì¤‘ìš”.
enum ScanDirectionEng { SD_Right2Left = 0, SD_Left2Right };            // ìž‘업자가 ë³¸ ìŠ¤ìº” ë°©í–¥.
enum ScanDirectionIns { SD_Forward = 0, SD_Backward, SD_Unknown };    // Glass ê¸°ì¤€ Scan ë°©í–¥.
enum ScanType { ST_SingleScan = 0, ST_DualScan };                // SingleScan - ë‹¨ë°©í–¥, DualScan - ì–‘ë°©í–¥
enum GlassDirection { GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
enum AcqMode { Acq_Unknown = 0, Acq_Grab, Acq_Snap, Acq_Matrox, Acq_Simul };
enum FindBoundary { FB_NotFind = 0, FB_PitchMatching, FB_ManualMatching };
@@ -20,7 +20,7 @@
enum DefectFiltering { Filtering_NO = 0, Filtering_CO, Filtering_Cutoff, Filtering_DXDY, Filtering_TD, Filtering_FALSE };        // Filtering_CO : Cosmic Ray FALSE
enum ALIGN_MARK_CLASSIFY { eAMC_First = 0, eAMC_Second };
//////////////////////////////////////////////////////////////////////////
// Defect�� ï¿½ï¿½ï¿½Ç´ï¿½ Å¸ï¿½Ôµï¿½.
// Defect에 ì‚¬ìš©ë˜ëŠ” íƒ€ìž…들.
enum SERVER_DefectType { DefectType_TBlack = 0, DefectType_TWhite, DefectType_RBlack, DefectType_RWhite, DefectType_BBlack, DefectType_BWhite, DefectType_Unknown };
enum SERVER_DefectSizeType { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
enum SERVER_DefectJudgementType { JudgementType_OK = 0, JudgementType_TR, JudgementType_PR, JudgementType_UNKNOWN };
@@ -34,7 +34,7 @@
enum ReKind { Re_Other, Re_TFE_CIRCLE, Re_PI_CONVEX, Re_PI_CONCAVE, Re_PI_1, Re_PI_2, Re_PI_3 };
//choigudal jude fix 2012.03.07
enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size ï¿½ß°ï¿½
enum Judgement { Judge_OK = 0, Judge_RP, Judge_NG, Judge_TR, Judge_PR, Judge_PT, Judge_Review, Judge_RC, Judge_Size, Judge_VI, Judge_Rework, Judge_Unknown };//2016.07.13 LHS Judge_Size ì¶”ê°€
enum MAP16_DefectClass { CLASS_C1 = 1, CLASS_C2, CLASS_C3, CLASS_C4, CLASS_C5, CLASS_C6, CLASS_C7, CLASS_C8, CLASS_C9, CLASS_C10, CLASS_C11, CLASS_C12, CLASS_C13, CLASS_C14, CLASS_C15, CLASS_C16 };
enum MAP16_SizeType { SIZE_SS = 0, SIZE_SM, SIZE_SL, SIZE_SOH, SIZE_IDX_MAX };
enum MAP16_PeakType { PEEK_PS = 0, PEEK_PL, PEEK_PH, PEEK_POH, PEAK_IDX_MAX };
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -78,7 +78,11 @@
        m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
    }
    if (m_RawMergeResult.getRawMergeUse())
    {
        SendMessageFTPDownloadDataFile(pData->GetGlassData());
        m_RawMergeResult.RawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
    }
    return TRUE;
}
@@ -121,7 +125,13 @@
    _TimeDelay(5000); // ì´ë¯¸ì§€ ë³µì‚¬ ì‹œê°„ ëŒ€ê¸°
    //210218 CJH - ê²€ì‚¬ ì¢…료시 ê²°ê³¼íŒŒì¼ ë° CCD Image ì—…로드
    SendMessageFTPUploadRaw(pData->GetGlassData());
    SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
    BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
    if (bIsBDI)
    {
        SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
    }
    SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh
    return TRUE;
@@ -1800,23 +1810,18 @@
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
{
    if(pGlassData == NULL) return;
    HWND hWnd = ::FindWindow(NULL, "FTPDownloader");
    HWND hWnd = ::FindWindow(NULL, "FTPUploader");
    if(hWnd == NULL) return;
    char strServerFolder[256] = {};
    char strServerFile[256] = {};
    char strLocalFolder[256] = {};
    char pLocalFile[256] = {};
    char pLocalFile[256] = {};
    char strRTMSFile[32] = {};
    char strServerRawFileSubPath[256] = {};
    char strServer_SubFileName[256] = {};
    //GetFormatDescription(FTPCMD_DATAFILE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, pGlassData);
    {
        CString strGlassIDOrg = pGlassData->m_strGlassID;
        CString strGlassID = strGlassIDOrg.Left(12);
        sprintf(strServerFolder, "%s", pGlassData->m_strCassetteSequenceNo);
        sprintf(strServerFile, "%s.dat", strGlassID.GetBuffer(0));
        sprintf(strLocalFolder,  "D:\\DIT_ResultData\\DownloadData");
        sprintf(pLocalFile,  "%s.dat", strGlassID.GetBuffer(0));
    }
    GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
    CFTPCopyDataParam upParam;
    strcpy(upParam.m_strServer_FolderName,            strServerFolder);
@@ -1829,7 +1834,7 @@
    upParam.m_nSendResultCode                            = FALSE;//m_ctrlResultAck.GetCheck();
    upParam.m_nProcessType                                = CFTPCopyDataParam::FTPProcessType_DownFile;
    // [C-PRJ] Image Upload Define - KHT (2020/11/19)
    upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Unknown;
    upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Raw;
    COPYDATASTRUCT cds;
    cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
@@ -1971,7 +1976,7 @@
            else
                sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
            sprintf(pLocalPath, "%s%s", LOCAL_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
            sprintf(pLocalPath, "%s%s", NETWORK_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
            strcpy(pServerFile, "*.*");
            strcpy(pLocalFile, "*.*");
        }
@@ -2129,23 +2134,31 @@
            sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0)); 
        }
        break;
        case FTPCMD_MURA_IMAGE: //0404nwh
        {    //
            /*CTime time = m_tmFileCreateTime;
            sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
                strGlassIDLevel5th.GetBuffer(0),
                strGlassIDLevel8th.GetBuffer(0),
                strGlassID.GetBuffer(0));
                            sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
            strcpy(pServerFile, "*.*");
            strcpy(pLocalFile, "*.*");*/
            if (strGlassID.GetLength() > 6)
                sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
            else
                sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
    case FTPCMD_RAWMERGE:
    {
        sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strStepID,strGlassIDLevel6th.GetBuffer(0)); // ì„œë²„ ê²½ë¡œ í™•인후 ìˆ˜ì • kjg
        sprintf(pServerFile, "%s",strGlassID);
        sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
        sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
    }
        break;
    case FTPCMD_MURA_IMAGE: //0404nwh
    {    //
        /*CTime time = m_tmFileCreateTime;
        sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
            strGlassIDLevel5th.GetBuffer(0),
            strGlassIDLevel8th.GetBuffer(0),
            strGlassID.GetBuffer(0));
                        sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
        strcpy(pServerFile, "*.*");
        strcpy(pLocalFile, "*.*");*/
        if (strGlassID.GetLength() > 6)
            sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
        else
            sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
            sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0)); 
            strcpy(pServerFile, "*.*");
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.h
@@ -7,6 +7,7 @@
#include "MacroResultFile.h"
#include "CustomizeReview.h"
#include "InterfaceFTP.h"
#include "RawResultReader.h"
class CGlassRawCPJT : public CGlassRawBase, public CInterfaceFTP
{
@@ -75,6 +76,7 @@
    CMacroResultFile m_MuraResultFile; //무라용 ê²°ê³¼íŒŒì¼ ìƒì„±ê´€ë¦¬ [김태현 2018/12/5]
    CStackResultCPJT m_StackResult;
    CRawResultReader m_RawMergeResult;
    BOOL    m_bReviewEndCheck;    // InspectEnd ì‹œì— Raw_im í´ë”에 SubFile ìƒì„± ì•ˆí•˜ê¸° ìœ„í•´ ì‚¬ìš© [ 21-03-18 KJG ]
    CTime    m_tmReviewStart;        
    CTime    m_tmReviewEnd;        
DitGlassRawMessenger/DitGlassRawMessenger/InterfaceFTP.h
@@ -15,7 +15,8 @@
        FTPCMD_MURA_IMAGE            ,
        FTPCMD_STACK                ,
        FTPCMD_LINK                ,
        FTPCMD_End
        FTPCMD_End                ,
        FTPCMD_RAWMERGE
    };
public:
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,396 @@
#include "StdAfx.h"
#include "RawResultReader.h"
#include "akLoggerExt.h"
#include "akCore/akFileDB.h"
#include <process.h>
#include "DitGlassRawClient.h"
#include "GlassRawBase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
CRawResultReader::CRawResultReader(void)
{
    m_nThreadStackFileReadFlag = 0;
    m_nProcessState = RPS_StateIdle;
    m_strConfigFile;
    {
        GetModuleFileName(NULL, m_strConfigFile, MAX_PATH);
        char* ext = CakFileUtil::getFileExt(m_strConfigFile);
        strcpy(ext, "ini");
    }
    CreateDirectory("D:\\DIT_ResultData\\RawMerge", NULL);
    m_nProcessState = RPS_StateIdle;
    readOptionFile();
}
CRawResultReader::~CRawResultReader(void)
{
    if (m_nThreadStackFileReadFlag == 1)
    {
        m_nThreadStackFileReadFlag = 2;
        while (m_nThreadStackFileReadFlag != 0)
        {
            Sleep(1);
        }
    }
    m_vecStackDefect.clear();
}
BOOL CRawResultReader::openFile(char* pGlassID)
{
    CString strFileName;
    CDitGlassRawClient    GlassRawClient;
    GlassRawClient.ConnectServer();
    CDitGlassRawClient* pShared = &GlassRawClient;
    _grmDefectData* pGrmStack;
    strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
    FILE* pf = fopen(strFileName.GetBuffer(0), "r");
    if (pf == NULL)
        return FALSE;
    std::vector<_grmDefectData> vecStackDefect;
    _grmDefectData StackDefect;
    char buffer[2048];
    char* pReadPoint = NULL;
    char *pStr;
    CString tempStr, strRight;
    while (!feof(pf)) //Data ì‹œìž‘
    {
        pStr = fgets(buffer, 2048, pf);
        if (strncmp(buffer, "DATA", 4)) continue;
        if (strlen(buffer) <= 0 || pStr == NULL)
            break;
        if (strncmp(buffer, "DATA DEFECT", 10)) continue;
        //Defect Stack Start
        {
            pReadPoint = buffer;
            int temp;
            CString strtemp;
            pReadPoint = getParsingData(pReadPoint, 4, &temp);
            pReadPoint = getParsingData(pReadPoint, 6, &temp);
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);
            //Cell ID로 idx ì°¾ê¸°
            {
                tempStr = strtemp.Right(2);
                int nUpper = atoi(tempStr.Left(1));
                nUpper *= 36;
                char ctemp[2];
                strRight = tempStr.Right(1);
                strcpy(ctemp, strRight);
                int nLower = static_cast<int>(ctemp[0]);
                if (48 <= nLower && nLower <= 57)
                    nLower = 43 /* 65+26+17 */ + nLower;
                nLower -= 65;
                StackDefect.m_nCellIdx = nUpper + nLower;
            }
            pReadPoint = getParsingData(pReadPoint, 5, &temp);
            pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignX);
            pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nUMCenterAlignY);
            StackDefect.m_nUMCenterAlignY = StackDefect.m_nUMCenterAlignY*-1;
            pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellGate);
            pReadPoint = getParsingData(pReadPoint, 6, &StackDefect.m_nCellData);
            pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nPixelSize);
            pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUMSizeX);
            pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUMSizeY);
            pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nDefectRScale);
            pReadPoint = getParsingData(pReadPoint, 4, &strtemp); //StackDefect.m_DefectJudgement
            if (strtemp == "OK")
                StackDefect.m_DefectJudgement = Judge_OK;
            else if (strtemp == "TR")
                StackDefect.m_DefectJudgement = Judge_TR;
            else if (strtemp == "PR")
                StackDefect.m_DefectJudgement = Judge_PR;
            else
                StackDefect.m_StackInfo = Stack_Unknown;
            pReadPoint = getParsingData(pReadPoint, 4, &strtemp);
            strncpy(StackDefect.m_strDefectCode, strtemp.GetBuffer(0), 4+1); // Null ë¬¸ìž ë–„문에 +1
            pReadPoint = getParsingData(pReadPoint, 2, &strtemp);
            if (strtemp == "UK")
                StackDefect.m_StackInfo = Stack_Unknown;
            else if (strtemp == "TD")
                StackDefect.m_StackInfo = Stack_TD;
            else if (strtemp == "SD")
                StackDefect.m_StackInfo = Stack_SD;
            else if (strtemp == "PD")
                StackDefect.m_StackInfo = Stack_PD;
            else if (strtemp == "SP")
                StackDefect.m_StackInfo = Stack_SP;
            else
                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);
            pReadPoint = getParsingData(pReadPoint, 16, &strtemp); // ReviewImageName m_strRevImageName
            pReadPoint = getParsingData(pReadPoint, 12, &temp); // ë¯¸ì‚¬ìš©
            pReadPoint = getParsingData(pReadPoint, 12, &temp); // ë¯¸ì‚¬ìš©
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp); // ZoneNum m_sZonePixelCount[i]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSizeType
            if (strtemp == "S")
                StackDefect.m_DefectSizeType = SizeType_Small;
            else if (strtemp == "M")
                StackDefect.m_DefectSizeType = SizeType_Mid;
            else if (strtemp == "L")
                StackDefect.m_DefectSizeType = SizeType_Large;
            else if (strtemp == "H")
                StackDefect.m_DefectSizeType = SizeType_Huge;
            else if (strtemp == "U")
                StackDefect.m_DefectSizeType = SizeType_Ultra;
            else
                StackDefect.m_DefectSizeType = SizeType_Small;
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectSubType
            if (strtemp == "MC")
                StackDefect.m_DefectSubType = DefectSubType_MC;
            else if (strtemp == "MD")
                StackDefect.m_DefectSubType = DefectSubType_Mask;
            else if (strtemp == "CD")
                StackDefect.m_DefectSubType = DefectSubType_Common;
            else if (strtemp == "NO")
                StackDefect.m_DefectSubType = DefectSubType_NoDefect;
            else if (strtemp == "N")
                StackDefect.m_DefectSubType = DefectSubType_Normal;
            else
                StackDefect.m_DefectSubType = DefectSubType_Normal;
            pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[1]
            pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_ReviewDefect.m_fWsi_ResultData[3]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//미사용
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMin);//m_nLevelSrcMin
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcMax);//m_nLevelSrcMax
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelSrcAvg);//m_nLevelSrcAvg
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_sDefectPeak);//m_sDefectPeak
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_strWsi_3DImageFilename
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_strAoiImageName
            strncpy(StackDefect.m_strAoiImageName, strtemp.GetBuffer(0), 12);
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nScanIdx);//m_nScanIdx
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCameraID);//m_nCameraID
            pReadPoint = getParsingData(pReadPoint, 12, &temp);//m_nDefectIdx
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMin);//m_nLevelRefMin
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefMax);//m_nLevelRefMax
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nLevelRefAvg);//m_nLevelRefAvg
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[4]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[5]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[6]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_nHliLayers
            StackDefect.m_nHliLayers = 0;
            {
                CString   resToken;
                int curPos = 0, idx = 0;
                resToken = strtemp.Tokenize(_T(","), curPos);
                while (resToken != "")
                {
                    int nShiftCnt = atoi(resToken);
                    StackDefect.m_nHliLayers = StackDefect.m_nHliLayers +( 1 << nShiftCnt );
                    resToken = strtemp.Tokenize(_T(","), curPos);
                }
            }
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nCompact);//m_nCompact
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nThickness);//m_nThickness
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMajor);//m_nMajor
            pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_nMinor);//m_nMinor
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_ReviewDefect.m_fWsi_ResultData[0]
            pReadPoint = getParsingData(pReadPoint, 12, &strtemp);//m_DefectType
            if (strtemp == "RB")
                StackDefect.m_DefectType = DefectType_RBlack;
            else if (strtemp == "RW")
                StackDefect.m_DefectType = DefectType_RWhite;
            else if (strtemp == "TB")
                StackDefect.m_DefectType = DefectType_TBlack;
            else if (strtemp == "TW")
                StackDefect.m_DefectType = DefectType_TWhite;
            else if (strtemp == "UN")
                StackDefect.m_DefectType = DefectType_Unknown;
            else
                StackDefect.m_DefectType = DefectType_Unknown;
            vecStackDefect.push_back(StackDefect);
        }
    }
    AKLOG("Read RawMerge Size : %d", vecStackDefect.size());
    fclose(pf);
    m_vecStackDefect = vecStackDefect;
    for (int i = 0; i < m_vecStackDefect.size(); i++)
    {
        pGrmStack = pShared->GetRawMergeData(i);
        pGrmStack->clear();
        memcpy(pGrmStack, &m_vecStackDefect[i], sizeof(_grmDefectData));
    }
    pShared->GetGlassData()->m_nRawMergeNum = m_vecStackDefect.size(); // RawMerge
    pShared->GetGlassData()->m_bRawMergeRead = TRUE;
    AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
    return TRUE;
}
char* CRawResultReader::getParsingData(char* pBuf, int nLen, CString* pOutData)
{
    for (int i = nLen - 1; i >= 0; i--)
    {
        if (pBuf[i] != ' ')
        {
            pBuf[i + 1] = 0;
            break;
        }
    }
    *pOutData = pBuf;
    return &pBuf[nLen + 1]; //구분자 ê±´ë„ˆ ë›°ì–´ì„œ ë‹¤ìŒ ì½ì„ í¬ì¸íЏ ë„˜ê²¨ì¤€ë‹¤
}
char* CRawResultReader::getParsingData(char* pBuf, int nLen, short* pOutData)
{
    pBuf[nLen] = 0;
    *pOutData = atoi(pBuf);
    return &pBuf[nLen + 1]; //구분자 ê±´ë„ˆ ë›°ì–´ì„œ ë‹¤ìŒ ì½ì„ í¬ì¸íЏ ë„˜ê²¨ì¤€ë‹¤
}
char* CRawResultReader::getParsingData(char* pBuf, int nLen, int* pOutData)
{
    pBuf[nLen] = 0;
    *pOutData = atoi(pBuf);
    return &pBuf[nLen + 1]; //구분자 ê±´ë„ˆ ë›°ì–´ì„œ ë‹¤ìŒ ì½ì„ í¬ì¸íЏ ë„˜ê²¨ì¤€ë‹¤
}
BOOL CRawResultReader::readOptionFile(char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/)
{
    if (pFileName == NULL) pFileName = m_strConfigFile;
    CakFileDB akFileDB;
    akFileDB.openfile(pFileName);
    akFileDB.getItem("RawMerge_Use", &m_bStackUse, 0);
    akFileDB.getItem("RawMerge_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\RawMerge");
    if (m_bStackUse && m_nThreadStackFileReadFlag == 0)
    {
        _beginthread(threadResultFileRead, NULL, this);
    }
    return TRUE;
}
void CRawResultReader::threadResultFileRead(void* pArg)
{
    CRawResultReader* pThis = (CRawResultReader*)pArg;
    pThis->m_nThreadStackFileReadFlag = 1;
    int nReadFailCount = 0;
    int nThreadCount = 0;
    CString strGlassID;
    while (pThis->m_nThreadStackFileReadFlag == 1)
    {
        if (pThis->m_nProcessState == RPS_CmdFileRead) //스택파일 ì½ê¸° ìˆ˜í–‰ [김태현 2019/1/12]
        {
            strGlassID = pThis->m_strGlassID;
            pThis->m_nProcessState = RPS_StateFileRead;
            nThreadCount = 0;
            nReadFailCount = 0;
            AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
            Sleep(3000);
            while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1)
            {
                if ((nThreadCount++ % 20) != 0) //명령 ìˆ˜í–‰ì„ ë¹ ë¥´ê²Œ ê°ì§€ ìœ„한 ì¡°ì¹˜
                {
                    Sleep(50);
                    continue;
                }
                if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
                {
                    pThis->m_nProcessState = RPS_ResultReadOK;
                    AKLOG("RawMerge File Read Complete ");
                    break;
                }
                nReadFailCount++;
                AKLOG("RawMerge File Read Try : %d", nReadFailCount);
                if (nReadFailCount > 10)
                {
                    pThis->m_nProcessState = RPS_ResultReadFail;
                    break;
                }
                Sleep(50);
            }
            if (pThis->m_nProcessState != RPS_ResultReadOK)
            {
                pThis->m_nProcessState = RPS_ResultReadFail;
            }
        }
        if (nReadFailCount)
            Sleep(500);
    }
    pThis->m_nThreadStackFileReadFlag = 0;
}
BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID)
{
    if (m_nThreadStackFileReadFlag == 0)
    {
        _beginthread(threadResultFileRead, NULL, this);
    }
    if (m_nProcessState == RPS_StateFileRead)
    {
        m_nProcessState = RPS_CmdFileStop;
        while (m_nProcessState == RPS_CmdFileStop) Sleep(0);
    }
    m_strGlassID = pGlassID;
    m_nProcessState = RPS_CmdFileRead;
    return TRUE;
}
BOOL CRawResultReader::RawMergeFileReadStop(BOOL bWait/*=TRUE*/)
{
    /*
    if (bWait == TRUE && m_nProcessState == SPS_StateFileRead)
    {
        m_nProcessState = SPS_CmdFileStop;
        while (m_nProcessState == SPS_CmdFileStop) Sleep(0);
    }
    */
    return TRUE;
}
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
»õ ÆÄÀÏ
@@ -0,0 +1,65 @@
#pragma once
#include "DitGlassRawStruct.h"
#include <vector>
#include "akCore/akFileUtil.h"
class CRawResultReader
{
public:
    CRawResultReader(void);
    virtual ~CRawResultReader(void);
protected:
    enum emReadProcessState
    {
        RPS_StateIdle = 0,
        RPS_StateFileRead, //읽기 ìˆ˜í–‰ ì¤‘
        RPS_ResultReadOK,
        RPS_ResultReadFail,
        RPS_CmdFileRead, //읽기 ëª…ë ¹ ìˆ˜í–‰
        RPS_CmdFileStop, //읽기 ëª…ë ¹ ìˆ˜í–‰ ì¤‘ì§€
        RPS_Num
    };
public:
    void clear()
    {
        m_vecStackDefect.clear();
    }
    BOOL RawMergeFileReadStart(char* pGlassID);
    BOOL RawMergeFileReadStop(BOOL bWait = TRUE);
    BOOL IsRead() { return m_nProcessState == RPS_ResultReadOK ? TRUE : FALSE; }
    int GetDefectNum() { return (int)m_vecStackDefect.size(); }
    _grmDefectData* GetDefect(int i) { return &m_vecStackDefect[i]; }
    BOOL readOptionFile(char* pFileName = NULL);
    BOOL getRawMergeUse() { return m_bStackUse; };
    char* getRawMergeLocalPath() { return m_strLocalPath; };
protected:
    BOOL openFile(char* pGlassID);
    static void threadResultFileRead(void* pArg);
    int    m_nThreadStackFileReadFlag;
protected:
    char m_strConfigFile[MAX_PATH];
    BOOL m_bStackUse;
    char m_strLocalPath[MAX_PATH];
    emReadProcessState m_nProcessState;//-1:읽기실패,0:Idle, 1:읽기성공, 2:읽기시도(읽기중)
    std::vector<_grmDefectData> m_vecStackDefect;
    CString    m_strGlassID;
protected:
    char* getParsingData(char* pBuf, int nLen, CString* pOutData);
    char* getParsingData(char* pBuf, int nLen, int* pOutData);
    char* getParsingData(char* pBuf, int nLen, short* pOutData);
};
DitGlassRawMessenger/DitGlassRawMessenger/resource.h
@@ -50,6 +50,8 @@
#define IDC_EDIT_STACK_PARAM2           1032
#define IDC_BTN_MANUAL_FTPUPLOAD        1033
#define IDC_BTN_FTP_MANUALUPLOAD        1033
#define IDC_CHECK_RAWMERGEFILEREAD      1034
#define IDC_EDIT_RAWMERGE_LOCALSAVEPATH 1035
// Next default values for new objects
// 
DitGlassRawMessenger/Extern/DitGlassRawClient.cpp
@@ -6,11 +6,16 @@
{
    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)
@@ -100,6 +105,7 @@
    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];
    m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
    return TRUE;
}
@@ -132,14 +138,14 @@
    int nCmdId = (m_pGlassRawInfo->m_nCommandIdxWrite+1) % COMMAND_MAXCOUNT;
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//���� ï¿½ï¿½ï¿½Ù´Â°ï¿½ï¿½ï¿½ ï¿½ï¿½Å§ï¿½ï¿½ ï¿½ï¿½ï¿½Û°ï¿½ ï¿½Ñ¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ò´Ù´Â°ï¿½!! [������ 2018/11/12]
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//둘이 ê°™ë‹¤ëŠ”ê²ƒì€ ì„œí˜ëŸ¬ ë²„퍼가 í•œë°”퀴 ëŒì•˜ë‹¤ëŠ”ê²ƒ!! [김태현 2018/11/12]
    {
        m_pGlassRawInfo->m_nCommandIdxRead++;//���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Ï³ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½. [������ 2018/11/12]
        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; //-1������, 0����, 1���� [������ 2018/11/13]
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1수행전, 0실패, 1성공 [김태현 2018/11/13]
    m_nLastCommandIdx = m_pGlassRawInfo->m_nCommandIdxWrite = nCmdId;
@@ -166,6 +172,7 @@
    if(isConnect() == FALSE) return FALSE;
    m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
    m_pGlassData->m_bStackRead = FALSE;
    m_pGlassData->m_bRawMergeRead = FALSE;
    return SetCommand(grcSequenceGlassLoading);
}
@@ -197,10 +204,20 @@
    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--)
    {
@@ -221,3 +238,5 @@
    m_pGlassData->m_nDefectNum = nDefectNum-nDefectDeleteNum;
}
CDitGlassRawClient* CDitGlassRawClient::m_pDitGlassClient;
DitGlassRawMessenger/Extern/DitGlassRawClient.h
@@ -1,6 +1,7 @@
#pragma once
#include "DitGlassRawStruct.h"
#include <afxmt.h>
class CDitGlassRawClient
{
@@ -9,6 +10,8 @@
    ~CDitGlassRawClient(void);
public:
    static CDitGlassRawClient* GetInstance(); //cmark
    BOOL ConnectServer();
    BOOL isConnect(){return m_hMapBasicInfo == NULL || m_hMapGlassData == NULL ? FALSE : TRUE;};
@@ -22,7 +25,7 @@
    BOOL SetReviewComtomize();
    void RemoveReviewDefects();//AOI���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï°ï¿½, ï¿½ï¿½ï¿½ä¿¡ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ User È¤ï¿½ï¿½ Reflow ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½.
    void RemoveReviewDefects();//AOI에서 ìƒì„±í•œ ë””펙 ì •보를 ì œì™¸í•˜ê³ , ë¦¬ë·°ì—ì„œ ìƒì„±í•œ User í˜¹ì€ Reflow ê²°í•¨ì„ ì œì™¸í•œë‹¤.
    _grmDitMemInfo*    GetGlassMeminfo(){return (_grmDitMemInfo*)m_pGlassRawInfo;};
    _grmGlassData*    GetGlassData(){return m_pGlassData;};
@@ -30,14 +33,15 @@
    _grmCellData*    GetCellData(int nIndex){return &m_pCellData[nIndex];};
    _grmDefectData*    GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
    _grmDefectData*    GetStackData(int nIndex) { return &m_pStackData[nIndex];};
    _grmDefectData*    GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
    //��� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ [������ 2018/11/12]
    //ê²°ê³¼ íŒŒì¼ ê°•ì œ ì“°ê¸° ëª…ë ¹ [김태현 2018/11/12]
    BOOL WriteAOIRawFile();
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ì³Ê¸ï¿½ ï¿½ï¿½ï¿½Â·ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/12]
    //결과파일 ê°•ì œ ë°”이너리 í˜•태로 ì“°ê¸° [김태현 2018/11/12]
    BOOL WriteAOIRawBinFile(); 
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ì³Ê¸ï¿½ ï¿½Ð±ï¿½
    //결과파일 ê°•ì œ ë°”이너리 ì½ê¸°
    BOOL ReadAOIRawBinFile();
    BOOL WriteReviewRawBinFile();
@@ -46,14 +50,14 @@
    BOOL ConnectGlassRawInfo();
    BOOL ConnectGlassRawData();
    BOOL SetCommand(emGlassRawCommand nCmd);
    static CDitGlassRawClient* m_pDitGlassClient; //cmark
protected:
    _grmGlassData*  m_pGlassData;
    _grmBlockData*        m_pBlockData;
    _grmCellData*   m_pCellData;
    _grmDefectData* m_pDefectData;
    _grmDefectData* m_pStackData;
    _grmDefectData* m_pRawMergeData;
protected:
    HANDLE        m_hMapBasicInfo;
    HANDLE        m_hMapGlassData;
DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define MAX_ZONE_NUM 16
@@ -47,7 +48,7 @@
        memset(this, 0, sizeof(_grmGlassData));
    }
    //Glass ï¿½ï¿½ï¿½ï¿½
    //Glass ì •ë³´
    char m_strFileName[64];
    char m_strPath[256];
@@ -56,12 +57,12 @@
    int m_nOriginDirection;                //{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
    int m_nConerCutDirection;
    int    m_nScanCoordinateY;                //���Ⱑ 0�̸� ï¿½Ï¹ï¿½, 1�̸� Scan������ y��(�� scan������ ï¿½ï¿½ï¿½ï¿½, offline ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½)
    int    m_nScanCoordinateY;                //여기가 0이면 ì¼ë°˜, 1이면 Scan방향이 y축(즉 scan방향이 ë‹¨ì¶•, offline ì„¤ë¹„ ê°™ì€)
    int m_nGlassSizeWidth;
    int m_nGlassSizeHeight;
    //��������
    //설비정보
    char m_strLine[32];
    char m_strEquipType[32];            
    char m_strEquipID[32];                
@@ -74,7 +75,7 @@
    CTime    m_tmReviewLoading;
    CTime    m_tmReviewEnd;
    //�⺻ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //기본 ë¬¼ë¥˜ì •ë³´
    char m_strGlassID[32];                //Glass ID
    char m_strPPID[32];                    
    char m_strEPPID[32];                
@@ -91,7 +92,7 @@
    char m_strVCRGlassID[32];
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
    int            m_nDefectNumStackSP;
    //ī�޶�/��ĵ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //카메라/스캔 ì •ë³´ [김태현 2018/12/5]
    short        m_nCameraNum;
    short        m_nScanNum;
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    //����� ï¿½ï¿½ï¿½ï¿½ um[������ 2018/12/10]
    //얼라인 ì •ë³´ um[김태현 2018/12/10]
    double    m_nAlignCcdTheta;
    double    m_nAlignCcdShitftX;
    double    m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
    char    m_strAlignSecond[64];
//     char    m_strAlignPath[256];
    //CSOT�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //CSOT용 ë¬¼ë¥˜ ì •ë³´ [김태현 2018/12/5]
    char m_strCassetteSequenceNo[16];
    char m_strOwnerCode[16];            //2. OWNER_CODE
    char m_strOwnerType[16];            //3. OWNER_TYPE
@@ -162,7 +163,7 @@
    char m_strGroupID[16];                //14.GROUP_ID
    char m_cAutoSampleFlag;                //15.AUTOSAMPLEFLAG
    // CPRJ�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // CPRJ용 ë¬¼ë¥˜ ì •ë³´
    char m_strProdType[3];
    char m_strBatchID[13];
    char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
    BYTE m_nGlassDataBitSignal[4];
    bool m_bJob_end;  
    //201217 CJH - ï¿½ï¿½ï¿½ï¿½ Defect Review ï¿½ï¿½ï¿½ï¿½
    //201217 CJH - ì°ì€ Defect Review ê°œìˆ˜
    int m_nReviewNum;
    //201221 CJH - ï¿½Ä½ï¿½ï¿½ï¿½ Stack ï¿½ï¿½ï¿½
    //201221 CJH - íŒŒì‹±í•œ Stack ê²°ê³¼
    int m_nStackNum;
    BOOL m_bStackRead;
    //210203 CJH - CutOff ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½
    int m_nRawMergeNum;
    BOOL m_bRawMergeRead;
    //210203 CJH - CutOff ëŒ€ìƒ ê²°í•¨ ìˆ˜
    int m_nCutOffDefectNum;
    //210323 CJH - Server/Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    //210323 CJH - Server/Frame Shrink ì •ë³´ ì¶”ê°€
    char m_strShrinked[6];
    //210326 CJH - RAW ï¿½Ô·ï¿½ Defect ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ë¿©ï¿½ï¿½
    //210326 CJH - RAW ìž…ë ¥ Defect ìˆ˜ëŸ‰ ìƒí•œ ì‚¬ìš©ì—¬ë¶€
    BOOL m_bRawCutoff;
};
@@ -222,7 +225,7 @@
    }
    int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
    int                        m_nCellID;                            //1. PANEL_ID
    short                    m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short                    m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    char                    m_strCellName[32];
    int                        m_rectCellLeft;
@@ -235,7 +238,7 @@
    int                        m_nJudgeGlade;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
    char        m_strProImage[32];
    char        m_strAvgGray_0[12];
    char        m_strPortion_0[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_0[12];
    char        m_strAvgAmp_0[12];
    char        m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
    char        m_strAvgGray_1[12];
    char        m_strPortion_1[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_1[12];
    char        m_strAvgAmp_1[12];
    char        m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
    char        m_strAvgGray_2[12];
    char        m_strPortion_2[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_2[12];
    char        m_strAvgAmp_2[12];
    char        m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
    char        m_strAvgGray_3[12];
    char        m_strPortion_3[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_3[12];
    char        m_strAvgAmp_3[12];
    char        m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
    int            m_nReflowResult[8];            // 0: Reflow X 1: Reflow OK 2: Reflow NG
    // Filtering�� Stack�� ï¿½ï¿½
    // Filtering된 Stack별 ìˆ˜
    int            m_nDefectTDCount;
    int            m_nDefectSDCount;
    int            m_nDefectPDCount;
    int            m_nDefectSPCount;
    // Gate/Data ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Gate/Data ì´ ê°¯ìˆ˜
    int            m_nGateNum;
    int            m_nDataNum;
    // 210129 CJH - Cell Origin ï¿½ï¿½ï¿½ï¿½
    // 210129 CJH - Cell Origin ë°©í–¥
    int            m_nCellXDir;
    int            m_nCellYDir;
};
@@ -331,10 +334,10 @@
    }
    //////////////////////////////////////////////////////////////////////////
    //���⼭ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    //여기서 ë¶€í„° ë¦¬ë·° ì˜ì—­ [김태현 2019/1/19]
    ditRaw::ReviewPlanType            m_nPlanType    ;    
    int            m_nResultCode;  //0:None, 1:Success
    int            m_nShotIndex; //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    int            m_nShotIndex; //리뷰 ì°ì€ ìˆœë²ˆ [김태현 2018/12/5]
    int            m_nModuleIndex;
    int            m_nMagnificIndex;
    float        m_fManification;
@@ -343,15 +346,15 @@
    char        m_strRevImagePath[256];
    //////////////////////////////////////////////////////////////////////////
    // Measure ï¿½ï¿½ï¿½ï¿½
    // Measure ì˜ì—­
    int            m_nMeasure_Index;
    int            m_nMeasure_ResultCode; //0:None, 1:Success
    float        m_fMesure_ResultData[8];    // 0:Type, 1:ShiftX, 2:ShiftY
    //////////////////////////////////////////////////////////////////////////
    // WSI����
    // WSI영역
    int            m_nWsi_ResultCode; //0:None, 1:Success
    int            m_nWsi_Type;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½
    int            m_nWsi_Type;                                    // í•¨ëª° / ëŒê¸°
    float        m_fWsi_ResultData[8];            // 0:Type, 1:Height(um), 2:Width
    char        m_strWsi_2DImageFilename[256];
    char        m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
    int            m_nWsi_pReflowResultData[8];
    double        m_dWsi_DamDistance;
    double        m_dWsiMmMotorX;                                // WSI ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ 20180223 HJH
    double        m_dWsiMmMotorX;                                // WSI ëª¨í„° ì¢Œí‘œ 20180223 HJH
    double        m_dWsiMmMotorY;
    float        m_fWsiManification;                            // WSI ï¿½ï¿½ï¿½ï¿½
    float        m_fWsiManification;                            // WSI ë°°ìœ¨
    //////////////////////////////////////////////////////////////////////////
    // Reflow ï¿½ï¿½ï¿½ï¿½
    // Reflow ì˜ì—­
    int            m_nReflow_Index;
    int            m_nReflow_ResultCode; //0:None, // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Line�� ï¿½ï¿½ï¿½ï¿½. 3 ï¿½Ì¸ï¿½ : DAM2 Reflow ï¿½ï¿½ï¿½ï¿½, 4~5 : DAM1 Reflow ï¿½ï¿½ï¿½ï¿½, 6 : no Reflow ï¿½ï¿½ï¿½ï¿½ / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    int            m_nReflow_ResultCode; //0:None, // ê²€ì¶œí•œ Line의 ê°œìˆ˜. 3 ë¯¸ë§Œ : DAM2 Reflow íŒì •, 4~5 : DAM1 Reflow íŒì •, 6 : no Reflow íŒì • / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    float        m_fReflow_LinePosData[8];    
    int            m_nReflow_Side;
    int            m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
    short            m_nDefectID;
    short            m_nCameraID;
    short            m_nScanIdx;
    //short            m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    int                m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ 201207 CJH - ï¿½Ú¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ä§. int������ ï¿½ï¿½ï¿½ï¿½
    //short            m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ
    int                m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ 201207 CJH - ìžë¦¿ ìˆ˜ ë„˜ì¹¨. int형으로 ë³€ê²½
    int                m_nPixelConv;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelScan;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelConv;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    int                m_nPixelScan;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    short                            m_nPixelSize;                // ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½ - Bright, Dark, Both
    short                            m_nPixelSize;                // ê²°í•¨í¬ê¸°        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ê²°í•¨ íƒ€ìž…    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ê²°í•¨ì˜ íŒì •상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ê²°í•¨ íƒ€ìž… - Bright, Dark, Both
    short            m_sPixelWidth;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Êºï¿½
    short            m_sPixelHeight;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short            m_nLevelSrcMin;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -------------------------RN
    short            m_nLevelRefMax;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -------------------------RX
    short            m_nLevelRefAvg;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ï¿½ï¿½ï¿½ï¿½ Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ï¿½ï¿½ï¿½ï¿½ Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ï¿½ï¿½ï¿½ï¿½ Avg    ---------------------------------DA
    short            m_sPixelWidth;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë„ˆë¹„
    short            m_sPixelHeight;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이
    short            m_nLevelSrcMin;                // ê²°í•¨ ë°ê¸° Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ê²°í•¨ ë°ê¸° Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ê²°í•¨ ë°ê¸° Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ë¹„교대상 ë°ê¸° Min    -------------------------RN
    short            m_nLevelRefMax;                // ë¹„교대상 ë°ê¸° Max    -------------------------RX
    short            m_nLevelRefAvg;                // ë¹„교대상 ë°ê¸° Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ë¹„교차 Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ë¹„교차 Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ë¹„교차 Avg    ---------------------------------DA
    int                m_nDefectRScale;            // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½    -------------------------RS
    short            m_sThreshold;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold
    short            m_sThresholdAvg;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold AVG
    short            m_sDefectPeak;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectRScale;            // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이    -------------------------RS
    short            m_sThreshold;                // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold
    short            m_sThresholdAvg;            // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold AVG
    short            m_sDefectPeak;                // ê²°í•¨ì˜ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ìš”청사항
    int                m_nPixelGlassStart;            // Glass ï¿½ï¿½ï¿½ï¿½ ï¿½È¼ï¿½
    int                m_nPixelGlassStart;            // Glass ì‹œìž‘ í”½ì…€
    short            m_sDefectLoc;
    short            m_sZoneClassPixelCount[16];
    short            m_sZonePixelCount[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Pixel ï¿½ï¿½
    short            m_sZoneValueMin[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Min
    short            m_sZoneValueMax[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Max
    short            m_sZoneValueAvg[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Avg
    short            m_sZonePixelCount[16];    // Zone별 ê²°í•¨ Pixel ìˆ˜
    short            m_sZoneValueMin[16];    // Zone별 ê²°í•¨ Min
    short            m_sZoneValueMax[16];    // Zone별 ê²°í•¨ Max
    short            m_sZoneValueAvg[16];    // Zone별 ê²°í•¨ Avg
    short            m_sZonePixelPercent[16];    // --------------------------------------Z0~ZF
    //210127 CJH - Zone�� Source Gray ï¿½Ô·ï¿½
    short            m_sZoneValueSrcMin[16];    // Zone�� Source Min
    short            m_sZoneValueSrcMax[16];    // Zone�� Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone�� Source Avg
    //210127 CJH - Zone별 Source Gray ìž…ë ¥
    short            m_sZoneValueSrcMin[16];    // Zone별 Source Min
    short            m_sZoneValueSrcMax[16];    // Zone별 Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
    int                m_nUMOriginX;                // um���� x��ǥ (��������)
    int                m_nUMOriginY;                // um���� y��ǥ (��������)
    int                m_nUMCenterAlignX;            // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterAlignY;            // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterX;                // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterY;                // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMSizeX;                    // um���� X Å©ï¿½ï¿½    -----------------------------UX
    int                m_nUMSizeY;                    // um���� Y Å©ï¿½ï¿½    -----------------------------UY
    int                m_nUMSize;                    // um���� Å©ï¿½ï¿½.
    CRect            m_RectUM;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ç°¢ï¿½ï¿½.
    int                m_nUMOriginX;                // um단위 x좌표 (원점기준)
    int                m_nUMOriginY;                // um단위 y조표 (원점기준)
    int                m_nUMCenterAlignX;            // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterAlignY;            // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterX;                // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMCenterY;                // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMSizeX;                    // um단위 X í¬ê¸°    -----------------------------UX
    int                m_nUMSizeY;                    // um단위 Y í¬ê¸°    -----------------------------UY
    int                m_nUMSize;                    // um단위 í¬ê¸°.
    CRect            m_RectUM;                    // ë””펙 ì„¼í„° ê¸°ì¤€ ì‚¬ê°í˜•.
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak�� ï¿½ï¿½ï¿½ï¿½.
    short/*Judgement*/                m_DefectJudgement;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    BOOL                    m_bDefectCutoff;            // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16��� ï¿½ï¿½ï¿½ï¿½
    int                m_nPadRegionIdx;            // PAD ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ê²°í•¨ í¬ê¸° ì¢…류enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak의 ì¢…류.
    short/*Judgement*/                m_DefectJudgement;            // ê²°í•¨ íŒì •.
    BOOL                    m_bDefectCutoff;            // ì»· ì˜¤í”„ ë””펙(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16등분 êµ¬ë¶„
    int                m_nPadRegionIdx;            // PAD ì˜ì—­ ì¸ë±ìФ
    int                m_nUMCellX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ x ï¿½ï¿½Ç¥
    int                m_nUMCellY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ y ï¿½ï¿½Ç¥
    short            m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellIdx;                    // ï¿½ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellGate;                // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellData;                // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellGateAlign;            // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellDataAlign;            // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCellX;                    // ì…€ ì›ì  ê¸°ì¤€ x ì¢Œí‘œ
    int                m_nUMCellY;                    // ì…€ ì›ì  ê¸°ì¤€ y ì¢Œí‘œ
    short            m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    short            m_nCellIdx;                    // ëª‡ë²ˆì§¸ ì…€ì¸ê°€?
    short            m_nCellGate;                // ì…€ë³„ Gate라인(얼라인 ë³´ì • ì „)
    short            m_nCellData;                // ì…€ë³„ Data라인(얼라인 ë³´ì • ì „)
    short            m_nCellGateAlign;            // ì…€ë³„ Gate라인(얼라인 ë³´ì • í›„)
    short            m_nCellDataAlign;            // ì…€ë³„ Data라인(얼라인 ë³´ì • í›„)
    int                m_nUMShotX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ X��ǥ
    int                m_nUMShotY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Y��ǥ
    short            m_nMaskDefectIdx;            // ï¿½ï¿½ Glass���� ï¿½ß°ßµï¿½ ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    short            m_nShotIdx;                    // ï¿½ë±¤ï¿½ï¿½ ï¿½ï¿½È£
    short            m_nMatchShotCount;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½.
    short            m_nMatchMaxSize;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½.
    int                m_nUMShotX;                    // ìƒ· ê¸°ì¤€ X좌표
    int                m_nUMShotY;                    // ìƒ· ê¸°ì¤€ Y좌표
    short            m_nMaskDefectIdx;            // í•œ Glass에서 ë°œê²¬ëœ ë§ˆìŠ¤í¬ê²°í•¨ ë¬¶ìŒì˜ ì¸ë±ìФ.
    short            m_nShotIdx;                    // ë…¸ê´‘샷 ë²ˆí˜¸
    short            m_nMatchShotCount;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ê²°í•¨ì˜ ìˆ˜.
    short            m_nMatchMaxSize;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ì¤‘ ê°€ìž¥ í° ê²°í•¨ì˜ í¬ê¸°.
    short            m_nRepeatCount;                // ï¿½ï¿½ï¿½Ó°ï¿½ï¿½Ô¹ß°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ ï¿½Ýºï¿½ï¿½ï¿½
    short            m_nRepeatCount;                // ì—°ì†ê²°í•¨ë°œê²¬ìœ„한 ë™ì¼ì¢Œí‘œ ë°˜ë³µìˆ˜
    short            m_nMaskRepeatCount;
    int                m_StackInfo;                // Stack Flag
    BOOL            m_bRealStack;                // Stack ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(TRUE) ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½Í¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(FALSE)������ ï¿½ï¿½ ï¿½Ö´ï¿½.
    short            m_nStackStepCount;            // Stack ï¿½ï¿½
    short            m_nStackColorIdx;            // Color�� ï¿½ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    BOOL            m_bRealStack;                // Stack ë¨¸ì§€ì— ì˜í•œ TD(TRUE) ì¸ì§€, í•„터링에 ì˜í•œ TD(FALSE)구분할 ìˆ˜ ìžˆë‹¤.
    short            m_nStackStepCount;            // Stack ìˆ˜
    short            m_nStackColorIdx;            // Color를 ì„ íƒí•˜ëŠ” ì¸ë±ìФ.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ 60bytes
    char            m_strUnitID[16];                // ï¿½ï¿½ï¿½Ö¾ï¿½ï¿½Ìµï¿½
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ìµœëŒ€ ì‚¬ì´ì¦ˆ 60bytes
    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�� ï¿½ß°ï¿½ ï¿½Ð·ï¿½  ï¿½Ë°ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½.
    int                m_nAtomWidth;                // TFE ï¿½ï¿½ ï¿½Êºï¿½
    int                m_nAtomHeight;                // TFE ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short/*ReKind*/            m_DefectKind;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    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등 ì¶”ê°€ ë¶„류  ì•Œê³ ë¦¬ì¦˜ ì ìš© ê²°ê³¼.
    int                m_nAtomWidth;                // TFE í•µ ë„ˆë¹„
    int                m_nAtomHeight;                // TFE í•µ ë†’이
    short/*ReKind*/            m_DefectKind;                // ê²°í•¨ ì¢…류
    char            m_strDefectCode[32];            // Defect Code
    BOOL            m_bMergeState;                // Merge Status
    char            m_strAoiImageName[256];            // Defect Image Name(CCD Image)
    int                m_nDefectMerge;        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectMerge;        // í˜„재 ë””펙의 ë¨¸ì§€ ì—¬ë¶€
    int                m_nPixelSizeOrigin;
    int                m_nScratchRatio;
    int                m_nDensity;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ðµï¿½ [2017.8.2 bhs]
    int                m_nDensity;            // ì›í˜• ê²°í•¨ êµ¬ë¶„을 ìœ„한 ë°€ë„ [2017.8.2 bhs]
    char            m_strDefectName[16];
    char            m_strDefectType[16];
@@ -491,16 +494,16 @@
    double            m_dScanResolution;
    double            m_dConvResolution;
    int                m_nAngle;                    // ï¿½ï¿½ï¿½ï¿½
    int                m_nMajor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Long)
    int                m_nMinor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Short)
    int                m_nCompact;                    // Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ì¿ï¿½ Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nThickness;                // Blob ï¿½ï¿½ï¿½Ì¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (Area / Major)
    int                m_nAngle;                    // ê°ë„
    int                m_nMajor;                    // ìž¥ì¶• ê¸¸ì´(Long)
    int                m_nMinor;                    // ë‹¨ì¶• ê¸¸ì´(Short)
    int                m_nCompact;                    // Blob ìž¥ì¶•을 ì§€ë¦„으로 í•˜ëŠ” ì›ì˜ ë„“이와 Blob ë„“이의 ë¹„율
    int                m_nThickness;                // Blob ë„“이와 ìž¥ì¶•의 ë¹„율 (Area / Major)
    
    short            m_nHliLevelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½ï¿½(�)�ΰ�?
    int                m_nHliLayers;                // ï¿½Ø´ï¿½ï¿½ï¿½Ô¿ï¿½ ï¿½ï¿½ï¿½Ôµï¿½ ï¿½ï¿½ï¿½Ì¾ï¿½ bitó��
    short            m_nHliLevelIdx;                // ëª‡ ë²ˆì§¸ ë ˆë²¨(채널)인가?
    int                m_nHliLayers;                // í•´ë‹¹ê²°í•¨ì— í¬í•¨ëœ ë ˆì´ì–´ bit처리
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ì •ë³´ ì¶”ê°€
    char            m_strAoiImagePath[255];
    char            m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
    int                m_nAlignRectRight;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    _grmDefectReviewData m_ReviewDefect;
};
@@ -556,32 +558,35 @@
struct _grmDitMemInfo
{
    //���� ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/12]
    //공유 ë©”모리 ìƒì„±í•  ê³µê°„ ê²°ì • [김태현 2018/11/12]
    size_t m_nGlassRawDataSize;
    int m_nGlassMaxDataNum;
    int m_nBlockMaxDataNum;
    int m_nCellMaxDataNum;
    int m_nDefectMaxDataNum;
    int m_nStackMaxDataNum;
    int m_nRawMergeMaxDataNum;
    //Char ï¿½ï¿½ï¿½ï¿½ ï¿½Ú·á°¡ ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡ [������ 2018/11/12]
    //Char ê¸°ì¤€ ìžë£Œê°€ ìžˆëŠ” ì‹œìž‘ ìœ„치 [김태현 2018/11/12]
    int m_nGlassDataPoint;
    int m_nBlockDataPoint;
    int m_nCellDataPoint;
    int m_nDefectDataPoint;
    int m_nStackDataPoint;
    int m_nRawMergeDataPoint;
    int m_nSizeOfGlassData;
    int m_nSizeOfBlockData;
    int m_nSizeOfCellData;
    int m_nSizeOfDefectData;
    int m_nSizeOfStackData;
    int m_nSizeOfRawMergeData;
};
struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
{
    size_t m_nGlassLoadingCount;
    emAOIProcStep m_ClientProcStep; //AOI, Review�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)�� Ã³ï¿½ï¿½ ï¿½Ï·ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ClientProcStep; //AOI, Review가 ë³´ë‚¸ ëª…ë ¹
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 ì²˜ë¦¬ ì™„료 í•œ ëª…ë ¹
};
class CgrmGlassRawData
@@ -668,7 +673,7 @@
    {
        if(pInfo == NULL || pData == NULL) return FALSE;
        if(1) //new type //�޸� ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å©ï¿½â¿¡ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
        if(1) //new type //메모리 ì´ ê³µê°„ í¬ê¸°ì— ìƒê´€ì—†ì´
        {
            //if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
Internal_Library/CHCameraControl_Pylon/CHCameraControlPylon.vcxproj
@@ -136,7 +136,7 @@
    <ClCompile>
      <Optimization>MaxSpeed</Optimization>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <AdditionalIncludeDirectories>$(MSBuildStartupDirectory)\Include;C:\Program Files\Basler\pylon 5\Development\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(MSBuildStartupDirectory)\Include;C:\Program Files\Basler\pylon 5\Development\include;C:\Program Files\Basler\pylon 4\pylon\include;C:\Program Files\Basler\pylon 4\genicam\library\cpp\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_AFXEXT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
      <FunctionLevelLinking>true</FunctionLevelLinking>
@@ -150,7 +150,7 @@
      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ResourceCompile>
    <Link>
      <AdditionalLibraryDirectories>C:\Program Files\Basler\pylon 5\Development\lib\x64;$(MSBuildStartupDirectory)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
      <AdditionalLibraryDirectories>C:\Program Files\Basler\pylon 5\Development\lib\x64;$(MSBuildStartupDirectory)\lib;C:\Program Files\Basler\pylon 4\genicam\library\cpp\lib\win64_x64;C:\Program Files\Basler\pylon 4\pylon\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
      <ModuleDefinitionFile>
      </ModuleDefinitionFile>
      <GenerateDebugInformation>true</GenerateDebugInformation>
Internal_Library/CHCameraControl_Pylon/CameraControl_Pylon.cpp
@@ -64,13 +64,15 @@
            //SetHeartbeatTimeout(10000); // set heartbeat
            //if (controlInfo.GetCameraReverseX() == TRUE)//210614���Ϸи� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
            //{
            //    m_pCamera->ReverseX = TRUE;
            //    //m_pCamera->ReverseX = TRUE;
            //    m_pCamera->ReverseX.SetValue(TRUE);
            //}
            //else
            //{
            //    m_pCamera->ReverseX = FALSE;
            //    //m_pCamera->ReverseX = FALSE;
            //    m_pCamera->ReverseX.SetValue(FALSE);
            //}
            m_pCamera->SetCameraContext(m_nTotalIndex);///m_nCameraIndex); // set context
            m_pCamera->MaxNumBuffer = m_nGrabCount;
Internal_Library/CHCameraControl_Sapera/CameraControl_Sapera.cpp
@@ -257,6 +257,16 @@
        if (!m_bGrabbing) return 1;
        nReturn = m_pXfer->Freeze();
        //#3477_210729_LYW_FrameLost_현상 ì´ˆì¹˜_ADD_START
        if (m_pXfer->Wait(1000) == TRUE)
        {
        }
        else
        {
            m_pXfer->Abort();
        }
        //#3477_210729_LYW_FrameLost_현상 ì´ˆì¹˜_ADD_END
        m_bGrabbing = m_pXfer->IsGrabbing();
    }
Internal_Library/CHWsiControls/WsiControl_Dit.cpp
@@ -455,6 +455,10 @@
            measureResult.nWsiState    = pPacket->GetInt(3);
            measureResult.dAccuracy = pPacket->GetDouble(0);
            measureResult.dRepeatability = pPacket->GetDouble(1);
            for (int i = 0; i < 10; i++)
            {
                measureResult.dDiagnosisHeight[i] = pPacket->GetDouble(i + 2);
            }
            m_pWC2P->IWC2P_DisplayMessage(m_nIndex,_T("VLSI state %d ACC %f RTB %f"),measureResult.nWsiState,measureResult.dAccuracy ,measureResult.dRepeatability);
        }
        break;
Internal_Library/Include/CHWsiControls/WsiControlInfo.h
@@ -75,6 +75,7 @@
    int            nWsiState;
    double        dAccuracy;
    double      dRepeatability;
    double        dDiagnosisHeight[10];
    bool        bBigSizeDefect;
    
ReviewHistory/ReveiwHistory/DitGlassRawServer.cpp
@@ -41,7 +41,8 @@
        || sizeof(_grmBlockData) != m_pGlassRawInfo->m_nSizeOfBlockData
        || sizeof(_grmCellData) != m_pGlassRawInfo->m_nSizeOfCellData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfDefectData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData)
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfStackData
        || sizeof(_grmDefectData) != m_pGlassRawInfo->m_nSizeOfRawMergeData)
    {
        return FALSE;
    }
@@ -51,7 +52,8 @@
    m_pGlassRawInfo->m_nCellMaxDataNum = nCellNum;
    m_pGlassRawInfo->m_nDefectMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nStackMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nRawMergeMaxDataNum = nDefectNum;
    m_pGlassRawInfo->m_nGlassRawDataSize;
    {
        int nDataNum = 0;
@@ -71,6 +73,9 @@
        m_pGlassRawInfo->m_nStackDataPoint = nDataNum;
        nDataNum += (m_pGlassRawInfo->m_nSizeOfStackData + m_pGlassRawInfo->m_nSizeOfStackData % 4)*nDefectNum;
        
        m_pGlassRawInfo->m_nRawMergeDataPoint = nDataNum;
        nDataNum += (m_pGlassRawInfo->m_nSizeOfRawMergeData + m_pGlassRawInfo->m_nSizeOfRawMergeData % 4)*nDefectNum;
        m_pGlassRawInfo->m_nGlassRawDataSize = nDataNum;
    }
    
@@ -125,6 +130,7 @@
            m_pGlassRawInfo->m_nSizeOfCellData = sizeof(_grmCellData);
            m_pGlassRawInfo->m_nSizeOfDefectData = sizeof(_grmDefectData);
            m_pGlassRawInfo->m_nSizeOfStackData = sizeof(_grmDefectData);
            m_pGlassRawInfo->m_nSizeOfRawMergeData = sizeof(_grmDefectData);
            int bytealign = m_pGlassRawInfo->m_nSizeOfGlassData%4;
        }
@@ -178,6 +184,7 @@
    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];
    m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
    return TRUE;
}
ReviewHistory/ReveiwHistory/DitGlassRawServer.h
@@ -18,6 +18,7 @@
    _grmCellData*    GetCellData(int nIndex){return &m_pCellData[nIndex];};
    _grmDefectData*    GetDefectData(int nIndex){return &m_pDefectData[nIndex];};
    _grmDefectData*    GetStackData(int nIndex) { return &m_pStackData[nIndex]; };
    _grmDefectData*    GetRawMergeData(int nIndex) { return &m_pRawMergeData[nIndex]; };
    _grmDitGlassRawInfo* GetGlassRawInfo(){return m_pGlassRawInfo;};
@@ -31,7 +32,7 @@
    _grmCellData*   m_pCellData;
    _grmDefectData* m_pDefectData;
    _grmDefectData* m_pStackData;
    _grmDefectData* m_pRawMergeData;
protected:
    HANDLE        m_hMapBasicInfo;
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define MAX_ZONE_NUM 16
@@ -47,7 +48,7 @@
        memset(this, 0, sizeof(_grmGlassData));
    }
    //Glass ï¿½ï¿½ï¿½ï¿½
    //Glass ì •ë³´
    char m_strFileName[64];
    char m_strPath[256];
@@ -56,12 +57,12 @@
    int m_nOriginDirection;                //{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
    int m_nConerCutDirection;
    int    m_nScanCoordinateY;                //���Ⱑ 0�̸� ï¿½Ï¹ï¿½, 1�̸� Scan������ y��(�� scan������ ï¿½ï¿½ï¿½ï¿½, offline ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½)
    int    m_nScanCoordinateY;                //여기가 0이면 ì¼ë°˜, 1이면 Scan방향이 y축(즉 scan방향이 ë‹¨ì¶•, offline ì„¤ë¹„ ê°™ì€)
    int m_nGlassSizeWidth;
    int m_nGlassSizeHeight;
    //��������
    //설비정보
    char m_strLine[32];
    char m_strEquipType[32];            
    char m_strEquipID[32];                
@@ -74,7 +75,7 @@
    CTime    m_tmReviewLoading;
    CTime    m_tmReviewEnd;
    //�⺻ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //기본 ë¬¼ë¥˜ì •ë³´
    char m_strGlassID[32];                //Glass ID
    char m_strPPID[32];                    
    char m_strEPPID[32];                
@@ -91,7 +92,7 @@
    char m_strVCRGlassID[32];
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
    int            m_nDefectNumStackSP;
    //ī�޶�/��ĵ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //카메라/스캔 ì •ë³´ [김태현 2018/12/5]
    short        m_nCameraNum;
    short        m_nScanNum;
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    //����� ï¿½ï¿½ï¿½ï¿½ um[������ 2018/12/10]
    //얼라인 ì •ë³´ um[김태현 2018/12/10]
    double    m_nAlignCcdTheta;
    double    m_nAlignCcdShitftX;
    double    m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
    char    m_strAlignSecond[64];
//     char    m_strAlignPath[256];
    //CSOT�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //CSOT용 ë¬¼ë¥˜ ì •ë³´ [김태현 2018/12/5]
    char m_strCassetteSequenceNo[16];
    char m_strOwnerCode[16];            //2. OWNER_CODE
    char m_strOwnerType[16];            //3. OWNER_TYPE
@@ -162,7 +163,7 @@
    char m_strGroupID[16];                //14.GROUP_ID
    char m_cAutoSampleFlag;                //15.AUTOSAMPLEFLAG
    // CPRJ�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // CPRJ용 ë¬¼ë¥˜ ì •ë³´
    char m_strProdType[3];
    char m_strBatchID[13];
    char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
    BYTE m_nGlassDataBitSignal[4];
    bool m_bJob_end;  
    //201217 CJH - ï¿½ï¿½ï¿½ï¿½ Defect Review ï¿½ï¿½ï¿½ï¿½
    //201217 CJH - ì°ì€ Defect Review ê°œìˆ˜
    int m_nReviewNum;
    //201221 CJH - ï¿½Ä½ï¿½ï¿½ï¿½ Stack ï¿½ï¿½ï¿½
    //201221 CJH - íŒŒì‹±í•œ Stack ê²°ê³¼
    int m_nStackNum;
    BOOL m_bStackRead;
    //210203 CJH - CutOff ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½
    int m_nRawMergeNum;
    BOOL m_bRawMergeRead;
    //210203 CJH - CutOff ëŒ€ìƒ ê²°í•¨ ìˆ˜
    int m_nCutOffDefectNum;
    //210323 CJH - Server/Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    //210323 CJH - Server/Frame Shrink ì •ë³´ ì¶”ê°€
    char m_strShrinked[6];
    //210326 CJH - RAW ï¿½Ô·ï¿½ Defect ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ë¿©ï¿½ï¿½
    //210326 CJH - RAW ìž…ë ¥ Defect ìˆ˜ëŸ‰ ìƒí•œ ì‚¬ìš©ì—¬ë¶€
    BOOL m_bRawCutoff;
};
@@ -222,7 +225,7 @@
    }
    int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
    int                        m_nCellID;                            //1. PANEL_ID
    short                    m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short                    m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    char                    m_strCellName[32];
    int                        m_rectCellLeft;
@@ -235,7 +238,7 @@
    int                        m_nJudgeGlade;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
    char        m_strProImage[32];
    char        m_strAvgGray_0[12];
    char        m_strPortion_0[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_0[12];
    char        m_strAvgAmp_0[12];
    char        m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
    char        m_strAvgGray_1[12];
    char        m_strPortion_1[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_1[12];
    char        m_strAvgAmp_1[12];
    char        m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
    char        m_strAvgGray_2[12];
    char        m_strPortion_2[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_2[12];
    char        m_strAvgAmp_2[12];
    char        m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
    char        m_strAvgGray_3[12];
    char        m_strPortion_3[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_3[12];
    char        m_strAvgAmp_3[12];
    char        m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
    int            m_nReflowResult[8];            // 0: Reflow X 1: Reflow OK 2: Reflow NG
    // Filtering�� Stack�� ï¿½ï¿½
    // Filtering된 Stack별 ìˆ˜
    int            m_nDefectTDCount;
    int            m_nDefectSDCount;
    int            m_nDefectPDCount;
    int            m_nDefectSPCount;
    // Gate/Data ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Gate/Data ì´ ê°¯ìˆ˜
    int            m_nGateNum;
    int            m_nDataNum;
    // 210129 CJH - Cell Origin ï¿½ï¿½ï¿½ï¿½
    // 210129 CJH - Cell Origin ë°©í–¥
    int            m_nCellXDir;
    int            m_nCellYDir;
};
@@ -331,10 +334,10 @@
    }
    //////////////////////////////////////////////////////////////////////////
    //���⼭ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    //여기서 ë¶€í„° ë¦¬ë·° ì˜ì—­ [김태현 2019/1/19]
    ditRaw::ReviewPlanType            m_nPlanType    ;    
    int            m_nResultCode;  //0:None, 1:Success
    int            m_nShotIndex; //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    int            m_nShotIndex; //리뷰 ì°ì€ ìˆœë²ˆ [김태현 2018/12/5]
    int            m_nModuleIndex;
    int            m_nMagnificIndex;
    float        m_fManification;
@@ -343,15 +346,15 @@
    char        m_strRevImagePath[256];
    //////////////////////////////////////////////////////////////////////////
    // Measure ï¿½ï¿½ï¿½ï¿½
    // Measure ì˜ì—­
    int            m_nMeasure_Index;
    int            m_nMeasure_ResultCode; //0:None, 1:Success
    float        m_fMesure_ResultData[8];    // 0:Type, 1:ShiftX, 2:ShiftY
    //////////////////////////////////////////////////////////////////////////
    // WSI����
    // WSI영역
    int            m_nWsi_ResultCode; //0:None, 1:Success
    int            m_nWsi_Type;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½
    int            m_nWsi_Type;                                    // í•¨ëª° / ëŒê¸°
    float        m_fWsi_ResultData[8];            // 0:Type, 1:Height(um), 2:Width
    char        m_strWsi_2DImageFilename[256];
    char        m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
    int            m_nWsi_pReflowResultData[8];
    double        m_dWsi_DamDistance;
    double        m_dWsiMmMotorX;                                // WSI ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ 20180223 HJH
    double        m_dWsiMmMotorX;                                // WSI ëª¨í„° ì¢Œí‘œ 20180223 HJH
    double        m_dWsiMmMotorY;
    float        m_fWsiManification;                            // WSI ï¿½ï¿½ï¿½ï¿½
    float        m_fWsiManification;                            // WSI ë°°ìœ¨
    //////////////////////////////////////////////////////////////////////////
    // Reflow ï¿½ï¿½ï¿½ï¿½
    // Reflow ì˜ì—­
    int            m_nReflow_Index;
    int            m_nReflow_ResultCode; //0:None, // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Line�� ï¿½ï¿½ï¿½ï¿½. 3 ï¿½Ì¸ï¿½ : DAM2 Reflow ï¿½ï¿½ï¿½ï¿½, 4~5 : DAM1 Reflow ï¿½ï¿½ï¿½ï¿½, 6 : no Reflow ï¿½ï¿½ï¿½ï¿½ / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    int            m_nReflow_ResultCode; //0:None, // ê²€ì¶œí•œ Line의 ê°œìˆ˜. 3 ë¯¸ë§Œ : DAM2 Reflow íŒì •, 4~5 : DAM1 Reflow íŒì •, 6 : no Reflow íŒì • / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    float        m_fReflow_LinePosData[8];    
    int            m_nReflow_Side;
    int            m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
    short            m_nDefectID;
    short            m_nCameraID;
    short            m_nScanIdx;
    //short            m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    int                m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ 201207 CJH - ï¿½Ú¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ä§. int������ ï¿½ï¿½ï¿½ï¿½
    //short            m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ
    int                m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ 201207 CJH - ìžë¦¿ ìˆ˜ ë„˜ì¹¨. int형으로 ë³€ê²½
    int                m_nPixelConv;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelScan;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelConv;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    int                m_nPixelScan;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    short                            m_nPixelSize;                // ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½ - Bright, Dark, Both
    short                            m_nPixelSize;                // ê²°í•¨í¬ê¸°        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ê²°í•¨ íƒ€ìž…    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ê²°í•¨ì˜ íŒì •상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ê²°í•¨ íƒ€ìž… - Bright, Dark, Both
    short            m_sPixelWidth;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Êºï¿½
    short            m_sPixelHeight;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short            m_nLevelSrcMin;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -------------------------RN
    short            m_nLevelRefMax;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -------------------------RX
    short            m_nLevelRefAvg;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ï¿½ï¿½ï¿½ï¿½ Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ï¿½ï¿½ï¿½ï¿½ Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ï¿½ï¿½ï¿½ï¿½ Avg    ---------------------------------DA
    short            m_sPixelWidth;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë„ˆë¹„
    short            m_sPixelHeight;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이
    short            m_nLevelSrcMin;                // ê²°í•¨ ë°ê¸° Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ê²°í•¨ ë°ê¸° Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ê²°í•¨ ë°ê¸° Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ë¹„교대상 ë°ê¸° Min    -------------------------RN
    short            m_nLevelRefMax;                // ë¹„교대상 ë°ê¸° Max    -------------------------RX
    short            m_nLevelRefAvg;                // ë¹„교대상 ë°ê¸° Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ë¹„교차 Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ë¹„교차 Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ë¹„교차 Avg    ---------------------------------DA
    int                m_nDefectRScale;            // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½    -------------------------RS
    short            m_sThreshold;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold
    short            m_sThresholdAvg;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold AVG
    short            m_sDefectPeak;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectRScale;            // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이    -------------------------RS
    short            m_sThreshold;                // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold
    short            m_sThresholdAvg;            // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold AVG
    short            m_sDefectPeak;                // ê²°í•¨ì˜ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ìš”청사항
    int                m_nPixelGlassStart;            // Glass ï¿½ï¿½ï¿½ï¿½ ï¿½È¼ï¿½
    int                m_nPixelGlassStart;            // Glass ì‹œìž‘ í”½ì…€
    short            m_sDefectLoc;
    short            m_sZoneClassPixelCount[16];
    short            m_sZonePixelCount[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Pixel ï¿½ï¿½
    short            m_sZoneValueMin[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Min
    short            m_sZoneValueMax[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Max
    short            m_sZoneValueAvg[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Avg
    short            m_sZonePixelCount[16];    // Zone별 ê²°í•¨ Pixel ìˆ˜
    short            m_sZoneValueMin[16];    // Zone별 ê²°í•¨ Min
    short            m_sZoneValueMax[16];    // Zone별 ê²°í•¨ Max
    short            m_sZoneValueAvg[16];    // Zone별 ê²°í•¨ Avg
    short            m_sZonePixelPercent[16];    // --------------------------------------Z0~ZF
    //210127 CJH - Zone�� Source Gray ï¿½Ô·ï¿½
    short            m_sZoneValueSrcMin[16];    // Zone�� Source Min
    short            m_sZoneValueSrcMax[16];    // Zone�� Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone�� Source Avg
    //210127 CJH - Zone별 Source Gray ìž…ë ¥
    short            m_sZoneValueSrcMin[16];    // Zone별 Source Min
    short            m_sZoneValueSrcMax[16];    // Zone별 Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
    int                m_nUMOriginX;                // um���� x��ǥ (��������)
    int                m_nUMOriginY;                // um���� y��ǥ (��������)
    int                m_nUMCenterAlignX;            // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterAlignY;            // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterX;                // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterY;                // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMSizeX;                    // um���� X Å©ï¿½ï¿½    -----------------------------UX
    int                m_nUMSizeY;                    // um���� Y Å©ï¿½ï¿½    -----------------------------UY
    int                m_nUMSize;                    // um���� Å©ï¿½ï¿½.
    CRect            m_RectUM;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ç°¢ï¿½ï¿½.
    int                m_nUMOriginX;                // um단위 x좌표 (원점기준)
    int                m_nUMOriginY;                // um단위 y조표 (원점기준)
    int                m_nUMCenterAlignX;            // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterAlignY;            // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterX;                // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMCenterY;                // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMSizeX;                    // um단위 X í¬ê¸°    -----------------------------UX
    int                m_nUMSizeY;                    // um단위 Y í¬ê¸°    -----------------------------UY
    int                m_nUMSize;                    // um단위 í¬ê¸°.
    CRect            m_RectUM;                    // ë””펙 ì„¼í„° ê¸°ì¤€ ì‚¬ê°í˜•.
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak�� ï¿½ï¿½ï¿½ï¿½.
    short/*Judgement*/                m_DefectJudgement;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    BOOL                    m_bDefectCutoff;            // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16��� ï¿½ï¿½ï¿½ï¿½
    int                m_nPadRegionIdx;            // PAD ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ê²°í•¨ í¬ê¸° ì¢…류enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak의 ì¢…류.
    short/*Judgement*/                m_DefectJudgement;            // ê²°í•¨ íŒì •.
    BOOL                    m_bDefectCutoff;            // ì»· ì˜¤í”„ ë””펙(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16등분 êµ¬ë¶„
    int                m_nPadRegionIdx;            // PAD ì˜ì—­ ì¸ë±ìФ
    int                m_nUMCellX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ x ï¿½ï¿½Ç¥
    int                m_nUMCellY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ y ï¿½ï¿½Ç¥
    short            m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellIdx;                    // ï¿½ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellGate;                // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellData;                // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellGateAlign;            // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellDataAlign;            // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCellX;                    // ì…€ ì›ì  ê¸°ì¤€ x ì¢Œí‘œ
    int                m_nUMCellY;                    // ì…€ ì›ì  ê¸°ì¤€ y ì¢Œí‘œ
    short            m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    short            m_nCellIdx;                    // ëª‡ë²ˆì§¸ ì…€ì¸ê°€?
    short            m_nCellGate;                // ì…€ë³„ Gate라인(얼라인 ë³´ì • ì „)
    short            m_nCellData;                // ì…€ë³„ Data라인(얼라인 ë³´ì • ì „)
    short            m_nCellGateAlign;            // ì…€ë³„ Gate라인(얼라인 ë³´ì • í›„)
    short            m_nCellDataAlign;            // ì…€ë³„ Data라인(얼라인 ë³´ì • í›„)
    int                m_nUMShotX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ X��ǥ
    int                m_nUMShotY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Y��ǥ
    short            m_nMaskDefectIdx;            // ï¿½ï¿½ Glass���� ï¿½ß°ßµï¿½ ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    short            m_nShotIdx;                    // ï¿½ë±¤ï¿½ï¿½ ï¿½ï¿½È£
    short            m_nMatchShotCount;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½.
    short            m_nMatchMaxSize;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½.
    int                m_nUMShotX;                    // ìƒ· ê¸°ì¤€ X좌표
    int                m_nUMShotY;                    // ìƒ· ê¸°ì¤€ Y좌표
    short            m_nMaskDefectIdx;            // í•œ Glass에서 ë°œê²¬ëœ ë§ˆìŠ¤í¬ê²°í•¨ ë¬¶ìŒì˜ ì¸ë±ìФ.
    short            m_nShotIdx;                    // ë…¸ê´‘샷 ë²ˆí˜¸
    short            m_nMatchShotCount;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ê²°í•¨ì˜ ìˆ˜.
    short            m_nMatchMaxSize;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ì¤‘ ê°€ìž¥ í° ê²°í•¨ì˜ í¬ê¸°.
    short            m_nRepeatCount;                // ï¿½ï¿½ï¿½Ó°ï¿½ï¿½Ô¹ß°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ ï¿½Ýºï¿½ï¿½ï¿½
    short            m_nRepeatCount;                // ì—°ì†ê²°í•¨ë°œê²¬ìœ„한 ë™ì¼ì¢Œí‘œ ë°˜ë³µìˆ˜
    short            m_nMaskRepeatCount;
    int                m_StackInfo;                // Stack Flag
    BOOL            m_bRealStack;                // Stack ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(TRUE) ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½Í¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(FALSE)������ ï¿½ï¿½ ï¿½Ö´ï¿½.
    short            m_nStackStepCount;            // Stack ï¿½ï¿½
    short            m_nStackColorIdx;            // Color�� ï¿½ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    BOOL            m_bRealStack;                // Stack ë¨¸ì§€ì— ì˜í•œ TD(TRUE) ì¸ì§€, í•„터링에 ì˜í•œ TD(FALSE)구분할 ìˆ˜ ìžˆë‹¤.
    short            m_nStackStepCount;            // Stack ìˆ˜
    short            m_nStackColorIdx;            // Color를 ì„ íƒí•˜ëŠ” ì¸ë±ìФ.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ 60bytes
    char            m_strUnitID[16];                // ï¿½ï¿½ï¿½Ö¾ï¿½ï¿½Ìµï¿½
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ìµœëŒ€ ì‚¬ì´ì¦ˆ 60bytes
    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�� ï¿½ß°ï¿½ ï¿½Ð·ï¿½  ï¿½Ë°ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½.
    int                m_nAtomWidth;                // TFE ï¿½ï¿½ ï¿½Êºï¿½
    int                m_nAtomHeight;                // TFE ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short/*ReKind*/            m_DefectKind;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    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등 ì¶”ê°€ ë¶„류  ì•Œê³ ë¦¬ì¦˜ ì ìš© ê²°ê³¼.
    int                m_nAtomWidth;                // TFE í•µ ë„ˆë¹„
    int                m_nAtomHeight;                // TFE í•µ ë†’이
    short/*ReKind*/            m_DefectKind;                // ê²°í•¨ ì¢…류
    char            m_strDefectCode[32];            // Defect Code
    BOOL            m_bMergeState;                // Merge Status
    char            m_strAoiImageName[256];            // Defect Image Name(CCD Image)
    int                m_nDefectMerge;        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectMerge;        // í˜„재 ë””펙의 ë¨¸ì§€ ì—¬ë¶€
    int                m_nPixelSizeOrigin;
    int                m_nScratchRatio;
    int                m_nDensity;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ðµï¿½ [2017.8.2 bhs]
    int                m_nDensity;            // ì›í˜• ê²°í•¨ êµ¬ë¶„을 ìœ„한 ë°€ë„ [2017.8.2 bhs]
    char            m_strDefectName[16];
    char            m_strDefectType[16];
@@ -491,16 +494,16 @@
    double            m_dScanResolution;
    double            m_dConvResolution;
    int                m_nAngle;                    // ï¿½ï¿½ï¿½ï¿½
    int                m_nMajor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Long)
    int                m_nMinor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Short)
    int                m_nCompact;                    // Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ì¿ï¿½ Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nThickness;                // Blob ï¿½ï¿½ï¿½Ì¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (Area / Major)
    int                m_nAngle;                    // ê°ë„
    int                m_nMajor;                    // ìž¥ì¶• ê¸¸ì´(Long)
    int                m_nMinor;                    // ë‹¨ì¶• ê¸¸ì´(Short)
    int                m_nCompact;                    // Blob ìž¥ì¶•을 ì§€ë¦„으로 í•˜ëŠ” ì›ì˜ ë„“이와 Blob ë„“이의 ë¹„율
    int                m_nThickness;                // Blob ë„“이와 ìž¥ì¶•의 ë¹„율 (Area / Major)
    
    short            m_nHliLevelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½ï¿½(�)�ΰ�?
    int                m_nHliLayers;                // ï¿½Ø´ï¿½ï¿½ï¿½Ô¿ï¿½ ï¿½ï¿½ï¿½Ôµï¿½ ï¿½ï¿½ï¿½Ì¾ï¿½ bitó��
    short            m_nHliLevelIdx;                // ëª‡ ë²ˆì§¸ ë ˆë²¨(채널)인가?
    int                m_nHliLayers;                // í•´ë‹¹ê²°í•¨ì— í¬í•¨ëœ ë ˆì´ì–´ bit처리
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ì •ë³´ ì¶”ê°€
    char            m_strAoiImagePath[255];
    char            m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
    int                m_nAlignRectRight;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    _grmDefectReviewData m_ReviewDefect;
};
@@ -556,32 +558,35 @@
struct _grmDitMemInfo
{
    //���� ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/12]
    //공유 ë©”모리 ìƒì„±í•  ê³µê°„ ê²°ì • [김태현 2018/11/12]
    size_t m_nGlassRawDataSize;
    int m_nGlassMaxDataNum;
    int m_nBlockMaxDataNum;
    int m_nCellMaxDataNum;
    int m_nDefectMaxDataNum;
    int m_nStackMaxDataNum;
    int m_nRawMergeMaxDataNum;
    //Char ï¿½ï¿½ï¿½ï¿½ ï¿½Ú·á°¡ ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡ [������ 2018/11/12]
    //Char ê¸°ì¤€ ìžë£Œê°€ ìžˆëŠ” ì‹œìž‘ ìœ„치 [김태현 2018/11/12]
    int m_nGlassDataPoint;
    int m_nBlockDataPoint;
    int m_nCellDataPoint;
    int m_nDefectDataPoint;
    int m_nStackDataPoint;
    int m_nRawMergeDataPoint;
    int m_nSizeOfGlassData;
    int m_nSizeOfBlockData;
    int m_nSizeOfCellData;
    int m_nSizeOfDefectData;
    int m_nSizeOfStackData;
    int m_nSizeOfRawMergeData;
};
struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
{
    size_t m_nGlassLoadingCount;
    emAOIProcStep m_ClientProcStep; //AOI, Review�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)�� Ã³ï¿½ï¿½ ï¿½Ï·ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ClientProcStep; //AOI, Review가 ë³´ë‚¸ ëª…ë ¹
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 ì²˜ë¦¬ ì™„료 í•œ ëª…ë ¹
};
class CgrmGlassRawData
@@ -668,7 +673,7 @@
    {
        if(pInfo == NULL || pData == NULL) return FALSE;
        if(1) //new type //�޸� ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å©ï¿½â¿¡ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
        if(1) //new type //메모리 ì´ ê³µê°„ í¬ê¸°ì— ìƒê´€ì—†ì´
        {
            //if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
ReviewHistory/bin/Config/PathSetting.ini
@@ -1,5 +1,5 @@
[Path]
Align=D:\ResultData\Align\
Bin=D:\DIT_ResultData\RawBin\
Inspector=D:\Image\Defect
Inspector=\\126.100.100.1\d\Image\Defect
Review=D:\ResultData\UploadImage\
ReviewHistory/bin/ReviewHistroy.exe
Binary files differ
ReviewSystem/CHAlignFinder/AlignFinder.cpp
@@ -205,7 +205,6 @@
    CCHImageData tempImage;
    CCHImageProcess::ImageNormalize(&resultImage, &m_BlobImage, 0, 255);
    //테스트 í•„ìš”
    if (findResult.dMatchValue<m_findParam.dMatchRate)
    {
        findResult.nResultCode = AlignMatch_LowScore;
ReviewSystem/CHDefectPicker/DefectPicker.cpp
@@ -45,7 +45,9 @@
            SReviewResult dataResult = vecSorterResult->at(nIndx);    
            if(dataResult.nLocation != DefectLoc_ASG && dataResult.nLocation != DefectLoc_PAD && dataResult.nLocation != DefectLoc_C2C)    continue;
            //LYW 210810 DeleteStart
            //if(dataResult.nLocation != DefectLoc_ASG && dataResult.nLocation != DefectLoc_PAD && dataResult.nLocation != DefectLoc_C2C)    continue;
            //LYW 210810 DeleteEnd
            dataResult.nResultIdx = index;
            dataResult.nSequenceNo = index++;
@@ -69,7 +71,9 @@
            SReviewResult dataResult = vecSorterResult->at(nIndx);    
            if(dataResult.nLocation == DefectLoc_ASG || dataResult.nLocation == DefectLoc_PAD || dataResult.nLocation == DefectLoc_C2C)    continue;
            //LYW 210810 DeleteStart
            //if(dataResult.nLocation == DefectLoc_ASG || dataResult.nLocation == DefectLoc_PAD || dataResult.nLocation == DefectLoc_C2C)    continue;
            //LYW 210810 DeleteEnd
            dataResult.nResultIdx = index;
            dataResult.nSequenceNo = index++;
ReviewSystem/CHReviewResult/GlassResult.cpp
@@ -160,8 +160,10 @@
    m_vecWsiMultiShotScheduleResult.clear();
    //FDC보고용 Review Contrast
    nReview00ImageContrast = 0;
    nReview01ImageContrast = 0;
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD Start
    nReview00ImageContrast = 50;
    nReview01ImageContrast = 50;
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD End
    // defect result
    for (MapDefectResultIt it = m_mapDefectResult.begin(); it != m_mapDefectResult.end(); it++)
@@ -309,8 +311,10 @@
    m_vecWsiMultiShotScheduleResult.clear();
    //FDC보고용 Review Contrast
    nReview00ImageContrast = -1;
    nReview01ImageContrast = -1;
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD Start
    nReview00ImageContrast = 50;
    nReview01ImageContrast = 50;
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD End
    //// defect result
    //for (MapDefectResultIt it = m_mapDefectResult.begin(); it != m_mapDefectResult.end(); it++)
    //{
ReviewSystem/CHReviewSetting/Sys_SignalManager.cpp
@@ -38,6 +38,12 @@
    strItem.Format(_T("SYS_SIGNAL_PERIOD_TIME"));
    macroFile.SetItem(strItem, m_SignalInfo.GetMSPeriod());
    strItem.Format(_T("SYS_SIGNAL_DEFOCUS_VALUE_MIN"));
    macroFile.SetItem(strItem, m_SignalInfo.GetDefocusValueMin());
    strItem.Format(_T("SYS_SIGNAL_DEFOCUS_VALUE_MAX"));
    macroFile.SetItem(strItem, m_SignalInfo.GetDefocusValueMax());
    strItem.Format(_T("SYS_SIGNAL_LOADING_SIGNAL_DELAY"));
    macroFile.SetItem(strItem, m_SignalInfo.GetMSLoadingSignalDelay());
@@ -140,6 +146,14 @@
    macroFile.GetItem(strItem, nData);
    m_SignalInfo.SetMSPeriod(nData);
    strItem.Format(_T("SYS_SIGNAL_DEFOCUS_VALUE_MIN"));
    macroFile.GetItem(strItem, nData);
    m_SignalInfo.SetDefocusValueMin(nData);
    strItem.Format(_T("SYS_SIGNAL_DEFOCUS_VALUE_MAX"));
    macroFile.GetItem(strItem, nData);
    m_SignalInfo.SetDefocusValueMax(nData);
    strItem.Format(_T("SYS_SIGNAL_LOADING_SIGNAL_DELAY"));
    macroFile.GetItem(strItem, nData);
    m_SignalInfo.SetMSLodingSignalDelay(nData);
ReviewSystem/M_AutoDiagnosisManager/DiagnosisInfo.cpp
@@ -19,6 +19,12 @@
    file.GetItem(_T("FLATNESS_JUDGE_DATA_Z_RANGE"), m_dJudgeData_ZRange, 0);
    file.GetItem(_T("FLATNESS_GLASS_X"), m_nGlassSizeX, 0);
    file.GetItem(_T("FLATNESS_GLASS_Y"), m_nGlassSizeY, 0);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    file.GetItem(_T("FLATNESS_SKIPMODE"), m_nFlatnessSkipMode, 0);
    file.GetItem(_T("SQUARENESS_STANDARD"), m_dSquarenessStandard, 0);
    file.GetItem(_T("SQUARENESS_STANDARD2"), m_dSquarenessStandard2, 0);
    file.GetItem(_T("WSI_STANDARD"), m_dWSIStandard, 0);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    file.GetItem(_T("FLATNESS_MODE"), m_nFlatnessMode, 0);
    file.GetItem(_T("FLATNESS_RANGECOUNT"), m_nRangeCount_Flatness, 0);
    file.GetItem(_T("WSI_PANEL_COUNT"), m_nPanelCount_Wsi, 0);
ReviewSystem/M_AutoDiagnosisManager/DiagnosisManager.cpp
@@ -1013,6 +1013,15 @@
    return CreateDirectory(strTemp, NULL);
}
BOOL CDiagnosisManager::CheckManualMode()
{
    if (m_pDP2P->IDP2P_CheckManualMode() == TRUE)
    {
        return TRUE;
    }
    return FALSE;
}
int CDiagnosisManager::SetDiagnosisResultCount_Squareness(int nCount)
{
    if (nCount == int(m_vecDiagnosisResult_Squareness.size())) return int(m_vecDiagnosisResult_Squareness.size());
ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp
@@ -50,6 +50,8 @@
{
    if (pParameter == NULL) return;
    CString strMessage = "";
    CDiagnosisProcessData* pProcessData = static_cast<CDiagnosisProcessData*>(pParameter);
    int nProcessMode = pProcessData->nProcessMode;
@@ -60,20 +62,69 @@
        m_pManager->m_bProcessAll = true;
        ProcessAll();
        break;
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    case DiagnosisMode_Review :
        strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisMode_Review START"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        m_pManager->m_bProcessAll = false;
        if (IsCommandStop()) return;
        m_pDP2P->IDP2P_SetDialogTap(0);
        ProcessSquareness();
        Sleep(1000);
        if (IsCommandStop()) return;
        m_pDP2P->IDP2P_SetDialogTap(1);
        ProcessFlatness();
        Sleep(1000);
        if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
            strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
        strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisMode_Review END"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        break;
    case DiagnosisMode_Wsi:
        strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisMode_WSI START"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        m_pManager->m_bProcessAll = false;
        if (IsCommandStop()) return;
        m_pDP2P->IDP2P_UpdateDialog(7);
        ProcessWsi();
        Sleep(1000);
        if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
            strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
        strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisMode_WSI END"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        break;
    case DiagnosisMode_Squareness:
        m_pManager->m_bProcessAll = false;
        ProcessSquareness();
        Sleep(1000);
        if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
            strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
        break;
    case DiagnosisMode_Wsi:
        m_pManager->m_bProcessAll = false;
        ProcessWsi();
        break;
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    case DiagnosisMode_Flatness:
        m_pManager->m_bProcessAll = false;
        ProcessFlatness();
        Sleep(1000);
        if (ProcessDiagnosisJudge(nProcessMode) == FALSE) {
            strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
        break;
    case DiagnosisMode_Flatness_Manual:
@@ -94,6 +145,8 @@
int CDiagnosisProcessor::ProcessAll()
{
    if (IsCommandStop()) return 1;
    CString strMessage = "";
    
    m_pDP2P->IDP2P_UpdateDialog(7);//WSI Result ì¹¸ ì´ˆê¸°í™” 
    //if (m_pDP2P == NULL) return 0;
@@ -114,53 +167,16 @@
    m_pDP2P->IDP2P_SetDialogTap(1);
    ProcessFlatness();
    Sleep(2000);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    //Sleep(2000);
    Sleep(1000);
    //#3407 KYH ìžê°€ì§„단 Judge íŒì • ë° ì•ŒëžŒ ë°œìƒ ê¸°ëŠ¥ ADD START
    for (int i = 0; i < 2; i++)
    {
        int nSelModuleIndex = i;
        CDiagnosisInfo* pSettingInfo = m_pManager->GetDiagnosisInfo();
        if (pSettingInfo == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(4);
            return 0;
        }
        CDiagnosisResult* pProcessResult = m_pManager->GetDiagnosisResult_Squareness(nSelModuleIndex); // 0412 kyh ì§ê°ë„ ì¸¡ì • ëª¨ë“ˆì— ëŒ€í•œ ê²°ê³¼ì •ë³´
        if (pProcessResult == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(4);
            return 0;
        }
        CDiagnosisResult* pProcessWSIResult = m_pManager->GetDiagnosisResult_Wsi(nSelModuleIndex); // 0412 kyh WSI ì¸¡ì • ëª¨ë“ˆì— ëŒ€í•œ ê²°ê³¼ ì •ë³´
        if (pProcessWSIResult == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(6);
            return 0;
        }
        CString strMessage = _T("");
        double dDate = (90 - pProcessResult->GetGantryDegree());
        if (abs(dDate) >= abs(pSettingInfo->GetJudgeData_Degree())) // 0412 kyh ì§ê°ë„에서 ë‚˜ì˜¨ Dgree ê°’이 ì„¤ì •한 Judge ê°’보다 í¬ê±°ë‚˜ ê°™ì„경우
        {
            m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // ì•ŒëžŒ ë°œìƒ
            strMessage.Format(_T("[Judge Data] [Gantry %d]Diagnosis Error ! GantryDegree[%lf] Judge[%lf]"), i, dDate, pSettingInfo->GetJudgeData_Degree());
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
        if (pProcessWSIResult->getWSI_RTB() >= pSettingInfo->GetJudgeData_3Sigma() || pProcessWSIResult->getWSI_RTB() <= 0) // 0412 kyh WSI í‘œì¤€íŽ¸ì°¨ ë¹„교
        {
            m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // ì•ŒëžŒ ë°œìƒ
            strMessage.Format(_T("[Judge Data] [WSI %d]Diagnosis Error ! WSI RTB[%lf] Judge[%lf]"), i, pProcessWSIResult->getWSI_RTB(), pSettingInfo->GetJudgeData_3Sigma());
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        }
    if (ProcessDiagnosisJudge(DiagnosisMode_All) == FALSE) {
        strMessage.Format(_T("[CDiagnosisProcessor] DiagnosisJudge FAIL"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
    }
    //#3407 KYH ìžê°€ì§„단 Judge íŒì • ë° ì•ŒëžŒ ë°œìƒ ê¸°ëŠ¥ ADD END
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    //컴플릿트 ì‹ í˜¸ ë³´ë‚´ê¸°
    m_pDP2P->IDP2P_DiagnosisSendCompleteSig();
    m_pManager->m_bProcessAll = false;
    return 1;
@@ -284,7 +300,10 @@
        int stTime = GetTickCount();
        while (1)
        {
            if (11000 <= GetTickCount() - stTime)
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
            //if (11000 <= GetTickCount() - stTime)
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
            if (1500 <= GetTickCount() - stTime)
            {
                break;
            }
@@ -292,14 +311,22 @@
        }
        m_pDP2P->IDP2P_SetAFMTracking(nSelModuleIndex, TRUE);
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
        //Sleep(1000);
        Sleep(1000);
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
        CString strimagename;
        strimagename.Format(_T("%s_Module[%d]Index[%d].bmp"), m_pManager->m_strResultImageFileName, nSelModuleIndex, nIdx);
        // find mark at panel
        double dFindPixX = 0., dFindPixY = 0.;
        if (m_pDP2P->IDP2P_FindPanelCenter(nSelModuleIndex, dFindPixX, dFindPixY, strimagename) == FALSE) continue;
        if (m_pDP2P->IDP2P_FindPanelCenter(nSelModuleIndex, dFindPixX, dFindPixY, strimagename) == FALSE) {
            strMessage.Format(_T("[CDiagnosisProcessor] find mark at panel FAIL"));
            m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
            continue;
        }
        m_pDP2P->IDP2P_SetAFMTracking(nSelModuleIndex, FALSE);
@@ -435,7 +462,10 @@
        }
        m_pDP2P->IDP2P_SetWsiManualMeasure(nSelModuleIndex, dXpos, dYpos);
        // move panel
        Sleep(2000);
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
        //Sleep(2000);
        Sleep(1000);
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
        m_pDP2P->IDP2P_MotorGo(nSelModuleIndex, dXpos, dYpos);
        if (m_pDP2P->IDP2P_IsGantryMotionEnd(nSelModuleIndex) == FALSE)
@@ -447,7 +477,10 @@
        int stTime = GetTickCount();
        while (1)
        {
            if (10000 <= GetTickCount() - stTime)
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
            //if (10000 <= GetTickCount() - stTime)
            if (11000 <= GetTickCount() - stTime)
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
            {
                break;
            }
@@ -508,8 +541,18 @@
{
    if (m_pDP2P == NULL || m_pManager == NULL) return 0;
    CString strMessage = "";
    CDiagnosisInfo * pSettingInfo = m_pManager->GetDiagnosisInfo();
    if (pSettingInfo == NULL) return 0;
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    if (pSettingInfo->GetFlastnessSkipMode() == TRUE) {
        strMessage.Format(_T("[CDiagnosisProcessor] FlastnessSkipMode!"));
        m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
        return 0;
    }
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    int nSelModuleIndex = m_pDP2P->IDP2P_GetSelectedModuleIndex();
    int nFlatnessMode = pSettingInfo->GetFlatnessMode();
@@ -550,38 +593,41 @@
        {
            // AF Home
            m_pDP2P->IDP2P_AFMHomePosition(0);
            Sleep(5000);
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
            //Sleep(5000);
            Sleep(1000);
            //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
            m_pDP2P->IDP2P_SetAFMTracking(0, TRUE);
            Sleep(500);
        }
        if (nIdx == 0)
        {
            pResultPoint[nIdx].dPosX = 657.425
                ;
            pResultPoint[nIdx].dPosY = 540.14
                ;
        }
        else if (nIdx == 1)
        {
            pResultPoint[nIdx].dPosX = 657.425
                ;
            pResultPoint[nIdx].dPosY = 2278.636
                ;
        }
        else if (nIdx == 2)
        {
            pResultPoint[nIdx].dPosX = 2096.944
                ;
            pResultPoint[nIdx].dPosY = 540.141
                ;
        }
        else if (nIdx == 3)
        {
            pResultPoint[nIdx].dPosX = 2096.944
                ;
            pResultPoint[nIdx].dPosY = 2278.636;
        }
//         if (nIdx == 0)
//         {
//             pResultPoint[nIdx].dPosX = 657.425
//                 ;
//             pResultPoint[nIdx].dPosY = 540.14
//                 ;
//         }
//         else if (nIdx == 1)
//         {
//             pResultPoint[nIdx].dPosX = 657.425
//                 ;
//             pResultPoint[nIdx].dPosY = 2278.636
//                 ;
//         }
//         else if (nIdx == 2)
//         {
//             pResultPoint[nIdx].dPosX = 2096.944
//                 ;
//             pResultPoint[nIdx].dPosY = 540.141
//                 ;
//         }
//         else if (nIdx == 3)
//         {
//             pResultPoint[nIdx].dPosX = 2096.944
//                 ;
//             pResultPoint[nIdx].dPosY = 2278.636;
//         }
        //1. ëª¨í„°ë¥¼ ì´ë™
@@ -689,6 +735,61 @@
    return TRUE;
}
int CDiagnosisProcessor::ProcessDiagnosisJudge(int nMode)
{
    for (int i = 0; i < 2; i++)
    {
        int nSelModuleIndex = i;
        CDiagnosisInfo* pSettingInfo = m_pManager->GetDiagnosisInfo();
        if (pSettingInfo == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(4);
            return 0;
        }
        CDiagnosisResult* pProcessResult = m_pManager->GetDiagnosisResult_Squareness(nSelModuleIndex); // 0412 kyh ì§ê°ë„ ì¸¡ì • ëª¨ë“ˆì— ëŒ€í•œ ê²°ê³¼ì •ë³´
        if (pProcessResult == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(4);
            return 0;
        }
        CDiagnosisResult* pProcessWSIResult = m_pManager->GetDiagnosisResult_Wsi(nSelModuleIndex); // 0412 kyh WSI ì¸¡ì • ëª¨ë“ˆì— ëŒ€í•œ ê²°ê³¼ ì •ë³´
        if (pProcessWSIResult == NULL) {
            m_pDP2P->IDP2P_UpdateDialog(6);
            return 0;
        }
        CString strMessage = _T("");
        if (nMode == DiagnosisMode_All || nMode == DiagnosisMode_Review || nMode == DiagnosisMode_Squareness)
        {
            double dDate = (90 - pProcessResult->GetGantryDegree());
            if (abs(dDate) >= abs(pSettingInfo->GetJudgeData_Degree())) // 0412 kyh ì§ê°ë„에서 ë‚˜ì˜¨ Dgree ê°’이 ì„¤ì •한 Judge ê°’보다 í¬ê±°ë‚˜ ê°™ì„경우
            {
                m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // ì•ŒëžŒ ë°œìƒ
                strMessage.Format(_T("[Judge Data] [Gantry %d]Diagnosis Error ! GantryDegree[%lf] Judge[%lf]"), i, dDate, pSettingInfo->GetJudgeData_Degree());
                m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
            }
        }
        if (nMode == DiagnosisMode_All || nMode == DiagnosisMode_Wsi)
        {
            if (pProcessWSIResult->getWSI_RTB() >= pSettingInfo->GetJudgeData_3Sigma() || pProcessWSIResult->getWSI_RTB() <= 0) // 0412 kyh WSI í‘œì¤€íŽ¸ì°¨ ë¹„교
            {
                m_pDP2P->IDP2P_DiagnosisSendJudgeAlarm(); // ì•ŒëžŒ ë°œìƒ
                strMessage.Format(_T("[Judge Data] [WSI %d]Diagnosis Error ! WSI RTB[%lf] Judge[%lf]"), i, pProcessWSIResult->getWSI_RTB(), pSettingInfo->GetJudgeData_3Sigma());
                m_pDP2P->IDP2P_DisplayMessage(0, strMessage);
            }
        }
    }
    //#3407 KYH ìžê°€ì§„단 Judge íŒì • ë° ì•ŒëžŒ ë°œìƒ ê¸°ëŠ¥ ADD END
    //컴플릿트 ì‹ í˜¸ ë³´ë‚´ê¸°
    m_pDP2P->IDP2P_DiagnosisSendCompleteSig();
    return 1;
}
BOOL CDiagnosisProcessor::CalculateSquareness(int nIndex)
{
    if (m_pDP2P == NULL || m_pManager == NULL) return 0;
@@ -787,8 +888,21 @@
        for (int nIdx = 0; nIdx < nPanelCount; nIdx++)
        {
            const SPositionData* pSettingPos = pSettingResult->GetPositionData_Squareness(nIdx);
            const SPositionData* pDataPos = pProcessResult->GetPositionData_Squareness(nIdx);
            //LYW 210811
            const SPositionData* pSettingPos;
            const SPositionData* pDataPos;
            if (nSelModuleIndex == 1)
            {
                pSettingPos = pSettingResult->GetPositionData_Squareness(nIdx);
                pDataPos = pProcessResult->GetPositionData_Squareness(nIdx + 3);
            }
            else
            {
                pSettingPos = pSettingResult->GetPositionData_Squareness(nIdx);
                pDataPos = pProcessResult->GetPositionData_Squareness(nIdx);
            }
            //LYW 210811
            if (pSettingPos == NULL || pDataPos == NULL) continue;
            dMotorPosX[nIdx] = pSettingPos->dPosX;
ReviewSystem/M_AutoDiagnosisManager/M_AutoDiagnosisManager.vcxproj
@@ -190,6 +190,7 @@
      </ModuleDefinitionFile>
      <AdditionalLibraryDirectories>../lib;../../Internal_Library/lib;</AdditionalLibraryDirectories>
      <AdditionalDependencies>CHThreadPools_x64_vc15.lib</AdditionalDependencies>
      <ImportLibrary>$(SolutionDir)\lib\$(TargetName).lib</ImportLibrary>
    </Link>
    <Midl>
      <MkTypLibCompatible>false</MkTypLibCompatible>
ReviewSystem/ReviewRecipeEditor/DlgReview.cpp
@@ -290,7 +290,8 @@
                if(strArrayOption.GetSize() > 0)
                {
                    strItemText = strArrayOption.GetAt(pRcpPriorityInfo->GetPriorityStackData());
                    //LYW ERR수정
                    strItemText = strArrayOption.GetAt(pRcpPriorityInfo->GetPriorityGrayData());
                    m_ctrlGridFilterinfo.SetItemText(nRowIdx, nColIdx++, strItemText);
                }
            }
ReviewSystem/ReviewRecipeEditor/ReviewRecipeEditorDlg.cpp
@@ -1,5 +1,5 @@
// ReviewRecipeEditorDlg.cpp : êµ¬í˜„ íŒŒì¼
// ReviewRecipeEditorDlg.cpp : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
//
#include "stdafx.h"
@@ -17,7 +17,7 @@
#endif
// CReviewRecipeEditorDlg ëŒ€í™” ìƒìž
// CReviewRecipeEditorDlg ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½
CReviewRecipeEditorDlg::CReviewRecipeEditorDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CReviewRecipeEditorDlg::IDD, pParent)
@@ -162,18 +162,18 @@
END_MESSAGE_MAP()
// CReviewRecipeEditorDlg ë©”시지 ì²˜ë¦¬ê¸°
// CReviewRecipeEditorDlg ï¿½Þ½ï¿½ï¿½ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½
BOOL CReviewRecipeEditorDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // ì´ ëŒ€í™” ìƒìžì˜ ì•„이콘을 ì„¤ì •합니다. ì‘ìš© í”„로그램의 ì£¼ ì°½ì´ ëŒ€í™” ìƒìžê°€ ì•„닐 ê²½ìš°ì—ëŠ”
    //  í”„레임워크가 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
    SetIcon(m_hIcon, TRUE);            // í° ì•„이콘을 ì„¤ì •합니다.
    SetIcon(m_hIcon, FALSE);        // ìž‘은 ì•„이콘을 ì„¤ì •합니다.
    // ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Æ´ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
    //  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, TRUE);            // Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, FALSE);        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    // TODO: ì—¬ê¸°ì— ì¶”ê°€ ì´ˆê¸°í™” ìž‘업을 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ß°ï¿½ ï¿½Ê±ï¿½È­ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    //m_bReviewSystemPC = IsReviewSystemPC();
    m_bReviewSystemPC = TRUE;
    pReviewRecipeEditor = this;
@@ -189,29 +189,29 @@
    InitRecipeListGridControl();
    RefreshRecipeList();
    return TRUE;  // í¬ì»¤ìŠ¤ë¥¼ ì»¨íŠ¸ë¡¤ì— ì„¤ì •하지 ì•Šìœ¼ë©´ TRUE를 ë°˜í™˜í•©ë‹ˆë‹¤.
    return TRUE;  // ï¿½ï¿½Ä¿ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ TRUE�� ï¿½ï¿½È¯ï¿½Õ´Ï´ï¿½.
}
// ëŒ€í™” ìƒìžì— ìµœì†Œí™” ë‹¨ì¶”를 ì¶”가할 ê²½ìš° ì•„이콘을 ê·¸ë¦¬ë ¤ë©´
//  ì•„래 ì½”드가 í•„요합니다. ë¬¸ì„œ/ë·° ëª¨ë¸ì„ ì‚¬ìš©í•˜ëŠ” MFC ì‘ìš© í”„로그램의 ê²½ìš°ì—ëŠ”
//  í”„레임워크에서 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
// ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú¿ï¿½ ï¿½Ö¼ï¿½È­ ï¿½ï¿½ï¿½ß¸ï¿½ ï¿½ß°ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½ï¿½ï¿½ï¿½
//  ï¿½Æ·ï¿½ ï¿½Úµå°¡ ï¿½Ê¿ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½/�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
//  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
void CReviewRecipeEditorDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // ê·¸ë¦¬ê¸°ë¥¼ ìœ„한 ë””바이스 ì»¨í…ìŠ¤íŠ¸
        CPaintDC dc(this); // ï¿½×¸ï¿½ï¿½â¸¦ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ì½ï¿½ ï¿½ï¿½ï¿½Ø½ï¿½Æ®
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
        // í´ë¼ì´ì–¸íЏ ì‚¬ê°í˜•에서 ì•„이콘을 ê°€ìš´ë°ì— ë§žì¶¥ë‹ˆë‹¤.
        // Å¬ï¿½ï¿½ï¿½Ì¾ï¿½Æ® ï¿½ç°¢ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½îµ¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½.
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;    
        // ì•„이콘을 ê·¸ë¦½ë‹ˆë‹¤.
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½Ï´ï¿½.
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
@@ -220,8 +220,8 @@
    }
}
// ì‚¬ìš©ìžê°€ ìµœì†Œí™”된 ì°½ì„ ë„는 ë™ì•ˆì— ì»¤ì„œê°€ í‘œì‹œë˜ë„록 ì‹œìŠ¤í…œì—ì„œ
//  ì´ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
// ï¿½ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Ö¼ï¿½È­ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½È¿ï¿½ Ä¿ï¿½ï¿½ï¿½ï¿½ Ç¥ï¿½ÃµÇµï¿½ï¿½ï¿½ ï¿½Ã½ï¿½ï¿½Û¿ï¿½ï¿½ï¿½
//  ï¿½ï¿½ ï¿½Ô¼ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
HCURSOR CReviewRecipeEditorDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
@@ -230,7 +230,7 @@
void CReviewRecipeEditorDlg::OnBnClickedButtonReviewRcpEditorCreate()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    BOOL bUseRecipeInfo = FALSE;
    int nIdx;
    CString strRecipeName, strNewRecipeName, strMessage;
@@ -240,7 +240,7 @@
    if(cellID.row > 0 && cellID.col > 0)
    {
        strRecipeName = m_ctrlGridRecipeList.GetItemText(cellID.row, 1);
        strMessage.Format(_T("Do you want to create new recipe using %s recipe information?"), strRecipeName);//_T("%s ë ˆì‹œí”¼ ì •보를 ì´ìš©í•˜ì—¬ ìƒì„±í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"), strRecipeName);
        strMessage.Format(_T("Do you want to create new recipe using %s recipe information?"), strRecipeName);//_T("%s ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¿ï¿½ï¿½Ï¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï½Ã°Ú½ï¿½ï¿½Ï±ï¿½?"), strRecipeName);
        //if (IDYES == AfxMessageBox(strMessage, MB_YESNO | MB_ICONQUESTION))
        //{
@@ -268,11 +268,11 @@
        if(nIdx != -1)
        {
            strTemp = strTemp.Mid(nIdx + 1);
            strNewPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
            strNewPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp); //210805
        }
        else
        {
            strNewPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strNewRecipeName);
            strNewPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strNewRecipeName);  //210805
        }
    }
@@ -290,22 +290,22 @@
            if(nIdx != -1)
            {
                strTemp = strTemp.Mid(nIdx + 1);
                strSrcPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
                strSrcPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp); //210805
            }
            else
            {
                strSrcPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);
                strSrcPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);  //210805
            }
        }
            
        if(CopyFile(strSrcPath, strNewPath, FALSE) == FALSE)
        {
            strMessage.Format(_T("Fail to create %s recipe"));//_T("%s ë ˆì‹œí”¼ ìƒì„± ì‹¤íŒ¨!"));
            strMessage.Format(_T("Fail to create %s recipe"));//_T("%s ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½!"));
            AfxMessageBox(strMessage);
        }
        else
        {
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD START
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
            CString strBackupPath = _REVIEW_RECIPE_BACKUP_PATH_CPJT;
            CreateDirectory(strBackupPath, NULL);
@@ -316,9 +316,9 @@
            strSource.Format(_T("%s\\%s.rcp"), _REVIEW_RECIPE_PATH_, strNewRecipeName);
            strDest.Format(_T("%s\\%s.rcp"), strBackupPath, strNewRecipeName);
            CopyFile(strSource, strDest, TRUE);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD END
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
            COPYDATA_RECIPE2REV copyData;
            copyData.Message = MsgRecipe2Rev_RecipeCreate;
            copyData.nPPID = _ttoi(strNewRecipeName);
@@ -331,12 +331,12 @@
        if(file.Open(strNewPath, CFile::modeCreate | CFile::modeWrite) == FALSE)
        {
            strMessage.Format(_T("Fail to create %s recipe"));//_T("%s ë ˆì‹œí”¼ ìƒì„± ì‹¤íŒ¨!"));
            strMessage.Format(_T("Fail to create %s recipe"));//_T("%s ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½!"));
            AfxMessageBox(strMessage);
        }
        else
        {
            strMessage.Format(_T("Please select the default file!"));//_T("먼저 ê¸°ë³¸ íŒŒì¼ì„ ì„ íƒí•´ì£¼ì„¸ìš”!"));
            strMessage.Format(_T("Please select the default file!"));//_T("���� ï¿½âº» ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö¼ï¿½ï¿½ï¿½!"));
            AfxMessageBox(strMessage);                
        }
@@ -368,7 +368,7 @@
void CReviewRecipeEditorDlg::OnBnClickedButtonReviewRcpEditorDelete()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    int nIdx;
    CString strRecipeName, strPath, strMessage, strTemp;
    CCellID cellID = m_ctrlGridRecipeList.GetFocusCell();
@@ -389,20 +389,20 @@
            if (nIdx != -1)
            {
                strTemp = strTemp.Mid(nIdx + 1);
                strPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
                strPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp); //210805
            }
            else
            {
                strPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);
                strPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName); //210805
            }
        }
        //_T("%s ë ˆì‹œí”¼ë¥¼ ì‚­ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?"), strRecipeName);
        //_T("%s ï¿½ï¿½ï¿½ï¿½ï¿½Ç¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï½Ã°Ú½ï¿½ï¿½Ï±ï¿½?"), strRecipeName);
        strMessage.Format(_T("Do you want to delete %s recipe?"), strRecipeName);
        if (IDYES == AfxMessageBox(strMessage, MB_YESNO | MB_ICONQUESTION))
        {
            // [2017:5:20]-[WEZASW] : í˜„재 ì ìš©ëœ Recipe(PPID)는 ì‚­ì œ ê¸ˆì§€ ìš”ì²­.
            // [2017:5:20]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ Recipe(PPID)�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã».
            if (strRecipeName.Compare(m_strCurrentRecipeName) == 0)
            {
                strMessage.Format(_T("Currently applied Recipe(%s) can not be deleted!"), strRecipeName);
@@ -411,16 +411,16 @@
            }
            DeleteFile(strPath);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD START
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
            CString strBackupPath = _REVIEW_RECIPE_BACKUP_PATH_CPJT;
            CString strDest;
            strDest.Format(_T("%s\\%s.rcp"), strBackupPath, strRecipeName);
            DeleteFile(strDest);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD END
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
            COPYDATA_RECIPE2REV copyData;
            copyData.Message = MsgRecipe2Rev_RecipeDelete;
            copyData.nPPID = _ttoi(strRecipeName);
@@ -429,7 +429,7 @@
    }
    else
    {
        AfxMessageBox(_T("Please select recipe."));//_T("레시피를 ì„ íƒí•˜ì„¸ìš”."));
        AfxMessageBox(_T("Please select recipe."));//_T("�����Ǹ� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ï¿½ï¿½."));
    }
    RefreshRecipeList();
@@ -442,7 +442,7 @@
void CReviewRecipeEditorDlg::OnBnClickedButtonReviewRcpEditorLoad()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    BOOL bReturn;
    CString strRecipeName;
    CCellID cellID = m_ctrlGridRecipeList.GetFocusCell();
@@ -456,7 +456,7 @@
        {
            m_strCurrentRecipeName = strRecipeName;
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
            COPYDATA_RECIPE2REV copyData;
            copyData.Message = MsgRecipe2Rev_RecipeChange;
            copyData.nPPID = _ttoi(m_strCurrentRecipeName);
@@ -471,7 +471,7 @@
    }
    else
    {
        AfxMessageBox(_T("Please select recipe."));//_T("레시피를 ì„ íƒí•˜ì„¸ìš”."));
        AfxMessageBox(_T("Please select recipe."));//_T("�����Ǹ� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ï¿½ï¿½."));
    }
}
@@ -517,7 +517,7 @@
        if (bRet)
        {
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
            COPYDATA_RECIPE2REV copyData;
            copyData.Message = MsgRecipe2Rev_RecipeModify;
            copyData.nPPID = _ttoi(RecipeName);
@@ -540,14 +540,14 @@
            strDest.Format(_T("%s\\%s_%s.rcp"), strBackupPath, RecipeName, strBackupFile);
            CopyFile(strSource, strDest, TRUE);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD START
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
            strBackupPath = _REVIEW_RECIPE_BACKUP_PATH_CPJT;
            CreateDirectory(strBackupPath, NULL);
            strSource.Format(_T("%s\\%s.rcp"), _REVIEW_RECIPE_PATH_, RecipeName);
            strDest.Format(_T("%s\\%s.rcp"), strBackupPath, RecipeName);
            CopyFile(strSource, strDest, TRUE);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD END
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
            strMessage.Format(_T("Complete to save %s recipe!"), RecipeName);
            //AfxMessageBox(strMessage);
@@ -567,7 +567,7 @@
void CReviewRecipeEditorDlg::OnBnClickedButtonReviewRcpEditorSave()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    CString strMessage;
    if (m_strCurrentRecipeName.IsEmpty())
@@ -584,7 +584,7 @@
        if (bRet)
        {
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
            // [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
            COPYDATA_RECIPE2REV copyData;
            copyData.Message = MsgRecipe2Rev_RecipeModify;
            copyData.nPPID = _ttoi(m_strCurrentRecipeName);
@@ -607,14 +607,14 @@
            strDest.Format(_T("%s\\%s_%s.rcp"), strBackupPath, m_strCurrentRecipeName, strBackupFile);
            CopyFile(strSource, strDest, TRUE);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD START
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
            strBackupPath = _REVIEW_RECIPE_BACKUP_PATH_CPJT;
            CreateDirectory(strBackupPath, NULL);
            strSource.Format(_T("%s\\%s.rcp"), _REVIEW_RECIPE_PATH_, m_strCurrentRecipeName);
            strDest.Format(_T("%s\\%s.rcp"), strBackupPath, m_strCurrentRecipeName);
            CopyFile(strSource, strDest, FALSE);
            //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD END
            //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
            strMessage.Format(_T("Complete to save %s recipe!"), m_strCurrentRecipeName);
            AfxMessageBox(strMessage);
@@ -641,7 +641,7 @@
void CReviewRecipeEditorDlg::OnBnClickedButtonReviewrcpEditorExit()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    DestroyWindow();
}
@@ -706,15 +706,15 @@
void CReviewRecipeEditorDlg::InitTabControl()
{
    int nIdx = 0;
    m_ctrlTabMain.InsertItem(nIdx++, _T("Common"));            //_T("  ê³µí†µ  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Review"));            //_T("  ë¦¬ë·°  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Common"));            //_T("  ï¿½ï¿½ï¿½ï¿½  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Review"));            //_T("  ï¿½ï¿½ï¿½ï¿½  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("WSI"));            //_T("  WSI  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Align"));            //_T(" ì–¼ë¼ì¸ "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Judgement"));        //_T(" íŒì •  "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Align"));            //_T(" ï¿½ï¿½ï¿½ï¿½ï¿½ "));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Judgement"));        //_T(" ï¿½ï¿½ï¿½ï¿½  "));
    // ë¯¸ì‚¬ìš©ìœ¼ë¡œ ì œì™¸
//    m_ctrlTabMain.InsertItem(nIdx++, _T("Measure"));        //_T("  ì¸¡ì •  "));
//    m_ctrlTabMain.InsertItem(nIdx++, _T("Finding Defect"));    //_T(" ê²°í•¨ì°¾ê¸° "));
    // ï¿½Ì»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
//    m_ctrlTabMain.InsertItem(nIdx++, _T("Measure"));        //_T("  ï¿½ï¿½ï¿½ï¿½  "));
//    m_ctrlTabMain.InsertItem(nIdx++, _T("Finding Defect"));    //_T(" ï¿½ï¿½ï¿½ï¿½Ã£ï¿½ï¿½ "));
    //m_ctrlTabMain.InsertItem(nIdx++, _T("Glass"));            //_T(" Glass Info "));
}
@@ -750,19 +750,19 @@
    Item.mask = GVIF_TEXT;
    Item.row = nRowIdx;
    Item.col = nColIdx++;
    strTemp.Format(_T("Index"));//_T("인덱스"));
    strTemp.Format(_T("Index"));//_T("���"));
    Item.strText = strTemp;
    m_ctrlGridRecipeList.SetItem(&Item);
    Item.row = nRowIdx;
    Item.col = nColIdx++;
    strTemp.Format(_T("Recipe Name"));//_T("레시피 ì´ë¦„"));
    strTemp.Format(_T("Recipe Name"));//_T("������ ï¿½Ì¸ï¿½"));
    Item.strText = strTemp;
    m_ctrlGridRecipeList.SetItem(&Item);
    Item.row = nRowIdx;
    Item.col = nColIdx++;
    strTemp.Format(_T("Last Modified Date"));//_T("최종 ìˆ˜ì • ë‚ ì§œ"));
    strTemp.Format(_T("Last Modified Date"));//_T("���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Â¥"));
    Item.strText = strTemp;
    m_ctrlGridRecipeList.SetItem(&Item);
}
@@ -787,7 +787,7 @@
        for(i = 0; i < nRecipeCount; i++)
        {
            //레시피 ì¸ë±ìФ
            //������ ï¿½Îµï¿½ï¿½ï¿½
            nColIdx = 0;
            Item.mask = GVIF_TEXT;
            Item.row = nRowIdx;
@@ -796,13 +796,13 @@
            Item.strText = strTemp;
            m_ctrlGridRecipeList.SetItem(&Item);
            //레시피 ì´ë¦„
            //������ ï¿½Ì¸ï¿½
            nColIdx++;
            strTemp = strArrayRecipeName.GetAt(i);
            m_ctrlGridRecipeList.SetItemText(nRowIdx, nColIdx, strTemp);
            m_ctrlGridRecipeList.SetItemState(nRowIdx, nColIdx, GVIS_READONLY);
            //최종 ìˆ˜ì • ë‚ ì§œ
            //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Â¥
            nColIdx++;
            strTemp = strArrayLastWriteTime.GetAt(i);
            m_ctrlGridRecipeList.SetItemText(nRowIdx, nColIdx, strTemp);
@@ -837,11 +837,11 @@
        if(nIdx != -1)
        {
            strTemp = strTemp.Mid(nIdx + 1);
            strSearchPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
            strSearchPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
        }
        else
        {
            strSearchPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\*.rcp"), NETIP_A2E_REVIEW_SYSTEM);
            strSearchPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\*.rcp"), NETIP_A2E_REVIEW_SYSTEM); //210805
        }
    }
@@ -902,12 +902,12 @@
        if(nIdx != -1)
        {
            strTemp = strTemp.Mid(nIdx + 1);
            strPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
            strPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
        }
        else
        {
            strPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);
        }
            strPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);//210805
        }
    }
    CMacroFile macroFile;
@@ -995,11 +995,11 @@
        if(nIdx != -1)
        {
            strTemp = strTemp.Mid(nIdx + 1);
            strPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
            strPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
        }
        else
        {
            strPath.Format(_T("\\\\%s\\C\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName);
            strPath.Format(_T("\\\\%s\\D\\DIT_Review\\Recipe\\%s.rcp"), NETIP_A2E_REVIEW_SYSTEM, strRecipeName); //210805
        }
    }
    
@@ -1069,11 +1069,11 @@
        if(nIdx != -1)
        {
            strTemp = strTemp.Mid(nIdx + 1);
            strPath.Format(_T("\\\\%s\\C\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
            strPath.Format(_T("\\\\%s\\D\\%s"), NETIP_A2E_REVIEW_SYSTEM, strTemp);
        }
        else
        {
            strPath.Format(_T("\\\\%s\\C\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg"), NETIP_A2E_REVIEW_SYSTEM);
            strPath.Format(_T("\\\\%s\\D\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg"), NETIP_A2E_REVIEW_SYSTEM); //210805
        }
    }
@@ -1106,12 +1106,12 @@
void CReviewRecipeEditorDlg::OnTcnSelchangeTabReviewRcpEditorMainTab(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    RecipeMainTab nTabIdx;
    nTabIdx = (RecipeMainTab)m_ctrlTabMain.GetCurSel();
    // [2017:1:25]-[WEZASW] : SystemMachine_B7E_WSI ì„¤ë¹„ ë¶„리(WSI ìœ /무)
    // [2017:1:25]-[WEZASW] : SystemMachine_B7E_WSI ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¸ï¿½(WSI ï¿½ï¿½/��)
    switch(GetCurrentTapIndex(nTabIdx))
    {
    case COMMON_TAB:
@@ -1217,8 +1217,8 @@
}
void CReviewRecipeEditorDlg::OnCancel()
{
    // TODO: ì—¬ê¸°ì— íŠ¹ìˆ˜í™”ëœ ì½”드를 ì¶”ê°€ ë°/또는 ê¸°ë³¸ í´ëž˜ìŠ¤ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
    //_T("레시피 ì—ë””í„° í”„로그램을 ì¢…료하시겠습니까?"), MB_YESNO | MB_ICONQUESTION))
    // TODO: ï¿½ï¿½ï¿½â¿¡ Æ¯ï¿½ï¿½È­ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ ï¿½ï¿½/�Ǵ� ï¿½âº» Å¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    //_T("������ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï½Ã°Ú½ï¿½ï¿½Ï±ï¿½?"), MB_YESNO | MB_ICONQUESTION))
    if (IDNO == AfxMessageBox(_T("Do you want to exit recipe editor program?"), MB_YESNO | MB_ICONERROR))
    {
        return;
@@ -1344,7 +1344,7 @@
void CReviewRecipeEditorDlg::OnStnClickedStaticSelectRcipe()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
}
@@ -1447,7 +1447,7 @@
    }
    else
    {
        AfxMessageBox(_T("Please select recipe."));//_T("레시피를 ì„ íƒí•˜ì„¸ìš”."));
        AfxMessageBox(_T("Please select recipe."));//_T("�����Ǹ� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ï¿½ï¿½."));
    }
    return bSuccess;
@@ -1457,7 +1457,7 @@
{
    BOOL bSuccess = TRUE;
    // ì¤‘ë³µ Recipe ìƒì„± ê¸ˆì§€.
    // ï¿½ßºï¿½ Recipe ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    CFileFind finder;
    CString strRecipeFile;
    strRecipeFile.Format(_T("%s\\%s.rcp"), _REVIEW_RECIPE_PATH_, strRecipeName);
ReviewSystem/ReviewRecipeEditor/stdafx.h
@@ -1,7 +1,7 @@
// stdafx.h : ìžì£¼ ì‚¬ìš©í•˜ì§€ë§Œ ìžì£¼ ë³€ê²½ë˜ì§€ëŠ” ì•ŠëŠ”
// í‘œì¤€ ì‹œìŠ¤í…œ í¬í•¨ íŒŒì¼ ë° í”„로젝트 ê´€ë ¨ í¬í•¨ íŒŒì¼ì´
// ë“¤ì–´ ìžˆëŠ” í¬í•¨ íŒŒì¼ìž…니다.
// stdafx.h : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ê´ï¿½
// Ç¥ï¿½ï¿½ ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
// ï¿½ï¿½ï¿½ ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#pragma once
@@ -10,37 +10,42 @@
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // ê±°ì˜ ì‚¬ìš©ë˜ì§€ ì•ŠëŠ” ë‚´ìš©ì€ Windows í—¤ë”에서 ì œì™¸í•©ë‹ˆë‹¤.
#define VC_EXTRALEAN            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ê´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Windows ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // ì¼ë¶€ CString ìƒì„±ìžëŠ” ëª…시적으로 ì„ ì–¸ë©ë‹ˆë‹¤.
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // ï¿½Ïºï¿½ CString ï¿½ï¿½ï¿½ï¿½ï¿½Ú´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ë´Ï´ï¿½.
// MFC의 ê³µí†µ ë¶€ë¶„ê³¼ ë¬´ì‹œ ê°€ëŠ¥í•œ ê²½ê³  ë©”시지에 ëŒ€í•œ ìˆ¨ê¸°ê¸°ë¥¼ í•´ì œí•©ë‹ˆë‹¤.
// MFC�� ï¿½ï¿½ï¿½ï¿½ ï¿½ÎºÐ°ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Þ½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½â¸¦ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC í•µì‹¬ ë° í‘œì¤€ êµ¬ì„± ìš”소입니다.
#include <afxext.h>         // MFC í™•장입니다.
#include <afxwin.h>         // MFC ï¿½Ù½ï¿½ ï¿½ï¿½ Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#include <afxext.h>         // MFC È®ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#include <afxdisp.h>        // MFC ìžë™í™” í´ëž˜ìŠ¤ìž…ë‹ˆë‹¤.
#include <afxdisp.h>        // MFC ï¿½Úµï¿½È­ Å¬ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // Internet Explorer 4 ê³µìš© ì»¨íŠ¸ë¡¤ì— ëŒ€í•œ MFC ì§€ì›ìž…니다.
#include <afxdtctl.h>           // Internet Explorer 4 ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // Windows ê³µìš© ì»¨íŠ¸ë¡¤ì— ëŒ€í•œ MFC ì§€ì›ìž…니다.
#include <afxcmn.h>             // Windows ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h>     // MFC의 ë¦¬ë³¸ ë° ì»¨íŠ¸ë¡¤ ë§‰ëŒ€ ì§€ì›
#include <afxcontrolbars.h>     // MFC�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
#include <afxinet.h>
#include <afxcontrolbars.h>
#define _REVIEW_BASE_PATH_                            _T("C:\\DIT_Review")
#define _REVIEW_RECIPE_PATH_                        _T("C:\\DIT_Review\\Recipe")
#define _REVIEW_RECIPE_BACKUP_PATH_                    _T("C:\\DIT_Review\\Recipe\\Backup")
#define _REVIEW_RECIPE_LOGIN_LOG_PATH_                _T("C:\\DIT_Review\\Recipe\\LoginLog")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
//#define _REVIEW_BASE_PATH_                            _T("C:\\DIT_Review")
//#define _REVIEW_RECIPE_PATH_                        _T("C:\\DIT_Review\\Recipe")
//#define _REVIEW_RECIPE_BACKUP_PATH_                    _T("C:\\DIT_Review\\Recipe\\Backup")
//#define _REVIEW_RECIPE_LOGIN_LOG_PATH_                _T("C:\\DIT_Review\\Recipe\\LoginLog")
//#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _REVIEW_BASE_PATH_                            _T("D:\\DIT_Review")  //210805
#define _REVIEW_RECIPE_PATH_                        _T("D:\\DIT_Review\\Recipe")
#define _REVIEW_RECIPE_BACKUP_PATH_                    _T("D:\\DIT_Review\\Recipe\\Backup")
#define _REVIEW_RECIPE_LOGIN_LOG_PATH_                _T("D:\\DIT_Review\\Recipe\\LoginLog")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("D:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _REVIEW_RECIPE_BACKUP_PATH_CPJT                _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe")
#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT    _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
@@ -72,19 +77,19 @@
#define    COPYDATA_RECIPEEDITOR2REVIEWSYSTEM            1600
// [2017:4:17]-[WEZASW] : CIM(Recipe) ë³´ê³  í•­ëª© ì¶”ê°€.
// [2017:4:17]-[WEZASW] : CIM(Recipe) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
enum MsgRecipe2Rev
{
    MsgRecipe2Rev_None = -1,
    MsgRecipe2Rev_StandardCameraGlassPos,
    MsgRev2Recipe_StandardCameraGlassPos,
    MsgRecipe2Rev_RecipeCreate,                    // Recipe(PPID) ì¶”ê°€
    MsgRecipe2Rev_RecipeCreate,                    // Recipe(PPID) ï¿½ß°ï¿½
    MsgRev2Recipe_RecipeCreate,
    MsgRecipe2Rev_RecipeChange,                    // Recipe(PPID) ë³€ê²½
    MsgRecipe2Rev_RecipeChange,                    // Recipe(PPID) ï¿½ï¿½ï¿½ï¿½
    MsgRev2Recipe_RecipeChange,
    MsgRecipe2Rev_RecipeDelete,                    // Recipe(PPID) ì‚­ì œ
    MsgRecipe2Rev_RecipeDelete,                    // Recipe(PPID) ï¿½ï¿½ï¿½ï¿½
    MsgRev2Recipe_RecipeDelete,
    MsgRecipe2Rev_RecipeModify,                    // Recipe(PPID) Parameter ìˆ˜ì •
    MsgRecipe2Rev_RecipeModify,                    // Recipe(PPID) Parameter ï¿½ï¿½ï¿½ï¿½
    MsgRev2Recipe_RecipeModify
};
ReviewSystem/ReviewSystem/CameraControlAlign.cpp
@@ -5,7 +5,8 @@
#include "CHReviewSetting/SystemInfo.h"
#include "CHReviewRecipe/RsRcpAlignInfo.h"
#define ALIGN_TEMPLATE_PATH _T("C:\\DIT_Review\\Recipe\\AlignImage\\")
#define ALIGN_TEMPLATE_PATH _T("D:\\DIT_Review\\Recipe\\AlignImage\\")
//#define ALIGN_TEMPLATE_PATH _T("C:\\DIT_Review\\Recipe\\AlignImage\\") //210805
using namespace CHImageControls;
ReviewSystem/ReviewSystem/CameraControlReview.cpp
@@ -207,11 +207,13 @@
    CString strPath =m_pRCC2P->IRCC2P_GetTotalPitchImageName();
    if(strPath == _T("")){
        strPath = _T("C:\\DIT_Review\\Recipe\\AlignImage\\ReviewAlign.bmp");
        strPath = _T("D:\\DIT_Review\\Recipe\\AlignImage\\ReviewAlign.bmp");
        //strPath = _T("C:\\DIT_Review\\Recipe\\AlignImage\\ReviewAlign.bmp");  //210805
    }
    else
    {
        strPath = _T("C:\\DIT_Review\\Recipe\\AlignImage\\")+strPath;
        strPath = _T("D:\\DIT_Review\\Recipe\\AlignImage\\") + strPath;
        //strPath = _T("C:\\DIT_Review\\Recipe\\AlignImage\\")+strPath; //210805
    }
    
ReviewSystem/ReviewSystem/DisplayMessage.cpp
@@ -78,13 +78,20 @@
{
    va_list list;
    TCHAR strText[2000] = {0};
    try
    {
        va_start(list, lpstrFormat);
        _vstprintf_s(strText, lpstrFormat, list);
        va_end(list);
    va_start(list, lpstrFormat);
    _vstprintf_s(strText, lpstrFormat, list);
    va_end(list);
        CString* pstrLog = new CString(strText);
        PostThreadMessage(m_ThreadId, WM_DIPLAY_LOG, reinterpret_cast<WPARAM>(pstrLog), 0);
    }
    catch (...)
    {
        return;
    }
    CString* pstrLog = new CString(strText);
    PostThreadMessage(m_ThreadId, WM_DIPLAY_LOG, reinterpret_cast<WPARAM>(pstrLog), 0);
//     WriteToFile(strText);
// 
ReviewSystem/ReviewSystem/DitGlassRawClient.cpp
@@ -105,6 +105,7 @@
    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];
    m_pRawMergeData = (_grmDefectData*)&m_pGlassRawData[m_pGlassRawInfo->m_nRawMergeDataPoint];
    return TRUE;
}
@@ -137,14 +138,14 @@
    int nCmdId = (m_pGlassRawInfo->m_nCommandIdxWrite+1) % COMMAND_MAXCOUNT;
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)//���� ï¿½ï¿½ï¿½Ù´Â°ï¿½ï¿½ï¿½ ï¿½ï¿½Å§ï¿½ï¿½ ï¿½ï¿½ï¿½Û°ï¿½ ï¿½Ñ¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ò´Ù´Â°ï¿½!! [������ 2018/11/12]
    if(m_pGlassRawInfo->m_nCommandIdxRead == nCmdId)
    {
        m_pGlassRawInfo->m_nCommandIdxRead++;//���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Ï³ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ñ´ï¿½. [������ 2018/11/12]
        m_pGlassRawInfo->m_nCommandIdxRead++;
    }
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nCommand = (short)nCmd;
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].strParam;
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1; //-1������, 0����, 1���� [������ 2018/11/13]
    m_pGlassRawInfo->m_nCommandBuffer[nCmdId].nResult = -1;
    m_nLastCommandIdx = m_pGlassRawInfo->m_nCommandIdxWrite = nCmdId;
@@ -171,6 +172,7 @@
    if(isConnect() == FALSE) return FALSE;
    m_pGlassRawInfo->m_ClientProcStep = APS_GlassLoading;
    m_pGlassData->m_bStackRead = FALSE;
    m_pGlassData->m_bRawMergeRead = FALSE;
    return SetCommand(grcSequenceGlassLoading);
}
@@ -215,7 +217,7 @@
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--)
    {
ReviewSystem/ReviewSystem/DitGlassRawClient.h
@@ -56,6 +56,7 @@
    _grmCellData*   m_pCellData;
    _grmDefectData* m_pDefectData;
    _grmDefectData* m_pStackData;
    _grmDefectData* m_pRawMergeData;
protected:
    HANDLE        m_hMapBasicInfo;
ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -8,6 +8,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define MAX_ZONE_NUM 16
@@ -47,7 +48,7 @@
        memset(this, 0, sizeof(_grmGlassData));
    }
    //Glass ï¿½ï¿½ï¿½ï¿½
    //Glass ì •ë³´
    char m_strFileName[64];
    char m_strPath[256];
@@ -56,12 +57,12 @@
    int m_nOriginDirection;                //{ GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
    int m_nConerCutDirection;
    int    m_nScanCoordinateY;                //���Ⱑ 0�̸� ï¿½Ï¹ï¿½, 1�̸� Scan������ y��(�� scan������ ï¿½ï¿½ï¿½ï¿½, offline ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½)
    int    m_nScanCoordinateY;                //여기가 0이면 ì¼ë°˜, 1이면 Scan방향이 y축(즉 scan방향이 ë‹¨ì¶•, offline ì„¤ë¹„ ê°™ì€)
    int m_nGlassSizeWidth;
    int m_nGlassSizeHeight;
    //��������
    //설비정보
    char m_strLine[32];
    char m_strEquipType[32];            
    char m_strEquipID[32];                
@@ -74,7 +75,7 @@
    CTime    m_tmReviewLoading;
    CTime    m_tmReviewEnd;
    //�⺻ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //기본 ë¬¼ë¥˜ì •ë³´
    char m_strGlassID[32];                //Glass ID
    char m_strPPID[32];                    
    char m_strEPPID[32];                
@@ -91,7 +92,7 @@
    char m_strVCRGlassID[32];
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -126,14 +127,14 @@
    int            m_nDefectNumStackSP;
    //ī�޶�/��ĵ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //카메라/스캔 ì •ë³´ [김태현 2018/12/5]
    short        m_nCameraNum;
    short        m_nScanNum;
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM];
    unsigned char m_nGrayLevelAvg[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMin[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    unsigned char m_nGrayLevelMax[RAWMESSENGER_MAXCAMNUM*RAWMESSENGER_MAXSCANNUM*RAWMESSENGER_MAXHLINUM];
    //����� ï¿½ï¿½ï¿½ï¿½ um[������ 2018/12/10]
    //얼라인 ì •ë³´ um[김태현 2018/12/10]
    double    m_nAlignCcdTheta;
    double    m_nAlignCcdShitftX;
    double    m_nAlignCcdShitftY;
@@ -147,7 +148,7 @@
    char    m_strAlignSecond[64];
//     char    m_strAlignPath[256];
    //CSOT�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    //CSOT용 ë¬¼ë¥˜ ì •ë³´ [김태현 2018/12/5]
    char m_strCassetteSequenceNo[16];
    char m_strOwnerCode[16];            //2. OWNER_CODE
    char m_strOwnerType[16];            //3. OWNER_TYPE
@@ -162,7 +163,7 @@
    char m_strGroupID[16];                //14.GROUP_ID
    char m_cAutoSampleFlag;                //15.AUTOSAMPLEFLAG
    // CPRJ�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // CPRJ용 ë¬¼ë¥˜ ì •ë³´
    char m_strProdType[3];
    char m_strBatchID[13];
    char m_strPairHPanelID[13];
@@ -188,17 +189,19 @@
    BYTE m_nGlassDataBitSignal[4];
    bool m_bJob_end;  
    //201217 CJH - ï¿½ï¿½ï¿½ï¿½ Defect Review ï¿½ï¿½ï¿½ï¿½
    //201217 CJH - ì°ì€ Defect Review ê°œìˆ˜
    int m_nReviewNum;
    //201221 CJH - ï¿½Ä½ï¿½ï¿½ï¿½ Stack ï¿½ï¿½ï¿½
    //201221 CJH - íŒŒì‹±í•œ Stack ê²°ê³¼
    int m_nStackNum;
    BOOL m_bStackRead;
    //210203 CJH - CutOff ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½
    int m_nRawMergeNum;
    BOOL m_bRawMergeRead;
    //210203 CJH - CutOff ëŒ€ìƒ ê²°í•¨ ìˆ˜
    int m_nCutOffDefectNum;
    //210323 CJH - Server/Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    //210323 CJH - Server/Frame Shrink ì •ë³´ ì¶”ê°€
    char m_strShrinked[6];
    //210326 CJH - RAW ï¿½Ô·ï¿½ Defect ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ë¿©ï¿½ï¿½
    //210326 CJH - RAW ìž…ë ¥ Defect ìˆ˜ëŸ‰ ìƒí•œ ì‚¬ìš©ì—¬ë¶€
    BOOL m_bRawCutoff;
};
@@ -222,7 +225,7 @@
    }
    int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; };
    int                        m_nCellID;                            //1. PANEL_ID
    short                    m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short                    m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    char                    m_strCellName[32];
    int                        m_rectCellLeft;
@@ -235,7 +238,7 @@
    int                        m_nJudgeGlade;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //결함 ê°¯ìˆ˜ ê´€ë¦¬ ë³€ìˆ˜
    int            m_nDefectNumSizeSmall;
    int            m_nDefectNumSizeMid;
    int            m_nDefectNumSizeLarge;
@@ -259,7 +262,7 @@
    char        m_strProImage[32];
    char        m_strAvgGray_0[12];
    char        m_strPortion_0[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_0[12];
    char        m_strAvgAmp_0[12];
    char        m_strFFTVar_0[12];
@@ -269,7 +272,7 @@
    char        m_strAvgGray_1[12];
    char        m_strPortion_1[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_1[12];
    char        m_strAvgAmp_1[12];
    char        m_strFFTVar_1[12];
@@ -279,7 +282,7 @@
    char        m_strAvgGray_2[12];
    char        m_strPortion_2[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_2[12];
    char        m_strAvgAmp_2[12];
    char        m_strFFTVar_2[12];
@@ -289,7 +292,7 @@
    char        m_strAvgGray_3[12];
    char        m_strPortion_3[12];
    //kyh Mura Data ï¿½ß°ï¿½ 0622
    //kyh Mura Data ì¶”ê°€ 0622
    char        m_strCorner_Gray_3[12];
    char        m_strAvgAmp_3[12];
    char        m_strFFTVar_3[12];
@@ -308,17 +311,17 @@
    int            m_nReflowResult[8];            // 0: Reflow X 1: Reflow OK 2: Reflow NG
    // Filtering�� Stack�� ï¿½ï¿½
    // Filtering된 Stack별 ìˆ˜
    int            m_nDefectTDCount;
    int            m_nDefectSDCount;
    int            m_nDefectPDCount;
    int            m_nDefectSPCount;
    // Gate/Data ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Gate/Data ì´ ê°¯ìˆ˜
    int            m_nGateNum;
    int            m_nDataNum;
    // 210129 CJH - Cell Origin ï¿½ï¿½ï¿½ï¿½
    // 210129 CJH - Cell Origin ë°©í–¥
    int            m_nCellXDir;
    int            m_nCellYDir;
};
@@ -331,10 +334,10 @@
    }
    //////////////////////////////////////////////////////////////////////////
    //���⼭ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    //여기서 ë¶€í„° ë¦¬ë·° ì˜ì—­ [김태현 2019/1/19]
    ditRaw::ReviewPlanType            m_nPlanType    ;    
    int            m_nResultCode;  //0:None, 1:Success
    int            m_nShotIndex; //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/12/5]
    int            m_nShotIndex; //리뷰 ì°ì€ ìˆœë²ˆ [김태현 2018/12/5]
    int            m_nModuleIndex;
    int            m_nMagnificIndex;
    float        m_fManification;
@@ -343,15 +346,15 @@
    char        m_strRevImagePath[256];
    //////////////////////////////////////////////////////////////////////////
    // Measure ï¿½ï¿½ï¿½ï¿½
    // Measure ì˜ì—­
    int            m_nMeasure_Index;
    int            m_nMeasure_ResultCode; //0:None, 1:Success
    float        m_fMesure_ResultData[8];    // 0:Type, 1:ShiftX, 2:ShiftY
    //////////////////////////////////////////////////////////////////////////
    // WSI����
    // WSI영역
    int            m_nWsi_ResultCode; //0:None, 1:Success
    int            m_nWsi_Type;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½
    int            m_nWsi_Type;                                    // í•¨ëª° / ëŒê¸°
    float        m_fWsi_ResultData[8];            // 0:Type, 1:Height(um), 2:Width
    char        m_strWsi_2DImageFilename[256];
    char        m_strWsi_3DImageFilename[256]; 
@@ -359,14 +362,14 @@
    int            m_nWsi_pReflowResultData[8];
    double        m_dWsi_DamDistance;
    double        m_dWsiMmMotorX;                                // WSI ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ 20180223 HJH
    double        m_dWsiMmMotorX;                                // WSI ëª¨í„° ì¢Œí‘œ 20180223 HJH
    double        m_dWsiMmMotorY;
    float        m_fWsiManification;                            // WSI ï¿½ï¿½ï¿½ï¿½
    float        m_fWsiManification;                            // WSI ë°°ìœ¨
    //////////////////////////////////////////////////////////////////////////
    // Reflow ï¿½ï¿½ï¿½ï¿½
    // Reflow ì˜ì—­
    int            m_nReflow_Index;
    int            m_nReflow_ResultCode; //0:None, // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Line�� ï¿½ï¿½ï¿½ï¿½. 3 ï¿½Ì¸ï¿½ : DAM2 Reflow ï¿½ï¿½ï¿½ï¿½, 4~5 : DAM1 Reflow ï¿½ï¿½ï¿½ï¿½, 6 : no Reflow ï¿½ï¿½ï¿½ï¿½ / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    int            m_nReflow_ResultCode; //0:None, // ê²€ì¶œí•œ Line의 ê°œìˆ˜. 3 ë¯¸ë§Œ : DAM2 Reflow íŒì •, 4~5 : DAM1 Reflow íŒì •, 6 : no Reflow íŒì • / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
    float        m_fReflow_LinePosData[8];    
    int            m_nReflow_Side;
    int            m_nReflow_InspectionMode;
@@ -382,108 +385,108 @@
    short            m_nDefectID;
    short            m_nCameraID;
    short            m_nScanIdx;
    //short            m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    int                m_nDefectIdx;                // Ä«ï¿½Þ¶ó¿¡¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ 201207 CJH - ï¿½Ú¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ä§. int������ ï¿½ï¿½ï¿½ï¿½
    //short            m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ
    int                m_nDefectIdx;                // ì¹´ë©”라에서의 ê²°í•¨ ì¸ë±ìФ 201207 CJH - ìžë¦¿ ìˆ˜ ë„˜ì¹¨. int형으로 ë³€ê²½
    int                m_nPixelConv;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelScan;                // pixel ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥
    int                m_nPixelConv;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    int                m_nPixelScan;                // pixel ë‹¨ìœ„ ì¢Œí‘œ
    short                            m_nPixelSize;                // ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ï¿½ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½ - Bright, Dark, Both
    short                            m_nPixelSize;                // ê²°í•¨í¬ê¸°        ---------------------------------PS
    short/*SERVER_DefectType*/        m_DefectType;                // ê²°í•¨ íƒ€ìž…    ---------------------------------DT
    short/*SERVER_DefectSubType*/    m_DefectSubType;            // ê²°í•¨ì˜ íŒì •상태.
    short/*SERVER_DefectBDType*/    m_DefectBDType;                // ê²°í•¨ íƒ€ìž… - Bright, Dark, Both
    short            m_sPixelWidth;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Êºï¿½
    short            m_sPixelHeight;                // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short            m_nLevelSrcMin;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Min    -------------------------RN
    short            m_nLevelRefMax;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Max    -------------------------RX
    short            m_nLevelRefAvg;                // ï¿½ñ±³´ï¿½ï¿½ ï¿½ï¿½ï¿½ Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ï¿½ï¿½ï¿½ï¿½ Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ï¿½ï¿½ï¿½ï¿½ Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ï¿½ï¿½ï¿½ï¿½ Avg    ---------------------------------DA
    short            m_sPixelWidth;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë„ˆë¹„
    short            m_sPixelHeight;                // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이
    short            m_nLevelSrcMin;                // ê²°í•¨ ë°ê¸° Min    -----------------------------SN
    short            m_nLevelSrcMax;                // ê²°í•¨ ë°ê¸° Max    -----------------------------SX
    short            m_nLevelSrcAvg;                // ê²°í•¨ ë°ê¸° Avg    -----------------------------SA
    short            m_nLevelRefMin;                // ë¹„교대상 ë°ê¸° Min    -------------------------RN
    short            m_nLevelRefMax;                // ë¹„교대상 ë°ê¸° Max    -------------------------RX
    short            m_nLevelRefAvg;                // ë¹„교대상 ë°ê¸° Avg    -------------------------RA
    short            m_nLevelDiffMin;            // ë¹„교차 Min    ---------------------------------DN
    short            m_nLevelDiffMax;            // ë¹„교차 Max    ---------------------------------DX
    short            m_nLevelDiffAvg;            // ë¹„교차 Avg    ---------------------------------DA
    int                m_nDefectRScale;            // ï¿½È¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½    -------------------------RS
    short            m_sThreshold;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold
    short            m_sThresholdAvg;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Threshold AVG
    short            m_sDefectPeak;                // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectRScale;            // í”½ì…€ë‹¨ìœ„ ê²°í•¨ ë†’이    -------------------------RS
    short            m_sThreshold;                // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold
    short            m_sThresholdAvg;            // ê²°í•¨ì„ ê²€ì¶œí•  ë•Œì˜ Threshold AVG
    short            m_sDefectPeak;                // ê²°í•¨ì˜ Peak.
    short            m_sDefectLevel;                // (DiffAvg - Th) BOE 8G ìš”청사항
    int                m_nPixelGlassStart;            // Glass ï¿½ï¿½ï¿½ï¿½ ï¿½È¼ï¿½
    int                m_nPixelGlassStart;            // Glass ì‹œìž‘ í”½ì…€
    short            m_sDefectLoc;
    short            m_sZoneClassPixelCount[16];
    short            m_sZonePixelCount[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Pixel ï¿½ï¿½
    short            m_sZoneValueMin[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Min
    short            m_sZoneValueMax[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Max
    short            m_sZoneValueAvg[16];    // Zone�� ï¿½ï¿½ï¿½ï¿½ Avg
    short            m_sZonePixelCount[16];    // Zone별 ê²°í•¨ Pixel ìˆ˜
    short            m_sZoneValueMin[16];    // Zone별 ê²°í•¨ Min
    short            m_sZoneValueMax[16];    // Zone별 ê²°í•¨ Max
    short            m_sZoneValueAvg[16];    // Zone별 ê²°í•¨ Avg
    short            m_sZonePixelPercent[16];    // --------------------------------------Z0~ZF
    //210127 CJH - Zone�� Source Gray ï¿½Ô·ï¿½
    short            m_sZoneValueSrcMin[16];    // Zone�� Source Min
    short            m_sZoneValueSrcMax[16];    // Zone�� Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone�� Source Avg
    //210127 CJH - Zone별 Source Gray ìž…ë ¥
    short            m_sZoneValueSrcMin[16];    // Zone별 Source Min
    short            m_sZoneValueSrcMax[16];    // Zone별 Source Max
    short            m_sZoneValueSrcAvg[16]; // Zone별 Source Avg
    int                m_nUMOriginX;                // um���� x��ǥ (��������)
    int                m_nUMOriginY;                // um���� y��ǥ (��������)
    int                m_nUMCenterAlignX;            // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterAlignY;            // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterX;                // um���� X��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCenterY;                // um���� Y��ǥ (Glass Center ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½Îºï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMSizeX;                    // um���� X Å©ï¿½ï¿½    -----------------------------UX
    int                m_nUMSizeY;                    // um���� Y Å©ï¿½ï¿½    -----------------------------UY
    int                m_nUMSize;                    // um���� Å©ï¿½ï¿½.
    CRect            m_RectUM;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ç°¢ï¿½ï¿½.
    int                m_nUMOriginX;                // um단위 x좌표 (원점기준)
    int                m_nUMOriginY;                // um단위 y조표 (원점기준)
    int                m_nUMCenterAlignX;            // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterAlignY;            // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • í›„)
    int                m_nUMCenterX;                // um단위 X좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMCenterY;                // um단위 Y좌표 (Glass Center ê¸°ì¤€, ì–¼ë¼ì¸ë³´ì • ì „)
    int                m_nUMSizeX;                    // um단위 X í¬ê¸°    -----------------------------UX
    int                m_nUMSizeY;                    // um단위 Y í¬ê¸°    -----------------------------UY
    int                m_nUMSize;                    // um단위 í¬ê¸°.
    CRect            m_RectUM;                    // ë””펙 ì„¼í„° ê¸°ì¤€ ì‚¬ê°í˜•.
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak�� ï¿½ï¿½ï¿½ï¿½.
    short/*Judgement*/                m_DefectJudgement;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    BOOL                    m_bDefectCutoff;            // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16��� ï¿½ï¿½ï¿½ï¿½
    int                m_nPadRegionIdx;            // PAD ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½
    short/*SERVER_DefectSizeType*/    m_DefectSizeType;            // ê²°í•¨ í¬ê¸° ì¢…류enum SERVER_DefectSizeType        { SizeType_Unknown = 0, SizeType_Small, SizeType_Mid, SizeType_Large, SizeType_Huge, SizeType_Ultra };
    short/*SERVER_DefectPeakType*/    m_DefectPeakType;            // Peak의 ì¢…류.
    short/*Judgement*/                m_DefectJudgement;            // ê²°í•¨ íŒì •.
    BOOL                    m_bDefectCutoff;            // ì»· ì˜¤í”„ ë””펙(TRUE= Cutoff, FALSE)
    short/*MAP16_DefectClass*/        m_DefectClass;                // BOE Defect Class 16등분 êµ¬ë¶„
    int                m_nPadRegionIdx;            // PAD ì˜ì—­ ì¸ë±ìФ
    int                m_nUMCellX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ x ï¿½ï¿½Ç¥
    int                m_nUMCellY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ y ï¿½ï¿½Ç¥
    short            m_nModelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellIdx;                    // ï¿½ï¿½ï¿½Â° ï¿½ï¿½ï¿½Î°ï¿½?
    short            m_nCellGate;                // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellData;                // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellGateAlign;            // ï¿½ï¿½ï¿½ï¿½ Gate����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    short            m_nCellDataAlign;            // ï¿½ï¿½ï¿½ï¿½ Data����(����� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½)
    int                m_nUMCellX;                    // ì…€ ì›ì  ê¸°ì¤€ x ì¢Œí‘œ
    int                m_nUMCellY;                    // ì…€ ì›ì  ê¸°ì¤€ y ì¢Œí‘œ
    short            m_nModelIdx;                // ëª‡ ë²ˆì§¸ ëª¨ë¸ì¸ê°€?
    short            m_nCellIdx;                    // ëª‡ë²ˆì§¸ ì…€ì¸ê°€?
    short            m_nCellGate;                // ì…€ë³„ Gate라인(얼라인 ë³´ì • ì „)
    short            m_nCellData;                // ì…€ë³„ Data라인(얼라인 ë³´ì • ì „)
    short            m_nCellGateAlign;            // ì…€ë³„ Gate라인(얼라인 ë³´ì • í›„)
    short            m_nCellDataAlign;            // ì…€ë³„ Data라인(얼라인 ë³´ì • í›„)
    int                m_nUMShotX;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ X��ǥ
    int                m_nUMShotY;                    // ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Y��ǥ
    short            m_nMaskDefectIdx;            // ï¿½ï¿½ Glass���� ï¿½ß°ßµï¿½ ï¿½ï¿½ï¿½ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    short            m_nShotIdx;                    // ï¿½ë±¤ï¿½ï¿½ ï¿½ï¿½È£
    short            m_nMatchShotCount;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½.
    short            m_nMatchMaxSize;            // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å© ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½.
    int                m_nUMShotX;                    // ìƒ· ê¸°ì¤€ X좌표
    int                m_nUMShotY;                    // ìƒ· ê¸°ì¤€ Y좌표
    short            m_nMaskDefectIdx;            // í•œ Glass에서 ë°œê²¬ëœ ë§ˆìŠ¤í¬ê²°í•¨ ë¬¶ìŒì˜ ì¸ë±ìФ.
    short            m_nShotIdx;                    // ë…¸ê´‘샷 ë²ˆí˜¸
    short            m_nMatchShotCount;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ê²°í•¨ì˜ ìˆ˜.
    short            m_nMatchMaxSize;            // ë™ì¼í•œ ë§ˆìŠ¤í¬ ì¤‘ ê°€ìž¥ í° ê²°í•¨ì˜ í¬ê¸°.
    short            m_nRepeatCount;                // ï¿½ï¿½ï¿½Ó°ï¿½ï¿½Ô¹ß°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ ï¿½Ýºï¿½ï¿½ï¿½
    short            m_nRepeatCount;                // ì—°ì†ê²°í•¨ë°œê²¬ìœ„한 ë™ì¼ì¢Œí‘œ ë°˜ë³µìˆ˜
    short            m_nMaskRepeatCount;
    int                m_StackInfo;                // Stack Flag
    BOOL            m_bRealStack;                // Stack ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(TRUE) ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½Í¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ TD(FALSE)������ ï¿½ï¿½ ï¿½Ö´ï¿½.
    short            m_nStackStepCount;            // Stack ï¿½ï¿½
    short            m_nStackColorIdx;            // Color�� ï¿½ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ ï¿½Îµï¿½ï¿½ï¿½.
    BOOL            m_bRealStack;                // Stack ë¨¸ì§€ì— ì˜í•œ TD(TRUE) ì¸ì§€, í•„터링에 ì˜í•œ TD(FALSE)구분할 ìˆ˜ ìžˆë‹¤.
    short            m_nStackStepCount;            // Stack ìˆ˜
    short            m_nStackColorIdx;            // Color를 ì„ íƒí•˜ëŠ” ì¸ë±ìФ.
    //CString            m_strStackStep[CFDEFECT_STACKCOUNT];            // Stack Step.
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ 60bytes
    char            m_strUnitID[16];                // ï¿½ï¿½ï¿½Ö¾ï¿½ï¿½Ìµï¿½
    char            m_strStackFirst[60];            // Stack Step. //201221 CJH - ìµœëŒ€ ì‚¬ì´ì¦ˆ 60bytes
    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�� ï¿½ß°ï¿½ ï¿½Ð·ï¿½  ï¿½Ë°ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½.
    int                m_nAtomWidth;                // TFE ï¿½ï¿½ ï¿½Êºï¿½
    int                m_nAtomHeight;                // TFE ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    short/*ReKind*/            m_DefectKind;                // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    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등 ì¶”ê°€ ë¶„류  ì•Œê³ ë¦¬ì¦˜ ì ìš© ê²°ê³¼.
    int                m_nAtomWidth;                // TFE í•µ ë„ˆë¹„
    int                m_nAtomHeight;                // TFE í•µ ë†’이
    short/*ReKind*/            m_DefectKind;                // ê²°í•¨ ì¢…류
    char            m_strDefectCode[32];            // Defect Code
    BOOL            m_bMergeState;                // Merge Status
    char            m_strAoiImageName[256];            // Defect Image Name(CCD Image)
    int                m_nDefectMerge;        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nDefectMerge;        // í˜„재 ë””펙의 ë¨¸ì§€ ì—¬ë¶€
    int                m_nPixelSizeOrigin;
    int                m_nScratchRatio;
    int                m_nDensity;            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ðµï¿½ [2017.8.2 bhs]
    int                m_nDensity;            // ì›í˜• ê²°í•¨ êµ¬ë¶„을 ìœ„한 ë°€ë„ [2017.8.2 bhs]
    char            m_strDefectName[16];
    char            m_strDefectType[16];
@@ -491,16 +494,16 @@
    double            m_dScanResolution;
    double            m_dConvResolution;
    int                m_nAngle;                    // ï¿½ï¿½ï¿½ï¿½
    int                m_nMajor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Long)
    int                m_nMinor;                    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(Short)
    int                m_nCompact;                    // Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ì¿ï¿½ Blob ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int                m_nThickness;                // Blob ï¿½ï¿½ï¿½Ì¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (Area / Major)
    int                m_nAngle;                    // ê°ë„
    int                m_nMajor;                    // ìž¥ì¶• ê¸¸ì´(Long)
    int                m_nMinor;                    // ë‹¨ì¶• ê¸¸ì´(Short)
    int                m_nCompact;                    // Blob ìž¥ì¶•을 ì§€ë¦„으로 í•˜ëŠ” ì›ì˜ ë„“이와 Blob ë„“이의 ë¹„율
    int                m_nThickness;                // Blob ë„“이와 ìž¥ì¶•의 ë¹„율 (Area / Major)
    
    short            m_nHliLevelIdx;                // ï¿½ï¿½ ï¿½ï¿½Â° ï¿½ï¿½ï¿½ï¿½(�)�ΰ�?
    int                m_nHliLayers;                // ï¿½Ø´ï¿½ï¿½ï¿½Ô¿ï¿½ ï¿½ï¿½ï¿½Ôµï¿½ ï¿½ï¿½ï¿½Ì¾ï¿½ bitó��
    short            m_nHliLevelIdx;                // ëª‡ ë²ˆì§¸ ë ˆë²¨(채널)인가?
    int                m_nHliLayers;                // í•´ë‹¹ê²°í•¨ì— í¬í•¨ëœ ë ˆì´ì–´ bit처리
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    BOOL            m_bShrinked;                //210323 CJH - Frame Shrink ì •ë³´ ì¶”ê°€
    char            m_strAoiImagePath[255];
    char            m_strReviewImagePath[255];
@@ -511,7 +514,6 @@
    int                m_nAlignRectRight;
    //���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/1/19]
    _grmDefectReviewData m_ReviewDefect;
};
@@ -556,32 +558,35 @@
struct _grmDitMemInfo
{
    //���� ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2018/11/12]
    //공유 ë©”모리 ìƒì„±í•  ê³µê°„ ê²°ì • [김태현 2018/11/12]
    size_t m_nGlassRawDataSize;
    int m_nGlassMaxDataNum;
    int m_nBlockMaxDataNum;
    int m_nCellMaxDataNum;
    int m_nDefectMaxDataNum;
    int m_nStackMaxDataNum;
    int m_nRawMergeMaxDataNum;
    //Char ï¿½ï¿½ï¿½ï¿½ ï¿½Ú·á°¡ ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡ [������ 2018/11/12]
    //Char ê¸°ì¤€ ìžë£Œê°€ ìžˆëŠ” ì‹œìž‘ ìœ„치 [김태현 2018/11/12]
    int m_nGlassDataPoint;
    int m_nBlockDataPoint;
    int m_nCellDataPoint;
    int m_nDefectDataPoint;
    int m_nStackDataPoint;
    int m_nRawMergeDataPoint;
    int m_nSizeOfGlassData;
    int m_nSizeOfBlockData;
    int m_nSizeOfCellData;
    int m_nSizeOfDefectData;
    int m_nSizeOfStackData;
    int m_nSizeOfRawMergeData;
};
struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand
{
    size_t m_nGlassLoadingCount;
    emAOIProcStep m_ClientProcStep; //AOI, Review�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)�� Ã³ï¿½ï¿½ ï¿½Ï·ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½
    emAOIProcStep m_ClientProcStep; //AOI, Review가 ë³´ë‚¸ ëª…ë ¹
    emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 ì²˜ë¦¬ ì™„료 í•œ ëª…ë ¹
};
class CgrmGlassRawData
@@ -668,7 +673,7 @@
    {
        if(pInfo == NULL || pData == NULL) return FALSE;
        if(1) //new type //�޸� ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å©ï¿½â¿¡ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
        if(1) //new type //메모리 ì´ ê³µê°„ í¬ê¸°ì— ìƒê´€ì—†ì´
        {
            //if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE;
ReviewSystem/ReviewSystem/DlgControl.cpp
@@ -30,6 +30,7 @@
    m_nMoveAxis            = MoveAxis_Center;
    m_nGlassGridViewIndex = 0;
    pDlgContol          = NULL;
    m_bAlignCamGrab        = FALSE;
}
#define ENABLE_RADIO_TIMER
@@ -111,6 +112,7 @@
    ON_BN_CLICKED(IDC_BT_REVIEW_POPUP, &CDlgControl::OnBnClickedBtReviewPopup)
    ON_BN_CLICKED(IDC_CHECK_USE_SIMULATION, &CDlgControl::OnBnClickedCheckUseSimulation)
    ON_STN_DBLCLK(IDC_STATIC_MAGNIFICATION, &CDlgControl::OnDblclkStaticMagnification)
    ON_BN_CLICKED(IDC_BUTTON_ALIGNCAM_GRAB, &CDlgControl::OnBnClickedButtonAligncamGrab)
END_MESSAGE_MAP()
@@ -184,6 +186,10 @@
                m_ctrlButtonColorCtrl.addControl(IDC_BT_REVIEW_POPUP, this);
                m_ctrlButtonColorCtrl.addControl(IDC_CHECK_USE_SIMULATION, this);
                //#3561 CF AOI Review Align ì¹´ë©”라 ëŠê¹€ í˜„상 ì¡°ì¹˜ ADD START
                m_ctrlButtonColorCtrl.addControl(IDC_BUTTON_ALIGNCAM_GRAB, this);
                //#3561 CF AOI Review Align ì¹´ë©”라 ëŠê¹€ í˜„상 ì¡°ì¹˜ ADD END
@@ -1450,4 +1456,24 @@
    {
        (GetDlgItem(IDC_CHECK_USE_SIMULATION))->ShowWindow(SW_SHOW);
    }
}
}
//#3561 CF AOI Review Align ì¹´ë©”라 ëŠê¹€ í˜„상 ì¡°ì¹˜ ADD START
void CDlgControl::OnBnClickedButtonAligncamGrab()
{
    CSequenceProcessor* pSequenceProcessor = m_pDC2P->IRP2P_GetSequenceProcessor();
    if (pSequenceProcessor == NULL) return;
    if (m_bAlignCamGrab == FALSE)
    {
        pSequenceProcessor->AlignCamera_CameraControl(CameraControlLive);
        m_bAlignCamGrab = TRUE;
    }
    else
    {
        pSequenceProcessor->AlignCamera_CameraControl(CameraControlStop);
        m_bAlignCamGrab = FALSE;
    }
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
}
//#3561 CF AOI Review Align ì¹´ë©”라 ëŠê¹€ í˜„상 ì¡°ì¹˜ ADD END
ReviewSystem/ReviewSystem/DlgControl.h
@@ -100,6 +100,7 @@
    
    CFontStatic                    m_ctrlKeyMoveJog;
    BOOL                        m_bAlignCamGrab;
    double                        m_dGoPosX;
@@ -209,4 +210,5 @@
    afx_msg void OnBnClickedBtReviewPopup();
    afx_msg void OnBnClickedCheckUseSimulation();
    afx_msg void OnDblclkStaticMagnification();
    afx_msg void OnBnClickedButtonAligncamGrab();
};
ReviewSystem/ReviewSystem/DlgReviewOffSetTool.cpp
@@ -1033,6 +1033,17 @@
    bReturn = macroFile.Write(strFilePath);
    // #3563 LYW_ CF AOI Review Offset íŒŒë¼ë¯¸í„° ì €ìž¥ì‹œ ì™„료 íŒì—… ì¶”ê°€ ADD START
    CString strMessage;
    strMessage.Format(_T("Save Offset Success!!"));
    if (IDOK == AfxMessageBox(strMessage, MB_OK | MB_ICONINFORMATION))
    {
        g_pLog->DisplayMessage(_T("Save Offset Success!!"));
    }
    // #3563 LYW_ CF AOI Review Offset íŒŒë¼ë¯¸í„° ì €ìž¥ì‹œ ì™„료 íŒì—… ì¶”ê°€ ADD END
    return bReturn;
}
ReviewSystem/ReviewSystem/DlgReviewOffSetTool.h
@@ -21,11 +21,11 @@
//enum MotorOringTYPE {
//    LEFT_Top = 0, RIGHT_TOP,LEFT_BOTTOM, RIGHT_BOTTOM
//};
#define    REVIEW_OFFSET_CONFIGFILE_PATH _T("C:\\DIT_Review\\ReviewServerConfig\\")
#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("C:\\DIT_Review\\ReviewServerConfig\\ReviewOffSet.cfg")
#define REVIEW_OFFSET_CONFIGFILE_FULL_PATHNAME _T("D:\\DIT_Review\\ReviewServerConfig\\ReviewOffSet.cfg")
#define    REVIEW_OFFSET_BACKUP_FORDER_NAME _T("OffsetBackup")
#define    REVIEW_OFFSET_BACKUP_FORDER_PATH _T("C:\\DIT_Review\\ReviewServerConfig\\OffsetBackup\\")
#define    REVIEW_OFFSET_BACKUP_FORDER_PATH _T("D:\\DIT_Review\\ReviewServerConfig\\OffsetBackup\\")
// CDlgDefocusList ëŒ€í™” ìƒìžìž…니다.
interface IDialogReviewOffSet2Parent
ReviewSystem/ReviewSystem/DlgSelfDiagnosis.cpp
@@ -70,8 +70,8 @@
            m_pDlgWsi->DisableBtSIMULATION(FALSE);
            break;
        case 7:
            m_pDlgWsi->UpdateWSIResult(0, 0, 0, 0, 0);
            m_pDlgWsi->UpdateWSIResult(1, 0, 0, 0, 0);
            //m_pDlgWsi->UpdateWSIResult(0, 0, 0, 0, 0);
            //m_pDlgWsi->UpdateWSIResult(1, 0, 0, 0, 0);
        default:
            break;
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Flatness.cpp
@@ -982,6 +982,20 @@
void CDlgSelfDiagnosis_Flatness::OnBnClickedButtonSimulation()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    if (m_pDiagnosisManager->CheckManualMode() == FALSE)
    {
        CString strMessage;
        strMessage.Format(_T("Change Manual Mode!!"));
        if (IDOK == AfxMessageBox(strMessage, MB_OK | MB_ICONERROR))
        {
            g_pLog->DisplayMessage(_T("Manual Diagnosis Fail! Not Manual Mode"));
            return;
        }
    }
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    if (m_bState == FALSE)
    {
        m_bState = TRUE;
@@ -999,6 +1013,19 @@
void CDlgSelfDiagnosis_Flatness::OnBnClickedButtonManual()
{
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    if (m_pDiagnosisManager->CheckManualMode() == FALSE)
    {
        CString strMessage;
        strMessage.Format(_T("Change Manual Mode!!"));
        if (IDOK == AfxMessageBox(strMessage, MB_OK | MB_ICONERROR))
        {
            g_pLog->DisplayMessage(_T("Manual Diagnosis Fail! Not Manual Mode"));
            return;
        }
    }
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    m_pDiagnosisManager->ManualMeasure_Flatness();
}
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Setting.cpp
@@ -56,6 +56,12 @@
    DDX_Control(pDX, IDC_EDIT_WSI_PANEL_POS_Y, m_editPanelPosY);
    DDX_Control(pDX, IDC_EDIT_WSI_PANEL_POS_X2, m_editPanelPosX2);
    DDX_Control(pDX, IDC_EDIT_WSI_PANEL_POS_Y2, m_editPanelPosY2);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    DDX_Control(pDX, IDC_CHECK_SELF_DIAGNOSIS_FLATNESS_SKIP, m_CheckFlatnessSkip);
    DDX_Control(pDX, IDC_EDIT_SQUARENESS_STANDARD, m_editSquarenessStandard);
    DDX_Control(pDX, IDC_EDIT_SQUARENESS_STANDARD2, m_editSquarenessStandard2);
    DDX_Control(pDX, IDC_EDIT_WSI_STANDARD, m_editWSIStandard);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    DDX_Text(pDX, IDC_EDIT_REVIEW_PANEL_POS_X, m_dEditReviewPanelPosX);
    DDX_Text(pDX, IDC_EDIT_REVIEW_PANEL_POS_Y, m_dEditReviewPanelPosY);
    DDX_Text(pDX, IDC_EDIT_REVIEW_PANEL_POS_X2, m_dEditReviewPanelPosX2);
@@ -111,16 +117,19 @@
BOOL CDlgSelfDiagnosis_Setting::ReadAutoDiagnosisConfigFile()
{
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    CString strConfigFilePath = _T("");
    strConfigFilePath.Format(_T("%s\\%s"), REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_PATH, REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_NAME);
    m_pDiagnosisManager->LoadSettingConfigFile(strConfigFilePath);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    CDiagnosisInfo* pSettingInfo = m_pDiagnosisManager->GetDiagnosisInfo();
    if (pSettingInfo == NULL)
        return FALSE;
    CString strTemp = _T("");
    CString strFilePath = REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_PATH;
    CString strFileName = _T("AutoDiagnosisSetting.cfg");
    m_editFilePath.SetWindowTextA(strFilePath +_T('\\') + strFileName);
    m_editFilePath.SetWindowTextA(strConfigFilePath);
    strTemp.Format("%d", pSettingInfo->GetModuleCount());
    m_editModuleCount.SetWindowTextA(strTemp);
@@ -133,6 +142,14 @@
    strTemp.Format("%f", pSettingInfo->GetJudgeData_Degree());
    m_editJudgeData_Degree.SetWindowTextA(strTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    strTemp.Format("%f", pSettingInfo->GetSquarenessStandard());
    m_editSquarenessStandard.SetWindowTextA(strTemp);
    strTemp.Format("%f", pSettingInfo->GetSquarenessStandard2());
    m_editSquarenessStandard2.SetWindowTextA(strTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    strTemp.Format("%d", pSettingInfo->GetCameraFrameWidth());
    m_editFrameWidth.SetWindowTextA(strTemp);
@@ -166,12 +183,20 @@
    strTemp.Format("%d", pSettingInfo->GetGlassSizeY_Flatness());
    m_editGlassSizeY.SetWindowTextA(strTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    m_CheckFlatnessSkip.SetCheck(pSettingInfo->GetFlastnessSkipMode());
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    strTemp.Format("%d", pSettingInfo->GetPanelCount_Wsi());
    m_editPanelCount_Wsi.SetWindowTextA(strTemp);
    strTemp.Format("%f", pSettingInfo->GetJudgeData_3Sigma());
    m_editJudgeData_3Sigma.SetWindowTextA(strTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    strTemp.Format("%f", pSettingInfo->GetWSIStandard());
    m_editWSIStandard.SetWindowTextA(strTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    strTemp.Format("%f", pSettingInfo->GetPanelPosX_Wsi());
    m_editPanelPosX.SetWindowTextA(strTemp);
@@ -278,6 +303,28 @@
    nTemp = atoi(strTemp);
    macroFile.SetItem(strItem, nTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    strItem.Format(_T("FLATNESS_SKIPMODE"));
    nTemp = m_CheckFlatnessSkip.GetCheck();
    macroFile.SetItem(strItem, nTemp);
    strItem.Format(_T("SQUARENESS_STANDARD"));
    m_editSquarenessStandard.GetWindowTextA(strTemp);
    dTemp = atof(strTemp);
    macroFile.SetItem(strItem, dTemp);
    strItem.Format(_T("SQUARENESS_STANDARD2"));
    m_editSquarenessStandard2.GetWindowTextA(strTemp);
    dTemp = atof(strTemp);
    macroFile.SetItem(strItem, dTemp);
    strItem.Format(_T("WSI_STANDARD"));
    m_editWSIStandard.GetWindowTextA(strTemp);
    dTemp = atof(strTemp);
    macroFile.SetItem(strItem, dTemp);
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    strItem.Format(_T("WSI_PANEL_COUNT"));
    m_editPanelCount_Wsi.GetWindowTextA(strTemp);
    nTemp = atoi(strTemp);
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Setting.h
@@ -63,4 +63,9 @@
    double m_dEditReviewPanelPosY5;
    double m_dEditReviewPanelPosX6;
    double m_dEditReviewPanelPosY6;
public:
    CButton m_CheckFlatnessSkip;
    CEdit m_editSquarenessStandard;
    CEdit m_editSquarenessStandard2;
    CEdit m_editWSIStandard;
};
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Squareness.cpp
@@ -15,7 +15,7 @@
CDlgSelfDiagnosis_Squareness::CDlgSelfDiagnosis_Squareness(CDiagnosisManager* pDiagnosisManager, CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DLG_SELF_DIAGNOSIS_SQUARENESS, pParent)
    , m_nSelModuleIndex(0)
    , m_dEditTheta(0)
    , m_dEditLeftTheta(0)
    , m_dEditMotorX_1(0)
    , m_dEditMotorY_1(0)
    , m_dEditPixelX_1(0)
@@ -28,6 +28,21 @@
    , m_dEditMotorY_3(0)
    , m_dEditPixelX_3(0)
    , m_dEditPixelY_3(0)
    , m_dEditRightTheta(0)
    , m_dEditMotorX_4(0)
    , m_dEditMotorY_4(0)
    , m_dEditPixelX_4(0)
    , m_dEditPixelY_4(0)
    , m_dEditMotorX_5(0)
    , m_dEditMotorY_5(0)
    , m_dEditPixelX_5(0)
    , m_dEditPixelY_5(0)
    , m_dEditMotorX_6(0)
    , m_dEditMotorY_6(0)
    , m_dEditPixelX_6(0)
    , m_dEditPixelY_6(0)
    , m_editFirstSettingStandard(0)
    , m_editFirstSettingStandard2(0)
{
    m_pDiagnosisManager = pDiagnosisManager;
}
@@ -41,7 +56,7 @@
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_GRID_GANTRY_DATA_HISTORY, m_ctrlGridGantryDataHistory);
    DDX_Control(pDX, IDC_LIST, m_ctrlListFileHistory);
    DDX_Text(pDX, IDC_EDIT_GANTRY_THETA, m_dEditTheta);
    DDX_Text(pDX, IDC_EDIT_GANTRY_THETA, m_dEditLeftTheta);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_X, m_dEditMotorX_1);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_Y, m_dEditMotorY_1);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_X, m_dEditPixelX_1);
@@ -55,6 +70,22 @@
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_Y3, m_dEditMotorY_3);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_X3, m_dEditPixelX_3);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_Y3, m_dEditPixelY_3);
    DDX_Text(pDX, IDC_EDIT_GANTRY_THETA2, m_dEditRightTheta);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_X4, m_dEditMotorX_4);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_Y4, m_dEditMotorY_4);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_X4, m_dEditPixelX_4);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_Y4, m_dEditPixelY_4);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_X5, m_dEditMotorX_5);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_Y5, m_dEditMotorY_5);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_X5, m_dEditPixelX_5);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_Y5, m_dEditPixelY_5);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_X6, m_dEditMotorX_6);
    DDX_Text(pDX, IDC_EDIT_GANTRY_MOTOR_Y6, m_dEditMotorY_6);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_X6, m_dEditPixelX_6);
    DDX_Text(pDX, IDC_EDIT_GANTRY_PIXEL_Y6, m_dEditPixelY_6);
    DDX_Text(pDX, IDC_EDIT_SQUARENESS_FIRSTSETTING, m_editFirstSettingStandard);
    DDX_Text(pDX, IDC_EDIT_SQUARENESS_FIRSTSETTING2, m_editFirstSettingStandard2);
    //DDX_Control(pDX, IDC_BUTTON_SIMULATION, m_BtSumulation);
    //DDX_Control(pDX, IDC_BUTTON_SIMULATION, m_BtSumulation);
    DDX_Control(pDX, IDC_BUTTON_SIMULATION2, m_BtSumulation);
@@ -157,88 +188,135 @@
        const CDiagnosisInfo* pSettingInfo = m_pDiagnosisManager->GetDiagnosisInfo();
        if (pSettingInfo == NULL) return;
        const CDiagnosisResult* pStandardResult = pSettingInfo->GetSettingResult_Squareness(m_nSelModuleIndex);
        if (pStandardResult == NULL) return;
        m_editFirstSettingStandard = pSettingInfo->GetSquarenessStandard();
        m_editFirstSettingStandard2 = pSettingInfo->GetSquarenessStandard2();
        if (bLoadResult) // update load file data
        {
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(m_nSelModuleIndex);
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(0);
            if (pResult == NULL) return;
            // result : theta, pixel position
            m_dEditTheta = pResult->GetGantryDegree();
            m_dEditLeftTheta = pResult->GetGantryDegree();
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx);
                if (pPosData == NULL) continue;
                if (pPosData->nIndex == PanelPosition_Base)
                if (pPosData->nPosMode == PanelPosition_Base)
                {
                    m_dEditPixelX_1 = pPosData->dPixelX;
                    m_dEditPixelY_1 = pPosData->dPixelY;
                }
                else if (pPosData->nIndex == PanelPosition_Sub)
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_2 = pPosData->dPixelX;
                    m_dEditPixelY_2 = pPosData->dPixelY;
                }
                else if (pPosData->nIndex == PanelPosition_Addition)
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_3 = pPosData->dPixelX;
                    m_dEditPixelY_3 = pPosData->dPixelY;
                }
            }
            pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(1);
            if (pResult == NULL) return;
            // result : theta, pixel position
            m_dEditRightTheta = pResult->GetGantryDegree();
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx+3);
                if (pPosData == NULL) continue;
                if (pPosData->nPosMode == PanelPosition_Base)
                {
                    m_dEditPixelX_4 = pPosData->dPixelX;
                    m_dEditPixelY_4 = pPosData->dPixelY;
                }
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_5 = pPosData->dPixelX;
                    m_dEditPixelY_5 = pPosData->dPixelY;
                }
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_6 = pPosData->dPixelX;
                    m_dEditPixelY_6 = pPosData->dPixelY;
                }
            }
        }
        else if (bLoadResult == FALSE && m_pDiagnosisManager->ExistStandardData() == FALSE)// update setting data
        {
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(m_nSelModuleIndex);
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(0);
            if (pResult == NULL) return;
            // result : theta, pixel position
            m_dEditTheta = pResult->GetGantryDegree();
            m_dEditLeftTheta = pResult->GetGantryDegree();
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx);
                if (pPosData == NULL) continue;
                if (pPosData->nIndex == PanelPosition_Base)
                if (pPosData->nPosMode == PanelPosition_Base)
                {
                    m_dEditPixelX_1 = pPosData->dPixelX;
                    m_dEditPixelY_1 = pPosData->dPixelY;
                }
                else if (pPosData->nIndex == PanelPosition_Sub)
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_2 = pPosData->dPixelX;
                    m_dEditPixelY_2 = pPosData->dPixelY;
                }
                else if (pPosData->nIndex == PanelPosition_Addition)
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_3 = pPosData->dPixelX;
                    m_dEditPixelY_3 = pPosData->dPixelY;
                }
            }
            pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(1);
            if (pResult == NULL) return;
            // result : theta, pixel position
            m_dEditLeftTheta = pResult->GetGantryDegree();
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx+3);
                if (pPosData == NULL) continue;
                if (pPosData->nPosMode == PanelPosition_Base)
                {
                    m_dEditPixelX_4 = pPosData->dPixelX;
                    m_dEditPixelY_4 = pPosData->dPixelY;
                }
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_5 = pPosData->dPixelX;
                    m_dEditPixelY_5 = pPosData->dPixelY;
                }
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_6 = pPosData->dPixelX;
                    m_dEditPixelY_6 = pPosData->dPixelY;
                }
            }
        }
        else
        {
            int nPlanindex = 0;
            // result : theta, pixel position
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(m_nSelModuleIndex);
            const CDiagnosisResult* pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(0);
            if (pResult == NULL) return;
            BOOL bProcess = FALSE;
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                if (m_nSelModuleIndex == 1)
                {
                    nPlanindex = nPIdx + 3;
                }
                else
                {
                    nPlanindex = nPIdx;
                }
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPlanindex);
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx);
                if (pPosData == NULL) continue;
                if (pPosData->nPosMode == PanelPosition_Base)
@@ -247,13 +325,13 @@
                    m_dEditPixelY_1 = pPosData->dPixelY;
                    bProcess = pPosData->bProcsss;
                }
                else if (pPosData->nIndex == PanelPosition_Sub)
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_2 = pPosData->dPixelX;
                    m_dEditPixelY_2 = pPosData->dPixelY;
                    bProcess &= pPosData->bProcsss;
                }
                else if (pPosData->nIndex == PanelPosition_Addition)
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_3 = pPosData->dPixelX;
                    m_dEditPixelY_3 = pPosData->dPixelY;
@@ -261,8 +339,41 @@
                }
            }
            m_dEditTheta = bProcess ? pResult->GetGantryDegree() : 0.;
            m_dEditLeftTheta = bProcess ? pResult->GetGantryDegree() : 0.;
            pResult = m_pDiagnosisManager->GetDiagnosisResult_Squareness(1);
            if (pResult == NULL) return;
            bProcess = FALSE;
            for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
            {
                const SPositionData* pPosData = pResult->GetPositionData_Squareness(nPIdx+3);
                if (pPosData == NULL) continue;
                if (pPosData->nPosMode == PanelPosition_Base)
                {
                    m_dEditPixelX_4 = pPosData->dPixelX;
                    m_dEditPixelY_4 = pPosData->dPixelY;
                    bProcess = pPosData->bProcsss;
                }
                else if (pPosData->nPosMode == PanelPosition_Sub)
                {
                    m_dEditPixelX_5 = pPosData->dPixelX;
                    m_dEditPixelY_5 = pPosData->dPixelY;
                    bProcess &= pPosData->bProcsss;
                }
                else if (pPosData->nPosMode == PanelPosition_Addition)
                {
                    m_dEditPixelX_6 = pPosData->dPixelX;
                    m_dEditPixelY_6 = pPosData->dPixelY;
                    bProcess &= pPosData->bProcsss;
                }
            }
            m_dEditRightTheta = bProcess ? pResult->GetGantryDegree() : 0.;
        }
        const CDiagnosisResult* pStandardResult = pSettingInfo->GetSettingResult_Squareness(0);
        // info : motor position
        for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
@@ -284,6 +395,30 @@
            {
                m_dEditMotorX_3 = pPosData->dPosX;
                m_dEditMotorY_3 = pPosData->dPosY;
            }
        }
        pStandardResult = pSettingInfo->GetSettingResult_Squareness(1);
        for (int nPIdx = 0; nPIdx < pSettingInfo->GetPanelCount_Squareness(); nPIdx++)
        {
            const SPositionData* pPosData = pStandardResult->GetPositionData_Squareness(nPIdx);
            if (pPosData == NULL) continue;
            if (pPosData->nIndex == PanelPosition_Base)
            {
                m_dEditMotorX_4 = pPosData->dPosX;
                m_dEditMotorY_4 = pPosData->dPosY;
            }
            else if (pPosData->nIndex == PanelPosition_Sub)
            {
                m_dEditMotorX_5 = pPosData->dPosX;
                m_dEditMotorY_5 = pPosData->dPosY;
            }
            else if (pPosData->nIndex == PanelPosition_Addition)
            {
                m_dEditMotorX_6 = pPosData->dPosX;
                m_dEditMotorY_6 = pPosData->dPosY;
            }
        }
    
@@ -414,8 +549,22 @@
void CDlgSelfDiagnosis_Squareness::OnBnClickedButtonSimulation2()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    if (m_pDiagnosisManager == NULL) return;
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    if (m_pDiagnosisManager->CheckManualMode() == FALSE)
    {
        CString strMessage;
        strMessage.Format(_T("Change Manual Mode!!"));
        if (IDOK == AfxMessageBox(strMessage, MB_OK | MB_ICONERROR))
        {
            g_pLog->DisplayMessage(_T("Manual Diagnosis Fail! Not Manual Mode"));
            return;
        }
    }
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    GetDialogControls();
    m_pDiagnosisManager->RecvSignalToSignalControl(DiagnosisSignal_Manual, DiagnosisMode_Squareness, TRUE);
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Squareness.h
@@ -46,7 +46,7 @@
    CListBox m_ctrlListFileHistory;
    CComboBox m_ctrlComboModuleIndex;
    int m_nSelModuleIndex;
    double m_dEditTheta;
    double m_dEditLeftTheta;
    double m_dEditMotorX_1;
    double m_dEditMotorY_1; 
    double m_dEditPixelX_1;
@@ -59,6 +59,21 @@
    double m_dEditMotorY_3;
    double m_dEditPixelX_3;
    double m_dEditPixelY_3;
    double m_dEditRightTheta;
    double m_dEditMotorX_4;
    double m_dEditMotorY_4;
    double m_dEditPixelX_4;
    double m_dEditPixelY_4;
    double m_dEditMotorX_5;
    double m_dEditMotorY_5;
    double m_dEditPixelX_5;
    double m_dEditPixelY_5;
    double m_dEditMotorX_6;
    double m_dEditMotorY_6;
    double m_dEditPixelX_6;
    double m_dEditPixelY_6;
    CButton m_BtSumulation;
    afx_msg void OnBnClickedButtonSimulation2();
    double m_editFirstSettingStandard;
    double m_editFirstSettingStandard2;
};
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.cpp
@@ -16,6 +16,7 @@
    : CDialogEx(IDD_DLG_SELF_DIAGNOSIS_WSI, pParent)
{
    m_pDiagnosisManager = pDiagnosisManager;
    m_editWSIFirstStandard = 180;
}
CDlgSelfDiagnosis_Wsi::~CDlgSelfDiagnosis_Wsi()
@@ -30,6 +31,25 @@
    DDX_Control(pDX, IDC_EDIT_WSI_RTB_00, m_ctrlWsiRtb00);
    DDX_Control(pDX, IDC_EDIT_WSI_RTB_01, m_ctrlWsiRtb01);
    DDX_Control(pDX, IDC_BUTTON_SIMULATION, m_btSimulation);
    DDX_Text(pDX, IDC_EDIT_WSI_FIRST_STANDARD, m_editWSIFirstStandard);
    DDX_Control(pDX, IDC_LIST_WSI_DIAGNOSIS_RESULT, m_ListWSIResult);
}
BOOL CDlgSelfDiagnosis_Wsi::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    m_ListWSIResult.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
    m_ListWSIResult.InsertColumn(0, _T("Index"), LVCFMT_CENTER, 70);
    m_ListWSIResult.InsertColumn(1, _T("Left Module"), LVCFMT_CENTER, 100);
    m_ListWSIResult.InsertColumn(2, _T("Right Module"), LVCFMT_CENTER, 100);
    m_ListWSIResult.SetRedraw(TRUE);
    // TODO:  ì—¬ê¸°ì— ì¶”ê°€ ì´ˆê¸°í™” ìž‘업을 ì¶”가합니다.
    return TRUE;  // return TRUE unless you set the focus to a control
                  // ì˜ˆì™¸: OCX ì†ì„± íŽ˜ì´ì§€ëŠ” FALSE를 ë°˜í™˜í•´ì•¼ í•©ë‹ˆë‹¤.
}
@@ -45,9 +65,21 @@
void CDlgSelfDiagnosis_Wsi::OnBnClickedButtonSimulation()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    if (m_pDiagnosisManager == NULL) return;
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
    if (m_pDiagnosisManager->CheckManualMode() == FALSE)
    {
        CString strMessage;
        strMessage.Format(_T("Change Manual Mode!!"));
        if (IDOK == AfxMessageBox(strMessage, MB_OK | MB_ICONERROR))
        {
            g_pLog->DisplayMessage(_T("Manual Diagnosis Fail! Not Manual Mode"));
            return;
        }
    }
    //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _END
    //GetDialogControls();
@@ -71,19 +103,52 @@
{
    const CDiagnosisInfo* pSettingInfo = m_pDiagnosisManager->GetDiagnosisInfo();
    if (pSettingInfo == NULL) return;
    m_editWSIFirstStandard = pSettingInfo->GetWSIStandard();
    
    double nACC00 = m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->getWSI_ACC();
    double nACC01 = m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->getWSI_ACC();
    double nRTB00 =  m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->getWSI_RTB();
    double nRTB01 = m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->getWSI_RTB();
    double dDiagnosisHeight[20];
    for (int i = 0; i < 10; i++)
    {
        dDiagnosisHeight[i] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->GetDiagnosisHeight(i);
    }
    for (int i = 0; i < 10; i++)
    {
        dDiagnosisHeight[i+10] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->GetDiagnosisHeight(i);
    }
    CString strDiagnosisHeight;
    CString strACC00, strACC01;
    CString strRTB00, strRTB01;
    strACC00.Format(_T("%d"), nACC00);
    strACC01.Format(_T("%d"), nACC01);
    strRTB00.Format(_T("%d"), nRTB00);
    strRTB01.Format(_T("%d"), nRTB01);
    m_ctrlWsiAcc00.SetWindowTextA(strACC00);
    m_ctrlWsiAcc01.SetWindowTextA(strACC01);
    m_ctrlWsiRtb00.SetWindowTextA(strRTB00);
    m_ctrlWsiRtb01.SetWindowTextA(strRTB01);
    for (int i = 0; i < 10; i++)
    {
        int nRow = i + 1;
        strDiagnosisHeight.Format(_T("%d"), nRow);
        m_ListWSIResult.InsertItem(nRow, strDiagnosisHeight);
        strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[i]);
        m_ListWSIResult.SetItemText(nRow, 1, strDiagnosisHeight);
        strDiagnosisHeight.Format(_T("%d"), dDiagnosisHeight[i+10]);
        m_ListWSIResult.SetItemText(nRow, 2, strDiagnosisHeight);
        m_ListWSIResult.EnsureVisible(nRow, FALSE);
    }
    
}
@@ -108,12 +173,15 @@
    const CDiagnosisInfo* pSettingInfo = m_pDiagnosisManager->GetDiagnosisInfo();
    if (pSettingInfo == NULL) return;
    m_editWSIFirstStandard = pSettingInfo->GetWSIStandard();
    double nACC00 = dAcc00;
    double nACC01 = dAcc01;
    double nRTB00 = dRbt00;
    double nRTB01 = dRbt01;
    CString strDiagnosisHeight;
    CString strACC00, strACC01;
    CString strRTB00, strRTB01;
    strACC00.Format(_T("%f"),nACC00);
@@ -130,6 +198,36 @@
        m_ctrlWsiRtb01.SetWindowTextA(strRTB01);
    }
    double dDiagnosisHeightleft[10];
    double dDiagnosisHeightRight[10];
    for (int i = 0; i < 10; i++)
    {
        dDiagnosisHeightleft[i] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->GetDiagnosisHeight(i);
    }
    for (int i = 0; i < 10; i++)
    {
        dDiagnosisHeightRight[i] = m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->GetDiagnosisHeight(i);
    }
    m_ListWSIResult.DeleteAllItems();
    for (int i = 0; i < 10; i++)
    {
            int nRow = i;
            strDiagnosisHeight.Format(_T("%d"), nRow + 1);
            m_ListWSIResult.InsertItem(nRow, strDiagnosisHeight);
            strDiagnosisHeight.Format(_T("%.3f"), dDiagnosisHeightleft[i]);
            m_ListWSIResult.SetItemText(nRow, 1, strDiagnosisHeight);
            strDiagnosisHeight.Format(_T("%.3f"), dDiagnosisHeightRight[i]);
            m_ListWSIResult.SetItemText(nRow, 2, strDiagnosisHeight);
            m_ListWSIResult.EnsureVisible(nRow, FALSE);
    }
}
@@ -158,3 +256,4 @@
    // TODO:  ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
}
ReviewSystem/ReviewSystem/DlgSelfDiagnosis_Wsi.h
@@ -18,6 +18,9 @@
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ì§€ì›ìž…니다.
    virtual BOOL OnInitDialog();
    CListCtrl m_ListWSIResult;
    DECLARE_MESSAGE_MAP()
public:
@@ -34,4 +37,6 @@
    CEdit m_ctrlWsiRtb00;
    CEdit m_ctrlWsiRtb01;
    CButton m_btSimulation;
    double m_editWSIFirstStandard;
};
ReviewSystem/ReviewSystem/FileUploadControl.cpp
@@ -179,7 +179,7 @@
// 
//     CCommendParam *pParam = NULL;
// 
//     //FTPUpLoad이면 ë°˜í™˜
//     //FTPUpLoad�̸� ï¿½ï¿½È¯
//     if( bFTPUpload )
//         return FALSE;
// 
@@ -301,7 +301,8 @@
    if (NULL == hWnd)
    {
        g_pLog->DisplayMessage(_T("Find FTPUploader Program : Fail."));
        StartFTPUploader(_T("C:\\DIT_Review"));
        StartFTPUploader(_T("D:\\DIT_Review"));  //210805
    }
    else
    {
@@ -314,7 +315,7 @@
        else
        {
            g_pLog->DisplayMessage(_T("Send Data to FTPUploader : Fail."));
            RestartFTPUploader(_T("C:\\DIT_Review")); //A2E FTPUploader
            RestartFTPUploader(_T("D:\\DIT_Review")); //A2E FTPUploader //210805
            bRet = FALSE;
        }
    }
ReviewSystem/ReviewSystem/MainFrm.cpp
@@ -41,6 +41,8 @@
    ID_INDICATOR_SCRL,
};
// ì •의
// CMainFrame ìƒì„±/소멸
CMainFrame::CMainFrame()
@@ -68,6 +70,8 @@
    if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
        return -1;
    SetUnhandledExceptionFilter(TopLevelExceptionFilterCallBack);
    ModifyStyle(WS_CAPTION, NULL);
    SetMenu(NULL);
@@ -88,8 +92,8 @@
    //LYW Align Reconnect
    //업데이트시
    //system("netsh interface set interface name = \"Align #1\" admin = disable&& netsh interface set interface name = \"Align #1\" admin = enable&& netsh interface set interface name = \"Align #2\" admin = disable&& netsh interface set interface name = \"Align #2\" admin = enable");
    //Sleep(2000);
    system("netsh interface set interface name = \"Align #1\" admin = disable&& netsh interface set interface name = \"Align #1\" admin = enable&& netsh interface set interface name = \"Align #2\" admin = disable&& netsh interface set interface name = \"Align #2\" admin = enable");
    Sleep(2000);
//    SetTimer(ID_TIMER_WSI_LONGRUN_TEST_TIME, 10000, NULL);
@@ -447,9 +451,9 @@
#define strScript "RESTART^AFControl.exe^C:\\AFControl\\program\\AFControl.exe"
    
    CFile file;
    if( FALSE == file.Open(_T("C:\\DIT_Review\\MakeScript.TSF"),CFile::modeCreate | CFile::modeWrite) )
    if( FALSE == file.Open(_T("D:\\DIT_Review\\MakeScript.TSF"),CFile::modeCreate | CFile::modeWrite) ) //210805
    {
        g_pLog->DisplayMessage(_T("File[C:\\DIT_Review\\MakeScript.TSF] Create Fail!!"));
        g_pLog->DisplayMessage(_T("File[D:\\DIT_Review\\MakeScript.TSF] Create Fail!!")); //210805
        return;
    }
@@ -481,7 +485,7 @@
    CString strTarget;
    strTarget.Format(_T("\\\\126.100.100.220\\c\\RemoteTaskMgr\\T\\CopyScript.TSF"));
    
    BOOL bRet = CopyFile(_T("C:\\DIT_Review\\MakeScript.TSF"),strTarget,FALSE);
    BOOL bRet = CopyFile(_T("D:\\DIT_Review\\MakeScript.TSF"),strTarget,FALSE); //210805
    if(bRet == FALSE)
        g_pLog->DisplayMessage(_T("[%s]Send Script Fail!"), strTarget);
    /////////////////////////////////////
@@ -940,4 +944,5 @@
        return TRUE;
    }
    return FALSE;
}
}
ReviewSystem/ReviewSystem/MainFrm.h
@@ -19,7 +19,6 @@
#include "stdafx.h"
class CMainFrame :    public CFrameWndEx, public CReviewInterface
{
    
ReviewSystem/ReviewSystem/ReviewInterface.cpp
@@ -124,6 +124,9 @@
    m_bIsOffSetOn = 0;
    m_bIsSimulation = 0;
    m_bFirstReviewLeft = 0;
    m_bFirstReviewRight = 0;
    // cs init
    InitializeCriticalSection(&m_csReviewResult);
    InitializeCriticalSection(&m_csReviewSignal);
@@ -1269,7 +1272,7 @@
        // process status observer
        AddObserverUpdateProcessStatus(static_cast<IUpdateProcessStatus*>(m_pAlignCameraControl));
        m_pAlignCameraControl->Camera_Control(CameraControlLive);
        /*m_pAlignCameraControl->Camera_Control(CameraControlLive);*/      // 210805 Align Camera Sequence ë³€ê²½
    }
    else
    {
@@ -2874,24 +2877,36 @@
            double dAccdata = measureResut.dAccuracy;
            double dRbtdata = measureResut.dRepeatability;
            double dDiagnosisHeight[10];
            for (int i = 0; i < 10; i++)
            {
                dDiagnosisHeight[i] = measureResut.dDiagnosisHeight[i];
            }
            if (nModuleIndex == 0)
            {
                m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetACC(dAccdata);
                m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetRTB(dRbtdata);
                for (int i = 0; i < 10; i++)
                {
                    m_pDiagnosisManager->GetDiagnosisResult_Wsi(0)->SetDiagnosisHeight(dDiagnosisHeight[i], i);
                }
                m_vecWSIControl[0]->SendWsiAfmSafePosMove();
            }
            else if (nModuleIndex == 1)
            {
                m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetACC(dAccdata);
                m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetRTB(dRbtdata);
                for (int i = 0; i < 10; i++)
                {
                    m_pDiagnosisManager->GetDiagnosisResult_Wsi(1)->SetDiagnosisHeight(dDiagnosisHeight[i], i);
                }
                m_vecWSIControl[1]->SendWsiAfmSafePosMove();
            }
        
            m_pDlgDiagnosis->m_pDlgWsi->UpdateWSIResult(nModuleIndex,dAccdata, dAccdata, dRbtdata, dRbtdata);
            m_pDlgDiagnosis->m_pDiagnosisManager->setWSIVLSIEnd(true);
        }
@@ -3305,6 +3320,12 @@
    return m_pDoc->System_GetSystemInfo();
}
const CSignalControlInfo* CReviewInterface::IRP2P_GetReviewSignalinfo()
{
    if (m_pDoc == NULL) return NULL;
    return m_pDoc->System_GetSignalInfo();
}
CGlassResult* CReviewInterface::IRP2P_GetCurrentGlassResult()
{
    if (m_pDoc==NULL) return NULL;
@@ -3313,14 +3334,23 @@
void CReviewInterface::IRP2P_DisplayMessage(const TCHAR* lpstrFormat, ...)
{
    va_list list;
    TCHAR strText[2000] = {0};
    try
    {
        va_list list;
        TCHAR strText[2000] = { 0 };
    va_start(list, lpstrFormat);
    _vstprintf_s(strText, lpstrFormat, list);
    va_end(list);
        va_start(list, lpstrFormat);
        _vstprintf_s(strText, lpstrFormat, list);
        va_end(list);
    g_pLog->DisplayMessage(strText);
        g_pLog->DisplayMessage(strText);
    }
    catch (...)
    {
        return ;
    }
}
CResultServerControl* CReviewInterface::IRP2P_GetResultServerControl()
@@ -3356,6 +3386,26 @@
CRecipeManager* CReviewInterface::IRP2P_GetEdgeRecipeManager()
{
    return m_pEdgeRecipeManager;
}
BOOL CReviewInterface::IRP2P_GetFirstReviewLeft()
{
    return m_bFirstReviewLeft;
}
BOOL CReviewInterface::IRP2P_GetFirstReviewRight()
{
    return m_bFirstReviewRight;
}
void CReviewInterface::IRP2P_SetFirstReviewLeft(BOOL b_Check)
{
    m_bFirstReviewLeft = b_Check;
}
void CReviewInterface::IRP2P_SetFirstReviewRight(BOOL b_Check)
{
    m_bFirstReviewRight = b_Check;
}
@@ -3497,6 +3547,16 @@
    return m_pMotorControl->IsGantryMotionEnd(nModuleIdx);
}
BOOL CReviewInterface::IDP2P_CheckManualMode()
{
    if (IsManualProcessMode() == TRUE)
    {
        return TRUE;
    }
    return FALSE;
}
int CReviewInterface::IDP2P_GetSelectedModuleIndex()
@@ -3767,12 +3827,15 @@
    if (m_SequenceProcessor == NULL) return;
    m_SequenceProcessor->SetWsiType(9);
    if (!m_SequenceProcessor->WSIAllReadySignal(1))
    if (nModuleIdx == 0)
    {
        g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
        if (!m_SequenceProcessor->WSIAllReadySignal(1))
        {
            g_pLog->DisplayMessage(_T("[WSI] Send Ready Signal to All WIS Fail"));
            return;
        }
    }
    else
    {
        SetCurrentWsiMode(WsiMeasureType_VLSI);
        CWsiControl* pWsiControl = ISP2P_GetWSIControl(nModuleIdx);
@@ -3786,7 +3849,6 @@
        pWsiControl->SetWsiStart(1, vectorPosX, vectorPosY, 0);
    }
}
void CReviewInterface::IDP2P_WsiMotorMotionEnd(int nModuleIdx, double dPosX, double dPosY)
@@ -6463,6 +6525,10 @@
{
    if (m_pSequenceProcessor==NULL) return;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    m_pSequenceProcessor->SetSimulationMode(TRUE);
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
    if (nCommand == -1)        // DBClick Date
    {
@@ -8348,6 +8414,26 @@
    return m_pDlgHistoryTool;
}
BOOL CReviewInterface::ISP2P_GetFirstReviewLeft()
{
    return m_bFirstReviewLeft;
}
BOOL CReviewInterface::ISP2P_GetFirstReviewRight()
{
    return m_bFirstReviewRight;
}
void CReviewInterface::ISP2P_SetFirstReviewLeft(BOOL b_Check)
{
    m_bFirstReviewLeft = b_Check;
}
void CReviewInterface::ISP2P_SetFirstReviewRight(BOOL b_Check)
{
    m_bFirstReviewRight = b_Check;
}
void CReviewInterface::ILCC2P_DisplayMessage( int nIndex, const TCHAR* lpstrFormat, ... )
{
ReviewSystem/ReviewSystem/ReviewInterface.h
@@ -209,6 +209,7 @@
    virtual void IDP2P_MotorGo(int nModuleIdx, double dPosX, double dPosY, BOOL bWaitReturn = FALSE);
    virtual BOOL IDP2P_GetMotionEnd(int nModuleIdx, int nTimeOut = -1);
    virtual BOOL IDP2P_IsGantryMotionEnd(int nModuleIdx);
    virtual BOOL IDP2P_CheckManualMode();
    // Squareness
    virtual int IDP2P_GetSelectedModuleIndex();
    virtual int IDP2P_GetOrigionMotorDir();
@@ -248,6 +249,7 @@
    virtual void                        IRP2P_UpdateCameraControl(int nModuleIdx, const SCameraControl *pCameraControl, const SCameraInfo* pCameraInfo);
    virtual const CRsRcpReviewInfo*        IRP2P_Recipe_GetRsRcpReviewInfo();
    virtual const CSystemInfo*          IRP2P_GetReviewSysteminfo();
    virtual const CSignalControlInfo*    IRP2P_GetReviewSignalinfo();
    virtual CGlassResult*                IRP2P_GetCurrentGlassResult();                                                    
    virtual void                        IRP2P_DisplayMessage(const TCHAR* lpstrFormat, ...);
    virtual CResultServerControl*        IRP2P_GetResultServerControl();
@@ -255,6 +257,13 @@
    virtual void                        IRP2P_CompletePlanIndex(int nReviewStatus, int nPlanIndex);
    virtual void                        IRP2P_UpdateReviewProcessStatus(int nReviewStatus, int nPlanIndex=0);
    virtual CRecipeManager*                IRP2P_GetEdgeRecipeManager();
    virtual BOOL                        IRP2P_GetFirstReviewLeft();
    virtual BOOL                        IRP2P_GetFirstReviewRight();
    virtual void                        IRP2P_SetFirstReviewLeft(BOOL b_Check);
    virtual void                        IRP2P_SetFirstReviewRight(BOOL b_Check);
    BOOL    m_bFirstReviewLeft;
    BOOL    m_bFirstReviewRight;
    virtual BOOL                        IRP2P_SaveDefectMap(const CString& strPath);
@@ -397,6 +406,12 @@
    virtual CDlgSelfDiagnosis*            ISP2P_GetDlgDiagnosis();
    virtual CDlgReviewHistoryTool*        ISP2P_GetDlgHistory();
    virtual BOOL                        ISP2P_GetFirstReviewLeft();
    virtual BOOL                        ISP2P_GetFirstReviewRight();
    virtual void                        ISP2P_SetFirstReviewLeft(BOOL b_Check);
    virtual void                        ISP2P_SetFirstReviewRight(BOOL b_Check);
public: 
    virtual BOOL    ISP2P_Motor_CameraGo(int nModuleIndex, double dPosX, double dPosY, int nMoveAxis, BOOL bAutoSelectCamera=FALSE, BOOL bGoEnd=FALSE);
ReviewSystem/ReviewSystem/ReviewProcessor.h
@@ -62,6 +62,7 @@
    
    virtual const CRsRcpReviewInfo* IRP2P_Recipe_GetRsRcpReviewInfo() = 0;
    virtual const CSystemInfo*      IRP2P_GetReviewSysteminfo() = 0;
    virtual const CSignalControlInfo*    IRP2P_GetReviewSignalinfo() = 0;
    virtual CGlassResult*            IRP2P_GetCurrentGlassResult() = 0;                                                    
    virtual void                    IRP2P_DisplayMessage(const TCHAR* lpstrFormat, ...) = 0;
    virtual CResultServerControl*    IRP2P_GetResultServerControl() = 0;
@@ -76,6 +77,12 @@
    virtual void                    IRP2P_UpdateWSISelfDiagnosisResult();
    virtual BOOL                        IRP2P_GetFirstReviewLeft() = 0;
    virtual BOOL                        IRP2P_GetFirstReviewRight() = 0;
    virtual void                        IRP2P_SetFirstReviewLeft(BOOL b_Check) = 0;
    virtual void                        IRP2P_SetFirstReviewRight(BOOL b_Check) = 0;
};
typedef std::vector<CPoint>                    VectorPoint;
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp
@@ -5,6 +5,7 @@
#include "CameraControlReview.h"
#include "CHImageControls/CHImageProcess.h"
#include "CHMotorControls/MotorControl.h"
#include "CHSignalControls/SignalControl.h"
#include "CHEdgeTriangle/EdgeTriangle.h"
#include "CHEdgeTriangle/RecipeManager.h"
@@ -88,7 +89,6 @@
    int nEndResultIdx    = pReviewResult->GetEndSReviewResultIndex();
                        
    
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å¬ï¿½ï¿½..
    if (nCurResultIdx > nEndResultIdx)  
    {
        LeaveCriticalSection(&m_csUserCriticalSection);
@@ -96,8 +96,6 @@
        g_pLog->DisplayMessage(_T("[ReviewProcessor]SetWsiResultData module[%d] point[%d] result[%d]"), nModuleIndex, measureResut.nResultIndex, nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    wsiResult.nWsi_ResultIndex = measureResut.nResultIndex;
    wsiResult.nResultCode = measureResut.nResultCode;
@@ -138,8 +136,6 @@
//         g_pLog->DisplayMessage(_T("[ReviewProcessor]JugementR [%d] JugementG [%d] JugementB [%d]"), wsiResult.nJugementR, wsiResult.nJugementG, wsiResult.nJugementB);
//         g_pLog->DisplayMessage(_T("[ReviewProcessor]RZoneHeight [%.03lf] GZoneHeight [%.03lf] BZoneHeight [%.03lf]"), wsiResult.dRZoneHeight, wsiResult.dGZoneHeight, wsiResult.dBZoneHeight);
//         wsiResult.�߰� ï¿½Ï¼ï¿½ï¿½ï¿½= measureResut.nMultiShot;
//         wsiResult.�߰� ï¿½Ï¼ï¿½ï¿½ï¿½= measureResut.nCurrentShotNumber;
        break;
    case 3: //BANK
        wsiResult.dRZoneHeight = measureResut.dRZoneHeight;
@@ -147,14 +143,13 @@
        wsiResult.dBZoneHeight = measureResut.dBZoneHeight;
        wsiResult.dDefectHeight = measureResut.dDefectHeight;
        wsiResult.nWsi_DefectType = measureResut.nDefectType;
//         wsiResult.�߰� ï¿½Ï¼ï¿½ï¿½ï¿½= measureResut.nMultiShot;
//         wsiResult.�߰� ï¿½Ï¼ï¿½ï¿½ï¿½= measureResut.nCurrentShotNumber;
        break;
    case 4: //CS
        wsiResult.dCSHeight = measureResut.dCSHeight;
        wsiResult.dDefectHeight = measureResut.dDefectHeight;
        wsiResult.nWsi_DefectType = measureResut.nDefectType;
//         wsiResult.�߰� ï¿½Ï¼ï¿½ï¿½ï¿½= measureResut.nMultiShot;
        break;
    }
@@ -162,8 +157,6 @@
    memcpy(wsiResult.pWsi_ResultData, measureResut.pResultData, sizeof(wsiResult.pWsi_ResultData));
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    SReviewResult *pProcessResult = NULL;
    if (pGlassResult->SetWsiResultData(nModuleIndex, nCurResultIdx, wsiResult, nGlassPosX, nGlassPosY, nMotorPosX, nMotorPosY, dTime))
    {
@@ -173,10 +166,8 @@
        pProcessResult = pReviewResult->GetSReviewResult(nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pProcessResult)
    {
        // Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (AddReviewProcessData(pProcessResult)==1)
        {
            g_pLog->DisplayMessage(_T("[ReviewProcessor]Add Process Data module[%d] result[%d]"), nModuleIndex, nCurResultIdx);
@@ -192,7 +183,6 @@
    
    LeaveCriticalSection(&m_csUserCriticalSection);
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    m_pRP2P->IRP2P_UpdateReviewResult(nModuleIndex, pGlassResult);
    return;
@@ -238,7 +228,6 @@
    int nEndResultIdx    = pReviewResult->GetEndSReviewResultIndex();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å¬ï¿½ï¿½..
    if (nCurResultIdx > nEndResultIdx)  
    {
        LeaveCriticalSection(&m_csUserCriticalSection);
@@ -246,14 +235,12 @@
        g_pLog->DisplayMessage(_T("[ReviewProcessor]SetWsiResultData module[%d] point[%d] result[%d]"), nModuleIndex, measureResut.nResultIndex, nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    wsiUserResult.nWsi_ResultCode        = measureResut.nResultCode;
    wsiUserResult.nWsi_Type                = measureResut.nResultType;
    wsiUserResult.nWsi_SlopeWarn        = measureResut.nXSlopeWarn;
    memcpy(wsiUserResult.pWsi_ResultData, measureResut.pResultData, sizeof(wsiUserResult.pWsi_ResultData));
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    SReviewResult *pProcessResult = NULL;
    if (pGlassResult->SetUserWsiResultData(nModuleIndex, nCurResultIdx, wsiUserResult, nGlassPosX, nGlassPosY, nMotorPosX, nMotorPosY, dTime))
    {
@@ -263,10 +250,8 @@
        pProcessResult = pReviewResult->GetSReviewResult(nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pProcessResult)
    {
        // Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (AddReviewProcessData(pProcessResult)==1)
        {
            g_pLog->DisplayMessage(_T("[ReviewProcessor]Add Process Data module[%d] result[%d]"), nModuleIndex, nCurResultIdx); 
@@ -282,7 +267,6 @@
    LeaveCriticalSection(&m_csUserCriticalSection);
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    m_pRP2P->IRP2P_UpdateReviewResult(nModuleIndex, pGlassResult);
    return;
@@ -337,7 +321,6 @@
    int nEndResultIdx = pReviewResult->GetEndSReviewResultIndex();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å¬ï¿½ï¿½..
    if (nCurResultIdx > nEndResultIdx)
    {
        LeaveCriticalSection(&m_csUserCriticalSection);
@@ -345,7 +328,6 @@
        g_pLog->DisplayMessage(_T("[ReviewProcessor]SetWsiMultiShotResultData module[%d] point[%d] result[%d]"), nModuleIndex, measureResut.nResultIndex, nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    wsiResult.nWsi_ResultCode = measureResut.nResultCode;
    wsiResult.nWsi_Type = measureResut.nResultType;
    wsiResult.nWsi_SlopeWarn = measureResut.nXSlopeWarn;
@@ -353,7 +335,6 @@
    memcpy(wsiResult.pWsi_ResultData, measureResut.pResultData, sizeof(wsiResult.pWsi_ResultData));
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    SReviewResult *pProcessResult = NULL;
    if (pGlassResult->SetWsiResultData(nModuleIndex, nCurResultIdx, wsiResult, nGlassPosX, nGlassPosY, nMotorPosX, nMotorPosY, dTime))
    {
@@ -363,10 +344,8 @@
        pProcessResult = pReviewResult->GetSReviewResult(nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pProcessResult)
    {
        // Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (AddReviewProcessData(pProcessResult) == 1)
        {
            g_pLog->DisplayMessage(_T("[ReviewProcessor]Add Process Data module[%d] result[%d]"), nModuleIndex, nCurResultIdx); 
@@ -381,8 +360,6 @@
    }
    LeaveCriticalSection(&m_csUserCriticalSection);
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    m_pRP2P->IRP2P_UpdateReviewResult(nModuleIndex, pGlassResult);
    return;
@@ -457,7 +434,6 @@
    int nStartResultIdx    = pReviewResult->GetStartSReviewResultIndex();
    int nEndResultIdx    = pReviewResult->GetEndSReviewResultIndex();
    
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å¬ï¿½ï¿½..
    if (nCurResultIdx > nEndResultIdx)  
    {
        LeaveCriticalSection(&m_csUserCriticalSection);
@@ -465,7 +441,6 @@
        g_pLog->DisplayMessage(_T("[ReviewProcessor]SetReviewResultData module[%d] point[%d] result[%d]"), nModuleIndex, nResultIndex, nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    SReviewResult *pProcessResult = NULL;
    switch(GetReviewProcessStatus())
    {
@@ -509,10 +484,8 @@
        break;
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pProcessResult)
    {
        // Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (AddReviewProcessData(pProcessResult)==1)
        {
            g_pLog->DisplayMessage(_T("[ReviewProcessor]Add Process Data module[%d] result[%d]"), nModuleIndex, nCurResultIdx); 
@@ -526,9 +499,7 @@
        pReviewResult->SetLastSReviewResultIndex(nCurResultIdx);
    }
        LeaveCriticalSection(&m_csUserCriticalSection);
        //���� ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ø¹ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Æ·ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Å¸ï¿½ï¿½ ï¿½Ù½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ ï¿½È½ï¿½ï¿½ï¿½
        // ï¿½ï¿½È£Ã³ï¿½ï¿½ ï¿½Ê¿ï¿½ï¿½ï¿½ ï¿½Ì°ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (nCurResultIdx + 1== pReviewResult->GetSReviewResultCount())
        {
            if (nModuleIndex == 0)
@@ -542,7 +513,7 @@
            if (bLeftGantryReviewDone&&bRightGantryReviewDone)
            {
                ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
                ::Sleep(3000);
                g_pLog->DisplayMessage(_T("[ReviewProcessor]RemainReview Started module[%d]"), nModuleIndex);
                CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
                switch (GetReviewProcessStatus())
@@ -567,13 +538,10 @@
            }
            else if(m_pRP2P->IRP2P_Recipe_GetRsRcpReviewInfo()->GetRcpSchedulingInfo()->GetSingleGantryPath()>0)
            {
                //20210302 ï¿½Ì±ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Î°ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½Ï·ï¿½ï¿½ ï¿½ï¿½ï¿½Â¿ï¿½ï¿½ï¿½
                //������ ï¿½Ø¾ßµï¿½ï¿½ï¿½ï¿½ï¿½ Review ï¿½ï¿½ï¿½ï¿½ Count Ã¼Å© ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ñ°ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ 200������ ï¿½ï¿½ï¿½ß´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ß»ï¿½
                //�׷��� ï¿½Ì±ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ã³ï¿½ï¿½ ï¿½Ï¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ïµï¿½ï¿½ï¿½ ï¿½Ù²ï¿½ßµï¿½ CHM
                g_pLog->DisplayMessage(_T("[ReviewProcessor]Single GantryPath Use"), nModuleIndex);
                if (bLeftGantryReviewDone || bRightGantryReviewDone)
                {
                    ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
                    ::Sleep(3000);
                    g_pLog->DisplayMessage(_T("[ReviewProcessor]RemainReview Started module[%d]"), nModuleIndex);
                    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
                    switch (GetReviewProcessStatus())
@@ -601,7 +569,6 @@
        }
        
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½Ô°ï¿½, ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½...
        if(nCurResultIdx==nEndResultIdx && nCurResultIdx+1 < pReviewResult->GetSReviewResultCount())
        {
@@ -624,8 +591,7 @@
        pReviewResult->SetStartSReviewResultIndex(nStartResultIdx);
        pReviewResult->SetEndSReviewResultIndex(nEndResultIdx);
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000);
           if (bLeftGantryReviewDone&&bRightGantryReviewDone)
           {
            
@@ -685,7 +651,6 @@
        }
    }
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    m_pRP2P->IRP2P_UpdateReviewResult(nModuleIndex, pGlassResult, m_nReviewPlanIndex);
    return;
@@ -729,7 +694,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -737,7 +701,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckReviewComplete())
    {
        // check motor ready!
@@ -763,7 +726,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -771,7 +733,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckUserComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("User Last Point Complete! "));
@@ -796,7 +757,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PLC ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -804,7 +764,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckReflowComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("Reflow Last Point Complete! "));
@@ -829,7 +788,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -837,7 +795,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckWsiComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("Wsi Last Point Complete! "));
@@ -863,7 +820,6 @@
    g_pLog->DisplayMessage(_T("PostProcessMeasureResult[%d]"),nThreadIdx);
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -871,7 +827,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckMeasureComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("Measure Last Point Complete! "));
@@ -900,7 +855,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -908,7 +862,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckWsiReflowComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("Wsi Reflow Last Point Complete! "));
@@ -932,7 +885,6 @@
{
    if (m_pRP2P==NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult==NULL || pSequenceProcessor==NULL) 
@@ -940,7 +892,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckWsiUserComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("Wsi Last Point Complete! "));
@@ -965,7 +916,6 @@
{
    if (m_pRP2P == NULL) return 0;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ ï¿½ï¿½ PCControl ReviewEnd ï¿½ï¿½ï¿½ï¿½
    CGlassResult *pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
    CSequenceProcessor* pSequenceProcessor = m_pRP2P->IRP2P_GetSequenceProcessor();
    if (pGlassResult == NULL || pSequenceProcessor == NULL)
@@ -973,7 +923,6 @@
        return 1;
    }
    // ï¿½ï¿½ï¿½ï¿½È®ï¿½ï¿½
    if (pGlassResult->CheckWsiMultiShotComplete())
    {
        m_pRP2P->IRP2P_DisplayMessage(_T("WsiMultiShot Last Point Complete! "));
@@ -1138,23 +1087,19 @@
        return ReviewResult_Process_Fail;
    }
    
    // Snap ï¿½Ã°ï¿½ ï¿½ï¿½ï¿½ï¿½.
    CTime snapTime = CTime::GetCurrentTime();
    pReviewResult->strSnapTime.Format(_T("%04d%02d%02d%02d%02d%02d"), snapTime.GetYear(), snapTime.GetMonth(), snapTime.GetDay(), 
        snapTime.GetHour(), snapTime.GetMinute(), snapTime.GetSecond());    // snap_time
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½
    CString strImageFileName = _T("");
    if (MakeReviewImageFileName(pReviewResult)==FALSE)
    {
        
    }
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ç¥ Ã¤ï¿½ï¿½ï¿½Ö±ï¿½
    if(!UpdateMemoryReviewPlan(pReviewResult))
        m_pRP2P->IRP2P_DisplayMessage(_T("[ReviewPlan] Memory Update Fail!! DefectIdx : %d"), pReviewResult->nDefectidx2);
    
    // ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½
    pReviewResult->strImgFileName = m_strSaveImageBasePath + _T("\\") +pReviewResult->strImgFileName;
    pReviewResult->nOpticType = 1;
@@ -1178,28 +1123,29 @@
        //    UINT64 nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
            //if (nSize > 0)
            //    m_pRP2P->IRP2P_DisplayMessage(_T("Backup Review Image Save Success! Size: %d byte [%s]"), nSize, pReviewResult->strUploadImgFileName);
            // ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ 20190917 chm
            strPath.Format(_T("%s\\%s"), m_strSaveImageUploadPath, pReviewResult->strUploadImgFileName);
            nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
            m_pRP2P->IRP2P_DisplayMessage(_T("Backup Review Image Save Success! Size: %d byte [%s]"), nSize, strPath);
            if (pGlassResult != NULL)
            {
            {
                pGlassResult->m_strUploadImgFileName = m_strSaveImageUploadPath;
                //taek 210203
                strRTMSPath.Format(_T("\\\\126.100.100.5\\Reviewimage\\%s\\%s\\%s"), pGlassResult->m_strRTMSStepID, pGlassResult->m_strGlassID, pReviewResult->strUploadImgFileName);
                int bRet = SaveReviewImage(&uploadImage, strRTMSPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep); //Taek Rtms 210126
                if (bRet == 0)
                {
                    m_pRP2P->IRP2P_DisplayMessage(_T("RTMS Review Image Save Fail [%s] index[%d]"), strRTMSPath, pReviewResult->nDefectIdx);
                    m_pRP2P->IRP2P_DisplayMessage(_T("RTMS Review Image Save Fail!!"));
                }
                else m_pRP2P->IRP2P_DisplayMessage(_T("RTMS Review Image Save Success! Size: %d byte [%s] index[%d]"), nSize, strRTMSPath, pReviewResult->nDefectIdx); //taek 210128 ï¿½Óµï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ó½Ã·ï¿½ ï¿½Î±ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
            }
                else m_pRP2P->IRP2P_DisplayMessage(_T("RTMS Review Image Save Success! Size: %d byte [%s] index[%d]"), nSize, strRTMSPath, pReviewResult->nDefectIdx);
            }
            if (nSize > 0)
            {
                 int aoiindex = CDitGlassRawClient::GetInstance()->GetDefectData(pReviewResult->nDefectidx2)->m_nDefectIdx;
                m_pRP2P->IRP2P_DisplayMessage(_T("Upload Review Image Save Success! Size: %d byte [%s] index[%d] AOI NO[%d]"), nSize, strRTMSPath, pReviewResult->nDefectIdx, aoiindex); //taek 210128 ï¿½Óµï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ó½Ã·ï¿½ ï¿½Î±ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
                m_pRP2P->IRP2P_DisplayMessage(_T("Upload Review Image Save Success! Size: %d byte [%s] index[%d] AOI NO[%d]"), nSize, pReviewResult->strUploadImgFileName, pReviewResult->nDefectIdx, aoiindex); //taek 210128 ì†ë„ ë¬¸ì œë¡œ ìž„시로 ë¡œê·¸ ë‚¨ê¸°ì§€ ì•ŠìŒ
                //m_pRP2P->IRP2P_DisplayMessage(_T("Upload Review Image Save Success! Size: %d byte [%s]"), nSize, pReviewResult->strUploadImgFileName);
            }
            else
@@ -1235,7 +1181,7 @@
    const CRsRcpReviewInfo*  psRcpReviewInfo = m_pRP2P->IRP2P_Recipe_GetRsRcpReviewInfo();
    if(psRcpReviewInfo== NULL) m_pRP2P->IRP2P_DisplayMessage(_T("RcpReviewInfo is NULL"));
    
    if(psRcpReviewInfo->m_bDefocusUse) //190819chm ï¿½ï¿½ï¿½ï¿½Ä¿ï¿½ï¿½ ï¿½Ë¶ï¿½ ï¿½ï¿½ï¿½
    if(psRcpReviewInfo->m_bDefocusUse)
    {
      if(pReviewResult->nLocation == DefectLoc_ASG || pReviewResult->nLocation == DefectLoc_PAD || pReviewResult->nLocation == DefectLoc_C2C)
      {
@@ -1276,22 +1222,39 @@
              }
          }
          if (pReviewResult->nModuleIdx == 0)
          if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
          {
              const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
              int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
              int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
              m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
              /* double dAverageGray = 0.0;
               if (CCHImageProcess::ImageAverage(pImageData, dAverageGray) == 1)
               {
                   m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dAverageGray;
               }*/
      }
          else
              m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
              m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
              if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
              {
                  m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
              }
          }
          else if(pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
          {
              const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
              int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
              int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
              m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
              m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
              m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
              if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
              {
                  m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
              }
          }
      }
    }
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD Start
    else
    {
        double dFocusValue = 0.;
@@ -1309,15 +1272,40 @@
            dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
        }
        if (pReviewResult->nModuleIdx == 0)
        if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
        {
            const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
            int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
            int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
            m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
            if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
            {
                m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
            }
        }
        else
        else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
        {
            const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
            int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
            int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
            m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
            if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
            {
                m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
            }
        }
    }
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  MOD End
    
    
@@ -1337,12 +1325,10 @@
        return ReviewResult_Process_Fail;
    }
    // Snap ï¿½Ã°ï¿½ ï¿½ï¿½ï¿½ï¿½.
    CTime snapTime = CTime::GetCurrentTime();
    pReviewResult->strSnapTime.Format(_T("%04d%02d%02d%02d%02d%02d"), snapTime.GetYear(), snapTime.GetMonth(), snapTime.GetDay(), 
        snapTime.GetHour(), snapTime.GetMinute(), snapTime.GetSecond());    // snap_time
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½
    CString strImageFileName = _T("");
    if (MakeUserImageFileName(pReviewResult)==FALSE)
    {
@@ -1354,8 +1340,6 @@
    if(!UpdateMemoryUserPlan(pReviewResult))
        m_pRP2P->IRP2P_DisplayMessage(_T("[UserPlan] Memory Update Fail!! DefectIdx : %d"), pReviewResult->nDefectidx2);
    //// ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½
    //strImageFileName.Format(_T("ModuleIdx[%d]_PointIdx[%d]_Zoom[%d]"), pReviewResult->nModuleIdx, pReviewResult->nResultIdx, pReviewResult->nZoomIdx);
    //pReviewResult->strImgFileName = strImageFileName;
@@ -1374,10 +1358,9 @@
            UINT64 nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
            m_pRP2P->IRP2P_DisplayMessage(_T("Upload Review Image Save Success! Size: %d byte"), nSize);
            //uploadImage.SaveImage(strPath, 40);  // È­ï¿½ï¿½ 60% 150k
            //uploadImage.SaveImage(strPath, 40);
            if(GetReviewProcessStatus() == ReviewProcessStatus_UserStart)
            {
                // ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ 20190917 chm
                //strPath.Format(_T("%s\\%s\\%s"), m_strSaveImageUploadPath, m_strGlassID, pReviewResult->strUploadImgFileName);
                strPath.Format(_T("%s\\%s"), m_strSaveImageUploadPath, pReviewResult->strUploadImgFileName);
                nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
@@ -1399,7 +1382,7 @@
    const CRsRcpReviewInfo*  psRcpReviewInfo = m_pRP2P->IRP2P_Recipe_GetRsRcpReviewInfo();
    if(psRcpReviewInfo== NULL) m_pRP2P->IRP2P_DisplayMessage(_T("RcpReviewInfo is NULL"));
    if(psRcpReviewInfo->m_bDefocusUse) //190819chm ï¿½ï¿½ï¿½ï¿½Ä¿ï¿½ï¿½ ï¿½Ë¶ï¿½ ï¿½ï¿½ï¿½
    if(psRcpReviewInfo->m_bDefocusUse)
    {
        if(pReviewResult->nLocation == DefectLoc_ASG || pReviewResult->nLocation == DefectLoc_PAD || pReviewResult->nLocation == DefectLoc_C2C)
        {
@@ -1422,9 +1405,41 @@
            if (imageConvert.GetImageExist())
            {
                dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
                if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
                {
                    const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
                    int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
                    int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
                    m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
                    m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
                    m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
                    if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
                    {
                        m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
                    }
                }
                else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
                {
                    const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
                    int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
                    int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
                    m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
                    m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
                    m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
                    if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
                    {
                        m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
                    }
                }
            }
        
            // count defocus
            CGlassResult* pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
            if (pGlassResult)
@@ -1444,6 +1459,57 @@
        }
    }
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  ADD Start
    else
    {
        double dFocusValue = 0.;
        CCHImageData imageConvert;
        if (pImageData->GetChannels() != 1)
        {
            CCHImageProcess::ImageConvert(pImageData, &imageConvert, ConvertTypeRGB2Gray);
        }
        else
        {
            pImageData->CopyImageTo(&imageConvert);
        }
        if (imageConvert.GetImageExist())
        {
            dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
        }
        if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
        {
            const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
            int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
            int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
            m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
            if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
            {
                m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
            }
        }
        else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
        {
            const CSignalControlInfo* pSignalInfo = m_pRP2P->IRP2P_GetReviewSignalinfo();
            int nDefocusValueMin = pSignalInfo->GetDefocusValueMin();
            int nDefocusValueMax = pSignalInfo->GetDefocusValueMax();
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
            m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
            if (dFocusValue < nDefocusValueMin || dFocusValue > nDefocusValueMax)
            {
                m_pRP2P->IRP2P_GetSequenceProcessor()->SendSignalToSignalControl(0, 3, 1000);
            }
        }
    }
    //#3524_210723_LYW_CF AOI Review ë””포커스 ì•ŒëžŒ ì¶”ê°€ ë° FDC ë³´ê³  ë°©ì‹ ê°œì„  ADD End
    return ReviewResult_Process_Complete;
}
@@ -1457,7 +1523,6 @@
    int nTestMode = FALSE;
    
    //�ù� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ 20190827 chm
    if(nTestMode){
        Sleep(500);
        CString strPathName;
@@ -1479,12 +1544,10 @@
        return ReviewResult_Process_Fail;
    }
    // Snap ï¿½Ã°ï¿½ ï¿½ï¿½ï¿½ï¿½.
    CTime snapTime = CTime::GetCurrentTime();
    pReviewResult->strSnapTime.Format(_T("%04d%02d%02d%02d%02d%02d"), snapTime.GetYear(), snapTime.GetMonth(), snapTime.GetDay(), 
        snapTime.GetHour(), snapTime.GetMinute(), snapTime.GetSecond());    // snap_time
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½
    CString strImageFileName = _T("");
    if (MakeReflowImageFileName(pReviewResult)==FALSE)
    {
@@ -1500,8 +1563,8 @@
    }
    reflowParam reParam; //Reflow ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    reflowResult reResult;//Reflow ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    reflowParam reParam;
    reflowResult reResult;
    //////////////////////////////////////////////////////////////////////////////////////////////
    BOOL btFlag =0;
@@ -1513,10 +1576,10 @@
    CCHImageData tempImage;
    tempImageOrigin.CopyImageFrom(pImageData);
    if(pReviewResult->nReflow_Side==7) // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if(pReviewResult->nReflow_Side==7)
    {
        btFlag=1;
        CCHImageProcess::ImageRotate(pImageData,&tempImage,135);//���� ï¿½Ì¹ï¿½ï¿½ï¿½ï¿½ï¿½ Right È¸ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Right ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        CCHImageProcess::ImageRotate(pImageData,&tempImage,135);
        pImageData = &tempImage;
        //reParam.nImageWidth = 2048;
        //reParam.nImageHeight = 2432;
@@ -1626,9 +1689,9 @@
    CCHImageData tmepData2;
    if(btFlag==1){
        CCHImageProcess::ImageRotate(pImageData,&tmepData2,135);//Right ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ù½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
        CCHImageProcess::ImageRotate(pImageData,&tmepData2,135);
        pImageData= &tmepData2;
        //pImageData->SaveImage(_T("D:\\Testafter.bmp"));//Test ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ bmp ï¿½ï¿½ï¿½ï¿½
        //pImageData->SaveImage(_T("D:\\Testafter.bmp"));
    }
@@ -1653,17 +1716,15 @@
            UINT64 nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
            m_pRP2P->IRP2P_DisplayMessage(_T("Upload Review Image Save Success! Size: %d byte"), nSize);
            //uploadImage.SaveImage(strPath, 40);  // È­ï¿½ï¿½ 60% 150k
            //uploadImage.SaveImage(strPath, 40);
            if(GetReviewProcessStatus() == ReviewProcessStatus_ReflowStart)
            {
                // ï¿½ï¿½ï¿½Îµï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ 20190917 chm
                //strPath.Format(_T("%s\\%s\\%s"), m_strSaveImageUploadPath, m_strGlassID, pReviewResult->strUploadImgFileName);
                strPath.Format(_T("%s\\%s"), m_strSaveImageUploadPath, pReviewResult->strUploadImgFileName);
                nSize = SaveReviewImage(&uploadImage, strPath, m_nReviewImageSize, m_nReviewImageQuality, m_nReviewImageStep);
                m_pRP2P->IRP2P_DisplayMessage(_T("Upload Reflow Image Save Success! Size: %d byte"), nSize);
                
                //�ùĵ����� ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ 20190927chm
                if(nTestMode)
                {
                    CString csParam;
@@ -1683,7 +1744,6 @@
        m_pRP2P->IRP2P_DisplayMessage(_T("Upload Reflow Image Save Fail![%s]"), pReviewResult->strUploadImgFileName);
    }
    //�����޸� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ®
    if(!UpdateMemoryReflowPlan(pReviewResult))
        m_pRP2P->IRP2P_DisplayMessage(_T("[ReflowPlan] Memory Update Fail!! DefectIdx : %d"), pReviewResult->nDefectidx2);
@@ -1895,8 +1955,6 @@
}
//���ϸ� 181227 cmark
BOOL CReviewProcessor_CPJT::MakeReviewImageFileName(SReviewResult* pReviewResult)
{
    if (m_pRP2P==NULL || pReviewResult==NULL) return FALSE;
@@ -1909,7 +1967,7 @@
    if(GetReviewProcessStatus() == ReviewProcessStatus_ReviewStart)
    {
        // [2017:6:5]-[WEZASW] : Review Image ï¿½ï¿½ï¿½Ï¸ï¿½ï¿½ '*' ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.(����ó��)
        // [2017:6:5]-[WEZASW] : Review Image
        if (pReviewResult->strDefectCode.Compare(_T("***")) == 0)
            strDefectCodeTemp = _T("DC");    
        else 
@@ -2000,7 +2058,7 @@
        snapTime.GetHour(), snapTime.GetMinute(), snapTime.GetSecond());    // snap_time
    // [2017:4:10]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ bmp ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ ï¿½ï¿½ï¿½ï¿½. (�ӽû��)
    // [2017:4:10]-[WEZASW] :
    pReviewResult->strOrignalImgFileName = strFileName + _T(".bmp");
    strFileName += _T(".jpg");
@@ -2013,11 +2071,10 @@
int    CReviewProcessor_CPJT::ProcessWSIReflow(int nThreadIdx, SReviewResult* pReviewResult)
{
    // [2016:11:15]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ ï¿½Ê¿ï¿½
    // [2016:11:15]-[WEZASW] :
    if(!UpdateMemoryWsiReflowPlan(pReviewResult))
        m_pRP2P->IRP2P_DisplayMessage(_T("[WsiReflowPlan] Memory Update Fail!! DefectIdx : %d"), pReviewResult->nDefectidx2);
    // wsi�� return ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [6/20/2017 bhs]
    return WsiResultSuccess;
}
@@ -2061,7 +2118,7 @@
    
    if(GetReviewProcessStatus() == ReviewProcessStatus_UserStart)
    {
        // [2017:6:5]-[WEZASW] : Review Image ï¿½ï¿½ï¿½Ï¸ï¿½ï¿½ '*' ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.(����ó��)
        // [2017:6:5]-[WEZASW] : Review Image
        if (pReviewResult->strDefectCode.Compare(_T("***")) == 0)
            strDefectCodeTemp = _T("DC");    
        else 
@@ -2155,7 +2212,7 @@
    //         strFileName += pReviewResult->strSnapTime;
    //     }
    // [2017:4:10]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ bmp ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ ï¿½ï¿½ï¿½ï¿½. (�ӽû��)
    // [2017:4:10]-[WEZASW] :
    pReviewResult->strOrignalImgFileName = strFileName + _T(".bmp");
    strFileName += _T(".jpg");
@@ -2232,13 +2289,11 @@
void CReviewProcessor_CPJT::LoadAoiImage(const CString& strGlassID, int nOpticType, int nPosX, int nPosY, CCHImageData* pAoiDark, CCHImageData *pAoiBright)
{
    // 3. ï¿½Ë»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½
    CString strAoiDarkPath = _T("");
    CString strAoiBrightPath = _T("");
    FindAoiDefectImagePath(strGlassID, nOpticType, nPosX, nPosY, strAoiDarkPath, strAoiBrightPath);
    // Dark, Bright ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ö¼ï¿½Ã³ï¿½ï¿½ [2017.7.1 bhs]
    // Dark image
    //if(nOpticType & DEFECT_OPTIC_DARK)
    {
@@ -2283,7 +2338,6 @@
    CFileFind finder;
    CString strSearchPath = _T("");
    // Dark, Bright ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ö¼ï¿½Ã³ï¿½ï¿½ [2017.7.1 bhs]
    //if (nOpticType & DEFECT_OPTIC_DARK)
    {
        // Dark field
@@ -2357,7 +2411,6 @@
            processTimer.End();
        }
        // 4-3. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
        double dAverageGray = 0.0;
        if (CCHImageProcess::ImageAverage(&bandImage, dAverageGray)==1)
        {
@@ -2394,14 +2447,12 @@
    CCHImageData pReviewCam;
    CCHImageData tempImage1;
    
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ È¸ï¿½ï¿½
    if (m_nImageRotate > 0)
    {
        tempImage1.CopyImageFrom(pReviewCamSource);
        CCHImageProcess::ImageRotate(pReviewCamSource, &tempImage1, (90.0*m_nImageRotate));
    }
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (m_nimageFlip > 0)
    {
        if(m_nImageRotate > 0)
@@ -2438,7 +2489,6 @@
    // set total size * scale
    int nTotalWidth        = int(m_nReviewResizeWidth * m_dReviewImageScale + 0.5);
    // 20170817 smok Dark, Bright ï¿½Ì¹ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Æ·ï¿½ï¿½ï¿½ ï¿½Ùµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int nTotalHeight    = int(m_nReviewResizeHeight * m_dReviewImageScale + 0.5 + max(pAoiDark2.GetHeight(), pAoiBright2.GetHeight()));
    int nTotalHeight2    = int(m_nReviewResizeHeight * m_dReviewImageScale + 0.5);
@@ -2464,14 +2514,13 @@
    double dRulerGab = 20.0 / m_dReviewImageScale;
    double dScaleResolution = pReviewResult->dMeasureResolution / m_dReviewImageScale;
    //DrawRuler(&memDC, nTotalWidth, nTotalHeight2, dScaleResolution, dRulerGab); // resolution, ruler gab //taek 210127 ï¿½ï¿½ï¿½ X
    //DrawRuler(&memDC, nTotalWidth, nTotalHeight2, dScaleResolution, dRulerGab); // resolution, ruler gab //taek 210127
    // draw text string
    DrawDefectInfo(&memDC, findResult, pReviewResult);
    
    //DrawAoiImage(&memDC, &pAoiDark2, &pAoiBright2, &pAoiDark2, &pAoiBright2, nAoiWidth, nAoiHeight);
    // draw line ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //DrawCenterLine(&memDC, nTotalWidth, nTotalHeight);
   // DrawCenterRect(&memDC, nTotalWidth, nTotalHeight, 100, 100, pReviewResult->dMeasureResolution);
@@ -2499,7 +2548,7 @@
    nWidthDark = nHeightDark = nWidthBright = nHeightBright = 0;
    // 20170817 smok Dark, Bright ï¿½Ì¹ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Æ·ï¿½ï¿½ï¿½ ï¿½Ùµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // 20170817 smok Dark, Bright
    // dark
    CCHImageData subImage;
    if(pAoiDark!=NULL && pAoiDark->GetImageExist())
@@ -2580,11 +2629,9 @@
    int nTotalWidth        = int(m_nReviewResizeWidth * m_dReviewImageScale + 0.5);
    int nTotalHeight    = int(m_nReviewResizeHeight * m_dReviewImageScale + 0.5);
    // Dark, Bright ï¿½Ì¹ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ùµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½, Dark ï¿½ï¿½, Bright ï¿½Æ·ï¿½ - ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»[2017.6.30 bhs]
    //int nX = nTotalWidth - nWidth;
    //int nY = nTotalHeight - (nHeight * 2);
    // 20170817 smok Dark, Bright ï¿½Ì¹ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Æ·ï¿½ï¿½ï¿½ ï¿½Ùµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int nX = 0;
    int nY = nTotalHeight;
    pAoiDark1->ShowImage(pDC->m_hDC, nX, nY, pAoiDark1->GetWidth(), pAoiDark1->GetHeight(), 0, 0);
@@ -2592,7 +2639,6 @@
    //pAoiDark1->ShowImage(pDC->m_hDC,    nTotalWidth - nWidth,    nTotalHei4ght-nHeight,    pAoiDark1->GetWidth(), pAoiDark1->GetHeight(), 0, 0);
    //pAoiBright1->ShowImage(pDC->m_hDC,    nTotalWidth - nWidth,    nTotalHeight-nHeight,    pAoiBright1->GetWidth(), pAoiBright1->GetHeight(), 0, 0);
    // ï¿½Ë»ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ß¾Ó¿ï¿½ È­ï¿½ï¿½Ç¥ Ç¥ï¿½ï¿½ - ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã» [2017.6.30 bhs]
    CFont Font;
    VERIFY(Font.CreateFont(
        50,                        // nHeight
@@ -2613,7 +2659,7 @@
    CFont *pOldFont = pDC->SelectObject(&Font);
    pDC->SetTextColor(RGB(255,0,0));
    CString strArrow = _T("��");
    CString strArrow = _T("↗");
    CSize size = pDC->GetTextExtent(strArrow);
    int nCenterX = nX + (nWidth / 2) - size.cx;
    int nCenterY = nY + (nHeight / 2)/* + (size.cy / 2)*/;
@@ -2816,7 +2862,6 @@
    else {
        wchar_t  pstrPrefix[128] ={};
        //Zone ï¿½Ñ¹ï¿½ 210127
        int nValue = 0;
        for (int i = 15; i >= 0; i--)
        {
@@ -2827,8 +2872,6 @@
        }
        //taek 210127
        //������� ï¿½ï¿½Ç¥ï¿½ï¿½ y ï¿½ï¿½ *-1�� ï¿½ï¿½ï¿½ï¿½
        //���� ID, ï¿½Ë»ï¿½ Ä«ï¿½Þ¶ï¿½ ï¿½ï¿½ï¿½ï¿½, ï¿½Ë»ï¿½ Camera ï¿½ï¿½ï¿½ï¿½ : (? ) Ä· ?, Cell ID,    Review Cam ï¿½ï¿½ï¿½ï¿½ : Gantry ï¿½ï¿½ï¿½ï¿½,    ï¿½ï¿½ï¿½ï¿½ Size,    ï¿½ï¿½ï¿½ï¿½ Zone ï¿½ï¿½ï¿½ï¿½,    Stak Flag, CODE ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½Ç¥ ï¿½ï¿½ï¿½ï¿½
        
        // PPID
//         strValue.Format(_T("Tool[%s].Recipe[%s].ScanNo[%d/%d].Time[%4d/%2d/%2d_%d:%d:%d].MaxGray[%d].RefGray[%d].REVCnt[%d]"),pReviewResult->strEquipID,pGlassResult->m_strPPID,pReviewResult->nAOIScanIdx,0,snapTime.GetYear(), snapTime.GetMonth(), snapTime.GetDay(),
@@ -3043,7 +3086,7 @@
    if(GetReviewProcessStatus() == ReviewProcessStatus_ReflowStart)
    {
        // [2017:6:5]-[WEZASW] : Review Image ï¿½ï¿½ï¿½Ï¸ï¿½ï¿½ '*' ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.(����ó��)
        // [2017:6:5]-[WEZASW] : Review Image
        if (pReviewResult->strDefectCode.Compare(_T("***")) == 0)
            strDefectCodeTemp = _T("DC");    
        else 
@@ -3120,7 +3163,7 @@
    //         strFileName += pReviewResult->strSnapTime;
    //     }
    // [2017:4:10]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ bmp ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ ï¿½ï¿½ï¿½ï¿½. (�ӽû��)
    // [2017:4:10]-[WEZASW] :
    pReviewResult->strOrignalImgFileName = strFileName + _T(".bmp");
    strFileName += _T(".jpg");
@@ -3166,7 +3209,6 @@
    int nStartResultIdx    = pReviewResult->GetStartSReviewResultIndex();
    int nEndResultIdx    = pReviewResult->GetEndSReviewResultIndex();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Å¬ï¿½ï¿½..
    if (nCurResultIdx > nEndResultIdx)  
    {
        LeaveCriticalSection(&m_csUserCriticalSection);
@@ -3174,7 +3216,6 @@
        g_pLog->DisplayMessage(_T("[ReviewProcessor]SetWsiResultData module[%d] point[%d] result[%d]"), nModuleIndex, measureResut.nResultIndex, nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    wsiResult.nWsi_ResultCode        = measureResut.nResultCode;
    wsiResult.dWsi_DamDistance        = measureResut.dDamDistance;
@@ -3184,7 +3225,6 @@
    }
    //memcpy(wsiResult.nWsi_pReflowResultData, measureResut.pReflowResultData, sizeof(wsiResult.nWsi_pReflowResultData));
    
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    SReviewResult *pProcessResult = NULL;
    if (pGlassResult->SetWsiReflowResultData(nModuleIndex, nCurResultIdx, wsiResult, nGlassPosX, nGlassPosY, nMotorPosX, nMotorPosY, dTime))
    {
@@ -3193,10 +3233,8 @@
        pProcessResult = pReviewResult->GetSReviewResult(nCurResultIdx);
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½, ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î¼ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pProcessResult)
    {
        // Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        if (AddReviewProcessData(pProcessResult)==1)
        {
            g_pLog->DisplayMessage(_T("[ReviewProcessor]Add Wsi Reflow Process Data module[%d] result[%d]"), nModuleIndex, nCurResultIdx);
@@ -3212,7 +3250,6 @@
    LeaveCriticalSection(&m_csUserCriticalSection);
    // ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    m_pRP2P->IRP2P_UpdateReviewResult(nModuleIndex, pGlassResult, 5);
    return;
@@ -3220,8 +3257,7 @@
    g_pLog->DisplayMessage(_T("[ReviewProcessor]WsiResult FAIL! module[%d] result[%d]"), nModuleIndex, measureResut.nResultIndex);
    return;
}
//0129cmark ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
double CReviewProcessor_CPJT::GetCentertoOrginCoordinate(double dPosX,double dPosY,int nCornercut,int nOriginDirection){
    double nResultPosX=0.0;
@@ -3230,60 +3266,60 @@
    // CornerCutDirection    { CLeftTop=0, CRightTop, CLeftBottom,   CRightBottom };
    // OriginDirection    { OLeftTop=0, ORightTop, OLeftBottom,   ORightBottom };
    if(nOriginDirection==RPOLeftTop){//�������»�
    if(nOriginDirection==RPOLeftTop){
        if(nCornercut == RPCLeftTop)//�»�
        if(nCornercut == RPCLeftTop)
        { 
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
        }
        else if(nCornercut == RPCRightTop)//���
        else if(nCornercut == RPCRightTop)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCLeftBottom)//����
        else if(nCornercut == RPCLeftBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
        }
        else if(nCornercut == RPCRightBottom)//����
        else if(nCornercut == RPCRightBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2 + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2 + dPosY;
        }
    }
    else if(nOriginDirection==RPORightTop){//���������
    else if(nOriginDirection==RPORightTop){
        if(nCornercut == RPCLeftTop)//�»�
        if(nCornercut == RPCLeftTop)
        { 
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCRightTop)//���
        else if(nCornercut == RPCRightTop)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
        }
        else if(nCornercut == RPCLeftBottom)//����
        else if(nCornercut == RPCLeftBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCRightBottom)//����
        else if(nCornercut == RPCRightBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
        }
    }
    else if(nOriginDirection==RPOLeftBottom){//����������
    else if(nOriginDirection==RPOLeftBottom){
        if(nCornercut == RPCLeftTop)//�»�
        if(nCornercut == RPCLeftTop)
        { 
            //210402
        /*    nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
@@ -3292,13 +3328,13 @@
            nResultPosX = double(GLASS_SIZE_WIDTH) / 2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT) / 2. + dPosY;
        }
        else if(nCornercut == RPCRightTop)//���
        else if(nCornercut == RPCRightTop)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCLeftBottom)//����
        else if(nCornercut == RPCLeftBottom)
        {
            //210402
            /*nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
@@ -3306,33 +3342,33 @@
            nResultPosX = double(GLASS_SIZE_WIDTH) / 2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT) / 2. + dPosY;
        }
        else if(nCornercut == RPCRightBottom)//����
        else if(nCornercut == RPCRightBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH) / 2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT) / 2. + dPosY;
        }
    }
    else if (nOriginDirection==RPORightBottom)
    {//����������
    {
        if(nCornercut == RPCLeftTop)//�»�
        if(nCornercut == RPCLeftTop)
        { 
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCRightTop)//���
        else if(nCornercut == RPCRightTop)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. + dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
        }
        else if(nCornercut == RPCLeftBottom)//����
        else if(nCornercut == RPCLeftBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. + dPosY;
        }
        else if(nCornercut == RPCRightBottom)//����
        else if(nCornercut == RPCRightBottom)
        {
            nResultPosX = double(GLASS_SIZE_WIDTH)/2. - dPosX;
            nResultPosY = double(GLASS_SIZE_HEIGHT)/2. - dPosY;
@@ -3357,7 +3393,7 @@
    CString strFileName = _T("");
    CString strDefectCodeTemp = _T("");
    // [2017:6:5]-[WEZASW] : Review Image ï¿½ï¿½ï¿½Ï¸ï¿½ï¿½ '*' ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.(����ó��)
    // [2017:6:5]-[WEZASW] : Review Image
    if (pReviewResult->strDefectCode.Compare(_T("***")) == 0)
        strDefectCodeTemp = _T("DC");    
    else 
@@ -3421,7 +3457,6 @@
{
    if(pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ç¥ Ã¤ï¿½ï¿½ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitGlassRawCleint = CDitGlassRawClient::GetInstance();
    if(pDitGlassRawCleint->isConnect() == TRUE)
    {
@@ -3435,17 +3470,17 @@
        strcpy(pSharedDefectReview->m_strRevImageName,pReviewResult->strImgFileName.MakeLower());
        
        //taek 210624 ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½Ø´ï¿½.
        //taek 210624
        strcpy(pSharedDefectReview->m_strRevImagePath,pReviewResult->strImgFilePath.MakeLower());
        strcpy(pSharedGlassData->m_strAlignFirst, m_strReviewFirst.MakeLower());
        strcpy(pSharedGlassData->m_strAlignSecond, m_strReviewSecned.MakeLower());
        pSharedDefectReview->m_nPlanType =  ditRaw::RPT_Review;    //0:None, 1:Location(User, Fiexed) Review, 4:reflower, ??:Wsi, 1000:AOI(�ܺ� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½)
        pSharedDefectReview->m_nPlanType =  ditRaw::RPT_Review;    //0:None, 1:Location(User, Fiexed) Review, 4:reflower, ??:Wsi, 1000:AOI(
        pSharedDefectReview->m_nResultCode = 1;  //0:None, 1:Success
        pSharedDefectReview->m_nShotIndex = pReviewResult->nResultIdx; 
        //pSharedDefectReview->m_nShotIndex = GetPlanReviewCount(); //RTMS ï¿½ï¿½ï¿½Ø¿ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Æ´Ï¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï´ï¿½ ï¿½É·ï¿½ taek 210128
        //pSharedDefectReview->m_nShotIndex = GetPlanReviewCount(); //RTMS taek 210128
        pSharedDefectReview->m_nModuleIndex = pReviewResult->nModuleIdx;
        pSharedDefectReview->m_nMagnificIndex = 20;
        pSharedDefectReview->m_fManification =pReviewResult->dMagnification;
@@ -3459,11 +3494,10 @@
BOOL CReviewProcessor_CPJT::UpdateMemoryUserPlan( SReviewResult* pReviewResult )
{
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ ï¿½ï¿½ ï¿½ï¿½Ç¥ Ã¤ï¿½ï¿½ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitRawClient = CDitGlassRawClient::GetInstance();
    if(pDitRawClient->isConnect() == TRUE)
    {
        int nDefectCount = pDitRawClient->GetGlassData()->m_nDefectNum; // user,reflow ï¿½ï¿½ ï¿½Ë»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ç±â¿¡ ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Å³ï¿½ Å«ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö´ï¿½
        int nDefectCount = pDitRawClient->GetGlassData()->m_nDefectNum; // user,reflow
        if(pReviewResult->nDefectIdx <nDefectCount)
        {    
            return FALSE;
@@ -3476,7 +3510,7 @@
        
        strcpy(pSharedDefectReview->m_strRevImageName,pReviewResult->strImgFileName);
    
        pSharedDefectReview->m_nPlanType = ditRaw::RPT_User;    //0:None, 1:Location(User, Fiexed) Review, 4:reflower, ??:Wsi, 1000:AOI(�ܺ� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½)
        pSharedDefectReview->m_nPlanType = ditRaw::RPT_User;    //0:None, 1:Location(User, Fiexed) Review, 4:reflower, ??:Wsi, 1000:AOI(
        pSharedDefectReview->m_nResultCode = 1;  //0:None, 1:Success
        pSharedDefectReview->m_nShotIndex = pReviewResult->nResultIdx; 
        pSharedDefect->m_nShotIdx = pReviewResult->nResultIdx;
@@ -3485,7 +3519,7 @@
        pSharedDefectReview->m_nMagnificIndex = pReviewResult->dMagnification;
        pSharedDefectReview->m_fManification = pReviewResult->dMagnification;
        pSharedDefectReview->m_fManificResoultion = pReviewResult->dMagnification;
            m_pRP2P->IRP2P_DisplayMessage(_T("[�����޸�����]���[%d]���ϸ�[%s]"),pReviewResult->nDefectidx2, pReviewResult->strUploadImgFileName);
            m_pRP2P->IRP2P_DisplayMessage(_T("[Access Shared Memory]IDX[%d]Filename[%s]"),pReviewResult->nDefectidx2, pReviewResult->strUploadImgFileName);
    }
@@ -3495,7 +3529,6 @@
BOOL CReviewProcessor_CPJT::UpdateMemoryReflowPlan( SReviewResult* pReviewResult )
{
    if(pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ð¸®¿ï¿½ ï¿½ï¿½ï¿½ Ã¤ï¿½ï¿½ ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitRawClient = CDitGlassRawClient::GetInstance();
    //int nEqpID = m_pSP2P->ISP2P_System_GetSystemInfo()->m_nMachineType;
    CString strCellID = _T("");
@@ -3517,7 +3550,6 @@
                nReflowjuge=1;
            }
            // ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½. 0,1 Position�� Pass
            else if(nReflowjuge == 3 || nReflowjuge == 2)
            {
                m_pRP2P->IRP2P_DisplayMessage(_T("[ReflowResult] Reflow Judge Is No OverFlow %d"),nReflowjuge);
@@ -3536,7 +3568,6 @@
                nReflowjuge=0;
            }
            
            //0:None, // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Line�� ï¿½ï¿½ï¿½ï¿½. 3 ï¿½Ì¸ï¿½ : DAM2 Reflow ï¿½ï¿½ï¿½ï¿½, 4~5 : DAM1 Reflow ï¿½ï¿½ï¿½ï¿½, 6 : no Reflow ï¿½ï¿½ï¿½ï¿½ / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
            if(pReviewResult->nReflow_CellIndex > 7)
            {
                pReviewResult->nReflow_CellIndex = 0;
@@ -3553,7 +3584,7 @@
    if(pDitRawClient->isConnect() == TRUE)
    {
        int nDefectCount = pDitRawClient->GetGlassData()->m_nDefectNum; // user,reflow ï¿½ï¿½ ï¿½Ë»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ç±â¿¡ ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Å³ï¿½ Å«ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö´ï¿½
        int nDefectCount = pDitRawClient->GetGlassData()->m_nDefectNum;
        if(pReviewResult->nDefectidx2 <nDefectCount)
        {
            return FALSE;
@@ -3568,11 +3599,10 @@
        pSharedDefectReview->m_nPlanType =  ditRaw::RTP_Reflow;            
        pSharedDefectReview->m_nReflow_ResultCode = pReviewResult->nReflow_Result;// pReviewResult->nReflow_Result;  
        //0:None, // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Line�� ï¿½ï¿½ï¿½ï¿½. 3 ï¿½Ì¸ï¿½ : DAM2 Reflow ï¿½ï¿½ï¿½ï¿½, 4~5 : DAM1 Reflow ï¿½ï¿½ï¿½ï¿½, 6 : no Reflow ï¿½ï¿½ï¿½ï¿½ / -1 : image not loaded, -2 : roi setting error, -3 : roi length error, -5 : select wrong side
        //pSharedDefectReview->m_fReflow_LinePosData;    
        pSharedDefectReview->m_nReflow_Side = pReviewResult->nReflow_Side;
        pSharedDefectReview->m_nReflow_InspectionMode = 0;
        m_pRP2P->IRP2P_DisplayMessage(_T("[�����޸�����]���[%d]���ϸ�[%s]"),pReviewResult->nDefectidx2, pReviewResult->strUploadImgFileName);
        m_pRP2P->IRP2P_DisplayMessage(_T("[Access Shared Memory]IDX[%d]Filename[%s]"),pReviewResult->nDefectidx2, pReviewResult->strUploadImgFileName);
    }
    
    return TRUE;
@@ -3582,7 +3612,6 @@
{
    if(pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ð¸®¿ï¿½ ï¿½ï¿½ï¿½ Ã¤ï¿½ï¿½ ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitGlassRawClient = CDitGlassRawClient::GetInstance();
    if(pDitGlassRawClient->isConnect() == TRUE)
@@ -3599,7 +3628,7 @@
        pSharedDefectReview->m_nPlanType =  ditRaw::RTP_WSI;            
        pSharedDefectReview->m_nWsi_ResultCode=pReviewResult->nWsi_ResultCode; //0:None, 1:Success
        pSharedDefectReview->m_nWsi_Type = 2;/* nWSIType;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½ //wsi ï¿½ï¿½ï¿½ï¿½ */
        pSharedDefectReview->m_nWsi_Type = 2;
        pSharedDefectReview->m_fWsi_ResultData[0]= pReviewResult->nWsi_DefectType; // 0:normal 1:metal 2:huge 3:diffuse 4:trashy
        pSharedDefectReview->m_fWsi_ResultData[1]=(float)(nWSIheight/1000.0); 
        pSharedDefectReview->m_fWsi_ResultData[2]=(float)(nWSIWidth/1000.0);            // 0:Type, 1:Height, 2:Width
@@ -3609,7 +3638,7 @@
        pSharedDefectReview->m_fWsi_ResultData[6] = pReviewResult->dBZoneHeight;
        pSharedDefectReview->m_strWsi_2DImageFilename;
        pSharedDefectReview->m_strWsi_3DImageFilename;
        pSharedDefectReview->m_fWsiManification = 20;//20�� ï¿½ï¿½ï¿½ï¿½
        pSharedDefectReview->m_fWsiManification = 20;
        pSharedDefectReview->m_dWsiMmMotorX=pReviewResult->dTargetMotorX;
        pSharedDefectReview->m_dWsiMmMotorY=pReviewResult->dTargetMotorY;
        
@@ -3624,7 +3653,6 @@
BOOL CReviewProcessor_CPJT::UpdateMemoryWsiReflowPlan( SReviewResult* pReviewResult )
{
    if(pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ð¸®¿ï¿½ ï¿½ï¿½ï¿½ Ã¤ï¿½ï¿½ ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitRawClient = CDitGlassRawClient::GetInstance();
    
@@ -3635,17 +3663,6 @@
    int nWsiReflowResult = 0;
    int nWsiReflowJudge = -1;
    /*
    pPacket->GetInt(0)            = Index
    pPacket->GetInt(1)            = Wsi ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    pPacket->GetInt(2)            = A�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ (1 ï¿½ï¿½ï¿½ï¿½ 0 ï¿½ï¿½ï¿½ï¿½)
    pPacket->GetInt(3)          = B�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    pPacket->GetInt(4)          = C�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    pPacket->GetInt(5)          = D�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
    pPacket->GetInt(6)          = Review���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ PointIndex
    pPacket->GetDouble(0)       = ï¿½ï¿¡ï¿½ï¿½ Monomo������ ï¿½Å¸ï¿½
    */
    
//     int nReflowjuge=0;
//     for(int nZone=2; nZone<6; nZone++)
@@ -3655,7 +3672,7 @@
    
    nWsiReflowJudge  = pReviewResult->nWsi_ResultCode;
    //nWsiReflowResult += pReviewResult->nWsi_pReflowResultData[0] //A 1�� ï¿½Å°ï¿½È¾ï¿½
    //nWsiReflowResult += pReviewResult->nWsi_pReflowResultData[0] //A
    nWsiReflowResult += pReviewResult->nWsi_pReflowResultData[1];//B
    nWsiReflowResult += pReviewResult->nWsi_pReflowResultData[2];//C
    //nWsiReflowResult += pReviewResult->nWsi_pReflowResultData[3];//D
@@ -3715,7 +3732,6 @@
{
    if(pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ð¸®¿ï¿½ ï¿½ï¿½ï¿½ Ã¤ï¿½ï¿½ ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitGlassRawClient = CDitGlassRawClient::GetInstance();
    if(pDitGlassRawClient->isConnect() == TRUE)
@@ -3732,13 +3748,13 @@
        pSharedDefectReview->m_nPlanType =  ditRaw::RTP_UserWsi;            
        pSharedDefectReview->m_nWsi_ResultCode=pReviewResult->nWsi_ResultCode; //0:None, 1:Success
        pSharedDefectReview->m_nWsi_Type=nWSIType;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½
        pSharedDefectReview->m_nWsi_Type=nWSIType;
        pSharedDefectReview->m_fWsi_ResultData[0]= nWSIType;
        pSharedDefectReview->m_fWsi_ResultData[1]=(float)(nWSIheight/100.0);
        pSharedDefectReview->m_fWsi_ResultData[2]=(float)(nWSIWidth/100.0);            // 0:Type, 1:Height, 2:Width
        pSharedDefectReview->m_strWsi_2DImageFilename;
        pSharedDefectReview->m_strWsi_3DImageFilename;
        pSharedDefectReview->m_fWsiManification = 20;//20�� ï¿½ï¿½ï¿½ï¿½
        pSharedDefectReview->m_fWsiManification = 20;
        pSharedDefectReview->m_dWsiMmMotorX=pReviewResult->dTargetMotorX;
        pSharedDefectReview->m_dWsiMmMotorY=pReviewResult->dTargetMotorY;
    }
@@ -3750,7 +3766,6 @@
{
    if (pReviewResult == NULL)    return FALSE;
    //������� ï¿½ï¿½ï¿½ï¿½ ï¿½Þ¸ð¸®¿ï¿½ ï¿½ï¿½ï¿½ Ã¤ï¿½ï¿½ ï¿½Ö±ï¿½
    CDitGlassRawClient *pDitGlassRawClient = CDitGlassRawClient::GetInstance();
    if (pDitGlassRawClient->isConnect() == TRUE)
@@ -3767,13 +3782,13 @@
        pSharedDefectReview->m_nPlanType = ditRaw::RTP_WSI;
        pSharedDefectReview->m_nWsi_ResultCode = pReviewResult->nWsi_ResultCode; //0:None, 1:Success
        pSharedDefectReview->m_nWsi_Type = nWSIType;                                    // ï¿½Ô¸ï¿½ / ï¿½ï¿½ï¿½ï¿½
        pSharedDefectReview->m_nWsi_Type = nWSIType;
        pSharedDefectReview->m_fWsi_ResultData[0] = nWSIType;
        pSharedDefectReview->m_fWsi_ResultData[1] = (float)(nWSIheight / 100.0);
        pSharedDefectReview->m_fWsi_ResultData[2] = (float)(nWSIWidth / 100.0);            // 0:Type, 1:Height, 2:Width
        pSharedDefectReview->m_strWsi_2DImageFilename;
        pSharedDefectReview->m_strWsi_3DImageFilename;
        pSharedDefectReview->m_fWsiManification = 20;//20�� ï¿½ï¿½ï¿½ï¿½
        pSharedDefectReview->m_fWsiManification = 20;
        pSharedDefectReview->m_dWsiMmMotorX = pReviewResult->dTargetMotorX;
        pSharedDefectReview->m_dWsiMmMotorY = pReviewResult->dTargetMotorY;
@@ -3804,7 +3819,6 @@
    double TempValue = 0;
    double m_nResultFocusValue = 0;
    // ï¿½ï¿½ï¿½ï¿½ XY ï¿½ï¿½ï¿½ï¿½ X+1, Y+1�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    for (int y = 0; y < nHeight - 1; y++)
    {
        for (int x = 0; x < nWidth - 1; x++)
ReviewSystem/ReviewSystem/ReviewSystem.cpp
@@ -254,6 +254,7 @@
    {
        if (g_pLog) 
        {
            //210617 TEST
            //delete g_pLog;
        }
    }
ReviewSystem/ReviewSystem/ReviewSystem.rc
@@ -483,9 +483,9 @@
    PUSHBUTTON      "Key Jog ì‹œìž‘",IDC_KEY_JOD_MOVE,207,167,45,17,NOT WS_VISIBLE | NOT WS_TABSTOP
    PUSHBUTTON      "test2",IDC_BUTTON_TEST2,273,167,34,17,NOT WS_VISIBLE
    CTEXT           "Key Jog시작",IDC_KEY_JOG_MOVE,392,160,31,24
    PUSHBUTTON      "Reduce",IDC_CHECK_UI_REDUCE,436,77,51,17
    PUSHBUTTON      "Left",IDC_BUTTON_UI_LEFT,436,96,50,17
    PUSHBUTTON      "Right",IDC_BUTTON_UI_RIGHT1,436,116,50,17
    PUSHBUTTON      "Reduce",IDC_CHECK_UI_REDUCE,436,73,51,17
    PUSHBUTTON      "Left",IDC_BUTTON_UI_LEFT,436,92,50,17
    PUSHBUTTON      "Right",IDC_BUTTON_UI_RIGHT1,436,112,50,17
    CONTROL         "Track",IDC_CHECK_AFM_TRACK,"Button",BS_AUTOCHECKBOX | BS_PUSHLIKE | WS_TABSTOP,369,77,29,57
    LTEXT           "GlassCenter X/Y(mm)",IDC_STATIC,10,105,74,8
    PUSHBUTTON      "Go",IDC_BUTTON_GLASSCENTER_GO_XY,196,101,27,17
@@ -494,6 +494,7 @@
    CONTROL         "OffSet ON",IDC_SELECT_OFFSET_ON,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,418,61,63,10
    PUSHBUTTON      "ReviewPopUp",IDC_BT_REVIEW_POPUP,433,18,54,17
    CONTROL         "Use Simulation",IDC_CHECK_USE_SIMULATION,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,418,41,66,10
    PUSHBUTTON      "Align Grab",IDC_BUTTON_ALIGNCAM_GRAB,436,130,50,16
END
IDD_DLG_MODULE_INFO DIALOGEX 0, 0, 532, 187
@@ -576,42 +577,72 @@
BEGIN
    GROUPBOX        "File History",IDC_STATIC,7,286,421,86
    LISTBOX         IDC_LIST,14,297,409,69,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Data History",IDC_STATIC,292,7,136,278
    CONTROL         "",IDC_GRID_GANTRY_DATA_HISTORY,"MFCGridCtrl",WS_TABSTOP,297,19,126,260
    LTEXT           "Module Index :",IDC_STATIC,21,29,48,8
    COMBOBOX        IDC_COMBO_MODULE_INDEX,71,28,48,34,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Measure Data",IDC_STATIC,7,7,280,278
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,98,67,37,37
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,98,205,37,37
    CONTROL         IDB_BITMAP_GANTRY,IDC_STATIC,"Static",SS_BITMAP,40,70,39,168
    LTEXT           "Theta(θ) :",IDC_STATIC,40,242,38,8
    EDITTEXT        IDC_EDIT_GANTRY_THETA,40,253,40,14,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,80,255,10,8
    LTEXT           ": Motor",IDC_STATIC,155,174,24,8
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X,82,116,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y,118,116,35,14,ES_AUTOHSCROLL
    LTEXT           ": Pixel",IDC_STATIC,155,190,24,8
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X,82,132,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y,118,132,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X2,82,172,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y2,118,172,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X2,82,188,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y2,118,188,35,14,ES_AUTOHSCROLL
    GROUPBOX        "Measure Data",IDC_STATIC,7,7,280,278
    CTEXT           "X",IDC_STATIC,95,106,8,8
    CTEXT           "Y",IDC_STATIC,130,106,8,8
    CTEXT           "X",IDC_STATIC,96,162,8,8
    CTEXT           "Y",IDC_STATIC,131,162,8,8
    PUSHBUTTON      "Simulation",IDC_BUTTON_SIMULATION2,224,253,50,14
    LTEXT           ": Motor",IDC_STATIC,245,119,24,8
    LTEXT           ": Pixel",IDC_STATIC,245,135,24,8
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,189,67,37,37
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X3,172,116,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y3,208,116,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X3,172,132,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y3,208,132,35,14,ES_AUTOHSCROLL
    CTEXT           "X",IDC_STATIC,187,106,8,8
    CTEXT           "Y",IDC_STATIC,221,106,8,8
    GROUPBOX        "Data History",IDC_STATIC,337,7,91,278
    CONTROL         "",IDC_GRID_GANTRY_DATA_HISTORY,"MFCGridCtrl",WS_TABSTOP,342,19,81,260
    COMBOBOX        IDC_COMBO_MODULE_INDEX,123,18,48,34,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Measure Data",IDC_STATIC,7,7,326,278
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,25,59,37,37
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,25,197,37,37
    LTEXT           "Left Module Theta(θ) :",IDC_STATIC,17,264,74,8
    EDITTEXT        IDC_EDIT_GANTRY_THETA,92,262,40,14,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,135,264,10,8
    LTEXT           ": Motor",IDC_STATIC,82,166,24,8
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X,9,108,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y,45,108,35,14,ES_AUTOHSCROLL
    LTEXT           ": Pixel",IDC_STATIC,82,182,24,8
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X,9,124,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y,45,124,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X2,9,164,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y2,45,164,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X2,9,180,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y2,45,180,35,14,ES_AUTOHSCROLL
    GROUPBOX        "Measure Data",IDC_STATIC,7,7,327,278
    CTEXT           "X",IDC_STATIC,22,98,8,8
    CTEXT           "Y",IDC_STATIC,57,98,8,8
    CTEXT           "X",IDC_STATIC,23,154,8,8
    CTEXT           "Y",IDC_STATIC,58,154,8,8
    PUSHBUTTON      "Simulation",IDC_BUTTON_SIMULATION2,11,18,50,14
    LTEXT           ": Motor",IDC_STATIC,156,111,24,8
    LTEXT           ": Pixel",IDC_STATIC,156,127,24,8
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,100,59,37,37
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X3,83,108,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y3,119,108,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X3,83,124,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y3,119,124,35,14,ES_AUTOHSCROLL
    CTEXT           "X",IDC_STATIC,98,98,8,8
    CTEXT           "Y",IDC_STATIC,132,98,8,8
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,199,58,37,37
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,199,196,37,37
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X4,183,107,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y4,219,107,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X4,183,123,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y4,219,123,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X5,183,163,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y5,219,163,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X5,183,179,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y5,219,179,35,14,ES_AUTOHSCROLL
    CTEXT           "X",IDC_STATIC,196,97,8,8
    CTEXT           "Y",IDC_STATIC,231,97,8,8
    CTEXT           "X",IDC_STATIC,197,153,8,8
    CTEXT           "Y",IDC_STATIC,232,153,8,8
    CONTROL         IDB_BITMAP_MARK,IDC_STATIC,"Static",SS_BITMAP,274,58,37,37
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_X6,257,107,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_MOTOR_Y6,293,107,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_X6,257,123,35,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GANTRY_PIXEL_Y6,293,123,35,14,ES_AUTOHSCROLL
    CTEXT           "X",IDC_STATIC,272,97,8,8
    CTEXT           "Y",IDC_STATIC,306,97,8,8
    GROUPBOX        "Right Module",IDC_STATIC,180,36,153,202
    GROUPBOX        "Left Module",IDC_STATIC,7,36,173,203
    LTEXT           "Right Module Theta(θ) :",IDC_STATIC,186,264,78,8
    EDITTEXT        IDC_EDIT_GANTRY_THETA2,264,262,40,14,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,307,264,10,8
    LTEXT           "First Setting Standard(θ) :",IDC_STATIC,18,247,83,8
    EDITTEXT        IDC_EDIT_SQUARENESS_FIRSTSETTING,103,245,39,13,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,145,247,10,8
    LTEXT           "First Setting Standard(θ) :",IDC_STATIC,185,247,83,8
    EDITTEXT        IDC_EDIT_SQUARENESS_FIRSTSETTING2,271,245,39,13,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,313,247,10,8
END
IDD_DLG_SELF_DIAGNOSIS_FLATNESS DIALOGEX 0, 0, 435, 379
@@ -645,8 +676,8 @@
    GROUPBOX        "메뉴얼 ì¡°ìž‘",IDC_STATIC,18,21,80,40
    GROUPBOX        "File History",IDC_STATIC,5,245,421,86
    LISTBOX         IDC_LIST,10,257,413,69,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Data",IDC_STATIC,11,127,409,116
    CONTROL         "ㄱ",IDC_GRID_WSI_RESULT_DATA,"MFCGridCtrl",WS_TABSTOP,17,137,400,100
    GROUPBOX        "Data",IDC_STATIC,172,16,248,227
    CONTROL         "ㄱ",IDC_GRID_WSI_RESULT_DATA,"MFCGridCtrl",WS_TABSTOP,409,231,6,6
    LTEXT           "Module 0",IDC_STATIC,37,80,30,8
    LTEXT           "Module 1",IDC_STATIC,37,95,30,8
    LTEXT           "ACC",IDC_STATIC,91,66,14,8
@@ -655,6 +686,10 @@
    EDITTEXT        IDC_EDIT_WSI_RTB_00,122,77,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_ACC_01,76,95,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_RTB_01,123,94,40,14,ES_AUTOHSCROLL
    LTEXT           "WSI Standard (um)",IDC_STATIC,32,113,65,10
    EDITTEXT        IDC_EDIT_WSI_FIRST_STANDARD,97,112,40,15,ES_AUTOHSCROLL
    LTEXT           "um",IDC_STATIC,141,113,19,12
    CONTROL         "",IDC_LIST_WSI_DIAGNOSIS_RESULT,"SysListView32",LVS_REPORT | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,182,30,162,187
END
IDD_DLG_SELF_DIAGNOSIS_SETTING DIALOGEX 0, 0, 435, 379
@@ -666,12 +701,12 @@
    LTEXT           "파일 ìœ„치 :",IDC_STATIC,18,36,31,8
    PUSHBUTTON      "Save",IDC_BUTTON_SAVE,371,351,50,14
    PUSHBUTTON      "Load",IDC_BUTTON_LOAD,320,351,50,14
    EDITTEXT        IDC_EDIT_PANEL_COUNT_SQUARENESS,67,94,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_RESOLUTION,183,94,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_DEGREE,67,111,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_MODULE_COUNT,67,127,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_FRAME_WIDTH,183,111,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_FRAME_HEIGHT,183,127,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_PANEL_COUNT_SQUARENESS,67,81,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_RESOLUTION,183,81,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_DEGREE,67,97,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_MODULE_COUNT,67,113,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_FRAME_WIDTH,183,96,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_CAMERA_FRAME_HEIGHT,183,112,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_REVIEW_PANEL_POS_X,43,184,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_REVIEW_PANEL_POS_Y,85,184,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_REVIEW_PANEL_POS_X3,43,200,40,14,ES_AUTOHSCROLL
@@ -685,47 +720,47 @@
    EDITTEXT        IDC_EDIT_REVIEW_PANEL_POS_X6,151,216,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_REVIEW_PANEL_POS_Y6,193,216,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_PANEL_COUNT_WSI,330,94,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_3SIGMA,330,111,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_3SIGMA,330,113,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_PANEL_POS_X,294,181,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_PANEL_POS_Y,336,181,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_PANEL_POS_X2,294,197,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_PANEL_POS_Y2,336,197,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_AF_DELAY,67,268,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_Z_RANGE,67,284,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GLASS_SIZE_X,183,268,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GLASS_SIZE_Y,183,284,40,14,ES_AUTOHSCROLL
    COMBOBOX        IDC_COMBO_FLANTESS_MODE,67,308,48,62,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Setting",IDC_STATIC,7,60,414,282
    RTEXT           "Resolution :",IDC_STATIC,143,96,39,8
    RTEXT           "Panel Count :",IDC_STATIC,23,96,43,8
    RTEXT           "Judge Data :",IDC_STATIC,26,114,40,10
    RTEXT           "AF Delay :",IDC_STATIC,34,273,32,8
    RTEXT           "Judge Data :\n(Z Range)",IDC_STATIC,24,287,42,21
    RTEXT           "Mode :",IDC_STATIC,43,309,23,8
    RTEXT           "Range Count :",IDC_STATIC,136,309,46,8
    RTEXT           "GlassSizeX :",IDC_STATIC,146,273,36,8
    RTEXT           "GlassSizeY :",IDC_STATIC,145,287,37,8
    EDITTEXT        IDC_EDIT_AF_DELAY,67,275,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_JUDGE_DATA_Z_RANGE,67,291,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GLASS_SIZE_X,183,275,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_GLASS_SIZE_Y,183,291,40,14,ES_AUTOHSCROLL
    COMBOBOX        IDC_COMBO_FLANTESS_MODE,67,315,48,62,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP
    GROUPBOX        "Setting",IDC_STATIC,7,67,414,282
    RTEXT           "Resolution :",IDC_STATIC,143,84,39,8
    RTEXT           "Panel Count :",IDC_STATIC,23,83,43,8
    RTEXT           "Judge Data :",IDC_STATIC,26,101,40,10
    RTEXT           "AF Delay :",IDC_STATIC,34,280,32,8
    RTEXT           "Judge Data :\n(Z Range)",IDC_STATIC,24,294,42,21
    RTEXT           "Mode :",IDC_STATIC,43,316,23,8
    RTEXT           "Range Count :",IDC_STATIC,136,316,46,8
    RTEXT           "GlassSizeX :",IDC_STATIC,146,280,36,8
    RTEXT           "GlassSizeY :",IDC_STATIC,145,294,37,8
    RTEXT           "Panel Count : ",IDC_STATIC,286,96,43,8
    RTEXT           "Judge Data :\n(3sigma)  ",IDC_STATIC,287,114,42,17
    GROUPBOX        "직각도",IDC_STATIC,15,83,233,166
    GROUPBOX        "평탄도",IDC_STATIC,15,253,233,80
    EDITTEXT        IDC_EDIT_RANGE_COUNT_FLATNESS,183,308,40,14,ES_AUTOHSCROLL | WS_DISABLED
    GROUPBOX        "직각도",IDC_STATIC,15,75,233,176
    GROUPBOX        "평탄도",IDC_STATIC,15,252,233,80
    EDITTEXT        IDC_EDIT_RANGE_COUNT_FLATNESS,183,315,40,14,ES_AUTOHSCROLL | WS_DISABLED
    GROUPBOX        "WSI",IDC_STATIC,254,83,164,146
    RTEXT           "Frame Width :",IDC_STATIC,135,114,47,8
    RTEXT           "Frame Height :",IDC_STATIC,127,131,55,8
    RTEXT           "Frame Width :",IDC_STATIC,135,99,47,8
    RTEXT           "Frame Height :",IDC_STATIC,127,115,55,8
    RTEXT           "[nm]",IDC_STATIC,372,114,16,8
    RTEXT           "[um]",IDC_STATIC,226,97,16,8
    RTEXT           "[um]",IDC_STATIC,226,81,16,8
    RTEXT           "[px]",IDC_STATIC,226,99,14,8
    RTEXT           "[px]",IDC_STATIC,226,114,14,8
    RTEXT           "[px]",IDC_STATIC,226,129,14,8
    RTEXT           "[°]",IDC_STATIC,109,114,10,8
    LTEXT           "[ms]",IDC_STATIC,109,273,15,8
    LTEXT           "[um]",IDC_STATIC,109,287,16,8
    LTEXT           "[ea]",IDC_STATIC,226,311,14,8
    LTEXT           "[mm]",IDC_STATIC,226,273,18,8
    LTEXT           "[mm]",IDC_STATIC,226,287,18,8
    LTEXT           "[ea]",IDC_STATIC,109,97,14,8
    RTEXT           "[°]",IDC_STATIC,109,99,10,8
    LTEXT           "[ms]",IDC_STATIC,109,280,15,8
    LTEXT           "[um]",IDC_STATIC,109,294,16,8
    LTEXT           "[ea]",IDC_STATIC,226,318,14,8
    LTEXT           "[mm]",IDC_STATIC,226,280,18,8
    LTEXT           "[mm]",IDC_STATIC,226,294,18,8
    LTEXT           "[ea]",IDC_STATIC,109,84,14,8
    LTEXT           "[ea]",IDC_STATIC,373,97,14,8
    RTEXT           "ModuleCount :",IDC_STATIC,20,131,46,8
    RTEXT           "ModuleCount :",IDC_STATIC,20,117,46,8
    CTEXT           "Module1 Panel",IDC_STATIC,62,163,46,8
    GROUPBOX        "Panel Motor Position",IDC_STATIC,22,148,218,94
    CTEXT           "1",IDC_STATIC,34,186,8,8
@@ -745,6 +780,17 @@
    CTEXT           "2",IDC_STATIC,284,200,8,8
    CTEXT           "3",IDC_STATIC,34,219,8,8
    CTEXT           "3",IDC_STATIC,141,219,8,8
    CONTROL         "Use Skip Mode",IDC_CHECK_SELF_DIAGNOSIS_FLATNESS_SKIP,
                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,66,260,62,10
    LTEXT           "Left Standard :",IDC_STATIC,17,133,49,9
    LTEXT           "Standard :",IDC_STATIC,296,135,33,9
    EDITTEXT        IDC_EDIT_SQUARENESS_STANDARD,67,130,40,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_WSI_STANDARD,330,132,40,14,ES_AUTOHSCROLL
    RTEXT           "[nm]",IDC_STATIC,372,134,16,8
    RTEXT           "[°]",IDC_STATIC,108,133,10,8
    LTEXT           "Right Standard :",IDC_STATIC,131,132,53,9
    EDITTEXT        IDC_EDIT_SQUARENESS_STANDARD2,183,130,40,14,ES_AUTOHSCROLL
    RTEXT           "[°]",IDC_STATIC,226,132,10,8
END
IDD_DLG_TAB_DEFECT_INFO DIALOGEX 0, 0, 539, 282
ReviewSystem/ReviewSystem/ReviewSystem.vcxproj
@@ -143,7 +143,7 @@
      <TargetEnvironment>X64</TargetEnvironment>
    </Midl>
    <ClCompile>
      <Optimization>MaxSpeed</Optimization>
      <Optimization>Disabled</Optimization>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <AdditionalIncludeDirectories>../include;../../Internal_Library/include;../../External_Library/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
@@ -185,6 +185,9 @@
    <PreBuildEvent>
      <Command>updateDlls.bat</Command>
    </PreBuildEvent>
    <ClCompile>
      <Optimization>Disabled</Optimization>
    </ClCompile>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClCompile Include="..\include\M_AutoDiagnosisManager\StaticGNUPlot.cpp" />
ReviewSystem/ReviewSystem/SequenceProcessor.cpp
@@ -83,7 +83,9 @@
    m_nAlive = 0;
    m_nWsiTotalCount = 0;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    m_bSimulationMode = FALSE;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
    InitializeCriticalSection(&m_csProcessStatus);
}
@@ -1882,9 +1884,11 @@
        if(pWsiControl == NULL) continue ;
        CRcpAFMRecipeInfo *pRcpWsiAFMInfo = pRsRcpReviewInfo->GetRcpWsiAFMRecipeInfo(nWsiControlIdx);
        if(pRcpWsiAFMInfo == NULL) continue ;
//         if(pRcpWsiAFMInfo == NULL) continue ;
//
//         int nRealMagIndex = GetRealMagnification(nWsiControlIdx, pRcpWsiAFMInfo->m_nZoomIndex);
        int nRealMagIndex = GetRealMagnification(nWsiControlIdx, pRcpWsiAFMInfo->m_nZoomIndex);
        int nRealMagIndex = 0;
    
        //pWsiControl->SetWsiReady(*pGlassResult->GetJobID(),_T("LGDemo"),2, 0); //TEST0716 
ReviewSystem/ReviewSystem/SequenceProcessor.h
@@ -484,6 +484,13 @@
    virtual CDlgSelfDiagnosis*            ISP2P_GetDlgDiagnosis() = 0;
    virtual CDlgReviewHistoryTool*        ISP2P_GetDlgHistory() = 0;
    virtual BOOL                        ISP2P_GetFirstReviewLeft() = 0;
    virtual BOOL                        ISP2P_GetFirstReviewRight() = 0;
    virtual void                        ISP2P_SetFirstReviewLeft(BOOL b_Check) = 0;
    virtual void                        ISP2P_SetFirstReviewRight(BOOL b_Check) = 0;
    virtual BOOL                        GetOffSetValue(int nModule, int nCam, int nScan, double dGlassXPos, double &dXpos, double &dYpos) = 0;
public:
@@ -580,10 +587,16 @@
    void SetSP2P(ISequenceProcessor2Parent* pSP2P);
    void SetLineMachineType(int nLineType, int nMachineType, CString strEqpID);
    void SetDefaultValue();
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    void SetSimulationMode(BOOL bCheck) { m_bSimulationMode = bCheck; };
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
    // getter
    int        GetProcessMode() const;
    int        GetProcessStatus() const;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    BOOL GetSimulationMode() { return m_bSimulationMode; };
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
    static int GetDirectionX(int nGlassDirection, int nMotorDirection);
    static int GetDirectionY(int nGlassDirection, int nMotorDirection);
@@ -607,6 +620,8 @@
    // Review, WSI Stop Siganl
    BOOL    SetMotionStop();
    // Align Camera Control command
    BOOL    AlignCamera_CameraControl(int nControlCmd);
protected:
    // common
@@ -618,9 +633,6 @@
    // PCControl Control command
    BOOL    Signal_SendSignal(int nSignalIndex);
    BOOL    PCControl_ReadTransferData(STransferData* pTransferData);
    // Align Camera Control command
    BOOL    AlignCamera_CameraControl(int nControlCmd);
    // Review Camera Control Command
    void    ReviewCamera_CameraControl(int nControlCmd);
@@ -773,4 +785,8 @@
    CTime                m_wsiStartTime;
    int                    m_nWsiTotalCount;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    BOOL                m_bSimulationMode;
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
};
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -51,7 +51,7 @@
#define AOIRAWBIN_NETWORK_DRIVE_PATH    "Y:\\RawBin"
enum CPJT_MeasureMode { CPJT_ModeAuto = 0, CPJT_ModeManual };
// [2017:4:18]-[WEZASW] : WSI Module ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ PlanType ï¿½ï¿½È£ ï¿½ï¿½ï¿½ï¿½.
// [2017:4:18]-[WEZASW] : WSI Module
enum CPJT_PlanType { CPJT_PlanReview = 0, CPJT_PlanUser, CPJT_PlanWSI, CPJT_PlanMeasure, CPJT_PlanReflow, CPJT_PlanWsiReflow, CPJT_PlanWsiUser,CPJT_PlanWsiMultiShot
};
enum CPJT_InsepectionType{REVIEW_REFLOW = 0, WSI_REFLOW, REV_WSI,WSIUSER, USER,WSIMULTISHOT};
@@ -169,7 +169,7 @@
    CDitGlassRawClient* pDitGlassRaw = CDitGlassRawClient::GetInstance();
    if(pDitGlassRaw->ConnectServer() == FALSE)
    {
        g_pLog->DisplayMessage(_T("�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½!(Shared memory Access Fail)"));
        g_pLog->DisplayMessage(_T("(Shared memory Access Fail)"));
    }
}
    
@@ -183,17 +183,15 @@
    EnterCriticalSection(&m_csProcessStatus);
    
    BOOL bReturn = FALSE;
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Â°ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Â¿ï¿½ ï¿½Ù¸ï¿½ï¿½ï¿½?
    
    //if (nProcessStatus!=m_nProcessStatus || nProcessStatus==0)
    if (1)//nProcessStatus!=m_nProcessStatus || nProcessStatus==0)
    {
        //if (nProcessStatus==0) // ï¿½Ê±ï¿½(0) ï¿½ï¿½ï¿½ï¿½ï¿½Ì¸ï¿½..
        //if (nProcessStatus==0)
        //{
        //    bReturn = TRUE;
        //}
        //    else if (nProcessStatus==(m_nProcessStatus+1)) // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½(+1)�̸�..
        //    else if (nProcessStatus==(m_nProcessStatus+1))
        //    {
        //        bReturn = TRUE;
        //    }
@@ -204,9 +202,8 @@
        //    bReturn = FALSE;
        //}
        
        if (bReturn) // ï¿½ï¿½ï¿½ï¿½ï¿½Ì¸ï¿½...
        if (bReturn)
        {
            // Thread ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ Thread ï¿½ï¿½ï¿½ï¿½
            CSequenceProcessData* pThreadData = new CSequenceProcessData(this);
            if (pThreadData)
            {
@@ -227,7 +224,6 @@
            }
        }
        else if(nProcessStatus==2){
            // Thread ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ Thread ï¿½ï¿½ï¿½ï¿½
            CSequenceProcessData* pThreadData = new CSequenceProcessData(this);
            if (pThreadData)
            {
@@ -277,7 +273,6 @@
    CReviewResult* pWsiResult = pGlassResult->GetWsiResult(nModuleIndex);
    if (pWsiResult==NULL) goto RESULT_FAIL;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Â´ï¿½.
    int nCurResultIdx    = pWsiResult->GetLastSReviewResultIndex() + 1; // last index + 1
    int nStartResultIdx    = pWsiResult->GetStartSReviewResultIndex();
    int nEndResultIdx    = pWsiResult->GetEndSReviewResultIndex();
@@ -291,13 +286,11 @@
    int        nMPosY    = int(pPosition->dMotorPosY * 1000.0);
    double    dTime    = (double) m_ProcessTimer.GetDurationMilliSecond();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ù¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    if (measureResut.nResultIndex != nCurResultIdx) 
    {
        goto RESULT_FAIL;
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    // measureResut
    if(pWsiResult->GetSReviewResultCount() == 0) return ;
@@ -324,7 +317,6 @@
    // set last result idx
    pWsiResult->SetLastSReviewResultIndex(nCurResultIdx);
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½Ô°ï¿½, WSI ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½...
    if(nCurResultIdx==nEndResultIdx && nCurResultIdx<=pWsiResult->GetSReviewResultCount())
    {
        nStartResultIdx = nCurResultIdx + 1;
@@ -335,8 +327,7 @@
        pWsiResult->SetStartSReviewResultIndex(nStartResultIdx);
        pWsiResult->SetEndSReviewResultIndex(nEndResultIdx);
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000);
//        Process_RemainWsiPoint(nModuleIndex);
    }
@@ -362,7 +353,6 @@
    CReviewResult* pWsiResult = pGlassResult->GetWsiUserResult(nModuleIndex);
    if (pWsiResult==NULL) goto RESULT_FAIL;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Â´ï¿½.
    int nCurResultIdx    = pWsiResult->GetLastSReviewResultIndex() + 1; // last index + 1
    int nStartResultIdx    = pWsiResult->GetStartSReviewResultIndex();
    int nEndResultIdx    = pWsiResult->GetEndSReviewResultIndex();
@@ -376,13 +366,11 @@
    int        nMPosY    = int(pPosition->dMotorPosY * 1000.0);
    double    dTime    = (double) m_ProcessTimer.GetDurationMilliSecond();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ù¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    if (measureResut.nResultIndex != nCurResultIdx) 
    {
        goto RESULT_FAIL;
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    // measureResut
    if(pWsiResult->GetSReviewResultCount() == 0) return ;
@@ -407,7 +395,6 @@
    // set last result idx
    pWsiResult->SetLastSReviewResultIndex(nCurResultIdx);
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½Ô°ï¿½, WSI ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½...
    if(nCurResultIdx==nEndResultIdx && nCurResultIdx<=pWsiResult->GetSReviewResultCount())
    {
        nStartResultIdx = nCurResultIdx + 1;
@@ -418,8 +405,7 @@
        pWsiResult->SetStartSReviewResultIndex(nStartResultIdx);
        pWsiResult->SetEndSReviewResultIndex(nEndResultIdx);
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000);
        //        Process_RemainWsiPoint(nModuleIndex);
    }
@@ -442,6 +428,8 @@
         g_pLog->DisplayMessage(_T("[AlignResult] Glass Result is NULL!"));
         SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Signal!"));
        AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
         return;
    }
@@ -449,7 +437,6 @@
     CAlignResult *pAlignResult = &pGlassResult->m_AlignResult;
     CAlignRecipe *pAlignRecipe = &pGlassResult->m_AlignRecipe; 
 
     // ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ç¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
     CRsRcpAlignInfo *pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
     if (pRsRcpAlignInfo!=NULL && pRsRcpAlignInfo->m_bAutoProcess)
     {
@@ -463,25 +450,21 @@
             pRsRcpAlignInfo->m_dSecondCamExposure = pCurAlignResult->dExposureTime[1];
         }
 
         // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Å¸ ï¿½ï¿½ï¿½ï¿½
         //m_pDoc->Recipe_WriteRecipeFile();
     }
 
 
     BOOL bLastAlignResult = FALSE;
     CCoordCalibrator *pCoordCalibrator = m_pSP2P->ISP2P_GetCoordCalibrator();
     // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½..
     if (pCoordCalibrator && pCurAlignResult->nResultCode==Align_Success)
     {
         g_pLog->DisplayMessage(_T("[AlignResult] Align Find Success!"));
 
         // ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
         *pAlignResult = *pCurAlignResult;
 
         pCoordCalibrator->SetFirstMarkPos(pAlignResult->dFindPositionX[0], pAlignResult->dFindPositionY[0], pAlignRecipe->dGlassPositionX[0], pAlignRecipe->dGlassPositionY[0]);
         pCoordCalibrator->SetSecondMarkPos(pAlignResult->dFindPositionX[1], pAlignResult->dFindPositionY[1], pAlignRecipe->dGlassPositionX[1], pAlignRecipe->dGlassPositionY[1]);
 
         // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½
         if(pCoordCalibrator->CalculateAlignResult() == TRUE)
         {
             sAlignResult = pCoordCalibrator->GetAlignResult();
@@ -490,38 +473,35 @@
             bLastAlignResult = !pAlignRecipe->bRotateProcess;
         }
 
         // ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
         CCameraControlAlign *pAlignCameraControl    = m_pSP2P->ISP2P_GetAlignCameraControl();
         SThetaMotorInfo* pThetaMotorInfo            = m_pSP2P->ISP2P_GetThetaMotorInfo();
         CMotorControl* pMotorControl                = m_pSP2P->ISP2P_GetMotorControl();
 
         if (pAlignRecipe->bRotateProcess && pAlignCameraControl && pMotorControl && pThetaMotorInfo)
         {
             if (fabs(sAlignResult.dDegree) <= pAlignRecipe->dGlassAngleMin) // ï¿½ï¿½ï¿½ï¿½ ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö¼Ò°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
             if (fabs(sAlignResult.dDegree) <= pAlignRecipe->dGlassAngleMin)
             {
                 bLastAlignResult = TRUE;
                 g_pLog->DisplayMessage(_T("[AlignResult] Success! Last Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                     sAlignResult.dDegree,  pCurAlignResult->nFindCount);
             }
             else if (fabs(sAlignResult.dDegree) > pAlignRecipe->dGlassAngleMax) // ï¿½ï¿½ï¿½ï¿½ ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö´ë°¢ï¿½ï¿½ï¿½ï¿½ Å©ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
             else if (fabs(sAlignResult.dDegree) > pAlignRecipe->dGlassAngleMax)
             {
                 bLastAlignResult = FALSE;
                 g_pLog->DisplayMessage(_T("[AlignResult] FAIL! Last Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                     sAlignResult.dDegree,  pCurAlignResult->nFindCount);
             }
             else if (pCurAlignResult->nFindCount < pAlignRecipe->nRetryCount) // ï¿½çº¸ï¿½ï¿½ È½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ È½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ì¸ï¿½ ï¿½çº¸ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
             else if (pCurAlignResult->nFindCount < pAlignRecipe->nRetryCount)
             {
                 g_pLog->DisplayMessage(_T("[AlignResult] Current Glass Angle : %.8lf degree, Retry Count : %d ea"), 
                     sAlignResult.dDegree,  pCurAlignResult->nFindCount);
 
                 // ï¿½ï¿½ï¿½Í·ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½..
                 double dCalAngle = sAlignResult.dDegree;
                 dCalAngle = pThetaMotorInfo->dPosition - dCalAngle ;
                 g_pLog->DisplayMessage(_T("[AlignResult] Move Rotate Glass Angle : %.8lf degree"), dCalAngle);
                 pMotorControl->AxisThetaManualGoEnd(dCalAngle);
                 ::Sleep(100);
 
                 // ï¿½ï¿½ï¿½ï¿½ï¿½ ReProcess
                 if (pAlignCameraControl->AlignProcess())
                 {
                     g_pLog->DisplayMessage(_T("[AlignResult] Align Find Process ReStarted!"));
@@ -556,8 +536,7 @@
         //m_pView->SetAlignResult(pAlignResult->nResultCode, sAlignResult.dOriginX, sAlignResult.dOriginY, sAlignResult.dDegree);
     }
 
    // PCControl ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½È£ ï¿½ï¿½ï¿½ï¿½.
    if (bLastAlignResult) // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Î°ï¿½ï¿½...
    if (bLastAlignResult)
    {    
        SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Success Data!"));
@@ -567,6 +546,8 @@
        SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Data!"));
    }
    AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ë³€ê²½
    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
@@ -689,13 +670,10 @@
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_None, nPlanIndex);
         
        //�����
        AFM_SetAFMTracking(FALSE);
        return;
    }
    //190727 chm WSI ï¿½ï¿½ï¿½ï¿½ï¿½ End Ã¼Å© ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if(nBeforePlanIndex== CPJT_PlanWSI||nBeforePlanIndex== CPJT_PlanWsiReflow||nBeforePlanIndex== CPJT_PlanWsiUser)
    {
        if(pPlanInfo->m_nReviewType == CPJT_PlanWSI ||pPlanInfo->m_nReviewType == CPJT_PlanWsiReflow||pPlanInfo->m_nReviewType== CPJT_PlanWsiUser || pPlanInfo->m_nReviewType == CPJT_PlanWsiMultiShot)
@@ -724,13 +702,12 @@
        }
    }
    //190727 chm WSI type ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Review ï¿½Ã·ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½Þ¶ï¿½ ï¿½Û¶ï¿½ ï¿½Û¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ì¸¦ ï¿½ï¿½ï¿½ï¿½...
    if(nBeforePlanIndex== CPJT_PlanWSI ||nBeforePlanIndex== CPJT_PlanWsiReflow||nBeforePlanIndex== CPJT_PlanWsiUser)
    {
        if(  pPlanInfo->m_nReviewType == CPJT_PlanReview|| pPlanInfo->m_nReviewType == CPJT_PlanUser|| pPlanInfo->m_nReviewType == CPJT_PlanMeasure|| pPlanInfo->m_nReviewType == CPJT_PlanReflow)
        {
            CTotalPitchMeasure* pTotapPithMeasure = m_pSP2P->ISP2P_GetTotalPitchMeasure(); // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½! 20190730 chm ï¿½ï¿½ï¿½ß¿ï¿½ ï¿½Ô¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½....
            CTotalPitchMeasure* pTotapPithMeasure = m_pSP2P->ISP2P_GetTotalPitchMeasure();
    
            const CMotorControlInfo* pSystemMotorInfo = m_pSP2P->ISP2P_System_GetMotorInfo();
            if(pSystemMotorInfo !=NULL) 
@@ -774,8 +751,6 @@
        if(pPlanInfo == NULL) continue;
        //210325
        //END ï¿½ï¿½ ï¿½ï¿½Îµï¿½ï¿½ï¿½ ï¿½Ç¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ø´ï¿½ ï¿½Ô¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Æ°ï¿½ï¿½ï¿½ ï¿½Ö¾ï¿½ start ï¿½Ô¼ï¿½ï¿½ï¿½ Å¸ï¿½ï¿½ï¿½ï¿½
        //�װͿ� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ã³ï¿½ï¿½
        if (GetProcessStatus() == ProcessReviewEnd_CPJT || GetProcessStatus() == ProcessReviewUnloding_CPJT)
        {
            g_pLog->DisplayMessage(_T("[ProcessStop] StartProcessing Sequence Stop Status : %d"), GetProcessStatus());
@@ -788,6 +763,20 @@
            if (( nTotalCount += pGlassResult->GetTotalSReviewResultCount()) > 0)
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[Sequence Processor] Review Plan Start!"));
                //LYW DCOLL ï¿½Ó½ï¿½ï¿½ï¿½Ä¡
                CDitGlassRawClient *pDitRawClient = CDitGlassRawClient::GetInstance();
                if (pDitRawClient->isConnect() == TRUE)
                {
                    _grmDefectData* pSharedDefect = pDitRawClient->GetDefectData(0);//pReviewResult->nDefectidx2
                    _grmDefectReviewData * pSharedDefectReview = &pSharedDefect->m_ReviewDefect;
                    //size_t CharactersConverted;
                    //wcstombs_s(&CharactersConverted, pSharedDefectReview->m_strRevImageName, pReviewResult->strImgFileName, _TRUNCATE);
                    strcpy(pSharedDefectReview->m_strRevImageName, "");
                }
                //LYW DCOLL ï¿½Ó½ï¿½ï¿½ï¿½Ä¡
                ::Sleep(nWaitTime);
                m_pSP2P->ISP2P_GetReviewProcessor()->ResetGantryDone();
                bExcute = ReviewStartProcessing(pGlassResult, nPlanIdx);
@@ -816,7 +805,7 @@
                m_pSP2P->ISP2P_DisplayMessage(_T("[Sequence Processor] WSI Plan End!"));
            }
            break;
        //�̻��
        case CPJT_PlanMeasure:
            if (( nTotalCount += pGlassResult->GetTotalSMeasureResultCount()) > 0)
            {
@@ -916,6 +905,9 @@
        break;
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD START
    SetSimulationMode(FALSE);
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 ADD END
    return;
}
@@ -925,17 +917,28 @@
    AllAckSignalOff();
    m_pSP2P->ISP2P_GetReviewProcessor()->ResetGantryDone();
    SetCheckWSIEnd(-1); //190726 wsiendüũ ï¿½Ê±ï¿½È­
    SetWsiType(-1);    //wsi reflow Å¸ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ê±ï¿½È­
    SetCheckWSIEnd(-1); //190726
    SetWsiType(-1);    //wsi reflow
    SetLastPointCheck(FALSE);
    bFileFind = FALSE;
    m_pSP2P->ISP2P_GetDiagnosisHistory();
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
    m_pSP2P->ISP2P_SetFirstReviewLeft(TRUE);
    m_pSP2P->ISP2P_SetFirstReviewRight(TRUE);
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //Original
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
     // read config file
     if(!m_pSP2P->ISP2P_System_ReadConfigFile())
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor] System Value Loading FAIL!"));    
@@ -953,18 +956,18 @@
     }
     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Glass Result Count : %d ea"), nGlassResultCount);
    
    pGlassResult->ResetDefocusCount();//�ε� ï¿½ÎºÐ¿ï¿½ï¿½ï¿½ defocus count ï¿½Ê±ï¿½È­ 190821 chm
    pGlassResult->ResetDefocusCount();
     CTime time = CTime::GetCurrentTime();
     pGlassResult->m_strResultDate.Format(_T("%04d.%02d.%02d"), time.GetYear(), time.GetMonth(), time.GetDay());
    //if(Revolver_SetGoHome(0)) // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ HOME ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //if(Revolver_SetGoHome(0))
    //{
    //    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Revolver Set GoHome Success!"));
    //}
    //#3357 KYH Align Image ï¿½Ê±ï¿½È­ ADD START
    //#3357 KYH Align Image ADD START
    CCameraControlAlign* pAlignCameraControl = m_pSP2P->ISP2P_GetAlignCameraControl();
    if (pAlignCameraControl != NULL)
    {
@@ -972,7 +975,7 @@
        g_pLog->DisplayMessage(_T("[Align] Align Image Clear"));
    }
    //#3357 KYH Align Image ï¿½Ê±ï¿½È­ ADD END
    //#3357 KYH Align Image ADD END
     // get transfer data
     int nResultCode = 0;
@@ -999,13 +1002,20 @@
            if (pDitRawClient->isConnect()==FALSE)
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ç¿¬ï¿½ï¿½ ï¿½Ãµï¿½ "));
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] DitRawClient Connect Fail "));
                int nReconnect=0;
                while (1)
                {
                    if (nReconnect == 3)
                    {
                        SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
                        if (GetSimulationMode() == FALSE)
                        {
                            SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                        }
                        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
                        //original
                        /*SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);*/
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
                        break;
@@ -1014,11 +1024,11 @@
                    Sleep(1000);
                    if (pDitRawClient->isConnect() == FALSE)
                    {
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Count[%d]"), nReconnect);
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]DitRawClient Connect Fail Count[%d]"), nReconnect);
                    }
                    else
                    {
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]DitRawClient Connect Success"));
                        break;
                    }
                    nReconnect += 1;
@@ -1028,9 +1038,9 @@
            }
            // #3381 LYW CF AOI Review ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ FDC TackTime ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
            // #3381 LYW CF AOI Review FDC TackTime ADD START
            pDitRawClient->GetGlassData()->m_tmReviewLoading = CTime::GetCurrentTime();
            // #3381 LYW CF AOI Review ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ FDC TackTime ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
            // #3381 LYW CF AOI Review FDC TackTime ADD END
            
            CString strGlassIDTemp = NULL;
@@ -1047,9 +1057,21 @@
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
            strFileName.Format(_T("%s_%s"), strGlassIDTemp, strGlassStepIdTemp);
            //������Ʈ��
            //bFileFind = FindRawBinFile(strFileName);
            bFileFind = TRUE;
            //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
            if (GetSimulationMode() == FALSE)
            {
                bFileFind = FindRawBinFile(strFileName);
            }
            else
            {
                bFileFind = TRUE;
            }
            //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
            //original
            /*bFileFind = FindRawBinFile(strFileName);*/
            pDitRawClient->SetReviewStart();
            Sleep(1000);
@@ -1094,7 +1116,7 @@
         }
     }
    //// 190725 ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½ chm ASCEND ï¿½ï¿½ alarm
    //// 190725 chm ASCEND alarm
    const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
    const CRcpSortingInfo *pSortingInfo = pRsRcpReviewInfo->GetRcpReviewSortInfo();
@@ -1111,7 +1133,7 @@
    
    
    ////������ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½È±ï¿½ 190618
    ////190618
    if(GetUseAfmHomePosition())
    {
    g_pLog->DisplayMessage(_T("[AFM] AFM Home Position Start!!!"));
@@ -1120,7 +1142,6 @@
    }
    //�����޸� Ä¿ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Å¸Æ®(�۶� ï¿½Îµï¿½)
    CDitGlassRawClient* pDitSharedGlassRaw = CDitGlassRawClient::GetInstance();
    if (pDitSharedGlassRaw->isConnect() == FALSE) {
        m_pSP2P->ISP2P_DisplayMessage(_T("[DitGlassRawClient] Shared Memory Connect Fail"));
@@ -1155,25 +1176,42 @@
     // review camera stop
    ReviewCamera_CameraControl(CameraControlStop);    
    //AlignCamera_CameraControl(CameraControlLive);
    AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
     // send signal to plc
     if (nResultCode==0)
     {
         SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
     }
     else
     {
         SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
     }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        // send signal to plc
    if (GetSimulationMode() == FALSE)
    {
        if (nResultCode == 0)
        {
            SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
        }
        else
        {
            SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
        }
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//      send signal to plc
//           if (nResultCode==0)
//           {
//               SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Success Signal!"));
//           }
//           else
//           {
//               SendResultToSignalControl(PCControlSendData_LoadingResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//               m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading FAIL Signal!"));
//           }
 
     // send cell data to review processorm_pDitGlass
     CReviewProcessor* pReviewProcessor = m_pSP2P->ISP2P_GetReviewProcessor();
     if(pReviewProcessor == NULL) return ;    
     pReviewProcessor->SetCellData(pGlassResult);
     pReviewProcessor->SetReviewCount(0);            // ï¿½ï¿½ï¿½ï¿½ Sequence No ï¿½Ê±ï¿½È­.
     pReviewProcessor->SetReviewCount(0);
    pReviewProcessor->SetPlanReviewCount(0);
    pReviewProcessor->SetPlanWSICount(0);
     // Process Status Update
@@ -1195,8 +1233,16 @@
         m_pSP2P->ISP2P_UpdateDefectFilter(pDefectFilter);
     }    
    
    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//     SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_LoadingComplete_CPJT);
//     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Complete Signal!"));
     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::OUT] Loading!"));
@@ -1212,17 +1258,37 @@
{
     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] AlignStart!"));
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
    //Sleep(400);//������ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö±ï¿½ chm190602
    AlignCamera_CameraControl(CameraControlLive);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
    Sleep(300);
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_AlignStartAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Start Ack!"));
     // 1. get current glass result
     CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
     if (pGlassResult==NULL) {    return;    }
     if (pGlassResult==NULL)
    {
        Sleep(350);
        AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
        return;
    }
 
    const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
    if(pRsRcpAlignInfo == NULL)    return;
    if (pRsRcpAlignInfo == NULL)
    {
        Sleep(350);
        AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
        return;
    }
     // 2. get align camera control    
     CCameraControlAlign* pAlignCameraControl = m_pSP2P->ISP2P_GetAlignCameraControl();
 
@@ -1230,24 +1296,48 @@
    if(pRsRcpAlignInfo->m_bAlignSkipMode)
    {
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Align Skip Mode !!!!!!!"));
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        if (GetSimulationMode() == FALSE)
        {
            SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
            SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
            //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
        }
        //original
//         SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
//         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
        SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
        Sleep(350);
        AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
    }
    else
    {
        // 190710 SJB Align Camera Disconnect Check, Align Step ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ È®ï¿½ï¿½ï¿½Ñ´ï¿½.
        // 190710 SJB Align Camera Disconnect Check, Align Step
        if(pAlignCameraControl)
        {
            if(pAlignCameraControl->AlignCameraDisconnectCheck() == FALSE)
            {
                SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail! Align Cam Disconnect"));
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
                //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
                if (GetSimulationMode() == FALSE)
                {
                    SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
                }
                //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
                //original
//                 SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//                 m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Algin Camera Disconnect!!!!"));
            }
        }        
        else
        {
            Sleep(350);
            AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
        }
        if (pGlassResult && pAlignCameraControl && pAlignCameraControl->AlignProcess())
        {
@@ -1255,16 +1345,26 @@
        }
        else
        {
            //�����ߵ�
            Sleep(1000);
            //TEST ï¿½ï¿½ï¿½
            {
                SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
            SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
        }
                //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
                if (GetSimulationMode() == FALSE)
                {
                    SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
                    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
                }
                //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
                //original
//                 SendResultToSignalControl(PCControlSendData_AlignResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//                 m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align SUCCESS Data!"));
//                 SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
//                 m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
            }
            Sleep(350);
            AlignCamera_CameraControl(CameraControlStop);  // 210805 Align Camera Sequence ï¿½ï¿½ï¿½ï¿½
            //�ּ� Ç®ï¿½ï¿½
            // 4. send align fail signal to plc
@@ -1272,7 +1372,7 @@
            //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Fail Data!"));
            //SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_AlignComplete_CPJT);
            //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::AlignStart] Send Align Complete Signal!"));
    }
        }
    }
@@ -1294,21 +1394,36 @@
    m_pSP2P->ISP2P_GetSignalControl()->WriteData(_T("17110"), sizeof(pDitRawClient->GetGlassData()->m_strGlassJudge), pDitRawClient->GetGlassData()->m_strGlassJudge);
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] ReadRawFile!"));
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReadRawFileAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Read Raw File Ack!"));
     if (bFileFind == FALSE)
    {
        SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        if (GetSimulationMode() == FALSE)
        {
            SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Find Raw File Fail"));
        }
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
        //original
//         SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_FAIL);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Find Raw File Fail"));
        return;
    }    
    // get current glass result
    CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
    if (pGlassResult==NULL) return;
    //�����޸� Ä¿ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Å¸Æ®(�۶� ï¿½Îµï¿½)
    CDitGlassRawClient* pDitSharedGlassRaw = CDitGlassRawClient::GetInstance();
    if(pDitSharedGlassRaw->isConnect() == FALSE)                m_pSP2P->ISP2P_DisplayMessage(_T("[DitGlassRawClient] Shared Memory Connect Fail"));
@@ -1335,20 +1450,26 @@
        int nTotalPlanCount = CalculatePlanData(pGlassResult);
        m_pSP2P->ISP2P_DisplayMessage(_T("[Read Raw File] Review All Plan Total Count : %d"), nTotalPlanCount);
        //�����ߵ�
        Sleep(1000);
        // send review ready
        SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        if (GetSimulationMode() == FALSE)
        {
            SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
        }
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
        //original
//         SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
    }
    else
    {
        processTimer.End();
        m_pSP2P->ISP2P_DisplayMessage(_T("[ReadRawFile] AOI Result File Read Fail![%.3f ms]"), processTimer.GetDurationMilliSecond());
        //�׽�Ʈ ï¿½ï¿½ï¿½
        //{
        //            // send review ready
        //    SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
@@ -1356,7 +1477,6 @@
        //            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
        //}
        //�ּ� ï¿½ï¿½ï¿½ï¿½
        int nCurPlanIndex = 0;
        CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
        if(pRsRcpReviewInfo)
@@ -1371,15 +1491,21 @@
                    m_pSP2P->ISP2P_DisplayMessage(_T("[Read Raw File] Review All Plan Total Count : %d"), nTotalPlanCount);
                    // send review ready
                    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
                    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
                    if (GetSimulationMode() == FALSE)
                    {
                        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
                        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
                    }
                    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
                    //original
//                     SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewReady_CPJT);
//                     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReadRawFile] Send Review Ready Signal!"));
                }
            }
        }
    }
    //// [2017:5:24]-[WEZASW] : Review Image Upload Dir ï¿½ï¿½ï¿½ï¿½.(FTPUploader���� ï¿½Úµï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ç´ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½)
    //// '�ݺ��˻�'�� FTPUploader���� ï¿½ï¿½ï¿½Îµï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ PCControl Glass Unloading ï¿½ï¿½ ï¿½ï¿½ï¿½ Loading�� Review������ ï¿½ï¿½ï¿½Îµï¿½ ï¿½ï¿½ï¿½(GlassID) ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
    CString strPath = _T("");
    //if(pNetworkInfo && pNetworkInfo->m_strUploadImagePath.IsEmpty() == FALSE)
@@ -1393,8 +1519,6 @@
    CFileFind Uploadfile, RTMSUploadPath;
    if (CDitGlassRawClient::GetInstance()->GetGlassData() == NULL) return;
    //���ε� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ù½ï¿½ ï¿½ï¿½ï¿½Îµï¿½ ï¿½ï¿½ï¿½ Set 20190917chm
    if(Uploadfile.FindFile(strPath)==FALSE)
    {
        CTime tmServerLoadingTime = CDitGlassRawClient::GetInstance()->GetGlassData()->m_tmGlassLoading;
@@ -1402,10 +1526,6 @@
        CreateDirectory(strPath, NULL);
        pReviewProcessor->SetUploadImagePath(strPath);
        //taek 210126 rtms ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        CreateDirectory(pReviewProcessor->GetRTMSUploadImagePath(),NULL);
    }
@@ -1422,9 +1542,16 @@
    SetLastPointCheck(FALSE);
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] %d Tick Count"), dwTime);
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewStartAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Start Ack!"));
    const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
    if(pRsRcpAlignInfo == NULL)    return;
@@ -1451,10 +1578,10 @@
    //            _grmCellData* pCellData = pDitRawClient->GetCellData(0);
    //            if(pCellData) 
    //            {
    //            //    pCellData->m_nTotalPitchData[0] = int(pTotapPithMeasure->GetTotalPitchBD() * 1000); // ï¿½ï¿½ï¿½ï¿½, ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //            //    pCellData->m_nTotalPitchData[1] = int(pTotapPithMeasure->GetTotalPitchAC() * 1000); // ï¿½ï¿½ï¿½ï¿½, ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Æ·ï¿½ï¿½ï¿½
    //            //    pCellData->m_nTotalPitchData[2] = int(pTotapPithMeasure->GetTotalPitchAB() * 1000); // ï¿½ï¿½ï¿½ï¿½, ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //            //    pCellData->m_nTotalPitchData[3] = int(pTotapPithMeasure->GetTotalPitchCD() * 1000); // ï¿½ï¿½ï¿½ï¿½, ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //            //    pCellData->m_nTotalPitchData[0] = int(pTotapPithMeasure->GetTotalPitchBD() * 1000);
    //            //    pCellData->m_nTotalPitchData[1] = int(pTotapPithMeasure->GetTotalPitchAC() * 1000);
    //            //    pCellData->m_nTotalPitchData[2] = int(pTotapPithMeasure->GetTotalPitchAB() * 1000);
    //            //    pCellData->m_nTotalPitchData[3] = int(pTotapPithMeasure->GetTotalPitchCD() * 1000);
    //            }
    //        }
    //    }
@@ -1462,7 +1589,6 @@
    //    {
    //        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor] TotalPitchMeasure Result Fail!"));
    //        // 190711 SJB, TotalPitchMeasure Fail�ÿ� ï¿½Ù·ï¿½ Motor�� ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ù´ï¿½ Motion Enable ï¿½ï¿½È£ï¿½ï¿½ È®ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //        
    //        if(!pTotapPithMeasure->GetMotorEnable())
    //        {
@@ -1488,15 +1614,23 @@
    if(FirstReviewPlanStart() <= 0)
    {
        //Sleep(1000);
        SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        if (GetSimulationMode() == FALSE)
        {
            SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
        }
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
        //original
//         SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
    }
    else
    {
        //�����ߵ�
        //Sleep(1000);
        //Test���
        //SendResultToSignalControl(PCControlSendData_ReviewComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        //SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
        //m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
@@ -1514,8 +1648,16 @@
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] ReviewEnd!"));
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
    //original
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewEndAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send Review End Ack!"));
    CDitGlassRawClient* m_pDitGlassRaw = CDitGlassRawClient::GetInstance();
    if (m_pSP2P->ISP2P_GetWSIControl(0)!=NULL)
@@ -1536,16 +1678,22 @@
    }
    
    m_pDitGlassRaw->GetGlassData()->m_nReviewNum = m_pSP2P->ISP2P_GetReviewProcessor()->GetPlanReviewCount();
    //SendDVDataToSignalControl();// ï¿½È¾ï¿½ï¿½ï¿½
    //OverTime ï¿½ß»ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½î¿¡ï¿½ï¿½ END ACK�� ï¿½ï¿½Ù¸ï¿½ï¿½Â°ï¿½ ï¿½Æ´Ï¶ï¿½ ï¿½ï¿½ Conplete�� ï¿½ï¿½Ù¸ï¿½ï¿½ï¿½.
    //�� ... ï¿½ï¿½ï¿½ï¿½  ï¿½ï¿½ï¿½ï¿½ï¿½Îµï¿½ï¿½Ï´ï¿½ ï¿½ß°ï¿½
    //SendDVDataToSignalControl();
    if (GetLastPointCheck() == FALSE)
    {
        SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
        if (GetSimulationMode() == FALSE)
        {
            SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
            SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
        }
        //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
        //original
//         SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//         SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT);
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!"));
    }
    CGlassResult* pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
@@ -1566,10 +1714,8 @@
        m_pSP2P->ISP2P_GetWSIControl(0)->SendWsiAfmSafePosMove();
        m_pSP2P->ISP2P_GetWSIControl(1)->SendWsiAfmSafePosMove();
    }
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Review���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if(m_pDitGlassRaw->isConnect()==FALSE)        WriteRawData(pGlassResult);
    
    //����Ŀ�� ï¿½Ë¶ï¿½ send 20190819chm
    if(pGlassResult->m_nDeFocusCount >0) 
    {
        SendSignalToSignalControl(PCControlSendSignalIndex_State,PCControlSend_Defoucs,1000);
@@ -1579,8 +1725,8 @@
        CString strTime = _T("");
        strTime.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
        CDlgDefocusList::GetInstance()->SetDefocusTotalCount(pGlassResult->m_nDeFocusCount);//��Ż Ä«ï¿½ï¿½Æ® Add
        CDlgDefocusList::GetInstance()->SetDefocusData(strTime,pGlassResult->m_strGlassID,pGlassResult->m_nDeFocusCount);//ui ï¿½ß°ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        CDlgDefocusList::GetInstance()->SetDefocusTotalCount(pGlassResult->m_nDeFocusCount);
        CDlgDefocusList::GetInstance()->SetDefocusData(strTime,pGlassResult->m_strGlassID,pGlassResult->m_nDeFocusCount);
    }
@@ -1594,26 +1740,34 @@
    g_pLog->DisplayMessage(_T("History Button Enable"));
    m_pSP2P->ISP2P_GetDiagnosisHistory2();
    /*int nModuleCount = m_pSP2P->ISP2P_GetModuleStatusCount(); //0503 ï¿½ï¿½ï¿½ï¿½ End�� ï¿½ï¿½ï¿½ï¿½ï¿½ 0���� ï¿½Ê±ï¿½È­
    /*int nModuleCount = m_pSP2P->ISP2P_GetModuleStatusCount();
    for (int nModuleIdx = 0; nModuleIdx < nModuleCount; nModuleIdx++)
    {
        {
            ReviewLight_SetLightLevel(nModuleIdx, 0);
            g_pLog->DisplayMessage(_T("Module[%d] LightLevel ï¿½Ê±ï¿½È­"), nModuleIdx);
            g_pLog->DisplayMessage(_T("Module[%d] LightLevel"), nModuleIdx);
        }
    }*/
    //5. PCControl ï¿½ï¿½È£ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ®
    //5. PCControl
    if (pGlassResult)
    {
        m_pSP2P->ISP2P_UpdateProcessStatus(GetProcessStatus(), pGlassResult);
        g_pLog->DisplayMessage(_T("PCControl Update Signal"));
    }
    SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
    SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
        SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
    }
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
//     SendResultToSignalControl(PCControlSendData_ReviewResultFileCreateComplete_CPJT, SIGNAL_SEND_RESULT_SUCCESS);
//     SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ResultDataComplete_CPJT);
//     m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Send ResultData Complete Signal!"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::OUT] ReviewEnd!"));
}
@@ -1621,9 +1775,16 @@
void CSequenceProcessor_CPJT::Process_ReviewUnloading()
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] Review Unloading!"));
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD START
    if (GetSimulationMode() == FALSE)
    {
        if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
    }
    //original
    //#3584 210817 LYW CF AOI Review ì‹œë®¬ë ˆì´ì…˜ ê¸°ëŠ¥ ì •상화 MOD END
//     if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT))
//         m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!"));
    
}
@@ -1646,8 +1807,8 @@
    CString strCode = _T("");
    int nDefectCount = pRawData->GetGlassData()->m_nDefectNum; // ï¿½ï¿½ï¿½å°¹ï¿½ï¿½
    int nJudgeCount = pRcpReviewInfo->GetRcpZoneFilterInfoCount();// ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    int nDefectCount = pRawData->GetGlassData()->m_nDefectNum;
    int nJudgeCount = pRcpReviewInfo->GetRcpZoneFilterInfoCount();
    int nFilterType = 0;
    int nJudgeType = 0;
    int nZoneNumber = 0;
@@ -1661,7 +1822,7 @@
    int nJudgeCellOKCount = 0;
    int nPixelSize = 0;
    int nPixelFilterSize = 0;
    //���� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    //1 wsi, 3 CS, 4 R, 5 G, 6 B
    //pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_fWsi_ResultData[1];//Defect
    //pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_fWsi_ResultData[3];//cs
@@ -1675,10 +1836,10 @@
        {
#pragma region ï¿½ï¿½ï¿½ï¿½ï¿½ fail
#pragma region Align fail
            if (m_pSP2P->ISP2P_GetCurrentGlassResult()->GetAlignResult()->nResultCode != Align_Success)
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ WSI ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
                m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] Align Fail WSI Rejudge Cancel"));
                break;
            }
#pragma endregion
@@ -1716,7 +1877,7 @@
            
            if (nPixelFilterSize <= nPixelSize && nPixelFilterSize != 0)
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[ReviewEnd] ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Í¸ï¿½ Pixel Size[%d] nPixelFilterSize [%d]"), nPixelSize,nPixelFilterSize);
                m_pSP2P->ISP2P_DisplayMessage(_T("[ReviewEnd] Size filtering Pixel Size[%d] nPixelFilterSize [%d]"), nPixelSize,nPixelFilterSize);
                continue;    
            }
#pragma endregion
@@ -1726,13 +1887,13 @@
            for (int nJudgeindex = 0; nJudgeindex < nJudgeCount; nJudgeindex++)
            {
                //nZoneType = GetZoneType();
                dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->GetJudgeHeight(); //����
                dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->GetJudgeHeight();
                nFilterType = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->m_nFilterType; //ZONE
                nJudge = pRcpReviewInfo->GetRcpZoneFilteringInfo(nJudgeindex)->m_nFilterJudge; //OK TR
                //nZoneNumber = pRcpReviewInfo->GetRcpZoneInfo(nFilterType)->m_vecZoneNumber[0];
                
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh
                {
                    BOOL isZoneValue = FALSE;
@@ -1745,7 +1906,7 @@
                        }
                        else
                        {
                            m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh ï¿½Î±ï¿½ ï¿½ß°ï¿½
                            m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                            isZoneValue = TRUE;
                            //break;
@@ -1754,7 +1915,7 @@
                    if (isZoneValue == FALSE)
                    {
                        m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh ï¿½Î±ï¿½ ï¿½ß°ï¿½
                        m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                        continue;
                    }
@@ -1804,13 +1965,13 @@
                        }
                    }
                    else if (fWsiData<=0) // 0���� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ñ´ï¿½.
                    else if (fWsiData<=0)
                    {
                        m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] WSI TYPE[%d] WSI ï¿½ï¿½ï¿½ï¿½[%0.3lf] <= 0 ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"), nJudgeType, fWsiData);
                        m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] WSI TYPE[%d] WSI Height[%0.3lf] <= 0 Cancel Rejudge"), nJudgeType, fWsiData);
                    }
                    else
                    {
                        //20210419 TR ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Judge ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ OK ï¿½ï¿½ï¿½ï¿½
                        //20210419 TR
                        //if (nJudge == 1)//TR -> OK
                        //{
                            if (pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_OK || pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_Unknown)
@@ -1861,7 +2022,7 @@
                }
                else //WSI TYPE ï¿½ï¿½ ï¿½Æ´Ï¸ï¿½
                else //WSI TYPE
                {
                    continue;
                }
@@ -1875,13 +2036,13 @@
            for (int nJudgeindex = 0; nJudgeindex < nJudgeCount; nJudgeindex++)
            {
                //nZoneType = GetZoneType();
                dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->GetJudgeHeight(); //����
                dJudgeHight = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->GetJudgeHeight();
                nFilterType = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->m_nFilterType; //ZONE
                nJudge = pRcpReviewInfo->GetRcpZoneFilteringInfo_PR(nJudgeindex)->m_nFilterJudge; //OK TR
                //nZoneNumber = pRcpReviewInfo->GetRcpZoneInfo(nFilterType)->m_vecZoneNumber[0];
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330
                {
                    BOOL isZoneValue = FALSE;
@@ -1894,7 +2055,7 @@
                        }
                        else
                        {
                            m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh ï¿½Î±ï¿½ ï¿½ß°ï¿½
                            m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] Zone[%d], DefectIndex[%d]"), nZoneNumber, pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                            isZoneValue = TRUE;
                            //break;
@@ -1903,7 +2064,7 @@
                    if (isZoneValue == FALSE)
                    {
                        m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh ï¿½Î±ï¿½ ï¿½ß°ï¿½
                        m_pSP2P->ISP2P_DisplayMessage(_T("[WSIZoneCheck] NoFail DefectIndex[%d]"), pRawData->GetDefectData(nDefectIdx)->m_nDefectIdx); //210330 kyh
                        continue;
                    }
@@ -1957,7 +2118,6 @@
                    }
                    else
                    {
                        //20210419 TR ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Judge ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ OK ï¿½ï¿½ï¿½ï¿½
                        //if (nJudge == 1)//TR -> OK
                        //{
                        if (pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_OK || pRawData->GetDefectData(nDefectIdx)->m_DefectJudgement == DEFECT_JUDGE_CPJT_Unknown)
@@ -2009,7 +2169,7 @@
                }
                else //WSI TYPE ï¿½ï¿½ ï¿½Æ´Ï¸ï¿½
                else //WSI TYPE
                {
                    continue;
                }
@@ -2024,7 +2184,7 @@
                
                strCode =pRcpReviewInfo->GetRcpZoneFilteringInfo_CODE(nJudgeindex)->m_FilterCode;
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330 kyh����
                if (pRawData->GetDefectData(nDefectIdx)->m_ReviewDefect.m_nWsi_Type == 2) // 210330
                {
                    nJudgeType = ReJugdeWSIType(nFilterType);
@@ -2077,7 +2237,7 @@
                        m_pSP2P->ISP2P_DisplayMessage(_T("[TEST Process::ReviewEnd] CODE JUDGE WSI TYPE[%d] Defect CODE [%s] != [%s]"), nJudgeType, strCode, pRawData->GetDefectData(nDefectIdx)->m_strDefectCode);
                    }
                }
                else //WSI TYPE ï¿½ï¿½ ï¿½Æ´Ï¸ï¿½
                else //WSI TYPE
                {
                    continue;
                }
@@ -2088,7 +2248,6 @@
        }
        
#pragma region CELLJUDGE
    //CELL ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½////////////////////////////////////////////////////////////////
    int nCellCount = pRawData->GetGlassData()->m_nCellNum;
@@ -2107,7 +2266,7 @@
        else if (pRawData->GetCellData(nCellIndex)->m_nJudgement == Judge_OK_CPJT)
        {
            nCelllOKJuge = nCelllOKJuge + 1;
        } //taek 21.01.25 Juge ï¿½ï¿½ï¿½Ï´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ó°ï¿½ ï¿½Ù²ï¿½ï¿½ï¿½...
        } //taek 21.01.25
        else if (pRawData->GetCellData(nCellIndex)->m_nJudgement == Judge_PR_CPJT)
        {
            nCelllPRJuge = nCelllPRJuge + 1;
@@ -2151,7 +2310,7 @@
                }
                else
                {
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Ä«ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ [%02d]Cell DefectTRCount[%d] >= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Count Number is minus! [%02d]Cell DefectTRCount[%d] >= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
                }
                break;
            case JudgeType_T8_PR:
@@ -2201,7 +2360,7 @@
                }
                else
                {
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Ä«ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ [%02d]Cell DefectTRCount[%d] <= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] Count Number is minus! [%02d]Cell DefectTRCount[%d] <= [%d]"), nCellIndex, pRawData->GetCellData(nCellIndex)->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
                }
                break;
            case JudgeType_T8_PR:
@@ -2365,7 +2524,7 @@
    }
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] CELL COUNT OK:[%d] TR[%d] PR[%d]"), nCelllOKJuge, nCellTRJudge, nCelllPRJuge);
#pragma endregion
    //GLASS ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½////////////////////////////////////////////////////////////////
#pragma region GLASSJUDGE
    CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
    if (pRsRcpReviewInfo == NULL) return FALSE;
@@ -2413,7 +2572,7 @@
            }
            else
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] TR Ä«ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ [%02d]GLASS Defect TR Count[%d] >= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] TR Count is minus [%02d]GLASS Defect TR Count[%d] >= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetJudgeCount());
            }
            break;
        case JudgeType_T8_PR:
@@ -2463,7 +2622,7 @@
            }
            else
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd]TRī��Ʈ�� ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ [%02d]GLASS Defect TR Count[%d] <= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
                m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd]TR Count is minus [%02d]GLASS Defect TR Count[%d] <= [%d]"), nIdx, pRawData->GetGlassData()->m_nDefectNumJudgeTR, pRcpJudgeInfo->GetSubJudgeCount());
            }
            break;
        case JudgeType_T8_PR:
@@ -2651,7 +2810,7 @@
        CakFileUtil akFileFinder;
        while (nReTryTime--)
        {
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER ï¿½Ë¶ï¿½ ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¼ï¿½ START
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START
            if (nReTryTime%2 == 0)
            {
                strFilePath = AOIRAWBIN_PATH;
@@ -2660,9 +2819,9 @@
            strWild.Format("%s\\%s_*.bin", strFilePath, strFileName);
             akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
            //LYW LOG�߰�
            //LYW LOG
            g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find Path = %s, RetryCount = %d, ResultCode = [%d]"), strFilePath, 30-nReTryTime, GetLastError());
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER ï¿½Ë¶ï¿½ ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¼ï¿½ END
            //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END
            VECFINDDATA* pFindData = akFileFinder.getFindData();
            int nFileNamePos = strlen(akFileFinder.getProcessPath());
            std::map<LONGLONG, CString> mapSpanFileName;
@@ -2674,7 +2833,7 @@
                    parser.process(pFileName, "_.");
                    if (parser.getTokNum() < 4) continue;
                    
                    if (parser.getTokNum() >= 6) continue; // 0401 ï¿½ß°ï¿½
                    if (parser.getTokNum() >= 6) continue; // 0401
                    int nDataTime[8] = {};
                    {
@@ -2702,7 +2861,6 @@
            {
                if (mapSpanFileName.begin()->first < nCloseTime)
                {
                    //���� ï¿½Ö±ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ [������ 2019/7/17]
                    strFindFile = mapSpanFileName.begin()->second;
                    break;
                }
@@ -2762,7 +2920,7 @@
    int nPCControlReadDataCount = pSignalInfo->GetReadDataAddressCount();
    // [2017:1:9]-[WEZASW] : PCControl GlassData ï¿½×¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    // [2017:1:9]-[WEZASW] : PCControl GlassData
    if(pSignalInfo->GetUseContinuousReadAddress())
    {
        CString strReadAddress = _T("");
@@ -3132,7 +3290,7 @@
                    strReadData = pTransferData->strRerferData;
                    break;
                }
                m_pSP2P->ISP2P_DisplayMessage(_T("[ReadTransferData] Name: %s, Addr: %s, Size: %d, Data: %s"), pInfo->strName, strReadAddress, nReadSize, strReadData); //0517
            //    m_pSP2P->ISP2P_DisplayMessage(_T("[ReadTransferData] Name: %s, Addr: %s, Size: %d, Data: %s"), pInfo->strName, strReadAddress, nReadSize, strReadData); //0517
        }
    }
@@ -3141,11 +3299,11 @@
void CSequenceProcessor_CPJT::UpdateGlassResultFromTransferData(CGlassResult *pGlassResult, STransferData* pTransferData)
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data ï¿½Ð±ï¿½!"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data Read!"));
    if (pGlassResult==NULL || pTransferData==NULL) return;
    // [2017:1:9]-[WEZASW] : PCControl GlassData ï¿½×¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    // [2017:1:9]-[WEZASW] : PCControl GlassData
    // transfer data is not exist
    if (pTransferData->strLotID.GetLength()<1)
    {
@@ -3214,10 +3372,10 @@
    pGlassResult->m_strPairFlag = pTransferData->strPairFlag;
    pGlassResult->m_strOptionValue = pTransferData->strOptionValue;
    pGlassResult->m_strReserved = pTransferData->strReserved;
    pGlassResult->strGlassScanSchedule = pTransferData->strGlassScanSchedule;//���� ï¿½ï¿½ï¿½ï¿½ cmark
    pGlassResult->strGlassScanSchedule = pTransferData->strGlassScanSchedule;//cmark
    pGlassResult->m_strRTMSStepID = pTransferData->strStepID; //taek 210126
    
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data ï¿½ï¿½!"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Transfer Data END!"));
}
void CSequenceProcessor_CPJT::UpdateHistoryResultFromTransferData(CGlassResult *pHistoryResult, CGlassResult* pGlassResult)
@@ -3275,7 +3433,7 @@
    pHistoryResult->m_strPairFlag = pGlassResult->m_strPairFlag;
    pHistoryResult->m_strOptionValue = pGlassResult->m_strOptionValue;
    pHistoryResult->m_strReserved = pGlassResult->m_strReserved;
    pHistoryResult->strGlassScanSchedule = pGlassResult->strGlassScanSchedule;//���� ï¿½ï¿½ï¿½ï¿½ cmark
    pHistoryResult->strGlassScanSchedule = pGlassResult->strGlassScanSchedule;// cmark
    pHistoryResult->m_strStepID = pGlassResult->m_strRTMSStepID; //taek 210126
    pHistoryResult->m_strEquipID = pGlassResult->m_strEquipID;
    pHistoryResult->m_strProcessID = pGlassResult->m_strProcessID;
@@ -3287,7 +3445,7 @@
void CSequenceProcessor_CPJT::CreateResultDirectory(const CString& strGlassID, const CString& strDate)
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½ï¿½ï¿½ä¸® ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make Directory Start"));
    if (m_pSP2P==NULL) return;
    const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
@@ -3333,7 +3491,7 @@
        strPath.Format(_T("%s\\%s"),pNetworkInfo->m_strAlignImagePath, strGlassID);
        CreateDirectory(strPath, NULL);
    }
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½ï¿½ï¿½ä¸® ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make directory End"));
}
@@ -3341,7 +3499,7 @@
void CSequenceProcessor_CPJT::SetSaveImageBasePathToReviewProcessor(const CString& strGlassID, const CString& strResultDate)
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ð½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make image path start"));
    const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
    if(pNetworkInfo == NULL) return;
@@ -3386,11 +3544,11 @@
                Sleep(1000);
                if (CDitGlassRawClient::GetInstance()->isConnect() == FALSE)
                {
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ Count[%d]"), nReconnect);
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]access Shared Memory Fail!! Count[%d]"), nReconnect);
                }
                else
                {
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]�����޸� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
                    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading]access Shared Memory Success"));
                    break;
                }
                nReconnect += 1;
@@ -3413,7 +3571,7 @@
        else
        {
            tmServerLoadingTime = CTime::GetCurrentTime();
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] ï¿½ï¿½ï¿½ï¿½ï¿½Þ¸ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ì»ï¿½"));
            m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] access Shared Memory Fail"));
            strPath.Format(_T("%s\\%s_%04d%02d%02d%02d%02d%02d"), pNetworkInfo->m_strUploadImagePath, strGlassID, tmServerLoadingTime.GetYear(), tmServerLoadingTime.GetMonth(), tmServerLoadingTime.GetDay(), tmServerLoadingTime.GetHour(), tmServerLoadingTime.GetMinute(), tmServerLoadingTime.GetSecond());
            strImagePath.Format(_T("%s\\%s_%04d%02d%02d%02d%02d%02d"), strGlassID, tmServerLoadingTime.GetYear(), tmServerLoadingTime.GetMonth(), tmServerLoadingTime.GetDay(), tmServerLoadingTime.GetHour(), tmServerLoadingTime.GetMinute(), tmServerLoadingTime.GetSecond());
            CreateDirectory(strPath, NULL);
@@ -3422,12 +3580,12 @@
        }
    }
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ð½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½"));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make image path End"));
}
void CSequenceProcessor_CPJT::SetSaveImageBasePathToAlignCameraControl(const CString& strGlassID)
{
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ð½ï¿½ ï¿½ï¿½ï¿½ï¿½ "));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading]  Make Align image path Start"));
    const CNetworkInfo *pNetworkInfo = m_pSP2P->ISP2P_System_GetNetworkInfo();
    if(pNetworkInfo == NULL) return;
@@ -3440,7 +3598,7 @@
        strPath.Format(_T("%s\\%s"), pNetworkInfo->m_strAlignImagePath, strGlassID);
        pAlignCameraControl->SetSaveImageBasePath(strPath);
    }
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½Ð½ï¿½ ï¿½ï¿½ "));
    m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::Loading] Make Align image path End "));
}
BOOL CSequenceProcessor_CPJT::ReadRecipeDataFromRecipeFile(const CString& strPPID_RC, CString& strRecipeName)// const CString& strPPID, CString& strRecipeName
@@ -3507,14 +3665,12 @@
{
    if(pGlassResult == NULL) return FALSE;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
    if (pRsRcpReviewInfo==NULL) return FALSE;
    // system info
    const CSystemInfo* pSystemInfo = m_pSP2P->ISP2P_System_GetSystemInfo();
    // ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½
    STransferData* pTransferData = m_pSP2P->ISP2P_GetCurrentTransferData();
    if (pTransferData==NULL) return FALSE;
    int nGlassTypeInfoIndex = 0;
@@ -3530,20 +3686,16 @@
    if (pGlassTypeInfo == NULL) return FALSE;
    m_pSP2P->ISP2P_DisplayMessage(_T("GlassTypeName : %s,GlassTypeIdx : %s"),pGlassTypeInfo->m_strGlassTypeName,pTransferData->strGlassScanSchedule);
    
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    const CMotorControlInfo *pMotorInfo = m_pSP2P->ISP2P_System_GetMotorInfo();
    // ï¿½ï¿½Ç¥ ï¿½ï¿½È¯ï¿½ï¿½
    CCoordCalibrator* pCoordCalibrator = m_pSP2P->ISP2P_GetCoordCalibrator();
    // ï¿½ï¿½Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pSystemInfo && pGlassTypeInfo && pMotorInfo && pCoordCalibrator)
    {
        // Get Direction        
        int nDirectionX = GetDirectionX(pGlassTypeInfo->m_nOriginDirection, pMotorInfo->GetOriginDirection());
        int nDirectionY = GetDirectionY(pGlassTypeInfo->m_nOriginDirection, pMotorInfo->GetOriginDirection());
        // ï¿½ï¿½Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        pCoordCalibrator->SetTransDirection(nDirectionX, nDirectionY);
        pCoordCalibrator->SetOriginMotorPosition(pGlassTypeInfo->m_dOriginMotorX, pGlassTypeInfo->m_dOriginMotorY);
        if (fabs(pGlassTypeInfo->m_dAlignAngle) > 0.0000001)
@@ -3552,7 +3704,6 @@
                pGlassTypeInfo->m_dFirstAlignGlassX, pGlassTypeInfo->m_dFirstAlignGlassY, pGlassTypeInfo->m_dAlignAngle);
        }
        // ï¿½Û¶ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        pGlassResult->SetGlassSize(pGlassTypeInfo->m_nGlassSizeX * 1000, pGlassTypeInfo->m_nGlassSizeY * 1000);
        pGlassResult->SetGlassOriginDirection(pGlassTypeInfo->m_nOriginDirection);
        pGlassResult->SetCornerCutDirection(pGlassTypeInfo->m_nCornerCutDirection);
@@ -3561,34 +3712,28 @@
        pGlassResult->SetCollisionDistanceX(int(pSystemInfo->m_dCollisionDistance*1000.));
    }
    // Align ï¿½ï¿½ï¿½ï¿½
    const CRsRcpAlignInfo* pRsRcpAlignInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpAlignInfo();
    // Align ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (pGlassTypeInfo && pRsRcpAlignInfo)
    {
        // Align ï¿½ï¿½Å© ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (�ȼ�, ï¿½ï¿½ï¿½ï¿½, ï¿½Û¶ï¿½ ï¿½ï¿½Ä¡)
        pGlassResult->m_AlignRecipe.m_nUseAlignPosMove        = pGlassTypeInfo->m_nUseAlignPosMove;
        // ï¿½È¼ï¿½ ï¿½ï¿½Ä¡
        pGlassResult->m_AlignRecipe.dOriginPixelX[0]        = pGlassTypeInfo->m_nFirstAlignFindPixelX;
        pGlassResult->m_AlignRecipe.dOriginPixelY[0]        = pGlassTypeInfo->m_nFirstAlignFindPixelY;
        pGlassResult->m_AlignRecipe.dOriginPixelX[1]        = pGlassTypeInfo->m_nSecondAlignFindPixelX;
        pGlassResult->m_AlignRecipe.dOriginPixelY[1]        = pGlassTypeInfo->m_nSecondAlignFindPixelY;
        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡
        pGlassResult->m_AlignRecipe.dOriginPositionX[0]        = pGlassTypeInfo->m_dFirstAlignMotorX;
        pGlassResult->m_AlignRecipe.dOriginPositionY[0]        = pGlassTypeInfo->m_dFirstAlignMotorY;
        pGlassResult->m_AlignRecipe.dOriginPositionX[1]        = pGlassTypeInfo->m_dSecondAlignMotorX;
        pGlassResult->m_AlignRecipe.dOriginPositionY[1]        = pGlassTypeInfo->m_dSecondAlignMotorY;
        // ï¿½Û¶ï¿½ ï¿½ï¿½Ä¡
        pGlassResult->m_AlignRecipe.dGlassPositionX[0]        = pGlassTypeInfo->m_dFirstAlignGlassX;
        pGlassResult->m_AlignRecipe.dGlassPositionY[0]        = pGlassTypeInfo->m_dFirstAlignGlassY;
        pGlassResult->m_AlignRecipe.dGlassPositionX[1]        = pGlassTypeInfo->m_dSecondAlignGlassX;
        pGlassResult->m_AlignRecipe.dGlassPositionY[1]        = pGlassTypeInfo->m_dSecondAlignGlassY;
        // Align Recipe ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½Ä¶ï¿½ï¿½ï¿½ï¿½
        // Align Recipe
        // Align Skip Mode
        pGlassResult->m_AlignRecipe.bAlignSkipMode        = pRsRcpAlignInfo->m_bAlignSkipMode;
        pGlassResult->m_AlignRecipe.bUseTotalPitchMeasure = pRsRcpAlignInfo->m_bTotalPitchMeasure;
@@ -3608,29 +3753,24 @@
        pGlassResult->m_AlignRecipe.nMergeRange            = pRsRcpAlignInfo->m_nMergeRange;
        pGlassResult->m_AlignRecipe.dEdgeRate            = pRsRcpAlignInfo->m_dEdgeRate;
        
        // ï¿½ï¿½ï¿½ï¿½Ã°ï¿½
        pGlassResult->m_AlignRecipe.bManualProcess            = pRsRcpAlignInfo->m_bManualProcess;
        pGlassResult->m_AlignRecipe.dFirstCamExposure        = pRsRcpAlignInfo->m_dFirstCamExposure;
        pGlassResult->m_AlignRecipe.dSecondCamExposure        = pRsRcpAlignInfo->m_dSecondCamExposure;
        // ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
        pGlassResult->m_AlignRecipe.bAutoProcess            = pRsRcpAlignInfo->m_bAutoProcess;
        pGlassResult->m_AlignRecipe.dTargetMin                = pRsRcpAlignInfo->m_dTargetMin;
        pGlassResult->m_AlignRecipe.dTargetMax                = pRsRcpAlignInfo->m_dTargetMax;
        pGlassResult->m_AlignRecipe.dExposureMin            = pRsRcpAlignInfo->m_dExposureMin;
        pGlassResult->m_AlignRecipe.dExposureMax            = pRsRcpAlignInfo->m_dExposureMax;
        // Align Recipe ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ rotate info
        pGlassResult->m_AlignRecipe.bRotateProcess            = pRsRcpAlignInfo->m_bRotateProcess;
        pGlassResult->m_AlignRecipe.nRetryCount                = pRsRcpAlignInfo->m_nRetryCount;
        pGlassResult->m_AlignRecipe.dGlassAngleMin            = pRsRcpAlignInfo->m_dGlassAngleMin;
        pGlassResult->m_AlignRecipe.dGlassAngleMax            = pRsRcpAlignInfo->m_dGlassAngleMax;
        // Align Ä«ï¿½Þ¶ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½Ø»ï¿½ ï¿½ï¿½ï¿½ï¿½
        int nAlignCameraInfoCount = 2;
        for(int nAlignCameraIdx = 0; nAlignCameraIdx < nAlignCameraInfoCount; nAlignCameraIdx++)
        {
            // Align ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
            int nLightValue = 0;
            
            
@@ -3638,10 +3778,8 @@
            {
                nLightValue = (nAlignCameraIdx==0) ? (int)pRsRcpAlignInfo->m_dFirstCamExposure: (int)pRsRcpAlignInfo->m_dSecondCamExposure;
                // ï¿½ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½Þ¶ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
                const CAlignCameraInfo *pCameraInfo = m_pSP2P->ISP2P_System_GetAlignCameraInfo(nAlignCameraIdx);
                 //����� ï¿½ï¿½ï¿½ï¿½.
                CLightControl *pLightControl = NULL;
                const CLightControlInfo *AlignLightinfo = pCameraInfo->GetLightContorlInfo();
@@ -3650,8 +3788,6 @@
                {
                    if (AlignLightinfo->GetMaster()==1&& nAlignCameraIdx==1)
                    {
                        //����� ï¿½ï¿½Æ²ï¿½Ñ·ï¿½ï¿½ï¿½ ï¿½Ï³ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ç¾ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î·ï¿½ È®ï¿½ï¿½
                        //������ ï¿½Ì°ï¿½ ï¿½Â´ï¿½ï¿½ï¿½ ï¿½ð¸£°Ù´ï¿½ ï¿½Æ¹ï¿½ï¿½ï¿½ ï¿½È¾Ë·ï¿½ï¿½ï¿½
                        pLightControl = m_pSP2P->ISP2P_GetAlignLightControl(0);
                    }
@@ -3685,8 +3821,6 @@
                }
            }
            
            // ï¿½ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½Þ¶ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
            const CAlignCameraInfo *pCameraInfo    = m_pSP2P->ISP2P_System_GetAlignCameraInfo(nAlignCameraIdx);
            if (pCameraInfo)
            {
@@ -3714,7 +3848,6 @@
                }
            }
            // ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ã¸ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
            if((int)pGlassTypeInfo->m_vecTemplateImagePath.size() == nAlignCameraInfoCount)
            {
                pGlassResult->m_AlignRecipe.strTemplateName[nAlignCameraIdx] = pGlassTypeInfo->m_vecTemplateImagePath[nAlignCameraIdx];
@@ -3743,14 +3876,13 @@
            if (pRcpReviewAFMInfo)
            {
                int nRealAFMIndex = pRcpReviewAFMInfo->m_nRecipeIndex;
                if(nRealAFMIndex == -1)// ï¿½ï¿½ï¿½ï¿½ï¿½Ç¿ï¿½ ï¿½ï¿½ï¿½Ãµï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ MagnificInfo Index�� ï¿½Ë¾Æ¿ï¿½
                if(nRealAFMIndex == -1)
                {
                    //-1�� ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½.
                    nRealAFMIndex = GetRealMagnification(nModuleIdx, pRcpReviewAFMInfo->m_nZoomIndex);
                }
                AFM_SetAFMRecipeName(nModuleIdx, strRecipeName, nRealAFMIndex);
                if(pRcpReviewAFMInfo->m_bAFMHomeOffMode==TRUE) //190618AFMȨ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ X
                if(pRcpReviewAFMInfo->m_bAFMHomeOffMode==TRUE) //190618AFM
                {
                    SetUseAfmHomePosition(FALSE);
                }
@@ -3762,7 +3894,6 @@
        }
    }
    // ï¿½ï¿½ï¿½ï¿½ Ã£ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    CReviewProcessor* pReviewProcessor = m_pSP2P->ISP2P_GetReviewProcessor();
    const CRsRcpDefectFindInfo* pRsRcpDefectFindInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpDefectFindInfo();
    if(pReviewProcessor && pRsRcpDefectFindInfo)
@@ -3813,7 +3944,6 @@
    CString strRawTDPath=_T(""), strRawCDPath=_T(""), strRawSDPath=_T("");
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ì¸ï¿½ Ã£ï¿½ï¿½
    FindAOIRawFilePath(pGlassResult, &strRawTDPath, &strRawCDPath, &strRawSDPath);
    bRet = m_pSP2P->ISP2P_ReadAOIRawFileToGlassResult(strRawTDPath);
@@ -3867,7 +3997,7 @@
        if(finder.IsDots()) continue;
        if(finder.IsDirectory()) continue;
        // [2017:5:16]-[WEZASW] : AOI Server�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ä¡ï¿½ï¿½ ï¿½ï¿½ï¿½Ô¸ï¿½ ï¿½Ì¹ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ï¸ï¿½ ï¿½ï¿½ï¿½ï¿½
        // [2017:5:16]-[WEZASW] : AOI Server
        sRawFile.strFileName = finder.GetFileName();
        strExtTemp = sRawFile.strFileName;
        int nIdx = strExtTemp.Remove('.');        
@@ -4045,7 +4175,6 @@
        CModuleStatus*                    pModuleStatus    = Module_GetModuleStatus(nModuleIdx);        
        if (pModuleStatus == NULL) continue;
        //�浹�Ÿ� ï¿½Ö±ï¿½
        {
        double dCollisionPosX = pReviewResult->GetCollisionPositionX() / 1000.0;
@@ -4086,13 +4215,12 @@
        }
        //�¿� ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ìµï¿½
        pMotorControl->GantrySetTwoGantrySyncModeSend(0);
        // set result index
        int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
        int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;        // End Index ï¿½Ù½Ã¼ï¿½ï¿½ï¿½
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;        // End Index
        double xpostemp, ypostemp;
        // get review pos
@@ -4102,7 +4230,7 @@
            SReviewResult* pReview = pReviewResult->GetSReviewResult(nResultIdx);
            if (pReview==NULL) continue;
            //200�� ï¿½ï¿½å·¹ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ßºï¿½Ã¼Å©
            //200
            if (pReview->bCheckSendToMotor == FALSE)
            {
                pReview->bCheckSendToMotor = TRUE;
@@ -4149,7 +4277,6 @@
            }
        }
        //���� ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ö´ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ã¼Å©
        if (vectorPosX.empty() ==TRUE)
        {
            g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point "), vectorPosX.size());
@@ -4181,13 +4308,11 @@
            int nTickCount = GetTickCount();
            while (1)
            {
                //5�� ï¿½ï¿½ï¿½ï¿½Å¸ï¿½ï¿½
                if ((GetTickCount() - nTickCount) > 5000)
                {
                    bOverTime = TRUE;
                    break;
                }
                //���� ï¿½ï¿½ï¿½ End Ã¼Å©
                if (pMotorControl->IsGantryMotionEnd(pModuleStatus->GetGantryIndex()) == TRUE)
                {
                    if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
@@ -4206,15 +4331,12 @@
            }
            //5���Ŀ��� ï¿½È¿ï¿½ï¿½ï¿½ï¿½Î´ï¿½? ï¿½×·ï¿½ 3�� ï¿½ï¿½Ãµï¿½ ï¿½ï¿½ï¿½ï¿½
            //���End ï¿½ï¿½ ï¿½ß¸ï¿½ ï¿½ï¿½ï¿½Ã¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
            if (bOverTime == TRUE)
            {
                for (int i = 0; i < 3; i++)
                {
                    Sleep(1000);
                    //���Ͱ� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ ï¿½ï¿½ï¿½Â»ï¿½ï¿½ï¿½ï¿½Ï¶ï¿½ Send ï¿½ï¿½È£ï¿½ï¿½ Fail ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ Retry 3�� ï¿½ï¿½ï¿½ï¿½
                    if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
                    {
                        nTotalCount += (int)vectorPosX.size();
@@ -4288,7 +4410,7 @@
    if(pGlassResult && pReviewProcessor)
    {
        // UserStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    //pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    //pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_UserStart, nPlanIndex);
@@ -4351,7 +4473,6 @@
        CModuleStatus*                    pModuleStatus = Module_GetModuleStatus(nModuleIdx);
        if (pModuleStatus == NULL) continue;
        //�浹�Ÿ� ï¿½Ö±ï¿½
        {
            double dCollisionPosX = pReviewResult->GetCollisionPositionX() / 1000.0;
@@ -4394,9 +4515,9 @@
        // set result index
        int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
        int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount() - 1)) + 1;        // End Index ï¿½Ù½Ã¼ï¿½ï¿½ï¿½
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount() - 1)) + 1;        // End Index
        // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
        // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
        double m_dMinOffset = -5.0;
        double m_dMaxOffset = 5.0;
        double xpostemp, ypostemp;
@@ -4407,7 +4528,7 @@
            SReviewResult* pReview = pReviewResult->GetSReviewResult(nResultIdx);
            if (pReview == NULL) continue;
            //200�� ï¿½ï¿½å·¹ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ßºï¿½Ã¼Å©
            //200
            if (pReview->bCheckSendToMotor == FALSE)
            {
                pReview->bCheckSendToMotor = TRUE;
@@ -4455,7 +4576,6 @@
            }
        }
        //���� ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ö´ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ã¼Å©
        if (vectorPosX.empty() == TRUE)
        {
            g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point "), vectorPosX.size());
@@ -4520,7 +4640,7 @@
    if(pGlassResult && pReviewProcessor)
    {
        // WsiStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIStart, nPlanIndex);
@@ -4533,7 +4653,7 @@
        MakeWSIUpLoadDirectory(pReviewProcessor->GetUploadImagePath());
        //20190219 chm 
        pReviewProcessor->SetReviewCount(0);            // ï¿½ï¿½ï¿½ï¿½ Sequence No ï¿½Ê±ï¿½È­.
        pReviewProcessor->SetReviewCount(0);
        return TRUE;
    }    
@@ -4546,7 +4666,7 @@
    strPath  = strPath + _T("\\WSI");
    if(CreateDirectory(strPath,NULL)==FALSE)
    {
        //LYW LOG�߰�
        //LYW LOG
        g_pLog->DisplayMessage(_T("[MakeWSIUpLoadDirectory]Directory Create Fail %s, ERROR CODE = %d "),strPath, GetLastError());
    }
    
@@ -4587,10 +4707,9 @@
    VectorDouble vectorCollisionPosX;
    vectorCollisionPosX.clear();
    //WSI ï¿½Â¿ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ìµï¿½
    //WSI
    pMotorControl->GantrySetTwoGantrySyncModeSend(1);
    
    // WSI result count
    for (int nModuleIdx = 0; nModuleIdx < Module_GetModuleStatusCount(); nModuleIdx++)
    {
@@ -4601,7 +4720,6 @@
        CModuleStatus*                    pModuleStatus = Module_GetModuleStatus(nModuleIdx);
        if (pModuleStatus == NULL) continue;
        //�浹�Ÿ� ï¿½Ö±ï¿½
        {
            double dCollisionPosX = pWsiResult->GetCollisionPositionX() / 1000.0;
            double dCollisionPosY = 0.0;
@@ -4636,14 +4754,13 @@
                return 0;
            }
        }
        // get result index
        int nStartIdx = pWsiResult->GetStartSReviewResultIndex();
        int nEndIdx = pWsiResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pWsiResult->GetSReviewResultCount() - 1)) + 1;        // set End Index 
        // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
        // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
        double m_dMinOffset = -5.0;
        double m_dMaxOffset = 5.0;
@@ -4655,7 +4772,7 @@
            SReviewResult* pWsi = pWsiResult->GetSReviewResult(nResultIdx);
            if (pWsi == NULL) continue;
            //200�� ï¿½ï¿½å·¹ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ï·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ßºï¿½Ã¼Å©
            //200
            if (pWsi->bCheckWSISendToMotor == FALSE)
            {
                pWsi->bCheckWSISendToMotor = TRUE;
@@ -4702,14 +4819,13 @@
            }
        }
        //���� ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ö´ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ã¼Å©
        if (vectorPosX.empty() == TRUE)
        {
            //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error ï¿½Ë¶ï¿½ ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¼ï¿½ ï¿½ï¿½ ï¿½ï¿½Ä¡ START
            //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error START
            g_pLog->DisplayMessage(_T("[GantryAutoGo] No Exist Send Point,TwoGantrySyncMode OFF!"), vectorPosX.size());
            g_pLog->DisplayMessage(_T("[GantryAutoGo] (%d)Gantry Path Send Fail"), pModuleStatus->GetGantryIndex()); //taek 210128
            pMotorControl->GantrySetTwoGantrySyncModeSend(0);
            //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error ï¿½Ë¶ï¿½ ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ð¼ï¿½ ï¿½ï¿½ ï¿½ï¿½Ä¡ END
            //3360 LYW_ CF AOI QD Review WSI XY MotorMoving Error END
        }
        else
        {
@@ -4733,13 +4849,12 @@
                int nTickCount = GetTickCount();
                while (1)
                {
                    //5�� ï¿½ï¿½ï¿½ï¿½Å¸ï¿½ï¿½
                    if ((GetTickCount() - nTickCount) > 5000)
                    {
                        bOverTime = TRUE;
                        break;
                    }
                    //���� ï¿½ï¿½ï¿½ End Ã¼Å©
                    //End Ã¼Å©
                    if (pMotorControl->IsGantryMotionEnd(pModuleStatus->GetGantryIndex()) == TRUE)
                    {
                        if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
@@ -4758,15 +4873,12 @@
                }
                //5���Ŀ��� ï¿½È¿ï¿½ï¿½ï¿½ï¿½Î´ï¿½? ï¿½×·ï¿½ 3�� ï¿½ï¿½Ãµï¿½ ï¿½ï¿½ï¿½ï¿½
                //���End ï¿½ï¿½ ï¿½ß¸ï¿½ ï¿½ï¿½ï¿½Ã¼ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
                if (bOverTime == TRUE)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        Sleep(1000);
                        //���Ͱ� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¼ï¿½ ï¿½ï¿½ï¿½Â»ï¿½ï¿½ï¿½ï¿½Ï¶ï¿½ Send ï¿½ï¿½È£ï¿½ï¿½ Fail ï¿½ß»ï¿½ ï¿½ï¿½ï¿½ï¿½ Retry 3�� ï¿½ï¿½ï¿½ï¿½
                        if (pMotorControl->GantryAutoGo(pModuleStatus->GetGantryIndex(), vectorPosX, vectorPosY, TRUE))
                        {
                            nTotalCount += (int)vectorPosX.size();
@@ -4901,9 +5013,9 @@
        // get result index
        int nStartIdx = pReviewResult->GetStartSReviewResultIndex();
        int nEndIdx = pReviewResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;        // End Index ï¿½Ù½Ã¼ï¿½ï¿½ï¿½
        nEndIdx = min(nEndIdx, (pReviewResult->GetSReviewResultCount()-1)) + 1;        // End Index
        // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
        // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
        double m_dMinOffset = -5.0; 
        double m_dMaxOffset = 5.0;
@@ -5005,7 +5117,7 @@
    if(pGlassResult && pReviewProcessor)
    {
        // MeasureStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_MeasureStart, nPlanIndex);
@@ -5080,7 +5192,7 @@
                const SCoordInfo* pCoordInfo = Module_GetCoordInfo(nModuleIdx);
                if(pCoordInfo == NULL) continue;    
                // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
                // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
                double m_dMinOffset = -5.0; 
                double m_dMaxOffset = 5.0;
@@ -5186,7 +5298,6 @@
    int nTotalCount = 0;
    double dDefectPosX, dDefectPosY;
    // Module�� ï¿½ï¿½Ä¡ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ModuleStatus sorting
    std::vector<CModuleStatus*> SortedModuleStatus;
    for(int nModuleIdx = 0; nModuleIdx < m_pSP2P->ISP2P_GetModuleStatusCount(); nModuleIdx++)
    {
@@ -5240,7 +5351,7 @@
                const SCoordInfo* pCoordInfo = Module_GetCoordInfo(pReviewResult->GetModuleIndex());
                if(pCoordInfo == NULL) continue;                
                // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
                // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
                double m_dMinOffset = -5.0; 
                double m_dMaxOffset = 5.0;
@@ -5261,7 +5372,6 @@
                if(nHeaderIdx == 0)
                {
                    // ï¿½Ìµï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¥ ï¿½ß°ï¿½
                    if((int)vectorPos.size() < MAX_MOTOR_ADDRESS_SIZE)
                    {
                        pSReviewResult->dTargetMotorX = dDefectPosX;
@@ -6095,7 +6205,6 @@
    
    nSchedulingCount = pReviewScheduler->PathScheduling(vecPathData, vecStartPathData);
    if (nSchedulingCount>0)
    {
        m_pSP2P->ISP2P_DisplayMessage(_T("[ReviewScheduler] CalculatePath"));
@@ -6529,8 +6638,6 @@
            // add user schedule result
            
            //�����޸𸮿� Ã¤ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ã¼ï¿½ï¿½ Ã¤ï¿½ï¿½ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½
            {
@@ -7245,7 +7352,6 @@
                break;
            }
            break;
        // ï¿½Ì»ï¿½ï¿½
        case CPJT_PlanMeasure:
            {
                const CRcpMeasureInfo *pRcpMeasureInfo = pRsRcpMeasureInfo->GetRcpMeasureInfo(0);
@@ -7378,7 +7484,7 @@
}
//CIM DV Data
BOOL CSequenceProcessor_CPJT::SendDVDataToSignalControl() // ï¿½ï¿½ï¿½ï¿½
BOOL CSequenceProcessor_CPJT::SendDVDataToSignalControl()
{
    CGlassResult *pGlassResult = m_pSP2P->ISP2P_GetCurrentGlassResult();
    if (pGlassResult==NULL) return FALSE;
@@ -7403,7 +7509,7 @@
}
int CSequenceProcessor_CPJT::MakeDVData(CGlassResult *pGlassResult, char* pDVData, int nIndex) // ï¿½ï¿½ï¿½ï¿½
int CSequenceProcessor_CPJT::MakeDVData(CGlassResult *pGlassResult, char* pDVData, int nIndex)
{
    g_pLog->DisplayMessage(_T("[SequenceProcessor] SendDVDataToSignalControl->MakeDVData IN."));
@@ -7412,16 +7518,16 @@
    const CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
    if (pRsRcpReviewInfo == NULL) return FALSE;
    // Review ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Review
    const CRcpLightInfo *pReviewLightInfo = pRsRcpReviewInfo->GetRcpLightInfo(nIndex);
    // Review AFM ï¿½ï¿½ï¿½ï¿½
    // Review AFM
    const CRcpAFMRecipeInfo *pReviewAFMInfo = pRsRcpReviewInfo->GetRcpAFMRecipeInfo(nIndex);
    // Review Align Info
    const CAlignResult*    pAlignResult = pGlassResult->GetAlignResult();
    // Review Defect Info
    const CReviewResult* pReviewResult = pGlassResult->GetReviewResult(nIndex);
    // Review ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Review
    const CModuleStatus* pModuleStatus = Module_GetModuleStatus(nIndex);
    const SMagnificInfo* pSMagnificInfo = pModuleStatus->GetMagnificInfo(pReviewAFMInfo->GetZoomIndex());
    CSignalControl* pSignalControl = m_pSP2P->ISP2P_GetSignalControl();
@@ -7443,12 +7549,12 @@
    // Write DVData Packet
    //_DVDataPack_B7_8ver DVDataPack;
    //**Review
    //INLINE  : 10��
    //TFE-OFF : 20��
    //Hcut : 50��
    //LAMI : 5��
    //INLINE  : 10
    //TFE-OFF : 20
    //Hcut : 50
    //LAMI : 5
    //**WSI
    //10�� ï¿½ï¿½ï¿½ï¿½
    //10
    ///////////////////////////////////////////////////////////////////////////
@@ -7495,8 +7601,8 @@
    //nAlignResult = 1;
    
    //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;//����
    //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;//����
    //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;
    //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;
    //nAlignResult00 = pAlignResult->dFindScore[0];
    //nAlignResult01 = pAlignResult->dFindScore[1];
@@ -7514,7 +7620,6 @@
        nAlignResult01 = 0;
    }
    //�Ŀ�?
    nReviewAliveCamera00 = ReviewCamera_GetReviewCameraControl(0)->GetConnected() * 1000;
    nReviewAliveCamera01 = ReviewCamera_GetReviewCameraControl(1)->GetConnected() * 1000;
@@ -7531,8 +7636,7 @@
    {
        wsprintf(DriveText, TEXT("%C:"), Drive);
        UINT type = GetDriveType(DriveText);
        if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
            // ï¿½Ïµï¿½ë·®
        if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
            ULARGE_INTEGER i64FreeBytesToCaller = { 0 }, i64TotalBytes = { 0 }, i64FreeBytes = { 0 };
            BOOL bRsult = GetDiskFreeSpaceEx(DriveText, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes);
            if (bRsult) {
@@ -7746,7 +7850,7 @@
    pSignalControl->WritePacketData(_T("15100"), sizeof(DVDataPack_CPJT), (short*)&DVData);*/
}
//#3358 KYH FDC ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
//#3358 KYH FDC ADD START
void CSequenceProcessor_CPJT::MakeDVData2()
{
@@ -7759,9 +7863,9 @@
    }
    else
    {
    // Review ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Review
        pReviewLightInfo = pRsRcpReviewInfo->GetRcpLightInfo(0);
    // Review AFM ï¿½ï¿½ï¿½ï¿½
    // Review AFM
        pReviewAFMInfo = pRsRcpReviewInfo->GetRcpAFMRecipeInfo(0);
    }
@@ -7785,7 +7889,7 @@
    // Review ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    // Review
    const CModuleStatus* pModuleStatus = Module_GetModuleStatus(0);
    const SMagnificInfo* pSMagnificInfo = NULL;
    if (pModuleStatus == NULL)
@@ -7887,8 +7991,8 @@
    //nAlignResult = 1;
    //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;//����
    //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;//����
    //nAlignResult00 = pAlignResult->nFindAlign[0] * 1000;
    //nAlignResult01 = pAlignResult->nFindAlign[1] * 1000;
    //nAlignResult00 = pAlignResult->dFindScore[0];
    //nAlignResult01 = pAlignResult->dFindScore[1];
@@ -7928,7 +8032,6 @@
        nAlignResult01 = 1000;
    }
    //�Ŀ�?
    if (ReviewCamera_GetReviewCameraControl(0) != NULL)
    {
        nReviewAliveCamera00 = ReviewCamera_GetReviewCameraControl(0)->GetConnected() * 1000;
@@ -7960,8 +8063,7 @@
    {
        wsprintf(DriveText, TEXT("%C:"), Drive);
        UINT type = GetDriveType(DriveText);
        if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
            // ï¿½Ïµï¿½ë·®
        if ((dwDrive & dwDriveCh) && (type == DRIVE_REMOVABLE || type == DRIVE_FIXED || type == DRIVE_RAMDISK)) {
            ULARGE_INTEGER i64FreeBytesToCaller = { 0 }, i64TotalBytes = { 0 }, i64FreeBytes = { 0 };
            BOOL bRsult = GetDiskFreeSpaceEx(DriveText, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes);
            if (bRsult) {
@@ -8008,7 +8110,7 @@
    return;
}
//#3358 KYH FDC ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
//#3358 KYH FDC  ADD END
DWORD CSequenceProcessor_CPJT::GetDiskUsage()
{
@@ -8046,7 +8148,7 @@
    BOOL bResult = FALSE;
    // PCControl D2300 (�˻� ï¿½ï¿½ï¿½ï¿½)
    // PCControl D2300
    switch(nSignalIndex)
    {
    case PCControlRecv_TimeChange:
@@ -8112,7 +8214,7 @@
         g_pLog->DisplayMessage(_T("[SequenceProcessor] Success! SetLocalTime(), Current: %04d-%02d-%02d %02d-%02d-%02d, Changed: %04d-%02d-%02d %02d-%02d-%02d"), 
            CurrentTime.wYear, CurrentTime.wMonth, CurrentTime.wDay, CurrentTime.wHour, CurrentTime.wMinute, CurrentTime.wSecond,
            ChangedTime.wYear, ChangedTime.wMonth, ChangedTime.wDay, ChangedTime.wHour, ChangedTime.wMinute, ChangedTime.wSecond);
        // AFM & WSI TIME ï¿½ï¿½ï¿½ï¿½È­
        // AFM & WSI TIME
        SendSystemTime(ChangedTime);
    } else {
         g_pLog->DisplayMessage(_T("[SequenceProcessor] Fail! SetLocalTime()"));
@@ -8139,7 +8241,7 @@
    return TRUE;
}
// Local System ï¿½ï¿½ï¿½ï¿½ ï¿½Ã°ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ã» ï¿½ï¿½Æ®ï¿½Ñ·ï¿½ï¿½ï¿½ ï¿½Ã°ï¿½ï¿½ï¿½ Ã³ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
// Local System
BOOL CSequenceProcessor_CPJT::SendSystemTime(SYSTEMTIME sysTime)
{
    SYSTEMTIME CurrentTime;
@@ -8286,7 +8388,7 @@
            case PCControlSend_Defoucs:
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Defoucs! => %d"),0);
                break;
            case PCControlSend_Diagnosis: // 0412 ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½È£ ï¿½ß°ï¿½
            case PCControlSend_Diagnosis: // 0412
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Diagnosis! => %d"), 0);
                break;
            }
@@ -8397,7 +8499,7 @@
            case PCControlSend_Defoucs:
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Defoucs! => %d"),0);
                break;
            case PCControlSend_Diagnosis: // 0412 ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½È£ ï¿½ß°ï¿½
            case PCControlSend_Diagnosis: // 0412
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Send] Diagnosis! => %d"), 0);
                break;
            }
@@ -8511,7 +8613,7 @@
            if (bResult==FALSE) m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Mode] Manual Mode Error!"));
            // lmk simul manual camera,motor stop
            //ReviewCamera_CameraControl(CameraControlStop);    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ß¸ï¿½ Ä«ï¿½Þ¶ï¿½ ï¿½Úµï¿½ ï¿½ï¿½Å¾
            //ReviewCamera_CameraControl(CameraControlStop);
            CMotorControl*  pMotorControl = m_pSP2P->ISP2P_GetMotorControl();
            if(pMotorControl)
                pMotorControl->CommonSetAutoStop();
@@ -8682,10 +8784,10 @@
            if (SetLocalTime(&sTime))
            {
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] ï¿½Ã°ï¿½ï¿½ï¿½ï¿½ï¿½È­ï¿½ï¿½ï¿½ï¿½ %s"), strtime);
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] TymeSync Success %s"), strtime);
            }
            else
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] ï¿½Ã°ï¿½ï¿½ï¿½ï¿½ï¿½È­ï¿½ï¿½ï¿½ï¿½ %s"), strtime);
                m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] TymeSync Fail %s"), strtime);
            //memcpy(&time, strTime, 2);
@@ -8700,14 +8802,22 @@
    break;
    case PCControlRecv_Autodiagnosis:
    {
        m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] Diagno start => %d"), bSignalOn);
        //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
        CSignalControl* pSignalControl = m_pSP2P->ISP2P_GetSignalControl();
        CString strDiagnosisMode;
        pSignalControl->ReadData(_T("11160"), 2, strDiagnosisMode);
        int nDiagnosisMode = atoi(strDiagnosisMode);
        //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
        m_pSP2P->ISP2P_DisplayMessage(_T("[PCControl_Signal] Diagno start => %d, DiagnosisMode => %d"), bSignalOn, nDiagnosisMode);
        if (bSignalOn) {
            bResult = SendSignalToSignalControl(PCControlSendSignalIndex_DiagnoAck, 0);
            
            m_pSP2P->ISP2P_GetDlgDiagnosis()->ShowWindow(SW_SHOW);
            
            m_pSP2P->ISP2P_GetDiagnosisManager()->RecvSignalToSignalControl(0, 0);
            m_pSP2P->ISP2P_GetDiagnosisManager()->RecvSignalToSignalControl(0, nDiagnosisMode);
        }
        //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
        else
            bResult = SendSignalOffToSignalControl(PCControlSendSignalIndex_DiagnoAck, 0);
@@ -8906,7 +9016,6 @@
    CReviewResult* pWsiMultiShotResult = pGlassResult->GetWsiMultiShotResult(nModuleIndex);
    if (pWsiMultiShotResult == NULL) goto RESULT_FAIL;
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Â´ï¿½.
    int nCurResultIdx = pWsiMultiShotResult->GetLastSReviewResultIndex() + 1; // last index + 1
    int nStartResultIdx = pWsiMultiShotResult->GetStartSReviewResultIndex();
    int nEndResultIdx = pWsiMultiShotResult->GetEndSReviewResultIndex();
@@ -8920,13 +9029,11 @@
    int        nMPosY = int(pPosition->dMotorPosY * 1000.0);
    double    dTime = (double)m_ProcessTimer.GetDurationMilliSecond();
    // ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ù¸ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
    if (measureResut.nResultIndex != nCurResultIdx)
    {
        goto RESULT_FAIL;
    }
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
    // measureResut
    if (pWsiMultiShotResult->GetSReviewResultCount() == 0) return;
@@ -8951,7 +9058,6 @@
    // set last result idx
    pWsiMultiShotResult->SetLastSReviewResultIndex(nCurResultIdx);
    // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ®ï¿½ï¿½ï¿½ï¿½ ï¿½Ô°ï¿½, WSI ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½...
    if (nCurResultIdx == nEndResultIdx && nCurResultIdx <= pWsiMultiShotResult->GetSReviewResultCount())
    {
        nStartResultIdx = nCurResultIdx + 1;
@@ -8962,8 +9068,7 @@
        pWsiMultiShotResult->SetStartSReviewResultIndex(nStartResultIdx);
        pWsiMultiShotResult->SetEndSReviewResultIndex(nEndResultIdx);
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000); // ï¿½ï¿½ï¿½ï¿½Ì´ï¿½ ï¿½Ê¼ï¿½ï¿½ï¿½. ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½.
        ::Sleep(3000);
    //    Process_RemainWsiPoint(nModuleIndex);
    }
@@ -9029,7 +9134,7 @@
    if(pGlassResult && pReviewProcessor)
    {
        // WsiStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIReflowStart, nPlanIndex);
@@ -9065,7 +9170,7 @@
    if(pGlassResult && pReviewProcessor)
    {
        // WsiStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIStart, nPlanIndex);
@@ -9092,7 +9197,6 @@
    WSIAllReadySignal(1);
    // send wsi start
    // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    if (!WSIMultiShotAllStartSignal())
    {
        g_pLog->DisplayMessage(_T("[WSI] WSI MultiShot Start Fail!!"));
@@ -9103,7 +9207,7 @@
    if (pGlassResult && pReviewProcessor)
    {
        // WsiStart
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID ï¿½ï¿½ï¿½ï¿½
        pReviewProcessor->SetJobID(pGlassResult->m_strJobID);    // pGlassResult->m_strGlassID -> pGlassResult->m_strJobID
        pReviewProcessor->SetOperID(pGlassResult->m_strOperID);
        m_pSP2P->ISP2P_UpdateReviewProcessStatus(ReviewProcessStatus_WSIMultiShotStart, nPlanIndex);
@@ -9166,7 +9270,7 @@
        int nEndIdx = pWsiResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pWsiResult->GetSReviewResultCount()-1)) + 1;        // set End Index 
        // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
        // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
        double m_dMinOffset = -5.0; 
        double m_dMaxOffset = 5.0;
@@ -9296,7 +9400,6 @@
        CModuleStatus*                    pModuleStatus    = Module_GetModuleStatus(nModuleIdx);        
        if (pModuleStatus == NULL) continue;
        //�浹�Ÿ� ï¿½Ö±ï¿½
        {
            double dCollisionPosX = pWsiUserResult->GetCollisionPositionX() / 1000.0;
            double dCollisionPosY = 0.0;
@@ -9339,7 +9442,7 @@
        int nEndIdx = pWsiUserResult->GetEndSReviewResultIndex();
        nEndIdx = min(nEndIdx, (pWsiUserResult->GetSReviewResultCount()-1)) + 1;        // set End Index 
        // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
        // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
        double m_dMinOffset = -5.0; 
        double m_dMaxOffset = 5.0;
@@ -9442,17 +9545,13 @@
            }
        
        }
        //������ ï¿½ï¿½ï¿½ï¿½
        pWsiMultiShotResult->GetVectorSReviewResult()->clear();
        int nResultCount = 0;
        if (m_vecSReviewResult.size()>0)
        {    
            //�����ٸ� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Å¶ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ö±ï¿½ ï¿½ï¿½ï¿½ï¿½
            for(int i=0; i< m_vecSReviewResult.size(); i++)
            {
                //������ ï¿½ï¿½ï¿½Ã¿ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½Ô·ï¿½ï¿½Ø¾ßµï¿½ ï¿½×°Í¸ï¿½Å­ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½!
                //������ WSI FOV 4���� ï¿½ï¿½ï¿½Ø¿ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
            {
                double dOringinX = m_vecSReviewResult[i].nUMOriginX;
                double dOringinY = m_vecSReviewResult[i].nUMOriginY;
@@ -9721,8 +9820,6 @@
        CModuleStatus*                    pModuleStatus = Module_GetModuleStatus(nModuleIdx);
        if (pModuleStatus == NULL) continue;
        //�浹�Ÿ� ï¿½Ö±ï¿½
        {
            double dCollisionPosX = pWsiMultiShotResult->GetCollisionPositionX() / 1000.0;
@@ -9750,7 +9847,7 @@
            int nEndIdx = pWsiMultiShotResult->GetEndSReviewResultIndex();
            nEndIdx = min(nEndIdx, (pWsiMultiShotResult->GetSReviewResultCount() - 1)) + 1;        // set End Index 
            // [2017:3:8]-[WEZASW] : CameraOffset ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ (-1~1 => -5~5)
            // [2017:3:8]-[WEZASW] : CameraOffset (-1~1 => -5~5)
            double m_dMinOffset = -5.0;
            double m_dMaxOffset = 5.0;
@@ -10191,7 +10288,7 @@
    CRsRcpReviewInfo* pRsRcpReviewInfo = m_pSP2P->ISP2P_Recipe_GetRsRcpReviewInfo();
    if(pRsRcpReviewInfo == NULL)    return FALSE;
    if(pRsRcpReviewInfo->GetRcpUserDefectInfoCount() < 1)    return TRUE;        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Ä«ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½Ù¸ï¿½ ï¿½Ñ¾î°¡ï¿½ï¿½
    if(pRsRcpReviewInfo->GetRcpUserDefectInfoCount() < 1)    return TRUE;
    double dCenterPosX, dCenterPosY;
    
@@ -10250,18 +10347,18 @@
    _grmGlassData* pSharedGlassData = pDitSharedGlassRaw->GetGlassData();
    if(pSharedGlassData == NULL) return FALSE;
    //pSharedGlassData->m_nUserReviewNum = 0; //���� ï¿½Þ¸ï¿½ User plan
    //pSharedGlassData->m_nUserReviewNum = 0; // User plan
    _grmDefectData* pSharedDefect;
    int nPointCount = pRecipeinfo->GetRcpUserDefectInfoCount(); // User ï¿½ï¿½Ç¥ ï¿½ï¿½ Ä«ï¿½ï¿½Æ®
    int nPointCount = pRecipeinfo->GetRcpUserDefectInfoCount();
    int nSharedDefectNum = pSharedGlassData->m_nDefectNum; // ï¿½ï¿½ï¿½ï¿½ ï¿½Ñ°ï¿½ï¿½ï¿½ User Idx ï¿½ï¿½ Ã¹ï¿½ï¿½Â° Index ï¿½ï¿½ ï¿½È´ï¿½
    int nStartIdx=nSharedDefectNum;// USER ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ IDX ï¿½Î¿ï¿½ï¿½Ï±ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    int nSharedDefectNum = pSharedGlassData->m_nDefectNum;
    int nStartIdx=nSharedDefectNum;
    CRcpPlanInfo* pRcpPlanInfo; // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    CRcpUserDefectInfo *pDefectInfo;// ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ defect ï¿½ï¿½ï¿½ï¿½
    CRcpPlanInfo* pRcpPlanInfo;
    CRcpUserDefectInfo *pDefectInfo;
    
    int nInsepectionType;// User Å¸ï¿½ï¿½ Reviewreflow = 0 wsiReflow =1; REV&WSI =2; WSIUSEr =3; USER =4;
    int nInsepectionType;// User Reviewreflow = 0 wsiReflow =1; REV&WSI =2; WSIUSEr =3; USER =4;
    int nCount = 0;
@@ -10325,7 +10422,7 @@
BOOL CSequenceProcessor_CPJT::CompareRevType(int nInsType,int nRevType)
{
    //Plan Å¸ï¿½Ô°ï¿½ InspectionMode ï¿½ï¿½
    //Plan InspectionMode
    if(nRevType == CPJT_PlanUser)
    {
      if(nInsType == USER) return TRUE;
@@ -10383,7 +10480,7 @@
    CString strMessage, strResultFilePath, strUploadResultFilePath, strLocalRawPath;
    CString    strUploadRawPath, strUploadImagePath, strAOIRawFileName, strAOIRawFilePath;
    //3-1. ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
    //3-1.
    m_pSP2P->ISP2P_SetReviewResultData(pGlassResult);
    strLocalRawPath        = pNetworkInfo->m_strLocalRawPath;
@@ -10410,7 +10507,7 @@
            if(strUploadRawPath.IsEmpty() == FALSE && strAOIRawFilePath.IsEmpty() == FALSE)
            {
                // [2017:5:16]-[WEZASW] : ï¿½ï¿½ï¿½ï¿½ PASS���� ï¿½ï¿½ï¿½ï¿½ ï¿½î¿µï¿½ï¿½ ï¿½ï¿½È²ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ AOI Server�� RAW ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Îµï¿½ ï¿½ï¿½ï¿½ï¿½.
                // [2017:5:16]-[WEZASW] :
                strUploadResultFilePath.Format(_T("%s\\%s"), strUploadRawPath, strAOIRawFileName);
                if(CopyFile(strResultFilePath, strUploadResultFilePath, FALSE))
@@ -10431,9 +10528,9 @@
    }
    // delete file of Glass direction
    DeleteFile(pNetworkInfo->m_strAOIRawPath + _T("\\") + pGlassResult->m_strJobID + _T("TD"));//pGlassResult->m_strGlassID -> m_StrJobID ï¿½ï¿½ï¿½ï¿½
    DeleteFile(pNetworkInfo->m_strAOIRawPath + _T("\\") + pGlassResult->m_strJobID + _T("TD"));//pGlassResult->m_strGlassID -> m_StrJobID
    // [2017:4:11]-[WEZASW] :CIM(DV Data) ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ ï¿½ß°ï¿½.
    // [2017:4:11]-[WEZASW] :CIM(DV Data)
    if (SendDVDataToSignalControl()==FALSE) 
    {
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewEnd] DV Data Send FAIL!"));            
@@ -10453,8 +10550,6 @@
BOOL CSequenceProcessor_CPJT::MoveReviewStartMotorPosition(CGlassResult* pGlassResult,int nReviewType)
{
    //Ȥ�ó� ï¿½ï¿½ï¿½Ï±ï¿½ï¿½ ï¿½ï¿½ï¿½Üµï¿½
    //���� ï¿½Ã·ï¿½ï¿½ï¿½ Ã¹ï¿½ï¿½Â° ï¿½ï¿½Ä¡ï¿½ï¿½ ï¿½Ìµï¿½
    
    double dDefectPosX,dDefectPosY = 0;
    
@@ -10518,7 +10613,7 @@
void CSequenceProcessor_CPJT::SendWsiErrorAlarm_CPJT(int Index) //190801 chm
{    
    //wsi ï¿½ï¿½ï¿½ï¿½ ï¿½Ë¶ï¿½
    //wsi
    if(Index==1)
    {
        g_pLog->DisplayMessage(_T("[SequenceProcessor_CPJT] WSI Alive Error!!!"));
@@ -10532,7 +10627,7 @@
void CSequenceProcessor_CPJT::SendWsiAlive_CPJT()//190801 chm
{
    //WSI Alive ï¿½ï¿½È£ ï¿½ï¿½ï¿½ï¿½
    //WSI Alive
    SetWSIAliveCheck(TRUE);
}
@@ -10558,7 +10653,7 @@
            if(bWsiAliveCheck ==FALSE){
                m_pCSPC->SendWsiErrorAlarm_CPJT(1);
            }
            bWsiAliveCheck=FALSE; //30�ʿ� ï¿½Ñ¹ï¿½ï¿½ï¿½ 0���� ï¿½Ê±ï¿½È­
            bWsiAliveCheck=FALSE;
        }
    }
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.h
@@ -412,7 +412,6 @@
    BOOL                m_nGlassCountCheck;
    BOOL                m_bUseAFMHomePosition;
    
    DWORD dwRevStartTickCount;
    DWORD dwRevEndTickCount;
ReviewSystem/ReviewSystem/resource.h
@@ -87,6 +87,7 @@
#define IDC_BUTTON_UI_LEFT              1004
#define IDC_CHECK_OFFSET_MODE           1004
#define IDC_IMAGE_ROTATION              1004
#define IDC_CHECK_SELF_DIAGNOSIS_FLATNESS_SKIP 1004
#define IDC_SLIDER1                     1005
#define IDC_SLIDER_LIGHT_LEVEL          1005
#define IDC_RADIO_MAP_TYPE_0            1005
@@ -110,6 +111,7 @@
#define IDC_BUTTON_LEFT                 1008
#define IDC_BUTTON_APPLT_OFFSET         1008
#define IDC_BUTTON_PROGRAMEXIT          1008
#define IDC_BUTTON_ALIGNCAM_GRAB        1008
#define IDC_SPIN2                       1009
#define IDC_CHECK_REVIEW_PATH2          1009
#define IDC_CHECK_AUTO_SELECT_CAMERA    1009
@@ -251,31 +253,45 @@
#define IDC_EDIT4                       1088
#define IDC_EDIT_PANEL_COUNT_SQUARENESS 1089
#define IDC_EDIT_SCAN_COUNT             1089
#define IDC_EDIT_WSI_HEIGHT4            1089
#define IDC_BUTTON_GLASS_GO_XY          1090
#define IDC_EDIT_REVIEW_CAMCOUNT        1090
#define IDC_EDIT_WSI_HEIGHT5            1090
#define IDC_BUTTON_TEST1                1091
#define IDC_KEY_JOD_MOVE                1091
#define IDC_EDIT_JUDGE_DATA_Z_RANGE     1091
#define IDC_EDIT16                      1091
#define IDC_EDIT_SETTINGFILE_PATH       1091
#define IDC_EDIT_WSI_HEIGHT6            1091
#define IDC_BUTTON_GLASS_GO_XY3         1092
#define IDC_BUTTON_TEST2                1092
#define IDC_EDIT_XPOS_COUNT             1092
#define IDC_EDIT_WSI_HEIGHT7            1092
#define IDC_CHECK_AFM_TRACK             1093
#define IDC_EDIT_RANGE_COUNT_FLATNESS   1093
#define IDC_EDIT_WSI_HEIGHT8            1093
#define IDC_BUTTON_GLASS_GO_XY2         1094
#define IDC_BUTTON_GLASSCENTER_GO_XY    1094
#define IDC_EDIT_GLASS_SIZE_X           1094
#define IDC_EDIT_WSI_HEIGHT9            1094
#define IDC_EDIT_GLASS_SIZE_Y           1095
#define IDC_EDIT_WSI_HEIGHT10           1095
#define IDC_EDIT_PANEL_COUNT_WSI        1096
#define IDC_EDIT_WSI_HEIGHT14           1096
#define IDC_EDIT_JUDGE_DATA_3SIGMA      1097
#define IDC_EDIT_WSI_HEIGHT15           1097
#define IDC_EDIT_WSI_PANEL_POS_X        1098
#define IDC_EDIT_WSI_HEIGHT16           1098
#define IDC_EDIT_WSI_PANEL_POS_Y        1099
#define IDC_EDIT_WSI_HEIGHT17           1099
#define IDC_STATIC_JOG_SPEED            1100
#define IDC_EDIT_WSI_PANEL_POS_X2       1100
#define IDC_EDIT_WSI_HEIGHT18           1100
#define IDC_STATIC_LIGHT_LEVEL          1101
#define IDC_EDIT_WSI_PANEL_POS_Y2       1101
#define IDC_EDIT_WSI_HEIGHT19           1101
#define IDC_EDIT_REVIEW_PANEL_POS_X     1102
#define IDC_EDIT_WSI_HEIGHT20           1102
#define IDC_EDIT_REVIEW_PANEL_POS_Y     1103
#define IDC_RADIO_ZOOM_LEVEL_4          1104
#define IDC_EDIT_REVIEW_PANEL_POS_X2    1104
@@ -352,6 +368,7 @@
#define IDC_EDIT_GANTRY_THETA           1142
#define IDC_GRID_GANTRY_DATA_HISTORY    1143
#define IDC_EDIT_MODULE_COUNT           1144
#define IDC_EDIT_GANTRY_THETA2          1144
#define IDC_EDIT_GANTRY_MOTOR_X         1145
#define IDC_GRID_WSI_RESULT_DATA        1145
#define IDC_EDIT_GANTRY_MOTOR_Y         1146
@@ -376,20 +393,45 @@
#define IDC_EDIT_GANTRY_PIXEL_Y3        1156
#define IDC_EDIT_CHANGE_TARGET_XPOS     1156
#define IDC_EDIT_CHANGE_TARGET_YPOS     1157
#define IDC_EDIT_GANTRY_MOTOR_X4        1157
#define IDC_BUTTON5                     1158
#define IDC_EDIT_GANTRY_MOTOR_Y4        1158
#define IDC_EDIT_OFFSET_Y_VALUE         1159
#define IDC_EDIT_GANTRY_PIXEL_X4        1159
#define IDC_EDIT_CAMERA_COUNT           1160
#define IDC_EDIT_GANTRY_PIXEL_Y4        1160
#define IDC_PROGRESS_PROCESS            1161
#define IDC_EDIT_GANTRY_MOTOR_X5        1161
#define IDC_EDIT_MOTOR_XPOS             1162
#define IDC_EDIT_GANTRY_MOTOR_Y5        1162
#define IDC_EDIT_MOTOR_YPOS             1163
#define IDC_EDIT_GANTRY_PIXEL_X5        1163
#define IDC_BUTTON6                     1164
#define IDC_EDIT_GANTRY_PIXEL_Y5        1164
#define IDC_TAB_HISTORY_CONTROL         1165
#define IDC_EDIT_GANTRY_MOTOR_X6        1165
#define IDC_LIST_HISTORY_DEFECT         1166
#define IDC_EDIT_GANTRY_MOTOR_Y6        1166
#define IDC_EDIT_GANTRY_PIXEL_X6        1167
#define IDC_STATIC_MAP                  1168
#define IDC_EDIT_GANTRY_PIXEL_Y6        1168
#define IDC_GRID_ALIGN_ORIGIN_INFO      1170
#define IDC_GRID_ALIGN_HISTORY_INFO     1171
#define IDC_ALIGN_GRID_ORIGIN_INFO      1173
#define IDC_ALIGN_GRID_ALIGN_INFO       1174
#define IDC_EDIT_SQUARENESS_STANDARD    1175
#define IDC_EDIT_WSI_STANDARD           1176
#define IDC_EDIT_SQUARENESS_FIRSTSETTING 1176
#define IDC_EDIT_WSI_FIRST_STANDARD     1177
#define IDC_EDIT_SQUARENESS_STANDARD2   1177
#define IDC_EDIT_SQUARENESS_FIRSTSETTING2 1177
#define IDC_EDIT_WSI_HEIGHT1            1178
#define IDC_EDIT_WSI_HEIGHT2            1179
#define IDC_EDIT_WSI_HEIGHT3            1180
#define IDC_EDIT_WSI_HEIGHT11           1181
#define IDC_EDIT_WSI_HEIGHT12           1182
#define IDC_EDIT_WSI_HEIGHT13           1183
#define IDC_LIST_WSI_DIAGNOSIS_RESULT   1184
#define ID_INS_HOOK                     32772
#define ID_UNINS_HOOK                   32773
@@ -399,7 +441,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        381
#define _APS_NEXT_COMMAND_VALUE         32775
#define _APS_NEXT_CONTROL_VALUE         1175
#define _APS_NEXT_CONTROL_VALUE         1185
#define _APS_NEXT_SYMED_VALUE           346
#endif
#endif
ReviewSystem/ReviewSystem/stdafx.h
@@ -38,6 +38,9 @@
#include "CHReviewResult/GlassResult.h"
#include "CHReviewSetting/MotorParameter.h"
#include <DbgHelp.h>
#pragma comment ( lib, "DbgHelp" )
#include <WinNetWk.h>
//#pragma comment(lib,"Mpr.lib")
@@ -74,19 +77,33 @@
#define ID_TIMER_SEND_SIGNAL_ALIVE            (WM_USER + 107)
#define _REVIEW_SERVER_BASE_PATH_                    _T("C:\\DIT_Review")
#define _REVIEW_SERVER_LOG_PATH_                    _T("C:\\DIT_Review\\ReviewServerLog")
#define _REVIEW_RECIPE_PATH_                        _T("C:\\DIT_Review\\Recipe")
#define _REVIEW_REF_RECIPE_PATH_                    _T("C:\\DIT_Review\\Recipe\\Reference")
#define _REVIEW_SERVER_CONFIG_PATH_                    _T("C:\\DIT_Review\\ReviewServerConfig")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _REVIEW_SERVER_BASE_PATH_                    _T("D:\\DIT_Review") //210805
#define _REVIEW_SERVER_LOG_PATH_                    _T("D:\\DIT_Review\\ReviewServerLog")
#define _REVIEW_RECIPE_PATH_                        _T("D:\\DIT_Review\\Recipe")
#define _REVIEW_REF_RECIPE_PATH_                    _T("D:\\DIT_Review\\Recipe\\Reference")
#define _REVIEW_SERVER_CONFIG_PATH_                    _T("D:\\DIT_Review\\ReviewServerConfig")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("D:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _SYSTEM_SETTING_TITLE_                        _T("ReviewSystemSetting")
#define _RECIPE_EDITOR_TITLE_                        _T("ReviewRecipeEditor")
#define _REVIEW_LOGIN_LOG_PATH_                        _T("C:\\DIT_Review\\ReviewServerLog\\LoginLog")
#define _REVIEW_REFLOW_RECIPE_PATH_                    _T("C:\\DIT_Review\\Recipe\\Reflow")
#define ALIGN_TEMPLATE_PATH                            _T("C:\\DIT_Review\\Recipe\\AlignImage")
#define _REVIEW_LOGIN_LOG_PATH_                        _T("D:\\DIT_Review\\ReviewServerLog\\LoginLog")
#define _REVIEW_REFLOW_RECIPE_PATH_                    _T("D:\\DIT_Review\\Recipe\\Reflow")
#define ALIGN_TEMPLATE_PATH                            _T("D:\\DIT_Review\\Recipe\\AlignImage")
#define _REVIEW_RECIPE_BACKUP_PATH_CPJT                _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe")
#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT    _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
//#define _REVIEW_SERVER_BASE_PATH_                    _T("C:\\DIT_Review")
//#define _REVIEW_SERVER_LOG_PATH_                    _T("C:\\DIT_Review\\ReviewServerLog")
//#define _REVIEW_RECIPE_PATH_                        _T("C:\\DIT_Review\\Recipe")
//#define _REVIEW_REF_RECIPE_PATH_                    _T("C:\\DIT_Review\\Recipe\\Reference")
//#define _REVIEW_SERVER_CONFIG_PATH_                    _T("C:\\DIT_Review\\ReviewServerConfig")
//#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
//#define _SYSTEM_SETTING_TITLE_                        _T("ReviewSystemSetting")
//#define _RECIPE_EDITOR_TITLE_                        _T("ReviewRecipeEditor")
//#define _REVIEW_LOGIN_LOG_PATH_                        _T("C:\\DIT_Review\\ReviewServerLog\\LoginLog")
//#define _REVIEW_REFLOW_RECIPE_PATH_                    _T("C:\\DIT_Review\\Recipe\\Reflow")
//#define ALIGN_TEMPLATE_PATH                            _T("C:\\DIT_Review\\Recipe\\AlignImage")
//#define _REVIEW_RECIPE_BACKUP_PATH_CPJT                _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe")
//#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT    _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
#define TOTAL_WINDOW_SIZE_X        1920
@@ -403,4 +420,30 @@
    char            strMessageString[MAX_PATH];
};
BOOL KillProcess(CString ProcessName);BOOL getStateProcess(CString ProcessName);
BOOL KillProcess(CString ProcessName);BOOL getStateProcess(CString ProcessName);
// ì„ ì–¸
static LONG CALLBACK TopLevelExceptionFilterCallBack(EXCEPTION_POINTERS* exceptionInfo);
LONG CALLBACK TopLevelExceptionFilterCallBack(EXCEPTION_POINTERS * exceptionInfo)
{
    MINIDUMP_EXCEPTION_INFORMATION dmpInfo = { 0 };
    dmpInfo.ThreadId = ::GetCurrentThreadId(); // Threae ID
    dmpInfo.ExceptionPointers = exceptionInfo; // Exception Info
    dmpInfo.ClientPointers = FALSE;
    CTime time;
    CString strStamp;
    SYSTEMTIME   currentTime;
    ::GetLocalTime(&currentTime);
    time = CTime::GetCurrentTime();
    strStamp.Format(_T("Dump\\%02d_%02d_%02d_%02d_%02d_%02d.dmp"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
    HANDLE hFile = CreateFile(strStamp, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    // ë¤í”„ ìƒì„±
    BOOL bWrite = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &dmpInfo, NULL, NULL);
    return 0L;
}
ReviewSystem/ReviewSystemSetting/DlgSignal.cpp
@@ -25,6 +25,8 @@
    , m_nSignalReviewStartDelay(0)
    , m_nSignalReviewEndDelay(0)
    , m_nSignalUnloadingDelay(0)
    , m_nSignalDefocusValueMin(0)
    , m_nSignalDefocusValueMax(0)
{
    m_pDlgSignalReadData = NULL;
    m_pDlgSignalWriteData = NULL;
@@ -95,6 +97,8 @@
    DDX_Text(pDX, IDC_EDIT_SYS_SIGNAL_REVIEWSTART_DELAY, m_nSignalReviewStartDelay);
    DDX_Text(pDX, IDC_EDIT_SYS_SIGNAL_REVIEWEND_DELAY, m_nSignalReviewEndDelay);
    DDX_Text(pDX, IDC_EDIT_SYS_SIGNAL_UNLOADING_DELAY, m_nSignalUnloadingDelay);
    DDX_Text(pDX, IDC_EDIT_DEFOCUSVALUE_MIN, m_nSignalDefocusValueMin);
    DDX_Text(pDX, IDC_EDIT_DEFOCUSVALUE_MAX, m_nSignalDefocusValueMax);
}
@@ -114,6 +118,7 @@
    // TODO:  ì—¬ê¸°ì— ì¶”ê°€ ì´ˆê¸°í™” ìž‘업을 ì¶”가합니다.
    int nSignalConnectionType = -1, nSignalPort = -1, nSignalPeriodTime = -1, nTimerTime = 0, nTotalTime = 0;
    int nLoadingDelay = 0, nAlignStartDelay = 0, nAlignEndDelay = 0, nReviewStartDelay = 0, nReviewEndDelay = 0, nUnloadingDelay = 0;
    int nDefocusValueMin = 0, nDefocusValueMax = 0;
    CString strTemp = _T(""), strSignalReceiveAddress = _T(""), strSignalSendAddress = _T("");
    CReviewSystemSettingDlg* pDlg = (CReviewSystemSettingDlg*)AfxGetMainWnd();
@@ -127,6 +132,8 @@
//             strSignalReceiveAddress        = pSignalInfo->GetReadSignalAddress(0);
//             strSignalSendAddress        = pSignalInfo->GetSendSignalAddress(0);
            nSignalPeriodTime            = pSignalInfo->GetMSPeriod();
            nDefocusValueMin            = pSignalInfo->GetDefocusValueMin();
            nDefocusValueMax            = pSignalInfo->GetDefocusValueMax();
            nLoadingDelay                = pSignalInfo->GetMSLoadingSignalDelay();
            nAlignStartDelay            = pSignalInfo->GetMSAlignStartSignalDelay();
            nAlignEndDelay                = pSignalInfo->GetMSAlignEndSignalDelay();
@@ -180,6 +187,8 @@
    m_strSendAddress = strSignalSendAddress;
    m_nSignalPeriod = nSignalPeriodTime;
    m_nSignalDefocusValueMin = nDefocusValueMin;
    m_nSignalDefocusValueMax = nDefocusValueMax;
    m_nSignalLodingDelay = nLoadingDelay;
    m_nSignalAlignStartDelay = nAlignStartDelay;
    m_nSignalAlignEndDelay = nAlignEndDelay;
@@ -275,6 +284,8 @@
    m_nSignalReviewStartDelay = 0;
    m_nSignalReviewEndDelay = 0;
    m_nSignalUnloadingDelay = 0;
    m_nSignalDefocusValueMin = 0;
    m_nSignalDefocusValueMax = 0;
    m_nTimerTime = 0;
    m_nTotalTime = 0;
@@ -298,6 +309,8 @@
    pSignalInfo->SetReadSignalAddress(m_strReceiveAddress);
    pSignalInfo->SetSendSignalAddress(m_strSendAddress);
    pSignalInfo->SetMSPeriod(m_nSignalPeriod);
    pSignalInfo->SetDefocusValueMin(m_nSignalDefocusValueMin);
    pSignalInfo->SetDefocusValueMax(m_nSignalDefocusValueMax);
    pSignalInfo->SetMSLodingSignalDelay(m_nSignalLodingDelay);
    pSignalInfo->SetMSAlignStartSignalDelay(m_nSignalAlignStartDelay);
    pSignalInfo->SetMSAlignEndSignalDelay(m_nSignalAlignEndDelay);
ReviewSystem/ReviewSystemSetting/DlgSignal.h
@@ -65,4 +65,6 @@
    int m_nSignalReviewStartDelay;
    int m_nSignalReviewEndDelay;
    int m_nSignalUnloadingDelay;
    int m_nSignalDefocusValueMin;
    int m_nSignalDefocusValueMax;
};
ReviewSystem/ReviewSystemSetting/ReviewSystemSetting.rc
@@ -141,6 +141,10 @@
    RTEXT           "Unloading Signal Delay :",IDC_STATIC,178,94,93,14,SS_CENTERIMAGE
    EDITTEXT        IDC_EDIT_SYS_SIGNAL_UNLOADING_DELAY,276,92,70,14,ES_AUTOHSCROLL
    LTEXT           "ms",IDC_STATIC,348,95,14,12,SS_CENTERIMAGE
    RTEXT           "DefocusValue :",IDC_STATIC,24,111,48,14,SS_CENTERIMAGE
    EDITTEXT        IDC_EDIT_DEFOCUSVALUE_MIN,77,111,24,13,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_DEFOCUSVALUE_MAX,122,110,23,13,ES_AUTOHSCROLL
    RTEXT           "~",IDC_STATIC,107,109,8,14,SS_CENTERIMAGE
END
IDD_DIALOG_SYS_SETTING_SIGNAL_READ_DATA DIALOGEX 0, 0, 416, 342
@@ -746,6 +750,11 @@
    0
END
IDD_DIALOG_SYS_SETTING_SIGNAL AFX_DIALOG_LAYOUT
BEGIN
    0
END
/////////////////////////////////////////////////////////////////////////////
//
ReviewSystem/ReviewSystemSetting/ReviewSystemSettingDlg.cpp
@@ -1,5 +1,5 @@
// ReviewSystemSettingDlg.cpp : êµ¬í˜„ íŒŒì¼
// ReviewSystemSettingDlg.cpp : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
//
#include "stdafx.h"
@@ -31,20 +31,20 @@
#endif
// ì‘ìš© í”„로그램 ì •보에 ì‚¬ìš©ë˜ëŠ” CAboutDlg ëŒ€í™” ìƒìžìž…니다.
// ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Ç´ï¿½ CAboutDlg ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
class CAboutDlg : public CDialog
{
public:
    CAboutDlg();
// ëŒ€í™” ìƒìž ë°ì´í„°ìž…니다.
// ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
    enum { IDD = IDD_ABOUTBOX };
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ì§€ì›ìž…니다.
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
// êµ¬í˜„입니다.
// ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
protected:
    DECLARE_MESSAGE_MAP()
};
@@ -62,7 +62,7 @@
END_MESSAGE_MAP()
// CReviewSystemSettingDlg ëŒ€í™” ìƒìž
// CReviewSystemSettingDlg ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½
@@ -87,7 +87,8 @@
    m_pNetworkManager = NULL;
    // init Log 
    new CDisplayMessage(_T("C:\\DIT_Review\\ReviewServerConfig\\Log"));
    //new CDisplayMessage(_T("C:\\DIT_Review\\ReviewServerConfig\\Log"));
    new CDisplayMessage(_T("D:\\DIT_Review\\ReviewServerConfig\\Log"));//210805
}
CReviewSystemSettingDlg::~CReviewSystemSettingDlg()
@@ -185,15 +186,15 @@
END_MESSAGE_MAP()
// CReviewSystemSettingDlg ë©”시지 ì²˜ë¦¬ê¸°
// CReviewSystemSettingDlg ï¿½Þ½ï¿½ï¿½ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½
BOOL CReviewSystemSettingDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    // ì‹œìŠ¤í…œ ë©”뉴에 "정보..." ë©”뉴 í•­ëª©ì„ ì¶”가합니다.
    // ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½Þ´ï¿½ï¿½ï¿½ "����..." ï¿½Þ´ï¿½ ï¿½×¸ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    // IDM_ABOUTBOX는 ì‹œìŠ¤í…œ ëª…ë ¹ ë²”위에 ìžˆì–´ì•¼ í•©ë‹ˆë‹¤.
    // IDM_ABOUTBOX�� ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ö¾ï¿½ï¿½ ï¿½Õ´Ï´ï¿½.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);
@@ -211,12 +212,12 @@
        }
    }
    // ì´ ëŒ€í™” ìƒìžì˜ ì•„이콘을 ì„¤ì •합니다. ì‘ìš© í”„로그램의 ì£¼ ì°½ì´ ëŒ€í™” ìƒìžê°€ ì•„닐 ê²½ìš°ì—ëŠ”
    //  í”„레임워크가 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
    SetIcon(m_hIcon, TRUE);            // í° ì•„이콘을 ì„¤ì •합니다.
    SetIcon(m_hIcon, FALSE);        // ìž‘은 ì•„이콘을 ì„¤ì •합니다.
    // ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Æ´ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
    //  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, TRUE);            // Å« ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    SetIcon(m_hIcon, FALSE);        // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    // TODO: ì—¬ê¸°ì— ì¶”ê°€ ì´ˆê¸°í™” ìž‘업을 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ß°ï¿½ ï¿½Ê±ï¿½È­ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    CreateReviewDirectory();
    CreateManager();
    ReadReviewSystemConfigFile();
@@ -225,7 +226,7 @@
    g_pLog->DisplayMessage(_T("SystemSetting is Started!"));
    return TRUE;  // í¬ì»¤ìŠ¤ë¥¼ ì»¨íŠ¸ë¡¤ì— ì„¤ì •하지 ì•Šìœ¼ë©´ TRUE를 ë°˜í™˜í•©ë‹ˆë‹¤.
    return TRUE;  // ï¿½ï¿½Ä¿ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ TRUE�� ï¿½ï¿½È¯ï¿½Õ´Ï´ï¿½.
}
void CReviewSystemSettingDlg::OnSysCommand(UINT nID, LPARAM lParam)
@@ -241,19 +242,19 @@
    }
}
// ëŒ€í™” ìƒìžì— ìµœì†Œí™” ë‹¨ì¶”를 ì¶”가할 ê²½ìš° ì•„이콘을 ê·¸ë¦¬ë ¤ë©´
//  ì•„래 ì½”드가 í•„요합니다. ë¬¸ì„œ/ë·° ëª¨ë¸ì„ ì‚¬ìš©í•˜ëŠ” MFC ì‘ìš© í”„로그램의 ê²½ìš°ì—ëŠ”
//  í”„레임워크에서 ì´ ìž‘업을 ìžë™ìœ¼ë¡œ ìˆ˜í–‰í•©ë‹ˆë‹¤.
// ï¿½ï¿½È­ ï¿½ï¿½ï¿½Ú¿ï¿½ ï¿½Ö¼ï¿½È­ ï¿½ï¿½ï¿½ß¸ï¿½ ï¿½ß°ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½ï¿½ï¿½ï¿½
//  ï¿½Æ·ï¿½ ï¿½Úµå°¡ ï¿½Ê¿ï¿½ï¿½Õ´Ï´ï¿½. ï¿½ï¿½ï¿½ï¿½/�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ì¿¡ï¿½ï¿½
//  ï¿½ï¿½ï¿½ï¿½ï¿½Ó¿ï¿½Å©ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½Û¾ï¿½ï¿½ï¿½ ï¿½Úµï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
void CReviewSystemSettingDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // ê·¸ë¦¬ê¸°ë¥¼ ìœ„한 ë””바이스 ì»¨í…ìŠ¤íŠ¸
        CPaintDC dc(this); // ï¿½×¸ï¿½ï¿½â¸¦ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ì½ï¿½ ï¿½ï¿½ï¿½Ø½ï¿½Æ®
        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
        // í´ë¼ì´ì–¸íЏ ì‚¬ê°í˜•에서 ì•„이콘을 ê°€ìš´ë°ì— ë§žì¶¥ë‹ˆë‹¤.
        // Å¬ï¿½ï¿½ï¿½Ì¾ï¿½Æ® ï¿½ç°¢ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½îµ¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ï´ï¿½.
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
@@ -261,7 +262,7 @@
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;
        // ì•„이콘을 ê·¸ë¦½ë‹ˆë‹¤.
        // ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½×¸ï¿½ï¿½Ï´ï¿½.
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
@@ -270,8 +271,8 @@
    }
}
// ì‚¬ìš©ìžê°€ ìµœì†Œí™”된 ì°½ì„ ë„는 ë™ì•ˆì— ì»¤ì„œê°€ í‘œì‹œë˜ë„록 ì‹œìŠ¤í…œì—ì„œ
//  ì´ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí•©ë‹ˆë‹¤.
// ï¿½ï¿½ï¿½ï¿½Ú°ï¿½ ï¿½Ö¼ï¿½È­ï¿½ï¿½ Ã¢ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½È¿ï¿½ Ä¿ï¿½ï¿½ï¿½ï¿½ Ç¥ï¿½ÃµÇµï¿½ï¿½ï¿½ ï¿½Ã½ï¿½ï¿½Û¿ï¿½ï¿½ï¿½
//  ï¿½ï¿½ ï¿½Ô¼ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
HCURSOR CReviewSystemSettingDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
@@ -280,7 +281,7 @@
void CReviewSystemSettingDlg::OnTcnSelchangeTabSysSettingMainTab(NMHDR *pNMHDR, LRESULT *pResult)
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    SystemMainTab nTabIdx;
    nTabIdx = (SystemMainTab)m_ctrlTabMain.GetCurSel();
@@ -397,12 +398,12 @@
void CReviewSystemSettingDlg::InitTabControl()
{
    int nIdx = 0;
    m_ctrlTabMain.InsertItem(nIdx++, _T("Equipment Setting"));//_T("장비 ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Glass Type Setting"));//_T("글라스 íƒ€ìž… ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Align Setting"));//_T("얼라인 ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Signal Setting"));//_T("Signal ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Motor Setting"));//_T("모터 ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Network Setting"));//_T("네트워크 ì„¤ì •"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Equipment Setting"));//_T("��� ï¿½ï¿½ï¿½ï¿½"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Glass Type Setting"));//_T("�۶� Å¸ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Align Setting"));//_T("����� ï¿½ï¿½ï¿½ï¿½"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Signal Setting"));//_T("Signal ï¿½ï¿½ï¿½ï¿½"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Motor Setting"));//_T("���� ï¿½ï¿½ï¿½ï¿½"));
    m_ctrlTabMain.InsertItem(nIdx++, _T("Network Setting"));//_T("��Ʈ��ũ ï¿½ï¿½ï¿½ï¿½"));
}
BOOL CReviewSystemSettingDlg::ReadReviewSystemConfigFile()
@@ -526,7 +527,7 @@
        strBackupFile = strBackupPath + strBackupFile;
        CopyFile(_REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_, strBackupFile, TRUE);
        //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD START
        //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD START
        strBackupPath = _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT;
        CreateDirectory(strBackupPath, NULL);
@@ -535,9 +536,9 @@
        strBackupFile.Format(_T("%s\\SystemSetting.cfg"), strBackupPath);
        CopyFile(_REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_, strBackupFile, FALSE);
        //LYW_#3344_CF AOI Review Config File ë°±ì—… ê¸°ëŠ¥ ê°œì„  ADD END
        //LYW_#3344_CF AOI Review Config File ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ADD END
        if (IDNO == AfxMessageBox(_T("Save complete. Do you want to close System Setting program?"), MB_YESNO | MB_ICONQUESTION))//_T("저장 ì™„료되었습니다. ì‹œìŠ¤í…œ ì„¤ì • í”„로그램을 ì¢…료하시겠습니까?"), MB_YESNO | MB_ICONQUESTION))
        if (IDNO == AfxMessageBox(_T("Save complete. Do you want to close System Setting program?"), MB_YESNO | MB_ICONQUESTION))//_T("���� ï¿½Ï·ï¿½Ç¾ï¿½ï¿½ï¿½ï¿½Ï´ï¿½. ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï½Ã°Ú½ï¿½ï¿½Ï±ï¿½?"), MB_YESNO | MB_ICONQUESTION))
        {
            return;
        }
@@ -549,14 +550,14 @@
    }
    else
    {
        AfxMessageBox(_T("Save Fail!"));//_T("저장 ì‹¤íŒ¨í•˜ì˜€ìŠµë‹ˆë‹¤."));
        AfxMessageBox(_T("Save Fail!"));//_T("���� ï¿½ï¿½ï¿½ï¿½ï¿½Ï¿ï¿½ï¿½ï¿½ï¿½Ï´ï¿½."));
    }
}
void CReviewSystemSettingDlg::OnBnClickedCancel()
{
    // TODO: ì—¬ê¸°ì— ì»¨íŠ¸ë¡¤ ì•Œë¦¼ ì²˜ë¦¬ê¸° ì½”드를 ì¶”가합니다.
    if (IDNO == AfxMessageBox(_T("Do you want to close System Setting program?"), MB_YESNO | MB_ICONQUESTION))//_T("시스템 ì„¤ì • í”„로그램을 ì¢…료하시겠습니까?"), MB_YESNO | MB_ICONQUESTION))
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½Ë¸ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ï¿½Õ´Ï´ï¿½.
    if (IDNO == AfxMessageBox(_T("Do you want to close System Setting program?"), MB_YESNO | MB_ICONQUESTION))//_T("�ý��� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Î±×·ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ï½Ã°Ú½ï¿½ï¿½Ï±ï¿½?"), MB_YESNO | MB_ICONQUESTION))
    {
        return;
    }
@@ -568,7 +569,7 @@
BOOL CReviewSystemSettingDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
    // TODO: ì—¬ê¸°ì— ë©”시지 ì²˜ë¦¬ê¸° ì½”드를 ì¶”ê°€ ë°/또는 ê¸°ë³¸ê°’을 í˜¸ì¶œí•©ë‹ˆë‹¤.
    // TODO: ï¿½ï¿½ï¿½â¿¡ ï¿½Þ½ï¿½ï¿½ï¿½ Ã³ï¿½ï¿½ï¿½ï¿½ ï¿½Úµå¸¦ ï¿½ß°ï¿½ ï¿½ï¿½/�Ǵ� ï¿½âº»ï¿½ï¿½ï¿½ï¿½ È£ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
    if (pCopyDataStruct->dwData == COPYDATA_SYSTEMSETTING2REVIEWSYSTEM)
    {
        COPYDATA_SYSTEM2REV* pCopyData = (COPYDATA_SYSTEM2REV*)pCopyDataStruct->lpData;
ReviewSystem/ReviewSystemSetting/resource.h
@@ -1,6 +1,6 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by ReviewSystemSetting.rc
// Microsoft Visual C++에서 ìƒì„±í•œ í¬í•¨ íŒŒì¼ìž…니다.
// ReviewSystemSetting.rc에서 ì‚¬ìš©ë˜ê³  ìžˆìŠµë‹ˆë‹¤.
//
#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
@@ -223,14 +223,16 @@
#define IDC_EDIT_SYS_MOTOR_START_POINT_XPOS 1089
#define IDC_EDIT_START_POINT_YPOS       1090
#define IDC_EDIT_SYS_MOTOR_START_POINT_YPOS 1090
#define IDC_EDIT_DEFOCUSVALUE_MIN       1092
#define IDC_EDIT_DEFOCUSVALUE_MAX       1093
// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        144
#define _APS_NEXT_RESOURCE_VALUE        145
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1092
#define _APS_NEXT_CONTROL_VALUE         1094
#define _APS_NEXT_SYMED_VALUE           107
#endif
#endif
ReviewSystem/ReviewSystemSetting/stdafx.h
@@ -1,7 +1,7 @@
// stdafx.h : ìžì£¼ ì‚¬ìš©í•˜ì§€ë§Œ ìžì£¼ ë³€ê²½ë˜ì§€ëŠ” ì•ŠëŠ”
// í‘œì¤€ ì‹œìŠ¤í…œ í¬í•¨ íŒŒì¼ ë° í”„로젝트 ê´€ë ¨ í¬í•¨ íŒŒì¼ì´
// ë“¤ì–´ ìžˆëŠ” í¬í•¨ íŒŒì¼ìž…니다.
// stdafx.h : ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ê´ï¿½
// Ç¥ï¿½ï¿½ ï¿½Ã½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ® ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
// ï¿½ï¿½ï¿½ ï¿½Ö´ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#pragma once
@@ -10,37 +10,42 @@
#endif
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // ê±°ì˜ ì‚¬ìš©ë˜ì§€ ì•ŠëŠ” ë‚´ìš©ì€ Windows í—¤ë”에서 ì œì™¸í•©ë‹ˆë‹¤.
#define VC_EXTRALEAN            // ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½Ê´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ Windows ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // ì¼ë¶€ CString ìƒì„±ìžëŠ” ëª…시적으로 ì„ ì–¸ë©ë‹ˆë‹¤.
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // ï¿½Ïºï¿½ CString ï¿½ï¿½ï¿½ï¿½ï¿½Ú´ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ë´Ï´ï¿½.
// MFC의 ê³µí†µ ë¶€ë¶„ê³¼ ë¬´ì‹œ ê°€ëŠ¥í•œ ê²½ê³  ë©”시지에 ëŒ€í•œ ìˆ¨ê¸°ê¸°ë¥¼ í•´ì œí•©ë‹ˆë‹¤.
// MFC�� ï¿½ï¿½ï¿½ï¿½ ï¿½ÎºÐ°ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½Þ½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½â¸¦ ï¿½ï¿½ï¿½ï¿½ï¿½Õ´Ï´ï¿½.
#define _AFX_ALL_WARNINGS
#include <afxwin.h>         // MFC í•µì‹¬ ë° í‘œì¤€ êµ¬ì„± ìš”소입니다.
#include <afxext.h>         // MFC í™•장입니다.
#include <afxwin.h>         // MFC ï¿½Ù½ï¿½ ï¿½ï¿½ Ç¥ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#include <afxext.h>         // MFC È®ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#include <afxdisp.h>        // MFC ìžë™í™” í´ëž˜ìŠ¤ìž…ë‹ˆë‹¤.
#include <afxdisp.h>        // MFC ï¿½Úµï¿½È­ Å¬ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // Internet Explorer 4 ê³µìš© ì»¨íŠ¸ë¡¤ì— ëŒ€í•œ MFC ì§€ì›ìž…니다.
#include <afxdtctl.h>           // Internet Explorer 4 ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // Windows ê³µìš© ì»¨íŠ¸ë¡¤ì— ëŒ€í•œ MFC ì§€ì›ìž…니다.
#include <afxcmn.h>             // Windows ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½Ñ¿ï¿½ ï¿½ï¿½ï¿½ï¿½ MFC ï¿½ï¿½ï¿½ï¿½ï¿½Ô´Ï´ï¿½.
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h>     // MFC의 ë¦¬ë³¸ ë° ì»¨íŠ¸ë¡¤ ë§‰ëŒ€ ì§€ì›
#include <afxcontrolbars.h>     // MFC�� ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ ï¿½ï¿½Æ®ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½
#define _REVIEW_SERVER_BASE_PATH_                    _T("C:\\DIT_Review")
#define _REVIEW_SERVER_CONFIG_PATH_                    _T("C:\\DIT_Review\\ReviewServerConfig")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _REVIEW_SERVER_SYSTEM_PASSWORD_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.dat")
#define _REVIEW_SERVER_BASE_PATH_                    _T("D:\\DIT_Review")  //210805
#define _REVIEW_SERVER_CONFIG_PATH_                    _T("D:\\DIT_Review\\ReviewServerConfig")
#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("D:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
#define _REVIEW_SERVER_SYSTEM_PASSWORD_FILE_PATH_    _T("D:\\DIT_Review\\ReviewServerConfig\\SystemSetting.dat")
//#define _REVIEW_SERVER_BASE_PATH_                    _T("C:\\DIT_Review")
//#define _REVIEW_SERVER_CONFIG_PATH_                    _T("C:\\DIT_Review\\ReviewServerConfig")
//#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg")
//#define _REVIEW_SERVER_SYSTEM_PASSWORD_FILE_PATH_    _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.dat")
#define _REVIEW_RECIPE_BACKUP_PATH_CPJT                _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe")
#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT    _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig")
#define _REVIEW_SYSTEM_TITLE_                        _T("ReviewSystem")
@@ -60,7 +65,7 @@
    MsgSystem2Rev_ChangeSysConfig,
    MsgRev2System_ChangeSysConfig,
    // [2017:5:2]-[WEZASW] : TFE Measurement ì„¤ë¹„ UNIT Test(Signal ìˆ˜ë™ ë°œìƒ)를 ìœ„한 ì¶”ê°€
    // [2017:5:2]-[WEZASW] : TFE Measurement ï¿½ï¿½ï¿½ï¿½ UNIT Test(Signal ï¿½ï¿½ï¿½ï¿½ ï¿½ß»ï¿½)�� ï¿½ï¿½ï¿½ï¿½ ï¿½ß°ï¿½
    MsgSystem2Rev_SendAlignAlarmSignal,
    MsgRev2System_SendAlignAlarmSignal,
ReviewSystem/include/CHReviewRecipe/RsRcpAlignInfo.h
@@ -1,7 +1,11 @@
#pragma once
#define ALIGN_IMAGE_PATH _T("C:\\DIT_Review\\Recipe\\AlignImage")
#define REFLOW_IMAGE_PATH _T("C:\\DIT_Review\\Recipe\\Reflow")
#define ALIGN_IMAGE_PATH _T("D:\\DIT_Review\\Recipe\\AlignImage")  //210805
#define REFLOW_IMAGE_PATH _T("D:\\DIT_Review\\Recipe\\Reflow")
//#define ALIGN_IMAGE_PATH _T("C:\\DIT_Review\\Recipe\\AlignImage")
//#define REFLOW_IMAGE_PATH _T("C:\\DIT_Review\\Recipe\\Reflow")
class AFX_EXT_CLASS CRsRcpAlignInfo
{
ReviewSystem/include/CHSignalControls/SignalControlInfo.h
@@ -122,6 +122,8 @@
    int            GetMSReviewStartSignalDelay() const    { return m_pMsSignalDelayTime[SignalDelayIndex_ReviewStart]; }
    int            GetMSReviewEndSignalDelay() const    { return m_pMsSignalDelayTime[SignalDelayIndex_ReviewEnd]; }
    int            GetMSUnloadingSignalDelay() const    { return m_pMsSignalDelayTime[SignalDelayIndex_Unloading]; }
    int            GetDefocusValueMin()const            { return m_nDefocusValueMin; }
    int            GetDefocusValueMax()const            { return m_nDefocusValueMax; }
    BOOL        GetUseContinuousReadAddress() const { return m_bUseContinuousReadAddr; }
    BOOL        GetUseContinuousSendAddress() const { return m_bUseContinuousSendAddr; }
@@ -202,6 +204,8 @@
    void        SetMSTotalTime(int nTime)                        { m_nMSTotalTime = nTime; }
    void        SetUseContinuousReadAddress(BOOL bUse)            { m_bUseContinuousReadAddr = bUse; }
    void        SetUseContinuousSendAddress(BOOL bUse)            { m_bUseContinuousSendAddr = bUse; }
    void        SetDefocusValueMin(int nValue)                    { m_nDefocusValueMin = nValue; }
    void        SetDefocusValueMax(int nValue)                    { m_nDefocusValueMax = nValue; }
    void        SetReadSignalAddressCount(int nCnt)                { m_vecReadSigAddr.resize(nCnt); }
@@ -226,6 +230,8 @@
    int                        m_nMSTimerTime;
    int                        m_nMSTotalTime;
    int                        m_pMsSignalDelayTime[SignalDelayIndex_Count];
    int                        m_nDefocusValueMin;
    int                        m_nDefocusValueMax;
    BOOL                    m_bUseContinuousReadAddr;
    BOOL                    m_bUseContinuousSendAddr;
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisInfo.h
@@ -3,7 +3,8 @@
#include <vector>
// path define
#define REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_PATH            _T("C:\\DIT_Review\\DiagnosisConfig")
#define REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_PATH            _T("D:\\DIT_Review\\DiagnosisConfig")  //210805
//#define REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_PATH            _T("C:\\DIT_Review\\DiagnosisConfig")
#define REVIEW_AUTO_DIAGNOSIS_SETTING_FILE_NAME            _T("AutoDiagnosisSetting.cfg")
#define REVIEW_AUTO_DIAGNOSIS_DATA_FILE_PATH            _T("D:\\ResultData\\AutoDiagnosis")
#define REVIEW_AUTO_DIAGNOSIS_DATA_IMAGE_FILE_PATH        _T("D:\\ResultData\\AutoDiagnosis\\ResultImage")
@@ -22,8 +23,9 @@
enum DiagnosisMode {
    DiagnosisMode_All = 0,
    DiagnosisMode_Squareness,
    DiagnosisMode_Review,
    DiagnosisMode_Wsi,
    DiagnosisMode_Squareness,
    DiagnosisMode_Flatness,
    DiagnosisMode_Flatness_Manual,
    DiagnosisMode_Simulation
@@ -57,12 +59,14 @@
    virtual void IDP2P_WsiMotorMotionEnd(int nModuleIdx, double dPosX, double dPosY) = 0;
    virtual BOOL IDP2P_DiagnosisSendCompleteSig()=0;
    virtual BOOL IDP2P_DiagnosisSendJudgeAlarm() = 0; //0412 AU°¡Aø´U Â½AEï¿¡ Aß°¡
    virtual BOOL IDP2P_DiagnosisSendJudgeAlarm() = 0; //0412 AU�Ƣ�A����U ï¿½ï¿½AE�� A���Ƣ�
    // Dialog
    virtual BOOL IDP2P_SetDlgFlatness(int nIndex) = 0;
    virtual BOOL IDP2P_SetDialogTap(int nIndex) = 0;
    virtual void IDP2P_UpdateDialog(int nIndex = -1) = 0;
    virtual BOOL IDP2P_CheckManualMode() = 0;
};
struct SPositionData
@@ -129,6 +133,7 @@
    void            SetHeight3Sigma(double dData)            { m_dHeight3Sigma = dData; }
    void            SetACC(double dData) { m_dACC = dData; }
    void            SetRTB(double dData) { m_dRTB = dData; }
    void            SetDiagnosisHeight(double dData, int idx) { m_dDiagnosisHeight[idx] = dData; }
    // getter
    int                        GetModuleIndex() const { return m_nModuleIndex; }
@@ -148,6 +153,8 @@
    double                    GetHeight3Sigma() const { return m_dHeight3Sigma; }
    double                    getWSI_ACC() const {return m_dACC;}
    double                    getWSI_RTB() const { return m_dRTB; }
    double                    GetDiagnosisHeight(int idx) const { return m_dDiagnosisHeight[idx];  }
protected:
    int                m_nModuleIndex;
@@ -167,6 +174,7 @@
    double            m_dHeight3Sigma;
    double            m_dACC;
    double          m_dRTB;
    double            m_dDiagnosisHeight[10];
};
typedef std::vector<CDiagnosisResult>                VectorDiagnosisResult;
typedef std::vector<CDiagnosisResult>::iterator        VectorDiagnosisResultIt;
@@ -188,6 +196,7 @@
        m_dCameraResolution = 0.;
        m_nPanelCount_Squareness = 0;
        m_dJudgeData_Degree = 0.;
        m_dSquarenessStandard = 0.;
        m_dataSettingResult_Flatness.Reset();
        m_nAFDelay = 0;
@@ -199,6 +208,7 @@
        m_vecSettingResult_Wsi.clear();
        m_nPanelCount_Wsi = 0;
        m_dJudgeData_3Sigma = 0.;
        m_dWSIStandard = 0.;
        m_dPanelPosX = 0;
        m_dPanelPosY = 0;
@@ -215,6 +225,9 @@
        m_dReviewPanelPosY2 = 0;
        m_dReviewPanelPosX4 = 0;
        m_dReviewPanelPosY4 = 0;
        //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
        m_nFlatnessSkipMode = 0;
        //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    }
@@ -237,10 +250,16 @@
    void                    SetPanelCount_Wsi(int nCount) { m_nPanelCount_Wsi = nCount; }
    void                    SetJudgeData_3Sigma(double dData) { m_dJudgeData_3Sigma = dData; }
    void                    GetPanelPosX_Wsi(double dData) { m_dPanelPosX = dData; }
    void                    GetPanelPosY_Wsi(double dData) {  m_dPanelPosY = dData; }
    void                    GetPanelPosX2_Wsi(double dData) { m_dPanelPosX2 = dData; }
    void                    GetPanelPosY2_Wsi(double dData) { m_dPanelPosY2 = dData; }
    void                    SetPanelPosX_Wsi(double dData) { m_dPanelPosX = dData; }
    void                    SetPanelPosY_Wsi(double dData) {  m_dPanelPosY = dData; }
    void                    SetPanelPosX2_Wsi(double dData) { m_dPanelPosX2 = dData; }
    void                    SetPanelPosY2_Wsi(double dData) { m_dPanelPosY2 = dData; }
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
    void                    SetFlastnessSkipMode(double dData) { m_nFlatnessSkipMode = dData; }
    void                    SetSquarenessStandard(double dData) { m_dSquarenessStandard = dData; }
    void                    SetSquarenessStandard2(double dData) { m_dSquarenessStandard2 = dData; }
    void                    SetWSIStandard(double dData) { m_dWSIStandard = dData; }
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    // getter
@@ -272,6 +291,12 @@
    double                    GetPanelPosY_Wsi() const { return m_dPanelPosY; }
    double                    GetPanelPosX2_Wsi() const { return m_dPanelPosX2; }
    double                    GetPanelPosY2_Wsi() const { return m_dPanelPosY2; }
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
    int                        GetFlastnessSkipMode() const { return m_nFlatnessSkipMode; }
    double                    GetSquarenessStandard() const { return m_dSquarenessStandard; }
    double                    GetSquarenessStandard2() const { return m_dSquarenessStandard2; }
    double                    GetWSIStandard() const { return m_dWSIStandard; }
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    //Review
public:
    double                    GetReviewPanelPosX() const { return m_dReviewPanelPosX; }
@@ -300,6 +325,10 @@
    int                            m_nCameraFrameHeight;
    double                        m_dCameraResolution;
    double                        m_dJudgeData_Degree;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
    double                        m_dSquarenessStandard;
    double                        m_dSquarenessStandard2;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    // Flatness
    CDiagnosisResult            m_dataSettingResult_Flatness;        // single data
@@ -309,11 +338,17 @@
    int                            m_nRangeCount_Flatness;
    int                            m_nGlassSizeX;
    int                            m_nGlassSizeY;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
    int                            m_nFlatnessSkipMode;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    // wsi
    VectorDiagnosisResult        m_vecSettingResult_Wsi;        // add module count
    int                            m_nPanelCount_Wsi;
    double                        m_dJudgeData_3Sigma;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_START
    double                        m_dWSIStandard;
    //#3514_LYW_CF AOI Review ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½_END
    double                        m_dPanelPosX;
    double                        m_dPanelPosY;
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisManager.h
@@ -40,6 +40,8 @@
    BOOL MakeDirectory(CString strPath);
    BOOL CheckManualMode();
    // setter
    void SetExistStandardData(BOOL bExist = TRUE) { m_bExistStandardData = bExist; }
    int SetDiagnosisResultCount_Squareness(int nCount);
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisProcessor.h
@@ -49,6 +49,7 @@
    int ProcessFlatness();
    int ProcessFlatness_Manual();
    int ProcessSimulation();
    int ProcessDiagnosisJudge(int nMode);
    BOOL CalculateSquareness(int nIndex);
protected: