SDC C-Project CF Review 프로그램
5개 파일 변경됨
265 ■■■■ 파일 변경됨
ReviewSystem/ReviewSystem/ReviewProcessor.h 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.cpp 70 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewProcessor_CPJT.h 26 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/ReviewSystem.vcxproj 2 ●●● 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/SequenceProcessor_CPJT.cpp 165 ●●●● 패치 | 보기 | 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);
        }
    }