SDC C-Project CF Review 프로그램
LYW
2021-07-01 668b40db8e394058c7e0abad2fbe539a631043c2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
#pragma once
 
#include <vector>
#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<CPoint>                        VectorPoint;
typedef std::vector<CPoint>::iterator            VectorPointIt;
typedef std::vector<CPoint>::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 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();
 
};
 
typedef std::vector<CPoint>                    VectorPoint;
typedef std::vector<CPoint>::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 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);
 
    //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();
 
 
    // 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_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;
};