SDC C-Project CF Review 프로그램
LYW
2021-10-15 e5fa774d622d6852fe8e1f033045aed221649108
ReviewHistory/ReveiwHistory/StackResultCPJT.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,337 @@
#include "StdAfx.h"
#include "StackResultCPJT.h"
#include "akLoggerExt.h"
#include "akCore/akFileDB.h"
#include <process.h>
#include "DitGlassRawClient.h"
#include "GlassRawBase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
CStackResultCPJT::CStackResultCPJT(void)
{
   m_nThreadStackFileReadFlag = 0;
   m_strConfigFile;
   {
      GetModuleFileName(NULL, m_strConfigFile, MAX_PATH);
      char* ext = CakFileUtil::getFileExt(m_strConfigFile);
      strcpy(ext, "ini");
   }
   m_nProcessState = SPS_StateIdle;
   readOptionFile();
}
CStackResultCPJT::~CStackResultCPJT(void)
{
   if(m_nThreadStackFileReadFlag == 1)
   {
      m_nThreadStackFileReadFlag = 2;
      while(m_nThreadStackFileReadFlag != 0)
      {
         Sleep(1);
      }
   }
   m_vecStackDefect.clear();
}
//201218 CJH - Stack File open
BOOL CStackResultCPJT::openFile( char* pGlassID )
{
   CString strFileName;
   CDitGlassRawClient   GlassRawClient;
   GlassRawClient.ConnectServer();
   CDitGlassRawClient* pShared = &GlassRawClient;
   _grmDefectData* pGrmStack;
   strFileName.Format("%s\\%s", m_strLocalPath, pGlassID);
   FILE* pf = fopen(strFileName.GetBuffer(0), "r");
   if(pf == NULL)
      return FALSE;
   std::vector<_StackDefectCPJT> vecStackDefect;
   _StackDefectCPJT StackDefect;
   char buffer[2048];
   char* pReadPoint = NULL;
   char *pStr;
   CString tempStr, strRight;
   while(!feof(pf)) //Data ì‹œìž‘
   {
      pStr = fgets(buffer, 2048, pf);
      if(strncmp(buffer, "DATA", 4)) continue; //Data ì‹œìž‘
      if(strlen(buffer) <= 0 || pStr == NULL)
         break;
      if(strncmp(buffer, "DATA DEFECT", 10)) continue; //Defect ì°¾ì•„
      //Defect Stack Start
      {
         pReadPoint = buffer;
         int temp;
         pReadPoint = getParsingData(pReadPoint, 11, &temp);
         pReadPoint = getParsingData(pReadPoint, 12, &StackDefect.m_strCellName);
         pReadPoint = getParsingData(pReadPoint, 5, &StackDefect.m_nDefectID);
         pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nPosX);
         pReadPoint = getParsingData(pReadPoint, 8, &StackDefect.m_nPosY);
         pReadPoint = getParsingData(pReadPoint, 13, &temp);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nSize);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUmSizeX);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nUmSizeY);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_nDefectRScale);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_strDefectGrade);
         pReadPoint = getParsingData(pReadPoint, 4, &StackDefect.m_strDefectType);
         //pReadPoint = getParsingData(pReadPoint, 47, &temp);
         pReadPoint = getParsingData(pReadPoint, 2, &temp);
         pReadPoint = getParsingData(pReadPoint, 2, &StackDefect.m_nStackCnt);
         pReadPoint = getParsingData(pReadPoint, 60, &StackDefect.m_strStackStep);
         vecStackDefect.push_back(StackDefect);
      }
   }
   //For Test
   AKLOG("Read Stack Size : %d", vecStackDefect.size());
   fclose(pf);
   m_vecStackDefect = vecStackDefect;
   for (int i = 0; i < m_vecStackDefect.size(); i++)
   {
      pGrmStack = pShared->GetStackData(i);
      pGrmStack->clear();
      //Cell ID로 idx ì°¾ê¸°
      {
         //char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
         //'0' + pCellData->m_nCellID / 36, g_pCellCode[pCellData->m_nCellID % 36]
         tempStr = m_vecStackDefect[i].m_strCellName.Right(2);
         int nUpper = atoi(tempStr.Left(1));
         nUpper *= 36;
         char ctemp[2];
         strRight = tempStr.Right(1);
         strcpy(ctemp, strRight);
         int nLower = static_cast<int>(ctemp[0]);
         if (48 <= nLower && nLower <= 57)
            nLower = 43 /* 65+26+17 */ + nLower;
         nLower -= 65;
         pGrmStack->m_nCellIdx = nUpper + nLower;
      }
      pGrmStack->m_nDefectID = m_vecStackDefect[i].m_nDefectID;
      pGrmStack->m_nUMCenterAlignX = m_vecStackDefect[i].m_nPosX;
      pGrmStack->m_nUMCenterAlignY = (-1)*m_vecStackDefect[i].m_nPosY;
      pGrmStack->m_nPixelSize = m_vecStackDefect[i].m_nSize;
      pGrmStack->m_nUMSizeX = m_vecStackDefect[i].m_nUmSizeX;
      pGrmStack->m_nUMSizeY = m_vecStackDefect[i].m_nUmSizeY;
      pGrmStack->m_nDefectRScale = m_vecStackDefect[i].m_nDefectRScale;
      //Judgement
      {
         m_vecStackDefect[i].m_strDefectGrade.TrimLeft(" ");
         m_vecStackDefect[i].m_strDefectGrade.TrimRight(" ");
         if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "OK")) pGrmStack->m_DefectJudgement = Judge_OK;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RP")) pGrmStack->m_DefectJudgement = Judge_RP;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "NG")) pGrmStack->m_DefectJudgement = Judge_NG;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "TR")) pGrmStack->m_DefectJudgement = Judge_TR;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "PR")) pGrmStack->m_DefectJudgement = Judge_PR;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "PT")) pGrmStack->m_DefectJudgement = Judge_PT;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RV")) pGrmStack->m_DefectJudgement = Judge_Review;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RC")) pGrmStack->m_DefectJudgement = Judge_RC;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "SZ")) pGrmStack->m_DefectJudgement = Judge_Size;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "VI")) pGrmStack->m_DefectJudgement = Judge_VI;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "RW")) pGrmStack->m_DefectJudgement = Judge_Rework;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "UK")) pGrmStack->m_DefectJudgement = Judge_Unknown;
         else /*if (!strcmp(m_vecStackDefect[i].m_strDefectGrade, "그외"))*/ pGrmStack->m_DefectJudgement = Judge_OK;
      }
      m_vecStackDefect[i].m_strDefectType.TrimLeft(" ");
      m_vecStackDefect[i].m_strDefectType.TrimRight(" ");
      //Defect Type
      {
         if (!strcmp(m_vecStackDefect[i].m_strDefectType, "RB")) pGrmStack->m_DefectType = DefectType_RBlack;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "RW")) pGrmStack->m_DefectType = DefectType_RWhite;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "TB")) pGrmStack->m_DefectType = DefectType_TBlack;
         else if (!strcmp(m_vecStackDefect[i].m_strDefectType, "TW")) pGrmStack->m_DefectType = DefectType_TWhite;
         else pGrmStack->m_DefectType = DefectType_Unknown;
      }
      pGrmStack->m_nStackStepCount = m_vecStackDefect[i].m_nStackCnt;
      m_vecStackDefect[i].m_strStackStep.TrimLeft(" ");
      m_vecStackDefect[i].m_strStackStep.TrimRight(" ");
      strcpy(pGrmStack->m_strStackFirst, m_vecStackDefect[i].m_strStackStep.GetBuffer(0));
   }
   pShared->GetGlassData()->m_nStackNum = m_vecStackDefect.size();
   pShared->GetGlassData()->m_bStackRead = TRUE;
   AKLOG("Import Vector Size : %d", m_vecStackDefect.size());
   return TRUE;
}
char* CStackResultCPJT::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* CStackResultCPJT::getParsingData( char* pBuf, int nLen, int* pOutData )
{
   pBuf[nLen] = 0;
   *pOutData = atoi(pBuf);
   return &pBuf[nLen+1]; //구분자 ê±´ë„ˆ ë›°ì–´ì„œ ë‹¤ìŒ ì½ì„ í¬ì¸íЏ ë„˜ê²¨ì¤€ë‹¤ íƒœí˜„[2017/3/29]
}
BOOL CStackResultCPJT::readOptionFile( char* pFileName /*= "C:\\AOIServer\\ConfigFile\\MacroInfo.cfg"*/ )
{
   if(pFileName == NULL) pFileName = m_strConfigFile;
   CakFileDB akFileDB;
   akFileDB.openfile(pFileName);
   akFileDB.getItem("Stack_Use", &m_bStackUse, 0);
   akFileDB.getItem("Stack_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\Stack");
   akFileDB.getItem("Stack_EquipID", m_strEquipID, "qa6500f0r03");
   akFileDB.getItem("Stack_Param1", m_strParam1, "");
   if(m_bStackUse && m_nThreadStackFileReadFlag == 0)//쓰레드 ìƒì„± [김태현 2019/1/12]
   {
      _beginthread(threadStackFileRead, NULL, this);
   }
   return TRUE;
}
void CStackResultCPJT::threadStackFileRead( void* pArg )
{
   CStackResultCPJT* pThis = (CStackResultCPJT*)pArg;
   pThis->m_nThreadStackFileReadFlag = 1;
   int nSleepTime = 1000;
   int nReadFailCount = 0;
   int nThreadCount=0;
   CString strGlassID;
//    CDitGlassRawClient   GlassRawClient;
//    if(!GlassRawClient.ConnectServer()) return;
//    CDitGlassRawClient* pShared = &GlassRawClient;
//    pShared->GetGlassData()->m_bStackRead = FALSE;
//    pShared->GetGlassData()->m_nStackNum = 0;
   while(pThis->m_nThreadStackFileReadFlag==1)
   {
      if(pThis->m_nProcessState == SPS_CmdFileRead) //스택파일 ì½ê¸° ìˆ˜í–‰ [김태현 2019/1/12]
      {
         strGlassID = pThis->m_strGlassID;
         //For test
         //strGlassID = "HPANELID";
         pThis->m_nProcessState = SPS_StateFileRead;
         nThreadCount = 0;
         nReadFailCount = 0;
         AKLOG("Stack File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID);
         //210111 CJH - Stack Read Sleep
         Sleep(3000);
         while(pThis->m_nProcessState == SPS_StateFileRead && pThis->m_nThreadStackFileReadFlag==1)
         {
            if((nThreadCount++ % 20) != 0) //명령 ìˆ˜í–‰ì„ ë¹ ë¥´ê²Œ ê°ì§€ ìœ„한 ì¡°ì¹˜ [김태현 2019/1/12]
            {
               Sleep(50);
               continue;
            }
            if(pThis->openFile(strGlassID.GetBuffer(0)) == TRUE)
            {
               pThis->m_nProcessState = SPS_ResultReadOK;
               AKLOG("Stack File Read Complete ");
               break;
            }
            nReadFailCount++;
            AKLOG("Stack File Read Try : %d", nReadFailCount);
            if(nReadFailCount>100)
            {
               pThis->m_nProcessState = SPS_ResultReadFail;
               AKLOG("Stack File Read Fail ");
               break;
            }
            Sleep(50);
         }
         if(pThis->m_nProcessState != SPS_ResultReadOK)
         {
            pThis->m_nProcessState = SPS_ResultReadFail;
            AKLOG("Stack File Read Stop ");
         }
      }
      if(nReadFailCount)
      Sleep(500);
   }
   pThis->m_nThreadStackFileReadFlag = 0;
}
BOOL CStackResultCPJT::StackFileReadStart( char* pGlassID )
{
   if(m_nThreadStackFileReadFlag == 0)//쓰레드 ìƒì„± [김태현 2019/1/12]
   {
      _beginthread(threadStackFileRead, NULL, this);
   }
   if(m_nProcessState == SPS_StateFileRead)
   {
      m_nProcessState = SPS_CmdFileStop;
      while(m_nProcessState == SPS_CmdFileStop) Sleep(0);
   }
   m_strGlassID = pGlassID;
   m_nProcessState = SPS_CmdFileRead;
   return TRUE;
}
BOOL CStackResultCPJT::StackFileReadStop( BOOL bWait/*=TRUE*/ )
{
   if(bWait == TRUE && m_nProcessState == SPS_StateFileRead)
   {
      m_nProcessState = SPS_CmdFileStop;
      while(m_nProcessState == SPS_CmdFileStop) Sleep(0);
   }
   return TRUE;
}