ReviewSystem/ReviewSystem/ReviewProcessor.h | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
ReviewSystem/ReviewSystem/ReviewSystem.vcxproj | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp | ●●●●● 패치 | 보기 | raw | blame | 히스토리 |
ReviewSystem/ReviewSystem/ReviewProcessor.h
@@ -161,6 +161,8 @@ virtual int PostProcessWsiMultiShotResult(int nThreadIdx, SReviewResult* pReviewResult)=0; virtual int PostProcessWsiVLSIResult(int nThreadIdx, SReviewResult* pReviewResult)=0; virtual int CheckMotionComplete() = 0; virtual void FileMonitorThreadStart() = 0; /* < KJG 20230630 - #4517 ADD >*/ virtual void FileMonitorThreadStop() = 0; /* < KJG 20230630 - #4517 ADD >*/ virtual CString MakeWSIImageFileName( SReviewResult* pReviewResult )=0; virtual double GetCentertoOrginCoordinate(double dPosX,double dPosY,int nCornercut,int nOriginDirection)=0; ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp
@@ -12,10 +12,37 @@ #include "CHReviewRecipe/RsRcpReviewInfo.h" #include "DitGlassRawClient.h" #include "LineChecker/LineChecker.h" #include <fstream> /* < KJG 20230630 - #4517 ADD >*/ enum StackInfo { Stack_Unknown = 0, Stack_TD, Stack_SD, Stack_PD, Stack_SP, Stack_CD }; using namespace CHImageControls; CReviewProcessor_CPJT::CReviewProcessor_CPJT(int nThreadCount) : CReviewProcessor(nThreadCount) const CString AOIRAWBIN_PATH = _T("\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin"); CString GetFormatMessageString(DWORD dwError) /* < KJG 20230630 - #4517 ADD >*/ { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS , NULL , dwError , MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT) , (LPTSTR)&lpMsgBuf , 0 , NULL ); CString str; str.Format(_T("%s"), lpMsgBuf); LocalFree(lpMsgBuf); return str; } CReviewProcessor_CPJT::CReviewProcessor_CPJT(int nThreadCount) : CReviewProcessor(nThreadCount) { bProcessSuccess[CPJT_REVIEW_SUCCESS] = FALSE; bProcessSuccess[CPJT_MEASURE_SUCCESS] = FALSE; @@ -44,6 +71,13 @@ ErrorStringCode[17].Insert(17,_T("CircleCoefficientFail")); ErrorStringCode[18].Insert(18,_T("ProcessSuccess")); ErrorStringCode[19].Insert(19,_T("ProcessNone")); /* < KJG 20230630 - #4517 ADD Start >*/ CString strDummyFilePath; strDummyFilePath.Format(_T("%s\\file_dummy"), AOIRAWBIN_PATH); m_threadFileMonitor.SetParam(CDisplayMessage::GetSingletonPtr(), strDummyFilePath); m_threadFileMonitor.StartThread(); /* < KJG 20230630 - #4517 ADD End >*/ } CReviewProcessor_CPJT::~CReviewProcessor_CPJT(void) @@ -3897,3 +3931,37 @@ // return dFocus; } CTimerThreadFileMonitor::CTimerThreadFileMonitor(DWORD dwPeriod /*=10000*/, int nThreadCount /*=1*/) : CTimerThreadPools(dwPeriod, nThreadCount), m_pLog(nullptr) { } void CTimerThreadFileMonitor::TimerThreadProcess(PVOID pParameter) { if (m_strFilePath.IsEmpty()) return; std::ofstream file(m_strFilePath); if (file.is_open()) { } else { DWORD dwError = GetLastError(); if(m_pLog) m_pLog->DisplayMessage(_T("[FileMonitor Thread] Abort! Error Code[%d][%s] File Path[%s]"), dwError, GetFormatMessageString(dwError), m_strFilePath); AfxBeginThread([](LPVOID pParam)->UINT { CTimerThreadFileMonitor *pMain = static_cast<CTimerThreadFileMonitor*>(pParam); pMain->StopThread(); return 0; }, this); } return; } ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h
@@ -3,6 +3,7 @@ #include "ReviewProcessor.h" #include "CHEdgeTriangle/EdgeTriangle.h" #include "LineChecker/LineChecker.h" #include "CHThreadPools/TimerThreadPools.h" /* < KJG 20230630 - #4517 ADD Start >*/ #define ErrorCount 20 @@ -14,6 +15,23 @@ #define GLASS_SIZE_HEIGHT 2200000 enum RPCornerCutDirection { RPCLeftTop=0, RPCRightTop, RPCLeftBottom, RPCRightBottom }; enum RPOriginDirection { RPOLeftTop=0, RPORightTop, RPOLeftBottom, RPORightBottom }; class CTimerThreadFileMonitor : public CTimerThreadPools /* < KJG 20230630 - #4517 ADD Start >*/ { public: explicit CTimerThreadFileMonitor(DWORD dwPeriod = 10000, int nThreadCount = 1); ~CTimerThreadFileMonitor() = default; void SetParam(CDisplayMessage* pLog, CString strPath) { m_pLog = pLog; m_strFilePath = strPath; } private: CDisplayMessage* m_pLog; CString m_strFilePath; void TimerThreadProcess(PVOID pParameter); }; class CReviewProcessor_CPJT : public CReviewProcessor { @@ -48,6 +66,9 @@ BOOL CheckProcessSuccess(CRsRcpReviewInfo* pRsRcpReviewInfo); void ProcessSuccessReset(); void FileMonitorThreadStart() { m_threadFileMonitor.StartThread(); } /* < KJG 20230630 - #4517 ADD Start >*/ void FileMonitorThreadStop() { m_threadFileMonitor.StopThread(); } /* < KJG 20230630 - #4517 ADD Start >*/ protected: virtual void WorkThreadProcess(PVOID pParameter); @@ -111,6 +132,9 @@ CString m_strReviewFirst; CString m_strReviewSecned; CTimerThreadFileMonitor m_threadFileMonitor; /* < KJG 20230630 - #4517 ADD Start >*/ protected: CString ErrorStringCode[ErrorCount]; }; }; ReviewSystem/ReviewSystem/ReviewSystem.vcxproj
@@ -123,7 +123,7 @@ <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ResourceCompile> <Link> <AdditionalDependencies>CHVirtualGlassMapd_x64_vc15.lib;chartdir51.lib;CHCameraControlsd_x64_vc15.lib;LineCheckerd_x64_vc15.lib;CHImageControlsd_x64_vc15.lib;CHCommonClassesd_x64_vc15.lib;CHCommonControlsd_x64_vc15.lib;CHResultFileManagerd_x64_vc15.lib;CHReviewReciped_x64_vc15.lib;CHReviewSettingd_x64_vc15.lib;CHReviewResultd_x64_vc15.lib;CHEdgeTriangled_x64_vc15.lib;CHPathSchedulerd_x64_vc15.lib;CHMotorCalibratord_x64_vc15.lib;CHAutoLightControlsd_x64_vc15.lib;CHAlignFinderd_x64_vc15.lib;CHThreadPoolsd_x64_vc15.lib;CHReviewResultParserd_x64_vc15.lib;CHReviewDefectFinderd_x64_vc15.lib;CHReviewPrioritySorterd_x64_vc15.lib;CHDefectPickerd_x64_vc15.lib;IOCPNetworkd_x64_vc15.lib;CHMotorControlsd_x64_vc15.lib;CHLensChangeControlsd_x64_vc15.lib;CHLightControlsd_x64_vc15.lib;CHAfmControlsd_x64_vc15.lib;CHSignalControlsd_x64_vc15.lib;CHVcrControlsd_x64_vc15.lib;CHWsiControlsd_x64_vc15.lib;CHTotalPitchMeasured_x64_vc15.lib;M_AutoDiagnosisManagerd_x64_vc17.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>CHVirtualGlassMapd_x64_vc15.lib;chartdir51.lib;CHCameraControlsd_x64_vc15.lib;LineCheckerd_x64_vc15.lib;CHImageControlsd_x64_vc15.lib;CHCommonClassesd_x64_vc15.lib;CHCommonControlsd_x64_vc15.lib;CHResultFileManagerd_x64_vc15.lib;CHReviewReciped_x64_vc15.lib;CHReviewSettingd_x64_vc15.lib;CHReviewResultd_x64_vc15.lib;CHEdgeTriangled_x64_vc15.lib;CHPathSchedulerd_x64_vc15.lib;CHMotorCalibratord_x64_vc15.lib;CHAutoLightControlsd_x64_vc15.lib;CHAlignFinderd_x64_vc15.lib;CHThreadPoolsd_x64_vc15.lib;CHReviewResultParserd_x64_vc15.lib;CHReviewDefectFinderd_x64_vc15.lib;CHReviewPrioritySorterd_x64_vc15.lib;CHDefectPickerd_x64_vc15.lib;IOCPNetworkd_x64_vc15.lib;CHMotorControlsd_x64_vc15.lib;CHLensChangeControlsd_x64_vc15.lib;CHLightControlsd_x64_vc15.lib;CHAfmControlsd_x64_vc15.lib;CHSignalControlsd_x64_vc15.lib;CHVcrControlsd_x64_vc15.lib;CHWsiControlsd_x64_vc15.lib;CHTotalPitchMeasured_x64_vc15.lib;M_AutoDiagnosisManagerd_x64_vc17.lib;psapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>../lib;../../Internal_Library/lib;../../External_Library/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp
@@ -40,6 +40,11 @@ #include <fstream> #include <afxwin.h> #include <sstream> /* < KJG 20230605 - #4517 ADD >*/ #include <filesystem> /* < KJG 20230605 - #4517 ADD >*/ namespace fs = std::experimental::filesystem::v1; /* < KJG 20230605 - #4517 ADD >*/ #define GLASS_GD_FILE_PATH _T("GD") #define SIGNAL_SEND_RESULT_SUCCESS _T("OK") @@ -955,6 +960,10 @@ //SetUploadResultFailCount(0); bFileFind = FALSE; m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] FileMonitor Thread Stop Ready")); m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStop(); /* < KJG 20230630 - #4517 ADD Start >*/ m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::GlassLoading] FileMonitor Thread Stop Complete")); /*< LYW 20211109 - #3662 Delete Start >*/ //m_pSP2P->ISP2P_GetDiagnosisHistory(); @@ -1888,7 +1897,10 @@ //#3584 210817 LYW CF AOI Review 시뮬레이션 기능 정상화 MOD END // if (SendSignalToSignalControl(PCControlSendSignalIndex_Ack, PCControlSend_ReviewUnloadingAck_CPJT)) // m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::ReviewStart] Send Review Unloading Ack!")); m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Ready")); m_pSP2P->ISP2P_GetReviewProcessor()->FileMonitorThreadStart(); /* < KJG 20230630 - #4517 ADD Start >*/ m_pSP2P->ISP2P_DisplayMessage(_T("[SequenceProcessor::IN] FileMonitor Thread Start Complete")); } @@ -2895,6 +2907,18 @@ BOOL CSequenceProcessor_CPJT::FindRawBinFile(CString strFileName) { /* < KJG 20230605 - #4517 ADD Start >*/ auto FuncStringSplit = [](string Sentence, char Separator, vector<string>& vec) { stringstream ss(Sentence); string tmp; while (getline(ss, tmp, Separator)) { vec.push_back(tmp); } }; /* < KJG 20230605 - #4517 ADD End >*/ //210128 CString strFilePath = _T(""); //pData->GetGlassData()->m_strFileName; @@ -2916,60 +2940,121 @@ //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER START if (nReTryTime%2 == 0) { strFilePath = AOIRAWBIN_PATH; strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH; } else strFilePath = AOIRAWBIN_NETWORK_DRIVE_PATH; else strFilePath = AOIRAWBIN_PATH; strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); //LYW LOG g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find Path = %s, RetryCount = %d, ResultCode = [%d]"), strFilePath, 30-nReTryTime, GetLastError()); //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END VECFINDDATA* pFindData = akFileFinder.getFindData(); int nFileNamePos = strlen(akFileFinder.getProcessPath()); std::map<LONGLONG, CString> mapSpanFileName; for (int i = 0; i < pFindData->size(); i++) //strWild.Format("%s\\%s_*.bin", strFilePath, strFileName); /* < KJG 20230605 - #4517 DEL >*/ //akFileFinder.FindFile(strWild.GetBuffer(0), FALSE); /* < KJG 20230605 - #4517 DEL >*/ /* < KJG 20230605 - #4517 ADD Start >*/ auto timeStart = chrono::steady_clock::now(); g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Start Find Path = %s, File Name = %s, TryCount = %d"), strFilePath, strFileName, 30 - nReTryTime); std::error_code err; vector<std::string> vtFileList; fs::path pathBinFile(strFilePath.GetBuffer(0)); int constexpr SaperatorCount = 4, DateSize = 8, TimeSize = 6; // GLASSID_STEPID_'YYYYMMDD'_'HHMMSS' 포맷 확인 for (auto iter = fs::directory_iterator(pathBinFile, err); iter != fs::directory_iterator(); iter++) { char* pFileName = &((*pFindData)[i]).name[nFileNamePos]; fs::path p = iter->path(); if (p.filename().stem().string().find(strFileName) != string::npos) { CakParser parser; parser.process(pFileName, "_."); if (parser.getTokNum() < 4) continue; if (parser.getTokNum() >= 6) continue; // 0401 int nDataTime[8] = {}; std::string strSearchFile = p.filename().stem().string(); if (p.extension().string() == _T(".bin")) { 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; vtFileList.push_back(p.filename().stem().string()); } 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) for (auto iter = vtFileList.begin(); iter != vtFileList.end(); ) { if (mapSpanFileName.begin()->first < nCloseTime) vector<string> vtSplit; FuncStringSplit(*iter, _T('_'), vtSplit); if (vtSplit.size() == SaperatorCount && vtSplit[2].size() == DateSize && vtSplit[3].size() == TimeSize) { strFindFile = mapSpanFileName.begin()->second; iter++; } else { vtFileList.erase(iter); } } sort(vtFileList.begin(), vtFileList.end(), greater<>()); // 최신순으로 정렬 string strPickFileName = vtFileList.empty() ? _T("NULL") : vtFileList.front(); g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] End File Count = %d, Pick File Name = %s, Tact = %d, ErrorCode = %d, ErrorMsg = %s"), vtFileList.size(), strPickFileName.c_str(), chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - timeStart).count(),err.value(), err.message().c_str()); if (vtFileList.empty() == FALSE) { vector<string> vtSplit; FuncStringSplit(strPickFileName, _T('_'), vtSplit); CTime tmTemp(stoi(vtSplit[2].substr(0, 4)), stoi(vtSplit[2].substr(4, 2)), stoi(vtSplit[2].substr(6, 2)), stoi(vtSplit[3].substr(0, 2)), stoi(vtSplit[3].substr(2, 2)), stoi(vtSplit[3].substr(4, 2))); CTimeSpan tmSpan = tmReviewLoading - tmTemp; if (tmSpan < nCloseTime) { strFindFile = strPickFileName.c_str(); g_pLog->DisplayMessage(_T("[GlassLoading][FindRawBinFile] Find File Success")); break; } } /* < KJG 20230605 - #4517 ADD End >*/ akFileFinder.clear(); /* < KJG 20230605 - #4517 DEL Start >*/ //#3359_LYW CF AOI Review REVIEW_LOADING_COMPLETE_TIMEOVER END //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; // // if (parser.getTokNum() >= 6) continue; // 0401 // // 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) // { // strFindFile = mapSpanFileName.begin()->second; // break; // } //} // //akFileFinder.clear(); /* < KJG 20230605 - #4517 DEL End >*/ Sleep(100); } }