From c220de6f70051797e9d8b371830d06def9dc9cbd Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 목, 30 6월 2022 11:02:23 +0900 Subject: [PATCH] 검사기 RawMessenger 동기화 --- ReviewSystem/ReviewSystem/SequenceProcessor.cpp | 1 ReviewHistory/ReveiwHistory/DitGlassRawStruct.h | 5 DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h | 787 +++++++++++++++++++++++++++++++++++++++++ ReviewSystem/ReviewSystem/DitGlassRawStruct.h | 5 ReviewSystem/ReviewSystem/SequenceProcessor.h | 3 ReviewSystem/ReviewSystem/ReviewInterface.cpp | 238 +++++++++-- ReviewHistory/bin/ReviewHistroy.exe | 0 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp | 10 DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp | 34 + DitGlassRawMessenger/Extern/DitGlassRawStruct.h | 5 10 files changed, 1,027 insertions(+), 61 deletions(-) diff --git a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp index 8a1aa61..2055277 100644 --- a/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp +++ b/DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp @@ -587,14 +587,32 @@ CString strValue; /*< KJG 20211229 - #3846 MOD Start >*/ //strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; +/* < KMH 20220613 : #3957 MOD Start > */ /* <LJC 20220425 : #3957 MOD Start> */ - strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea + // strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea + strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea + for (int i = 0; i < RAW_CODE_MAX; i++) + { + CString strDefectCode = pGlassData->m_strRawDefectCode[i]; + if (strDefectCode == "") { strDefectCode = "*"; } + strValue += " " + strDefectCode; + } /* <LJC 20220425 : #3957 MOD End> */ +/* < KMH 20220613 : #3957 MOD End > */ /*< KJG 20211229 - #3846 MOD End >*/ strLine += strValue; strLine += "\n"; +/* < KMH 20220614 : #3957 MOD Start > */ /* <LJC 20220425 : #3957 MOD Start> */ - strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */ - /* <LJC 20220425 : #3957 MOD End> */ + //strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */ + strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //56ea + for (int i = 0; i < RAW_CODE_MAX; i++) + { + CString strDefectCode = pGlassData->m_strRawDefectCode[i]; + if (strDefectCode == "") { strDefectCode = "*"; } + strValue += " " + strDefectCode; + } + /* <LJC 20220425 : #3957 MOD End> */ +/* < KMH 20220614 : #3957 MOD End > */ strLine += strValue; strLine += "\n"; strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea strLine += strValue; @@ -1036,7 +1054,10 @@ SPRINTRAW(8, "SUBPANEL"); // 03 12 SUBPANELID // Subpanel ID //SPRINTRAW(12, "%d", pCellData->m_nCellID); - SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]); + /* < KMH 20220609 : #4183 MOD Start > */ + //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]); + SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pCellData->m_strCellName); + /* < KMH 20220609 : #4183 MOD End > */ // 湲��씪�뒪 �썝�젏 湲곗� Y醫뚰몴 諛섎� // 肄붾꼫而� 湲곗��쑝濡� 寃곌낵�뙆�씪 醫뚰몴媛� �깮�꽦�릺�뒗�뜲 怨좉컼�궗�뿉 紐낇솗�븳 �솗�씤 �븘�슂 @@ -1191,7 +1212,10 @@ // 02 6 DEFECT // DEFECT SPRINTRAW(6, "DEFECT"); // 03 12 ID // Subpanel ID - SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]); + /* < KMH 20220609 : #4183 MOD Start > */ + //SPRINTRAW(12, "%s%c%c", pData->GetGlassData()->m_strGlassID, '0' + pDefectData->m_nCellIdx / 36, g_pCellCode[pDefectData->m_nCellIdx % 36]); + SPRINTRAW(12, "%s%s", pData->GetGlassData()->m_strGlassID, pDefectData->m_strCellName); + /* < KMH 20220609 : #4183 MOD End > */ // 04 5 DEF_NO // Defect Number of Panel // RAW �뙆�씪�슜 Defect Index //SPRINTRAW(5, "%d", pDefectData->m_nDefectIdx); diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h index d7fc000..58cf38c 100644 --- a/DitGlassRawMessenger/Extern/DitGlassRawStruct.h +++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct.h @@ -222,6 +222,10 @@ /* < KJG 20220225 - #3850 ADD Start >*/ char m_strRawMergeStepID[32]; /* < KJG 20220225 - #3850 ADD End >*/ + + /* < KMH 20220614 : #3957 ADD Start > */ + char m_strRawDefectCode[RAW_CODE_MAX][5]; // 4글자만 표기 + /* < KMH 20220614 : #3957 ADD End > */ }; struct _grmBlockData { @@ -479,6 +483,7 @@ int m_nUMCellY; // 셀 원점 기준 y 좌표 short m_nModelIdx; // 몇 번째 모델인가? short m_nCellIdx; // 몇번째 셀인가? + char m_strCellName[32]; // 셀 이름 /* < KMH 20220609 : #4183 ADD > */ short m_nCellGate; // 셀별 Gate라인(얼라인 보정 전) short m_nCellData; // 셀별 Data라인(얼라인 보정 전) short m_nCellGateAlign; // 셀별 Gate라인(얼라인 보정 후) diff --git a/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h new file mode 100644 index 0000000..d7fc000 --- /dev/null +++ b/DitGlassRawMessenger/Extern/DitGlassRawStruct_0629_Back.h @@ -0,0 +1,787 @@ +#pragma once + +#define SHAREDMEMNAME_BASICINFO _T("DIT.GLASSRAWSYSTEM.SHAREDMEM.BASICINFO") +#define SHAREDMEMNAME_GLASSDATA _T("DIT.GLASRAWSYSTEM.SHAREDMEM.GLASSDATA") +#define MUTEX_RAWMESSENGER _T("MUTEX_RAWMESSENGER_IPC") + +#define COMMAND_MAXCOUNT 8 + +#define RAWMESSENGER_MAXCAMNUM 30 +#define RAWMESSENGER_MAXSCANNUM 20 +#define RAWMESSENGER_MAXHLINUM 8 +#define RAW_CODE_MAX 10 + +#define MAX_ZONE_NUM 16 + +namespace ditRaw +{ + enum ReviewPlanType + { + RPT_Review = 0, + RPT_User, + RTP_WSI, + RTP_PlanMeasure, + RTP_Reflow, + RTP_WsiReflow, + RTP_UserWsi, + RPT_AOICustom = 1000, + }; +}; +enum emAOIProcStep +{ + APS_None = 0, + + //AOI + APS_GlassLoading, + APS_InspectEnd, + //Review + APS_CustomReviewRead, + APS_ReviewStart, + APS_ReviewEnd, + + RPS_StepNum +}; + +struct _grmGlassData +{ + void clear() + { + memset(this, 0, sizeof(_grmGlassData)); + } + + //Glass 정보 + char m_strFileName[64]; + char m_strPath[256]; + + int m_nCellNum; + int m_nDefectNum; + + 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_nGlassSizeWidth; + int m_nGlassSizeHeight; + /* <KYH 211129 : #3796 ADD Start> */ + int m_nDefectNumJudgeND; + /* <KYH 211129 : #3796 ADD End> */ + //DUMY DATA + int Dumy_int[9]; + + //설비정보 + char m_strLine[32]; + char m_strEquipType[32]; + char m_strEquipID[32]; + char m_strStepID[32]; + char m_strOperID[32]; + + CTime m_tmGlassLoading; //3. START_TIME + CTime m_tmInspectionStart; //3. START_TIME + CTime m_tmInspectionEND; //4. END_TIME + CTime m_tmReviewLoading; + CTime m_tmReviewEnd; + + //기본 물류정보 + char m_strGlassID[32]; //Glass ID + char m_strPPID[32]; + char m_strEPPID[32]; + char m_strLotID[32]; //LOT_ID + char m_strSLotID[32]; //SLOT_ID + char m_strRecipeName[32]; //RECIPE_NAME + char m_strGlassJudge[32]; //GLASS_JUDGE + char m_strGlassCode[32]; //Grade or Code + char m_strProductID[16]; //4. PRODUCT_ID + + //VCR + int m_nVcrResultCode; + char m_strVCRResult[32]; + char m_strVCRGlassID[32]; + + + //결함 갯수 관리 변수 + int m_nDefectNumSizeSmall; + int m_nDefectNumSizeMid; + int m_nDefectNumSizeLarge; + int m_nDefectNumSizeHuge; + int m_nDefectNumSizeUltra; + + int m_nDefectNumLocActive; + int m_nDefectNumLocPad; + int m_nDefectNumLocCrack; + int m_nDefectNumLocBM; + + int m_nDefectNumTypeTB; + int m_nDefectNumTypeTW; + int m_nDefectNumTypeRB; + int m_nDefectNumTypeRW; + int m_nDefectNumTypeMD; + int m_nDefectNumTypeCD; + int m_nDefectNumTypeMC; + /* <LJC 20220422 : #3957 ADD Start> */ + int m_nDefectCode[RAW_CODE_MAX]; + /* <LJC 20220422 : #3957 ADD End> */ + + int m_nDefectNumJudgeOKWhite; + int m_nDefectNumJudgeOKBlack; + int m_nDefectNumJudgeNG; + int m_nDefectNumJudgeRW; + int m_nDefectNumJudgeRP; + int m_nDefectNumJudgeRV; + int m_nDefectNumJudgeTR; + int m_nDefectNumJudgePR; + /*< LHS 20211029 - #3783 MOD Start >*/ + int m_nDefectNumJudgeLine; + /*< LHS 20211029 - #3783 MOD End >*/ + int m_nDefectNumStackTD; + int m_nDefectNumStackSD; + int m_nDefectNumStackPD; + int m_nDefectNumStackSP; + + + //카메라/스캔 정보 [김태현 2018/12/5] + short m_nCameraNum; + short m_nScanNum; + 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] + double m_nAlignCcdTheta; + double m_nAlignCcdShitftX; + double m_nAlignCcdShitftY; + double m_nAlignPreTheta; + double m_nAlignPreShitftX; + double m_nAlignPreShitftY; + double m_nAlignBasicTheta; + double m_nAlignBasicShitftX; + double m_nAlignBasicShitftY; + char m_strAlignFirst[64]; + char m_strAlignSecond[64]; +// char m_strAlignPath[256]; + + //CSOT용 물류 정보 [김태현 2018/12/5] + char m_strCassetteSequenceNo[16]; + char m_strOwnerCode[16]; //2. OWNER_CODE + char m_strOwnerType[16]; //3. OWNER_TYPE + + char m_strProcessID[21]; //5. PROCESS_ID + char m_strProductGroup[16]; //6. PRODUCT_GROUP + char m_strCSTID[16]; //8. CST_ID + char m_strPreProcessID[16]; //10.PRE_PROCESS_ID + char m_strPreEQPID[16]; //11.PRE_EQP_ID + char m_strPreChamerID[16]; //12.PRE_CHAMBER_ID + char m_strPreRecipeID[32]; //13.PRE_RECIPE_ID + char m_strGroupID[16]; //14.GROUP_ID + char m_cAutoSampleFlag; //15.AUTOSAMPLEFLAG + + // CPRJ용 물류 정보 + char m_strProdType[3]; + char m_strBatchID[13]; + char m_strPairHPanelID[13]; + char m_strGlassThickNess[2]; + char m_strCompCount[2]; + char m_strGlassState[2]; + char m_strInsFlag[2]; + char m_strPanelPosition[2]; + char m_strFlowHistory[2]; + char m_strCount1[2]; + char m_strCount2[2]; + char m_StrMergeList[10][12]; + //Mura Data 0412 nwh + char m_strMaxAvgGray[12]; + char m_strMaxPortion[12]; + + + //1226NWH + char m_strReadingFlag[2]; + BYTE m_nUniqueID[4]; + int m_nSlot_No; + + BYTE m_nGlassDataBitSignal[4]; + bool m_bJob_end; + + //201217 CJH - 찍은 Defect Review 개수 + int m_nReviewNum; + //201221 CJH - 파싱한 Stack 결과 + int m_nStackNum; + BOOL m_bStackRead; + + /*< KJG 20211024 - #3487 ADD Start >*/ + int m_nRawMergeNum; + BOOL m_bRawMergeRead; + /*< KJG 20211024 - #3487 ADD End >*/ + //210203 CJH - CutOff 대상 결함 수 + int m_nCutOffDefectNum; + //210323 CJH - Server/Frame Shrink 정보 추가 + char m_strShrinked[6]; + //210326 CJH - RAW 입력 Defect 수량 상한 사용여부 + BOOL m_bRawCutoff; + //210907 KJG - EdgeCrack 검사 사용 유무 + BOOL m_bEdgeCrackUse; + BOOL m_bRawMergeUse; + /* < KJG 20220225 - #3850 ADD Start >*/ + char m_strRawMergeStepID[32]; + /* < KJG 20220225 - #3850 ADD End >*/ +}; +struct _grmBlockData +{ + void clear() + { + memset(this, 0, sizeof(_grmBlockData)); + } + char m_strBlockID[16]; //1. BLOCK_ID + char m_cBlockJudgeAOI; //2. BLOCK_JUDGE_AOI + char m_cBlockJudgeATS; //4. BLOCK_JUDGE_ATS + char m_cBlockJudgeTEG; //5. BLOCK_JUDGE_TEG + int m_nGlassIdDCR; //22. GLASS_ID_DCR +}; +struct _grmCellData +{ + void clear() + { + memset(this, 0, sizeof(_grmCellData)); + } + int getTotalDefectNum(){return m_nDefectNumTypeTB+m_nDefectNumTypeTW+m_nDefectNumTypeRB+m_nDefectNumTypeRW; }; + int m_nCellID; //1. PANEL_ID + short m_nModelIdx; // 몇 번째 모델인가? + + char m_strCellName[32]; + int m_rectCellLeft; + int m_rectCellTop; + int m_rectCellRight; + int m_rectCellBottom; + + int/*Judgement*/ m_nJudgement; + int m_nJudgeFlag; + int m_nJudgeGlade; + + + //결함 갯수 관리 변수 + int m_nDefectNumSizeSmall; + int m_nDefectNumSizeMid; + int m_nDefectNumSizeLarge; + int m_nDefectNumSizeHuge; + int m_nDefectNumSizeUltra; + + int m_nDefectNumLocActive; + int m_nDefectNumLocPad; + int m_nDefectNumLocCrack; + int m_nDefectNumLocBM; + + int m_nDefectNumTypeTB; + int m_nDefectNumTypeTW; + int m_nDefectNumTypeRB; + int m_nDefectNumTypeRW; + int m_nDefectNumTypeMD; + int m_nDefectNumTypeCD; + int m_nDefectNumTypeMC; + /* <KYH 211129 : #3796 ADD Start> */ + int m_nDefectNumJudgeND; + /* <KYH 211129 : #3796 ADD End> */ + /* <LJC 20220422 : #3957 ADD Start> */ + int m_nDefectCode[RAW_CODE_MAX]; + /* <LJC 20220422 : #3957 ADD End> */ + //DUMY DATA + int Dumy_int[9]; + + //Mura Data nwh 0404 + char m_strProImage[32]; + char m_strAvgGray_0[12]; + char m_strPortion_0[12]; + //kyh Mura Data 추가 0622 + char m_strCorner_Gray_0[12]; + char m_strAvgAmp_0[12]; + char m_strFFTVar_0[12]; + char m_strFFTVah_0[12]; + char m_strFFTVaq_0[12]; + char m_strFFTPK_0[12]; + + char m_strAvgGray_1[12]; + char m_strPortion_1[12]; + //kyh Mura Data 추가 0622 + char m_strCorner_Gray_1[12]; + char m_strAvgAmp_1[12]; + char m_strFFTVar_1[12]; + char m_strFFTVah_1[12]; + char m_strFFTVaq_1[12]; + char m_strFFTPK_1[12]; + + char m_strAvgGray_2[12]; + char m_strPortion_2[12]; + //kyh Mura Data 추가 0622 + char m_strCorner_Gray_2[12]; + char m_strAvgAmp_2[12]; + char m_strFFTVar_2[12]; + char m_strFFTVah_2[12]; + char m_strFFTVaq_2[12]; + char m_strFFTPK_2[12]; + + char m_strAvgGray_3[12]; + char m_strPortion_3[12]; + //kyh Mura Data 추가 0622 + char m_strCorner_Gray_3[12]; + char m_strAvgAmp_3[12]; + char m_strFFTVar_3[12]; + char m_strFFTVah_3[12]; + char m_strFFTVaq_3[12]; + char m_strFFTPK_3[12]; + + int m_nDefectNumJudgeOKWhite; + int m_nDefectNumJudgeOKBlack; + int m_nDefectNumJudgeNG; + int m_nDefectNumJudgeRW; + int m_nDefectNumJudgeRP; + int m_nDefectNumJudgeRV; + int m_nDefectNumJudgeTR; + int m_nDefectNumJudgePR; + /*< LHS 20211029 - #3783 MOD Start >*/ + int m_nDefectNumJudgeLine; + /*< LHS 20211029 - #3783 MOD End >*/ + int m_nReflowResult[8]; // 0: Reflow X 1: Reflow OK 2: Reflow NG + + // Filtering된 Stack별 수 + int m_nDefectTDCount; + int m_nDefectSDCount; + int m_nDefectPDCount; + int m_nDefectSPCount; + + // Gate/Data 총 갯수 + int m_nGateNum; + int m_nDataNum; + + // 210129 CJH - Cell Origin 방향 + int m_nCellXDir; + int m_nCellYDir; +}; + +struct _grmDefectReviewData +{ + void clear() + { + memset(this, 0, sizeof(_grmDefectReviewData)); + } + + ////////////////////////////////////////////////////////////////////////// + //여기서 부터 리뷰 영역 [김태현 2019/1/19] + ditRaw::ReviewPlanType m_nPlanType ; + int m_nResultCode; //0:None, 1:Success + int m_nShotIndex; //리뷰 찍은 순번 [김태현 2018/12/5] + int m_nModuleIndex; + int m_nMagnificIndex; + float m_fManification; + float m_fManificResoultion; + char m_strRevImageName[256]; + char m_strRevImagePath[256]; + + ////////////////////////////////////////////////////////////////////////// + // 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영역 + int m_nWsi_ResultCode; //0:None, 1:Success + 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]; + int m_nWsiReflowPositionIndex; // WsiReflowPositionIndex + int m_nWsi_pReflowResultData[8]; + double m_dWsi_DamDistance; + + double m_dWsiMmMotorX; // WSI 모터 좌표 20180223 HJH + double m_dWsiMmMotorY; + float m_fWsiManification; // WSI 배율 + + ////////////////////////////////////////////////////////////////////////// + // 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 + float m_fReflow_LinePosData[8]; + int m_nReflow_Side; + int m_nReflow_InspectionMode; +}; + +struct _grmDefectData +{ + void clear() + { + memset(this, 0, sizeof(_grmDefectData)); + } + + short m_nDefectID; + short m_nCameraID; + short m_nScanIdx; + //short m_nDefectIdx; // 카메라에서의 결함 인덱스 + int m_nDefectIdx; // 카메라에서의 결함 인덱스 201207 CJH - 자릿 수 넘침. int형으로 변경 + + 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_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_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_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 + + 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 영역 인덱스 + + 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; // 동일한 마스크 중 가장 큰 결함의 크기. + + 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를 선택하는 인덱스. + //CString m_strStackStep[CFDEFECT_STACKCOUNT]; // Stack Step. + 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; // 결함 종류 + + 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_nPixelSizeOrigin; + int m_nScratchRatio; + int m_nDensity; // 원형 결함 구분을 위한 밀도 [2017.8.2 bhs] + + char m_strDefectName[16]; + char m_strDefectType[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) + + short m_nHliLevelIdx; // 몇 번째 레벨(채널)인가? + int m_nHliLayers; // 해당결함에 포함된 레이어 bit처리 + + BOOL m_bShrinked; //210323 CJH - Frame Shrink 정보 추가 + + char m_strAoiImagePath[255]; + char m_strReviewImagePath[255]; + + int m_nAlignRectLeft; + int m_nAlignRectTop; + int m_nAlignRectBottom; + int m_nAlignRectRight; + /*< LHS 20211029 - #3783 MOD Start >*/ + char m_strLNDefectCode[12]; + short/*LineDefectType*/ m_LineDefectType; + /*< LHS 20211029 - #3783 MOD End >*/ + + _grmDefectReviewData m_ReviewDefect; +}; + + +enum emGlassRawCommand +{ + grcNone = 0, + + //AOI Sequence + grcSequenceGlassLoading = 1, + grcSequenceInspectEnd = 2, + //Review Sequence + grcSequenceReviewStart = 3, + grcSequenceReviewEnd = 4, + + grcSequenceCustomReviewDataRead = 10, + + grcWriteRaw = 101, + grcReadRaw = 102, + + grcWriteBin = 201, + grcReadBin = 202, + + grcReviewWriteBIn = 301, + + grcGlassRawCommand +}; + + +struct _grmDitCommand +{ + struct _grmCommand + { + int nCommand; + char strParam[256]; + short nResult; + }; + short m_nCommandIdxWrite; + short m_nCommandIdxRead; + _grmCommand m_nCommandBuffer[COMMAND_MAXCOUNT]; +}; + +struct _grmDitMemInfo +{ + //공유 메모리 생성할 공간 결정 [김태현 2018/11/12] + size_t m_nGlassRawDataSize; + int m_nGlassMaxDataNum; + int m_nBlockMaxDataNum; + int m_nCellMaxDataNum; + int m_nDefectMaxDataNum; + int m_nStackMaxDataNum; + /*< KJG 20211024 - #3487 ADD Start >*/ + int m_nRawMergeMaxDataNum; + /*< KJG 20211024 - #3487 ADD End >*/ + + //Char 기준 자료가 있는 시작 위치 [김태현 2018/11/12] + int m_nGlassDataPoint; + int m_nBlockDataPoint; + int m_nCellDataPoint; + int m_nDefectDataPoint; + int m_nStackDataPoint; + /*< KJG 20211024 - #3487 ADD Start >*/ + int m_nRawMergeDataPoint; + /*< KJG 20211024 - #3487 ADD End >*/ + + int m_nSizeOfGlassData; + int m_nSizeOfBlockData; + int m_nSizeOfCellData; + int m_nSizeOfDefectData; + int m_nSizeOfStackData; + /*< KJG 20211024 - #3487 ADD Start >*/ + int m_nSizeOfRawMergeData; + /*< KJG 20211024 - #3487 ADD End >*/ +}; +struct _grmDitGlassRawInfo : public _grmDitMemInfo, public _grmDitCommand +{ + size_t m_nGlassLoadingCount; + emAOIProcStep m_ClientProcStep; //AOI, Review가 보낸 명령 + emAOIProcStep m_ServerProcStep; //GlassRaw Messenger(Server)가 처리 완료 한 명령 +}; + +class CgrmGlassRawData +{ +public: + CgrmGlassRawData() + { + m_pGlassRawData = NULL; + m_bRefAlloc = FALSE; + }; + + ~CgrmGlassRawData() + { + clear(); + }; + + void clear() + { + if(m_bRefAlloc) { m_pGlassRawData = NULL; return;} + + if(m_pGlassRawData) + { + delete [] m_pGlassRawData; + m_pGlassRawData = NULL; + } + }; + BOOL ImportGlassRaw(_grmDitMemInfo* pInfo, char* pData, bool bRefAlloc = false) + { + if(pInfo == NULL) return FALSE; + + if(m_pGlassRawData && pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) clear(); + + if(m_pGlassRawData == NULL) m_pGlassRawData = new char[ pInfo->m_nGlassRawDataSize ]; + + m_MemInfo = *pInfo; + + m_nGlassRawDataSize = pInfo->m_nGlassRawDataSize; + + m_nGlassMaxDataNum = pInfo->m_nGlassMaxDataNum ; + m_nBlockMaxDataNum = pInfo->m_nBlockMaxDataNum ; + m_nCellMaxDataNum = pInfo->m_nCellMaxDataNum ; + m_nDefectMaxDataNum = pInfo->m_nDefectMaxDataNum; + m_nStackMaxDataNum = pInfo->m_nStackMaxDataNum ; + + m_nGlassDataPoint = pInfo->m_nGlassDataPoint ; + m_nBlockDataPoint = pInfo->m_nBlockDataPoint ; + m_nCellDataPoint = pInfo->m_nCellDataPoint ; + m_nDefectDataPoint = pInfo->m_nDefectDataPoint ; + m_nStackDataPoint = pInfo->m_nStackDataPoint ; + + m_nSizeOfGlassData = pInfo->m_nSizeOfGlassData ; + m_nSizeOfBlockData = pInfo->m_nBlockDataPoint ; + m_nSizeOfCellData = pInfo->m_nSizeOfCellData ; + m_nSizeOfDefectData = pInfo->m_nSizeOfDefectData; + m_nSizeOfStackData = pInfo->m_nSizeOfStackData ; + + if(bRefAlloc) + { + m_pGlassRawData = pData; + } + else + { + if(pData) + { + memcpy(m_pGlassRawData, pData, sizeof(char)*pInfo->m_nGlassRawDataSize); + } + else + { + memset(m_pGlassRawData, 0, sizeof(char)*pInfo->m_nGlassRawDataSize ); + } + } + + + m_pGlassData = (_grmGlassData*)&m_pGlassRawData[pInfo->m_nGlassDataPoint]; + m_pBlockData = (_grmBlockData*)&m_pGlassRawData[pInfo->m_nBlockDataPoint]; + m_pCellData = (_grmCellData*)&m_pGlassRawData[pInfo->m_nCellDataPoint]; + m_pDefectData = (_grmDefectData*)&m_pGlassRawData[pInfo->m_nDefectDataPoint]; + m_pStackData = (_grmDefectData*)&m_pGlassRawData[pInfo->m_nStackDataPoint]; + + m_bRefAlloc = bRefAlloc; + return TRUE; + }; + BOOL ExportGlassRaw(_grmDitMemInfo* pInfo, char* pData) + { + if(pInfo == NULL || pData == NULL) return FALSE; + + if(1) //new type //메모리 총 공간 크기에 상관없이 + { + //if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE; + + if(pInfo->m_nSizeOfGlassData != m_MemInfo.m_nSizeOfGlassData) return FALSE; + if(pInfo->m_nSizeOfBlockData != m_MemInfo.m_nSizeOfBlockData) return FALSE; + if(pInfo->m_nSizeOfCellData != m_MemInfo.m_nSizeOfCellData) return FALSE; + if(pInfo->m_nSizeOfDefectData != m_MemInfo.m_nSizeOfDefectData) return FALSE; + if(pInfo->m_nSizeOfStackData != m_MemInfo.m_nSizeOfStackData) return FALSE; + + if(pInfo->m_nCellMaxDataNum < m_pGlassData->m_nCellNum) return FALSE; + if(pInfo->m_nDefectMaxDataNum < m_pGlassData->m_nDefectNum) return FALSE; + if(pInfo->m_nStackMaxDataNum < m_pGlassData->m_nDefectNum) return FALSE; + + memcpy(&pData[pInfo->m_nGlassDataPoint], m_pGlassData, pInfo->m_nSizeOfGlassData* 1); + memcpy(&pData[pInfo->m_nBlockDataPoint], m_pBlockData, pInfo->m_nSizeOfBlockData* 1); + memcpy(&pData[pInfo->m_nCellDataPoint], m_pCellData, pInfo->m_nSizeOfCellData*m_pGlassData->m_nCellNum); + memcpy(&pData[pInfo->m_nDefectDataPoint], m_pDefectData, pInfo->m_nSizeOfDefectData*m_pGlassData->m_nDefectNum); + memcpy(&pData[pInfo->m_nStackDataPoint], m_pStackData, pInfo->m_nSizeOfStackData*m_pGlassData->m_nDefectNum); + } + else //if() //type old + { + if(pInfo->m_nGlassRawDataSize != m_MemInfo.m_nGlassRawDataSize) return FALSE; + + if(pInfo->m_nSizeOfGlassData != m_MemInfo.m_nSizeOfGlassData) return FALSE; + if(pInfo->m_nSizeOfBlockData != m_MemInfo.m_nSizeOfBlockData) return FALSE; + if(pInfo->m_nSizeOfCellData != m_MemInfo.m_nSizeOfCellData) return FALSE; + if(pInfo->m_nSizeOfDefectData != m_MemInfo.m_nSizeOfDefectData) return FALSE; + + memcpy(pData, m_pGlassRawData, sizeof(char)*pInfo->m_nGlassRawDataSize); + } + + + return TRUE; + }; + + _grmGlassData* GetGlassData(){return m_pGlassData;}; + _grmBlockData* GetBlockData(int nIndex){return &m_pBlockData[nIndex];}; + _grmCellData* GetCellData(int nIndex){return &m_pCellData[nIndex];}; + _grmDefectData* GetDefectData(int nIndex){return &m_pDefectData[nIndex];}; + _grmDitMemInfo* GetMemInfo(){return &m_MemInfo;}; + _grmDefectData* GetStackData(int nIndex) { return &m_pStackData[nIndex]; }; +protected: + _grmDitMemInfo m_MemInfo; + char* m_pGlassRawData; + + _grmGlassData* m_pGlassData; + _grmBlockData* m_pBlockData; + _grmCellData* m_pCellData; + _grmDefectData* m_pDefectData; + _grmDefectData* m_pStackData; + + size_t m_nGlassRawDataSize; + + int m_nGlassMaxDataNum; + int m_nBlockMaxDataNum; + int m_nCellMaxDataNum; + int m_nDefectMaxDataNum; + int m_nStackMaxDataNum; + + int m_nGlassDataPoint; + int m_nBlockDataPoint; + int m_nCellDataPoint; + int m_nDefectDataPoint; + int m_nStackDataPoint; + + int m_nSizeOfGlassData; + int m_nSizeOfBlockData; + int m_nSizeOfCellData; + int m_nSizeOfDefectData; + int m_nSizeOfStackData; + +private: + bool m_bRefAlloc; +}; \ No newline at end of file diff --git a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h index d7fc000..58cf38c 100644 --- a/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h +++ b/ReviewHistory/ReveiwHistory/DitGlassRawStruct.h @@ -222,6 +222,10 @@ /* < KJG 20220225 - #3850 ADD Start >*/ char m_strRawMergeStepID[32]; /* < KJG 20220225 - #3850 ADD End >*/ + + /* < KMH 20220614 : #3957 ADD Start > */ + char m_strRawDefectCode[RAW_CODE_MAX][5]; // 4글자만 표기 + /* < KMH 20220614 : #3957 ADD End > */ }; struct _grmBlockData { @@ -479,6 +483,7 @@ int m_nUMCellY; // 셀 원점 기준 y 좌표 short m_nModelIdx; // 몇 번째 모델인가? short m_nCellIdx; // 몇번째 셀인가? + char m_strCellName[32]; // 셀 이름 /* < KMH 20220609 : #4183 ADD > */ short m_nCellGate; // 셀별 Gate라인(얼라인 보정 전) short m_nCellData; // 셀별 Data라인(얼라인 보정 전) short m_nCellGateAlign; // 셀별 Gate라인(얼라인 보정 후) diff --git a/ReviewHistory/bin/ReviewHistroy.exe b/ReviewHistory/bin/ReviewHistroy.exe index a3f69b4..299dc8a 100644 --- a/ReviewHistory/bin/ReviewHistroy.exe +++ b/ReviewHistory/bin/ReviewHistroy.exe Binary files differ diff --git a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h index d7fc000..58cf38c 100644 --- a/ReviewSystem/ReviewSystem/DitGlassRawStruct.h +++ b/ReviewSystem/ReviewSystem/DitGlassRawStruct.h @@ -222,6 +222,10 @@ /* < KJG 20220225 - #3850 ADD Start >*/ char m_strRawMergeStepID[32]; /* < KJG 20220225 - #3850 ADD End >*/ + + /* < KMH 20220614 : #3957 ADD Start > */ + char m_strRawDefectCode[RAW_CODE_MAX][5]; // 4글자만 표기 + /* < KMH 20220614 : #3957 ADD End > */ }; struct _grmBlockData { @@ -479,6 +483,7 @@ int m_nUMCellY; // 셀 원점 기준 y 좌표 short m_nModelIdx; // 몇 번째 모델인가? short m_nCellIdx; // 몇번째 셀인가? + char m_strCellName[32]; // 셀 이름 /* < KMH 20220609 : #4183 ADD > */ short m_nCellGate; // 셀별 Gate라인(얼라인 보정 전) short m_nCellData; // 셀별 Data라인(얼라인 보정 전) short m_nCellGateAlign; // 셀별 Gate라인(얼라인 보정 후) diff --git a/ReviewSystem/ReviewSystem/ReviewInterface.cpp b/ReviewSystem/ReviewSystem/ReviewInterface.cpp index 73bc99f..4bb293d 100644 --- a/ReviewSystem/ReviewSystem/ReviewInterface.cpp +++ b/ReviewSystem/ReviewSystem/ReviewInterface.cpp @@ -6626,12 +6626,11 @@ if (IsManualProcessMode()==FALSE) { return; } - CGlassResult *pGlassResult = m_pDoc->GlassResult_GetCurrentGlassResult(); - if(pGlassResult == NULL) return; + if (pGlassResult == NULL) return; const SDefectFilter *pDefectFilter = m_pDoc->Etc_GetDefectFilter(); - if(pDefectFilter == NULL) return; + if (pDefectFilter == NULL) return; int nMarginX = nDefectMarginX; //5000; // um int nMarginY = nDefectMarginY; //5000; // um @@ -6639,6 +6638,9 @@ MapDefectResult *pMapReviewResult = pGlassResult->GetMapDefectResult(); + BOOL bFind = FALSE; + + //Defect if (pMapReviewResult) { CDefectResult* pDefectResult = NULL; @@ -6646,28 +6648,28 @@ { pDefectResult = static_cast<CDefectResult*>(it->second); - if(pDefectResult == NULL) continue; + if (pDefectResult == NULL) continue; - if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult)==-1) continue; + //if (CDefectMap::FilterDefect(pDefectFilter, pDefectResult) == -1) continue; - if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX && - pDefectResult->nUMOriginX <= nDefectPosX + nMarginX && - pDefectResult->nUMOriginY >= nDefectPosY - nMarginY && + if (pDefectResult->nUMOriginX >= nDefectPosX - nMarginX && + pDefectResult->nUMOriginX <= nDefectPosX + nMarginX && + pDefectResult->nUMOriginY >= nDefectPosY - nMarginY && pDefectResult->nUMOriginY <= nDefectPosY + nMarginY) { + bFind = TRUE; + m_pView->UpdateSelectDefectList(pDefectResult->nDefectIdx); m_pView->UpdateSelectDefectMap(pDefectResult); - - m_pView->UpdateSelectDefectInfoMap(pDefectResult); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �젙蹂대�� �꽆湲대떎 - m_pView->UpdateSelectDefectInfo(pDefectResult->nDefectIdx); //taek 201214 �꽑�깮�븳 �뵒�럺�쓽 �궗吏� �젙蹂대�� �꽆湲대떎. nSelectedModuleIndex = Module_GetSelectedModuleIndex(); // �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜) - int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + int nGoModuleIndex = nSelectedModuleIndex; // �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞 - if(nGoModuleIndex >= 0) + if (nGoModuleIndex >= 0) { Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE); } @@ -6677,21 +6679,145 @@ break; } - if(IsManualProcessMode() != FALSE){ + if (IsManualProcessMode() != FALSE) { - Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera,pDefectResult ); + Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, pDefectResult); + return; } - // Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + // Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); - // [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽� + // [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽� if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE) { - WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE); + WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, (int)pDefectResult->dUMCenterOriginX, (int)pDefectResult->dUMCenterOriginY, TRUE); } break; } } } + + //User + if (bFind == FALSE) + { + CDefectResult* pDefectResult = NULL; + + VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserResult(); + if (pVecReviewResult == NULL) return; + + for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++) + { + CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it)); + + for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++) + { + + if (its->nUMOriginX >= nDefectPosX - nMarginX && + its->nUMOriginX <= nDefectPosX + nMarginX && + its->nUMOriginY >= nDefectPosY - nMarginY && + its->nUMOriginY <= nDefectPosY + nMarginY) + { + bFind = TRUE; + + pDefectResult = &(*its); + + m_pView->UpdateSelectDefectMap(pDefectResult); + + nSelectedModuleIndex = Module_GetSelectedModuleIndex(); + + // �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜) + //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + int nGoModuleIndex = nSelectedModuleIndex; + + // �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞 + if (nGoModuleIndex >= 0) + { + Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE); + } + else + { + g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home")); + break; + } + + if (IsManualProcessMode() != FALSE) { + + Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0); + return; + } + // Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + + // [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽� + if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE) + { + WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE); + } + break; + } + } + } + } + + //UserWSI + if (bFind == FALSE) + { + CDefectResult* pDefectResult = NULL; + + VectorReviewResult *pVecReviewResult = pGlassResult->GetVectorUserWsiResult(); + if (pVecReviewResult == NULL) return; + + for (VectorReviewResultIt it = pVecReviewResult->begin(); it != pVecReviewResult->end(); it++) + { + CReviewResult *pReviewResult = static_cast<CReviewResult*>(&(*it)); + + for (VectorSReviewResultIt its = pReviewResult->m_vecSReviewResult.begin(); its != pReviewResult->m_vecSReviewResult.end(); its++) + { + + if (its->nUMOriginX >= nDefectPosX - nMarginX && + its->nUMOriginX <= nDefectPosX + nMarginX && + its->nUMOriginY >= nDefectPosY - nMarginY && + its->nUMOriginY <= nDefectPosY + nMarginY) + { + bFind = TRUE; + + pDefectResult = &(*its); + + m_pView->UpdateSelectDefectMap(pDefectResult); + + nSelectedModuleIndex = Module_GetSelectedModuleIndex(); + + // �씠�룞�븷 紐⑤뱢 �씤�뜳�뒪 �븣�븘�궡湲� (紐⑤뱢蹂� limit �뜲�씠�꽣 �궗�슜) + //int nGoModuleIndex = Module_GetMoveIndex(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + int nGoModuleIndex = nSelectedModuleIndex; + + // �꽑�깮 紐⑤뱢�쓣 �젣�쇅�븳 �굹癒몄� �솃�룞�옉 �옉�룞 + if (nGoModuleIndex >= 0) + { + Motor_HomeGoExceptOne(nGoModuleIndex, pDefectFilter->bAutoSelectCamera, TRUE); + } + else + { + g_pLog->DisplayMessage(_T("[Error] Can't Move Motor to Home")); + break; + } + + if (IsManualProcessMode() != FALSE) { + + Motor_CameraGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera, NULL, 0, 0); + return; + } + // Motor_CameraCenterGo(nSelectedModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectFilter->bAutoSelectCamera); + + // [2017:1:19]-[WEZASW] : WSI Manual Measurement 湲곕뒫 異붽� + if (pDefectFilter->bUseWSI == TRUE && pDefectFilter->bUseWSIMeasurement == TRUE) + { + WSI_SetManualMeasurement(nGoModuleIndex, pDefectResult->nUMOriginX, pDefectResult->nUMOriginY, pDefectResult->dUMCenterOriginX, pDefectResult->dUMCenterOriginY, TRUE); + } + break; + } + } + } + } + } @@ -7297,12 +7423,12 @@ - if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos) - { - IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION); - g_pLog->DisplayMessage(_T("Limit 珥덇낵")); - return FALSE; - } +// if (dDefectPosX > dXposPlusLimitPos|| dDefectPosX<dXposMinusLimitPos|| dDefectPosY > dYposPlusLimitPos|| dDefectPosY < dYposMinusLimitPos) +// { +// IDNO == AfxMessageBox(_T("Limit�쓣 珥덇낵 �븯�뿬 媛덉닔 �뾾�뒿�땲�떎."), MB_YESNO | MB_ICONQUESTION); +// g_pLog->DisplayMessage(_T("Limit 珥덇낵")); +// return FALSE; +// } double n1stGantryXpos, n1stGantryYpos, n2ndGantryXpos, n2ndGantryYpos; double dDistance,dCameraDistance; @@ -7589,44 +7715,48 @@ dPosX += MagOffsetX * 1000;//GlassOffsetX*1000+MagOffsetX*1000; dPosY+= MagOffsetY * 1000;//GlassOffsetY*1000+MagOffsetY*1000; - double xpostemp = 0; - double ypostemp = 0; - - GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX/1000, xpostemp, ypostemp); - xpostemp = floor(xpostemp * 1000); - ypostemp = floor(ypostemp * 1000); - //210127 - if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2) + if (pDefectResult != NULL) { - if (nModuleIndex == 0) + double xpostemp = 0; + double ypostemp = 0; + + GetOffSetValue(nModuleIndex, pDefectResult->nAOICameraIdx, pDefectResult->nAOIScanIdx, nDefectPosX / 1000, xpostemp, ypostemp); + xpostemp = floor(xpostemp * 1000); + ypostemp = floor(ypostemp * 1000); + //210127 + if (m_pDoc->System_GetMotorInfo()->GetOriginDirection() == 2) { - dPosX += xpostemp; - dPosY += ypostemp; + if (nModuleIndex == 0) + { + dPosX += xpostemp; + dPosY += ypostemp; + } + else + { + dPosX += xpostemp * -1; + dPosY += ypostemp; + } } else { - dPosX += xpostemp * -1; - dPosY += ypostemp; + if (nModuleIndex == 0) + { + dPosX += xpostemp; + dPosY += ypostemp * -1; + } + else + { + dPosX += xpostemp * -1; + dPosY += ypostemp * -1; + } } - } - else - { - if (nModuleIndex == 0) - { - dPosX += xpostemp; - dPosY += ypostemp * -1; - } - else - { - dPosX += xpostemp * -1; - dPosY += ypostemp * -1; - } - } - g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX,MagOffsetY,dPosX/1000.0,dPosY/1000.0); - //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY); - //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY); + g_pLog->DisplayMessage(_T("[OFFSetOn]MotorOffset: %.3lf, %.3lf MagOffset: %.3lf, %.3lf Glass Pos : %.3lf, %.3lf"), xpostemp, ypostemp, MagOffsetX, MagOffsetY, dPosX / 1000.0, dPosY / 1000.0); + //dPosX= ApplyMagAndGlassOffset(nModuleIndex,0,dPosX, dPosY); + //dPosY= ApplyMagAndGlassOffset(nModuleIndex,1,dPosX, dPosY); + } + } return Motor_CameraGo(nModuleIndex, dPosX/1000.0, dPosY/1000.0, bAutoSelectCamera, bGoEnd); diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp index d0f3204..bb8d7f2 100644 --- a/ReviewSystem/ReviewSystem/SequenceProcessor.cpp +++ b/ReviewSystem/ReviewSystem/SequenceProcessor.cpp @@ -86,6 +86,7 @@ //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD START m_bSimulationMode = FALSE; //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD END + m_bReviewComplete = FALSE; InitializeCriticalSection(&m_csProcessStatus); } diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor.h b/ReviewSystem/ReviewSystem/SequenceProcessor.h index a81eb75..7bcd1d5 100644 --- a/ReviewSystem/ReviewSystem/SequenceProcessor.h +++ b/ReviewSystem/ReviewSystem/SequenceProcessor.h @@ -748,6 +748,8 @@ //WSI END 泥댄겕瑜� �쐞�븳 �븿�닔 190725 chm int GetCheckWSIEnd(){return m_nCheckWSIEnd;}; // wsi end �뿬遺� void SetCheckWSIEnd(int nCheck){ m_nCheckWSIEnd=nCheck;}; //wsi end �뿬遺� + int GetReviewComplete() { return m_bReviewComplete; } + void SetReviewComplete(BOOL bValue) { m_bReviewComplete = bValue; } int GetWsiType(){return m_nWsiTyep;}; void SetWsiType(int i){ m_nWsiTyep=i;}; void SendWsiErrorAlarm(); @@ -808,4 +810,5 @@ //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD START BOOL m_bSimulationMode; //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 ADD END + BOOL m_bReviewComplete; }; \ No newline at end of file diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp index 736acff..9cbdfb2 100644 --- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp +++ b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp @@ -665,10 +665,12 @@ // m_pSP2P->ISP2P_GetWSIControl(1)->SendWsiAfmSafePosMove(); //} //Sleep(5000); - if (GetProcessStatus() != ProcessReviewEnd_CPJT && GetProcessStatus() != ProcessReviewUnloding_CPJT) + //if (GetProcessStatus() != ProcessReviewEnd_CPJT && GetProcessStatus() != ProcessReviewUnloding_CPJT) + if (GetReviewComplete() == FALSE) { SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS); SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT); + SetReviewComplete(TRUE); } m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!")); @@ -939,6 +941,8 @@ SetCheckWSIEnd(-1); //190726 SetWsiType(-1); //wsi reflow SetLastPointCheck(FALSE); + + SetReviewComplete(FALSE); bFileFind = FALSE; @@ -1745,7 +1749,8 @@ m_pDitGlassRaw->GetGlassData()->m_nReviewNum = m_pSP2P->ISP2P_GetReviewProcessor()->GetPlanReviewCount(); //SendDVDataToSignalControl(); - if (GetLastPointCheck() == FALSE) + //if (GetLastPointCheck() == FALSE) + if (GetReviewComplete() == FALSE) { //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD START if (GetSimulationMode() == FALSE) @@ -1753,6 +1758,7 @@ SendResultToSignalControl(PCControlSendData_ReviewResult_CPJT, SIGNAL_SEND_RESULT_SUCCESS); SendSignalToSignalControl(PCControlSendSignalIndex_Seq, PCControlSend_ReviewComplete_CPJT); m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Success Signal!")); + SetReviewComplete(TRUE); } //#3584 210817 LYW CF AOI Review �떆裕щ젅�씠�뀡 湲곕뒫 �젙�긽�솕 MOD END //original -- Gitblit v1.9.3