| | |
| | | Sleep(10); |
| | | } |
| | | } |
| | | /* < KJG 20221110 - #4373 ADD Start >*/ |
| | | auto CellIDSortFunc = [](const _grmCellData* lhs, const _grmCellData* rhs) { |
| | | // '0A' = 0, '0B' = 1, ..., '0Z' = 25, '00' = 26, ..., '09' = 35, '1A' = 36, ... |
| | | const int nAlphaSet = 'Z' - 'A' + 1; |
| | | const int nNumSet = '9' - '0' + 1; |
| | | const int nAlphaNumSet = nAlphaSet + nNumSet; |
| | | |
| | | CString str = lhs->m_strCellName; |
| | | char lhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0); |
| | | char lhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0); |
| | | |
| | | str = rhs->m_strCellName; |
| | | char rhs_1st = str.Mid(str.GetLength() - 2, 1).GetAt(0); |
| | | char rhs_2st = str.Mid(str.GetLength() - 1, 1).GetAt(0); |
| | | |
| | | auto GetCellValueFrom2stCellID = [&](char c) -> int { |
| | | if (c >= 'A' && c < 'Z') // 'A' 는 0부터 |
| | | return c - 'A'; |
| | | else if (c >= '0' && c <= '9') // '0' 은 26 부터 |
| | | return (c - '0') + nAlphaSet; |
| | | }; |
| | | return (lhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(lhs_2st) < (rhs_1st - '0') * nAlphaNumSet + GetCellValueFrom2stCellID(rhs_2st); |
| | | }; |
| | | /* < KJG 20221110 - #4373 ADD End >*/ |
| | | |
| | | CGlassRawCPJT::CGlassRawCPJT(void) |
| | | { |
| | |
| | | |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | //CELL & DEFECT DATA |
| | | /* < KJG 20221110 - #4373 ADD Start >*/ |
| | | vector<_grmCellData*> vtSortCellData; |
| | | for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++) |
| | | vtSortCellData.push_back(pData->GetCellData(iCell)); |
| | | |
| | | sort(vtSortCellData.begin(), vtSortCellData.end(), CellIDSortFunc); |
| | | /* < KJG 20221110 - #4373 ADD End >*/ |
| | | { |
| | | |
| | | //make |
| | | { |
| | | for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++) |
| | | { |
| | | _grmCellData* pCell = pData->GetCellData(iCell); |
| | | /* < KJG 20221110 - #4373 MOD Start >*/ |
| | | //_grmCellData* pCell = pData->GetCellData(iCell); |
| | | _grmCellData* pCell = vtSortCellData[iCell]; |
| | | /* < KJG 20221110 - #4373 MOD End >*/ |
| | | makeDataCell(strLine, pData, pCell); |
| | | fprintf(pf, "%s\n", strLine); |
| | | |
| | | for (int iDefect = 0; iDefect < pData->GetGlassData()->m_nDefectNum; iDefect++) |
| | | { |
| | | _grmDefectData* pDefect = pData->GetDefectData(iDefect); |
| | | if (pDefect->m_nCellIdx != iCell) continue; |
| | | /* < KJG 20221110 - #4373 MOD Start >*/ |
| | | //if (pDefect->m_nCellIdx != iCell) continue; |
| | | if (pDefect->m_nCellIdx != pCell->m_nCellID) continue; |
| | | /* < KJG 20221110 - #4373 MOD End >*/ |
| | | //210203 CJH - CutOff 대상 결과파일 작성 제외 |
| | | if (pDefect->m_bDefectCutoff == TRUE) continue; |
| | | |
| | |
| | | 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; |
| | |
| | | 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좌표 반대 |
| | | // 코너컷 기준으로 결과파일 좌표가 생성되는데 고객사에 명확한 확인 필요 |
| | |
| | | // 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); |
| | |
| | | } |
| | | // 16 2 STACK_COUNT // Count of Defect detected step |
| | | SPRINTRAW(2, "%2d", pDefectData->m_nStackStepCount); |
| | | // 17 60 STACK_STEP // Flow(Step) of defect detection |
| | | // 17 60 -> 400 STACK_STEP // Flow(Step) of defect detection |
| | | if (strlen(pDefectData->m_strStackFirst)) |
| | | { |
| | | SPRINTRAW(60, "%s", pDefectData->m_strStackFirst); |
| | | /* < KMH 20220712 : #4230 MOD Start > */ |
| | | //SPRINTRAW(60, "%s", pDefectData->m_strStackFirst); |
| | | SPRINTRAW(400, "%s", pDefectData->m_strStackFirst); |
| | | /* < KMH 20220712 : #4230 MOD End > */ |
| | | } |
| | | else |
| | | { |
| | |
| | | sprintf(pServerFile, "%s", strFileName.GetBuffer(0)); |
| | | sprintf(pLocalFile, "%s", strFileName.GetBuffer(0)); |
| | | |
| | | CString strTime; |
| | | CString strServerSubRawFilePath= NULL; |
| | | CString strServerSubRawFileName = NULL; |
| | | { |
| | | strServerSubRawFilePath += NETWORK_AOIRAWFILE_SUB_PATH; |
| | | |
| | | CString strTime; |
| | | |
| | | CTime CurrTime = m_tmFileCreateTime; |
| | | strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"), |
| | | CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond()); |
| | |
| | | fprintf(pf, "SUMPATH= \n"); |
| | | fclose(pf); |
| | | } |
| | | /* < KJG 20230220 - #4403 ADD Start >*/ |
| | | // BLUE 설비 D_COLL 미보고 원인 분석을 위한 Result_info.ini 파일 백업 생성 |
| | | CString strPathBackUpDir, strPathBackUpFile; |
| | | strPathBackUpDir.Format(_T("%s%s"), LOCAL_RAWPATH_INFO_INI_PATH, _T("ResultInfoBackUpFile")); |
| | | strPathBackUpFile.Format(_T("%s_%s.ini"), strGlassID, strTime); |
| | | |
| | | CreateDirectory(strPathBackUpDir, NULL); |
| | | strPathBackUpFile.Format("%s\\%s", strPathBackUpDir, strPathBackUpFile); |
| | | CopyFile(strRawFilePathName, strPathBackUpFile, FALSE); |
| | | /* < KJG 20230220 - #4403 ADD End >*/ |
| | | } |
| | | break; |
| | | case FTPCMD_STACK: |
| | |
| | | /* < KMH 20220311 : #3954 ADD End > */ |
| | | case Judge_Unknown: sStr.Format("OK");//sStr.Format("Unknown"); //Unknown도 일단 OK |
| | | break; |
| | | case Judge_SR: sStr.Format("SR"); /* < KJG 20221107 - #4360 ADD >*/ |
| | | break; |
| | | default: sStr.Format("OK");//sStr.Format("Ets"); |
| | | break; |
| | | } |