From 684c0c9761e9213881352aebb723e48a71fc9bb1 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 10 Mar 2014 12:19:35 +0800 Subject: [PATCH] =?UTF-8?q?Remove=20bug=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 43 +++-- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 80 ++++++++ .../Tools/UsbUtility/Debug/Utility_Config.ini | 12 +- .../Tools/UsbUtility/UsbUtil/Mv_MainDlg.cpp | 6 +- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 11 +- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 13 ++ .../UsbUtility/UsbUtil/So7_XBoxController.cpp | 177 ++++++++++-------- .../UsbUtility/UsbUtil/So7_XBoxController.h | 12 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 9 files changed, 243 insertions(+), 111 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index fd1ca0f..d6f6a5e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -39,11 +39,11 @@ unsigned __stdcall CSO7_Proto::g_EP02_Thread(LPVOID pThis) CSO7_Proto* _This = (CSO7_Proto*)pThis; for (;;) { - TRACE0("g_hEP02_Thread in loop set.\n"); + //TRACE0("g_hEP02_Thread in loop set.\n"); if (g_hEP02_Thread_State == THREAD_EXIT) ExitThread(0); WaitForSingleObject(ep_buff[EP_02_CMD_IDX]._event,INFINITE); - TRACE0("g_hEP02_Thread obtained event.\n"); + //TRACE0("g_hEP02_Thread obtained event.\n"); switch (g_hEP02_Thread_State) { case THREAD_EXIT: @@ -54,16 +54,16 @@ unsigned __stdcall CSO7_Proto::g_EP02_Thread(LPVOID pThis) break; case THREAD_RUNNING_STATE1: { - TRACE0("g_hEP02_Thread calling _send_usb_cmd. EP_S07_02; \n"); + //TRACE0("g_hEP02_Thread calling _send_usb_cmd. EP_S07_02; \n"); _This->_send_usb_cmd(EP_02_CMD_IDX); - TRACE0("g_hEP02_Thread return _send_usb_cmd. EP_S07_02; \n"); + //TRACE0("g_hEP02_Thread return _send_usb_cmd. EP_S07_02; \n"); break; } case THREAD_RUNNING_STATE2: { - TRACE0("g_hSerialUsbThread processing _write_usb_data_only();\n"); + //TRACE0("g_hSerialUsbThread processing _write_usb_data_only();\n"); _This->_write_usb_data_only(EP_02_CMD_IDX); - TRACE0("g_hSerialUsbThread return from _write_usb_data_only();\n"); + //TRACE0("g_hSerialUsbThread return from _write_usb_data_only();\n"); break; } default: @@ -82,11 +82,11 @@ unsigned __stdcall CSO7_Proto::g_EP8x_Thread(LPVOID pThis) CSO7_Proto* _This = (CSO7_Proto*)pThis; for (;;) { - TRACE0("g_hEP8x_Thread_State in loop set.\n"); + //TRACE0("g_hEP8x_Thread_State in loop set.\n"); if (g_hEP8x_Thread_State == THREAD_EXIT) ExitThread(0); WaitForSingleObject(ep_buff[EP_82_DATA_IDX]._event, INFINITE); - TRACE0("g_hEP8x_Thread_State obtained event.\n"); + //TRACE0("g_hEP8x_Thread_State obtained event.\n"); switch (g_hEP8x_Thread_State) { case THREAD_EXIT: @@ -288,8 +288,7 @@ void CSO7_Proto::_process_rcv_transfer_data(int iEP) break; }; } - - TRACE0("_process_rcv_transfer_data() : Update EP_82_DATA_IDX status.\r\n"); + //TRACE0("_process_rcv_transfer_data() : Update EP_82_DATA_IDX status.\r\n"); break; case EP_02_CMD_IDX : TRACE0("_process_rcv_transfer_data() : Update EP_02_CMD_IDX.\r\n"); @@ -2833,14 +2832,14 @@ SSI_STATUS_MOTION CSO7_Proto::Exit_SO7Usb() //****************************************************************************** SSI_STATUS_MOTION CSO7_Proto::_do_single_threaded_usb_comm(int iEP_Base) { - TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hEP01_Thread_Event. %x\n", iEP_Base); + //TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hEP01_Thread_Event. %x\n", iEP_Base); while ((ep_buff[iEP_Base]._hProtoPending == TRUE) || (ep_buff[iEP_Base+1]._hProtoPending == TRUE)) { ASSERT(0); Sleep(3); } ep_buff[iEP_Base]._hProtoPending = ep_buff[iEP_Base+1]._hProtoPending = TRUE; - TRACE1("=====_do_single_threaded_usb_comm(iEP_Base) SetEvent(g_hEP01_Thread_Event): %X \r\n", ep_buff[iEP_Base]._save_send_cmd); + //TRACE1("=====_do_single_threaded_usb_comm(iEP_Base) SetEvent(g_hEP01_Thread_Event): %X \r\n", ep_buff[iEP_Base]._save_send_cmd); if (iEP_Base == EP_01_CMD_IDX) SetEvent(ep_buff[EP_82_DATA_IDX]._event); else @@ -2849,7 +2848,7 @@ SSI_STATUS_MOTION CSO7_Proto::_do_single_threaded_usb_comm(int iEP_Base) { Sleep(3); } - TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hProtoDoneEvents. %x\n", iEP_Base); + //TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hProtoDoneEvents. %x\n", iEP_Base); return SSI_STATUS_MOTION_NORMAL; } @@ -2892,7 +2891,7 @@ SSI_STATUS_MOTION CSO7_Proto::_read_data_8x(int iEP_Base) } if (iEP_Base == EP_82_DATA_IDX) { - TRACE2("_read_data_81() iEP : %X - ep_buff[iEP]._size : %X \r\n", iEP_Base, ep_buff[iEP_Base]._size); + //TRACE2("_read_data_81() iEP : %X - ep_buff[iEP]._size : %X \r\n", iEP_Base, ep_buff[iEP_Base]._size); int _ret; _ret = usb_bulk_read(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 5000); if (_ret > 0) @@ -2910,7 +2909,7 @@ SSI_STATUS_MOTION CSO7_Proto::_read_data_8x(int iEP_Base) } else { - TRACE2("_read_data_81() iEP : %X - ep_buff[iEP]._size : %X \r\n", iEP_Base, ep_buff[iEP_Base]._size); + //TRACE2("_read_data_81() iEP : %X - ep_buff[iEP]._size : %X \r\n", iEP_Base, ep_buff[iEP_Base]._size); int _ret; _ret = usb_interrupt_read(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 20); if (_ret > 0) @@ -2945,7 +2944,7 @@ SSI_STATUS_MOTION CSO7_Proto::_send_usb_cmd(int iEP_Base) ep_buff[iEP_Base]._save_send_cmd0 = ep_buff[iEP_Base]._buffer[1]; ep_buff[iEP_Base]._save_send_cmd1 = ep_buff[iEP_Base]._buffer[2]; - TRACE3("_send_usb_cmd() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[iEP_Base]._save_send_cmd, ep_buff[iEP_Base]._buffer[0]); + //TRACE3("_send_usb_cmd() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[iEP_Base]._save_send_cmd, ep_buff[iEP_Base]._buffer[0]); _ret = usb_bulk_write(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 50); if (_ret < 0) @@ -2977,7 +2976,7 @@ SSI_STATUS_MOTION CSO7_Proto::_write_usb_data_only(int iEP_Base) ep_buff[iEP_Base]._save_send_cmd0 = ep_buff[iEP_Base]._buffer[1]; ep_buff[iEP_Base]._save_send_cmd1 = ep_buff[iEP_Base]._buffer[2]; - TRACE3("_send_usb_cmd() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[iEP_Base]._save_send_cmd, ep_buff[iEP_Base]._buffer[0]); + //TRACE3("_send_usb_cmd() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[iEP_Base]._save_send_cmd, ep_buff[iEP_Base]._buffer[0]); _ret = usb_bulk_write(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 50); if (_ret < 0) @@ -3464,6 +3463,8 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_X(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_MOVEX; *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; + TRACE1("[MOVE_X]:%d\n",SpeedGear); + ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; @@ -3483,6 +3484,8 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_Y(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_MOVEY; *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; + TRACE1("[MOVE_Y]:%d\n",SpeedGear); + ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; @@ -3502,6 +3505,8 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_Z(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_MOVEZ; *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; + TRACE1("[MOVE_Z]:%d\n",SpeedGear); + ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; @@ -3539,6 +3544,8 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_STOP_MOVE_XYZ() *(ep_buff[EP_02_CMD_IDX]._buffer) = CT_MOTOR; *(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_STOPA; *(ep_buff[EP_02_CMD_IDX]._buffer+2)=0x00; + + TRACE("[STOP_XYZ]"); ep_buff[EP_02_CMD_IDX]._size = 0x04; ep_buff[EP_81_DATA_IDX]._size = 0x04; @@ -4687,7 +4694,7 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_XY(char SpeedGearX,char Spe *(ep_buff[EP_02_CMD_IDX]._buffer+2)=SpeedGearX; *(ep_buff[EP_02_CMD_IDX]._buffer+3)=SpeedGearY; - TRACE2("--MOVEXY--[X]:%d;[Y]:%d.\r\n",SpeedGearX,SpeedGearY); + TRACE2("[MOVE_XY]:X %d;Y %d.\n",SpeedGearX,SpeedGearY); ep_buff[EP_02_CMD_IDX]._size = 0x04; ep_buff[EP_81_DATA_IDX]._size = 0x45; 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 eef606f..17a91ef 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -3882,3 +3882,83 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Destruct Cso7_Proto. +Construct Cso7_Proto. +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. 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 116d353..b4fcdf7 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 @@ -11,11 +11,11 @@ MOVETOSPEED_FAST_Z=0.00000000 MOVETOSPEED_SLOW_Z=0.00000000 MOVETOSPEED_SCALE_Z=1.00000000 ; -SPEED_BASE_X1=28 +SPEED_BASE_X1=20 SPEED_MAX_X1=20 SPEED_START_X1=20 SPEED_FRESH_X1=8 -SPEED_SLOW_X1=3.400 +SPEED_SLOW_X1=3.299 ; SPEED_BASE_X2=16 SPEED_MAX_X2=10 @@ -102,12 +102,12 @@ SPEED_FRESH_Z5=10 SPEED_SLOW_Z5=0.100 ; X_MOTOR_PRECISION=0.004 -Y_MOTOR_PRECISION=0.009 +Y_MOTOR_PRECISION=0.008 Z_MOTOR_PRECISION=0.004 ; -X_MOTOR_WHEELBASE=1.500 -Y_MOTOR_WHEELBASE=1.500 -Z_MOTOR_WHEELBASE=1.500 +X_MOTOR_WHEELBASE=1.200 +Y_MOTOR_WHEELBASE=1.200 +Z_MOTOR_WHEELBASE=1.200 ; MOTOR_PULSE_NUM=10000 ; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_MainDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_MainDlg.cpp index 9164d96..a1bd7d7 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_MainDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_MainDlg.cpp @@ -18,8 +18,8 @@ #include "So7_Option.h" #include "..\..\..\Tesa\TesaStarE.h" #include "TestTesaStarEDialog.h" -#include "Mv_MainDlg.h" #include "KeyenceTM065_Dlg.h" +#include "Mv_MainDlg.h" CMv_Proto *m_pMv_Proto = NULL; CKeyenceTM065_Proto *m_pKeyenceTM065_Proto = NULL; @@ -152,10 +152,10 @@ BOOL CMv_MainDlg::OnInitDialog() { ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_MITUTOYO))->SetCheck(false); ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_MICROVU))->SetCheck(false); - ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_SevenOcean))->SetCheck(false); + ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_SevenOcean))->SetCheck(true); ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_TM_065))->SetCheck(false); ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_ANIMATICS))->SetCheck(false); - ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_TESASTARE))->SetCheck(true); + ((CButton *)GetDlgItem(IDC_RADIO_MACHINE_TESASTARE))->SetCheck(false); ((CButton *)GetDlgItem(IDC_BUTTON_PROTOCOL_ANALYZER))->EnableWindow(true); ((CButton *)GetDlgItem(IDC_BUTTON_FILE_UTILITIES))->EnableWindow(true); 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 249b73f..a4e24de 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 @@ -21,8 +21,8 @@ #include "EditableListCtrl.h" #include "SetSo7MotionConfig.h" #include "So7_Config_Pages.h" -#include "SO7_UtilDlg.h" #include "So7_XBoxController.h" +#include "SO7_UtilDlg.h" // CSO7_UtilDlg ΆΤ»°Ώς #define HBIT0 0X01 @@ -36,10 +36,10 @@ extern CPSerial* m_pSO7_PCDSerial; extern CSO7_Proto* m_pSO7_Proto; +extern CXBOXController* XBoxPlayer; CLogger* g_pLoggerDebug=NULL; CSO7_VolComp* g_pVolComp=NULL; CAutoZoom* m_pSO7_AutoZoom=NULL; -CXBOXController* XBoxPlayer = new CXBOXController(1); IMPLEMENT_DYNAMIC(CSO7_UtilDlg, CDialog) CSO7_UtilDlg::CSO7_UtilDlg(CWnd* pParent /*=NULL*/) @@ -414,7 +414,14 @@ void CSO7_UtilDlg::OnBnClickedButtonStartSo7machine() if(XBoxPlayer->IsConnected()) { XBoxPlayer->XBoxControllerInit(); + m_OutMessage=_T("XBoxController has connected."); + OutputWithScroll(m_OutMessage,m_edMSG); } + else + { + m_OutMessage=_T("XBoxController connection fails."); + OutputWithScroll(m_OutMessage,m_edMSG); + } m_pSO7_Proto->Load_So7_Config(); //m_pSO7_Proto->so7_motion_startup(0.5, 0.5, 0.5); m_pSO7_Proto->_start_machine(); 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 ea8de5e..898b5eb 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 @@ -39,6 +39,7 @@ #include "..\..\..\SevenOcean\Serial.h" #include "So7_Manual_Machine.h" +#include "So7_XBoxController.h" #include "So7_Option.h" #include "afxdialogex.h" @@ -54,6 +55,7 @@ CKeyence_Proto* m_pKeyence_Proto=NULL; CSo7_Interface* m_pSo7_Interface=NULL; CEF8000_Interface* m_pEF8000_Interface=NULL; +CXBOXController* XBoxPlayer =NULL; // CSo7_Option dialog @@ -167,9 +169,20 @@ void CSo7_Option::OnBnClickedOk() { m_pSO7_Proto = new CSO7_Proto(); } + if (!XBoxPlayer) + { + XBoxPlayer = new CXBOXController(1); + } + + CSO7_UtilDlg* pSO7_UtilDlg=new CSO7_UtilDlg(); pSO7_UtilDlg->DoModal(); delete pSO7_UtilDlg; + if (XBoxPlayer) + { + delete XBoxPlayer; + XBoxPlayer=NULL; + } if (m_pSO7_Proto) { delete m_pSO7_Proto; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.cpp index 2e8dc8c..755c6e1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.cpp @@ -1,30 +1,35 @@ #include "StdAfx.h" -#include "So7_XBoxController.h" +#include #include "..\..\..\SevenOcean\SO7_Proto.h" -#include "..\..\..\Animatics\Animatics_Proto.h" -#include "math.h" +#include "So7_XBoxController.h" + +#define M_PI 3.14159265358979323846 +const double XBOX_X_ANGLE=(M_PI / 180.0 * 10.0); +const double XBOX_Y_ANGLE=(M_PI / 180.0 * 80.0); +const double XBOX_XY_ANGLE_BEGIN=(M_PI / 180.0 * 35.0); +const double XBOX_XY_ANGLE_END=(M_PI / 180.0 * 55.0); extern CSO7_Proto* m_pSO7_Proto; -extern SmartMotor_Proto* pSmartMotor_Proto; HANDLE CXBOXController::XBoxhThread = NULL; HANDLE CXBOXController::XBoxThreadMutex = NULL; HANDLE CXBOXController::XBoxhTriggerEvent; -int CXBOXController::XBoxThreadState = THREAD_PAUSED; +int CXBOXController::XBoxThreadState = XBTHREAD_PAUSED; bool CXBOXController::XYWAITSTOP = false; bool CXBOXController::ZWAITSTOP = false; -short LX = 0, LY = 0, RX = 0, RY = 0; -WORD wBtns = 0; - -BYTE TopLightValue = 0; -BYTE BottomLightValue = 0; +static short LX = 0, LY = 0, RX = 0, RY = 0; +static WORD wBtns = 0; +static BYTE TopLightValue = 0; +static BYTE BottomLightValue = 0; static int TopLightBtnDown = 0; static int BottomLightBtnDown = 0; +static char MoveSpeedGear[3]={0}; CXBOXController::CXBOXController(int playerNumber) { - _controllerNum = playerNumber - 1; + m_ControllerNum = playerNumber - 1; + m_IsConnected=false; } CXBOXController::~CXBOXController() @@ -34,67 +39,73 @@ CXBOXController::~CXBOXController() void CXBOXController::XBoxControllerInit(void) { - XBoxThreadState = THREAD_RUNNING_STATE; + if (m_IsConnected) + { + XBoxThreadState = XBTHREAD_RUNNING_STATE; - XBoxhTriggerEvent = CreateEvent(NULL, FALSE, NULL, NULL); - XBoxhThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)g_XBox_Thread, (LPVOID)this, 0, NULL); - XBoxThreadMutex = CreateMutex(NULL, FALSE, NULL); + XBoxhTriggerEvent = CreateEvent(NULL, FALSE, NULL, NULL); + XBoxhThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)g_XBox_Thread, (LPVOID)this, 0, NULL); + XBoxThreadMutex = CreateMutex(NULL, FALSE, NULL); + } } void CXBOXController::XBoxControllerExit(void) { - XBoxThreadState = THREAD_EXIT; - - SetEvent(XBoxhTriggerEvent); - if (XBoxhThread) + if (m_IsConnected) { - DWORD dwCode = STILL_ACTIVE; - while (dwCode == STILL_ACTIVE) + XBoxThreadState = XBTHREAD_EXIT; + + SetEvent(XBoxhTriggerEvent); + if (XBoxhThread) { - GetExitCodeThread(XBoxhThread, &dwCode); - Sleep(1); + DWORD dwCode = STILL_ACTIVE; + while (dwCode == STILL_ACTIVE) + { + GetExitCodeThread(XBoxhThread, &dwCode); + Sleep(1); + } } - } - SetEvent(XBoxhTriggerEvent); - CloseHandle(XBoxhTriggerEvent); + SetEvent(XBoxhTriggerEvent); + CloseHandle(XBoxhTriggerEvent); - XBoxThreadState = THREAD_EXIT; + XBoxThreadState = XBTHREAD_EXIT; - ReleaseMutex(XBoxThreadMutex); - CloseHandle(XBoxhThread); + ReleaseMutex(XBoxThreadMutex); + CloseHandle(XBoxhThread); + } } bool CXBOXController::IsConnected() { - ZeroMemory(&_controllerState, sizeof(XINPUT_STATE)); - DWORD Result = XInputGetState(_controllerNum, &_controllerState); - + ZeroMemory(&m_ControllerState, sizeof(XINPUT_STATE)); + DWORD Result = XInputGetState(m_ControllerNum, &m_ControllerState); if (Result == ERROR_SUCCESS) { - return true; + m_IsConnected=true; } else { - return false; + m_IsConnected=false; } + return m_IsConnected; } XINPUT_STATE CXBOXController::GetState() { - ZeroMemory(&_controllerState, sizeof(XINPUT_STATE)); - XInputGetState(_controllerNum, &_controllerState); + ZeroMemory(&m_ControllerState, sizeof(XINPUT_STATE)); + XInputGetState(m_ControllerNum, &m_ControllerState); - return _controllerState; + return m_ControllerState; } void CXBOXController::Vibrate(int leftVal, int rightVal) { - XINPUT_VIBRATION Vibration; - ZeroMemory(&Vibration, sizeof(XINPUT_VIBRATION)); - Vibration.wLeftMotorSpeed = (WORD)leftVal; - Vibration.wRightMotorSpeed = (WORD)rightVal; - XInputSetState(_controllerNum, &Vibration); + XINPUT_VIBRATION Vibration; + ZeroMemory(&Vibration, sizeof(XINPUT_VIBRATION)); + Vibration.wLeftMotorSpeed = (WORD)leftVal; + Vibration.wRightMotorSpeed = (WORD)rightVal; + XInputSetState(m_ControllerNum, &Vibration); } unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis) @@ -108,16 +119,21 @@ unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis) RX = _This->GetState().Gamepad.sThumbRX; RY = _This->GetState().Gamepad.sThumbRY; wBtns = _This->GetState().Gamepad.wButtons; + + //TRACE2("[XBOX]LX:%d LY:%d\n",LX,LY); + //TRACE2("[XBOX]RX:%d RY:%d\n",RX,RY); //Z Direction if(LY>128 && abs(LX)_send_cmd_SO7_CMD_MOVE_Z((char)((LY - 128) / 8160 + 1)); + MoveSpeedGear[2]=static_cast((LY - 128) / 8160 + 1); + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z(MoveSpeedGear[2]); ZWAITSTOP = true; } else if(LY<128 && abs(LX)<-LY/tan(XBOX_Y_ANGLE)) { - m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z((char)((LY + 128) / 8160.25 - 1)); + MoveSpeedGear[2]=static_cast((LY + 128) / 8160.25 - 1); + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z(MoveSpeedGear[2]); ZWAITSTOP = true; } else if(ZWAITSTOP) @@ -129,46 +145,75 @@ unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis) //XY Direction if(RX<128 && abs(RY)<-RX*tan(XBOX_X_ANGLE)) { - m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X((char)((RX + 128) / 8160.25 - 1)); + MoveSpeedGear[0]=static_cast((RX + 128) / 8160.25 - 1); + MoveSpeedGear[0]=3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(MoveSpeedGear[0]); XYWAITSTOP = true; } else if(RX<128 && RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && RY<-RX*tan(XBOX_XY_ANGLE_END)) { - m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY((char)((RX + 128) / 8160.25 - 1), (char)((RY - 128) / 8160 + 1)); + MoveSpeedGear[0]=static_cast((RX + 128) / 8160.25 - 1); + MoveSpeedGear[1]=static_cast((RY - 128) / 8160 + 1); + MoveSpeedGear[0]=3; + MoveSpeedGear[1]=-3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]); XYWAITSTOP = true; } else if(RY>128 && abs(RX)_send_cmd_SO7_CMD_MOVE_Y((char)((RY - 128) / 8160 + 1)); + MoveSpeedGear[1]=static_cast((RY - 128) / 8160 + 1); + MoveSpeedGear[1]=-3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y(MoveSpeedGear[1]); XYWAITSTOP = true; } else if(RX>128 && RY>RX*tan(XBOX_XY_ANGLE_BEGIN) && RY_send_cmd_SO7_CMD_MOVE_XY((char)((RX - 128) / 8160 + 1), (char)((RY - 128) / 8160 +1)); + MoveSpeedGear[0]=static_cast((RX - 128) / 8160 + 1); + MoveSpeedGear[1]=static_cast((RY - 128) / 8160 +1); + + MoveSpeedGear[0]=-3; + MoveSpeedGear[1]=-3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]); XYWAITSTOP = true; } else if(RX>128 && abs(RY)_send_cmd_SO7_CMD_MOVE_X((char)((RX - 128) / 8160 + 1)); + MoveSpeedGear[0]=static_cast((RX - 128) / 8160 + 1); + MoveSpeedGear[0]=-3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(MoveSpeedGear[0]); XYWAITSTOP = true; } else if(RX>128 && -RY>RX*tan(XBOX_XY_ANGLE_BEGIN) && -RY_send_cmd_SO7_CMD_MOVE_XY((char)((RX - 128) / 8160 + 1), (char)((RY + 128) / 8160.25 - 1)); + MoveSpeedGear[0]=static_cast((RX - 128) / 8160 + 1); + MoveSpeedGear[1]=static_cast((RY + 128) / 8160.25 - 1); + + MoveSpeedGear[0]=-3; + MoveSpeedGear[1]=3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]); XYWAITSTOP = true; } else if(RY<128 && abs(RX)<-RY/tan(XBOX_Y_ANGLE)) { - m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y((char)((RY + 128) / 8160.25 - 1)); + MoveSpeedGear[1]=static_cast((RY + 128) / 8160.25 - 1); + + MoveSpeedGear[0]=3; + MoveSpeedGear[1]=3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y(MoveSpeedGear[1]); XYWAITSTOP = true; } else if(RX<128 && -RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && -RY<-RX*tan(XBOX_XY_ANGLE_END)) { - m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY((char)((RX + 128) / 8160.25 - 1), (char)((RY + 128) / 8160.25 - 1)); + MoveSpeedGear[0]=static_cast((RX + 128) / 8160.25 - 1); + MoveSpeedGear[1]=static_cast((RY + 128) / 8160.25 - 1); + + MoveSpeedGear[0]=3; + MoveSpeedGear[1]=3; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]); XYWAITSTOP = true; } else if(XYWAITSTOP) - { + { m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); XYWAITSTOP = false; } @@ -419,33 +464,17 @@ unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis) _This->Vibrate(); } - /* + /*************************************************************** + /////////////////////////////Other State//////////////////////// if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) - { - m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); - } - if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) - { - m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); - } - if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) - { - pSmartMotor_Proto->_send_cmd_SMARTMOTOR_DECEL_STOPX(); - } - if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) - { - pSmartMotor_Proto->_send_cmd_SMARTMOTOR_DECEL_STOPX(); - } - if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_START) - { - m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ(); - }*/ + if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_BACK) + ***************************************************************/ - if(XBoxThreadState == THREAD_EXIT || _This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_BACK) + if(XBoxThreadState == XBTHREAD_EXIT || _This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_BACK) { break; } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.h index 1d5d6af..c0e05e2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_XBoxController.h @@ -4,10 +4,6 @@ #define XBTHREAD_PAUSED 1 #define XBTHREAD_RUNNING_STATE 0 #define XBTHREAD_EXIT -1 -#define XBOX_X_ANGLE PI / 180 * 10 -#define XBOX_Y_ANGLE PI / 180 * 80 -#define XBOX_XY_ANGLE_BEGIN PI / 180 * 35 -#define XBOX_XY_ANGLE_END PI / 180 * 55 #pragma comment(lib, "XInput.lib") @@ -19,11 +15,11 @@ protected: static HANDLE XBoxhTriggerEvent; static int XBoxThreadState; static bool XYWAITSTOP; - static bool ZWAITSTOP; - - XINPUT_STATE _controllerState; - int _controllerNum; + static bool ZWAITSTOP; + XINPUT_STATE m_ControllerState; + int m_ControllerNum; + bool m_IsConnected; public: CXBOXController(int playerNumber); ~CXBOXController(); 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 c2be507e0adc6e207aca5cfdea4d7f607b63f115..f3471ccd45c20b4435214853bd19bf2a86f64e21 100644 GIT binary patch delta 8315 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 IsA1XP0gU*7FaQ7m delta 7021 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