// stdafx.h : 자주 사용하지만 자주 변경되지는 않는 // 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이 // 들어 있는 포함 파일입니다. #pragma once #ifndef _SECURE_ATL #define _SECURE_ATL 1 #endif #ifndef VC_EXTRALEAN #define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다. #endif #include "targetver.h" #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다. // MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다. #define _AFX_ALL_WARNINGS #include // MFC 핵심 및 표준 구성 요소입니다. #include // MFC 확장입니다. #include // MFC 자동화 클래스입니다. #ifndef _AFX_NO_OLE_SUPPORT #include // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다. #endif #ifndef _AFX_NO_AFXCMN_SUPPORT #include // Windows 공용 컨트롤에 대한 MFC 지원입니다. #endif // _AFX_NO_AFXCMN_SUPPORT #include // MFC의 리본 및 컨트롤 막대 지원 #include "resource.h" #include "DisplayMessage.h" #include "CHReviewResult/GlassResult.h" #include "CHReviewSetting/MotorParameter.h" #include #pragma comment ( lib, "DbgHelp" ) #include //#pragma comment(lib,"Mpr.lib") #ifdef _UNICODE #if defined _M_IX86 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_IA64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"") #elif defined _M_X64 #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") #else #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") #endif #endif // [2017:6:5]-[WEZASW] : // malloc 과 free Memory Leak #define _CRTDBG_MAP_ALLOC #include #include // // // new Memory Leak // #include // #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #define REVIEW_SIMULATION_TEST_ENABLE 1 #define ID_TIMER_ALIVE (WM_USER + 100) #define ID_TIMER_DISABLE_MAG_BUTTON (WM_USER + 101) #define ID_TIMER_AFM_ALIVE (WM_USER + 102) #define ID_TIMER_WSI_READY_ACK_TIME (WM_USER + 103) #define ID_TIMER_WSI_START_ACK_TIME (WM_USER + 104) #define ID_TIMER_WSI_LONGRUN_TEST_TIME (WM_USER + 105) #define ID_TIMER_DISABLE_AF_TRACKING_BUTTON (WM_USER + 106) #define ID_TIMER_SEND_SIGNAL_ALIVE (WM_USER + 107) #define _REVIEW_SERVER_BASE_PATH_ _T("D:\\DIT_Review") //210805 #define _REVIEW_SERVER_LOG_PATH_ _T("D:\\DIT_Review\\ReviewServerLog") #define _REVIEW_RECIPE_PATH_ _T("D:\\DIT_Review\\Recipe") #define _REVIEW_REF_RECIPE_PATH_ _T("D:\\DIT_Review\\Recipe\\Reference") #define _REVIEW_SERVER_CONFIG_PATH_ _T("D:\\DIT_Review\\ReviewServerConfig") #define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_ _T("D:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg") #define _SYSTEM_SETTING_TITLE_ _T("ReviewSystemSetting") #define _RECIPE_EDITOR_TITLE_ _T("ReviewRecipeEditor") #define _REVIEW_LOGIN_LOG_PATH_ _T("D:\\DIT_Review\\ReviewServerLog\\LoginLog") #define _REVIEW_REFLOW_RECIPE_PATH_ _T("D:\\DIT_Review\\Recipe\\Reflow") #define ALIGN_TEMPLATE_PATH _T("D:\\DIT_Review\\Recipe\\AlignImage") #define _REVIEW_RECIPE_BACKUP_PATH_CPJT _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe") #define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig") //#define _REVIEW_SERVER_BASE_PATH_ _T("C:\\DIT_Review") //#define _REVIEW_SERVER_LOG_PATH_ _T("C:\\DIT_Review\\ReviewServerLog") //#define _REVIEW_RECIPE_PATH_ _T("C:\\DIT_Review\\Recipe") //#define _REVIEW_REF_RECIPE_PATH_ _T("C:\\DIT_Review\\Recipe\\Reference") //#define _REVIEW_SERVER_CONFIG_PATH_ _T("C:\\DIT_Review\\ReviewServerConfig") //#define _REVIEW_SERVER_SYSTEM_SETTING_FILE_PATH_ _T("C:\\DIT_Review\\ReviewServerConfig\\SystemSetting.cfg") //#define _SYSTEM_SETTING_TITLE_ _T("ReviewSystemSetting") //#define _RECIPE_EDITOR_TITLE_ _T("ReviewRecipeEditor") //#define _REVIEW_LOGIN_LOG_PATH_ _T("C:\\DIT_Review\\ReviewServerLog\\LoginLog") //#define _REVIEW_REFLOW_RECIPE_PATH_ _T("C:\\DIT_Review\\Recipe\\Reflow") //#define ALIGN_TEMPLATE_PATH _T("C:\\DIT_Review\\Recipe\\AlignImage") //#define _REVIEW_RECIPE_BACKUP_PATH_CPJT _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\Recipe") //#define _REVIEW_SERVER_SYSTEM_SETTING_BACKUP_PATH_CPJT _T("\\\\126.100.100.5\\d\\DIT Back up\\DIT Review\\ReviewServerConfig") #define TOTAL_WINDOW_SIZE_X 1920 #define TOTAL_WINDOW_SIZE_Y 1040 #define TOTAL_TWO_MONITOR_WINDOW_SIZE_X 1920 #define TOTAL_TWO_MONITOR_WINDOW_SIZE_Y 1080 #define CAMERA_WINDOW_SIZE_X 920 //960 #define CAMERA_WINDOW_SIZE_Y 750 #define ALIGN_WINDOW_SIZE_X 960 #define ALIGN_WINDOW_SIZE_Y TOTAL_WINDOW_SIZE_Y - CAMERA_WINDOW_SIZE_Y #define OPTION_WINDOW_SIZE_X 150 #define OPTION_WINDOW_SIZE_Y CMD_WINDOW_SIZE_Y + MAP_WINDOW_SIZE_Y #define CMD_WINDOW_SIZE_X 1000 #define CMD_WINDOW_SIZE_Y 36 #define MAP_WINDOW_SIZE_X 840 //800 #define MAP_WINDOW_SIZE_Y 520 #define INFO_WINDOW_SIZE_X 386 #define INFO_WINDOW_SIZE_Y 480 #define TAB_WINDOW_SIZE_X 835 //795 #define TAB_WINDOW_SIZE_Y 480 #define GRAPH_WINDOW_SIZE_X 320 #define GRAPH_WINDOW_SIZE_Y 250 #define MAX_GLASS_RESULT_SIZE 30 //taek 210201 max 20개의 History를 가진다 // #define TOTAL_GLASS_SLOT_COUNT 28 #define MAX_REVIEW_POINT_SIZE 500 #define LEFT_GANTRY 0 #define RIGHT_GANTRY 1 #define _MAGNIFICATION_X10_ 0 #define _MAGNIFICATION_X20_ 1 #define UM_SIGNAL_SIGNAL_UPDATE (WM_USER + 5000) // n #define UM_PROCESS_STATUS_UPDATE (WM_USER + 5001) #define UM_MOTOR_POSITION_UPDATE (WM_USER + 5002) #define UM_MOTOR_STATUS_UPDATE (WM_USER + 5003) #define UM_DIO_SIGNAL_UPDATE (WM_USER + 5004) #define UM_CONNECTION_STATUS_UPDATE (WM_USER + 5005) #define UM_LONG_RUN_COMMAND (WM_USER + 5006) #define UM_LONG_RUN_COUNT_UPDATE (WM_USER + 5007) // n #define UM_UPDATE_DEFECT_MAP (WM_USER + 5008) #define UM_SET_ALIGN_RESULT (WM_USER + 5009) // n #define UM_TRANSFER_DATA_UPDATE (WM_USER + 5010) // n #define UM_PROCESS_REMAIN_REVIEW (WM_USER + 5011) #define UM_PROCESS_REVIEW_START_MOTOR (WM_USER + 5012) // n #define UM_CAMERA_STATUS_UPDATE (WM_USER + 5014) #define UM_DEFECT_FILTER_UPDATE (WM_USER + 5015) #define UM_REVIEW_RESULT_UPDATE (WM_USER + 5016) #define UM_SIGNAL_IO_SIGNAL_UPDATE (WM_USER + 5017) #define UM_PROCESS_REMAIN_WSI (WM_USER + 5018) #define UM_MODULE_CHANGE_MESSAGE (WM_USER + 5019) #define UM_LIGHT_LEVEL_UPDATE (WM_USER + 5020) #define UM_MAGNIFICATION_UPDATE (WM_USER + 5021) #define UM_AFM_LEVEL_UPDATE (WM_USER + 5022) #define UM_SELECTED_MODULE_INDEX_UPDATE (WM_USER + 5023) #define UM_THETA_MOTOR_INFO_UPDATE (WM_USER + 5024) #define UM_UPDATE_DEFECT_MAP_DEFAULT (WM_USER + 5025) #define UM_TEST_MESSAGE_MOVE_JOG (WM_USER + 5026) #define UM_REVIEW_DEFECT_RESULT_UPDATE (WM_USER + 5027) #define UM_WSI_RESULT_UPDATE (WM_USER + 5028) //1218 // 포스트 메세지로 처리 #define UM_DEFOCUS_LIST_UPDATE (WM_USER + 5029) //20190819chm #define UM_UPDATE_DEFECT_MAP2 (WM_USER + 5030) #define UM_HISTORY_MOUSEWHELL (WM_USER + 5031) #define WM_OFFSETTOOL_MESSAGE2 (WM_USER + 9998) #define WM_OFFSETTOOL_MESSAGE (WM_USER + 9999) #include using namespace Gdiplus; static ULONG_PTR gpGdiplusToken = NULL; static UINT gpGdiplusTokenCount = 0; //enum PCControlStatus { PCControl_BypassMode=0, PCControl_AutoMode, PCControl_ManualMode, PCControl_ReviewMode, PCControl_GlassLoading, PCControl_AlignStart, PCControl_AlignEnd, PCControl_ReviewStart, PCControl_ReviewEnd, PCControl_GlassUnloading, PCControl_LightON, PCControl_LightOFF }; enum PCControlSignal { PCControlSignal_0=0, PCControlSignal_1, PCControlSignal_2, PCControlSignal_3, PCControlSignal_4, PCControlSignal_5, PCControlSignal_6, PCControlSignal_7 ,PCControlSignal_8, PCControlSignal_9, PCControlSignal_10, PCControlSignal_11, PCControlSignal_12, PCControlSignal_13, PCControlSignal_14, PCControlSignal_15, PCControlSignal_Count }; // enum LibraryType { Lib_Simulate=0, Lib_Sapera, Lib_FlyCapture, Lib_Pylon, Lib_JAI }; // enum LightType { Light_SP200=0, Light_PSD1010 }; // enum RevolverType { Revolver_Nikon=0, LinearTurret }; //enum ProcessMode { ProcessModeNone=0, ProcessModeBypass, ProcessModeAuto, ProcessModeManual, ProcessModeReview }; //enum ProcessStatus { ProcessNA=-1, ProcessLoading, ProcessAlignStart, ProcessAlignEnd, ProcessReviewStart, ProcessReviewEnd, ProcessUnloading, ProcessLightOn, ProcessLightOff }; #define COPYDATA_SYSTEMSETTING2REVIEWSYSTEM 1500 #define COPYDATA_RECIPEEDITOR2REVIEWSYSTEM 1600 // [2017:1:13]-[WEZASW] : 다중 모니터에서의 ReviewSystem Display enum MonitorPosition {MonitorPos_CENTER=0, MonitorPos_TOP, MonitorPos_BOTTOM, MonitorPos_LEFT, MonitorPos_RIGHT, MonitorPos_Count}; #include "SequenceProcessor.h" #include #include #include #include #include enum MsgSystem2Rev { MsgSystem2Rev_None = -1, MsgSystem2Rev_StandardCameraMotorPos, MsgRev2System_StandardCameraMotorPos, MsgSystem2Rev_FindAlignMark, MsgRev2System_FindAlignMark, MsgSystem2Rev_ChangeSysConfig, MsgRev2System_ChangeSysConfig, // [2017:5:2]-[WEZASW] : TFE Measurement 설비 UNIT Test(Signal 수동 발생)를 위한 추가 MsgSystem2Rev_SendAlignAlarmSignal, MsgRev2System_SendAlignAlarmSignal, MsgSystem2Rev_SendNoPPIDSignal, MsgRev2System_SendNoPPIDSignal }; typedef struct _COPYDATA_SYSTEM2REV { _COPYDATA_SYSTEM2REV() { Message = MsgSystem2Rev_None; nFirstAlignFindPixelX = 0; nFirstAlignFindPixelY = 0; nSecondAlignFindPixelX = 0; nSecondAlignFindPixelY = 0; dStandardCameraMotorPosX = 0.0; dStandardCameraMotorPosY = 0.0; ZeroMemory(strTemplateImagePath1, sizeof(char)*MAX_PATH); ZeroMemory(strTemplateImagePath2, sizeof(char)*MAX_PATH); } ~_COPYDATA_SYSTEM2REV() { } _COPYDATA_SYSTEM2REV(const _COPYDATA_SYSTEM2REV& rhs) { if (this != &rhs) { Message = rhs.Message; nFirstAlignFindPixelX = rhs.nFirstAlignFindPixelX; nFirstAlignFindPixelY = rhs.nFirstAlignFindPixelY; nSecondAlignFindPixelX = rhs.nSecondAlignFindPixelX; nSecondAlignFindPixelY = rhs.nSecondAlignFindPixelY; dStandardCameraMotorPosX = rhs.dStandardCameraMotorPosX; dStandardCameraMotorPosY = rhs.dStandardCameraMotorPosY; memcpy(strTemplateImagePath1, rhs.strTemplateImagePath1, sizeof(char)*MAX_PATH); memcpy(strTemplateImagePath2, rhs.strTemplateImagePath2, sizeof(char)*MAX_PATH); } } _COPYDATA_SYSTEM2REV& operator=( const _COPYDATA_SYSTEM2REV& rhs) { if (this != &rhs) { Message = rhs.Message; nFirstAlignFindPixelX = rhs.nFirstAlignFindPixelX; nFirstAlignFindPixelY = rhs.nFirstAlignFindPixelY; nSecondAlignFindPixelX = rhs.nSecondAlignFindPixelX; nSecondAlignFindPixelY = rhs.nSecondAlignFindPixelY; dStandardCameraMotorPosX = rhs.dStandardCameraMotorPosX; dStandardCameraMotorPosY = rhs.dStandardCameraMotorPosY; memcpy(strTemplateImagePath1, rhs.strTemplateImagePath1, sizeof(char)*MAX_PATH); memcpy(strTemplateImagePath2, rhs.strTemplateImagePath2, sizeof(char)*MAX_PATH); } return *this; } MsgSystem2Rev Message; int nFirstAlignFindPixelX; int nFirstAlignFindPixelY; int nSecondAlignFindPixelX; int nSecondAlignFindPixelY; double dStandardCameraMotorPosX; double dStandardCameraMotorPosY; char strTemplateImagePath1[MAX_PATH]; char strTemplateImagePath2[MAX_PATH]; }COPYDATA_SYSTEM2REV, *PCOPYDATA_SYSTEM2REV; // [2017:4:17]-[WEZASW] : CIM(Recipe) 보고 항목 추가. enum MsgRecipe2Rev { MsgRecipe2Rev_None = -1, MsgRecipe2Rev_StandardCameraGlassPos, MsgRev2Recipe_StandardCameraGlassPos, MsgRecipe2Rev_RecipeCreate, // Recipe(PPID) 추가 MsgRev2Recipe_RecipeCreate, MsgRecipe2Rev_RecipeChange, // Recipe(PPID) 변경 MsgRev2Recipe_RecipeChange, MsgRecipe2Rev_RecipeDelete, // Recipe(PPID) 삭제 MsgRev2Recipe_RecipeDelete, MsgRecipe2Rev_RecipeModify, // Recipe(PPID) Parameter 수정 MsgRev2Recipe_RecipeModify }; typedef struct _COPYDATA_RECIPE2REV { _COPYDATA_RECIPE2REV() { Message = MsgRecipe2Rev_None; dStandardCameraGlassPosX = 0.0; dStandardCameraGlassPosY = 0.0; nPPID = -1; } ~_COPYDATA_RECIPE2REV() { } MsgRecipe2Rev Message; double dStandardCameraGlassPosX; double dStandardCameraGlassPosY; int nPPID; } COPYDATA_RECIPE2REV, *PCOPYDATA_RECIPE2REV; #define COPYDATA_RESETCOMM 1421 #define DEFAULT_MESSAGE (WM_USER + COPYDATA_RESETCOMM) typedef struct _RESETCOMM { _RESETCOMM::_RESETCOMM() { iIntaval = 0; iIdentTimer = 0; iIdentMessage = 0; bSignal = FALSE; ZeroMemory(strRequestFile, sizeof(char)*MAX_PATH); ZeroMemory(strWindowTitle, sizeof(char)*MAX_PATH); } _RESETCOMM::_RESETCOMM(const _RESETCOMM& other) { if (this != &other) { iIntaval = other.iIntaval; iIdentTimer = other.iIdentTimer; iIdentMessage = other.iIdentMessage; bSignal = other.bSignal; CopyMemory(strWindowTitle,other.strWindowTitle,sizeof(char)*MAX_PATH); CopyMemory(strRequestFile,other.strRequestFile,sizeof(char)*MAX_PATH); } } _RESETCOMM& _RESETCOMM::operator=(const _RESETCOMM& other) { if (this != &other) { iIntaval = other.iIntaval; iIdentTimer = other.iIdentTimer; iIdentMessage = other.iIdentMessage; bSignal = other.bSignal; CopyMemory(strWindowTitle,other.strWindowTitle,sizeof(char)*MAX_PATH); CopyMemory(strRequestFile,other.strRequestFile,sizeof(char)*MAX_PATH); } return *this; } int iIntaval; int iIdentTimer; int iIdentMessage; BOOL bSignal; char strWindowTitle[MAX_PATH]; char strRequestFile[MAX_PATH]; }RESETCOMM, *PRESETCOMM; #define COPYDATA_AOISERVER_NAME _T("! Inspection ! D.I.T") #define COPYDATA_REVIEWSYSTEM_NAME _T("ReviewSystem") #define COPYDATA_AOISERVER_2_REVIEWSYSTEM 1700 #define MAX_MESSAGE_DATA_COUNT 10 union UMessageData { int nValue; double dValue; }; enum AOIServer2ReviewSystem { Message_AOIServer2ReviewSystem_None = 0, Message_AOIServer2ReviewSystem_AlignResult, Message_ReviewSystem2AOIServer_AlignResultAck }; struct SAOIServerMessage { SAOIServerMessage() { memset(this, 0, sizeof(SAOIServerMessage)); } int nMessage; UMessageData uMessageData[MAX_MESSAGE_DATA_COUNT]; char strMessageString[MAX_PATH]; }; BOOL KillProcess(CString ProcessName);BOOL getStateProcess(CString ProcessName); // 선언 static LONG CALLBACK TopLevelExceptionFilterCallBack(EXCEPTION_POINTERS* exceptionInfo); LONG CALLBACK TopLevelExceptionFilterCallBack(EXCEPTION_POINTERS * exceptionInfo) { MINIDUMP_EXCEPTION_INFORMATION dmpInfo = { 0 }; dmpInfo.ThreadId = ::GetCurrentThreadId(); // Threae ID dmpInfo.ExceptionPointers = exceptionInfo; // Exception Info dmpInfo.ClientPointers = FALSE; CTime time; CString strStamp; SYSTEMTIME currentTime; ::GetLocalTime(¤tTime); time = CTime::GetCurrentTime(); strStamp.Format(_T("Dump\\%02d_%02d_%02d_%02d_%02d_%02d.dmp"), time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); HANDLE hFile = CreateFile(strStamp, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 덤프 생성 BOOL bWrite = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &dmpInfo, NULL, NULL); return 0L; }