From 3f5b8aa2bb8c49ab68599102ce5a45ea6ba1c43b Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Thu, 6 Jun 2013 18:20:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=BF=80=E5=85=89=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Msi/Hsi/Keyence/Keyence_Laser.cpp | 9 +- .../Interfac/Msi/Hsi/Keyence/Keyence_Laser.h | 7 +- PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h | 1 + .../Msi/Hsi/SevenOcean/So7_Interface.cpp | 40 ++- .../Msi/Hsi/SevenOcean/So7_Interface.h | 8 +- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 268 +++++++++++++++++ .../Tools/UsbUtility/Debug/Utility_Config.ini | 150 +++++----- .../Tools/UsbUtility/UsbUtil/DrawGraph.cpp | 4 +- .../UsbUtility/UsbUtil/Keyence_UtilDlg.cpp | 184 +++++++++++- .../UsbUtility/UsbUtil/Keyence_UtilDlg.h | 23 +- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.cpp | 2 +- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 269 ++++++++++++++---- .../UsbUtility/UsbUtil/SO7_Send_Parameter.cpp | 50 +++- .../UsbUtility/UsbUtil/SO7_Send_Parameter.h | 1 + .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 3 +- .../UsbUtility/UsbUtil/So7_Manual_Machine.cpp | 207 ++++++++++++++ .../UsbUtility/UsbUtil/So7_Manual_Machine.h | 39 +++ .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 7 + .../UsbUtility/UsbUtil/So7_Util_ImageDll.cpp | 83 ++++++ .../UsbUtility/UsbUtil/So7_Util_ImageDll.h | 1 + .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 2 + .../UsbUtil/Usb_Util.vcxproj.filters | 6 + .../UsbUtility/UsbUtil/Videocard_SV2000E.cpp | 32 ++- .../UsbUtility/UsbUtil/Videocard_SV2000E.h | 5 +- .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 90 +++++- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 212480 -> 1202176 bytes 26 files changed, 1322 insertions(+), 169 deletions(-) create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.cpp index e44c877..7482e11 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.cpp @@ -37,7 +37,7 @@ void CKeyence_Laser::KeyenceLaserInit(void) m_pDataStorageGetData=(pLKIF_DataStorageGetData)GetProcAddress(m_hLkif,"LKIF_DataStorageGetData"); m_pDataStorageGetStatus=(pLKIF_DataStorageGetStatus)GetProcAddress(m_hLkif,"LKIF_DataStorageGetStatus"); m_pSetDataStorage=(pLKIF_SetDataStorage)GetProcAddress(m_hLkif,"LKIF_SetDataStorage"); - + m_pSetProgramNo=(pLKIF_SETPROGRAMNO)GetProcAddress(m_hLkif,"LKIF_SetProgramNo"); } } } @@ -241,3 +241,10 @@ BOOL CKeyence_Laser::GetStoreDataStatus() bStatus=m_pDataStorageGetStatus(m_iSetOutNo,&m_bIsStorage,&m_StoredDataNumber); return bStatus; }; +//============================================== +BOOL CKeyence_Laser::SetProgramNO(int ProNO) +{ + BOOL bStatus(FALSE); + bStatus=m_pSetProgramNo(ProNO); + return bStatus; +}; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.h b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.h index 089fe86..c237602 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/Keyence_Laser.h @@ -24,7 +24,8 @@ typedef BOOL (WINAPI* pLKIF_DataStorageGetData)(IN int OutNo,IN int NumOutBuffer typedef BOOL (WINAPI* pLKIF_DataStorageGetStatus)(IN int OutNo,OUT BOOL *IsStorage,OUT int *NumStorageData); // Set Data Storage typedef BOOL (WINAPI* pLKIF_SetDataStorage)(IN LKIF_TARGETOUT TargetOut,IN int NumStorage,IN LKIF_STORAGECYCLE StorageCycle); - +// Program Change +typedef BOOL (WINAPI* pLKIF_SETPROGRAMNO)(IN int ProgramNo); //====================================================================================== class CKeyence_Laser { @@ -46,7 +47,7 @@ public: pLKIF_DataStorageGetData m_pDataStorageGetData; pLKIF_DataStorageGetStatus m_pDataStorageGetStatus; pLKIF_SetDataStorage m_pSetDataStorage; - + pLKIF_SETPROGRAMNO m_pSetProgramNo; int m_StoredDataNumber; BOOL m_bIsStorage; void KeyenceLaserInit(void); @@ -56,6 +57,8 @@ public: BOOL GetStoreDataStatus(); BOOL GetStoredData(float *GetStorageData,int *GetStorageNumber); BOOL PauseScanAndGetData(float *GetStorageData,int *GetStorageNumber); + BOOL SetProgramNO(int ProNO); + }; #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h index c906bde..d81b04c 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/DLL.h @@ -5,6 +5,7 @@ #include #include "NewDataStruct.h" +#define MAX_POINT 5000 #define PI 3.14159 #define SET_FACE_NUM 100 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp index ad79505..c65e592 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_Interface.cpp @@ -8,7 +8,8 @@ CSo7_Interface::CSo7_Interface() { - + m_hImageDLL=NULL; + m_hFitDLL=NULL; } CSo7_Interface::~CSo7_Interface() @@ -16,10 +17,17 @@ CSo7_Interface::~CSo7_Interface() if(m_hImageDLL) { Pro_cmd(Exit_DLL,(LPARAM)&Image_Info); + Sleep(50); Pro_cmd(VQUIT_DLL,(LPARAM)&Image_Info); + Sleep(50); Pro_cmd(MCLOSE,(LPARAM)&Image_Info); + Sleep(50); FreeLibrary(m_hImageDLL); } + if(m_hFitDLL) + { + FreeLibrary(m_hFitDLL); + } } //======================================== void CSo7_Interface::InitDll(void) @@ -31,11 +39,16 @@ void CSo7_Interface::InitDll(void) m_pGET_LASER_STORED_DATA=(GET_LASER_STORED_DATA)GetProcAddress(m_hImageDLL,"GetLaserStoredData"); m_pPAUSE_SCAN_AND_GET_LASER_DATA=(PAUSE_SCAN_AND_GET_LASER_DATA)GetProcAddress(m_hImageDLL,"PauseScanAndGetLaserData"); m_pGET_SCAN_LASER_STORAGE_STATUS=(GET_SCAN_LASER_STORAGE_STATUS)GetProcAddress(m_hImageDLL,"GetKeyenceStorageStatus"); + g_FitFace=(FITTING_SURFACE)GetProcAddress(m_hImageDLL,"FaceFit"); Pro_cmd(VINIT_DLL,(LPARAM)&Image_Info); Pro_cmd(MINIT_USB,(LPARAM)&Image_Info); - - + } + //===================================== + m_hFitDLL=LoadLibrary(_T("FitDll.dll")); + if(m_hFitDLL) + { + g_FitFace_PCD=(FITTING_SURFACE_PCD)GetProcAddress(m_hFitDLL,"FaceFit"); } } //======================================== @@ -72,3 +85,24 @@ void CSo7_Interface::PauseScanAndGetData(void) int LaserNum(0); m_pPAUSE_SCAN_AND_GET_LASER_DATA(Laserval,&LaserNum); } +//======================================== +int CSo7_Interface::Pro_Face_Du(MY3DPoint* pArr, int n, double* Coe, double* Error, double& dis) +{ + //g_Set_Face_Flag 1--双向最大值差 2--平均值 3--正向最大值 + double dis1(0.0),dis2(0.0),dis3(0.0); + double sum(0.0); + double d1=pArr[0].z; + for(int i=1;iGetTextExtent(strCoord, strCoord.GetLength()); @@ -191,7 +191,7 @@ void CDrawGraph::DrawCoordinate(CDC* pDC, CRect rectCoord) for(i=0; i<=m_nDivisionY; i++) { dbTemp = dbTempStartY+dbRangY*i/m_nDivisionY; - strCoord.Format(_T("%g"), dbTemp); + strCoord.Format(_T("%.2f"), dbTemp); nSection = rectCoord.Height()*i/m_nDivisionY; szText = pDC->GetTextExtent(strCoord, strCoord.GetLength()); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp index a850fea..98de599 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp @@ -11,7 +11,13 @@ #include "..\..\..\Keyence\\Keyence_Proto.h" #include "..\..\..\SevenOcean\SO7_Proto.h" #include "Keyence_UtilDlg.h" + +#define _TEST_NEED_SO7_MACHINE + +#ifdef _TEST_NEED_SO7_MACHINE extern CSO7_Proto* m_pSO7_Proto; +#endif + extern CKeyence_Laser* m_pKeyence_Laser; extern CKeyence_Laser_LK_H* m_pKeyence_Laser_LK_H; extern CKeyence_Proto* m_pKeyence_Proto; @@ -69,6 +75,18 @@ BEGIN_MESSAGE_MAP(CKeyence_UtilDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER, &CKeyence_UtilDlg::OnBnClickedButtonGetScanDataKeyenceLkHlaser) ON_BN_CLICKED(IDC_RADIO_KEYENCE_LASER_LK_H, &CKeyence_UtilDlg::OnBnClickedRadioKeyenceLaserLkH) ON_BN_CLICKED(IDC_RADIO_KEYENCE_LASER_LK_G, &CKeyence_UtilDlg::OnBnClickedRadioKeyenceLaserLkG) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM1, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram1) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram2) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM3, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram3) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM0, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram0) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM4, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram4) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM5, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram5) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM6, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram6) + ON_BN_CLICKED(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM7, &CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram7) + ON_BN_CLICKED(IDC_BUTTON_TEST_KEYENCE_SAVE_LOG, &CKeyence_UtilDlg::OnBnClickedButtonTestKeyenceSaveLog) + ON_EN_KILLFOCUS(IDC_EDIT_TEST_LK_G_INTERVAL, &CKeyence_UtilDlg::OnEnKillfocusEditTestLkGInterval) + ON_BN_CLICKED(IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG, &CKeyence_UtilDlg::OnBnClickedButtonTestKeyenceClearLog) + ON_BN_CLICKED(IDC_BUTTON_KEYENCE_LASER_CALIBRATE_VALUE, &CKeyence_UtilDlg::OnBnClickedButtonKeyenceLaserCalibrateValue) END_MESSAGE_MAP() #pragma region GUI @@ -89,9 +107,23 @@ BOOL CKeyence_UtilDlg::OnInitDialog() GetDlgItem(IDC_BUTTON_SCAN_KEYENCE_LK_HLASER)->EnableWindow(false); GetDlgItem(IDC_BUTTON_STOP_SCAN_KEYENCE_LK_HLASER)->EnableWindow(false); GetDlgItem(IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER)->EnableWindow(false); +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->Init_SO7Usb(); m_pSO7_Proto->_start_machine(); - +#endif + ((CButton*)(GetDlgItem(IDC_RADIO_KEYENCE_LASER_LK_G)))->SetCheck(TRUE); + OnBnClickedRadioKeyenceLaserLkG(); + m_LK_G_CalibrateVal=0.0; + m_LK_G_TopCalibrateVal=0.0; + m_LK_G_BottomCalibrateVal=0.0; + ((CButton*)(GetDlgItem(IDC_EDIT_KEYENCE_LASER_CALIBRATE_VALUE)))->SetWindowText(_T("0.0")); + m_LK_G_Interval=100; + ((CButton*)(GetDlgItem(IDC_EDIT_TEST_LK_G_INTERVAL)))->SetWindowText(_T("100")); + for (int i=0;i<8;i++) + { + m_LK_G_ProNOState[i]=FALSE; + } + m_LK_G_ProNOChecked=0; return TRUE; // return TRUE unless you set the focus to a control } @@ -139,8 +171,10 @@ void CKeyence_UtilDlg::OnBnClickedCancel() KillTimer(3); KillTimer(4); +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_shutdown_machine(); m_pSO7_Proto->Exit_SO7Usb(); +#endif CDialog::OnCancel(); } @@ -167,6 +201,36 @@ void CKeyence_UtilDlg::OutputWithScroll(const CString &strNewText,CEdit &edtOutp edtOutput.SetRedraw(TRUE); } +//===================================================================================== +void CKeyence_UtilDlg::OnBnClickedButtonTestKeyenceSaveLog() +{ + USES_CONVERSION; + + CString FileName; + CString PathName; + FILE* m_pOutFile; + + FileName=_T("LK_G_Data.txt"); + CString szFilter=_T("TXT Files(*.txt)|*.txt|ALL Files(*.*)|*.*||"); + CFileDialog fdlg(FALSE,_T("INI"),FileName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); + + if( fdlg.DoModal()==IDOK) + { + const char* outBuff=NULL; + CString strOutput; + PathName=fdlg.GetPathName(); + _wfopen_s(&m_pOutFile, PathName, _T("wt")); + if (!m_pOutFile) + { + MessageBox( _T("File name Error."), _T("Message"), MB_OK); + }; + m_edMSG.GetWindowText(strOutput); + outBuff=T2A(strOutput); + fprintf(m_pOutFile,"%s", outBuff); + fclose(m_pOutFile); + } + delete fdlg; +} #pragma endregion @@ -175,6 +239,7 @@ void CKeyence_UtilDlg::OutputWithScroll(const CString &strNewText,CEdit &edtOutp void CKeyence_UtilDlg::OnBnClickedButtonInitKeyenceLaser() { +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_OPEN_KEYENCE_LASER(); do { @@ -182,12 +247,33 @@ void CKeyence_UtilDlg::OnBnClickedButtonInitKeyenceLaser() m_pSO7_Proto->_send_cmd_SO7_CMD_READ_INTERRUPT_MESSAGE(); } while (m_pSO7_Proto->g_machine.InterruptFlag[0]!=CT_SEND_XYZLASE); m_pSO7_Proto->g_machine.InterruptFlag[0]=0; +#endif + CString csLaserValue; - m_pKeyence_Laser->Get_KeyenceLaserData(&fLaserVaule1,&fLaserVaule2); - csLaserValue.Format(_T("%f"),fLaserVaule1); - GetDlgItem(IDC_EDIT_LASER_VALUE1)->SetWindowText(csLaserValue); - csLaserValue.Format(_T("%f"),fLaserVaule2); - GetDlgItem(IDC_EDIT_LASER_VALUE2)->SetWindowText(csLaserValue); + for(int i=0;i<8;i++) + { + if(m_LK_G_ProNOState[i]) + { + m_pKeyence_Laser->SetProgramNO(i); + Sleep(20); + m_pKeyence_Laser->Get_KeyenceLaserData(&fLaserVaule1,&fLaserVaule2); + csLaserValue.Format(_T("%.4f"),fLaserVaule1); + GetDlgItem(IDC_EDIT_LASER_VALUE1)->SetWindowText(csLaserValue); + csLaserValue.Format(_T("%.4f"),fLaserVaule2); + GetDlgItem(IDC_EDIT_LASER_VALUE2)->SetWindowText(csLaserValue); + if (i==m_LK_G_CalibrateNO) + { + m_OutMessage.Format(_T(" OUT1:%.4f,OUT2:%.4f,Result:%.4f"),i,fLaserVaule1,fLaserVaule2,(fLaserVaule1-m_LK_G_TopCalibrateVal)+m_LK_G_CalibrateVal+(m_LK_G_BottomCalibrateVal-fLaserVaule2)); + } + else + { + m_OutMessage.Format(_T(" OUT1:%.4f,OUT2:%.4f,Average:%.4f"),i,fLaserVaule1,fLaserVaule2,0.5*(fLaserVaule1+fLaserVaule2)); + } + OutputWithScroll(m_OutMessage,m_edMSG); + } + } + + } //================================================================================================ @@ -196,7 +282,7 @@ void CKeyence_UtilDlg::OnBnClickedCheckContinueReadLaserValue() if (((CButton*)(GetDlgItem(IDC_CHECK_CONTINUE_READ_LASER_VALUE)))->GetCheck()) { ((CButton*)(GetDlgItem(IDC_BUTTON_INIT_KEYENCE_LASER)))->EnableWindow(FALSE); - SetTimer(1,20,NULL); + SetTimer(1,m_LK_G_Interval,NULL); } else { @@ -211,13 +297,17 @@ void CKeyence_UtilDlg::OnBnClickedCheckContinueReadLaserValue() void CKeyence_UtilDlg::OnBnClickedButtonScanKeyenceLkGlaser() { m_pKeyence_Laser->StartStoreData(500,20); +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(5); +#endif SetTimer(2,100,NULL); } //================================================================================================ void CKeyence_UtilDlg::OnBnClickedButtonStopScanKeyenceLkGlaser() { +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); +#endif m_pKeyence_Laser->StopStoreData(); KillTimer(2); } @@ -252,6 +342,67 @@ void CKeyence_UtilDlg::OnBnClickedButtonGetScanDataKeyenceLkGlaser() } ShellExecute(NULL,L"open",L"notepad++.exe",L"C:\\log\\Laser.log",NULL,SW_SHOWNORMAL); } +void CKeyence_UtilDlg::OnEnKillfocusEditTestLkGInterval() +{ + UpdateData(TRUE); + USES_CONVERSION; + CString csTmp; + (GetDlgItem(IDC_EDIT_TEST_LK_G_INTERVAL))->GetWindowText(csTmp); + const char* cTempValue=T2A(csTmp); + m_LK_G_Interval=atoi(cTempValue); +} +void CKeyence_UtilDlg::OnBnClickedButtonTestKeyenceClearLog() +{ + m_edMSG.SetWindowText(_T("")); + UpdateData(FALSE); +} + +void CKeyence_UtilDlg::OnBnClickedButtonKeyenceLaserCalibrateValue() +{ + UpdateData(TRUE); + USES_CONVERSION; + CString csTmp; + (GetDlgItem(IDC_EDIT_KEYENCE_LASER_CALIBRATE_VALUE))->GetWindowText(csTmp); + const char* cTempValue=T2A(csTmp); + m_LK_G_CalibrateVal=static_cast(atof(cTempValue)); + m_LK_G_CalibrateNO=1; + m_pKeyence_Laser->Get_KeyenceLaserData(&fLaserVaule1,&fLaserVaule2); + m_LK_G_TopCalibrateVal=fLaserVaule1; + m_LK_G_BottomCalibrateVal=fLaserVaule2; +} + +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram0() +{ + m_LK_G_ProNOState[0]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM0))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram1() +{ + m_LK_G_ProNOState[1]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM1))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram2() +{ + m_LK_G_ProNOState[2]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram3() +{ + m_LK_G_ProNOState[3]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM3))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram4() +{ + m_LK_G_ProNOState[4]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM4))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram5() +{ + m_LK_G_ProNOState[5]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM5))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram6() +{ + m_LK_G_ProNOState[6]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM6))->GetCheck(); +} +void CKeyence_UtilDlg::OnBnClickedCheckTestKeyenceLkGProgram7() +{ + m_LK_G_ProNOState[7]=((CButton *)GetDlgItem(IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM7))->GetCheck(); +} #pragma endregion //================================================================================================ void CKeyence_UtilDlg::OnTimer(UINT_PTR nIDEvent) @@ -304,12 +455,12 @@ void CKeyence_UtilDlg::OnTimer(UINT_PTR nIDEvent) //=============================================== void CKeyence_UtilDlg::OnBnClickedButtonRuncnc() { - SetTimer(2,300,NULL); } //=============================================== void CKeyence_UtilDlg::RunCNC() { +#ifdef _TEST_NEED_SO7_MACHINE if (m_pSO7_Proto) { @@ -353,7 +504,7 @@ void CKeyence_UtilDlg::RunCNC() m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_TO_POS_XYZ(CT_MOVETOXYZ); } } - +#endif } void CKeyence_UtilDlg::OnBnClickedButtonInitKeyenceUsb() @@ -392,6 +543,7 @@ void CKeyence_UtilDlg::OnBnClickedButtonExitKeyenceUsb() //====================================================== void CKeyence_UtilDlg::OnBnClickedButtonLaserLkHGetData() { +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_OPEN_KEYENCE_LASER(); do { @@ -399,6 +551,7 @@ void CKeyence_UtilDlg::OnBnClickedButtonLaserLkHGetData() m_pSO7_Proto->_send_cmd_SO7_CMD_READ_INTERRUPT_MESSAGE(); } while (m_pSO7_Proto->g_machine.InterruptFlag[0]!=CT_SEND_XYZLASE); m_pSO7_Proto->g_machine.InterruptFlag[0]=0; +#endif CString csLaserValue; m_pKeyence_Laser_LK_H->Get_KeyenceLaserData(&fLaserVaule1,&fLaserVaule2); csLaserValue.Format(_T("%f"),fLaserVaule1); @@ -427,14 +580,18 @@ void CKeyence_UtilDlg::OnBnClickedButtonScanKeyenceLkHlaser() { m_LK_H_StorageOutNumber=4; m_pKeyence_Laser_LK_H->StartStoreData(m_LK_H_StorageOutNumber,1000,20); +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(5); +#endif SetTimer(4,100,NULL); } //====================================================== void CKeyence_UtilDlg::OnBnClickedButtonStopScanKeyenceLkHlaser() { +#ifdef _TEST_NEED_SO7_MACHINE m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); +#endif m_pKeyence_Laser_LK_H->StopStoreData(); KillTimer(4); } @@ -473,4 +630,11 @@ void CKeyence_UtilDlg::OnBnClickedButtonGetScanDataKeyenceLkHlaser() } ShellExecute(NULL,L"open",L"notepad++.exe",L"C:\\log\\LK_H_Laser.log",NULL,SW_SHOWNORMAL); } -#pragma endregion \ No newline at end of file +#pragma endregion + + + + + + + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.h index 2bc2857..74b4ab7 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.h @@ -16,8 +16,17 @@ public: protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual BOOL OnInitDialog(); + DECLARE_MESSAGE_MAP() +protected: CEdit m_edMSG; - DECLARE_MESSAGE_MAP() + BOOL m_LK_G_ProNOState[8]; + char m_LK_G_ProNOChecked; + char m_LK_G_CalibrateNO; + int m_LK_G_Interval; + float m_LK_G_CalibrateVal; + float m_LK_G_TopCalibrateVal; + float m_LK_G_BottomCalibrateVal; + public: int m_LK_H_StorageOutNumber; CString m_OutMessage; @@ -41,4 +50,16 @@ public: afx_msg void OnBnClickedButtonGetScanDataKeyenceLkHlaser(); afx_msg void OnBnClickedRadioKeyenceLaserLkH(); afx_msg void OnBnClickedRadioKeyenceLaserLkG(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram1(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram2(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram3(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram0(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram4(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram5(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram6(); + afx_msg void OnBnClickedCheckTestKeyenceLkGProgram7(); + afx_msg void OnBnClickedButtonTestKeyenceSaveLog(); + afx_msg void OnEnKillfocusEditTestLkGInterval(); + afx_msg void OnBnClickedButtonTestKeyenceClearLog(); + afx_msg void OnBnClickedButtonKeyenceLaserCalibrateValue(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.cpp index a56f5b5..a5c778a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.cpp @@ -22,7 +22,7 @@ #include "So7_Option.h" -//#define _ONLY_USE_FOR_SO7 +#define _ONLY_USE_FOR_SO7 #ifdef _DEBUG #define new DEBUG_NEW diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index d84739a..28ec6a9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -143,11 +143,11 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM CAPTION "Send Parameter" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "X",IDC_RADIO_SAMPLE_X,"Button",BS_AUTORADIOBUTTON | WS_GROUP,397,403,20,10 - CONTROL "Y",IDC_RADIO_SAMPLE_Y,"Button",BS_AUTORADIOBUTTON,397,414,20,10 - CONTROL "Z",IDC_RADIO_SAMPLE_Z,"Button",BS_AUTORADIOBUTTON,397,425,20,10 - CONTROL "速度-时间",IDC_RADIO_CANVAS_SPEED_TIME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,322,406,51,10 - CONTROL "位移-时间",IDC_RADIO_CANVAS_POSTION_TIME,"Button",BS_AUTORADIOBUTTON,322,420,51,10 + CONTROL "X",IDC_RADIO_SAMPLE_X,"Button",BS_AUTORADIOBUTTON | WS_GROUP,390,415,20,10 + CONTROL "Y",IDC_RADIO_SAMPLE_Y,"Button",BS_AUTORADIOBUTTON,390,426,20,10 + CONTROL "Z",IDC_RADIO_SAMPLE_Z,"Button",BS_AUTORADIOBUTTON,390,437,20,10 + CONTROL "速度-时间",IDC_RADIO_CANVAS_SPEED_TIME,"Button",BS_AUTORADIOBUTTON | WS_GROUP,315,418,51,10 + CONTROL "位移-时间",IDC_RADIO_CANVAS_POSTION_TIME,"Button",BS_AUTORADIOBUTTON,315,432,51,10 EDITTEXT IDC_EDIT_BASESPEED_X1,43,55,40,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_MAXSPEED_X1,93,55,40,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_STARTSPEED_X1,143,55,40,12,ES_AUTOHSCROLL @@ -289,9 +289,9 @@ BEGIN LTEXT "采样时间",IDC_STATIC,529,410,33,8 PUSHBUTTON "Stop",IDC_BUTTON_STOP_SAMPLE_SCURVE,627,425,50,14 CONTROL "运动曲线图",IDC_CUSTOM_CANVAS,"CDrawGraph",WS_TABSTOP,309,34,423,349 - GROUPBOX "曲线类型",IDC_STATIC,315,392,66,48 + GROUPBOX "曲线类型",IDC_STATIC,308,404,66,48 EDITTEXT IDC_EDIT_SET_PARAMETER_MSGOUTPUT,443,431,165,25,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - GROUPBOX "坐标轴",IDC_STATIC,386,392,50,48 + GROUPBOX "坐标轴",IDC_STATIC,379,404,50,48 END IDD_SO7_UTIL_AUTO_ZOOM DIALOGEX 0, 0, 426, 460 @@ -356,15 +356,16 @@ CAPTION "Option Dialog" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN CONTROL "控制器",IDC_RADIO_CONTROLLER,"Button",BS_AUTORADIOBUTTON,175,39,40,10 - CONTROL "Keyence激光",IDC_RADIO_KEYENCE_LASER,"Button",BS_AUTORADIOBUTTON,175,64,76,10 + CONTROL "Keyence激光",IDC_RADIO_KEYENCE_LASER,"Button",BS_AUTORADIOBUTTON,175,89,76,10 CONTROL "SDK3000视频卡",IDC_RADIO_VIDEOCARD_SDK3000,"Button",BS_AUTORADIOBUTTON,48,39,69,10 CONTROL "SV2000E视频卡",IDC_RADIO_VIDEOCARD_SV2000E,"Button",BS_AUTORADIOBUTTON,48,64,69,10 CONTROL "TC4000视频卡",IDC_RADIO_VIDEOCARD_TC4000,"Button",BS_AUTORADIOBUTTON,48,89,69,10 DEFPUSHBUTTON "OK",IDOK,181,145,50,14 PUSHBUTTON "Cancel",IDCANCEL,241,145,50,14 GROUPBOX "测试选项",IDC_STATIC,29,15,243,120 - CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON,175,89,45,10 + CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON,175,114,45,10 CONTROL "IP Camera",IDC_RADIO_SO7_IP_CAMERA,"Button",BS_AUTORADIOBUTTON,48,114,62,10 + CONTROL "Manual Machine",IDC_RADIO__SO7_RS232,"Button",BS_AUTORADIOBUTTON,175,64,67,10 END IDD_SO7_VIDEOCARD_SDK3000 DIALOGEX 0, 0, 488, 316 @@ -386,17 +387,19 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSM CAPTION "SV2000视频卡" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "彩色图像",IDC_RADIO_SV2000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,861,38,48,10 - CONTROL "黑白图像",IDC_RADIO_SV2000E_GRAY,"Button",BS_AUTORADIOBUTTON,861,59,48,10 - CONTROL "垂直镜像",IDC_CHECK_SV2000E_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,861,86,48,10 - PUSHBUTTON "保存图片",IDC_BUTTON_SV2000E_SAVEFILE,859,116,50,14 + CONTROL "彩色图像",IDC_RADIO_SV2000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,861,152,48,10 + CONTROL "黑白图像",IDC_RADIO_SV2000E_GRAY,"Button",BS_AUTORADIOBUTTON,861,173,48,10 + CONTROL "垂直镜像",IDC_CHECK_SV2000E_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,861,200,48,10 + PUSHBUTTON "保存图片",IDC_BUTTON_SV2000E_SAVEFILE,859,267,50,14 DEFPUSHBUTTON "开始",IDOK,793,300,50,14 PUSHBUTTON "退出",IDCANCEL,854,300,50,14 - GROUPBOX "通道选择",IDC_STATIC,864,142,42,61 - CONTROL "1",IDC_RADIO_SV2000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,876,161,23,10 - CONTROL "2",IDC_RADIO_SV2000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,876,183,26,10 - GROUPBOX "设备选择",IDC_STATIC,863,208,42,61 - COMBOBOX IDC_COMBO_SV2000E_SELECT_DEV_NUMBER,868,223,31,35,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "通道选择",IDC_STATIC,859,85,42,61 + CONTROL "1",IDC_RADIO_SV2000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,871,104,23,10 + CONTROL "2",IDC_RADIO_SV2000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,871,125,26,10 + GROUPBOX "设备选择",IDC_STATIC,858,13,42,61 + COMBOBOX IDC_COMBO_SV2000E_SELECT_DEV_NUMBER,863,29,31,35,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "去隔行",IDC_STATIC,858,217,48,40 + EDITTEXT IDC_EDITTC4000_SET_DEINTERLACE,868,234,33,14,ES_AUTOHSCROLL END IDD_SO7_UTIL_SETUP_CONFIGURE DIALOGEX 0, 0, 476, 451 @@ -514,16 +517,48 @@ BEGIN CONTROL "V",IDC_CHECK_REPETESTV,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,37,267,20,10 END -IDD_SO7_UTIL_IMAGE_DLL DIALOGEX 0, 0, 316, 183 +IDD_SO7_UTIL_IMAGE_DLL DIALOGEX 0, 0, 377, 184 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Test Imae.dll" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - PUSHBUTTON "Exit",IDCANCEL,259,162,50,14 - PUSHBUTTON "Start",IDC_BUTTON_IMAGEDLL_START_SCAN_LASER,55,41,50,14 - PUSHBUTTON "Get Data",IDC_BUTTON_IMAGEDLL_GET_SCAN_LASER_DATA,127,41,50,14 - PUSHBUTTON "Pause &Get",IDC_BUTTON_IMAGEDLL_PAUSE_AND_GET_SCAN_LASER_DATA,129,70,50,14 - PUSHBUTTON "Stop",IDC_BUTTON_IMAGEDLL_STOP_SCAN_LASER,55,71,50,14 + PUSHBUTTON "Exit",IDCANCEL,327,170,50,14 + PUSHBUTTON "Start Storage",IDC_BUTTON_IMAGEDLL_START_SCAN_LASER,21,30,50,14 + PUSHBUTTON "Get Data",IDC_BUTTON_IMAGEDLL_GET_SCAN_LASER_DATA,21,70,50,14 + PUSHBUTTON "Pause &Get",IDC_BUTTON_IMAGEDLL_PAUSE_AND_GET_SCAN_LASER_DATA,21,90,50,14 + PUSHBUTTON "Stop Storage",IDC_BUTTON_IMAGEDLL_STOP_SCAN_LASER,21,50,50,14 + GROUPBOX "Test Laser",IDC_STATIC,11,6,66,146 + GROUPBOX "Double Laser",IDC_STATIC,88,5,258,157 + LTEXT "X",IDC_STATIC,155,24,8,8 + LTEXT "Y",IDC_STATIC,196,24,8,8 + LTEXT "Z-TOP",IDC_STATIC,236,24,21,8 + LTEXT "Z-BOTTOM",IDC_STATIC,281,24,36,8 + LTEXT "Pos1",IDC_STATIC,110,42,16,8 + LTEXT "Pos2",IDC_STATIC,110,59,16,8 + LTEXT "Pos3",IDC_STATIC,110,76,16,8 + LTEXT "Standard",IDC_STATIC,101,93,30,8 + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_X1,137,40,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_Y1,183,40,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_TOPZ1,229,40,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ1,275,40,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_STANDARD_VALUE,137,91,40,14,ES_AUTOHSCROLL + LTEXT "ΔX",IDC_STATIC,220,122,10,8 + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_MEASURED_VALUE,137,134,40,14,ES_AUTOHSCROLL + GROUPBOX "Known Number",IDC_STATIC,99,14,228,103 + LTEXT "ΔY",IDC_STATIC,289,122,10,8 + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_X2,137,57,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_Y2,183,57,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_TOPZ2,229,57,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ2,275,57,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_X3,137,74,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_Y3,183,74,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_TOPZ3,229,74,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ3,275,74,40,14,ES_AUTOHSCROLL + PUSHBUTTON "Calculate",IDC_BUTTON_IMAGEDLL_2LASER_CALCULATE,275,98,40,14 + LTEXT "Result",IDC_STATIC,101,138,21,8 + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_XSHIFT,206,134,40,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_IMAGEDLL_2LASER_YSHIFT,275,134,40,14,ES_AUTOHSCROLL + LTEXT "Measured Value",IDC_STATIC,133,122,52,8 END IDD_SO7_VIDEOCARD_TC4000 DIALOGEX 0, 0, 488, 316 @@ -545,6 +580,46 @@ BEGIN CONTROL "4",IDC_RADIO_TC4000_CHANNEL4,"Button",BS_AUTORADIOBUTTON,451,213,20,10 END +IDD_SO7_UTIL_MANUAL_MACHINE DIALOGEX 0, 0, 333, 330 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Manual Machine" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON "Exit",IDCANCEL,276,292,50,14 + PUSHBUTTON "Start Machine",IDC_BUTTON_SO7_MANUAL_MACHINE_START_MACHINE,24,39,50,14 + PUSHBUTTON "Stop Machine",IDC_BUTTON_SO7_MANUAL_MACHINE_STOP_MACHINE,24,65,50,14 + EDITTEXT IDC_EDIT1,20,217,252,58,ES_AUTOHSCROLL + GROUPBOX "Position",IDC_STATIC,19,99,297,107 + GROUPBOX "Send Data",IDC_STATIC,86,18,237,76 + PUSHBUTTON "Send",IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA,267,74,50,14 + EDITTEXT IDC_EDIT_SO7_MANUAL_MACHINE_DATA,87,44,173,48,ES_AUTOHSCROLL + CONTROL "HEX",IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_HEX, + "Button",BS_AUTORADIOBUTTON | WS_GROUP,271,45,29,10 + CONTROL "ANSCII",IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_ANSCII, + "Button",BS_AUTORADIOBUTTON,271,57,39,10 + CONTROL "CMD1",IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,95,30,35,10 + CONTROL "CMD2",IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD2,"Button",BS_AUTORADIOBUTTON,140,30,35,10 + CONTROL "CMD3",IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD3,"Button",BS_AUTORADIOBUTTON,185,30,35,10 + GROUPBOX "Machine Control",IDC_STATIC,17,18,62,75 + EDITTEXT IDC_EDIT_X_SCALE_COEFFICIENT,205,137,54,12,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_Y_SCALE_COEFFICIENT,205,155,54,12,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_Z_SCALE_COEFFICIENT,205,173,54,12,ES_CENTER | ES_AUTOHSCROLL + LTEXT "x",IDC_STATIC,36,138,8,11 + LTEXT "y",IDC_STATIC,36,155,8,11 + LTEXT "z",IDC_STATIC,36,174,8,11 + EDITTEXT IDC_EDIT_X_AXIS,47,137,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + EDITTEXT IDC_EDIT_Y_AXIS,47,155,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + EDITTEXT IDC_EDIT_Z_AXIS,47,173,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + EDITTEXT IDC_EDIT_X_POSITION_58,126,137,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + EDITTEXT IDC_EDIT_Y_POSITION_58,126,155,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + EDITTEXT IDC_EDIT_Z_POSITION_58,126,173,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP + LTEXT "Scale Pulse",IDC_STATIC,56,119,36,8 + LTEXT "mm",IDC_STATIC,147,119,12,8 + LTEXT "Scale resolution",IDC_STATIC,209,119,51,11 + PUSHBUTTON "Clear All",IDC_BUTTON_SO7_MANUAL_MACHINE_CLEAR_MSG,280,224,40,17 + PUSHBUTTON "Save as...",IDC_BUTTON_SO7_MANUAL_MACHINE_SAVE_MSG,280,249,40,17 +END + ///////////////////////////////////////////////////////////////////////////// // @@ -622,9 +697,9 @@ BEGIN IDD_SO7_UTIL_IMAGE_DLL, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 309 + RIGHTMARGIN, 370 TOPMARGIN, 7 - BOTTOMMARGIN, 176 + BOTTOMMARGIN, 177 END IDD_SO7_VIDEOCARD_TC4000, DIALOG @@ -635,6 +710,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 312 END + + IDD_SO7_UTIL_MANUAL_MACHINE, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 326 + TOPMARGIN, 7 + BOTTOMMARGIN, 306 + END END #endif // APSTUDIO_INVOKED @@ -1281,33 +1364,119 @@ BEGIN PUSHBUTTON "Browse",IDC_BUTTON_BROWSE,250,17,33,14 END -IDD_DIALOG_TEST_KEYENCE DIALOGEX 0, 0, 338, 344 +IDD_DIALOG_TEST_KEYENCE DIALOGEX 0, 0, 759, 478 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Test Keyence" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - PUSHBUTTON "Exit",IDCANCEL,281,323,50,14 - CONTROL "LK_G",IDC_RADIO_KEYENCE_LASER_LK_G,"Button",BS_AUTORADIOBUTTON,73,27,32,10 - CONTROL "LK_H",IDC_RADIO_KEYENCE_LASER_LK_H,"Button",BS_AUTORADIOBUTTON,200,27,32,10 - EDITTEXT IDC_EDIT_LASER_VALUE1,33,71,69,14,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_LASER_VALUE2,33,94,69,14,ES_AUTOHSCROLL - CONTROL "Continue",IDC_CHECK_CONTINUE_READ_LASER_VALUE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,136,73,45,10 - PUSHBUTTON "Get_Data",IDC_BUTTON_INIT_KEYENCE_LASER,128,87,50,14 - PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_GLASER,203,73,50,14 - PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_GLASER,203,92,50,14 - PUSHBUTTON "Get Data",IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_GLASER,203,110,50,14 - EDITTEXT IDC_EDIT_LASER_LK_H_VALUE1,32,163,69,14,ES_AUTOHSCROLL - EDITTEXT IDC_EDIT_LASER_LK_H_VALUE2,32,186,69,14,ES_AUTOHSCROLL + PUSHBUTTON "Exit",IDCANCEL,702,457,50,14 + CONTROL "LK_G",IDC_RADIO_KEYENCE_LASER_LK_G,"Button",BS_AUTORADIOBUTTON,251,27,32,10 + CONTROL "LK_H",IDC_RADIO_KEYENCE_LASER_LK_H,"Button",BS_AUTORADIOBUTTON,418,27,32,10 + EDITTEXT IDC_EDIT_LASER_VALUE1,65,301,52,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_LASER_VALUE2,65,324,52,14,ES_AUTOHSCROLL + CONTROL "Continuous",IDC_CHECK_CONTINUE_READ_LASER_VALUE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,64,250,52,10 + PUSHBUTTON "Get Once Data",IDC_BUTTON_INIT_KEYENCE_LASER,52,205,60,14 + PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_GLASER,666,322,50,14,NOT WS_VISIBLE + PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_GLASER,666,322,50,14,NOT WS_VISIBLE + PUSHBUTTON "Get Data",IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_GLASER,666,322,50,14,NOT WS_VISIBLE + EDITTEXT IDC_EDIT_LASER_LK_H_VALUE1,32,389,69,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_LASER_LK_H_VALUE2,32,412,69,14,ES_AUTOHSCROLL CONTROL "Continue",IDC_CHECK_CONTINUE_READ_LASER_LK_H_VALUE, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,135,165,45,10 - PUSHBUTTON "Get_Data",IDC_BUTTON_LASER_LK_H_GET_DATA,127,179,50,14 - PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_HLASER,202,165,50,14 - PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_HLASER,202,184,50,14 - PUSHBUTTON "Get Data",IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER,202,202,50,14 - GROUPBOX "LKIF.DLL",IDC_STATIC,22,53,288,83 - GROUPBOX "LKIF2.DLL",IDC_STATIC,22,141,296,89 - GROUPBOX "Laser Type",IDC_STATIC,22,14,287,32 - EDITTEXT IDC_EDIT_TEST_KEYENCE_MESSAGE,22,239,302,73,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,135,391,45,10 + PUSHBUTTON "Get_Data",IDC_BUTTON_LASER_LK_H_GET_DATA,127,405,50,14 + PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_HLASER,202,391,50,14 + PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_HLASER,202,410,50,14 + PUSHBUTTON "Get Data",IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER,202,428,50,14 + GROUPBOX "LKIF.DLL",IDC_STATIC,22,50,712,314 + GROUPBOX "LKIF2.DLL",IDC_STATIC,22,367,713,89 + GROUPBOX "Laser Type",IDC_STATIC,22,14,708,32 + EDITTEXT IDC_EDIT_TEST_KEYENCE_MESSAGE,142,190,507,166,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + PUSHBUTTON "Save as...",IDC_BUTTON_TEST_KEYENCE_SAVE_LOG,666,270,50,14 + GROUPBOX "Program No. Setting",IDC_STATIC,33,60,690,118 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,56,133,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,223,89,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,224,133,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,391,89,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,391,133,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,559,89,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,561,133,24,10 + CONTROL "En",IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,89,24,10 + EDITTEXT IDC_EDIT_TEST_LK_G_INTERVAL,65,229,40,14,ES_AUTOHSCROLL + LTEXT "Interval",IDC_STATIC,37,229,26,8 + LTEXT "ms",IDC_STATIC,111,229,10,8 + PUSHBUTTON "Clear All",IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG,666,232,50,14 + EDITTEXT IDC_EDIT_KEYENCE_LASER_CALIBRATE_VALUE,668,303,40,14,ES_AUTOHSCROLL | NOT WS_VISIBLE + PUSHBUTTON "Calibrate",IDC_BUTTON_KEYENCE_LASER_CALIBRATE_VALUE,666,322,50,14,NOT WS_VISIBLE + GROUPBOX "Get Data",IDC_STATIC,33,189,91,82 + GROUPBOX "Calibrate",IDC_STATIC,658,288,64,76,NOT WS_VISIBLE + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE0,"Button",BS_AUTORADIOBUTTON,117,96,37,10 + GROUPBOX "Readout",IDC_STATIC,32,278,93,77 + LTEXT "OUT1",IDC_STATIC,38,303,19,8 + LTEXT "OUT2",IDC_STATIC,38,325,19,8 + GROUPBOX "NO.0",IDC_STATIC,50,70,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE0,"Button",BS_AUTORADIOBUTTON | WS_GROUP,117,82,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,77,82,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,77,95,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE0,165,94,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,170,82,30,8 + GROUPBOX "",IDC_STATIC,161,71,48,40 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE1,"Button",BS_AUTORADIOBUTTON,118,140,37,10 + GROUPBOX "NO.1",IDC_STATIC,50,114,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,118,125,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,78,125,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,78,138,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE1,166,138,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,170,125,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE2,"Button",BS_AUTORADIOBUTTON,286,97,37,10 + GROUPBOX "NO.2",IDC_STATIC,219,71,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE2,"Button",BS_AUTORADIOBUTTON | WS_GROUP,286,83,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,246,83,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT2,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,246,96,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE2,334,95,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,339,83,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE3,"Button",BS_AUTORADIOBUTTON,285,140,37,10 + GROUPBOX "NO.3",IDC_STATIC,218,114,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE3,"Button",BS_AUTORADIOBUTTON | WS_GROUP,285,126,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,245,126,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT3,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,245,139,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE3,333,138,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,338,126,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE4,"Button",BS_AUTORADIOBUTTON,455,96,37,10 + GROUPBOX "NO.4",IDC_STATIC,387,71,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE4,"Button",BS_AUTORADIOBUTTON | WS_GROUP,455,82,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,415,82,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,415,95,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE4,503,95,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,507,82,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE5,"Button",BS_AUTORADIOBUTTON,454,140,37,10 + GROUPBOX "NO.5",IDC_STATIC,387,114,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE5,"Button",BS_AUTORADIOBUTTON | WS_GROUP,454,126,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,414,126,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT5,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,414,139,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE5,502,138,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,507,126,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE6,"Button",BS_AUTORADIOBUTTON,623,97,37,10 + GROUPBOX "NO.6",IDC_STATIC,555,71,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE6,"Button",BS_AUTORADIOBUTTON | WS_GROUP,623,83,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,583,83,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT6,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,583,95,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE6,671,95,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,675,83,30,8 + CONTROL "Relative",IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE7,"Button",BS_AUTORADIOBUTTON,624,140,37,10 + GROUPBOX "NO.7",IDC_STATIC,556,114,159,41 + CONTROL "Average",IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE7,"Button",BS_AUTORADIOBUTTON | WS_GROUP,624,126,39,10 + CONTROL "OUT1",IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,584,126,34,10 + CONTROL "OUT2",IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT7,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,584,139,34,10 + EDITTEXT IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE7,672,138,40,14,ES_AUTOHSCROLL + LTEXT "Calibrate",IDC_STATIC,676,126,30,8 + PUSHBUTTON "SET",IDC_BUTTON_TEST_KEYENCE_SET_OUTPUT,666,159,50,14 + GROUPBOX "",IDC_STATIC,161,114,48,40 + GROUPBOX "",IDC_STATIC,330,71,48,40 + GROUPBOX "",IDC_STATIC,329,114,48,40 + GROUPBOX "",IDC_STATIC,498,71,48,40 + GROUPBOX "",IDC_STATIC,498,114,48,40 + GROUPBOX "",IDC_STATIC,666,71,48,40 + GROUPBOX "",IDC_STATIC,667,114,48,40 END @@ -1418,9 +1587,9 @@ BEGIN IDD_DIALOG_TEST_KEYENCE, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 331 + RIGHTMARGIN, 752 TOPMARGIN, 7 - BOTTOMMARGIN, 337 + BOTTOMMARGIN, 471 END END #endif // APSTUDIO_INVOKED diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp index 1714480..0706306 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp @@ -38,6 +38,7 @@ IMPLEMENT_DYNAMIC(CSO7_Send_Parameter, CDialog) m_StartTime=0; m_FinishTime=0; m_duration=0.0; + m_TimerCnt=0; } //================================================================ CSO7_Send_Parameter::~CSO7_Send_Parameter() @@ -208,8 +209,8 @@ BOOL CSO7_Send_Parameter::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Y))->SetCheck(false); ((CButton *)GetDlgItem(IDC_RADIO_SAMPLE_Z))->SetCheck(false); - ((CButton *)GetDlgItem(IDC_RADIO_CANVAS_POSTION_TIME))->SetCheck(true); - ((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->SetCheck(false); + ((CButton *)GetDlgItem(IDC_RADIO_CANVAS_POSTION_TIME))->SetCheck(false); + ((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->SetCheck(true); return TRUE; // return TRUE unless you set the focus to a control } @@ -583,11 +584,26 @@ void CSO7_Send_Parameter::OnTimer(UINT_PTR nIDEvent) m_dPos=m_pSO7_Proto->g_machine.z._d_cur_pos_; } - if (m_dataGraph.ElementAt(nCount)>=-0.005 && m_dataGraph.ElementAt(nCount)<=0.005) - { - m_DrawGraph.LoadGraphyData(m_dataGraph); - KillTimer(1); - } + if (m_TimerCnt<=nCount) + { + KillTimer(1); + INT_PTR nTmpCount = m_dataGraph.GetCount(); + double dbData(0.0); + m_dbEndY=dbData; + m_dbStartY=dbData; + for(int i=0; im_dbEndY) + m_dbEndY=dbData; + if(dbData(1/(m_dbEndY-m_dbStartY)); + m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY); + m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); + m_DrawGraph.LoadGraphyData(m_dataGraph); + } } @@ -627,6 +643,11 @@ void CSO7_Send_Parameter::OnEnKillfocusEditSampleTimeScurve() const char* cTempValue=T2A(str); m_SampleTime = atof(cTempValue); + m_dbStartX=0; + m_dbEndX=m_SampleTime; + m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 + m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); + m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY,TRUE); } //================================================================================================ @@ -655,19 +676,19 @@ void CSO7_Send_Parameter::OnBnClickedButtonStartSampleScurve() m_dbEndX=m_SampleTime; if(((CButton *)GetDlgItem(IDC_RADIO_CANVAS_POSTION_TIME))->GetCheck()) { - m_dbStartY=0; - m_dbEndY=50; + // m_dbStartY=0; + // m_dbEndY=50; m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 - m_dbResolutionY=static_cast(1/m_dbEndY); + // m_dbResolutionY=static_cast(1/m_dbEndY); m_nDivisionX=10; m_nDivisionY=10; } else { - m_dbStartY=0; - m_dbEndY=50; + //m_dbStartY=0; + //m_dbEndY=50; m_dbResolutionX=static_cast(m_TimerInterval/(m_dbEndX*1000.0));//每一次采样所需时间对应X坐标的长度 - m_dbResolutionY=static_cast(1/m_dbEndY); + //m_dbResolutionY=static_cast(1/m_dbEndY); m_nDivisionX=10; m_nDivisionY=10; } @@ -677,6 +698,7 @@ void CSO7_Send_Parameter::OnBnClickedButtonStartSampleScurve() m_dataGraph.RemoveAll(); m_DrawGraph.SetGraphyView(m_dbStartX,m_dbEndX,m_dbStartY,m_dbEndY,m_nDivisionX,m_nDivisionY); m_DrawGraph.SetResolution(m_dbResolutionX,m_dbResolutionY); + m_TimerCnt=static_cast((m_SampleTime*1000)/m_TimerInterval); m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_TO_POS_XYZ(CT_MOVETOXYZ); SetTimer(1,m_TimerInterval,NULL); m_StartTime=clock(); @@ -685,7 +707,7 @@ void CSO7_Send_Parameter::OnBnClickedButtonStartSampleScurve() //================================================================================================ void CSO7_Send_Parameter::OnBnClickedButtonStopSampleScurve() { - KillTimer(1); + m_TimerCnt=0; } //================================================================================================ diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h index 746a51c..59c5498 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.h @@ -40,6 +40,7 @@ public: int m_TimerInterval; double m_dbResolutionX,m_dbResolutionY; CRect CanvasRect; + int m_TimerCnt; public: CString m_csBaseSpeedX[5]; CString m_csMaxSpeedX[5]; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp index 0067c64..9242675 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp @@ -13,8 +13,9 @@ #include "SO7_VolComp.h" #include "SO7_UtilDlg.h" // CSO7_UtilDlg 对话框 + +extern CSerial* m_pSO7_Serial; extern CSO7_Proto* m_pSO7_Proto; -CSerial* m_pSO7_Serial=NULL; CLogger* g_pLoggerDebug=NULL; CSO7_VolComp* g_pVolComp=NULL; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.cpp new file mode 100644 index 0000000..4fca2b2 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.cpp @@ -0,0 +1,207 @@ +// So7_Manual_Machine.cpp : implementation file +// + +#include "stdafx.h" +#include "resource.h" +#include "..\..\..\SevenOcean\CMMIO_SERIAL.H" +#include "So7_Manual_Machine.h" +#include "afxdialogex.h" + +extern CSerial* m_pSO7_Serial; +// CSo7_Manual_Machine dialog + +IMPLEMENT_DYNAMIC(CSo7_Manual_Machine, CDialog) + +CSo7_Manual_Machine::CSo7_Manual_Machine(CWnd* pParent /*=NULL*/) + : CDialog(CSo7_Manual_Machine::IDD, pParent) +{ + +} + +CSo7_Manual_Machine::~CSo7_Manual_Machine() +{ +} + +void CSo7_Manual_Machine::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CSo7_Manual_Machine, CDialog) + ON_BN_CLICKED(IDC_BUTTON_SO7_MANUAL_MACHINE_START_MACHINE, &CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStartMachine) + ON_BN_CLICKED(IDC_BUTTON_SO7_MANUAL_MACHINE_STOP_MACHINE, &CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStopMachine) + ON_BN_CLICKED(IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD1, &CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd1) + ON_BN_CLICKED(IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD2, &CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd2) + ON_BN_CLICKED(IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD3, &CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd3) + ON_BN_CLICKED(IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_HEX, &CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineSendDataTypeHex) + ON_BN_CLICKED(IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_ANSCII, &CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineSendDataTypeAnscii) + ON_BN_CLICKED(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA, &CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSendData) + ON_EN_KILLFOCUS(IDC_EDIT_X_SCALE_COEFFICIENT, &CSo7_Manual_Machine::OnEnKillfocusEditXScaleCoefficient) + ON_EN_KILLFOCUS(IDC_EDIT_Y_SCALE_COEFFICIENT, &CSo7_Manual_Machine::OnEnKillfocusEditYScaleCoefficient) + ON_EN_KILLFOCUS(IDC_EDIT_Z_SCALE_COEFFICIENT, &CSo7_Manual_Machine::OnEnKillfocusEditZScaleCoefficient) + ON_BN_CLICKED(IDC_BUTTON_SO7_MANUAL_MACHINE_CLEAR_MSG, &CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineClearMsg) + ON_BN_CLICKED(IDC_BUTTON_SO7_MANUAL_MACHINE_SAVE_MSG, &CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSaveMsg) + ON_BN_CLICKED(IDCANCEL, &CSo7_Manual_Machine::OnBnClickedCancel) +END_MESSAGE_MAP() + + +// CSo7_Manual_Machine message handlers + +//=================================================== +BOOL CSo7_Manual_Machine::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + ((CButton *)GetDlgItem(IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_HEX))->SetCheck(TRUE); + ((CButton *)GetDlgItem(IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_ANSCII))->SetCheck(FALSE); + + //=============================================================================== + // 创建状态栏 + m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBS_SIZEGRIP, CRect(0, 0, 0, 0), this, 101); + m_StatusBar.SetBkColor(RGB(0xff, 0xff, 0x00)); + int arWidth[] = {330,450, -1 }; + m_StatusBar.SetParts(3, arWidth); + m_StatusBar.SetText(_T("System ready."), 0, 0); + + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(FALSE); + + UpdateData(FALSE); + return TRUE; // return TRUE unless you set the focus to a control +} + + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStartMachine() +{ + if (m_pSO7_Serial) + { + CString Param,Params; + int Port; + int Baud; + char Parity; + int Bits; + int StopBits; + int HandShake; + m_pSO7_Serial->GetPortData(&Port,&Baud,&Parity,&Bits,&StopBits,&HandShake); + Params.Format( TEXT("[COM%d]"), Port ); + Param.Format( TEXT(" Baud=%d"), Baud ); + Params += Param; + Param.Format( TEXT(" Parity=%c"), Parity ); + Params += Param; + Param.Format( TEXT(" Data=%d"), Bits ); + Params += Param; + Param.Format( TEXT(" Stop=%d"), StopBits ); + Params += Param; + m_StatusBar.SetText(Params, 0, 0); + + if(m_pSO7_Serial->Open()) + { + m_StatusBar.SetText(_T("成功打开串口"), 1, 0); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(TRUE); + } + else + { + m_StatusBar.SetText(_T("串口被占用"), 1, 0); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(FALSE); + } + } +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStopMachine() +{ + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(TRUE); +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd1() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd2() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd3() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineSendDataTypeHex() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineSendDataTypeAnscii() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSendData() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnEnKillfocusEditXScaleCoefficient() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnEnKillfocusEditYScaleCoefficient() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnEnKillfocusEditZScaleCoefficient() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineClearMsg() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSaveMsg() +{ + // TODO: Add your control notification handler code here +} + +//=================================================== +void CSo7_Manual_Machine::OnBnClickedCancel() +{ + OnBnClickedButtonSo7ManualMachineStopMachine(); + CDialog::OnCancel(); +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h new file mode 100644 index 0000000..f56bd1e --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h @@ -0,0 +1,39 @@ +#pragma once + + +// CSo7_Manual_Machine dialog + +class CSo7_Manual_Machine : public CDialog +{ + DECLARE_DYNAMIC(CSo7_Manual_Machine) + +public: + CSo7_Manual_Machine(CWnd* pParent = NULL); // standard constructor + virtual ~CSo7_Manual_Machine(); + +// Dialog Data + enum { IDD = IDD_SO7_UTIL_MANUAL_MACHINE }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL OnInitDialog(); + DECLARE_MESSAGE_MAP() +protected: + CStatusBarCtrl m_StatusBar; + CEdit m_edit_Log; +public: + afx_msg void OnBnClickedButtonSo7ManualMachineStartMachine(); + afx_msg void OnBnClickedButtonSo7ManualMachineStopMachine(); + afx_msg void OnBnClickedRadioSo7ManualMachineCommonCmd1(); + afx_msg void OnBnClickedRadioSo7ManualMachineCommonCmd2(); + afx_msg void OnBnClickedRadioSo7ManualMachineCommonCmd3(); + afx_msg void OnBnClickedRadioSo7ManualMachineSendDataTypeHex(); + afx_msg void OnBnClickedRadioSo7ManualMachineSendDataTypeAnscii(); + afx_msg void OnBnClickedButtonSo7ManualMachineSendData(); + afx_msg void OnEnKillfocusEditXScaleCoefficient(); + afx_msg void OnEnKillfocusEditYScaleCoefficient(); + afx_msg void OnEnKillfocusEditZScaleCoefficient(); + afx_msg void OnBnClickedButtonSo7ManualMachineClearMsg(); + afx_msg void OnBnClickedButtonSo7ManualMachineSaveMsg(); + afx_msg void OnBnClickedCancel(); +}; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index 29ca41a..cbe9646 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -3,6 +3,9 @@ #include "stdafx.h" #include "resource.h" + +#include "..\..\..\SevenOcean\CMMIO_SERIAL.H" + #include "..\..\..\SevenOcean\SO7_Proto.h" #include "ProcessButton.h" @@ -29,6 +32,8 @@ #include "afxdialogex.h" #include "So7_Option.h" + +CSerial* m_pSO7_Serial=NULL; CSO7_Proto* m_pSO7_Proto=NULL; CKeyence_Laser* m_pKeyence_Laser=NULL; CKeyence_Laser_LK_H* m_pKeyence_Laser_LK_H=NULL; @@ -92,6 +97,8 @@ BOOL CSo7_Option::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV2000E))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_TC4000))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_KEYENCE_LASER))->SetCheck(TRUE); + ((CButton *)GetDlgItem(IDC_RADIO_SO7_IP_CAMERA))->SetCheck(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO__SO7_RS232))->SetCheck(FALSE); return TRUE; // return TRUE unless you set the focus to a control } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp index 3821f3c..5b3d2af 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.cpp @@ -34,6 +34,7 @@ BEGIN_MESSAGE_MAP(CSo7_Util_ImageDll, CDialog) ON_BN_CLICKED(IDC_BUTTON_IMAGEDLL_STOP_SCAN_LASER, &CSo7_Util_ImageDll::OnBnClickedButtonImagedllStopScanLaser) ON_BN_CLICKED(IDC_BUTTON_IMAGEDLL_GET_SCAN_LASER_DATA, &CSo7_Util_ImageDll::OnBnClickedButtonImagedllGetScanLaserData) ON_BN_CLICKED(IDC_BUTTON_IMAGEDLL_PAUSE_AND_GET_SCAN_LASER_DATA, &CSo7_Util_ImageDll::OnBnClickedButtonImagedllPauseAndGetScanLaserData) + ON_BN_CLICKED(IDC_BUTTON_IMAGEDLL_2LASER_CALCULATE, &CSo7_Util_ImageDll::OnBnClickedButtonImagedll2laserCalculate) END_MESSAGE_MAP() @@ -93,3 +94,85 @@ void CSo7_Util_ImageDll::OnBnClickedButtonImagedllPauseAndGetScanLaserData() { m_pSo7_Interface->PauseScanAndGetData(); } + +//====================================================== +void CSo7_Util_ImageDll::OnBnClickedButtonImagedll2laserCalculate() +{ + CString str; + UpdateData(TRUE); + USES_CONVERSION; + + MY3DPoint Top_Pos[4]; + MY3DPoint Bottom_Pos[4]; + double error[MAX_POINT]={0.0}; + double dis=0.0; + int m_nStep=4; + double coe[4]={0.0}; + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_X1)->GetWindowText(str); + const char* cTempValue=T2A(str); + Top_Pos[0].x=atof(cTempValue); + Bottom_Pos[0].x=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_Y1)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[0].y=atof(cTempValue); + Bottom_Pos[0].y=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_TOPZ1)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[0].z=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ1)->GetWindowText(str); + cTempValue=T2A(str); + Bottom_Pos[0].z=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_X2)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[1].x=atof(cTempValue); + Bottom_Pos[1].x=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_Y2)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[1].y=atof(cTempValue); + Bottom_Pos[1].y=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_TOPZ2)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[1].z=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ2)->GetWindowText(str); + cTempValue=T2A(str); + Bottom_Pos[1].x=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_X3)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[2].x=atof(cTempValue); + Bottom_Pos[2].x=atof(cTempValue); + Top_Pos[3].x=atof(cTempValue); + Bottom_Pos[3].x=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_Y3)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[2].y=atof(cTempValue); + Bottom_Pos[2].y=atof(cTempValue); + Top_Pos[3].y=atof(cTempValue); + Bottom_Pos[3].y=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_TOPZ3)->GetWindowText(str); + cTempValue=T2A(str); + Top_Pos[2].z=atof(cTempValue); + Top_Pos[3].z=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ3)->GetWindowText(str); + cTempValue=T2A(str); + Bottom_Pos[2].z=atof(cTempValue); + Bottom_Pos[3].z=atof(cTempValue); + + GetDlgItem(IDC_EDIT_IMAGEDLL_2LASER_STANDARD_VALUE)->GetWindowText(str); + cTempValue=T2A(str); + + m_pSo7_Interface->Pro_Face_Du(Top_Pos,m_nStep,coe,error,dis); + m_pSo7_Interface->Pro_Face_Du(Bottom_Pos,m_nStep,coe,error,dis); + +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.h index 2825f47..b0fb253 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_ImageDll.h @@ -23,4 +23,5 @@ public: afx_msg void OnBnClickedButtonImagedllStopScanLaser(); afx_msg void OnBnClickedButtonImagedllGetScanLaserData(); afx_msg void OnBnClickedButtonImagedllPauseAndGetScanLaserData(); + afx_msg void OnBnClickedButtonImagedll2laserCalculate(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index 8d330be..ba384c7 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -235,6 +235,7 @@ + @@ -288,6 +289,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 7e2f783..51e7039 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -118,6 +118,9 @@ Sources Files + + Sources Files + @@ -267,6 +270,9 @@ Header Files + + Header Files + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp index 4eb6ddf..e9c1e7c 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.cpp @@ -19,6 +19,8 @@ static const long SharpnessDefault = 4; static BYTE g_DataBuffer[640*480*2]; static BYTE g_DataBuffer_NAV[640*480*2]; +device_handle CVideocard_SV2000E::m_device=NULL; +device_handle CVideocard_SV2000E::m_device_Nav=NULL; // CVideocard_SV2000E dialog IMPLEMENT_DYNAMIC(CVideocard_SV2000E, CDialog) @@ -26,7 +28,6 @@ IMPLEMENT_DYNAMIC(CVideocard_SV2000E, CDialog) CVideocard_SV2000E::CVideocard_SV2000E(CWnd* pParent /*=NULL*/) : CDialog(CVideocard_SV2000E::IDD, pParent) { - m_device=NULL; m_dwCard=0; m_nDevNum=0; m_bMirror=FALSE; @@ -55,6 +56,7 @@ BEGIN_MESSAGE_MAP(CVideocard_SV2000E, CDialog) ON_BN_CLICKED(IDC_RADIO_SV2000E_CHANNEL1, &CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel1) ON_BN_CLICKED(IDC_RADIO_SV2000E_CHANNEL2, &CVideocard_SV2000E::OnBnClickedRadioSv2000eChannel2) ON_CBN_SELCHANGE(IDC_COMBO_SV2000E_SELECT_DEV_NUMBER, &CVideocard_SV2000E::OnCbnSelchangeComboSv2000eSelectDevNumber) + ON_EN_KILLFOCUS(IDC_EDITTC4000_SET_DEINTERLACE, &CVideocard_SV2000E::OnEnKillfocusEdittc4000SetDeinterlace) END_MESSAGE_MAP() @@ -267,7 +269,7 @@ void CVideocard_SV2000E::OpenDevice(unsigned int _DevNo,device_handle &_OpenedDe m_status=DXSetVideoSource(_OpenedDevice, m_Channel); //==============================消除隔行========================================= - m_status=DXSetVideoPara(_OpenedDevice,standard,colorspace,width,height,framerate); + //m_status=DXSetVideoPara(_OpenedDevice,standard,colorspace,width,height,framerate); //================================================================================ m_status=DXSetDisplayPara( _OpenedDevice, BRIGHTNESS, 5000,2); m_status=DXSetDisplayPara( _OpenedDevice, SATURATION, 5000,2); @@ -304,6 +306,30 @@ BOOL CVideocard_SV2000E::UnloadVideocard(device_handle _Device) return TRUE; } //================================================================ +void CVideocard_SV2000E::OnEnKillfocusEdittc4000SetDeinterlace() +{ + CString StrTmp; + ((CEdit*)GetDlgItem(IDC_EDITTC4000_SET_DEINTERLACE))->GetWindowText(StrTmp); + USES_CONVERSION; + const char* cTemp; + cTemp=T2A(StrTmp); + unsigned int iDein=atoi(cTemp); + + if (m_OpenDevNo==0) + { + m_status=DXEnableDeinterlace(m_device,iDein); + } + else if (m_OpenDevNo==1) + { + m_status=DXEnableDeinterlace(m_device_Nav,iDein); + } + else if(m_OpenDevNo==2) + { + m_status=DXEnableDeinterlace(m_device,iDein); + m_status=DXEnableDeinterlace(m_device_Nav,iDein); + } +} +//================================================================ void CVideocard_SV2000E::ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *_pSrcData,ConvertColorType _type,BOOL _bMirror) { int x=0; @@ -593,5 +619,3 @@ unsigned CALLBACK SVAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorS }; - - diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h index 28edb8a..e3ba4da 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Videocard_SV2000E.h @@ -31,8 +31,8 @@ public: afx_msg void OnBnClickedOk(); protected: unsigned int m_status; - device_handle m_device; - device_handle m_device_Nav; + static device_handle m_device; + static device_handle m_device_Nav; int m_nDevNum; DWORD m_dwCard; @@ -56,4 +56,5 @@ public: afx_msg void OnBnClickedRadioSv2000eChannel1(); afx_msg void OnBnClickedRadioSv2000eChannel2(); afx_msg void OnCbnSelchangeComboSv2000eSelectDevNumber(); + afx_msg void OnEnKillfocusEdittc4000SetDeinterlace(); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 332fda5..b85428f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -42,6 +42,7 @@ #define IDD_SO7_UTIL_SETUP_CONFIGURE 164 #define IDD_SO7_UTIL_IMAGE_DLL 165 #define IDD_SO7_VIDEOCARD_TC4000 166 +#define IDD_SO7_UTIL_MANUAL_MACHINE 167 #define IDC_BUTTON_INIT_MVUSB 1001 #define IDC_BUTTON_START_MACHINE 1002 #define IDC_BUTTON_START_POLL_58 1004 @@ -340,8 +341,11 @@ #define IDC_EDIT_REPRETEST 1274 #define IDC_EDIT_FRESHSPEED_X1 1274 #define IDC_EDIT_SO7CONFIG_ZOOM_FASTSPEED 1274 +#define IDC_EDIT_IMAGEDLL_2LASER_TOPZ1 1274 #define IDC_EDIT_FRESHSPEED_X2 1275 +#define IDC_EDIT_IMAGEDLL_2LASER_TOPZ2 1275 #define IDC_EDIT_FRESHSPEED_X3 1276 +#define IDC_EDIT_IMAGEDLL_2LASER_TOPZ3 1276 #define IDC_BUTTON_ZERO_SET 1277 #define IDC_EDIT_FRESHSPEED_X4 1277 #define IDC_EDIT_SAVE_INI_FILE 1278 @@ -472,16 +476,24 @@ #define IDC_CHECK2 1394 #define IDC_CHECK_REVERSE 1394 #define IDC_CHECK_AUTOZOOM_CONTINUE_READ 1394 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM1 1394 #define IDC_BUTTON_MANUAL_HOME 1395 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM2 1395 #define IDC_CHECK_ 1396 #define IDC_CHECK_REPETEST_VOLCOMP 1396 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM3 1396 #define IDC_BUTTON_CALIBRATE_ENCODER 1397 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM4 1397 #define IDC_COMBOREPETEST_FROM 1398 #define IDC_COMBO_REPETEST_FROM 1398 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM5 1398 #define IDC_COMBO_REPETEST_TO 1399 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM6 1399 #define IDC_BUTTON_REPETEST_BEGIN 1400 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM7 1400 #define IDC_EDIT_ZOOM_REPE_TIME 1401 #define IDC_CHECK_REPETESTV 1402 +#define IDC_CHECK_TEST_KEYENCE_LK_G_PROGRAM0 1402 #define IDC_RADIO_MACHINE_ANIMATICS 1403 #define IDC_BUTTON_POS_SET_ZERO 1406 #define IDC_EDIT_ANIMATICS_CMD 1408 @@ -606,6 +618,7 @@ #define IDC_BUTTON_SETUP_SO7CONFIG 1518 #define IDC_BUTTON_SCAN_KEYENCE_LK_GLASER 1518 #define IDC_BUTTON_IMAGEDLL_START_SCAN_LASER 1518 +#define IDC_BUTTON_SO7_MANUAL_MACHINE_START_MACHINE 1518 #define IDC_STATIC_CANVAS 1519 #define IDC_BUTTON_SCAN_KEYENCE_LK_HLASER 1519 #define IDC_BUTTON_STATUS_OVERHEAT_X 1520 @@ -620,6 +633,7 @@ #define IDC_BTN_CONFIGURE_MOVEVOUT 1524 #define IDC_BUTTON_STOP_SCAN_KEYENCE_LK_GLASER 1524 #define IDC_BUTTON_IMAGEDLL_GET_SCAN_LASER_DATA 1524 +#define IDC_BUTTON_SO7_MANUAL_MACHINE_STOP_MACHINE 1524 #define IDC_CUSTOM1 1525 #define IDC_CUSTOM_CANVAS 1525 #define IDC_BUTTON_STOP_SCAN_KEYENCE_LK_HLASER 1525 @@ -658,6 +672,8 @@ #define IDC_RADIO_TEST_IMAGE_DLL 1560 #define IDC_BUTTON3 1562 #define IDC_BUTTON_IMAGEDLL_PAUSE_AND_GET_SCAN_LASER_DATA 1562 +#define IDC_BUTTON_TEST_KEYENCE_SAVE_LOG 1562 +#define IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA 1562 #define IDC_BUTTON_IMAGEDLL_STOP_SCAN_LASER 1563 #define IDC_STATIC_TC4000_PICTURE 1564 #define IDC_RADIO_SO7_IP_CAMERA 1565 @@ -669,14 +685,84 @@ #define IDC_RADIO_SV2000E_CHANNEL2 1571 #define IDC_COMBO_SV200E 1573 #define IDC_COMBO_SV2000E_SELECT_DEV_NUMBER 1573 +#define IDC_EDITTC4000_SET_DEINTERLACE 1574 +#define IDC_EDIT_IMAGEDLL_2LASER_Y1 1575 +#define IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ1 1576 +#define IDC_EDIT_IMAGEDLL_2LASER_STANDARD_VALUE 1577 +#define IDC_EDIT_IMAGEDLL_2LASER_MEASURED_VALUE 1578 +#define IDC_EDIT_IMAGEDLL_2LASER_X1 1579 +#define IDC_EDIT_IMAGEDLL_2LASER_X2 1580 +#define IDC_EDIT_IMAGEDLL_2LASER_Y2 1581 +#define IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ2 1582 +#define IDC_EDIT_IMAGEDLL_2LASER_X3 1583 +#define IDC_EDIT_IMAGEDLL_2LASER_Y3 1584 +#define IDC_EDIT_IMAGEDLL_2LASER_BOTTOMZ3 1585 +#define IDC_BUTTON_IMAGEDLL_2LASER_CALCULATE 1586 +#define IDC_EDIT_IMAGEDLL_2LASER_XSHIFT 1587 +#define IDC_EDIT_IMAGEDLL_2LASER_YSHIFT 1588 +#define IDC_EDIT_TEST_LK_G_INTERVAL 1591 +#define IDC_RADIO__SO7_RS232 1592 +#define IDC_EDIT_SO7_MANUAL_MACHINE_DATA 1598 +#define IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_HEX 1599 +#define IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_ANSCII 1600 +#define IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD1 1601 +#define IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD2 1602 +#define IDC_RADIO_SO7_MANUAL_MACHINE_COMMON_CMD3 1603 +#define IDC_BUTTON_SO7_MANUAL_MACHINE_CLEAR_MSG 1604 +#define IDC_BUTTON_SO7_MANUAL_MACHINE_SAVE_MSG 1605 +#define IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG 1606 +#define IDC_BUTTON_KEYENCE_LASER_CALIBRATE_VALUE 1607 +#define IDC_EDIT_KEYENCE_LASER_CALIBRATE_VALUE 1608 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE0 1609 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE1 1610 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE2 1611 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE0 1612 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT0 1613 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT0 1614 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE0 1615 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE1 1616 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT1 1617 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT1 1618 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE1 1619 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE2 1620 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT2 1621 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT2 1622 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE2 1623 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE3 1624 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE3 1625 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT3 1626 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT3 1627 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE3 1628 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE4 1629 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE4 1630 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT4 1631 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT4 1632 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE4 1633 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE5 1634 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE5 1635 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT5 1636 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT5 1637 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE5 1638 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE6 1639 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE6 1640 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT6 1641 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT6 1642 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE6 1643 +#define IDC_RADIO_TEST_KEYENCE_LK_G_RELATIVE7 1644 +#define IDC_RADIO_TEST_KEYENCE_LK_G_AVERAGE7 1645 +#define IDC_CHECK_TEST_KEYENCE_LK_G_FIRSTOUT7 1646 +#define IDC_CHECK_TEST_KEYENCE_LK_G_SECONDOUT7 1647 +#define IDC_EDIT_TEST_KEYENCE_LK_G_CALIBRATE7 1648 +#define IDC_BUTTONIDC_BUTTON_TEST_KEYENCE_CLEAR_LOG 1649 +#define IDC_BUTTON_TEST_KEYENCE_SET_OUTPUT 1649 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 166 +#define _APS_NEXT_RESOURCE_VALUE 168 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1574 +#define _APS_NEXT_CONTROL_VALUE 1650 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index bf47e022e32c32bedb3716310ee1612e84d2495a..8713f1a82d35ad0993503cf9d30db141352bfe74 100644 GIT binary patch literal 1202176 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 zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+ z$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRC ziku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWH zr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hH za*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPRO zBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>l zDRPROBB#hHa*CWHr^qRCiku>+$SHD)oFb>lDRPROBB#hHa*CWHr^qRCiku>+$SHD) zoFb>lDRPROBB#hHa*CWD!g3lM-XSHKvHq0_J5~&pLWN+WkPHQ*Q6nBK6k_pUY;-Ja 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