#pragma once #include #include "CHThreadPools/WorkThreadPools.h" #include "CHReviewDefectFinder/ReviewDefectFinder.h" #include "ModuleStatus.h" #include "CHWsiControls/WsiControl.h" #ifndef MAX_MOTOR_ADDRESS_SIZE #define MAX_MOTOR_ADDRESS_SIZE 200 #endif class CCHImageData; class CGlassResult; class CRsRcpDefectFindInfo; class SReviewResult; class CCameraControlReview; class CModuleStatus; class CWsiControl; class CResultServerControl; class CSequenceProcessor; class CEdgeTriangle; class CSignalControl; struct SCameraControl; struct SMotorPosition; struct SMotorStatus; struct SAxisIndex; struct SCoordInfo; struct SCameraInfo; enum ReviewProcessStatus { ReviewProcessStatus_None=0, ReviewProcessStatus_ReviewStart, ReviewProcessStatus_ReviewEnd, ReviewProcessStatus_MeasureStart, ReviewProcessStatus_MeasureEnd, ReviewProcessStatus_WSIStart, ReviewProcessStatus_WSIEnd, ReviewProcessStatus_UserStart, ReviewProcessStatus_UserEnd, ReviewProcessStatus_ReflowStart, ReviewProcessStatus_ReflowEnd, ReviewProcessStatus_WSIReflowStart, ReviewProcessStatus_WSIReflowEnd, ReviewProcessStatus_WSIUserStart, ReviewProcessStatus_WSIUserEnd, ReviewProcessStatus_WSIMultiShotStart, ReviewProcessStatus_WSIMultiShotEnd }; enum CalcFocusValueMethod { FocusValueMethod_Diff=0 }; typedef std::vector VectorPoint; typedef std::vector::iterator VectorPointIt; typedef std::vector::const_iterator constVectorPointIt; interface IReviewProcessor2Parent { virtual int IRP2P_GetWSIControlCount() = 0; virtual CWsiControl* IRP2P_GetWSIControl(int nIndex) = 0; virtual int IRP2P_GetModuleStatusCount(int nModuleType=0) const = 0; virtual CModuleStatus* IRP2P_GetModuleStatus(int nModuleIdx) = 0; virtual BOOL IRP2P_GetCenterCoordinate(double& dPosX, double& dPosY) = 0; virtual CSignalControl* IRP2P_GetSignalControl() = 0; virtual CMotorControl* IRP2P_GetMotorControl() = 0; virtual CCameraControlReview* IRP2P_GetReviewCameraControl(int nModuleIndex) = 0; virtual int IRP2P_GetReviewCameraControlCount() = 0; virtual void IRP2P_UpdateReviewResult(int nModuleIndex, const CGlassResult* pGlassResult, int nPlanIndex=0) = 0; virtual void IRP2P_UpdateCameraControl(int nModuleIdx, const SCameraControl *pCameraControl, const SCameraInfo* pCameraInfo) = 0; virtual const CRsRcpReviewInfo* IRP2P_Recipe_GetRsRcpReviewInfo() = 0; virtual const CSystemInfo* IRP2P_GetReviewSysteminfo() = 0; virtual const CSignalControlInfo* IRP2P_GetReviewSignalinfo() = 0; virtual CGlassResult* IRP2P_GetCurrentGlassResult() = 0; virtual void IRP2P_DisplayMessage(const TCHAR* lpstrFormat, ...) = 0; virtual CResultServerControl* IRP2P_GetResultServerControl() = 0; virtual CSequenceProcessor* IRP2P_GetSequenceProcessor() = 0; virtual CRecipeManager* IRP2P_GetEdgeRecipeManager() = 0; virtual void IRP2P_CompletePlanIndex(int nReviewStatus, int nPlanIndex) = 0; virtual void IRP2P_UpdateReviewProcessStatus(int nReviewStatus, int nPlanIndex=0) = 0; virtual BOOL GetSimulationOn() = 0; virtual void IRP2P_UpdateWSISelfDiagnosisResult(); virtual BOOL IRP2P_GetFirstReviewLeft() = 0; virtual BOOL IRP2P_GetFirstReviewRight() = 0; virtual void IRP2P_SetFirstReviewLeft(BOOL b_Check) = 0; virtual void IRP2P_SetFirstReviewRight(BOOL b_Check) = 0; /*< LYW 20211109 - #3662 ADD Start >*/ virtual BOOL IRP2P_GetReview00ImageContrast() = 0; virtual BOOL IRP2P_GetReview01ImageContrast() = 0; virtual void IRP2P_SetReview00ImageContrast(int n_Value) = 0; virtual void IRP2P_SetReview01ImageContrast(int n_Value) = 0; /*< LYW 20211109 - #3662 ADD End >*/ }; typedef std::vector VectorPoint; typedef std::vector::iterator VectorPointIt; struct SProcessResult { SProcessResult() { Reset(); } void Reset() { nInfoHeight = 120; dResolution = 1.0; // um/pixel dRulerGab = 100.0; // um vectorPoint.clear(); vectorString.clear(); ptDefectPos = CPoint(0,0); } int nInfoHeight; double dResolution; double dRulerGab; VectorPoint vectorPoint; VectorString vectorString; POINT ptDefectPos; }; class CReviewProcessData : public CWorkThreadData { public: CReviewProcessData(PVOID pPtr) : CWorkThreadData(pPtr) { nThreadIdx = -1; pReviewResult = NULL; } virtual ~CReviewProcessData() { nThreadIdx = -1; pReviewResult = NULL; } int nThreadIdx; SReviewResult* pReviewResult; }; // CReviewProcessor class CReviewProcessor : public CWorkThreadPools, public IUpdateReviewProcessStatus { public: CReviewProcessor(int nThreadCount=1); virtual ~CReviewProcessor(void); virtual void UpdateReviewProcessStatus(int nReviewStatus, int nPlanIndex=0); virtual void AddWsiResultData(int nModuleIndex, const SWsiResult& measureResut) = 0; virtual void AddWsiReflowResultData(int nModuleIndex, const SWsiResult& measureResut) = 0; virtual void AddWsiUserResultData(int nModuleIndex, const SWsiResult& measureResut) = 0; virtual void AddWsiVLSIResultData(int nModuleIndex, const SWsiResult& measureResut)=0; virtual void AddWsiMultiShotResultData(int nModuleIndex, const SWsiResult& measureResut)=0; virtual void AddCameraImageData(int nModuleIndex, int nResultIndex, VectorImageData& vectorImageData) = 0; virtual int AddReviewProcessData(SReviewResult* pReviewResult) = 0; virtual int PostProcessReviewResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; virtual int PostProcessUserResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; virtual int PostProcessWsiResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; // 누락? wsi 종료 프로세스 추가 [6/16/2017 bhs] virtual int PostProcessMeasureResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; virtual int PostProcessWsiReflowResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; virtual int PostProcessWsiUserResult(int nThreadIdx, SReviewResult* pReviewResult) = 0; 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; protected: virtual void WorkThreadProcess(PVOID pParameter) = 0; // CWorkThreadPools public: int GetReviewProcessStatus() const { return m_nReviewProcessStatus; } int LockThreadIndex(); void UnlockThreadIndex(int nIndex); // setter void SetView(CView *pView); void SetRP2P(IReviewProcessor2Parent *pRP2P); void SetLineMachineType(int nLineType, int nMachineType, CString strEqpID); void SetJobID(const CString& strJobID);//메소드명, 변수명 변경 : SetGlassID -> SetJobID void SetOperID(const CString& strOperID); void SetReviewCount(int nCount=0); void SetSaveImageBasePath(const CString& strPath); BOOL SetReviewImageInfo(int nWidth, int nHeight, int nSize, int nQuality, int nStep, double dScale); BOOL SetReviewImageInfo(int nWidth, int nHeight, int nSize, int nQuality, int nStep, double dScale, BOOL bOriginImg, int nImageRotate, int nImageFlip); void SetDefectFindInfo(const CRsRcpDefectFindInfo* pDefectFindInfo); void SetUploadImagePath(const CString& strImagePath); void SetRTMSUploadImagePath(const CString& strImagePath); void SetReviewImagePath(const CString& strReviewImagePath); //Plan진행간 Count 표기 void SetPlanReviewCount(int ncount) { nPlanReviewCount = ncount; }; int GetPlanReviewCount() { return nPlanReviewCount; }; int nPlanReviewCount; //Plan진행간 Count 표기 void SetPlanWSICount(int ncount) { nPlanWSICount = ncount; }; int GetPlanWSICount() { return nPlanWSICount; }; int nPlanWSICount; // Getter void GetSaveImageBasePath(CString& strPath); CString GetUploadImagePath(); CString GetRTMSUploadImagePath(); CString GetReviewUploadImagePath(); // Cell function void SetCellData(CGlassResult* pGlassResult); virtual void ResetGantryDone() = 0; protected: // static static void DrawRuler(CDC *pDC, int nWidth, int nHeight, double dResolution, double dRulerGab); static void DrawText(CDC *pDC, int nWidth, int nHeight, const VectorPoint& vectorPoint, const VectorString& vectorString); static void DrawDefectPosCursor(CDC* pDC, int nDefectPosX, int nDefectPosY); static void DrawDefectRect(CDC* pDC, const CRect& rtRect); static UINT64 SaveReviewImage(CCHImageData* pImageData, const CString& strFilename, UINT64 nMaxSize, int nQuality=50, int nStep=5); static void DrawCenterLine(CDC *pDC, int nWidth, int nHeight); static void DrawCenterRect(CDC *pDC, int nWidth, int nHeight, int nDrawWidth, int nDrawHeight, double dResolution); // [2017:4:10]-[WEZASW] : 고객사 요청에 의한 bmp 파일 추가 저장. (임시사용) static BOOL SaveReviewImage(CCHImageData* pImageData, const CString& strFilename); // PCControl Control command BOOL Signal_SendSignal(int nSignalIndex); // Review Camera Control Command void ReviewCamera_CameraControl(int nControlCmd); BOOL ReviewCamera_CameraControl(int nModuleIndex, int nControlCmd); int ReviewCamera_GetReviewCameraControlCount() const; CCameraControlReview* ReviewCamera_GetReviewCameraControl(int nModuleIndex); // WSI Control Command BOOL WSI_SetWSIEnd(); BOOL WSI_SetWSITimeOver(); BOOL WSI_SetWSIEnd(int nModuleIndex); BOOL WSI_SetWSITimeOver(int nModuleIndex); // getter module status int Module_GetModuleStatusCount(int nModuleType=0) const; CModuleStatus* Module_GetModuleStatus(int nModuleIdx); SCameraControl* Module_GetCameraControl(int nModuleIdx); SMotorPosition* Module_GetMotorPosition(int nModuleIdx); SMotorStatus* Module_GetMotorStatus(int nModuleIdx); SAxisIndex* Module_GetAxisIndex(int nModuleIdx); SCoordInfo* Module_GetCoordInfo(int nModuleIdx); SCameraInfo* Module_GetCurrentCameraInfo(int nModuleIdx); SCameraInfo* Module_GetCameraInfo(int nModuleIdx, int nZoomIdx=0); // Cell function int GetCellIdIdx(const CString& strCellID); protected: CView* m_pView; IReviewProcessor2Parent* m_pRP2P; // system line int m_nLineType; int m_nMachineType; CString m_strEqpID; // glass id int m_nReviewProcessStatus; int m_nReviewPlanIndex; CString m_strJobID;// m_strGlassID -> strJobID 변경 CProcessTimer m_ProcessTimer; CString m_strOperID; // image path CString m_strSaveImageBasePath; CString m_strSaveImageUploadPath; CString m_strSaveImageReviewPath; CString m_strInspectImagePath; CString m_strRTMSImagePath; int m_nReviewCount; // [2017:5:21]-[WEZASW] : Review 이미지 네이밍 룰에 의한 SequenceNo 카운트(리뷰 포인트 순서) // defect find info BOOL m_bDefectFindProcess; SReviewDefectFindParam m_ReviewDefectFindParam; CReviewDefectFinder* m_pReviewDefectFinder; bool* m_pUseThreadIndex; // review image info int m_nReviewResizeWidth; int m_nReviewResizeHeight; int m_nReviewImageSize; int m_nReviewImageQuality; int m_nReviewImageStep; double m_dReviewImageScale; int m_nImageRotate; int m_nimageFlip; BOOL m_bReviewOriginalImage; // Save Review Original Image // edge triangle CEdgeTriangle* m_pEdgeTriangle; // Cell Index Vector VectorInteger m_vecCellIndex; VectorString m_vecCellId; private: CRITICAL_SECTION m_csUseThreadIndex; };