From 9ad2aa59da822e9d30c5e0cd677025fe6e12df95 Mon Sep 17 00:00:00 2001 From: LYW <leeyeanwoo@diteam.co.kr> Date: 화, 09 11월 2021 17:37:17 +0900 Subject: [PATCH] Ongoing90 #3662 CF AOI Review 전설비 알람 발생 조치 --- ReviewHistory/ReveiwHistory/GlassRawRTMS.cpp | 849 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 849 insertions(+), 0 deletions(-) diff --git a/ReviewHistory/ReveiwHistory/GlassRawRTMS.cpp b/ReviewHistory/ReveiwHistory/GlassRawRTMS.cpp new file mode 100644 index 0000000..f286af8 --- /dev/null +++ b/ReviewHistory/ReveiwHistory/GlassRawRTMS.cpp @@ -0,0 +1,849 @@ +#include "StdAfx.h" +#include "GlassRawRTMS.h" +#include "akLoggerExt.h" +#include "GlassRawCSOT.h" +#include "MacroResultFile.h" + +#define RTMSTEMPPATH _T("D:\\DitRtms\\Data\\TempFile\\") +#define RTMSRAWPATH _T("D:\\DitRtms\\Data\\RawFile\\") +#define DEFECTPATH _T("D:\\Image\\Defect") +#define RTMSIMAGEPATH _T("D:\\DitRtms\\Data\\ReviewImage\\") + +char* g_pCellCode2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + +//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 DefectLocation { DefectLoc_Pattern = 0, DefectLoc_Crack, DefectLoc_BM, DefectLoc_ASG, DefectLoc_PAD, DefectLoc_C2C, DefectLoc_EdgeLine, DefectLoc_Proj, DefectLoc_Chip, DefectLoc_Corner }; +//enum SERVER_DefectType { DefectType_TBlack = 0, DefectType_TWhite, DefectType_RBlack, DefectType_RWhite, DefectType_BBlack, DefectType_BWhite, DefectType_Unknown }; +//enum SERVER_DefectSubType { DefectSubType_Normal = 0, DefectSubType_MC, DefectSubType_Mask, DefectSubType_Common, DefectSubType_NoDefect }; + +CGlassRawRTMS::CGlassRawRTMS(void) +{ +} + +CGlassRawRTMS::~CGlassRawRTMS(void) +{ +} + +BOOL CGlassRawRTMS::SequenceGlassLoading( CgrmGlassRawData* pData ) +{ + return TRUE; +} + +BOOL CGlassRawRTMS::SequenceInspectEnd( CgrmGlassRawData* pData ) +{ + WriteAOIFile(pData); + + return TRUE; +} + +BOOL CGlassRawRTMS::SequenceReviewStart( CgrmGlassRawData* pData ) +{ + return TRUE; +} + +BOOL CGlassRawRTMS::SequenceReviewEnd( CgrmGlassRawData* pData ) +{ + WriteAOIFile(pData); + + return TRUE; +} + + +BOOL CGlassRawRTMS::WriteAOIFile( CgrmGlassRawData* pData ) +{ + BOOL bResult = TRUE; + + bResult &= MakeAOIPreProcessing(pData); + bResult &= MakeAOIFile(pData); + bResult &= CopyRTMSFiles(pData); + + if(bResult)AKLOG("Write RTMS File Complete"); + else AKLOG("Write RTMS File Fail"); + return TRUE; +} + +BOOL CGlassRawRTMS::MakeAOIFile( CgrmGlassRawData* pData ) +{ + _grmGlassData* pGlass = pData->GetGlassData(); + + CString strFilePathName = m_strRTMSRAWFile; + + FILE* pf = fopen(strFilePathName.GetBuffer(0), "w"); + if(pf == NULL) return FALSE; + + + + CString strLine; + //Glass + { + CString strItems = "ITEM,GLASSITEM,LOTITEM,LOT_ID,LOT_TYPE,STEP_ID,EQUIPMENT_ID,EQUIPMENT_UNIT,GLS_ID,SLOT_ID,GLS_JUDGE,GLS_GRADE,PRODUCT_ID,CASSETTE_ID,OPERATOR_ID,RECIPE_NAME,AUTO_MODE,PNL_ORIGIN,PROCESSING_TIME,START_TIME,END_TIME,CAMERA_CNT,SCAN_CNT,INSP_TACT, REVIEW_TACT, CIM_ONOFF,PROCESS_ID,PROD_TYPE,BATCHID,H_PANELID,E_PANELID,P_PANELID,COMP_COUNT,PPID"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + makeDataGlass(strLine, pGlass); + + fprintf(pf, "%s\n", strLine); + } + + //Cell + { + CString strItems = "ITEM,CELLITEM,PANEL_ID,PANEL_GRADE,COORD_X,COORD_Y,CELL_SIZE_X,CELL_SIZE_Y,GATE_LINE,DATA_LINE,LAMP_GRAY_01,LAMP_GRAY_02,LAMP_GRAY_03,LAMP_GRAY_04"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + for(int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++) + { + _grmCellData* pCell = pData->GetCellData(iCell); + makeDataCell(strLine, pGlass, pCell); + fprintf(pf, "%s\n", strLine); + } + + } + + //Defect + { // DEFECT_TYPE_3 빠짐 // RTMS Defect 정보 추가 [ 21-03-08 KJG ] + CString strItems = "ITEM,DEFITEM,POINT_NO,PANEL_ID,PR_X,PR_Y,PR_DATA,PR_GATE,SE_X,SE_Y,SE_DATA,SE_GATE,DEFECT_LAYER,DETECTED_AREA,DEFECT_SIZE_TYPE,DEFECT_SIZE_X,DEFECT_SIZE_Y,DEFECT_LENGTH,DEFECT_AREA,DEFECT_TYPE_1,DEFECT_TYPE_2,REPEAT_DEFECT,MASK_DEFECT,IMAGE_FILE1,IMAGE_FILE2,SCAN_NO,CAMERA_NO,RSCALE,SIZE_AREA,PEAK,REV_RESOLUTION,REV_CAMNUM,REV_MAG,DEFECT_CODE,DEFECT_GRADE,STACK_FLAG,STACK_COUNT,STACK_STEP,ZONE_NO,GRAY_MIN,GRAY_MAX,GRAY_AVG,R_GRAY_MIN,R_GRAY_MAX,R_GRAY_AVG"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + for(int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++) + { + _grmDefectData* pDefect = pData->GetDefectData(iDefect); + //210203 CJH - CutOff 대상 결과파일 작성 제외 + if (pDefect->m_bDefectCutoff == TRUE) continue; + + makeDataDefect(strLine, pData->GetGlassData(), pData->GetCellData(pDefect->m_nCellIdx), pDefect); + fprintf(pf, "%s\n", strLine); + } + } + + //Camera + { + CString strItems = "ITEM,CAMERAITEM,SCAN_NO,CAMERA_NO,LAMP,MAX,AVG,MIN"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + for(int iScan=0; iScan < pGlass->m_nScanNum; iScan++) + { + for(int iCam=0; iCam < pGlass->m_nCameraNum; iCam++) + { + makeDataCamera(strLine, pGlass, iCam, iScan); + fprintf(pf, "%s\n", strLine); + } + } + } + + + //WSI + { + CString strItems = "ITEM,WSIITEM,WSI_NO,TYPE,NAME,JUDGE,CELLID,COORD_X,COORD_Y,COORD_X2,COORD_Y2,IMG_FILE_2D,IMAGE_FILE_3D,WSI_RESOLUTION"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + for(int iDefect = 0; iDefect < pGlass->m_nDefectNum; iDefect++) + { + _grmDefectData* pDefect = pData->GetDefectData(iDefect); + if(pDefect->m_ReviewDefect.m_nWsi_Type == 2) + { + makeDataWSI(strLine, &pDefect->m_ReviewDefect); + fprintf(pf, "%s\n", strLine); + } + } + } + + //Mura + if(m_pMuraResultFile && m_pMuraResultFile->IsRead()) + { + CString strItems = "ITEM,MURAITEM,DATE,TIME,DEFECTNO,RECIPE,GLASSID,CELLID,COORD_X1,COORD_Y1,COORD_PX1,COORD_PY1,NOMURA,SIZE_W,SIZE_L,SIZE_S,MAIN_TYPE,SUB_TYPE,PEAK,G_MIN,G_MAX,G_AVG,CAM,SCAN,PIXEL_PEAK,REGION,SIZE_T,PEAK_T,IMG_FILE_NAME"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + _MacroDefect* pMuraDefect; + int nSize = (int)m_pMuraResultFile->GetDefectNum(); + + for(int iMuraDefect=0; iMuraDefect < nSize; iMuraDefect++) + { + pMuraDefect = m_pMuraResultFile->GetDefect(iMuraDefect); + makeMuraDefect(strLine, pMuraDefect); + fprintf(pf, "%s\n", strLine); + } + + } + + // Measure + if(0) + { + CString strItems = "ITEM,LOCITEM,MEASURE_NO,MEASURE_TYPE,MEASURE_NAME,CELL_ID,X_COORDINATE_1,Y_COORDINATE_1,X_COORDINATE_2,Y_COORDINATE_2,X_SHIFT,Y_SHIFT,IMAGENAME,SHIFTDIST,ACTIVETOSEALANT,SEALSIZE"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + // 사용 안함 + } + + // User Review + { + CString strItems = "ITEM,USERREVITEM,USER_NO,PR_X,PR_Y,IMAGE_FILE_NAME,REV_RESOLUTION"; + fprintf(pf, "%s\n", strItems.GetBuffer(0)); + + for(int iDefect = 0; iDefect < pGlass->m_nDefectNum; iDefect++) + { + _grmDefectData* pDefect = pData->GetDefectData(iDefect); + if(pDefect->m_ReviewDefect.m_nPlanType == ditRaw::RPT_User) + { + makeUserReview(strLine, &pDefect->m_ReviewDefect); + fprintf(pf, "%s\n", strLine); + } + } + + } + + fclose(pf); + return TRUE; +} + + +void CGlassRawRTMS::makeDataGlass( CString& strLine, _grmGlassData* pGlassData ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("GLASSDATA"); // GLASSITEM + strLine += strValue+strDiv; + strValue.Format("LOTDATA"); // LOTITEM + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strLotID); // LOT_ID + strLine += strValue+strDiv; + strValue.Format("LOTTYPE"); // LOT_TYPE + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strStepID); // STEP_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strOperID); // EQUIPMENT_ID //210127 CJH - Equip ID <-> Oper ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strEquipID); // EQUIPMENT_UNIT + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strGlassID); // GLS_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strSLotID); // SLOT_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strGlassJudge); // GLAS_JUDGE + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strGlassCode); // GLS_GRADE or Glass Code //**GRADE가 코드? + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strProductID); // PRODUCDT_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strCSTID); // CASSETTE_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strEPPID); // OPERATOR_ID + strLine += strValue+strDiv; + strValue.Format("%s", pGlassData->m_strRecipeName); // RECIPE_NAME + strLine += strValue+strDiv; + strValue.Format("%s", "AUTO_MODE"); // AUTOMODE + strLine += strValue+strDiv; + + if(pGlassData->m_nOriginDirection == 0) strValue.Format("Left Top"); // PNL_ORIGIN + else if(pGlassData->m_nOriginDirection == 1) strValue.Format("Right Top"); + else if(pGlassData->m_nOriginDirection == 10) strValue.Format("Left Bottom"); + else strValue.Format("Right Bottom"); + strLine += strValue+strDiv; + + strValue.Format("%s", "PROCESSING_TIME"); // PROCESSING_TIME + strLine += strValue+strDiv; + strValue.Format("%04d%02d%02d_%02d%02d%02d" // START_TIME + ,pGlassData->m_tmGlassLoading.GetYear() + ,pGlassData->m_tmGlassLoading.GetMonth() + ,pGlassData->m_tmGlassLoading.GetDay() + ,pGlassData->m_tmGlassLoading.GetHour() + ,pGlassData->m_tmGlassLoading.GetMinute() + ,pGlassData->m_tmGlassLoading.GetSecond() ); + strLine += strValue+strDiv; + strValue.Format("%04d%02d%02d_%02d%02d%02d" // END_TIME + ,pGlassData->m_tmInspectionEND.GetYear() + ,pGlassData->m_tmInspectionEND.GetMonth() + ,pGlassData->m_tmInspectionEND.GetDay() + ,pGlassData->m_tmInspectionEND.GetHour() + ,pGlassData->m_tmInspectionEND.GetMinute() + ,pGlassData->m_tmInspectionEND.GetSecond() ); + strLine += strValue+strDiv; + + strValue.Format("%d", pGlassData->m_nCameraNum); // CAMERA_CNT + strLine += strValue+strDiv; + strValue.Format("%d", pGlassData->m_nScanNum); // SCAN_CNT + strLine += strValue+strDiv; + + strValue.Format("%d", pGlassData->m_tmInspectionEND-pGlassData->m_tmGlassLoading); // INSP_TACT + strLine += strValue+strDiv; + strValue.Format("%d", pGlassData->m_tmReviewEnd - pGlassData->m_tmReviewLoading); // REVIEW_TACT + strLine += strValue + strDiv; + + strValue.Format("%s", "CIM_ONOFF"); + strLine += strValue + strDiv; // CIM_ONOFF -SM + //210128 CJH - RTMS SDC 물류데이터 추가 + strValue.Format("%s", pGlassData->m_strProcessID); + strLine += strValue + strDiv; + strValue.Format("%s", pGlassData->m_strProdType); + strLine += strValue + strDiv; + CString strTemp; + strTemp = pGlassData->m_strGlassID; + strValue.Format("%s", strTemp.Left(6)); + strLine += strValue + strDiv; + strValue.Format("%s", pGlassData->m_strGlassID); + strLine += strValue + strDiv; + strValue.Format("%s", pGlassData->m_strEPPID); + strLine += strValue + strDiv; + strValue.Format("%s", pGlassData->m_strPairHPanelID); + strLine += strValue + strDiv; + strValue.Format("%d", pGlassData->m_nCellNum); + strLine += strValue + strDiv; + strValue.Format("%s", pGlassData->m_strPPID); + strLine += strValue; + +} + + +void CGlassRawRTMS::makeDataCell( CString& strLine, _grmGlassData* pGlassData, _grmCellData* pCellData ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("CELLDATA"); // CELLITEM + strLine += strValue+strDiv; + strValue.Format("%s",pCellData->m_strCellName); // PANEL_ID + strLine += strValue+strDiv; + { + if(pCellData->m_nJudgement == Judge_OK) strValue = "Judge_OK"; // PANEL_GRADE // PNL_GRADE + else if(pCellData->m_nJudgement == Judge_NG) strValue = "Judge_NG"; + else if(pCellData->m_nJudgement == Judge_Rework) strValue = "Judge_Rework"; + else if(pCellData->m_nJudgement == Judge_RP) strValue = "Judge_RP"; + else if(pCellData->m_nJudgement == Judge_Review) strValue = "Judge_Review"; + else if(pCellData->m_nJudgement == Judge_RC) strValue = "Judge_RC"; // 미처리 + else if(pCellData->m_nJudgement == Judge_Size) strValue = "Judge_Size"; //skip + else if (pCellData->m_nJudgement == Judge_TR) strValue = "Judge_TR"; + else if (pCellData->m_nJudgement == Judge_PR) strValue = "Judge_PR"; + else strValue = "Judge_OK"; + } + strLine += strValue+strDiv; + + strValue.Format("%d", pCellData->m_rectCellLeft); // COORD_X + strLine += strValue+strDiv; + strValue.Format("%d", pCellData->m_rectCellTop); // COORD_Y + strLine += strValue+strDiv; + strValue.Format("%d", pCellData->m_rectCellRight - pCellData->m_rectCellLeft); // CELL_SIZE_X + strLine += strValue+strDiv; + strValue.Format("%d", pCellData->m_rectCellBottom - pCellData->m_rectCellTop); // CELL_SIZE_Y + strLine += strValue+strDiv; + + strValue.Format("%d", pCellData->m_nGateNum); // LN_GATE : Gate line 갯수 + strLine += strValue+strDiv; + strValue.Format("%d", pCellData->m_nDataNum); // LN_DATA : Data line 갯수 + strLine += strValue+strDiv; + + strValue.Format("LAMP_GRAY_01"); // LAMP_GRAY_01 + strLine += strValue+strDiv; + strValue.Format("LAMP_GRAY_02"); // LAMP_GRAY_02 + strLine += strValue+strDiv; + strValue.Format("LAMP_GRAY_03"); // LAMP_GRAY_03 + strLine += strValue+strDiv; + strValue.Format("LAMP_GRAY_04"); // LAMP_GRAY_04 + strLine += strValue+strDiv; + +} + +void CGlassRawRTMS::makeDataDefect( CString& strLine, _grmGlassData* pGlassData, _grmCellData* pCellData, _grmDefectData* pDefectData ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("DEFDATA"); // DEFITEM + strLine += strValue+strDiv; + + strValue.Format("%d", pDefectData->m_nDefectID); // POINT_NO + strLine += strValue+strDiv; + strValue.Format("%c%c", '0' + pDefectData->m_nCellIdx / 36, g_pCellCode2[pDefectData->m_nCellIdx % 36]); // PANEL_ID + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMOriginX); // PR_X + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMOriginY); // PR_Y + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nCellData); // PR_DATA + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nCellGate); // PR_GATE + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMCenterAlignX); // SE_X + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMCenterAlignY); // SE_Y + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nCellData); // SE_DATA + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nCellGate); // SE_GATE + strLine += strValue+strDiv; + strValue.Format("%s", "DEFECT_LAYER"); // DEFECT_LAYER + strLine += strValue+strDiv; + { + int m_nDefectedArea = pDefectData->m_sDefectLoc; // DEFECTED_AREA // DETECTED_AREA + if(m_nDefectedArea == DefectLoc_Pattern) strValue = "PATTERN"; + else if(m_nDefectedArea == DefectLoc_Crack) strValue = "CRACK"; + else if(m_nDefectedArea == DefectLoc_BM) strValue = "BM"; + else if(m_nDefectedArea == DefectLoc_ASG) strValue = "ASG"; + else if(m_nDefectedArea == DefectLoc_PAD) strValue = "PAD"; + else if(m_nDefectedArea == DefectLoc_C2C) strValue = "C2C"; + else if(m_nDefectedArea == DefectLoc_EdgeLine) strValue = "EdgeLine"; + else if(m_nDefectedArea == DefectLoc_Proj) strValue = "Proj"; + else if(m_nDefectedArea == DefectLoc_Chip) strValue = "Chip"; + else if(m_nDefectedArea == DefectLoc_Corner) strValue = "Corner"; + else strValue = ""; + } + strLine += strValue+strDiv; + { + int m_nDefectSizeType = pDefectData->m_DefectSizeType; // DEFECT_SIZE_TYPE // DEFECT_SIZE_TYPE + if(m_nDefectSizeType == 0) strValue = "S"; + else if(m_nDefectSizeType == 1) strValue = "M"; + else if(m_nDefectSizeType == 2) strValue = "L"; + else if(m_nDefectSizeType == 3) strValue = "H"; + else if(m_nDefectSizeType == 4) strValue = "U"; + else strValue = "S"; + } + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMSizeX); // DEFECT_SZE_X + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMSizeY); // DEFECT_SIZE_Y + strLine += strValue+strDiv; + + //strValue.Format("%s", "DEFECT_LENGTH"); // DEFECT_LENGTH + double dUmRscale = pDefectData->m_nDefectRScale * pDefectData->m_dScanResolution; + strValue.Format("%.2lf", dUmRscale); // DEFECT_LENGTH + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nPixelSize); // DEFECT_AREA + strLine += strValue+strDiv; + { + int m_nDefectType1 = pDefectData->m_DefectBDType; // DEFECT_TYPE_1 (B, W, Unknown) + if(m_nDefectType1==DefectType_TBlack || m_nDefectType1==DefectType_RBlack) strValue = "B"; + else if(m_nDefectType1==DefectType_TWhite || m_nDefectType1==DefectType_RWhite) strValue = "W"; + else strValue = "Unknown"; + } + strLine += strValue+strDiv; + { + // DEFECT_TYPE_2 (Normal / MC / Mask / Common / NoDefect) + int m_nDefectType2 = pDefectData->m_DefectSubType; + + if(m_nDefectType2 == DefectSubType_Normal) strValue = "Normal"; + else if(m_nDefectType2 == DefectSubType_MC) strValue = "MC"; + else if(m_nDefectType2 == DefectSubType_Mask) strValue = "Mask"; + else if(m_nDefectType2 == DefectSubType_Common) strValue = "Common"; + else if(m_nDefectType2 == DefectSubType_NoDefect) strValue = "NoDefect"; + else strValue = "UN"; + + } + strLine += strValue+strDiv; + + { + if(pDefectData->m_DefectSubType == DefectSubType_Common) strValue = "Y"; // REPEAT_DEFECT + else strValue = "N"; + } + strLine += strValue+strDiv; + { + if(pDefectData->m_DefectSubType == DefectSubType_Mask) strValue = "Y"; // MASK_DEFECT + else strValue = "N"; + } + strLine += strValue+strDiv; + + strValue.Format("%s", pDefectData->m_strAoiImageName); // IMAGE_FILE1 + strLine += strValue+strDiv; + + strValue.Format("%s", pDefectData->m_ReviewDefect.m_strRevImageName); // IMAGE_FILE2 + strLine += strValue+strDiv; + + strValue.Format("%d", pDefectData->m_nScanIdx); // SCAN_NO + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nCameraID); // CAMERA_NO + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nDefectRScale); // RSCALE + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_nUMSize); // SIZE_AREA + strLine += strValue+strDiv; + strValue.Format("%d", pDefectData->m_sDefectPeak); // PEAK + strLine += strValue+strDiv; + + float fReviewResol = 0.1725; //20배 단배율 // 3.45/20 + strValue.Format("%.4lf", fReviewResol); // REV_RESOLUTION + strLine += strValue+strDiv; + + //210128 CJH - RTMS Review 정보 추가 + if (strlen(pDefectData->m_ReviewDefect.m_strRevImageName)) + { + strValue.Format("%d", pDefectData->m_ReviewDefect.m_nModuleIndex); // REV_Cam Number + strLine += strValue + strDiv; + } + else + { + strValue.Format("-1"); + strLine += strValue + strDiv; + } + + strValue.Format("%d", 20); // REV_Magnification + strLine += strValue + strDiv; + + strValue.Format("%s", pDefectData->m_strDefectCode); // DEFECT_CODE, DEFECT_GRADE, STACK_FLAG, STACK_COUNT, STACK_STEP, ZONE_NO, GRAY_MIN, ...,R_SRC_AVG 추가 [ 21-03-08 KJG ] + strLine += strValue + strDiv; // DEFECT_CODE + + strValue.Format("%s", GetDefectInfoToString(DMT_DefectJudge, pDefectData->m_DefectJudgement)); + strLine += strValue + strDiv; // DEFECT_GRADE + + int nStackFlag = pDefectData->m_StackInfo; // STACK_FLAG + if (nStackFlag == Stack_Unknown) strValue = "UK"; + else if (nStackFlag == Stack_TD) strValue = "TD"; + else if (nStackFlag == Stack_SD) strValue = "SD"; + else if (nStackFlag == Stack_PD) strValue = "PD"; + else if (nStackFlag == Stack_SP) strValue = "SP"; + else strValue = "UK"; + + strLine += strValue + strDiv; + + strValue.Format("%2d", pDefectData->m_nStackStepCount); // STACK_COUNT + strLine += strValue + strDiv; + + if (strlen(pDefectData->m_strStackFirst)) // STACK_STEP + { + strValue.Format("%s", pDefectData->m_strStackFirst); + strValue.Replace(',', '_'); // 열 구분자가 ',' 이므로 '_'로 변경 [ 21-03-15 KJG ] + strLine += strValue + strDiv; + } + else + { + strValue.Format(" "); + strLine += strValue + strDiv; + } + + int nValue = 0; // ZONE_NO + for (int i = 15; i >= 0; i--) + { + if (pDefectData->m_sZonePixelCount[i] > 0) + nValue += 1; + if (i > 0) + nValue = nValue << 1; + } + strValue.Format("%04X", nValue); + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelSrcMin); // GRAY_MIN + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelSrcMax); // GRAY_MAX + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelSrcAvg); // GRAY_AVG + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelRefMin); // R_SRC_MIN + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelRefMax); // R_SRC_MAX + strLine += strValue + strDiv; + + strValue.Format("%d", pDefectData->m_nLevelRefAvg); // R_SRC_AVG + strLine += strValue + strDiv; + +} + +void CGlassRawRTMS::makeDataCamera( CString& strLine, _grmGlassData* pGlassData, int nCamIdx, int nScanIdx ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); + strLine += strValue+strDiv; + strValue.Format("CAMERADATA"); + strLine += strValue+strDiv; + + strValue.Format("%d", nScanIdx); + strLine += strValue+strDiv; + strValue.Format("%d", nCamIdx); + strLine += strValue+strDiv; + strValue.Format("LAMP"); + strLine += strValue+strDiv; + strValue.Format("%d", pGlassData->m_nGrayLevelMax[pGlassData->m_nCameraNum*nScanIdx + nCamIdx]); + strLine += strValue+strDiv; + strValue.Format("%d", pGlassData->m_nGrayLevelAvg[pGlassData->m_nCameraNum*nScanIdx + nCamIdx]); + strLine += strValue+strDiv; + strValue.Format("%d", pGlassData->m_nGrayLevelMin[pGlassData->m_nCameraNum*nScanIdx + nCamIdx]); + strLine += strValue+strDiv; +} + +void CGlassRawRTMS::makeDataWSI( CString& strLine, _grmDefectReviewData* pWSIData ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("WSIDATA"); // USERREVITEM + strLine += strValue+strDiv; + strValue.Format("%s","USER_NO"); // USER_NO + strLine += strValue+strDiv; + + // 주석 처리 부분 데이터 들어오면 쓸 것 + //CString strWSIType; + //if (pWSIData->m_fWsi_ResultData[0] == 1) + // strWSIType.Format("%s", "Positive"); // 돌기 + //else if (pWSIData->m_fWsi_ResultData[0] == 0) + // strWSIType.Format("%s", "Negative"); // 함몰 + //else + // strWSIType.Format("%s", "Flat"); + //strValue.Format("%s",strWSIType); // TYPE + + strValue.Format("%s","TYPE"); // TYPE + + strLine += strValue+strDiv; + //strValue.Format("%d", pWSIData->m_nWsi_Type); // WSI_NAME + strValue.Format("%s", "WSI_NAME"); // WSI_NAME + + strLine += strValue+strDiv; + strValue.Format("%s", "JUDGE"); // JUDGE + strLine += strValue+strDiv; + //strValue.Format("%d", pWSIData->m_fWsi_ResultData[2]); // COORD_X?? + strValue.Format("%s", "COORD_X"); // COORD_X?? + strLine += strValue+strDiv; + //strValue.Format("%d", pWSIData->m_fWsi_ResultData[1]); // COORD_Y?? + strValue.Format("%s", "COORD_Y"); // COORD_Y?? + strLine += strValue+strDiv; + strValue.Format("%s", "COORD_X2"); // COORD_X2 + strLine += strValue+strDiv; + strValue.Format("%s", "COORD_Y2"); // COORD_Y2 + strLine += strValue+strDiv; + //strValue.Format("%s", pWSIData->m_strWsi_2DImageFilename); // IMAGE_FILE_2D + strValue.Format("%s", "IMAGE_FILE_2D"); // IMAGE_FILE_2D + strLine += strValue+strDiv; + //strValue.Format("%s", pWSIData->m_strWsi_3DImageFilename); // IMAGE_FILE_3D + strValue.Format("%s", "IMAGE_FILE_3D"); // IMAGE_FILE_3D + strLine += strValue+strDiv; + strValue.Format("%s", "WSI_RESOLUTION"); // WSI_RESOLUTION + strLine += strValue+strDiv; + +} + +void CGlassRawRTMS::makeMuraDefect( CString& strLine, _MacroDefect* pMuraData ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("MURADATA"); // DEFITEM + strLine += strValue+strDiv; + + CTime time = CTime::GetCurrentTime(); + strValue.Format("%04d%02d%02d", time.GetYear(), time.GetMonth(), time.GetDay()); // DATE + strLine += strValue+strDiv; + strValue.Format("%02d%02d%02d", time.GetHour(), time.GetMinute(), time.GetSecond()); // TIME + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->DEFECTNO); // DEFECTNO + strLine += strValue+strDiv; + strValue.Format("%s", "RECIPE"); // RECIPE + strLine += strValue+strDiv; + strValue.Format("%s", "GLASSID"); // GLASSID + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->CELLID); // CELLID + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->COORD_X1); // COORD_X1 + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->COORD_Y1); // COORD_Y1 + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->COORD_PX1);// COORD_PX1 + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->COORD_PY1); // COORD_PY1 + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->NOMURA); // NOMURA + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->SIZE_W); // SIZE_W + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->SIZE_L); // SIZE_L + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->SIZE_S); // SIZE_S + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->MAIN_TYPE); // MAIN_TYPE + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->SUB_TYPE); // SUB_TYPE + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->PEAK); // PEAK + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->G_MIN); // G_MIN + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->G_MAX); // G_MAX + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->G_AVG); // G_AVG + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->CAM); // CAM + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->SCAN); // SCAN + strLine += strValue+strDiv; + strValue.Format("%d", pMuraData->PIXEL_PEAK); // PIXEL_PEAK + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->REGION); //REGION + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->SIZE_T); // SIZE_T + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->PEAK_T); // PEAK_T + strLine += strValue+strDiv; + strValue.Format("%s", pMuraData->IMG_FILE_NAME); // IMG_FILE_NAME + strLine += strValue+strDiv; +} + +void CGlassRawRTMS::makeUserReview( CString& strLine, _grmDefectReviewData* pUserReview ) +{ + strLine.Empty(); + + CString strValue; + CString strDiv = ","; + + strValue.Format("DATA"); // ITEM + strLine += strValue+strDiv; + strValue.Format("USERREVDATA"); // USERREVITEM + strLine += strValue+strDiv; + strValue.Format("%s", "USER_NO"); // USER_NO + strLine += strValue+strDiv; + strValue.Format("%s", "PR_X"); // PR_X + strLine += strValue+strDiv; + strValue.Format("%s", "PR_Y"); // PR_Y + strLine += strValue+strDiv; + strValue.Format("%s", "IMAGE_FILE_NAME"); // IMAGE_FILE_NAME + strLine += strValue+strDiv; + strValue.Format("%s", "REV_RESOLUTION"); // REV_RESOLUTION + strLine += strValue+strDiv; + +} + +BOOL CGlassRawRTMS::MakeAOIPreProcessing(CgrmGlassRawData* pData) +{ + _grmGlassData* pGlass = pData->GetGlassData(); + + // File Path + CTime CurrTime = CTime::GetCurrentTime(); + CString strTime=_T(""), strRTMSRAWFile=_T("");; + strTime.Format(_T("%04d%02d%02d%02d%02d%02d"), CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond()); + char strTempPath2[100] = {0, }, strTempPath3[100] = {0, }; + + CString strLotID = pGlass->m_strGlassID; + CString strRtmsOperID = pGlass->m_strOperID; + CString strRtmsEqID = pGlass->m_strEquipID; + CString strHGlassid = pGlass->m_strGlassID; + CString strStepID = pGlass->m_strStepID; + strHGlassid.MakeUpper(); + strTime.MakeUpper(); + + strRTMSRAWFile.Format(_T("%s_%s.csv"), strHGlassid, strTime); + + //파일 생성될 곳 폴더 생성 [김태현 2018/12/5] + //210126 CJH - RTMS 경로 변경 (126.100.100.5\\RawFile/ReviewImage).RawFile은 루트에 결과파일을 올리고 ReviewImage에는 StepID\\GlassID 안에 데이터 업로드 + { + //210126 CJH - 경로 폴더생성 위치 변경 + CreateDirectory("D:\\DitRtms", NULL); + CreateDirectory("D:\\DitRtms\\Data", NULL); + + BOOL bCreateOK = TRUE; + sprintf(strTempPath2, "\\\\126.100.100.5\\RawFile"); + bCreateOK &= CreateDirectory(strTempPath2, NULL); + + sprintf(strTempPath2, "\\\\126.100.100.5\\RawFile\\%s", strRTMSRAWFile); + + + sprintf(strTempPath3, "\\\\126.100.100.5\\ReviewImage"); + bCreateOK &= CreateDirectory(strTempPath3, NULL); + + sprintf(strTempPath3, "\\\\126.100.100.5\\ReviewImage\\%s", strStepID); + bCreateOK &= CreateDirectory(strTempPath3, NULL); + + sprintf(strTempPath3, "\\\\126.100.100.5\\ReviewImage\\%s\\%s", strStepID,strHGlassid); + bCreateOK &= CreateDirectory(strTempPath3, NULL); + + AKLOG("RTMS Folder Raw File Path Make : %s", strTempPath2); + AKLOG("RTMS Folder Img Path Make : %s", strTempPath3); + //if(bCreateOK) AKLOG("RTMS Folder Create Success"); + //else AKLOG("RTMS Folder Create Fail"); + } + + DeleteFile((LPCTSTR)strTempPath2); + + m_strRTMSRAWFile = strTempPath2; + m_strRTMSImageFile = strTempPath3; + + return TRUE; +} + +BOOL CGlassRawRTMS::CopyRTMSFiles( CgrmGlassRawData* pData ) +{ + return TRUE; +} + +CString CGlassRawRTMS::GetDefectInfoToString(emDefectMemberType nDefectInfoType, int nParam) +{ + CString sStr; + switch (nDefectInfoType) + { + case DMT_DefectJudge:// Judge + { + switch (nParam) + { + case Judge_OK: sStr.Format("OK"); + break; + case Judge_RP: sStr.Format("RP"); + break; + case Judge_NG: sStr.Format("NG"); + break; + case Judge_TR: sStr.Format("TR"); + break; + case Judge_PR: sStr.Format("PR"); + break; + case Judge_PT: sStr.Format("PT"); + break; + case Judge_Review: sStr.Format("RV"); + break; + case Judge_RC: sStr.Format("RC"); + break; + case Judge_Size: sStr.Format("SZ"); + break; + case Judge_VI: sStr.Format("VI"); + break; + case Judge_Rework: sStr.Format("RW"); + break; + case Judge_Unknown: sStr.Format("OK");//sStr.Format("Unknown"); //Unknown도 일단 OK + break; + default: sStr.Format("OK");//sStr.Format("Ets"); + break; + } + } + break; + + case DMT_DefectSizeType: + { + sStr = "S"; + switch (nParam) + { + //case SizeType_Unknown: sStr.Format("U"); break; + case 1/*SizeType_Small*/: sStr.Format("S"); + break; + case 2/*SizeType_Mid*/: sStr.Format("M"); + break; + case 3/*SizeType_Large*/: sStr.Format("L"); + break; + case 4/*SizeType_Huge*/: sStr.Format("O"); + break; + //case SizeType_Ultra: sStr.Format("Ultra"); break; + //default: sStr.Format("Ets"); break; + } + } + break; + + + } + return sStr; +} \ No newline at end of file -- Gitblit v1.9.3