From 0661d123e9454ff280a9959d6b9980b07612a995 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Wed, 11 Jun 2014 22:03:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=A4=96=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h | 5 + .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 61 +++++++-- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h | 4 +- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 57 +++++++++ .../Tools/UsbUtility/Debug/Utility_Config.ini | 12 +- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 5 +- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 121 ++++++++++++++++-- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h | 3 + .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 5 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 150016 -> 150016 bytes 10 files changed, 240 insertions(+), 33 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h index cb0fc36..b40e826 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h @@ -351,6 +351,11 @@ enum PRO_DATA CT_START_TRIG_PULSE, CT_STOP_TRIG_PULSE, + CT_SET_IO_PURPOSE, + + CT_SET_TRIG_SAMPLE_CNT, + CT_GET_TRIG_SAMPLE_CNT, + CT_DATA_TOTAL=255 }; enum EHOME_MODE diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index 650ffd6..393caa1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -6115,12 +6115,15 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_READ_TRIG_PULSE_PARA(short ParaI ReleaseMutex(g_hEP02_Serial_Mutex); return SSI_STATUS_MOTION_NORMAL; } +static char caxis=1; //============================================================== SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_WRITE_TRIG_PULSE_PARA(char ActiveAxis,char TrigMode,short StartIndex,short ParaNumber,short* Para) { + caxis=ActiveAxis; WaitForSingleObject(g_hEP02_Serial_Mutex, INFINITE); memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE); char cBuff(0); + short sPara(0); *(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA; *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_WRITE_TRIG_PULSE_PARA; *(ep_buff[EP_02_CMD_IDX]._buffer+2) = ActiveAxis; @@ -6136,12 +6139,26 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_WRITE_TRIG_PULSE_PARA(char Activ int j=8; for (short i=0;i>8) & 0x0ff; - *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; - j++; - cBuff = Para[i] & 0x0ff; - *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; - j++; + if (Para[i]<0) + { + sPara=-Para[i]; + cBuff = (sPara>>8) & 0x0ff; + cBuff = cBuff | 0x80; + *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; + j++; + cBuff = sPara & 0x0ff; + *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; + j++; + } + else + { + cBuff = (Para[i]>>8) & 0x0ff; + *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; + j++; + cBuff = Para[i] & 0x0ff; + *(ep_buff[EP_02_CMD_IDX]._buffer+j) = cBuff; + j++; + } } ep_buff[EP_02_CMD_IDX]._size = j; ep_buff[EP_82_DATA_IDX]._size = 0x02; @@ -6160,7 +6177,7 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_TRIG_PULSE_START() *(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA; *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_START_TRIG_PULSE; - *(ep_buff[EP_02_CMD_IDX]._buffer+2)=0; + *(ep_buff[EP_02_CMD_IDX]._buffer+2)=caxis; ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x00; @@ -6178,7 +6195,7 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_TRIG_PULSE_STOP() *(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA; *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_STOP_TRIG_PULSE; - *(ep_buff[EP_02_CMD_IDX]._buffer+2)=0; + *(ep_buff[EP_02_CMD_IDX]._buffer+2)=caxis; ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x00; @@ -6188,9 +6205,30 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_TRIG_PULSE_STOP() ReleaseMutex(g_hEP02_Serial_Mutex); return SSI_STATUS_MOTION_NORMAL; } +//============================================================== +SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_IO_PURPOSE(BOOL _bEnTrigIO) +{ + WaitForSingleObject(g_hEP02_Serial_Mutex, INFINITE); + memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE); + *(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA; + *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_SET_IO_PURPOSE; + if (_bEnTrigIO) + { + *(ep_buff[EP_02_CMD_IDX]._buffer+2)=1; + } + else + { + *(ep_buff[EP_02_CMD_IDX]._buffer+2)=0; + } + ep_buff[EP_02_CMD_IDX]._size = 0x03; + ep_buff[EP_81_DATA_IDX]._size = 0x00; - + g_hEP02_Thread_State=THREAD_RUNNING_STATE2; + _do_single_threaded_usb_comm(EP_02_CMD_IDX); + ReleaseMutex(g_hEP02_Serial_Mutex); + return SSI_STATUS_MOTION_NORMAL; +} //============================================================== SSI_STATUS_MOTION CSO7_Proto::_process_SO7_CMD_MOVE_X() { @@ -6571,6 +6609,11 @@ SSI_STATUS_MOTION CSO7_Proto::_process_SO7_CMD_READ_TRIG_PULSE_PARA() g_machine.TrigPara.TrigCurPara._char_[2]=0; g_machine.TrigPara.TrigCurPara._char_[3]=0; index++; + if (g_machine.TrigPara.TrigCurPara._long_>32768) + { + g_machine.TrigPara.TrigCurPara._long_-=32768; + g_machine.TrigPara.TrigCurPara._long_*=-1; + } return SSI_STATUS_MOTION_NORMAL; } //============================================================== diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h index 0d66fee..17864a4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h @@ -85,7 +85,8 @@ enum ESO7_AXIS_TYPE { E_AXIS_Y=1, E_AXIS_X=2, - E_AXIS_Z=3 + E_AXIS_Z=3, + E_AXIS_V=4 }; enum ESO7_WRITE_FPGA_DATA_ADDR { @@ -545,6 +546,7 @@ public: SSI_STATUS_MOTION _send_cmd_SO7_CMD_WRITE_TRIG_PULSE_PARA(char ActiveAxis,char TrigMode,short StartIndex,short ParaNumber,short* Para); SSI_STATUS_MOTION _send_cmd_SO7_CMD_TRIG_PULSE_START(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_TRIG_PULSE_STOP(); + SSI_STATUS_MOTION _send_cmd_SO7_CMD_IO_PURPOSE(BOOL _bEnTrigIO); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_X(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index e105972..3902d58 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -4585,3 +4585,60 @@ Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini index 5456e4c..eadf6ff 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini @@ -17,11 +17,11 @@ SPEED_START_X1=20 SPEED_FRESH_X1=8 SPEED_SLOW_X1=3.000 ; -SPEED_BASE_X2=16 +SPEED_BASE_X2=8 SPEED_MAX_X2=10 -SPEED_START_X2=12 +SPEED_START_X2=10 SPEED_FRESH_X2=10 -SPEED_SLOW_X2=2.000 +SPEED_SLOW_X2=0.500 ; SPEED_BASE_X3=2 SPEED_MAX_X3=0 @@ -47,11 +47,11 @@ SPEED_START_Y1=20 SPEED_FRESH_Y1=8 SPEED_SLOW_Y1=2.000 ; -SPEED_BASE_Y2=16 +SPEED_BASE_Y2=8 SPEED_MAX_Y2=10 -SPEED_START_Y2=12 +SPEED_START_Y2=10 SPEED_FRESH_Y2=10 -SPEED_SLOW_Y2=1.000 +SPEED_SLOW_Y2=0.500 ; SPEED_BASE_Y3=2 SPEED_MAX_Y3=0 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 e54e45c..6079480 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 @@ -59,7 +59,7 @@ BEGIN PUSHBUTTON "Read XYZ Axis",IDC_BUTTON_SO7_READ_AXIS_XYZ,104,24,60,15 PUSHBUTTON "EnProbe OFF",IDC_BUTTON_READ_PROBE,104,45,60,15 PUSHBUTTON "Read V Axis",IDC_BUTTON_SO7_READ_AXIS_V,167,24,60,15 - PUSHBUTTON "Get Fixture Value",IDC_BUTTON_GET_FIXTURE_FLAG,104,66,60,15 + PUSHBUTTON "Get Fixture Value",IDC_BUTTON_GET_FIXTURE_FLAG,104,66,24,15,NOT WS_VISIBLE PUSHBUTTON "Get Reset Flag",IDC_BUTTON_SO7_GET_RESET_FLAG,104,87,60,15 EDITTEXT IDC_EDIT_AXIAL_LIGHT,333,26,29,12,ES_AUTOHSCROLL | NOT WS_TABSTOP EDITTEXT IDC_EDIT_BOTTOM_LIGHT,333,40,29,12,ES_AUTOHSCROLL | NOT WS_TABSTOP @@ -89,7 +89,7 @@ BEGIN EDITTEXT IDC_EDIT_Z_SCALE_COEFFICIENT,155,290,39,12,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_SET_VER_NO,261,25,29,14,ES_AUTOHSCROLL GROUPBOX "USB Control",IDC_STATIC,17,12,81,59 - GROUPBOX "Config",IDC_STATIC,17,130,116,44 + GROUPBOX "Config",IDC_STATIC,17,129,116,44 LTEXT "Ver NO.",IDC_STATIC,232,27,26,8 GROUPBOX "R/W Data",IDC_STATIC,301,211,144,54 CONTROL "X",IDC_RADIO_SELECT_X,"Button",BS_AUTORADIOBUTTON | WS_GROUP,307,224,20,10 @@ -179,6 +179,7 @@ BEGIN EDITTEXT IDC_EDIT_SO7_TRIGPULSE_DIS2,184,155,36,14,ES_AUTOHSCROLL PUSHBUTTON "确定",IDC_BUTTON_SET_SCALE_COEFFICIENT,202,285,34,19 GROUPBOX "光栅尺分辨率(μm)",IDC_STATIC,18,277,223,31 + PUSHBUTTON "General IO",IDC_BUTTON_S07_SET_IO_PURPOSE,104,65,60,15 END IDD_SO7_UTIL_SEND_PARAMETER DIALOGEX 0, 0, 750, 480 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 d6aa4cd..3a7624a 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 @@ -43,6 +43,7 @@ IMPLEMENT_DYNAMIC(CSO7_UtilDlg, CDialog) m_ZsignalPosY=0; m_ZsignalPosZ=0; m_bEnProbe=false; + m_bETrigIO=FALSE; m_ReadAxisIntervalTime=150; m_IOAddr=0; } @@ -141,6 +142,7 @@ BEGIN_MESSAGE_MAP(CSO7_UtilDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON_SO7_TRIGPULSE_WRITE_PARA, &CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseWritePara) ON_BN_CLICKED(IDC_BUTTON_SO7_TRIGPULSE_READ_PARA, &CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseReadPara) ON_BN_CLICKED(IDC_BUTTON_SET_SCALE_COEFFICIENT, &CSO7_UtilDlg::OnBnClickedButtonSetScaleCoefficient) + ON_BN_CLICKED(IDC_BUTTON_S07_SET_IO_PURPOSE, &CSO7_UtilDlg::OnBnClickedButtonS07SetIoPurpose) END_MESSAGE_MAP() @@ -335,7 +337,8 @@ void CSO7_UtilDlg::UpdateCtrlsStatus(bool _bEnable) GetDlgItem(IDC_BUTTON_SO7_READ_IN_PORT_STATUS)->EnableWindow(_bEnable); GetDlgItem(IDC_CHECK_CONTINUOUS_READ_IO_STATUS)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_TEST_Z_SIGNAL)->EnableWindow(_bEnable); - + GetDlgItem(IDC_BUTTON_S07_SET_IO_PURPOSE)->EnableWindow(_bEnable); + GetDlgItem(IDC_EDIT_SET_VER_NO)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_CNC_PROGRAM)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_SENDDATATOFPGA)->EnableWindow(_bEnable); @@ -426,13 +429,24 @@ void CSO7_UtilDlg::OnBnClickedButtonStartSo7machine() m_pSO7_Proto->_send_cmd_SO7_CMD_GET_RESET_FLAG(); if(m_pSO7_Proto->g_machine.IsSupportReadInterrputMsg) { - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); + + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(E_AXIS_V,9); + char cData[2]={0}; + cData[0]=(m_pSO7_Proto->g_machine.FPGAData>>4)&0x0f; + cData[1]=m_pSO7_Proto->g_machine.FPGAData&0x0f; CStringA csTmp(""); - csTmp.Format(("Firmware Version:[%s]"),m_pSO7_Proto->g_machine.FirmwareInfo); + csTmp.Format(("Firmware Version:[ARM %s] [FPGA %d.%02d]"), + m_pSO7_Proto->g_machine.FirmwareInfo,cData[0],cData[1]); m_OutMessage=csTmp; OutputWithScroll(m_OutMessage,m_edMSG); m_pSO7_Proto->_send_cmd_SO7_CMD_SET_GET_INTERRUPT_MSG_METHOD(m_pSO7_Proto->g_machine.s_machine_config.motion.GetInterruptMsgMethod); } + else + { + m_OutMessage=_T("Firmware Version:[UNKNOWN]"); + OutputWithScroll(m_OutMessage,m_edMSG); + } UpdateCtrlsStatus(true); SetTimer(1, m_ReadAxisIntervalTime, 0); m_OutMessage.Format(_T("%d"),m_ReadAxisIntervalTime); @@ -456,7 +470,7 @@ void CSO7_UtilDlg::OnBnClickedButtonStopSo7machine() m_OutMessage = _T("Machine Stoped."); OutputWithScroll(m_OutMessage,m_edMSG); UpdateCtrlsStatus(false); - KillTimer(1); + m_KillTimer(); if(m_pSO7_Proto->g_machine.IsSupportReadInterrputMsg) { m_pSO7_Proto->_send_cmd_SO7_CMD_SET_GET_INTERRUPT_MSG_METHOD(E_GET_INTERRUPT_MSG_INTERRUPT); @@ -596,6 +610,21 @@ void CSO7_UtilDlg::OnBnClickedButtonReadProbe() //GetDlgItem(IDC_EDIT_Z_POSITION_59)->SetWindowText(m_Z_Pos); } +void CSO7_UtilDlg::OnBnClickedButtonS07SetIoPurpose() +{ + if(!m_bETrigIO) + { + m_bETrigIO=TRUE; + m_pSO7_Proto->_send_cmd_SO7_CMD_IO_PURPOSE(m_bETrigIO); + GetDlgItem(IDC_BUTTON_S07_SET_IO_PURPOSE)->SetWindowText(_T("Trigger IO")); + } + else + { + m_bETrigIO=FALSE; + m_pSO7_Proto->_send_cmd_SO7_CMD_IO_PURPOSE(m_bETrigIO); + GetDlgItem(IDC_BUTTON_S07_SET_IO_PURPOSE)->SetWindowText(_T("General IO")); + } +} void CSO7_UtilDlg::OnBnClickedButtonSo7ReadAxisV() { m_pSO7_Proto->_send_cmd_SO7_CMD_READ_V_DATA(); @@ -942,7 +971,7 @@ void CSO7_UtilDlg::OnBnClickedButtonSetOutPort() } void CSO7_UtilDlg::OnBnClickedButtonMotionParameter() { - KillTimer(1); + m_KillTimer(); if(!g_pVolComp) g_pVolComp=new CSO7_VolComp(); @@ -963,7 +992,7 @@ void CSO7_UtilDlg::OnBnClickedButtonMotionParameter() //=================================================== void CSO7_UtilDlg::OnBnClickedButtonSetupSo7config() { - KillTimer(1); + m_KillTimer(); if (!m_pSO7_AutoZoom) m_pSO7_AutoZoom = new CAutoZoom(); @@ -1362,6 +1391,20 @@ void CSO7_UtilDlg::UpdateIOStatus() ((CMFCButton*)GetDlgItem(IDC_MFCBUTTON_STATUS_IN_PORT6))->SetFaceColor(ColorOFF); } } +//================================================================================================ +void CSO7_UtilDlg::m_KillTimer(int nIDEvent) +{ + if (nIDEvent>0) + { + KillTimer(nIDEvent); + } + else + { + KillTimer(1); + KillTimer(2); + } +} + //================================================================================================ void CSO7_UtilDlg::OnTimer(UINT_PTR nIDEvent) { @@ -1429,6 +1472,42 @@ void CSO7_UtilDlg::OnTimer(UINT_PTR nIDEvent) } break; } + case 2: + { + CString strOutput; + BYTE cdata[5]={0}; + char ActiveAxis; + if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_X))->GetCheck()) + { + ActiveAxis=E_AXIS_X; + strOutput=_T("[TrigX]"); + } + else if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_Y))->GetCheck()) + { + ActiveAxis=E_AXIS_Y; + strOutput=_T("[TrigY]"); + } + else if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_Z))->GetCheck()) + { + ActiveAxis=E_AXIS_Z; + strOutput=_T("[TrigZ]"); + } + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(ActiveAxis,12); + cdata[0]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(ActiveAxis,10); + cdata[1]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(ActiveAxis,13); + cdata[2]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(ActiveAxis,14); + cdata[3]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(ActiveAxis,15); + cdata[4]=static_cast(m_pSO7_Proto->g_machine.FPGAData); + + m_OutMessage.Format(_T("(%02X %02X) %02X %02X %02X.\r\n"),cdata[0],cdata[1],cdata[2],cdata[3],cdata[4]); + strOutput += m_OutMessage; + OutputWithScroll(strOutput,m_edMSG); + break; + } } CDialog::OnTimer(nIDEvent); @@ -1470,7 +1549,7 @@ void CSO7_UtilDlg::OutputWithScroll(const CString &strNewText,CEdit &edtOutput) void CSO7_UtilDlg::OnBnClickedButtonSo7CncProgram() { - KillTimer(1); + m_KillTimer(); BOOL bCancel(FALSE); if (!m_pSO7_Proto->so7_motion_is_homed()) { @@ -1506,11 +1585,13 @@ void CSO7_UtilDlg::OnBnClickedButtonSo7CncProgram() void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseStart() { m_pSO7_Proto->_send_cmd_SO7_CMD_TRIG_PULSE_START(); + SetTimer(2,200,NULL); } //====================================================== void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseStop() { m_pSO7_Proto->_send_cmd_SO7_CMD_TRIG_PULSE_STOP(); + m_KillTimer(2); } //====================================================== void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseWritePara() @@ -1518,10 +1599,23 @@ void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseWritePara() UpdateData(TRUE); USES_CONVERSION; short TrigDis[2]={0}; - char ActiveAxis(E_ACTIVE_AXIS_X); + char ActiveAxis(E_AXIS_X); char TrigMode(E_DIS_TRIG_PULSE_EQDIS); short StartIndex(0); short ParaNumber(0); + if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_X))->GetCheck()) + { + ActiveAxis=E_AXIS_X; + } + else if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_Y))->GetCheck()) + { + ActiveAxis=E_AXIS_Y; + } + else if (((CButton *)GetDlgItem(IDC_RADIO_SELECT_Z))->GetCheck()) + { + ActiveAxis=E_AXIS_Z; + } + CString csText(_T("")); GetDlgItem(IDC_EDIT_SO7_TRIGPULSE_DIS)->GetWindowText(csText); const char* cTxt=T2A(csText); @@ -1548,15 +1642,15 @@ void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseWritePara() //====================================================== void CSO7_UtilDlg::OnBnClickedButtonSo7TrigpulseReadPara() { - UpdateData(TRUE); USES_CONVERSION; - short GetIndex(0); + short GetIndex(256); m_pSO7_Proto->_send_cmd_SO7_CMD_READ_TRIG_PULSE_PARA(GetIndex); - m_OutMessage.Format(_T("[Read Trig Para]:R Axis=%d,Method=%d,TotalNo=%d,CurIndex=%d,CurPara=%d."),m_pSO7_Proto->g_machine.TrigPara.TrigPulseActiveAxis, + m_OutMessage.Format(_T("[Read Trig Para]:R Axis=%d,Method=%d,TotalNo=%d,CurIndex=%d,Para[%d]=%d."),m_pSO7_Proto->g_machine.TrigPara.TrigPulseActiveAxis, m_pSO7_Proto->g_machine.TrigPara.TrigPulseMethod,m_pSO7_Proto->g_machine.TrigPara.TrigTotalNo, - m_pSO7_Proto->g_machine.TrigPara.TrigCurIndex,m_pSO7_Proto->g_machine.TrigPara.TrigCurPara); + m_pSO7_Proto->g_machine.TrigPara.TrigCurIndex,m_pSO7_Proto->g_machine.TrigPara.TrigCurIndex, + m_pSO7_Proto->g_machine.TrigPara.TrigCurPara); OutputWithScroll(m_OutMessage,m_edMSG); } //====================================================== @@ -1571,4 +1665,5 @@ void CSO7_UtilDlg::OnBnClickedButtonSetScaleCoefficient() cTempValue=T2A(m_cs_ZScaleCoeff); m_pSO7_Proto->g_machine.s_machine_config.z_axis._scale_resolution = atof(cTempValue); m_pSO7_Proto->Save_So7_Config(); -} \ No newline at end of file +} + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h index 1cf1b40..3a4395e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h @@ -65,6 +65,7 @@ public: long m_ZsignalPosZ; char m_HomeMode; bool m_bEnProbe; + BOOL m_bETrigIO; INT m_ReadAxisIntervalTime; BYTE m_IOStatus[4]; INT m_IOAddr; @@ -72,6 +73,7 @@ public: void UpdateIOAddrCaption(int _type=0); void TestZSignal(); void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); + void m_KillTimer(int nIDEvent=0); afx_msg void OnBnClickedButtonInitSo7usb(); afx_msg void OnBnClickedButtonTermSo7usb(); afx_msg void OnBnClickedButtonStartSo7machine(); @@ -132,4 +134,5 @@ public: afx_msg void OnBnClickedButtonSo7TrigpulseWritePara(); afx_msg void OnBnClickedButtonSo7TrigpulseReadPara(); afx_msg void OnBnClickedButtonSetScaleCoefficient(); + afx_msg void OnBnClickedButtonS07SetIoPurpose(); }; 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 32341c7..728508f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -889,7 +889,6 @@ #define IDC_BUTTON_STIL_LASER_INIT 1794 #define IDC_COMBO_RWDATA_ADDR 1795 #define IDC_BTN_KEYENCE_LKG5000_ETHERNET_CONNECT2 1795 -#define IDC_BUTTON_STIL_LASER_INIT2 1795 #define IDC_BUTTON_STIL_LASER_SET_MODE 1795 #define IDC_EDIT_MOTION_SPEEDY 1796 #define IDC_COMBO_OUTPORT_NUMBER 1796 @@ -1001,6 +1000,8 @@ #define IDC_EDIT_STIL_LASER_VALUE1 1861 #define IDC_EDIT_STIL_MESSAGE 1862 #define IDC_BUTTON_STIL_CLEAR_LOG 1863 +#define IDC_BUTTON6 1864 +#define IDC_BUTTON_S07_SET_IO_PURPOSE 1864 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -1010,7 +1011,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 191 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1864 +#define _APS_NEXT_CONTROL_VALUE 1865 #define _APS_NEXT_SYMED_VALUE 104 #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 c392d70263b622cd53ccc302f025952dd1880e61..a7ae33818b0789cc26c20ec334d97594decbe75f 100644 GIT binary patch delta 5190 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