// MainFrm.cpp : CMainFrame 클래스의 구현 // #include "stdafx.h" #include "ReviewSystem.h" #include "MainFrm.h" #include "ProcessController.h" //#include "CHReviewSetting/SystemInfo.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx) const int iMaxUserToolbars = 10; const UINT uiFirstUserToolBarId = AFX_IDW_CONTROLBAR_FIRST + 40; const UINT uiLastUserToolBarId = uiFirstUserToolBarId + iMaxUserToolbars - 1; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx) ON_WM_CREATE() ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize) ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew) ON_WM_GETMINMAXINFO() ON_WM_TIMER() ON_WM_CLOSE() ON_WM_DESTROY() ON_WM_COPYDATA() ON_WM_SHOWWINDOW() END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // 상태 줄 표시기 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; // 정의 // CMainFrame 생성/소멸 CMainFrame::CMainFrame() { // TODO: 여기에 멤버 초기화 코드를 추가합니다. m_ResetComm.bSignal = 0; m_ResetComm.iIdentMessage = DEFAULT_MESSAGE; m_ResetComm.iIntaval = 2000; m_bAlive = FALSE; m_nSameTimeCount[0] = 0; m_nSameTimeCount[1] = 0; m_wsiLongRunTestFlag = 0; m_nAfmAliveCount = 5; m_nSendAFMRestart = 0; m_nSendSignalTimeCount = 0; } CMainFrame::~CMainFrame() { } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; SetUnhandledExceptionFilter(TopLevelExceptionFilterCallBack); ModifyStyle(WS_CAPTION, NULL); SetMenu(NULL); //SetTimer(ID_TIMER_RESET_COMM, 2000, NULL); SetTimer(ID_TIMER_ALIVE, 1813, NULL); //->> 기존 SetTimer(ID_TIMER_ALIVE, 1000, NULL); //SetTimer(ID_TIMER_AFM_ALIVE, 5000, NULL); //SetTimer(ID_TIMER_WSI_READY_ACK_TIME, 100, NULL); //SetTimer(ID_TIMER_WSI_START_ACK_TIME, 100, NULL); SetTimer(ID_TIMER_SEND_SIGNAL_ALIVE, 100, NULL); system("net use Y: \\\\126.100.100.1\\d\\DIT_ResultData pw:dit/user:Server/persistent:yes"); //LYW Align Reconnect //업데이트시 system("netsh interface set interface name = \"Align #1\" admin = disable&& netsh interface set interface name = \"Align #1\" admin = enable&& netsh interface set interface name = \"Align #2\" admin = disable&& netsh interface set interface name = \"Align #2\" admin = enable"); Sleep(2000); // SetTimer(ID_TIMER_WSI_LONGRUN_TEST_TIME, 10000, NULL); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; cs.style = cs.style & ~WS_THICKFRAME & ~WS_MINIMIZEBOX & ~WS_CAPTION & ~WS_SYSMENU & ~FWS_ADDTOTITLE; cs.lpszName = _T("ReviewSystem"); this->SetTitle(_T("ReviewSystem")); return TRUE; } // CMainFrame 진단 #ifdef _DEBUG void CMainFrame::AssertValid() const { CFrameWndEx::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CFrameWndEx::Dump(dc); } #endif //_DEBUG // CMainFrame 메시지 처리기 void CMainFrame::OnViewCustomize() { CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 메뉴를 검색합니다. */); pDlgCust->EnableUserDefinedToolbars(); pDlgCust->Create(); } LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp) { LRESULT lres = CFrameWndEx::OnToolbarCreateNew(wp,lp); if (lres == 0) { return 0; } CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres; ASSERT_VALID(pUserToolbar); BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); return lres; } BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle, CWnd* pParentWnd, CCreateContext* pContext) { // 기본 클래스가 실제 작업을 수행합니다. if (!CFrameWndEx::LoadFrame(nIDResource, dwDefaultStyle, pParentWnd, pContext)) { return FALSE; } // 모든 사용자 도구 모음에 사용자 지정 단추를 활성화합니다. BOOL bNameValid; CString strCustomize; bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); ASSERT(bNameValid); for (int i = 0; i < iMaxUserToolbars; i ++) { CMFCToolBar* pUserToolbar = GetUserToolBarByIndex(i); if (pUserToolbar != NULL) { pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); } } return TRUE; } void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. int nMonitorCount = GetSystemMetrics(80 /*SM_CMONITORS*/); // Get Monitor Count. if(nMonitorCount>=2) { lpMMI->ptMinTrackSize.x = TOTAL_TWO_MONITOR_WINDOW_SIZE_X; lpMMI->ptMinTrackSize.y = TOTAL_TWO_MONITOR_WINDOW_SIZE_Y; lpMMI->ptMaxTrackSize.x = TOTAL_TWO_MONITOR_WINDOW_SIZE_X; lpMMI->ptMaxTrackSize.y = TOTAL_TWO_MONITOR_WINDOW_SIZE_Y; } else { //lpMMI->ptMinTrackSize.x = TOTAL_WINDOW_SIZE_X; lpMMI->ptMinTrackSize.x = 500; lpMMI->ptMinTrackSize.y = TOTAL_WINDOW_SIZE_Y; lpMMI->ptMaxTrackSize.x = TOTAL_WINDOW_SIZE_X; lpMMI->ptMaxTrackSize.y = TOTAL_WINDOW_SIZE_Y; } CFrameWndEx::OnGetMinMaxInfo(lpMMI); } void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus) { __super::OnShowWindow(bShow, nStatus); static bool once = true; if (bShow && !IsWindowVisible() && once) { once = false; POINT min, max; int nMonitorCount = GetSystemMetrics(80 /*SM_CMONITORS*/); // Get Monitor Count. if(nMonitorCount > 2) { min.x = TOTAL_TWO_MONITOR_WINDOW_SIZE_X; min.y = 0; max.x = TOTAL_TWO_MONITOR_WINDOW_SIZE_X; max.y = 0; } else { min.x = TOTAL_WINDOW_SIZE_X; min.y = 0; max.x = TOTAL_WINDOW_SIZE_X; max.y = 0; } WINDOWPLACEMENT lwp; lwp.length = sizeof(WINDOWPLACEMENT); lwp.flags = SW_SHOWMINIMIZED | WPF_SETMINPOSITION; lwp.showCmd = SW_SHOW; lwp.ptMinPosition = min; lwp.ptMaxPosition = max; lwp.rcNormalPosition = CRect(min, max); SetWindowPlacement(&lwp); } } void CMainFrame::OnTimer(UINT_PTR nIDEvent) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. switch(nIDEvent) { case ID_TIMER_LONG_RUN_GLASS_LOADING: KillTimer(ID_TIMER_LONG_RUN_GLASS_LOADING); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_GLASS_LOADING, NULL); break; case ID_TIMER_LONG_RUN_GLASS_LOADING_END: KillTimer(ID_TIMER_LONG_RUN_GLASS_LOADING_END); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_GLASS_LOADING_END, NULL); break; case ID_TIMER_LONG_RUN_ALIGN_START: KillTimer(ID_TIMER_LONG_RUN_ALIGN_START); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_ALIGN_START, NULL); break; case ID_TIMER_LONG_RUN_ALIGN_END: KillTimer(ID_TIMER_LONG_RUN_ALIGN_END); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_ALIGN_END, NULL); break; case ID_TIMER_LONG_RUN_REVIEW_START: KillTimer(ID_TIMER_LONG_RUN_REVIEW_START); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_REVIEW_START, NULL); break; case ID_TIMER_LONG_RUN_REVIEW_END: KillTimer(ID_TIMER_LONG_RUN_REVIEW_END); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_REVIEW_END, NULL); break; case ID_TIMER_LONG_RUN_GLASS_UNLOADING: KillTimer(ID_TIMER_LONG_RUN_GLASS_UNLOADING); //this->PostMessage(UM_PCControl_MESSAGE, SIGNAL_COMMAND_GLASS_UNLOADING, NULL); break; case ID_TIMER_RESET_COMM: { m_ResetComm.bSignal = !m_ResetComm.bSignal; HWND hWnd = NULL; COPYDATASTRUCT cds; cds.dwData = COPYDATA_RESETCOMM; cds.cbData = sizeof(RESETCOMM); cds.lpData = &m_ResetComm; CString strCaption = _T("Montering Inspection System"); hWnd = ::FindWindow(NULL, strCaption); if (hWnd) ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cds); } break; case ID_TIMER_ALIVE: SendAlive(); break; case ID_TIMER_AFM_ALIVE: SendAFMAlive(); CheckAFMAlive(); break; case ID_TIMER_WSI_READY_ACK_TIME: CheckWsiReady(); break; case ID_TIMER_WSI_START_ACK_TIME: CheckWsiStart(); break; case ID_TIMER_WSI_LONGRUN_TEST_TIME: WSILongRunTest(); break; case ID_TIMER_SEND_SIGNAL_ALIVE: SendSignalCheck(); break; default: break; } CFrameWndEx::OnTimer(nIDEvent); } void CMainFrame::SendAlive() { m_bAlive = !m_bAlive; CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; pSequenceProcessor->SendSignalReviewAlive((long)m_bAlive); //#3358 KYH FDC 데이터 전송 시점 개선 ADD START pSequenceProcessor->MakeDVData2(); // 210325 kyh //#3358 KYH FDC 데이터 전송 시점 개선 ADD END } void CMainFrame::SendAFMAlive() { CMainFrame* pMain = static_cast(AfxGetMainWnd()); int nModuleCount = pMain->Module_GetModuleStatusCount(0); for (int nModuleNum = 0; nModuleNum < nModuleCount; nModuleNum++) { // CModuleStatus *pModuleStatus = pMain->Module_GetModuleStatus(nModuleNum);//nModuleIndex); 나중에 확인 // if (pModuleStatus==NULL) // { // return; // } // // SExternalIndex* pExternalIndex = pModuleStatus->GetExternalIndex(); // if(pExternalIndex == NULL) return; CAfmControl* pAFMControl = ISP2P_GetAFMControl(nModuleNum); if (pAFMControl==NULL) return; pAFMControl->NetProcess_FC_SEND_ALIVE(); } } void CMainFrame::SetAfmAliveCount(int count) { m_nAfmAliveCount = count; g_pLog->DisplayMessage(_T("Afm Alive Count Set : %d"), m_nAfmAliveCount); } void CMainFrame::CheckAFMAlive() { CMainFrame* pMain = static_cast(AfxGetMainWnd()); int nModuleCount = pMain->Module_GetModuleStatusCount(0); for (int nModuleNum = 0; nModuleNum < nModuleCount; nModuleNum++) { // CModuleStatus *pModuleStatus = pMain->Module_GetModuleStatus(nModuleNum);//nModuleIndex); 나중에 확인 // if (pModuleStatus==NULL) // { // return; // } // // SExternalIndex* pExternalIndex = pModuleStatus->GetExternalIndex(); // if(pExternalIndex == NULL) return; CAfmControl* pAFMControl = ISP2P_GetAFMControl(nModuleNum); if (pAFMControl==NULL) return; if (pAFMControl->IsSetTime()) { CTime currentTime = pAFMControl->GetLastAliveTime(); if (m_lastAfmAliveTime[nModuleNum] != currentTime) { m_lastAfmAliveTime[nModuleNum] = currentTime; m_nSameTimeCount[nModuleNum] = 0; m_nSendAFMRestart = 0; // g_pLog->DisplayMessage(_T("AFM[%d] Alive Received!! "), nModuleNum); } else { g_pLog->DisplayMessage(_T("AFM[%d] Alive lost...%d!!"), nModuleNum, m_nSameTimeCount[nModuleNum]); m_nSameTimeCount[nModuleNum]++; } if (m_nSameTimeCount[nModuleNum] > m_nAfmAliveCount) { if (!m_nSendAFMRestart) // AFM에게 restart 명령을 보내지 않은 경우 { g_pLog->DisplayMessage(_T("AFM[%d] Alive lost... RESTART AFM"), nModuleNum); SendAFMReset(); m_nSendAFMRestart = 1; m_nSameTimeCount[nModuleNum] = 0; } else // AFM에게 restart 명령을 보냈는데 일정시간 동안 응답이 없는 경우 { g_pLog->DisplayMessage(_T("AFM[%d] Alive Lost... Send to PCControl Alarm AFM Fail"), nModuleNum); CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; //pSequenceProcessor->SendSignalToSignalControl(7); // PCControlSend_AFFail pAFMControl->KillTime(); m_nSendAFMRestart = 0; } m_nSameTimeCount[nModuleNum] = 0; } } } } void CMainFrame::SendAFMReset() { // Make Script File ///////////////// CString strScript1; CString strScript2; //#define strScript1 "KILL^AFControl.exe" //#define strScript2 "START^C:\\AFControl\\program\\AFControl.exe" #define strScript "RESTART^AFControl.exe^C:\\AFControl\\program\\AFControl.exe" CFile file; if( FALSE == file.Open(_T("D:\\DIT_Review\\MakeScript.TSF"),CFile::modeCreate | CFile::modeWrite) ) //210805 { g_pLog->DisplayMessage(_T("File[D:\\DIT_Review\\MakeScript.TSF] Create Fail!!")); //210805 return; } // int nSize1 = sizeof(strScript1); // int nSize2 = sizeof(strScript2); int nSize = sizeof(strScript); // // char* pszBuf = new char[nSize+1]; // // memset((void*)pszBuf,NULL,sizeof(char)*nSize+1); // // sprintf(pszBuf,"%s",strScript); // file.Write( strScript1,nSize1); // file.Write("\r\n",2); // file.Write( strScript2,nSize2); file.Write( strScript,nSize); file.Close(); // if (pszBuf) // delete[] pszBuf; // pszBuf = NULL; ///////////////////////////////////// // Copy Script File //////////////// CString strTarget; strTarget.Format(_T("\\\\126.100.100.220\\c\\RemoteTaskMgr\\T\\CopyScript.TSF")); BOOL bRet = CopyFile(_T("D:\\DIT_Review\\MakeScript.TSF"),strTarget,FALSE); //210805 if(bRet == FALSE) g_pLog->DisplayMessage(_T("[%s]Send Script Fail!"), strTarget); ///////////////////////////////////// } // 20171026 smok. Send ready to WSI log void CMainFrame::CheckWsiReady() { CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; pSequenceProcessor->CheckWSIReady(); } void CMainFrame::CheckWsiStart() { CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; pSequenceProcessor->CheckWSIStart(); } ///////////////////////////////////////////////////// void CMainFrame::WSILongRunTest() { /*CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; if (m_wsiLongRunTestFlag == 0) { pSequenceProcessor->RecvSignalToSignalControl(4); m_wsiLongRunTestFlag = 1; } else if (m_wsiLongRunTestFlag == 1) { pSequenceProcessor->RecvSignalToSignalControl(5); m_wsiLongRunTestFlag = 2; } else if (m_wsiLongRunTestFlag == 2) { pSequenceProcessor->RecvSignalToSignalControl(6); m_wsiLongRunTestFlag = 3; } else if (m_wsiLongRunTestFlag == 3) { pSequenceProcessor->RecvSignalToSignalControl(7); m_wsiLongRunTestFlag = 4; } else if (m_wsiLongRunTestFlag == 4) { pSequenceProcessor->RecvSignalToSignalControl(8); m_wsiLongRunTestFlag = 5; } else if (m_wsiLongRunTestFlag == 5) { pSequenceProcessor->RecvSignalToSignalControl(9); m_wsiLongRunTestFlag = 0; }*/ } void CMainFrame::SendSignalCheck() { CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; CSignalControl *pSignalcontrol =ISP2P_GetSignalControl(); if(pSignalcontrol == NULL) return; WORD *pSendSignalValue = pSignalcontrol->GetSendSignalValue(); const int nBitCount = sizeof(WORD) * 8; DWORD dwBitValue = 1; //index 0은 Alive 신호라서 1부터 시작 for (int nIdx = 1; nIdx < pSignalcontrol->GetSendSignalCount(); nIdx++) { if(nIdx == 1) { if((pSendSignalValue[nIdx] == 0 && pSendSignalValue[nIdx + 1] == 0)) { m_nSendSignalTimeCount = 0; break; } } if(pSendSignalValue[nIdx] >= 1) { m_nSendSignalTimeCount++; if(m_nSendSignalTimeCount == 50)// 타이머 100ms 마다 실행 100 * 50 = 5000ms 5초 { dwBitValue = 1; for (int nSignalIdx=0; nSignalIdxDisplayMessage(_T("제어에게 신호 보냈으나 처리 안된거 같음!!!")); pSequenceProcessor->SendSignalOffToSignalControl(nIdx,nSignalIdx); m_nSendSignalTimeCount = 0; break; } dwBitValue = dwBitValue << 1; } } } } } void CMainFrame::OnDestroy() { __super::OnDestroy(); } BOOL CMainFrame::DestroyWindow() { // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다. KillTimer(ID_TIMER_RESET_COMM); return __super::DestroyWindow(); } void CMainFrame::OnClose() { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. if (IDNO == AfxMessageBox(_T("Exit Review System?"), MB_YESNO | MB_ICONQUESTION)) { return; } g_pLog->DisplayMessage(_T("Program exit by User!")); DeinitReviewInterface(); __super::OnClose(); } void CMainFrame::OnCopyDataSystemSetting(COPYDATA_SYSTEM2REV* pCopyData) { if (pCopyData==NULL) return; CMainFrame* pMain = static_cast(AfxGetMainWnd()); CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; switch (pCopyData->Message) { case MsgSystem2Rev_StandardCameraMotorPos: { COPYDATA_SYSTEM2REV copyData; const SMotorPosition* pMotorPosition = Module_GetStandardMotorPosition(); if(pMotorPosition) { copyData.Message = MsgRev2System_StandardCameraMotorPos; copyData.dStandardCameraMotorPosX = pMotorPosition->dMotorPosX; copyData.dStandardCameraMotorPosY = pMotorPosition->dMotorPosY; SendData2SystemSetting(©Data); } } break; case MsgSystem2Rev_FindAlignMark: { if (m_pAlignCameraControl) { COPYDATA_SYSTEM2REV copyData; CString strPath = _T(""); VectorString vectorFilename; strPath = pCopyData->strTemplateImagePath1; vectorFilename.push_back(strPath); strPath = pCopyData->strTemplateImagePath2; vectorFilename.push_back(strPath); CAlignResult alignResult = m_pAlignCameraControl->FindAlignMark(vectorFilename); switch(alignResult.nResultCode) { case Align_Success: g_pLog->DisplayMessage(_T("Align Mark Find Success!")); copyData.Message = MsgRev2System_FindAlignMark; copyData.nFirstAlignFindPixelX = (int)alignResult.dFindPixelX[0]; copyData.nFirstAlignFindPixelY = (int)alignResult.dFindPixelY[0]; copyData.nSecondAlignFindPixelX = (int)alignResult.dFindPixelX[1]; copyData.nSecondAlignFindPixelY = (int)alignResult.dFindPixelY[1]; g_pLog->DisplayMessage(_T("FirstFindPixelX : %d, FirstFindPixelY : %d"), copyData.nFirstAlignFindPixelX, copyData.nFirstAlignFindPixelY); g_pLog->DisplayMessage(_T("SecondFindPixelX : %d, SecondFindPixelY : %d"),copyData.nSecondAlignFindPixelX, copyData.nSecondAlignFindPixelY); SendData2SystemSetting(©Data); break; case Align_TempFail: g_pLog->DisplayMessage(_T("Align Mark Template Fail!")); g_pLog->DisplayMessage(_T("Template #1: %s"), vectorFilename[0]); g_pLog->DisplayMessage(_T("Template #2: %s"), vectorFilename[1]); break; case Align_Fail: g_pLog->DisplayMessage(_T("Align Mark Matching Fail!")); break; } } } break; case MsgSystem2Rev_ChangeSysConfig: { m_bChangeSysConfig = TRUE; g_pLog->DisplayMessage(_T("System Setting is Changed!")); } break; // [2017:5:2]-[WEZASW] : TFE Measurement 설비 UNIT Test(Signal 수동 발생)를 위한 추가 case MsgSystem2Rev_SendAlignAlarmSignal: { COPYDATA_SYSTEM2REV copyData; copyData.Message = MsgRev2System_SendAlignAlarmSignal; SendData2SystemSetting(©Data); pSequenceProcessor->CIM_SendAlignAlarmSignal(7); } break; case MsgSystem2Rev_SendNoPPIDSignal: { COPYDATA_SYSTEM2REV copyData; copyData.Message = MsgRev2System_SendNoPPIDSignal; SendData2SystemSetting(©Data); pSequenceProcessor->CIM_SendNoPPIDSignal(7); } break; } } void CMainFrame::OnCopyDataRecipeEditor(COPYDATA_RECIPE2REV* pCopyData) { if (pCopyData==NULL) return; CMainFrame* pMain = static_cast(AfxGetMainWnd()); if (pMain == NULL) { return; } CSequenceProcessor* pSequenceProcessor = pMain->IRP2P_GetSequenceProcessor(); if (pSequenceProcessor == NULL) return; COPYDATA_RECIPE2REV copyData; switch (pCopyData->Message) { case MsgRecipe2Rev_StandardCameraGlassPos: { const SMotorPosition* pMotorPosition = Module_GetStandardMotorPosition(); if(pMotorPosition) { copyData.Message = MsgRev2Recipe_StandardCameraGlassPos; copyData.dStandardCameraGlassPosX = pMotorPosition->dGlassPosX; copyData.dStandardCameraGlassPosY = pMotorPosition->dGlassPosY; SendData2RecipeEditor(©Data); } } break; // [2017:4:17]-[WEZASW] : CIM(Recipe) 보고 항목 추가. case MsgRecipe2Rev_RecipeCreate: { g_pLog->DisplayMessage(_T("[CIM_REQ] PCControl -> PC. MsgRev2Recipe_RecipeCreate")); copyData.Message = MsgRev2Recipe_RecipeCreate; SendData2RecipeEditor(©Data); pSequenceProcessor->CIM_SendRecipeCreate(pCopyData->nPPID); } break; case MsgRecipe2Rev_RecipeChange: { g_pLog->DisplayMessage(_T("[CIM_REQ] PCControl -> PC. MsgRev2Recipe_RecipeChange")); copyData.Message = MsgRev2Recipe_RecipeChange; SendData2RecipeEditor(©Data); pSequenceProcessor->CIM_SendRecipeChange(pCopyData->nPPID); } break; case MsgRecipe2Rev_RecipeDelete: { g_pLog->DisplayMessage(_T("[CIM_REQ] PCControl -> PC. MsgRev2Recipe_RecipeDelete")); copyData.Message = MsgRev2Recipe_RecipeDelete; SendData2RecipeEditor(©Data); pSequenceProcessor->CIM_SendRecipeDelete(pCopyData->nPPID); } break; case MsgRecipe2Rev_RecipeModify: { g_pLog->DisplayMessage(_T("[CIM_REQ] PCControl -> PC. MsgRev2Recipe_RecipeModify")); copyData.Message = MsgRev2Recipe_RecipeModify; SendData2RecipeEditor(©Data); pSequenceProcessor->CIM_SendRecipeModify(pCopyData->nPPID); } break; } } void CMainFrame::OnCopyDataResetComm(RESETCOMM* pCopyData) { if (pCopyData==NULL) return; m_ResetComm = *pCopyData; KillTimer(m_ResetComm.iIdentTimer); SetTimer(m_ResetComm.iIdentTimer, m_ResetComm.iIntaval, NULL); } void CMainFrame::OnCopyDataAoiServer(SAOIServerMessage* pCopyData) { if (pCopyData==NULL) return; switch (pCopyData->nMessage) { case Message_AOIServer2ReviewSystem_AlignResult: { CCoordCalibrator *pCoordCalibrator = ISP2P_GetCoordCalibrator(); if (pCoordCalibrator) { double dX = pCopyData->uMessageData[0].dValue; // dx double dY = pCopyData->uMessageData[1].dValue; // dy double dTheta = pCopyData->uMessageData[2].dValue; // theta SAlignResult alignResult = pCoordCalibrator->GetAlignResult(); // 원점위치 재계산 alignResult.dOriginX += dX * 0.001; alignResult.dOriginY += dY * 0.001; // 회전 행렬 계산. alignResult.dRadian = dTheta; alignResult.dDegree = ToDegree(alignResult.dRadian); alignResult.dSinValue = sin(alignResult.dRadian); alignResult.dCosValue = cos(alignResult.dRadian); // 원점을 중심으로 회전하는 행렬 alignResult.SetRotateMatrix(alignResult.dOriginX, alignResult.dOriginY); pCoordCalibrator->SetAlignResult(alignResult); // dx, dy, Theta g_pLog->DisplayMessage(_T("dx = %f[um], dy = %f[um], theta = %f[Dedgree]"), dX, dY, alignResult.dDegree); // Origin Coordinate g_pLog->DisplayMessage(_T("Origin X = %f, Origin Y = %f"), alignResult.dOriginX, alignResult.dOriginY); } else { g_pLog->DisplayMessage(_T("Align Fail! , pCoordCalibrator is Null!")); } pCopyData->nMessage = Message_ReviewSystem2AOIServer_AlignResultAck; SendData2AOIServer(pCopyData); } break; default: break; } } BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다. switch(pCopyDataStruct->dwData) { case COPYDATA_SYSTEMSETTING2REVIEWSYSTEM: { COPYDATA_SYSTEM2REV* pCopyData = (COPYDATA_SYSTEM2REV*)pCopyDataStruct->lpData; if (pCopyData) OnCopyDataSystemSetting(pCopyData); } break; case COPYDATA_RECIPEEDITOR2REVIEWSYSTEM: { COPYDATA_RECIPE2REV* pCopyData = (COPYDATA_RECIPE2REV*)pCopyDataStruct->lpData; if (pCopyData) OnCopyDataRecipeEditor(pCopyData); } break; case COPYDATA_RESETCOMM: { RESETCOMM* pCopyData = (RESETCOMM*)pCopyDataStruct->lpData; if (pCopyData) OnCopyDataResetComm(pCopyData); } break; case COPYDATA_AOISERVER_2_REVIEWSYSTEM : { SAOIServerMessage* pCopyData = (SAOIServerMessage*)pCopyDataStruct->lpData; if (pCopyData) OnCopyDataAoiServer(pCopyData); } break; } return __super::OnCopyData(pWnd, pCopyDataStruct); } BOOL CMainFrame::SendData2SystemSetting(COPYDATA_SYSTEM2REV* pData) { HWND hWnd = ::FindWindow(NULL, _SYSTEM_SETTING_TITLE_); if (hWnd && pData) { COPYDATASTRUCT cds; cds.dwData = COPYDATA_SYSTEMSETTING2REVIEWSYSTEM; cds.cbData = sizeof(COPYDATA_SYSTEM2REV); cds.lpData = pData; ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cds); return TRUE; } return FALSE; } BOOL CMainFrame::SendData2RecipeEditor(COPYDATA_RECIPE2REV* pData) { HWND hWnd = ::FindWindow(NULL, _RECIPE_EDITOR_TITLE_); if (hWnd && pData) { COPYDATASTRUCT cds; cds.dwData = COPYDATA_RECIPEEDITOR2REVIEWSYSTEM; cds.cbData = sizeof(COPYDATA_RECIPE2REV); cds.lpData = pData; ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cds); return TRUE; } return FALSE; } BOOL CMainFrame::SendData2AOIServer( SAOIServerMessage* pData ) { HWND hWnd = ::FindWindow(NULL, COPYDATA_AOISERVER_NAME); if (hWnd && pData) { COPYDATASTRUCT cds; cds.dwData = COPYDATA_AOISERVER_2_REVIEWSYSTEM; cds.cbData = sizeof(SAOIServerMessage); cds.lpData = pData; ::SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)(LPVOID)&cds); return TRUE; } return FALSE; }