#pragma once #include "OTSProjMgrFile.h" #include "OTSSemBase.h" #include "OTSEDSBase.h" #include "OTSScanBase.h" #include "MsrSampleStatus.h" #include "MsrThreadStatus.h" #include "SEMDataGnr.h" #include "COTSHardwareMgr.h" #define WM_MEASURE_MSG_ID WM_USER + 100 #define WM_LOG_MSG_ID WM_USER + 101 namespace OTSMODEL { using namespace OTSController; // enum and struct used for send message to App typedef enum ENUM_MSG_TYPE { MTHREADSTATUS=1001, MSAMPLESTATUS=1002, MSAMPLERESULT=1003 } MSG_TYPE; typedef enum ENUM_MEASURE_SAMPLE_RESULT { BSE_DATA = 0, FIELD_DATA = 1, START_MSR_FIELD = 2 // MSR_START_TIME = 2, // MSR_END_TIME = 3 } MSAMPLE_RET; typedef struct STMeasureSampleThreadMsg { BYTE* gbseData; MSG_TYPE iMsgType; struct STMThreadStatus { int iMThreadStatus; //OTS_MSR_THREAD_STATUS char cMsrStartTime[50]; //MSR_START_TIME char cMsrEndTime[50]; //MSR_END_TIME }; struct STMSampleStatus { int iMeasureSampleStatus; //OTS_MSR_SAMPLE_STATUS char cSampleName[20]; }; struct STMSampleResultData { int iRetDataType; //ENUM_MEASURE_SAMPLE_RESULT struct RBSEDATA { CPoint pos; int iBSEDataHeight; int iBSEDataWidth; BYTE* lpBSEData; }; struct SAMPLEFIELDDATA { CPoint Fieldpos; int iMeasureFieldCount; int iCompleteFieldCount; int iSParticleCount; // Field particle count }; struct StartToMsrField { CPoint Fieldpos; }; /* struct SAMPLEPARTICLECOUNT { char cSampleName[20]; int iSParticleCount; // Sample particle count }; */ // char cMsrStartTime[50]; //MSR_START_TIME // char cMsrEndTime[50]; //MSR_END_TIME RBSEDATA BSEData; SAMPLEFIELDDATA SFieldData; StartToMsrField SMsrField; // SAMPLEPARTICLECOUNT SParticleCount; }; STMThreadStatus STMThreadStu; STMSampleStatus STMSampleStu; STMSampleResultData STMSampleRetData; }ST_MSTMsg; typedef struct PostLogMessage { int logLevel; char logMsg[100]; }PostLogMsg; typedef enum class __declspec(dllexport) SAMPLE_CHECK_RESULT_TYPE { INVALID = -1, MIN = 0, SWITCH_ON = 0, FINISHED = 1, SETTING_ERROR = 2, SETTING_WARNING = 3, MEASURABLE = 4, NO_ERROR_WARNING = 5, MAX = 5 } SAMPLE_CHECK_RESULT_TYPE; typedef enum class __declspec(dllexport) SAMPLE_FAULT_WARN_CODE { INVALID = -1, MIN = 0, SEM_DATA_ERROR = 0, AREA_OUTSIDE_HOLE = 1, RESOLUTION_LOW = 2, FINISHED = 3, NO_ERROR_WARNING = 4, FILE_NOT_SAVED = 5, MAX = 5 } SAMPLE_FAULT_WARN_CODE; typedef enum PostLogLevel { trace = 1, debug = 2, info = 3, warn = 4, error = 5, fatal = 6 }; class __declspec(dllexport) CMsrThread: public CObject { public: CMsrThread(); CMsrThread(CMsrThread*); ~CMsrThread(); // init BOOL Init(COTSProjMgrFilePtr a_pProjMgrFile, COTSSamplesList a_listMeasuableSamples); BOOL Init(COTSProjMgrFilePtr a_pProjMgrFile); // measurement void DoMeasure(); // Hole Preview void DoHolePreview(int a_nHoleID, CDomainPtr a_pMeasureArea); // SEM controller CSemBasePtr GetSEMController(); // x-ray controller COTSEDSBasePtr GetEDSController(); // BSE controller COTSScanBasePtr GetScanController(); // measure loop status void SetMsrLoopStatus(OTS_MSR_THREAD_STATUS a_nMsrLoopStatus); BOOL IsMeasureRunning(){ return m_pThreadStatus->GetStatus() == OTS_MSR_THREAD_STATUS::INPROCESS; } BOOL IsMeasureStopped() { return m_pThreadStatus->GetStatus() == OTS_MSR_THREAD_STATUS::STOPPED; } BOOL IsMeasureFailed() { return m_pThreadStatus->GetStatus() == OTS_MSR_THREAD_STATUS::FAILED; } BOOL IsMeasureCompleted() { return m_pThreadStatus->GetStatus() == OTS_MSR_THREAD_STATUS::COMPLETED; } // check measure parameters and init the measureable samplelists , meanwhile give out the measureable samples. BOOL CheckMeasureParam(COTSProjMgrFilePtr a_pProjMgrFile, COTSSamplesList& a_listMeasuableSamples, BOOL a_bCheckSetting = TRUE); // send message to App main thread void GetMeasureAppFormName(const CString& csFormName); BOOL SendMessageToMeasureApp(ST_MSTMsg Msg); BOOL SendLogMessageToMeasureApp(CString Msg, PostLogLevel PostLog); // measure file COTSProjMgrFilePtr GetProjMgrFile() { return m_pProjMgrFile; } void SetProjMgrFile(COTSProjMgrFilePtr a_pProjMgrFile); // measurable sample list COTSSamplesList GetMeasurableSamples() { return m_listMeasurableSamples; } void SetMeasurableSamples(COTSSamplesList& m_listMeasurableSamples); // SEM data general CSEMDataGnrPtr GetSEMDataGnr() { return m_pSEMDataGnr; } void SetSEMDataGnr(CSEMDataGnrPtr a_pSEMDataGnr); // working folder CString GetWorkingFolder() { return m_strWorkingFolder; } void SetWorkingFolderStr(CString a_strWoringFolder) { m_strWorkingFolder = a_strWoringFolder; } // measure loop status CMsrThreadStatusPtr GetMsrThreadStatus() { return m_pThreadStatus; } void SetMsrThreadStatus(CMsrThreadStatusPtr a_pThreadStatus); //MeasureAppFormName CString GetMsrAppFormName() { return m_strMAppFormName; } void SetMsrAppFormName(CString a_MAppFormName) { m_strMAppFormName = a_MAppFormName; } //?? HWND GetWnd() { return m_hWnd; } void SetHWND(HWND a_hWnd) { m_hWnd = a_hWnd; } // check project file is saved BOOL CheckProjFileSave(); // thread over void ThreadOver(); // record the project file //BOOL RecordProjFile(COTSSamplePtr a_pSample); //Get STDId BOOL GetClassifyParticleId(CPartSTDDataPtr a_pPartSTDData, int steelTech, CElementChemistriesList& a_listElementChemistries, int& a_nIncId); // hardware BOOL ConnectHardware(); void DisconnectHardware(); protected: // initialization void Init(); // check sample a measurement completed static BOOL IsMeasureCompletedSmpl(COTSSamplePtr a_pSample); // get sample error code static void GetSampleErrorCodes(COTSProjMgrFilePtr a_pProjMgrFile, COTSSamplePtr a_pSample, std::vector& a_listErrorCodes); // check sample has warn static void GetSampleWarningCodes(COTSProjMgrFilePtr a_pProjMgrFile, COTSSamplePtr a_pSample, std::vector& a_listErrorCodes); // error/waring string static CString GetSampleErrorWarnString(SAMPLE_FAULT_WARN_CODE a_nSampleFaultWarn); // SEM general data BOOL GetSEMDataGnrFromHW(); // SEM general data BOOL GetSEMWorkingDistanceFromHW(double& dWorkingDistance); // working folder BOOL SetWorkingFolderStr(); // create Hole sample COTSSamplePtr CreateHoleSample(CDomainPtr a_pMsrArea); // duplication void Duplicate(const CMsrThread& a_oSource); protected: // measure file COTSProjMgrFilePtr m_pProjMgrFile; // measure samples list COTSSamplesList m_listMeasurableSamples; // working folder string CString m_strWorkingFolder; // measure loop status CMsrThreadStatusPtr m_pThreadStatus; // SEM data general CSEMDataGnrPtr m_pSEMDataGnr; //MeasureAppFormName CString m_strMAppFormName; HWND m_hWnd ; COTSHardwareMgrPtr m_pHardwareMgr; private: PostLogMessage postlog; }; typedef std::shared_ptr __declspec(dllexport) CMsrThreadPtr; }