SDC C-Project CF Review 프로그램
834d74bdfcb93f94069137128242ec282b8fec37..a6552335164ce062567b76aa7d097fd046129474
2021-07-23 LYW
Ongoing90 #3517 CF AOI Review 자가진단 기능 개선
a65523 비교 | 트리
2021-07-19 LYW
Ongoing60 #3517 CF AOI Review 자가진단 기능 개선
2bd50e 비교 | 트리
2개 파일 추가됨
49개 파일 변경됨
2716 ■■■■ 파일 변경됨
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/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/M_AutoDiagnosisManager/DiagnosisInfo.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/DiagnosisManager.cpp 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/DiagnosisProcessor.cpp 267 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/M_AutoDiagnosisManager/M_AutoDiagnosisManager.vcxproj 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.cpp 4 ●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawClient.h 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawStruct.h 253 ●●●● 패치 | 보기 | 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/ReviewInterface.cpp 83 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewInterface.h 14 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor.h 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp 39 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewSystem.rc 195 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor.cpp 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor.h 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 15 ●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/resource.h 43 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/include/M_AutoDiagnosisManager/DiagnosisInfo.h 44 ●●●● 패치 | 보기 | 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/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/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 (1000 <= GetTickCount() - stTime)
            {
                break;
            }
@@ -292,14 +311,22 @@
        }
        m_pDP2P->IDP2P_SetAFMTracking(nSelModuleIndex, TRUE);
        Sleep(1000);
        //#3514_LYW_CF AOI Review ìžê°€ì§„단 ê¸°ëŠ¥ ê°œì„ _START
        //Sleep(1000);
        Sleep(500);
        //#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;
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/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;
}
@@ -139,7 +140,7 @@
    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;
@@ -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);
}
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/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/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);
@@ -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);
        }
@@ -3367,6 +3382,26 @@
    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;
}
int CReviewInterface::PS2P_GetModuleStatusCount(int nModuleType)
{
@@ -3506,6 +3541,16 @@
    return m_pMotorControl->IsGantryMotionEnd(nModuleIdx);
}
BOOL CReviewInterface::IDP2P_CheckManualMode()
{
    if (IsManualProcessMode() == TRUE)
    {
        return TRUE;
    }
    return FALSE;
}
int CReviewInterface::IDP2P_GetSelectedModuleIndex()
@@ -3776,12 +3821,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);
@@ -3795,7 +3843,6 @@
        pWsiControl->SetWsiStart(1, vectorPosX, vectorPosY, 0);
    }
}
void CReviewInterface::IDP2P_WsiMotorMotionEnd(int nModuleIdx, double dPosX, double dPosY)
@@ -8357,6 +8404,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();
@@ -255,6 +256,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 +405,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
@@ -76,6 +76,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
@@ -1278,19 +1278,17 @@
              }
          }
          if (pReviewResult->nModuleIdx == 0)
          if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
          {
              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);
          }
          else if(pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
          {
              m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
              m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
              m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
          }
      }
    }
@@ -1311,13 +1309,16 @@
            dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
        }
        if (pReviewResult->nModuleIdx == 0)
        if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
        {
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
        }
        else
        else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
        {
            m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
            m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
        }
    }
    
@@ -1424,9 +1425,23 @@
            if (imageConvert.GetImageExist())
            {
                dFocusValue = CalcFocusValue(imageConvert.GetImageBuffer(), imageConvert.GetWidth(), imageConvert.GetHeight());
                if (pReviewResult->nModuleIdx == 0 && m_pRP2P->IRP2P_GetFirstReviewLeft())
                {
                    m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview00ImageContrast = dFocusValue;
                    m_pRP2P->IRP2P_SetFirstReviewLeft(FALSE);
                    m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewLeft FDC FocusValue = %.2f "), dFocusValue);
                }
                else if (pReviewResult->nModuleIdx == 1 && m_pRP2P->IRP2P_GetFirstReviewRight())
                {
                    m_pRP2P->IRP2P_GetCurrentGlassResult()->nReview01ImageContrast = dFocusValue;
                    m_pRP2P->IRP2P_SetFirstReviewRight(FALSE);
                    m_pRP2P->IRP2P_DisplayMessage(_T("FirstReviewRight FDC FocusValue = %.2f "), dFocusValue);
                }
            }
        
            // count defocus
            CGlassResult* pGlassResult = m_pRP2P->IRP2P_GetCurrentGlassResult();
            if (pGlassResult)
ReviewSystem/ReviewSystem/ReviewSystem.rc
@@ -576,42 +576,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 +675,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 +685,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 +700,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 +719,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 +779,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/SequenceProcessor.cpp
@@ -1882,9 +1882,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:
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -946,6 +946,9 @@
    bFileFind = FALSE;
    m_pSP2P->ISP2P_GetDiagnosisHistory();
    m_pSP2P->ISP2P_SetFirstReviewLeft(TRUE);
    m_pSP2P->ISP2P_SetFirstReviewRight(TRUE);
    
    if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_LoadingAck_CPJT))
        m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] Send Loading Ack Signal!"));
@@ -8713,14 +8716,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);
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
@@ -251,31 +252,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 +367,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 +392,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 +440,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/include/M_AutoDiagnosisManager/DiagnosisInfo.h
@@ -22,8 +22,9 @@
enum DiagnosisMode {
    DiagnosisMode_All = 0,
    DiagnosisMode_Squareness,
    DiagnosisMode_Review,
    DiagnosisMode_Wsi,
    DiagnosisMode_Squareness,
    DiagnosisMode_Flatness,
    DiagnosisMode_Flatness_Manual,
    DiagnosisMode_Simulation
@@ -63,6 +64,8 @@
    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 +132,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 +152,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 +173,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 +195,7 @@
        m_dCameraResolution = 0.;
        m_nPanelCount_Squareness = 0;
        m_dJudgeData_Degree = 0.;
        m_dSquarenessStandard = 0.;
        m_dataSettingResult_Flatness.Reset();
        m_nAFDelay = 0;
@@ -199,6 +207,7 @@
        m_vecSettingResult_Wsi.clear();
        m_nPanelCount_Wsi = 0;
        m_dJudgeData_3Sigma = 0.;
        m_dWSIStandard = 0.;
        m_dPanelPosX = 0;
        m_dPanelPosY = 0;
@@ -215,6 +224,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 +249,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 +290,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 +324,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 +337,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: