From 3ce48f6dbeb537e252edb0d62c88a28796e36674 Mon Sep 17 00:00:00 2001 From: SWK <sungwk82@diteam.co.kr> Date: 월, 26 12월 2022 15:04:42 +0900 Subject: [PATCH] ongoing60 #4403 CF AOI Review TACT 지연 개선 1. 신호 출력 방식 재개선 - 유지 시간이 없는 신호는 바로 출력 진행하도록 변경 2. 불필요 Delay 제거 및 시퀀스 변경 - 얼라인 측정 종료 처리 간 제어 신호 먼저 출력 후 카메라 Stop으로 변경 - 물류 정보 읽기 처리 후 1000ms Delay 삭제 - 얼라인 측정 시작(카메라 Live Start) 후 Delay 300ms -> 100ms(이미지 들어오는 시간 확보 필요) - ReadRawFile 처리 시작 전 500ms Delay 삭제 - Path Scheduling 완료 후 Review Ready 신호 출력 전 1000ms Delay 삭제 3. 버그 수정 - 이미지 저장 경로 생성 간 예외 처리 부분 버그 수정 4. 로그 시간 출력 불합리 개선 - 로그 시간이 파일 출력 시점으로 작성되어 로그 스래드 지연 시 시간이 맞지 않는 불합리 있음 - 로그 시간은 로그 발생 시점에 시간 저장, 해당 시간 이용하여 파일에 기록하도록 변경 --- ReviewHistory/ReveiwHistory/MacroResultFile.cpp | 357 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 357 insertions(+), 0 deletions(-) diff --git a/ReviewHistory/ReveiwHistory/MacroResultFile.cpp b/ReviewHistory/ReveiwHistory/MacroResultFile.cpp new file mode 100644 index 0000000..a7caac2 --- /dev/null +++ b/ReviewHistory/ReveiwHistory/MacroResultFile.cpp @@ -0,0 +1,357 @@ +#include "StdAfx.h" +#include "MacroResultFile.h" +#include "akCore/akFileDB.h" +//0404nwh +#include "akGridData.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 + +CMacroResultFile::CMacroResultFile(void) +{ + m_bReadSuccess = FALSE; + readOptionFile(); +} + +CMacroResultFile::~CMacroResultFile(void) +{ + m_vecMacroDefect.clear(); +} + +BOOL CMacroResultFile::openFile( char* pFileName ) +{ + m_bReadSuccess = FALSE; + FILE* pf = fopen(pFileName, "r"); + + if(pf == NULL) + return FALSE; + + std::vector<_MacroDefect> vecMacroDefect; + _MacroDefect MacroDefect; + char buffer[1024]; + + char* pReadPoint = NULL; + char *pStr; + + while(!feof(pf)) + { + pStr = fgets(buffer, 1024, pf); + + if(!strncmp(buffer, "ITEM,", 5)) continue; + + + if(strlen(buffer) <= 0 || pStr == NULL) + break; + + if(!strncmp(buffer, "DATA,CELLDATA", 13))//파싱 태현[2017/3/29] + { + //무라 셀판정도 반영 해야 하나? + } + else if(!strncmp(buffer, "DATA,DEFECTDATA", 15))//파싱 태현[2017/3/29] + { + pReadPoint = buffer; + + pReadPoint = getParsingData(pReadPoint, 15, &MacroDefect.ITEM ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.DEFECTNO ); + pReadPoint = getParsingData(pReadPoint, 20, &MacroDefect.CELLID ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.COORD_X1 ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.COORD_Y1 ); + pReadPoint = getParsingData(pReadPoint, 9, &MacroDefect.COORD_PX1 ); + pReadPoint = getParsingData(pReadPoint, 9, &MacroDefect.COORD_PY1 ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.NOMURA ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.JUDGE ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.SIZE_W ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.SIZE_L ); + pReadPoint = getParsingData(pReadPoint, 15, &MacroDefect.SIZE_S ); + pReadPoint = getParsingData(pReadPoint, 15, &MacroDefect.MAIN_TYPE ); + pReadPoint = getParsingData(pReadPoint, 15, &MacroDefect.SUB_TYPE ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.PEAK ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.G_MIN ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.G_MAX ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.G_AVG ); + pReadPoint = getParsingData(pReadPoint, 3, &MacroDefect.CAM ); + pReadPoint = getParsingData(pReadPoint, 4, &MacroDefect.SCAN ); + pReadPoint = getParsingData(pReadPoint, 10, &MacroDefect.PIXEL_PEAK ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.REGION ); + pReadPoint = getParsingData(pReadPoint, 8, &MacroDefect.MASK_T ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.SIZE_T ); + pReadPoint = getParsingData(pReadPoint, 6, &MacroDefect.PEAK_T ); + pReadPoint = getParsingData(pReadPoint, 69, &MacroDefect.IMG_FILE_NAME); + MacroDefect.IMG_FILE_NAME = MacroDefect.IMG_FILE_NAME.Left(70); + MacroDefect.IMG_FILE_NAME.Remove(' '); + + vecMacroDefect.push_back(MacroDefect); + } + } + + fclose(pf); + + m_vecMacroDefect = vecMacroDefect; + //빠른 찾기용 map 생성 + { + m_mapFind.clear(); + int nSize = m_vecMacroDefect.size(); + for(int i=0; i<nSize; i++) + { + m_mapFind.insert(std::make_pair(m_vecMacroDefect[i].COORD_X1, &m_vecMacroDefect[i])); + } + } + m_bReadSuccess = TRUE; + return TRUE; +} + +char* CMacroResultFile::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]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 태현[2017/3/29] +} + +char* CMacroResultFile::getParsingData( char* pBuf, int nLen, int* pOutData ) +{ + pBuf[nLen] = 0; + + *pOutData = atoi(pBuf); + + return &pBuf[nLen+1]; //구분자 건너 뛰어서 다음 읽을 포인트 넘겨준다 태현[2017/3/29] +} + +BOOL CMacroResultFile::readOptionFile( char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ ) +{ + CakFileDB fileDB; + fileDB.openfile(pFileName); + char strTemp[256]={}; + fileDB.getItem("MACROPATH_ENABLE", &m_bMacroResultFile, 0); + fileDB.getItem("MACROPATH_RAW", strTemp, ""); m_strMacroResultRawPath= strTemp; + fileDB.getItem("MACROPATH_IMAGE", strTemp, ""); m_strMacroResultImagePath= strTemp; + fileDB.getItem("SERVERPATH_RAW", strTemp, ""); m_strServerResultRawPath= strTemp; + fileDB.getItem("SERVERPATH_IMAGE", strTemp, "");m_strServerResultImagePath = strTemp; + fileDB.getItem("MACRO_READ_TIME", (int*)&m_dwMacroReadTime, 3000); + + return TRUE; +} + +int CMacroResultFile::GetDefectNum( int iCell ) +{ + int nSize = (int)m_vecMacroDefect.size(); + int nDefectNum = 0; + for(int i=0; i<nSize; i++) + { + if(m_vecMacroDefect[i].CELLID == iCell) + { + nDefectNum++; + } + } + + return nDefectNum; +} + +int CMacroResultFile::GetSubPanelNum(int iCell) //0404nwh +{ + int nSize = (int)m_vecMacroSubPanel.size(); + int nSubPanelNum = 0; + for (int i = 0; i < nSize; i++) + { + if (m_vecMacroSubPanel[i].PRO_IMAGE == iCell) + { + nSubPanelNum++; + } + } + return nSubPanelNum; +} + +//KMS - 190125 MuraDefect 찾기 +_MacroDefect* CMacroResultFile::FindDefect( int nX, int nY ,int nFindRange) +{ + _MacroDefect *pMDefect = NULL; + + std::multimap<int,_MacroDefect*>::iterator itLowerBound; + std::multimap<int,_MacroDefect*>::iterator itUpperBound; + + itLowerBound = m_mapFind.lower_bound(nX - nFindRange); + itUpperBound = m_mapFind.upper_bound(nX + nFindRange); + + _MacroDefect *pMDefectMin = NULL; + int nMinDistance = nFindRange*nFindRange; + int nDistance; + for (itLowerBound; itLowerBound != itUpperBound; itLowerBound++) + { + pMDefect = static_cast<_MacroDefect*>(itLowerBound->second); + if(!pMDefect) continue; + + if(abs(nY - pMDefect->COORD_Y1) < nFindRange) + { + nDistance = ((nX - pMDefect->COORD_X1) * (nX - pMDefect->COORD_X1)) + ((nY - pMDefect->COORD_Y1) * (nY - pMDefect->COORD_Y1)); + if(nDistance < nMinDistance) + { + nMinDistance = nDistance; + pMDefectMin = pMDefect; + } + } + } + + return pMDefectMin; +} + +BOOL CMacroResultFile::openFile_Mura(char* pFileName)//0404nwh +{ + m_bReadSuccess = FALSE; + FILE* pf = fopen(pFileName, "r"); + + if (pf == NULL) + return FALSE; + + CDitGlassRawClient GlassRawClient; + GlassRawClient.ConnectServer(); + CDitGlassRawClient* pShared = &GlassRawClient; + + _grmCellData* pGrmMura; + + std::vector<_MacroSubPanel> vecMacroSubPanel; + _MacroSubPanel MacroSubPanel; + char buffer[1024]; + char* pReadPoint = NULL; + char *pStr; + + CString stranelData = "DATA PANEL"; + CString strSubPanelData = "DATA SUBPANEL"; + CString strMaxAvgGray, strMaxPortion; + + while (!feof(pf)) + { + pStr = fgets(buffer, 1024, pf); + if (strlen(buffer) <= 0 || pStr == NULL) + break; + + if (!strncmp(buffer, stranelData, strlen(stranelData)))// 띄어쓰기 파싱 + { + CakParser paser; + if (strlen(buffer) <= 0) continue; + paser.process(buffer, " "); + int nTokNum = paser.getTokNum(); + if (nTokNum < 42) continue; + strMaxAvgGray = paser.getTokStr(41); + strMaxPortion = paser.getTokStr(42); + } + + if (!strncmp(buffer, strSubPanelData, strlen(strSubPanelData)))// 띄어쓰기 파싱 + { + CakParser paser; + if (strlen(buffer) <= 0) continue; + paser.process(buffer, " "); + int nTokNum = paser.getTokNum(); + if (nTokNum < 52) continue; //kyh 31->52 + MacroSubPanel.PRO_IMAGE = paser.getTokStr(20); + MacroSubPanel.AVG_GRAY_0 = paser.getTokStr(21); + MacroSubPanel.PORTION_0 = paser.getTokStr(22); + //kyh 추가 + MacroSubPanel.CORNER_GRAY_0 = paser.getTokStr(23); + MacroSubPanel.AVG_AMP_0 = paser.getTokStr(24); + MacroSubPanel.FFT_VAR_0 = paser.getTokStr(25); + MacroSubPanel.FFT_VAH_0 = paser.getTokStr(26); + MacroSubPanel.FFT_VAQ_0 = paser.getTokStr(27); + MacroSubPanel.FFT_PK_0 = paser.getTokStr(28); + + MacroSubPanel.AVG_GRAY_1 = paser.getTokStr(29); + MacroSubPanel.PORTION_1 = paser.getTokStr(30); + //kyh 추가 + MacroSubPanel.CORNER_GRAY_1 = paser.getTokStr(31); + MacroSubPanel.AVG_AMP_1 = paser.getTokStr(32); + MacroSubPanel.FFT_VAR_1 = paser.getTokStr(33); + MacroSubPanel.FFT_VAH_1 = paser.getTokStr(34); + MacroSubPanel.FFT_VAQ_1 = paser.getTokStr(35); + MacroSubPanel.FFT_PK_1 = paser.getTokStr(36); + + MacroSubPanel.AVG_GRAY_2 = paser.getTokStr(37); + MacroSubPanel.PORTION_2 = paser.getTokStr(38); + //kyh 추가 + MacroSubPanel.CORNER_GRAY_2 = paser.getTokStr(39); + MacroSubPanel.AVG_AMP_2 = paser.getTokStr(40); + MacroSubPanel.FFT_VAR_2 = paser.getTokStr(41); + MacroSubPanel.FFT_VAH_2 = paser.getTokStr(42); + MacroSubPanel.FFT_VAQ_2 = paser.getTokStr(43); + MacroSubPanel.FFT_PK_2 = paser.getTokStr(44); + + MacroSubPanel.AVG_GRAY_3 = paser.getTokStr(45); + MacroSubPanel.PORTION_3 = paser.getTokStr(46); + //kyh 추가 + MacroSubPanel.CORNER_GRAY_3 = paser.getTokStr(47); + MacroSubPanel.AVG_AMP_3 = paser.getTokStr(48); + MacroSubPanel.FFT_VAR_3 = paser.getTokStr(49); + MacroSubPanel.FFT_VAH_3 = paser.getTokStr(50); + MacroSubPanel.FFT_VAQ_3 = paser.getTokStr(51); + MacroSubPanel.FFT_PK_3 = paser.getTokStr(52); + + vecMacroSubPanel.push_back(MacroSubPanel); + } + } + + fclose(pf); + + m_vecMacroSubPanel = vecMacroSubPanel; + + for (int i = 0; i < m_vecMacroSubPanel.size(); i++) + { + pGrmMura= pShared->GetCellData(i); + + strcpy(pGrmMura->m_strProImage, m_vecMacroSubPanel[i].PRO_IMAGE.GetBuffer(0)); + strcpy(pGrmMura->m_strAvgGray_0, m_vecMacroSubPanel[i].AVG_GRAY_0.GetBuffer(0)); + strcpy(pGrmMura->m_strPortion_0, m_vecMacroSubPanel[i].PORTION_0.GetBuffer(0)); + //kyh 0622 + strcpy(pGrmMura->m_strCorner_Gray_0, m_vecMacroSubPanel[i].CORNER_GRAY_0.GetBuffer(0)); + strcpy(pGrmMura->m_strAvgAmp_0, m_vecMacroSubPanel[i].AVG_AMP_0.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVar_0, m_vecMacroSubPanel[i].FFT_VAR_0.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVah_0, m_vecMacroSubPanel[i].FFT_VAH_0.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVaq_0, m_vecMacroSubPanel[i].FFT_VAQ_0.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTPK_0, m_vecMacroSubPanel[i].FFT_PK_0.GetBuffer(0)); + + strcpy(pGrmMura->m_strAvgGray_1, m_vecMacroSubPanel[i].AVG_GRAY_1.GetBuffer(0)); + strcpy(pGrmMura->m_strPortion_1, m_vecMacroSubPanel[i].PORTION_1.GetBuffer(0)); + //kyh 0622 + strcpy(pGrmMura->m_strCorner_Gray_1, m_vecMacroSubPanel[i].CORNER_GRAY_1.GetBuffer(0)); + strcpy(pGrmMura->m_strAvgAmp_1, m_vecMacroSubPanel[i].AVG_AMP_1.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVar_1, m_vecMacroSubPanel[i].FFT_VAR_1.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVah_1, m_vecMacroSubPanel[i].FFT_VAH_1.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVaq_1, m_vecMacroSubPanel[i].FFT_VAQ_1.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTPK_1, m_vecMacroSubPanel[i].FFT_PK_1.GetBuffer(0)); + + strcpy(pGrmMura->m_strAvgGray_2, m_vecMacroSubPanel[i].AVG_GRAY_2.GetBuffer(0)); + strcpy(pGrmMura->m_strPortion_2, m_vecMacroSubPanel[i].PORTION_2.GetBuffer(0)); + //kyh 0622 + strcpy(pGrmMura->m_strCorner_Gray_2, m_vecMacroSubPanel[i].CORNER_GRAY_2.GetBuffer(0)); + strcpy(pGrmMura->m_strAvgAmp_2, m_vecMacroSubPanel[i].AVG_AMP_2.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVar_2, m_vecMacroSubPanel[i].FFT_VAR_2.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVah_2, m_vecMacroSubPanel[i].FFT_VAH_2.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVaq_2, m_vecMacroSubPanel[i].FFT_VAQ_2.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTPK_2, m_vecMacroSubPanel[i].FFT_PK_2.GetBuffer(0)); + + strcpy(pGrmMura->m_strAvgGray_3, m_vecMacroSubPanel[i].AVG_GRAY_3.GetBuffer(0)); + strcpy(pGrmMura->m_strPortion_3, m_vecMacroSubPanel[i].PORTION_3.GetBuffer(0)); + //kyh 0622 + strcpy(pGrmMura->m_strCorner_Gray_3, m_vecMacroSubPanel[i].CORNER_GRAY_3.GetBuffer(0)); + strcpy(pGrmMura->m_strAvgAmp_3, m_vecMacroSubPanel[i].AVG_AMP_3.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVar_3, m_vecMacroSubPanel[i].FFT_VAR_3.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVah_3, m_vecMacroSubPanel[i].FFT_VAH_3.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTVaq_3, m_vecMacroSubPanel[i].FFT_VAQ_3.GetBuffer(0)); + strcpy(pGrmMura->m_strFFTPK_3, m_vecMacroSubPanel[i].FFT_PK_3.GetBuffer(0)); + } + strcpy(pShared->GetGlassData()->m_strMaxAvgGray, strMaxAvgGray.GetBuffer(0)); + strcpy(pShared->GetGlassData()->m_strMaxPortion, strMaxPortion.GetBuffer(0)); + + m_bReadSuccess = TRUE; + return TRUE; +} \ No newline at end of file -- Gitblit v1.9.3