#include "StdAfx.h"
|
#include "GlassRawCPJT.h"
|
#include "akLoggerExt.h"
|
#include "MacroResultFile.h"
|
#include "akCore/akFileUtil.h"
|
#include "akGridData.h"
|
|
//#include "AOIDefinitionType.h"
|
//#include "AOIDefinition.h"
|
|
#define LOCAL_INDEX_PATH "D:\\DIT_ResultData\\Index\\"
|
#define LOCAL_REV_IMAGE_PATH "D:\\ResultData\\UploadImage\\"
|
#define LOCAL_AOI_IMAGE_PATH "D:\\Image\\Defect\\"
|
#define LOCAL_MURA_IMAGE_PATH "D:\\DIT_ResultData\\Mura\\IMG\\"
|
#define LOCAL_DEEP_PATH "D:\\DIT_ResultData\\Deeplearning\\"
|
|
#define LOCAL_RTMS_INFO_PATH "D:\\RTMS_TEMP\\"
|
|
#define LOCAL_RAWPATH_INFO_INI_PATH "D:\\ResultData\\"
|
#define RAWINFO_FILE_NAME "RESULT_INFO.ini"
|
|
#define LOCAL_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw"
|
#define LOCAL_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin"
|
#define NETWORK_AOIRAWDFS_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw"
|
#define NETWORK_AOIRAWBIN_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"
|
|
#define NETWORK_AOIRAWFILE_SUB_PATH "\\\\126.100.100.1\\d\\Raw_im\\"
|
#define NETWORK_AOI_IMAGE_PATH "\\\\126.100.100.1\\d\\Image\\Defect\\"
|
//0404NWH
|
#define NETWORK_MURARAW_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\RAW" //0405nwh
|
#define NETWORK_MURA_IMAGE_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Mura\\IMG" //0405nwh
|
|
//KYH Stack Local 경로 추가
|
#define NETWORK_AOISTACKLOCAL_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Stack"
|
/* <LJC 20211122 : #3820 ADD Start> */
|
#define NETWORK_AOIRAWMERGELOCAL_PATH "D:\\DIT_ResultData\\RawMerge"
|
/* <LJC 20211122 : #3820 ADD End> */
|
/* <KMH 20220407 : #4053 ADD Start> */
|
#define LOCAL_LOGDATA_PATH "D:\\DIT_LogData"
|
/* <KMH 20220407 : #4053 ADD End> */
|
char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
void _TimeDelay(int delay)
|
{
|
MSG msg;
|
BOOL fRst = FALSE;
|
|
ULONGLONG lBlockTime = delay + GetTickCount64();
|
|
while (lBlockTime > GetTickCount64())
|
{
|
fRst = (BOOL)PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
|
if (fRst)
|
{
|
TranslateMessage(&msg);
|
DispatchMessage(&msg);
|
}
|
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)
|
{
|
CreateDirectory("D:\\RTMS_Signal", NULL);
|
CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL);
|
CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL);
|
CreateDirectory("D:\\Raw_im", NULL);
|
|
/* <KMH 20220407 : #4053 ADD Start> */
|
CFileFind FileFinder;
|
SYSTEMTIME st;
|
GetLocalTime(&st);
|
char strLogFolderPath [256];
|
sprintf(strLogFolderPath, "%s\\%02d%02d%02d", LOCAL_LOGDATA_PATH,st.wYear, st.wMonth, st.wDay);
|
|
BOOL bFind = FileFinder.FindFile(strLogFolderPath);
|
if (!bFind)
|
{
|
CreateDirectory(strLogFolderPath, NULL);
|
}
|
/* <KMH 20220407 : #4053 ADD End> */
|
m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg");
|
|
m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile);
|
m_nWriteRawDefectIdx = 1;
|
m_bReviewEndCheck = FALSE;
|
}
|
|
CGlassRawCPJT::~CGlassRawCPJT(void)
|
{
|
}
|
|
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
|
{
|
|
AKLOG("Sequence : Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */
|
SetEnableFtpAck(FALSE);
|
m_nRawMergeIdx = 0;
|
if(m_StackResult.getStackUse())
|
{
|
|
CString strStackFileLocalPath;
|
strStackFileLocalPath.Format("%s\\%s", NETWORK_AOISTACKLOCAL_PATH, pData->GetGlassData()->m_strGlassID);
|
|
CFileFind File;
|
|
if (File.FindFile(strStackFileLocalPath))
|
{
|
File.FindNextFile();
|
strStackFileLocalPath = File.GetFilePath();
|
/* <KMH 20220407 : #4053 MOD Start> */
|
if (DeleteFile(strStackFileLocalPath))
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
|
// }
|
// /* <KMH 20220407 : #4053 MOD End> */
|
// Sleep(10);
|
// }
|
// else
|
// {
|
// AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);/* <KMH 20220407 : #4053 MOD > */
|
// }
|
AKLOG(" Function : Delete Stack File Sucess[%s] ", strStackFileLocalPath);
|
else
|
AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);
|
}
|
/*< SWK 20220413 - #4053 MOD End >*/
|
|
//201218 CJH - Stack Download 시도
|
SendMessageFTPDownloadStack(pData->GetGlassData());
|
m_StackResult.StackFileReadStart(pData->GetGlassData()->m_strGlassID);
|
}
|
/* <LJC 20211122 : #3820 ADD Start> */
|
if (pData->GetGlassData()->m_bRawMergeUse)
|
{
|
CString strRawFileLocalPath;
|
strRawFileLocalPath.Format("%s\\%s", NETWORK_AOIRAWMERGELOCAL_PATH, pData->GetGlassData()->m_strGlassID);
|
CFileFind File;
|
if (File.FindFile(strRawFileLocalPath))
|
{
|
File.FindNextFile();
|
strRawFileLocalPath = File.GetFilePath();
|
/* <KMH 20220407 : #4053 MOD Start> */
|
if (DeleteFile(strRawFileLocalPath))
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
|
// }
|
// /* <KMH 20220407 : #4053 MOD End> */
|
// Sleep(10);
|
// }
|
// else
|
// {
|
// AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); /* <KMH 20220407 : #4053 ADD > */
|
// }
|
AKLOG(" Function : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath);
|
else
|
AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath);
|
}
|
/*< SWK 20220413 - #4053 MOD End >*/
|
SetEnableFtpAck(TRUE);
|
DownLoadMergeFile(pData);
|
}
|
/* <LJC 20211122 : #3820 ADD End> */
|
/*< KJG 20211024 - #3487 ADD End >*/
|
|
AKLOG("Sequence : Glass Loading Signal End ");
|
return TRUE;
|
}
|
|
BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData )
|
{
|
AKLOG(" Sequence : InspectionEnd Signal Start"); /* <KMH 20220407 : #4053 ADD > */
|
|
m_bReviewEndCheck = FALSE;
|
//210128
|
m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
|
pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd; // Insp End 시 Raw 업로드로, E_TIME, LD_TIME 입력 [ 21-03-18 KJG ]
|
m_tmFileCreateTime = CTime::GetCurrentTime();
|
|
//여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
|
pData->GetGlassData()->m_strFileName;
|
{
|
_grmGlassData* pGlassData = pData->GetGlassData();
|
CTime CurrTime = pGlassData->m_tmGlassLoading;
|
CString strTime=_T(""), strFileName=_T("");
|
strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
|
|
CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
|
strFileName.Format("%s_%s_%s.bin", pGlassData->m_strGlassID, pGlassData->m_strStepID, strTime.GetBuffer(0));
|
|
strcpy(pData->GetGlassData()->m_strFileName, strFileName.GetBuffer(0));
|
}
|
strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
|
|
|
if(!WriteBinFile(pData))
|
return FALSE;
|
|
|
//if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
|
|
|
if (WriteAOIFile(pData) == FALSE)
|
return FALSE;
|
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
_TimeDelay(5000); // 이미지 복사 시간 대기
|
//210218 CJH - 검사 종료시 결과파일 및 CCD Image 업로드
|
SendMessageFTPUploadRaw(pData->GetGlassData());
|
|
/* <KYH 211129 : #3806 ADD Start> */
|
char pServerPath[256] = {};
|
char pServerFile[256] = {};
|
|
CString strGlassID = pData->GetGlassData()->m_strGlassID;
|
CString strGlassIDLevel6th = strGlassID.Left(6);
|
CString strStepID = pData->GetGlassData()->m_strStepID;
|
CString strProcessID = pData->GetGlassData()->m_strProcessID;
|
CString strFileName;
|
|
strcpy(pServerFile, "*.*");
|
|
strFileName.Format("%s", strGlassID);
|
strFileName.MakeLower();
|
|
sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
|
|
strStepID.MakeLower();
|
strGlassID.MakeLower();
|
strGlassIDLevel6th.MakeLower();
|
strProcessID.MakeLower();
|
|
// if (strGlassID.GetLength() > 6)
|
// sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
|
// else
|
sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
|
/* <KYH 211129 : #3806 ADD End> */
|
|
|
BOOL bIsBDI = strcmp((pData->GetGlassData()->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE;
|
if (bIsBDI)
|
{
|
SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_AOI_IMAGE);
|
|
/* <KYH 211129 : #3806 ADD Start> */
|
CString strRawFilePathName = NULL;
|
CString strLine = NULL;
|
strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
|
strRawFilePathName += RAWINFO_FILE_NAME;
|
FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
|
if (pf != NULL)
|
{
|
strLine = pServerPath + strFileName;
|
fprintf(pf, "[RESULT_PATH]\n");
|
fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
|
SetRawFilePath(strLine.GetBuffer(0));
|
fprintf(pf, "SUMPATH= \n");
|
fprintf(pf, "IMGPATH= Z:\%s\n", strLine.GetBuffer(0));
|
fprintf(pf, "DISK=FILESERVER\n");
|
fclose(pf);
|
}
|
}
|
else
|
{
|
SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);/* <KMH 20220407 : #4053 ADD > */
|
}
|
|
/* <KYH 211129 : #3806 ADD End> */
|
|
|
AKLOG(" Sequence : InspectionEnd Signal End"); /* <KMH 20220407 : #4053 ADD > */
|
return TRUE;
|
}
|
|
BOOL CGlassRawCPJT::SequenceReviewStart( CgrmGlassRawData* pData )
|
{
|
//210128
|
m_tmReviewStart = m_tmReviewEnd = CTime::GetCurrentTime();
|
|
//여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
|
pData->GetGlassData()->m_strFileName;
|
strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWBIN_PATH);
|
|
//strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
|
|
CString strFindFile;
|
int nCloseTime = 600*100000;//sec
|
int nReTryTime = 30;
|
{
|
CTime tmReviewLoading = CTime::GetCurrentTime();
|
CString strWild;
|
|
strWild.Format("%s\\%s_%s_*.bin", pData->GetGlassData()->m_strPath, pData->GetGlassData()->m_strGlassID,pData->GetGlassData()->m_strStepID);
|
CakFileUtil akFileFinder;
|
while(nReTryTime--)
|
{
|
akFileFinder.FindFile(strWild.GetBuffer(0), FALSE);
|
VECFINDDATA* pFindData = akFileFinder.getFindData();
|
int nFileNamePos = strlen(akFileFinder.getProcessPath());
|
std::map<LONGLONG, CString> mapSpanFileName;
|
for(int i=0; i<pFindData->size(); i++)
|
{
|
char* pFileName = &((*pFindData)[i]).name[nFileNamePos];
|
{
|
CakParser parser;
|
parser.process(pFileName, "_.");
|
if(parser.getTokNum() < 4) continue;
|
|
int nDataTime[8]={};
|
{
|
int nTokIndex=0;
|
const char* pGlassId = parser.getTokStr(nTokIndex++);
|
const char* pStepId = parser.getTokStr(nTokIndex++);
|
char* pDate = &pFileName[parser.getTokPos(nTokIndex++)];
|
char* pTime = &pFileName[parser.getTokPos(nTokIndex++)];
|
|
nDataTime[0] = (pDate[0]-'0')*1000 + (pDate[1]-'0')*100 + (pDate[2]-'0')*10+ (pDate[3]-'0')*1;
|
nDataTime[1] = (pDate[4]-'0')*10+ (pDate[5]-'0')*1;
|
nDataTime[2] = (pDate[6]-'0')*10+ (pDate[7]-'0')*1;
|
nDataTime[3] = (pTime[0]-'0')*10+ (pTime[1]-'0')*1;
|
nDataTime[4] = (pTime[2]-'0')*10+ (pTime[3]-'0')*1;
|
nDataTime[5] = (pTime[4]-'0')*10+ (pTime[5]-'0')*1;
|
}
|
|
CTime tmTemp(nDataTime[0], nDataTime[1], nDataTime[2], nDataTime[3], nDataTime[4], nDataTime[5] );
|
CTimeSpan tmSpan = tmReviewLoading-tmTemp;
|
mapSpanFileName.insert(std::make_pair(tmSpan.GetTotalSeconds(), pFileName));
|
}
|
}
|
|
if(mapSpanFileName.empty() == FALSE)
|
{
|
if(mapSpanFileName.begin()->first < nCloseTime)
|
{
|
//가장 최근 결과파일 찾기 성공 [김태현 2019/7/17]
|
strFindFile = mapSpanFileName.begin()->second;
|
break;
|
}
|
}
|
akFileFinder.clear();
|
Sleep(100);
|
}
|
}
|
|
if(strFindFile.IsEmpty()) return FALSE;
|
|
strcpy(pData->GetGlassData()->m_strFileName, strFindFile.GetBuffer(0));
|
|
|
if(!ReadBinFile(pData))
|
return FALSE;
|
|
strcpy(pData->GetGlassData()->m_strPath, LOCAL_AOIRAWBIN_PATH);
|
|
pData->GetGlassData()->m_tmReviewLoading = m_tmReviewStart;
|
|
return TRUE;
|
}
|
|
|
BOOL CGlassRawCPJT::SequenceReviewEnd( CgrmGlassRawData* pData )
|
{
|
m_bReviewEndCheck = TRUE;
|
m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime();
|
m_tmFileCreateTime = CTime::GetCurrentTime();
|
pData->GetGlassData()->m_tmReviewEnd = m_tmReviewEnd;
|
|
//여기에서 라인별로 파일명, 혹은 Path 위치 결정하면됨. AOIServer 혹은 ReviewServer에서 안해도됨 [김태현2019/9/4]
|
pData->GetGlassData()->m_strFileName;
|
strcpy(pData->GetGlassData()->m_strPath, NETWORK_AOIRAWDFS_PATH);
|
|
//if(1) ReadMuraFile(pData); 211012 KJG - QD Macro 개별 업로드 하므로 Macro 데이터 적제 제거 요청
|
|
if(WriteAOIFile(pData) == FALSE)
|
return FALSE;
|
|
//210126 CJH - Review End에서만 RTMS 결과파일 생성하도록 변경
|
if (m_GlassRawRTMS.WriteAOIFile(pData) == FALSE)
|
return FALSE;
|
|
if(1)
|
{
|
_grmGlassData* pGlassData = pData->GetGlassData();
|
|
SendMessageFTPUploadRaw(pGlassData);
|
SendMessageFTPUploadImage(pGlassData, FTPCMD_AOI_IMAGE);
|
SendMessageFTPUploadImage(pGlassData, FTPCMD_REVIEW_IMAGE);
|
SendMessageFTPUploadImage(pGlassData, FTPCMD_MURA_IMAGE);//0405nwh
|
|
}
|
|
|
|
|
return TRUE;
|
}
|
|
BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName)
|
{
|
AKLOG(" Sequence : FTP Upload Signal Start ");
|
// Manual Upload 기능 [21-02-05 KJG]
|
CTime tmFileCreate;
|
_grmGlassData GlassData;
|
_grmGlassData* pGlassData = &GlassData;
|
|
//정보 얻어오기 [김태현 2019/1/25]
|
char* pFileName = CakFileUtil::getFileName(pRawFilePathName);
|
char* pext = CakFileUtil::getFileExt(pRawFilePathName);
|
|
if (!strcmp(pext, "") == FALSE) return FALSE; // 확장자가 없음
|
|
CakParser parser;
|
FILE* pf = fopen(pRawFilePathName, "r");
|
if (pf)
|
{
|
CString strParse, strLDTime;
|
char buffer[512];
|
fgets(buffer, 512, pf);
|
fgets(buffer, 512, pf);
|
fgets(buffer, 512, pf);
|
fgets(buffer, 512, pf);
|
parser.process(buffer, " ");
|
|
if (parser.getTokNum() < 20) return FALSE;
|
strParse = parser.getTokStr(0);
|
if (strParse != "DATA") return FALSE;
|
strParse = parser.getTokStr(1);
|
if (strParse != "PANEL") return FALSE;
|
|
strcpy(pGlassData->m_strProcessID, "");
|
strcpy(pGlassData->m_strProductID, "");
|
strcpy(pGlassData->m_strLotID, "");
|
strcpy(pGlassData->m_strStepID, "");
|
strcpy(pGlassData->m_strGlassID, "");
|
|
strcpy(pGlassData->m_strProcessID, parser.getTokStr(4));
|
strcpy(pGlassData->m_strProductID, parser.getTokStr(5));
|
strcpy(pGlassData->m_strLotID, parser.getTokStr(5)); // C-PJT - m_strLotID = m_strProductID
|
strcpy(pGlassData->m_strStepID, parser.getTokStr(6));
|
strcpy(pGlassData->m_strGlassID, parser.getTokStr(9));
|
strLDTime = parser.getTokStr(19);
|
|
if (pGlassData->m_strProcessID == "" || pGlassData->m_strProductID == "" || pGlassData->m_strLotID == "" || pGlassData->m_strStepID == "" || pGlassData->m_strGlassID == "")
|
{
|
AKLOG("Manual Upload Fail : Parsing Data is Empty");
|
return FALSE;
|
}
|
int nYear = _ttoi(strLDTime.Left(4));
|
int nMon = _ttoi(strLDTime.Mid(4, 2));
|
int nDay = _ttoi(strLDTime.Mid(6, 2));
|
int nHour = _ttoi(strLDTime.Mid(8, 2));
|
int nMin = _ttoi(strLDTime.Mid(10, 2));
|
int nSec = _ttoi(strLDTime.Mid(12, 2));
|
pGlassData->m_tmGlassLoading = CTime(nYear, nMon, nDay, nHour, nMin, nSec);
|
|
m_tmFileCreateTime = CTime::GetCurrentTime();
|
strcpy(pGlassData->m_strPath, NETWORK_AOIRAWDFS_PATH);
|
|
SendMessageFTPUploadRaw(pGlassData);
|
SendMessageFTPUploadImage(pGlassData, FTPCMD_AOI_IMAGE);
|
SendMessageFTPUploadImage(pGlassData, FTPCMD_REVIEW_IMAGE);
|
AKLOG("Manual Success : %s File Send FTPUploader Command", pRawFilePathName);
|
|
}
|
else
|
{
|
AKLOG("Manual Upload Fail : Can't Open File");
|
return FALSE;
|
}
|
|
fclose(pf);
|
|
AKLOG(" Sequence : FTP Upload Signal End ");
|
return TRUE;
|
}
|
|
|
BOOL CGlassRawCPJT::WriteAOIFile( CgrmGlassRawData* pData )
|
{
|
BOOL bResult = TRUE;
|
|
bResult &= MakeAOIFile(pData);
|
|
m_GlassRawAna.MakeAnaFile(pData);
|
//m_GlassRawRTMS.WriteAOIFile(pData);
|
|
AKLOG("WriteAOIFile Complete");
|
return bResult;
|
}
|
|
BOOL CGlassRawCPJT::MakeAOIFile( CgrmGlassRawData* pData )
|
{
|
AKLOG("MakeAOIFile Start");
|
m_nWriteRawDefectIdx = 1;
|
|
_grmGlassData* pGlass = pData->GetGlassData();
|
CString strFilePathName;
|
CString strFileName;//파일생성 시간 때문에 여기서 정확하게 파일명 다시 정정
|
{
|
//Glass 정보
|
CTime CurrTime = m_tmReviewEnd;
|
CString strTime;
|
strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
|
CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
|
strFileName.Format("%s", pGlass->m_strGlassID); // 신기대 프로 요청 확장자 삭제
|
}
|
|
strFilePathName.Format("%s\\%s", pGlass->m_strPath, strFileName);//pGlass->m_strFileName);
|
//strFilePathName.Format("D:\\AOIServer\\NFS\\RAW\\%s", pData->GetGlassData()->m_strFileName);
|
|
// 글라스 ID만 존재하여 재검사 시 파일 생성 실패. 삭제한다
|
DeleteFile(strFilePathName);
|
//FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
|
FILE* pf = fopen(strFilePathName.GetBuffer(0), "w");
|
if(pf == NULL)
|
{
|
AKLOG("MakeAOIFile Fail : [%s]", strFilePathName.GetBuffer(0));
|
return FALSE;
|
}
|
|
|
|
CString strBuffer;
|
CString strLine;
|
|
//////////////////////////////////////////////////////////////////////////
|
//HEDER ITEM
|
{
|
makeDataHeader(strLine, pGlass);
|
fprintf(pf, "%s\n", strLine.GetBuffer(0));
|
}
|
|
|
//////////////////////////////////////////////////////////////////////////
|
//GLASSDATA
|
{
|
/*< KJG 20211229 - #3846 MOD Start >*/
|
//makeDataGlass(strLine, pGlass);
|
makeDataGlass(strLine, pData, pGlass);
|
/*< KJG 20211229 - #3846 MOD End >*/
|
fprintf(pf, "%s\n", strLine.GetBuffer(0));
|
}
|
|
//////////////////////////////////////////////////////////////////////////
|
//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++)
|
{
|
/* < 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);
|
/* < 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;
|
|
if (makeDataDefect(strLine, pData, pDefect))
|
{
|
fprintf(pf, "%s\n", strLine);
|
}
|
}
|
|
}
|
}
|
}
|
|
|
|
|
|
AKLOG("MakeAOIFile Complete : [%s]", strFilePathName.GetBuffer(0));
|
fclose(pf);
|
return TRUE;
|
}
|
|
void CGlassRawCPJT::makeDataHeader( CString& strLine, _grmGlassData* pGlassData )
|
{
|
strLine.Empty();
|
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"; //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> */
|
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;
|
|
}
|
#define SPRINTRAWSTART char strItemValue[1024];int nItemValueLen, nItemValuePos = 0;memset(strItemValue, ' ', sizeof(char)*1024)
|
#define SPRINTRAW(ITEMSIZE, fmt, ...) nItemValueLen = sprintf(strItemValue+nItemValuePos, fmt,##__VA_ARGS__); strItemValue[nItemValuePos+ nItemValueLen] = ' ';nItemValuePos+=ITEMSIZE+1
|
#define SPRINTRAWEND strItemValue[nItemValuePos - 1] = 0; strLine = strItemValue
|
/*< KJG 20211229 - #3846 MOD Start >*/
|
//void CGlassRawCPJT::makeDataGlass( CString& strLine, _grmGlassData* pGlassData )
|
void CGlassRawCPJT::makeDataGlass( CString& strLine, CgrmGlassRawData* pData, _grmGlassData* pGlassData )
|
/*< KJG 20211229 - #3846 MOD End >*/
|
{
|
SPRINTRAWSTART;
|
|
CString strValue;
|
|
/* PANEL ITEM
|
01 4 ITEM // ITEM Separator
|
02 5 PANEL // PANEL Separator
|
03 5 MODULETYPE // Module Type
|
04 27 MODULEID // Module ID
|
05 20 PROCESSID // ProcessID
|
06 20 PRODUCTID // ProductID
|
07 10 STEPID // StepID
|
08 2 PROD_TYPE // Prod Type
|
09 12 BATCHID // Batch ID
|
10 12 H_PANELID // Host Panel ID
|
11 12 E_PANELID // Panel ID Reading by VCR
|
12 12 P_PANELID // Pair Panel ID
|
13 16 OPERID // Perator ID or Module ID
|
14 3 COMP_COUNT // Cell Count
|
15 16 PPID // PPID (Recipe Name)
|
16 4 GRADE // Grade (Judgement)
|
17 4 CODE // Grade Code (Judgement Code)
|
18 4 R_GRADE // Grade by Operator (Re-Judgement)
|
19 16 MAP_IMAGE // Map Image File Name
|
20 14 L_TIME // Cassette or Conveyor에서 OUT된 시간
|
21 14 U_TIME // Cassette or Conveyor에서 IN된 시간
|
22 14 S_TIME // Stage에서 검사/계측 시작된 시각
|
23 14 E_TIME // Stage에서 검사/계측 종료된 시각
|
24 12 T_DEFECT // Common Item 1 - Total Defect Count
|
25 12 TR // Panel 정보 02
|
26 12 PR // Panel 정보 03
|
27 12 TB // Panel 정보 04
|
28 12 TW // Panel 정보 05
|
29 12 RB // Panel 정보 06
|
30 12 RW // Panel 정보 07
|
31 12 T_STACK // SD+SP 수
|
32 12 BMDF // Panel 정보 09 -> 변경 MAX_AVG_GRAY 04/12
|
33 12 CJ // Panel 정보 10 -> 변경 MAX_PORTION 04/12
|
34 12 OK_CELL // OK Cell Count
|
35 12 RJ_CELL // RJ Cell Count
|
36 12 RW_CELL // RW Cell Count
|
37 12 NR_CELL // NR Cell Count
|
38 12 MASK_CELL // MASK Cell Count - CST ID
|
39 12 A_CELL // 이상 Cell Count - SLOT NO
|
40 12 P_CELL // Pattern Shift Cell Count - JOB END
|
41 12 TD_DEFECT // Total Defect Count -> TD Defect Count
|
42 12 SD_DEFECT // SD Defect Count
|
43 12 PD_DEFECT // PD Defect Count
|
44 12 SP_DEFECT // SP Defect Count
|
45 12 PAD_GATE // PAD Gate 불량 수
|
46 12 PAD_DATA // PAD Data 불량 수
|
47 12 M_DEFECT // MASK 불량 수
|
48 12 C_DEFECT // COMMON 불량
|
49 12 BR_DEFECT // SCRATCH 불량 수 => LN_DEFECT // 라인성 불량 수
|
50 12 CRACK // Crack 불량 수 - Image 촬상 갯수
|
51 12 P_SHIFT // Pattern Shift 불량 수 - 레시피 이름
|
*/
|
|
//////////////////////////////////////////////////////////////////////////
|
// [김태현2020/9/15]
|
// SPRINTRAW(데이터 크기, "VALUE");
|
|
// 01 4 ITEM // ITEM Separator
|
SPRINTRAW(4, "DATA");
|
// 02 5 PANEL // PANEL Separator
|
SPRINTRAW(5, "PANEL");
|
// 03 5 MODULETYPE // Module Type
|
/*SPRINTRAW(5, "*");*/
|
if (strlen(pGlassData->m_strEquipID) == 0)
|
{
|
SPRINTRAW(5, "*");
|
}
|
else
|
{
|
CString temp = pGlassData->m_strEquipID;
|
SPRINTRAW(5, "%s", temp.Left(5));
|
}
|
// 04 27 MODULEID // Module ID
|
if (strlen(pGlassData->m_strOperID) == 0)
|
{
|
SPRINTRAW(27, "*");
|
}
|
else
|
{
|
SPRINTRAW(27, "%s", pGlassData->m_strOperID);
|
}
|
// 05 20 PROCESSID // ProcessID
|
if (strlen(pGlassData->m_strProcessID) == 0)
|
{
|
SPRINTRAW(20, "*");
|
}
|
else
|
{
|
SPRINTRAW(20, "%s", pGlassData->m_strProcessID);
|
}
|
// 06 20 PRODUCTID // ProductID
|
if (strlen(pGlassData->m_strProductID) == 0)
|
{
|
SPRINTRAW(20, "*");
|
}
|
else
|
{
|
SPRINTRAW(20, "%s", pGlassData->m_strProductID);
|
}
|
// 07 10 STEPID // StepID
|
if (strlen(pGlassData->m_strStepID) == 0)
|
{
|
SPRINTRAW(10, "*");
|
}
|
else
|
{
|
SPRINTRAW(10, "%s", pGlassData->m_strStepID);
|
}
|
// 08 2 PROD_TYPE // Prod Type
|
if (strlen(pGlassData->m_strProdType) == 0)
|
{
|
SPRINTRAW(2, "*");
|
}
|
else
|
{
|
SPRINTRAW(2, "%s", pGlassData->m_strProdType);
|
}
|
// 09 12 BATCHID // Batch ID - Glass ID 앞 6자리
|
strValue = pGlassData->m_strGlassID;
|
SPRINTRAW(12, "%s", strValue.Left(6));
|
// 10 12 H_PANELID // Host Panel ID
|
if (strlen(pGlassData->m_strGlassID) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strGlassID);
|
}
|
// 11 12 E_PANELID // Panel ID Reading by VCR
|
if (strlen(pGlassData->m_strEPPID) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strEPPID);
|
}
|
// 12 12 P_PANELID // Pair Panel ID
|
if (strlen(pGlassData->m_strPairHPanelID) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strPairHPanelID);
|
}
|
// 13 16 OPERID // Perator ID or Module ID
|
if (strlen(pGlassData->m_strOperID) == 0)
|
{
|
SPRINTRAW(16, "*");
|
}
|
else
|
{
|
SPRINTRAW(16, "%s", pGlassData->m_strOperID);
|
}
|
// 14 3 COMP_COUNT // Cell Count
|
SPRINTRAW(3, "%d", pGlassData->m_nCellNum);
|
// 15 16 PPID // PPID (Recipe Name)
|
if (strlen(pGlassData->m_strPPID) == 0)
|
{
|
SPRINTRAW(16, "*");
|
}
|
else
|
{
|
SPRINTRAW(16, "%s", pGlassData->m_strPPID);
|
}
|
// 16 4 GRADE // Grade (Judgement)
|
if (strlen(pGlassData->m_strGlassJudge) == 0)
|
{
|
SPRINTRAW(4, "*");
|
}
|
else
|
{
|
SPRINTRAW(4, "%s", pGlassData->m_strGlassJudge);
|
}
|
// 17 4 CODE // Grade Code (Judgement Code)
|
if (strlen(pGlassData->m_strGlassCode) == 0)
|
{
|
SPRINTRAW(4, "*");
|
}
|
else
|
{
|
SPRINTRAW(4, "%s", pGlassData->m_strGlassCode);
|
}
|
// 18 4 R_GRADE // Grade by Operator (Re-Judgement)
|
SPRINTRAW(4, "*");
|
// 19 16 MAP_IMAGE // Map Image File Name
|
// if (strlen(pGlassData->m_strFileName) == 0)
|
// {
|
// SPRINTRAW(16, "*");
|
// }
|
// else
|
// {
|
// SPRINTRAW(16, "%s", pGlassData->m_strFileName);
|
// }
|
SPRINTRAW(16, "map01.jpg"); //Defect Map 자릿수가 20자리가 넘는다..
|
// 20 14 L_TIME // Cassette or Conveyor에서 OUT된 시간
|
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());
|
SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
|
// 21 14 U_TIME // Cassette or Conveyor에서 IN된 시간
|
strValue.Format("%04d%02d%02d%02d%02d%02d" // E_TIME
|
, pGlassData->m_tmReviewEnd.GetYear()
|
, pGlassData->m_tmReviewEnd.GetMonth()
|
, pGlassData->m_tmReviewEnd.GetDay()
|
, pGlassData->m_tmReviewEnd.GetHour()
|
, pGlassData->m_tmReviewEnd.GetMinute()
|
, pGlassData->m_tmReviewEnd.GetSecond());
|
SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
|
// 22 14 S_TIME // Stage에서 검사/계측 시작된 시각
|
strValue.Format("%04d%02d%02d%02d%02d%02d" // START_TIME
|
, pGlassData->m_tmInspectionStart.GetYear()
|
, pGlassData->m_tmInspectionStart.GetMonth()
|
, pGlassData->m_tmInspectionStart.GetDay()
|
, pGlassData->m_tmInspectionStart.GetHour()
|
, pGlassData->m_tmInspectionStart.GetMinute()
|
, pGlassData->m_tmInspectionStart.GetSecond());
|
SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
|
// 23 14 E_TIME // Stage에서 검사/계측 종료된 시각
|
strValue.Format("%04d%02d%02d%02d%02d%02d" // E_TIME
|
, pGlassData->m_tmReviewEnd.GetYear()
|
, pGlassData->m_tmReviewEnd.GetMonth()
|
, pGlassData->m_tmReviewEnd.GetDay()
|
, pGlassData->m_tmReviewEnd.GetHour()
|
, pGlassData->m_tmReviewEnd.GetMinute()
|
, pGlassData->m_tmReviewEnd.GetSecond());
|
SPRINTRAW(14, "%s", (LPSTR)(LPCTSTR)strValue);
|
// 24 6 T_DEFECT // Common Item 1 - Total Defect Count
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNum - pGlassData->m_nCutOffDefectNum); //210203 CJH - Cutoff 결함은 전체개수에서 제외해준다.
|
// 25 6 TR // Panel 정보 02
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeTR);
|
// 26 6 PR // Panel 정보 03
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgePR);
|
// 27 6 NG // Panel 정보 04
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeNG); /* <KYH 211129 : #3796 ADD Start> */
|
// 28 6 TB // Panel 정보 04
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTB);
|
// 29 6 TW // Panel 정보 05
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeTW);
|
// 30 6 RB // Panel 정보 06
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRB);
|
// 31 6 RW // Panel 정보 07
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeRW);
|
// 32 6 T_STACK // Panel 정보 08 SD+SP 수 입력
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD + pGlassData->m_nDefectNumStackSP);
|
// 33 6 NO_DEFECT // Panel 정보 09
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeND); /* <KYH 211129 : #3796 ADD Start> */
|
//34 6 BMDF // Panel 정보 10 -> 변경 MAX_AVG_GRAY 04/12 nwh
|
/*< KJG 20211229 - #3846 MOD Start >*/
|
//if (strlen(pGlassData->m_strMaxAvgGray) == 0)
|
//{
|
// SPRINTRAW(12, "*");
|
//}
|
//else
|
//{
|
// SPRINTRAW(12, "%s", pGlassData->m_strMaxAvgGray);
|
//}
|
int nMaxCellNG = 0;
|
for (int iCell = 0; iCell < pData->GetGlassData()->m_nCellNum; iCell++)
|
{
|
_grmCellData* pCell = pData->GetCellData(iCell);
|
nMaxCellNG = max(nMaxCellNG, pCell->m_nDefectNumJudgeNG);
|
}
|
SPRINTRAW(12, "%d", nMaxCellNG);
|
/*< KJG 20211229 - #3846 MOD End >*/
|
// 35 6 CJ // Panel 정보 11 -> 변경 MAX_PORTION 04/12 nwh
|
if (strlen(pGlassData->m_strMaxPortion) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strMaxPortion);
|
}
|
// 36 6 OK_CELL // OK Cell Count
|
SPRINTRAW(12, "*");
|
// 37 6 RJ_CELL // RJ Cell Count
|
SPRINTRAW(12, "*");
|
// 38 6 RW_CELL // RW Cell Count
|
SPRINTRAW(12, "*");
|
// 39 6 NR_CELL // NR Cell Count
|
SPRINTRAW(12, "*");
|
// 40 6 MASK_CELL // MASK Cell Count //201215 CJH - CSTID로 변경
|
if (strlen(pGlassData->m_strCSTID) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strCSTID);
|
}
|
|
SPRINTRAW(12, "%d", pGlassData->m_nSlot_No); // SLot_No 추가 [ 21-03-18 KJG ]
|
|
SPRINTRAW(12, "%d", pGlassData->m_bJob_end); // Job_end 추가 [ 21-03-18 KJG ]
|
|
// 41 6 TD_DEFECT // TD Defect Count -> 현공정에서 나온 모든 결함 : Total - SD
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackTD);
|
// 42 6 SD_DEFECT // SD Defect Count -> TD 결함에서 Stack 결함을 제외한 결함(우리 설비에서 첫 발견된 결함)
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSD);
|
// 43 6 PD_DEFECT // PD Defect Count -> 현재 공정에서 검출된 특정 Partial 결함(사양서 상에는 Zone이라 되어있으나 실질적으로는 Classfication에 통과된 결함)
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackPD);
|
// 44 6 SP_DEFECT // SP Defect Count -> 현재 공정에서 검출된 특정 Partial 결함 중, 이전 공정의 Partial 결함을 제외한 결함
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumStackSP);
|
// 45 6 PAD_GATE // PAD Gate 불량 수
|
SPRINTRAW(12, "*");
|
// 46 6 PAD_DATA // PAD Data 불량 수
|
SPRINTRAW(12, "*");
|
// 47 6 M_DEFECT // MASK 불량 수
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeMD);
|
// 48 6 C_DEFECT // COMMON 불량
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumTypeCD);
|
/*< LHS 20211029 - #3783 MOD Start >*/
|
// 49 6 S_DEFECT // SCRATCH 불량 수
|
//SPRINTRAW(12, "*");
|
// 49 6 LN_DEFECT // Line 불량 수
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumJudgeLine);
|
/*< LHS 20211029 - #3783 MOD End >*/
|
// 50 6 CRACK // Crack 불량 수 //201217 CJH - Image 촬상 개수로 변경
|
//SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
|
SPRINTRAW(12, "%d", pGlassData->m_nReviewNum);
|
// 51 6 P_SHIFT // Pattern Shift 불량 수 //201217 CJH - Recipe로 변경
|
if (strlen(pGlassData->m_strRecipeName) == 0)
|
{
|
SPRINTRAW(16, "*");
|
}
|
else if(strlen(pGlassData->m_strRecipeName) <= 16)
|
{
|
SPRINTRAW(16, "%s", pGlassData->m_strRecipeName);
|
}
|
else if (strlen(pGlassData->m_strRecipeName) > 16)
|
{
|
CString temp = pGlassData->m_strRecipeName; // 레시피 17자리 넘어가면 DCOLL 발생으로 예외처리 [ 21-06-02 KJG ]
|
temp = temp.Left(16);
|
SPRINTRAW(16, "%s", temp.GetBuffer(0));
|
}
|
|
// 52 12 SHRINK // Server or Frame Shrink 동작 여부
|
if (strlen(pGlassData->m_strShrinked) == 0)
|
{
|
SPRINTRAW(12, "*");
|
}
|
else
|
{
|
SPRINTRAW(12, "%s", pGlassData->m_strShrinked);
|
}
|
// 53 12 RAW_CUT // RAW 입력 Defect 수량 상한 사용여부
|
if (pGlassData->m_bRawCutoff)
|
{
|
SPRINTRAW(12, "USE");
|
}
|
else
|
{
|
SPRINTRAW(12, "UNUSE");
|
}
|
|
if (pGlassData->m_bEdgeCrackUse)
|
{
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectNumLocCrack);
|
}
|
else
|
{
|
SPRINTRAW(12, "UNUSE");
|
}
|
/* <LJC 20220425 : #3957 ADD Start> */
|
for (int i = 0; i < RAW_CODE_MAX; i++)
|
{
|
if (pGlassData->m_nDefectCode[i] >= 0)
|
{
|
SPRINTRAW(12, "%d", pGlassData->m_nDefectCode[i]);
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
}
|
/* <LJC 20220425 : #3957 ADD End> */
|
SPRINTRAWEND; //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
|
}
|
|
void CGlassRawCPJT::makeDataCell( CString& strLine, CgrmGlassRawData* pData, _grmCellData* pCellData )
|
{
|
SPRINTRAWSTART;
|
|
/* SUBPanel ITEM
|
01 4 ITEM // ITEM
|
02 8 SUBPANEL // SUBPANEL
|
03 12 SUBPANELID // Subpanel ID
|
04 7 COORD_X // X Beginnign Coord
|
05 7 COORD_Y // Y Beginning Coord
|
06 7 SIZE_X // X-axis Size
|
07 7 SIZE_Y // Y-axis Size
|
08 6 GATELINE // GateLine
|
09 6 DATALINE // DataLine
|
10 4 GRADE // Grade (Judgement)
|
11 4 CODE // Grade Code (Judgement)
|
12 4 R_GRADE // Grade by Operator (Re-Judgement)
|
13 12 T_DEFECT // Total Defect Count
|
14 12 TD_DEFECT // TD Defect Count
|
15 12 SD_DEFECT // SD Defect Count
|
16 12 PD_DEFECT // PD Defect Count
|
17 12 SP_DEFECT // SP Defect Coun
|
18 12 PAD_GATE // PAD Gate Defect Count
|
19 12 PAD_DATA // PAD Data Defect Count
|
20 12 M_DEFECT // MASK Defect Count
|
21 12 C_DEFECT // COMMON Defect Count
|
22 12 S_DEFECT // SCRATCH Defect Count ==> LN_DEFECT
|
23 12 CRACK // CRACK Defect Count
|
24 12 P_SHIFT // Pattern Shift Defect Count
|
*/
|
|
// 01 4 ITEM // ITEM
|
SPRINTRAW(4, "DATA");
|
// 02 8 SUBPANEL // SUBPANEL
|
SPRINTRAW(8, "SUBPANEL");
|
// 03 12 SUBPANELID // Subpanel ID
|
//SPRINTRAW(12, "%d", pCellData->m_nCellID);
|
/* < 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좌표 반대
|
// 코너컷 기준으로 결과파일 좌표가 생성되는데 고객사에 명확한 확인 필요
|
// Server는 모든 좌표를 글라스 원점 기준으로 하는데 코너컷 기준이 되어야하는지 봐야함
|
// 셀 위치는 글라스 원점, 좌표는 코너컷???
|
// 210129 CJH - 셀 원점 위치에 따라 좌표위치 변경 LeftTop(1,-1) RightTop(-1,-1) LeftBottom(1,1) RightBottom(-1,1)
|
if (pCellData->m_nCellXDir == 1)
|
{
|
// 04 7 COORD_X // X Beginning Coord
|
SPRINTRAW(8, "%d", pCellData->m_rectCellLeft);
|
}
|
else
|
{
|
// 04 7 COORD_X // X Beginning Coord
|
SPRINTRAW(8, "%d", pCellData->m_rectCellRight);
|
}
|
|
if (pCellData->m_nCellYDir == 1)
|
{
|
// 05 7 COORD_Y // Y Beginning Coord //Top을 해야 제대로 값이 들어감...Rect부터 잘못 들어가는듯
|
SPRINTRAW(8, "%d", pCellData->m_rectCellTop * -1);
|
}
|
else
|
{
|
// 05 7 COORD_Y // Y Beginning Coord
|
SPRINTRAW(8, "%d", pCellData->m_rectCellBottom * -1);
|
}
|
// 06 7 SIZE_X // X-axis Size
|
SPRINTRAW(7, "%d", pCellData->m_rectCellRight - pCellData->m_rectCellLeft);
|
// 07 7 SIZE_Y // Y-axis Size
|
SPRINTRAW(7, "%d", pCellData->m_rectCellBottom - pCellData->m_rectCellTop);
|
// 08 6 GATELINE // 총 GateLine 수
|
SPRINTRAW(6, "%d", pCellData->m_nGateNum);
|
// 09 6 DATALINE // 총 DataLine 수
|
SPRINTRAW(6, "%d", pCellData->m_nDataNum);
|
// 10 4 GRADE // Grade (Judgement)
|
SPRINTRAW(4, "%s", GetDefectInfoToString(DMT_DefectJudge, pCellData->m_nJudgement));
|
|
// 11 4 CODE // Grade Code (Judgement)
|
SPRINTRAW(4, "OOOO");
|
// 12 4 R_GRADE // Grade by Operator (Re-Judgement)
|
SPRINTRAW(4, "*");
|
// 13 6 T_DEFECT // Total Defect Count
|
SPRINTRAW(12, "%d", pCellData->getTotalDefectNum());
|
// 14 6 TD_DEFECT // TD Defect Count - total defect
|
SPRINTRAW(12, "%d", pCellData->m_nDefectTDCount);
|
// 15 6 SD_DEFECT // SD Defect Count - stack defect
|
SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount);
|
// 16 6 PD_DEFECT // PD Defect Count - partial defect
|
SPRINTRAW(12, "%d", pCellData->m_nDefectPDCount);
|
// 17 6 SP_DEFECT // SP Defect Count - stack partial
|
SPRINTRAW(12, "%d", pCellData->m_nDefectSPCount);
|
// 18 6 PAD_GATE // PAD Gate Defect Count
|
SPRINTRAW(12, "*");
|
// 19 6 PAD_DATA // PAD Data Defect Count
|
SPRINTRAW(12, "*");
|
// 20 6 M_DEFECT // MASK Defect Count
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeMD);
|
// 21 6 C_DEFECT // COMMON Defect Count
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeCD);
|
|
/* <KYH 211129 : #3796 MOD Start> */
|
|
// 22 6 PRO_IMAGE -> LN_DEFECT 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeLine);
|
// 23 6 AVG_GRAY -> TR 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeTR);
|
// 24 6 PORTION -> PR 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgePR);
|
// 25 6 CORNER_GRAY -> NG 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeNG);
|
// 26 6 AVG_AMP -> RB 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRB);
|
// 27 6 FFT_VAR -> RW 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeRW);
|
// 28 6 TB 추가
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTB); //KYH TB 데이터 추가
|
// 29 6 TW 추가
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumTypeTW); //KYH TW 데이터 추가
|
// 30 6 FFT_VEH -> T_STACK 변경
|
SPRINTRAW(12, "%d", pCellData->m_nDefectSDCount + pCellData->m_nDefectSPCount);
|
// 31 6 NO_DEFECT 추가
|
SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND 데이터 추가
|
/* <KYH 211129 : #3796 MOD End> */
|
/* <LJC 20220425 : #3957 ADD Start> */
|
for (int i = 0; i < RAW_CODE_MAX; i++)
|
{
|
if (pCellData->m_nDefectCode[i] >= 0)
|
{
|
SPRINTRAW(12, "%d", pCellData->m_nDefectCode[i]);
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
}
|
/* <LJC 20220425 : #3957 ADD End> */
|
SPRINTRAWEND; //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
|
}
|
|
BOOL CGlassRawCPJT::makeDataDefect( CString& strLine, CgrmGlassRawData* pData, _grmDefectData* pDefectData )
|
{
|
SPRINTRAWSTART;
|
CString strItem;
|
/* DEFECT ITEM
|
// 01 4 ITEM // ITEM
|
// 02 6 DEFECT // DEFECT
|
// 03 12 ID // Subpanel ID
|
// 04 5 DEF_NO // Defect Number of Panel
|
// 05 7 COORD_X // Defect Location from origin point X
|
// 06 7 COORD_Y // Defect Location from origin point Y
|
// 07 6 GATELINE // Defect Gateline
|
// 08 6 DATALINE // Defect Dataline
|
// 09 4 SIZE_S // Defect Size (Square)
|
// 10 4 SIZE_W // Defect Size (Width)
|
// 11 4 SIZE_L // Defect Size (Length)
|
// 12 4 SIZE_H // Defect Size (Height)
|
// 13 4 GRADE // Defect Grade
|
// 14 4 CODE // Defect Code
|
// 15 2 STACK_FLAG // Current Defect Flag
|
// 16 2 STACK_COUNT // Count of Defect detected step
|
// 17 60 STACK_STEP // Flow(Step) of defect detection
|
// 18 16 IMAGE_FILE // Image file Name
|
// 19 12 DSC Code ==> LINE_CODE
|
// 20 12 Image 분류 Code
|
// 21 12 불량이 위치한 Zone No 입력
|
// 22 12 불량 크기 (L,H,M,S)
|
// 23 12 M/N/C/S/K/*
|
// 24 12 미사용
|
// 25 12 미사용
|
// 26 12 전 STEP 판정 D/F 유무
|
// 27 12 Gray Min
|
// 28 12 Gray Max
|
// 29 12 Gray Average
|
// 30 12 Defect Peak
|
// 31 12 미사용
|
// 32 12 미사용
|
// 33 12 Scan 번호
|
// 34 12 Camera ID
|
// 35 12 미사용
|
// 36 12 R_SRC_MIN
|
// 37 12 R_SRC_MAX
|
// 38 12 R_SRC_AVG
|
// 39 12 Scan AI 분류결과
|
// 40 12 Review AI 분류결과
|
// 41 12 검출모드 (Dark or Bright)
|
// 42 12 검출채널 RGB
|
*/
|
|
// 01 4 ITEM // ITEM
|
SPRINTRAW(4, "DATA");
|
// 02 6 DEFECT // DEFECT
|
SPRINTRAW(6, "DEFECT");
|
// 03 12 ID // Subpanel ID
|
/* < 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);
|
SPRINTRAW(5, "%d", m_nWriteRawDefectIdx++);
|
// 05 8 COORD_X // Defect Location from origin point X
|
SPRINTRAW(8, "%d", pDefectData->m_nUMCenterAlignX);
|
// 06 8 COORD_Y // Defect Location from origin point Y
|
// 신기대프로 요청 임시 수정
|
SPRINTRAW(8, "%d", pDefectData->m_nUMCenterAlignY*-1);
|
// 07 6 GATELINE // Defect Gateline
|
SPRINTRAW(6, "%d", pDefectData->m_nCellGate);
|
// 08 6 DATALINE // Defect Dataline
|
SPRINTRAW(6, "%d", pDefectData->m_nCellData);
|
// 09 4 SIZE_S // Defect Size (Square)
|
if (abs(pDefectData->m_nPixelSize) > 9999) {
|
SPRINTRAW(4, "%d",9999);
|
}
|
else
|
{
|
SPRINTRAW(4, "%d", pDefectData->m_nPixelSize);
|
}
|
|
// 10 4 SIZE_W // Defect Size (Width)
|
if (abs(pDefectData->m_nUMSizeX) > 9999) {
|
SPRINTRAW(4, "%d", 9999);
|
}
|
else
|
{
|
|
SPRINTRAW(4, "%d", pDefectData->m_nUMSizeX);
|
}
|
|
// 11 4 SIZE_L // Defect Size (Length)
|
if (abs(pDefectData->m_nUMSizeY) > 9999) {
|
SPRINTRAW(4, "%d", 9999);
|
}
|
else
|
{
|
SPRINTRAW(4, "%d", pDefectData->m_nUMSizeY);
|
|
}
|
|
// 12 4 SIZE_H // Defect Size (Height)
|
if (abs(pDefectData->m_nDefectRScale) > 9999) {
|
SPRINTRAW(4, "%d", 9999);
|
}
|
else
|
{
|
strItem.Format("%d", pDefectData->m_nDefectRScale);
|
SPRINTRAW(4, "%.4s", strItem.GetBuffer(0));
|
}
|
|
|
// 13 4 GRADE // Defect Grade
|
SPRINTRAW(4, "%s", GetDefectInfoToString(DMT_DefectJudge, pDefectData->m_DefectJudgement));
|
// 14 4 CODE // Defect Code
|
if (strlen(pDefectData->m_strDefectCode))
|
{
|
SPRINTRAW(4, "%.4s", pDefectData->m_strDefectCode);
|
}
|
else
|
{
|
SPRINTRAW(4, "*");
|
}
|
// 15 2 STACK_FLAG // Current Defect Flag //201221 CJH - TD/SD/PD/SP
|
if (pDefectData->m_StackInfo == Stack_Unknown)
|
{
|
SPRINTRAW(2, "%s", "UK");
|
}
|
else if (pDefectData->m_StackInfo == Stack_TD)
|
{
|
SPRINTRAW(2, "%s", "TD");
|
}
|
else if (pDefectData->m_StackInfo == Stack_SD)
|
{
|
SPRINTRAW(2, "%s", "SD");
|
}
|
else if (pDefectData->m_StackInfo == Stack_PD)
|
{
|
SPRINTRAW(2, "%s", "PD");
|
}
|
else if (pDefectData->m_StackInfo == Stack_SP)
|
{
|
SPRINTRAW(2, "%s", "SP");
|
}
|
else
|
{
|
SPRINTRAW(2, "*");
|
}
|
// 16 2 STACK_COUNT // Count of Defect detected step
|
SPRINTRAW(2, "%2d", pDefectData->m_nStackStepCount);
|
// 17 60 -> 400 STACK_STEP // Flow(Step) of defect detection
|
if (strlen(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
|
{
|
SPRINTRAW(60, "*");
|
}
|
// 18 16 IMAGE_FILE // Image file Name
|
// 검사 이미지 미사용
|
if (strlen(pDefectData->m_ReviewDefect.m_strRevImageName))
|
{
|
SPRINTRAW(16, "%s", pDefectData->m_ReviewDefect.m_strRevImageName);
|
}
|
else
|
{
|
SPRINTRAW(16, "*");
|
}
|
/*< LHS 20211029 - #3783 MOD Start >*/
|
// 19 12 DSC_CODE // Common 01 DSC Code ==> LINE_CODE
|
if (strlen(pDefectData->m_strLNDefectCode))
|
{
|
SPRINTRAW(12, "%s", pDefectData->m_strLNDefectCode);
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
//SPRINTRAW(12, "*");
|
/*< LHS 20211029 - #3783 MOD End >*/
|
// 20 12 VC_CODE // Common 02 Image 분류 Code
|
SPRINTRAW(12, "*");
|
// 21 12 ZONE_NO // Common 03 불량이 위치한 Zone No 입력
|
// Zone Data
|
int nValue = 0;
|
for (int i = 15; i >= 0; i--)
|
{
|
if (pDefectData->m_sZonePixelCount[i] > 0)
|
nValue += 1;
|
if (i > 0)
|
nValue = nValue << 1;
|
}
|
SPRINTRAW(12, "%04X", nValue);
|
|
// 22 12 DEFECT_SIZE // Common 04 불량 크기 (L,H,M,S)
|
if (pDefectData->m_DefectSizeType == SizeType_Small)
|
{
|
SPRINTRAW(12, "S");
|
}
|
else if (pDefectData->m_DefectSizeType == SizeType_Mid)
|
{
|
SPRINTRAW(12, "M");
|
}
|
else if (pDefectData->m_DefectSizeType == SizeType_Large)
|
{
|
SPRINTRAW(12, "L");
|
}
|
else if (pDefectData->m_DefectSizeType == SizeType_Huge)
|
{
|
SPRINTRAW(12, "H");
|
}
|
else if (pDefectData->m_DefectSizeType == SizeType_Ultra)
|
{
|
SPRINTRAW(12, "U");
|
}
|
else
|
{
|
SPRINTRAW(12, "S");
|
}
|
//SizeType_Small
|
// 23 12 REPEAT_DEFECT // Common 05 M/N/C/S/K/*
|
if (pDefectData->m_DefectSubType == DefectSubType_MC)
|
{
|
SPRINTRAW(12, "MC");
|
}
|
else if (pDefectData->m_DefectSubType == DefectSubType_Mask)
|
{
|
SPRINTRAW(12, "MD");
|
}
|
else if (pDefectData->m_DefectSubType == DefectSubType_Common)
|
{
|
SPRINTRAW(12, "CD");
|
}
|
else if (pDefectData->m_DefectSubType == DefectSubType_NoDefect)
|
{
|
SPRINTRAW(12, "NO");
|
}
|
else
|
{
|
SPRINTRAW(12, "N");
|
}
|
// 24 12 // Common 06 미사용 -> WSI 높이 기입
|
//m_nPlanType == ditRaw::RTP_WSI 이걸로 비교하니깐 가끔 비교안되고 넘어감 210205
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[1]);
|
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 25 12 // Common 07 미사용 -> CS 높이 기입
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[3]);
|
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 26 12 // Common 08 전 STEP 판정 D/F 유무
|
SPRINTRAW(12, "*");
|
// 27 12 GRAY_MIN // Common 09 Gray Min
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcMin);
|
// 28 12 GRAY_MAX // Common 10 Gray Max
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcMax);
|
// 29 12 GRAY_AVG // Common 11 Gray Average
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelSrcAvg);
|
// 30 12 GRAY_DEF // Common 12 Defect Peak
|
if (static_cast<int>(pDefectData->m_sDefectPeak) == 0)
|
{
|
SPRINTRAW(12, "1");
|
}
|
else
|
{
|
SPRINTRAW(12, "%d", pDefectData->m_sDefectPeak);
|
}
|
|
// 31 NO USE -> WSI Image Name
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
if (strlen(pDefectData->m_ReviewDefect.m_strWsi_3DImageFilename))
|
{
|
SPRINTRAW(12, "%s", pDefectData->m_ReviewDefect.m_strWsi_3DImageFilename);
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 32 NO USE -> CCD Image 유무
|
if (strrchr(pDefectData->m_strAoiImageName, '*') != NULL || strlen(pDefectData->m_strAoiImageName) < 4) // KYH 210826 CCD 이미지 문자열에서 *이 있을경우 X 머지할것
|
{
|
SPRINTRAW(12, "X");
|
}
|
else
|
{
|
SPRINTRAW(12, "O");
|
}
|
// 33 12 CAM_POSITION // Common 15 Scan 번호
|
SPRINTRAW(12, "%d", pDefectData->m_nScanIdx);
|
// 34 12 CAM_POSITION // Common 16 Camera ID
|
SPRINTRAW(12, "%d", pDefectData->m_nCameraID);
|
// 35 12 Defect Idx // Common 25 Defect Idx
|
SPRINTRAW(12, "%d", pDefectData->m_nDefectIdx);
|
// 36 12 R_SRC_MIN // Common 18 R_SRC_MIN
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelRefMin);
|
// 37 12 R_SRC_MAX // Common 19 R_SRC_MAX
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelRefMax);
|
// 38 12 R_SRC_AVG // Common 20 R_SRC_AVG
|
SPRINTRAW(12, "%d", pDefectData->m_nLevelRefAvg);
|
// 39 12 Scan AI 분류결과 // Common 21 고객사 입력==>>>> 0405변경WSI R Height//210405
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[4]);
|
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 40 12 Review AI 분류결과 // Common 22 고객사 입력==>>>> 0405변경WSI G Height//210405
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[5]);
|
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 41 12 검출모드 (Dark or Bright) // Common 23 고객사 입력==>>>> 0405변경WSI B Height//210405
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
SPRINTRAW(12, "%.03lf", pDefectData->m_ReviewDefect.m_fWsi_ResultData[6]);
|
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
// 42 12 검출채널 RGB // Common 24 고객사 입력
|
CString strData; // 검출 채널 추가 ex) 0, 1, 2 [ 21-03-23 KJG ]
|
int nLayers = pDefectData->m_nHliLayers;
|
strItem = _T("");
|
for (int i = 0; i < 8; i++)
|
{
|
if (nLayers & 1)
|
{
|
if (strItem.IsEmpty()) strData.Format("%d", i);
|
else strData.Format(",%d", i);
|
strItem += strData;
|
}
|
nLayers = nLayers >> 1;
|
}
|
SPRINTRAW(12, "%s", strItem);
|
|
// 43 12 Compactness //201215 CJH - 43~46 신규 Defect Feature 결과파일 추가
|
SPRINTRAW(12, "%d", pDefectData->m_nCompact);
|
// 44 12 Thickness
|
SPRINTRAW(12, "%d", pDefectData->m_nThickness);
|
// 45 12 Major
|
SPRINTRAW(12, "%d", pDefectData->m_nMajor);
|
// 46 12 Minor
|
SPRINTRAW(12, "%d", pDefectData->m_nMinor);
|
// 47 12 WSI Defect Type 0 normal 1 metal 2Huge 3diffuse 4 trashy
|
if (pDefectData->m_ReviewDefect.m_nWsi_Type == 2)
|
{
|
if (strlen(GetWsiDefectType(pDefectData->m_ReviewDefect.m_fWsi_ResultData[0])))
|
{
|
SPRINTRAW(12, "%s", GetWsiDefectType(pDefectData->m_ReviewDefect.m_fWsi_ResultData[0]));
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
}
|
else
|
{
|
SPRINTRAW(12, "*");
|
}
|
|
// 48 12 Defect Type 추가 [ 21-03-23 KJG ]
|
if (pDefectData->m_DefectType == DefectType_RBlack)
|
{
|
SPRINTRAW(12, "RB");
|
}
|
else if (pDefectData->m_DefectType == DefectType_RWhite)
|
{
|
SPRINTRAW(12, "RW");
|
}
|
else if (pDefectData->m_DefectType == DefectType_TBlack)
|
{
|
SPRINTRAW(12, "TB");
|
}
|
else if (pDefectData->m_DefectType == DefectType_TWhite)
|
{
|
SPRINTRAW(12, "TW");
|
}
|
else
|
{
|
SPRINTRAW(12, "UN");
|
}
|
|
// 49 12 Frame Shrink 정보 추가
|
SPRINTRAW(12, "%d", pDefectData->m_bShrinked);
|
|
// 50 12 CLASS_NO // Zone Classification NO
|
// Zone Data
|
nValue = 0;
|
for (int i = 15; i >= 0; i--)
|
{
|
if (pDefectData->m_sZoneClassPixelCount[i] > 0)
|
nValue += 1;
|
if (i > 0)
|
nValue = nValue << 1;
|
}
|
SPRINTRAW(12, "%04X", nValue);
|
|
SPRINTRAWEND; //중요!!! 젤 마지막에 꼭 있어야함!!!(삭제금지) [김태현2020/9/23]
|
|
return TRUE;
|
}
|
|
BOOL CGlassRawCPJT::ReadMuraFile( CgrmGlassRawData* pData )//0404nwh
|
{
|
CString strMacroFilePath;
|
{
|
strMacroFilePath.Format("%s\\%s", NETWORK_MURARAW_PATH, pData->GetGlassData()->m_strGlassID);
|
|
CFileFind FF;
|
|
if (FF.FindFile(strMacroFilePath))
|
{
|
FF.FindNextFile();
|
strMacroFilePath = FF.GetFilePath();
|
FF.Close();
|
}
|
else
|
{
|
AKLOG("Find Macro File Fail. [%s]", strMacroFilePath);
|
return FALSE;
|
}
|
}
|
////Mura Image Server 특정 폴더에 저장
|
CString strMacroImageSrcPath;
|
CString strMacroImageTarPath;
|
|
strMacroImageSrcPath.Format("%s\\%s", NETWORK_MURA_IMAGE_PATH, pData->GetGlassData()->m_strGlassID);
|
strMacroImageTarPath.Format("%s\\%s\\MuraImage", NETWORK_AOI_IMAGE_PATH, pData->GetGlassData()->m_strGlassID); //생각좀해보자
|
|
//CreateDirectory("D:\\Image\\Defect\\Mura",NULL); 안해도될거같음
|
if (strMacroImageSrcPath.IsEmpty() == FALSE)
|
{
|
AKLOG("Macro Image File Copy Start[%s]", strMacroImageTarPath);
|
CakFileUtil::CopyFolder(strMacroImageSrcPath.GetBuffer(0), strMacroImageTarPath.GetBuffer(0), FALSE);
|
|
if (m_bReviewEndCheck == TRUE)
|
{
|
CakFileUtil::DeleteFolder(strMacroImageSrcPath.GetBuffer(0), FALSE);
|
}
|
AKLOG("Macro Image File Copy End");
|
}
|
|
///Mura 결과파일 읽고 쓰기 삭제
|
if (m_MuraResultFile.openFile_Mura(strMacroFilePath.GetBuffer(0)) == TRUE)
|
{
|
AKLOG("Macro File Read Success : %dItem", m_MuraResultFile.GetSubPanelNum());
|
if (m_bReviewEndCheck == TRUE)
|
{
|
DeleteFile(strMacroFilePath);
|
}
|
}
|
else
|
{
|
AKLOG("Macro File Read Fail[%s]", strMacroFilePath);
|
//DeleteFile(strMacroResultTargetPath);
|
return FALSE;
|
}
|
return TRUE;
|
}
|
|
|
void CGlassRawCPJT::SendMessageFTPUploadRaw( _grmGlassData* pGlassData )
|
{
|
if(pGlassData == NULL) return;
|
HWND hWnd = ::FindWindow(NULL, "FTPUploader");
|
if(hWnd == NULL) return;
|
|
char strServerFolder[256] = {};
|
char strServerFile[256] = {};
|
char strLocalFolder[256] = {};
|
char pLocalFile[256] = {};
|
char strRTMSFile[32] = {};
|
char strServerRawFileSubPath[256] = {};
|
char strServer_SubFileName[32] = {};
|
|
GetFormatDescription(FTPCMD_RAW, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData); //taek 201211
|
|
CFTPCopyDataParam upParam;
|
strcpy(upParam.m_strServer_FolderName, strServerFolder);
|
strcpy(upParam.m_strServer_FileName, strServerFile);
|
strcpy(upParam.m_strLocal_FolderName, strLocalFolder);
|
strcpy(upParam.m_strLocal_FileName, pLocalFile);
|
strcpy(upParam.m_strServer_SubFilePath, strServerRawFileSubPath);
|
strcpy(upParam.m_strServer_SubFileName, strServer_SubFileName);
|
strcpy(upParam.m_strServer_SignalFolderName, "");
|
strcpy(upParam.m_strServer_SignalFileName, "");
|
strcpy(upParam.m_strRTMS_FileName, ""); //taek 201211
|
upParam.m_nCreateSignalFile = FALSE;//m_ctrlCreateSignal.GetCheck();
|
upParam.m_nSendResultCode = FALSE;//m_ctrlResultAck.GetCheck();
|
upParam.m_nProcessType = CFTPCopyDataParam::FTPProcessType_UpFile;
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Raw;
|
|
COPYDATASTRUCT cds;
|
cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawUpload;
|
cds.cbData = sizeof(CFTPCopyDataParam);
|
cds.lpData = &upParam;
|
|
DWORD dwReturn = 0;
|
if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
|
AKLOG(" FunCtion FTP : RAW File Upload Signal Fail[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
|
else
|
AKLOG(" FunCtion FTP : RAW File Upload Signal Sucess[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */
|
}
|
|
void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData )
|
{
|
if(pGlassData == NULL) return;
|
HWND hWnd = ::FindWindow(NULL, "FTPUploader");
|
if(hWnd == NULL) return;
|
|
char strServerFolder[256] = {};
|
char strServerFile[256] = {};
|
char strLocalFolder[256] = {};
|
char pLocalFile[256] = {};
|
char strRTMSFile[32] = {};
|
char strServerRawFileSubPath[256] = {};
|
char strServer_SubFileName[256] = {};
|
|
GetFormatDescription(FTPCMD_STACK, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData);
|
|
CFTPCopyDataParam upParam;
|
strcpy(upParam.m_strServer_FolderName, strServerFolder);
|
strcpy(upParam.m_strServer_FileName, strServerFile);
|
strcpy(upParam.m_strLocal_FolderName, strLocalFolder);
|
strcpy(upParam.m_strLocal_FileName, pLocalFile);
|
strcpy(upParam.m_strServer_SignalFolderName, "");
|
strcpy(upParam.m_strServer_SignalFileName, "");
|
strcpy(upParam.m_strRTMS_FileName, "");
|
upParam.m_nCreateSignalFile = FALSE;//m_ctrlCreateSignal.GetCheck();
|
upParam.m_nSendResultCode = FALSE;//m_ctrlResultAck.GetCheck();
|
upParam.m_nProcessType = CFTPCopyDataParam::FTPProcessType_DownFile;
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Stack;
|
|
COPYDATASTRUCT cds;
|
cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
|
cds.cbData = sizeof(CFTPCopyDataParam);
|
cds.lpData = &upParam;
|
|
DWORD dwReturn = 0;
|
if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
// else
|
// {
|
// AKLOG(" Fucntion FTP : Stack File Download Signal Sucess[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
AKLOG(" Function FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK);
|
else
|
AKLOG(" Function FTP : Stack File Download Signal Success[%d]", FTPCMD_STACK);
|
/*< SWK 20220413 - #4053 MOD End >*/
|
}
|
|
void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData )
|
{
|
if(pGlassData == NULL) return;
|
HWND hWnd = ::FindWindow(NULL, "FTPUploader");
|
if(hWnd == NULL) return;
|
|
char strServerFolder[256] = {};
|
char strServerFile[256] = {};
|
char strLocalFolder[256] = {};
|
char pLocalFile[256] = {};
|
char strRTMSFile[32] = {};
|
char strServerRawFileSubPath[256] = {};
|
char strServer_SubFileName[256] = {};
|
/*< KJG 20211024 - #3487 ADD Start >*/
|
GetFormatDescription(FTPCMD_RAWMERGE, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
|
|
CFTPCopyDataParam upParam;
|
strcpy(upParam.m_strServer_FolderName, strServerFolder);
|
strcpy(upParam.m_strServer_FileName, strServerFile);
|
strcpy(upParam.m_strLocal_FolderName, strLocalFolder);
|
strcpy(upParam.m_strLocal_FileName, pLocalFile);
|
strcpy(upParam.m_strServer_SignalFolderName, "");
|
strcpy(upParam.m_strServer_SignalFileName, "");
|
upParam.m_nCreateSignalFile = FALSE;//m_ctrlCreateSignal.GetCheck();
|
upParam.m_nSendResultCode = FALSE;//m_ctrlResultAck.GetCheck();
|
upParam.m_nProcessType = CFTPCopyDataParam::FTPProcessType_DownFile;
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Raw;
|
|
COPYDATASTRUCT cds;
|
cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawDownload;
|
cds.cbData = sizeof(CFTPCopyDataParam);
|
cds.lpData = &upParam;
|
|
DWORD dwReturn = 0;
|
if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion FTP : RawMerge File Download Signal Sucess[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
// else
|
// {
|
// AKLOG(" Fucntion FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
AKLOG(" Function FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);
|
else
|
AKLOG(" Function FTP : RawMerge File Download Signal Success[%d]", FTPCMD_RAWMERGE);
|
/*< SWK 20220413 - #4053 MOD End >*/
|
/*< KJG 20211024 - #3487 ADD End >*/
|
}
|
|
void CGlassRawCPJT::SendMessageFTPUploadImage( _grmGlassData* pGlassData, emFTPCommand sort)
|
{
|
if(pGlassData == NULL) return;
|
HWND hWnd = ::FindWindow(NULL, "FTPUploader");
|
if(hWnd == NULL) return;
|
|
char strServerFolder[256] = {};
|
char strServerFile[32];// = "*.*";
|
char strLocalFolder[256] = {};
|
char strLocalFile[32];// = "*.*";
|
char strRTMSFile[256] = {}; //taek 201211
|
char strServerRawFileSubPath[256] = {};
|
char strServer_SubFileName[256] = {};
|
|
GetFormatDescription(sort, strServerFolder, strServerFile, strLocalFolder, strLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName,pGlassData); //taek 201211
|
|
CFTPCopyDataParam upParam;
|
strcpy(upParam.m_strServer_FolderName, strServerFolder);
|
strcpy(upParam.m_strServer_FileName, strServerFile);
|
strcpy(upParam.m_strLocal_FolderName, strLocalFolder);
|
strcpy(upParam.m_strLocal_FileName, strLocalFile);
|
strcpy(upParam.m_strServer_SignalFolderName, "");
|
strcpy(upParam.m_strServer_SignalFileName, "");
|
strcpy(upParam.m_strRTMS_FileName, strRTMSFile); //taek 201211
|
upParam.m_nCreateSignalFile = FALSE;
|
upParam.m_nSendResultCode = FALSE;
|
upParam.m_nProcessType = CFTPCopyDataParam::FTPProcessType_UpFile;
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Image;
|
|
COPYDATASTRUCT cds;
|
cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_ImageUpload; // FTP Uploader에서는 구분되어 있지 않음!
|
cds.cbData = sizeof(CFTPCopyDataParam);
|
cds.lpData = &upParam;
|
|
DWORD dwReturn = 0;
|
if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion FTP : Image Upload Signla Sucess[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
// else
|
// {
|
// AKLOG(" Fucntion FTP : Image Upload Signla Fail[%d]", sort);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
AKLOG(" Function FTP : Image Upload Signal Fail[%d]", sort);
|
else
|
AKLOG(" Function FTP : Image Upload Signal Success[%d]", sort);
|
/*< SWK 20220413 - #4053 MOD End >*/
|
}
|
|
|
BOOL CGlassRawCPJT::SendMessageFTPUploadIndexFile( _grmGlassData* pGlassData )
|
{
|
if(pGlassData == NULL)
|
return FALSE;
|
|
HWND hWnd = ::FindWindow(NULL, "FTPUploader");
|
if(hWnd == NULL) return FALSE;
|
|
|
char strServerFolder[256] = {};
|
char strServerFile[256] = {};
|
char strLocalFolder[256] = {};
|
char pLocalFile[256] = {};
|
char strRTMSFile[32] = {};
|
char strServerRawFileSubPath[256];
|
char strServer_SubFileName[256] = {};
|
|
GetFormatDescription(FTPCMD_INDEX, strServerFolder, strServerFile, strLocalFolder, pLocalFile, strRTMSFile, strServerRawFileSubPath, strServer_SubFileName, pGlassData);
|
|
|
// if(0)//test
|
// {
|
// sprintf(strServerFolder, "HDD1/DIT/TestC");
|
// ServerFile = "ftptestfile.txt";
|
//
|
// sprintf(strLocalFolder, "D:");
|
// pLocalFile = "ftptestfile.txt";
|
// }
|
|
|
CFTPCopyDataParam upParam;
|
strcpy(upParam.m_strServer_FolderName, strServerFolder);
|
strcpy(upParam.m_strServer_FileName, strServerFile);
|
strcpy(upParam.m_strLocal_FolderName, strLocalFolder);
|
strcpy(upParam.m_strLocal_FileName, pLocalFile);
|
strcpy(upParam.m_strServer_SignalFolderName, "");
|
strcpy(upParam.m_strServer_SignalFileName, "");
|
strcpy(upParam.m_strRTMS_FileName, "");
|
upParam.m_nCreateSignalFile = FALSE;//m_ctrlCreateSignal.GetCheck();
|
upParam.m_nSendResultCode = FALSE;//m_ctrlResultAck.GetCheck();
|
upParam.m_nProcessType = CFTPCopyDataParam::FTPProcessType_UpFile;
|
// [C-PRJ] Image Upload Define - KHT (2020/11/19)
|
upParam.m_nDataType = CFTPCopyDataParam::FTPDataType_Index;
|
|
COPYDATASTRUCT cds;
|
cds.dwData = CFTPCopyDataParam::FTPCopyDataCmd_RawUpload;
|
cds.cbData = sizeof(CFTPCopyDataParam);
|
cds.lpData = &upParam;
|
|
DWORD dwReturn = 0;
|
if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE)
|
/*< SWK 20220413 - #4053 MOD Start >*/
|
// {
|
// AKLOG(" Fucntion FTP : Index File Upload Signla Sucess[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
// else
|
// {
|
// AKLOG(" Fucntion FTP : Index File Upload Signla Fail[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */
|
// }
|
AKLOG(" Function FTP : Index File Upload Signal Fail[%d]", FTPCMD_INDEX);
|
else
|
AKLOG(" Function FTP : Index File Upload Signal Success[%d]", FTPCMD_INDEX);
|
/*< SWK 20220413 - #4053 MOD End >*/
|
|
return TRUE;
|
}
|
|
void CGlassRawCPJT::GetFormatDescription(emFTPCommand sort, char* pServerPath, char* pServerFile, char* pLocalPath, char* pLocalFile, char* pRTMSFile, char* pServerFileSubPath, char* pServerFileSubName, _grmGlassData* pGlassData) //taek 201211
|
{
|
CString strGlassID = pGlassData->m_strGlassID;
|
//For test
|
//if (strlen(strGlassID) == 0) strGlassID = "HPANELID";
|
|
CString strGlassIDLevel6th = strGlassID.Left(6);
|
CString strGlassIDLevel5th = strGlassID.Left(5);
|
CString strGlassIDLevel8th = strGlassID.Left(8);
|
|
CString strLotID = pGlassData->m_strLotID;
|
CString strStepID = pGlassData->m_strStepID;
|
CString strProcessID = pGlassData->m_strProcessID;
|
//For test
|
//if (strlen(strStepID) == 0) strStepID = "F11112";
|
|
strLotID.MakeLower();
|
strStepID.MakeLower();
|
strGlassID.MakeLower();
|
strGlassIDLevel6th.MakeLower();
|
strProcessID.MakeLower();
|
|
switch(sort)
|
{
|
case FTPCMD_AOI_IMAGE:
|
{
|
if(strGlassID.GetLength() > 6)
|
sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
|
else
|
sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
|
|
sprintf(pLocalPath, "%s%s", NETWORK_AOI_IMAGE_PATH, strGlassID.GetBuffer(0));
|
strcpy(pServerFile, "*.*");
|
strcpy(pLocalFile, "*.*");
|
}
|
break;
|
case FTPCMD_REVIEW_IMAGE:
|
{
|
CTime time = m_tmFileCreateTime;
|
|
CString strTime = NULL;
|
CString strInsEndTime = NULL;
|
|
strTime = pGlassData->m_tmGlassLoading.Format("%Y%m%d%H%M%S");
|
strInsEndTime = pGlassData->m_tmInspectionEND.Format("%Y%m%d%H%M%S");
|
|
if (strGlassID.GetLength() > 6)
|
sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
|
else
|
sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
|
|
sprintf(pLocalPath, "%s%s_%s", LOCAL_REV_IMAGE_PATH, strGlassID.GetBuffer(0), strTime);
|
strcpy(pServerFile, "*.*");
|
strcpy(pLocalFile, "*.*");
|
//Result ini 리뷰 이미지 path 채우기
|
CString strRawFilePathName = NULL;
|
CString strLine = NULL;
|
CString strPath = NULL;
|
strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
|
strRawFilePathName += RAWINFO_FILE_NAME;
|
FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "a");
|
if(pf != NULL)
|
{
|
strLine = pServerPath;
|
strPath = strLine.Left(strLine.GetLength() - 1);
|
fprintf(pf, "IMGPATH= Z:\%s\n", strPath.GetBuffer(0));
|
fprintf(pf, "DISK=FILESERVER\n");
|
fclose(pf);
|
}
|
|
//RTMS 결과 파일 업로드
|
CString strRTMSPathFileName = NULL;
|
CString strRTMSFileName = NULL;
|
|
strRTMSFileName.Format("%s#%s#%04d%02d%02d%02d%02d%02d.Signal", pGlassData->m_strEquipID, pGlassData->m_strProductID, time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
|
|
strRTMSPathFileName += LOCAL_RTMS_INFO_PATH;
|
strRTMSPathFileName += strRTMSFileName;
|
|
// strRTMSFileName = strRawFilePath.Left(strRawFilePath.GetLength()-1); //taek 마지막 값 빼고 가져오기 test
|
|
FILE* pfile = fopen(strRTMSPathFileName.GetBuffer(0), "a");
|
|
sprintf(pRTMSFile, "%s", strRTMSPathFileName); //taek 201211
|
|
if (pfile != NULL)
|
{
|
fprintf(pfile, "MODULE_ID = %s\n", pGlassData->m_strEquipID);
|
fprintf(pfile, "PRODUCT_ID = %s\n", pGlassData->m_strProductID);
|
fprintf(pfile, "PROCESS_ID = %s\n", pGlassData->m_strProcessID);
|
fprintf(pfile, "STEP_ID = %s\n", pGlassData->m_strStepID);
|
fprintf(pfile, "PANEL_ID = %s\n", pGlassData->m_strGlassID);
|
fprintf(pfile, "RESULT = *\n");
|
fprintf(pfile, "REASON_CODE = *\n");
|
fprintf(pfile, "RDP_PATH_RAW = \\cfq1raw1cai1coi%s\n", GetRawFilePath());
|
fprintf(pfile, "RDP_PATH_IMAGE = \\cfq1img1cai1coi%s\n", strLine.Left(strLine.GetLength() - 1));
|
fprintf(pfile, "INSP_TIME = %s\n", strInsEndTime);
|
fclose(pfile);
|
}
|
}
|
break;
|
case FTPCMD_RAW:
|
{
|
CTime time = m_tmFileCreateTime;
|
SetRawFilePath("");
|
|
CString strFileName;//파일생성 시간 때문에 여기서 정확하게 파일명 다시 정정
|
{
|
//Glass 정보
|
CTime CurrTime = m_tmFileCreateTime;
|
CString strTime;
|
strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
|
CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
|
// 시간, 확장자 없앰 [11/20/2020 Server]
|
strFileName.Format("%s", pGlassData->m_strGlassID);
|
strFileName.MakeLower();
|
}
|
/*sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Data", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
|
strGlassIDLevel5th.GetBuffer(0),
|
strGlassIDLevel8th.GetBuffer(0),
|
strGlassID.GetBuffer(0)); */
|
|
//if (strGlassID.GetLength() > 6)
|
// sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strLotID, strStepID, strGlassIDLevel6th, strGlassID);
|
//else
|
sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
|
|
sprintf(pLocalPath, "%s", pGlassData->m_strPath);
|
|
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;
|
|
|
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());
|
// 시간, 확장자 없앰 [11/20/2020 Server]
|
strServerSubRawFileName.Format("\\%s_%s", pGlassData->m_strGlassID, strTime);
|
//strServerSubRawFilePath += strServerSubRawFileName;
|
BOOL bIsBDI = strcmp((pGlassData->m_strLine), _T("BDI")) == 0 ? TRUE : FALSE; // BDI 인 경우 InspectorEnd 시에 SubFile 생성 [ 21-03-23 KJG ]
|
if (m_bReviewEndCheck || bIsBDI) // InspectEnd 시에는 SubFile 미생성 변경 [ 21-03-18 KJG ]
|
{
|
sprintf(pServerFileSubName, "%s", strServerSubRawFileName.GetBuffer(0));
|
sprintf(pServerFileSubPath, "%s", strServerSubRawFilePath.GetBuffer(0));
|
}
|
else
|
{
|
sprintf(pServerFileSubName, "%s", "");
|
sprintf(pServerFileSubPath, "%s", "");
|
}
|
|
}
|
|
//Result ini raw 파일이름(path포함)write
|
CString strRawFilePathName = NULL;
|
CString strLine = NULL;
|
strRawFilePathName += LOCAL_RAWPATH_INFO_INI_PATH;
|
strRawFilePathName += RAWINFO_FILE_NAME;
|
FILE* pf = fopen(strRawFilePathName.GetBuffer(0), "w");
|
if(pf != NULL)
|
{
|
strLine = pServerPath + strFileName;
|
fprintf(pf, "[RESULT_PATH]\n");
|
fprintf(pf, "RAWPATH= X:\%s\n", strLine.GetBuffer(0));
|
SetRawFilePath(strLine.GetBuffer(0));
|
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:
|
{
|
//201218 CJH - Stack Download 경로 설정
|
sprintf(pServerPath, "\\stack\\%s\\%s\\%s", strProcessID,
|
strStepID,
|
strGlassIDLevel6th.GetBuffer(0));
|
|
sprintf(pServerFile, "%s",
|
strGlassID);
|
|
sprintf(pLocalPath, "%s", m_StackResult.getStackLocalPath());
|
sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
|
}
|
break;
|
/*< KJG 20211024 - #3487 ADD Start >*/
|
case FTPCMD_RAWMERGE:
|
{
|
/* <LJC 20211122 : #3820 ADD Start> */
|
char cMergeList[10][12];
|
CString strMergeList[10] = {};
|
for (int i = 0; i < 10; i++)
|
{
|
strcpy(cMergeList[i], pGlassData->m_StrMergeList[i]);
|
strMergeList[i] = cMergeList[i];
|
}
|
sprintf(pServerPath, "\\%s\\%s\\%s", strProcessID, strMergeList[m_nRawMergeIdx],strGlassIDLevel6th.GetBuffer(0)); // 서버 경로 확인후 수정 kjg
|
sprintf(pServerFile, "%s",strGlassID);
|
/* <LJC 20211122 : #3820 ADD End> */
|
sprintf(pLocalPath, "%s", m_RawMergeResult.getRawMergeLocalPath());
|
sprintf(pLocalFile, "%s", strGlassID.GetBuffer(0));
|
}
|
break;
|
/*< KJG 20211024 - #3487 ADD End >*/
|
case FTPCMD_MURA_IMAGE: //0404nwh
|
{ //
|
/*CTime time = m_tmFileCreateTime;
|
sprintf(pServerPath, "%s\\%04d%02d%02d\\%s\\%s\\%s\\Image", pGlassData->m_strEquipID, time.GetYear(), time.GetMonth(), time.GetDay(),
|
strGlassIDLevel5th.GetBuffer(0),
|
strGlassIDLevel8th.GetBuffer(0),
|
strGlassID.GetBuffer(0));
|
|
sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
|
strcpy(pServerFile, "*.*");
|
strcpy(pLocalFile, "*.*");*/
|
|
if (strGlassID.GetLength() > 6)
|
sprintf(pServerPath, "\\%s\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th, strGlassID);
|
else
|
sprintf(pServerPath, "\\%s\\%s\\%s\\", strProcessID, strStepID, strGlassIDLevel6th);
|
|
sprintf(pLocalPath, "%s%s", LOCAL_MURA_IMAGE_PATH, strGlassID.GetBuffer(0));
|
strcpy(pServerFile, "*.*");
|
strcpy(pLocalFile, "*.*");
|
}
|
|
break;
|
case FTPCMD_INDEX:
|
{
|
CTime time = m_tmFileCreateTime;
|
sprintf(pServerPath, "INDEX\\%s", pGlassData->m_strEquipID);
|
sprintf(pServerFile, "%04d%02d%02d_%s.csv", time.GetYear(), time.GetMonth(), time.GetDay(), pGlassData->m_strStepID);
|
|
sprintf(pLocalPath, "%s", LOCAL_INDEX_PATH);
|
sprintf(pLocalFile, "%s", pServerFile);
|
}
|
break;
|
|
case FTPCMD_LINK:
|
{
|
CTime time = m_tmFileCreateTime;
|
CString strFileName;//파일생성 시간 때문에 여기서 정확하게 파일명 다시 정정
|
{
|
//Glass 정보
|
CTime CurrTime = m_tmFileCreateTime;
|
CString strTime;
|
strTime.Format(_T("%04d%02d%02d_%02d%02d%02d"),
|
CurrTime.GetYear(), CurrTime.GetMonth(), CurrTime.GetDay(), CurrTime.GetHour(), CurrTime.GetMinute(), CurrTime.GetSecond());
|
strFileName.Format("%s_%s_%s.csv", pGlassData->m_strOperID, pGlassData->m_strGlassID, strTime.GetBuffer(0));
|
}
|
sprintf(pServerPath, "%s\\%s\\%s\\%s\\%s", "LINK", pGlassData->m_strEquipID,
|
strGlassIDLevel5th.GetBuffer(0),
|
strGlassIDLevel8th.GetBuffer(0),
|
strGlassID.GetBuffer(0));
|
|
sprintf(pLocalPath, "%s", pGlassData->m_strPath);
|
|
sprintf(pServerFile, "%s", strFileName.GetBuffer(0));
|
sprintf(pLocalFile, "%s", strFileName.GetBuffer(0));
|
}
|
break;
|
}
|
|
|
}
|
|
|
|
CString CGlassRawCPJT::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;
|
/* <KYH 220117 : #3796 ADD Start>*/
|
case Judge_ND: sStr.Format("ND");
|
break;
|
/* <KYH 220117 : #3796 ADD End>*/
|
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;
|
/* < KMH 20220311 : #3954 ADD Start > */
|
case Judge_LN: sStr.Format("LN");
|
break;
|
/* < 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;
|
}
|
}
|
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;
|
}
|
/* <LJC 20211122 : #3820 ADD Start> */
|
void CGlassRawCPJT::DownLoadMergeFile(CgrmGlassRawData * pData)
|
{
|
SendMessageFTPDownloadDataFile(pData->GetGlassData());
|
m_nRawMergeIdx++;
|
return;
|
}
|
|
void CGlassRawCPJT::SearchFIle(CgrmGlassRawData * pData)
|
{
|
m_RawMergeResult.ProcessRawMergeFileReadStart(pData->GetGlassData()->m_strGlassID);
|
}
|
/* <LJC 20211122 : #3820 ADD End> */
|
|
|
CString CGlassRawCPJT::GetWsiDefectType(int nType)
|
{
|
CString strDefectType=_T("");
|
switch (nType)
|
{
|
case 0: strDefectType.Format("normal");
|
break;
|
case 1: strDefectType.Format("metal");
|
break;
|
case 2: strDefectType.Format("huge");
|
break;
|
case 3: strDefectType.Format("diffuse");
|
break;
|
case 4: strDefectType.Format("trashy");
|
break;
|
}
|
return strDefectType;
|
}
|