From f77e8008cac062596058fca2aeddda62b80bedbf Mon Sep 17 00:00:00 2001 From: kojingeun <diteam.co.kr> Date: 금, 14 7월 2023 17:03:10 +0900 Subject: [PATCH] Merge branch 'feature/#4517_CF_AOI_Review_결과_파일_찾기_실패_개선' into develop --- ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp | 70 +++++++++++++ ReviewSystem/ReviewSystem/ReviewSystem.vcxproj | 2 ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp | 165 +++++++++++++++++++++++++-------- ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h | 26 +++++ ReviewSystem/ReviewSystem/ReviewProcessor.h | 2 5 files changed, 222 insertions(+), 43 deletions(-) diff --git a/ReviewSystem/ReviewSystem/ReviewProcessor.h b/ReviewSystem/ReviewSystem/ReviewProcessor.h index b5a7c74..e2b4678 100644 --- a/ReviewSystem/ReviewSystem/ReviewProcessor.h +++ b/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; diff --git a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp index 086a65f..7d8fa2b 100644 --- a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp +++ b/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; +} \ No newline at end of file diff --git a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h b/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h index 6f456d3..237549c 100644 --- a/ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h +++ b/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]; -}; \ No newline at end of file +}; + diff --git a/ReviewSystem/ReviewSystem/ReviewSystem.vcxproj b/ReviewSystem/ReviewSystem/ReviewSystem.vcxproj index ba95229..738de9a 100644 --- a/ReviewSystem/ReviewSystem/ReviewSystem.vcxproj +++ b/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> diff --git a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp b/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp index 4885de2..196109e 100644 --- a/ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp +++ b/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); } } -- Gitblit v1.9.3